diff --git a/src/support/NodeModules.ts b/src/support/NodeModules.ts index f58ce6d..83489c1 100644 --- a/src/support/NodeModules.ts +++ b/src/support/NodeModules.ts @@ -73,9 +73,10 @@ export class NodeModules { * * @param root - the path to node_modules * @param module - the module whose children we are discovering + * @param seen - used to prevent duplicate packages when recursing * @protected */ - protected async discoverRoot(root: UniversalPath, module: NodeModule): Promise { + protected async discoverRoot(root: UniversalPath, module: NodeModule, seen: string[] = []): Promise { for ( const key in module.dependencies ) { if ( !Object.prototype.hasOwnProperty.call(module.dependencies, key) ) { continue @@ -94,13 +95,19 @@ export class NodeModules { continue } + if ( seen.includes(key) ) { + this.logging.debug(`Skipping already-discovered package: ${key}`) + continue + } + this.logging.info(`Auto-discovering package: ${key}`) + seen.push(key) await this.bus.dispatch(new PackageDiscovered(packageJsonData, packageJson.clone())) const packageNodeModules = packageJson.concat('..', 'node_modules') if ( await packageNodeModules.exists() && packageJsonData?.extollo?.recursiveDependencies?.discover ) { this.logging.debug(`Recursing: ${packageNodeModules}`) - await this.discoverRoot(packageNodeModules, packageJsonData) + await this.discoverRoot(packageNodeModules, packageJsonData, seen) } } } catch (e: unknown) {