app-builder-lib 26.3.0 → 26.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/asar/unpackDetector.js +1 -3
- package/out/asar/unpackDetector.js.map +1 -1
- package/out/node-module-collector/index.d.ts +8 -5
- package/out/node-module-collector/index.js +23 -36
- package/out/node-module-collector/index.js.map +1 -1
- package/out/node-module-collector/nodeModulesCollector.d.ts +4 -3
- package/out/node-module-collector/nodeModulesCollector.js +95 -51
- package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/npmNodeModulesCollector.js +9 -4
- package/out/node-module-collector/npmNodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/packageManager.d.ts +8 -6
- package/out/node-module-collector/packageManager.js +32 -5
- package/out/node-module-collector/packageManager.js.map +1 -1
- package/out/node-module-collector/pnpmNodeModulesCollector.js +9 -3
- package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/yarnBerryNodeModulesCollector.js +30 -20
- package/out/node-module-collector/yarnBerryNodeModulesCollector.js.map +1 -1
- package/out/packager.d.ts +1 -1
- package/out/packager.js +2 -20
- package/out/packager.js.map +1 -1
- package/out/targets/tools.js +12 -12
- package/out/targets/tools.js.map +1 -1
- package/out/util/appFileCopier.js +2 -1
- package/out/util/appFileCopier.js.map +1 -1
- package/out/util/macosIconComposer.js +11 -4
- package/out/util/macosIconComposer.js.map +1 -1
- package/out/util/yarn.d.ts +2 -1
- package/out/util/yarn.js +19 -13
- package/out/util/yarn.js.map +1 -1
- package/out/version.d.ts +1 -1
- package/out/version.js +1 -1
- package/out/version.js.map +1 -1
- package/package.json +7 -7
|
@@ -18,13 +18,12 @@ class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollecto
|
|
|
18
18
|
}
|
|
19
19
|
async getDependenciesTree(pm) {
|
|
20
20
|
try {
|
|
21
|
-
// force NPM collection as Yarn Berry extends this class and PnP is not supported directly
|
|
22
21
|
return await super.getDependenciesTree(pm);
|
|
23
22
|
}
|
|
24
23
|
catch (error) {
|
|
25
|
-
builder_util_1.log.info({ pm, parser: packageManager_1.PM.NPM, error: error.message }, "unable to process dependency tree, falling back to using manual node_modules traversal");
|
|
24
|
+
builder_util_1.log.info({ pm: this.installOptions.manager, parser: packageManager_1.PM.NPM, error: error.message }, "unable to process dependency tree, falling back to using manual node_modules traversal");
|
|
26
25
|
}
|
|
27
|
-
// node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback)
|
|
26
|
+
// node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback) [e.g. corepack env will not allow npm CLI to extract tree]
|
|
28
27
|
return this.buildNodeModulesTreeManually(this.rootDir);
|
|
29
28
|
}
|
|
30
29
|
async collectAllDependencies(tree) {
|
|
@@ -102,11 +101,17 @@ class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollecto
|
|
|
102
101
|
for (const [depName, depVersion] of Object.entries(allProdDepNames)) {
|
|
103
102
|
try {
|
|
104
103
|
// Resolve the dependency using Node.js module resolution from this package's directory
|
|
105
|
-
const depPath = this.resolvePackageDir(depName, packageDir);
|
|
104
|
+
const depPath = await this.resolvePackageDir(depName, packageDir);
|
|
106
105
|
if (!depPath) {
|
|
107
106
|
builder_util_1.log.warn({ package: pkg.name, dependency: depName, version: depVersion }, "dependency not found, skipping");
|
|
108
107
|
continue;
|
|
109
108
|
}
|
|
109
|
+
const resolvedDepPath = await this.resolvePath(depPath);
|
|
110
|
+
// Skip if this dependency resolves to the base directory or any parent we're already processing
|
|
111
|
+
if (resolvedDepPath === resolvedPackageDir || resolvedDepPath === (await this.resolvePath(baseDir))) {
|
|
112
|
+
builder_util_1.log.debug({ package: pkg.name, dependency: depName, resolvedPath: resolvedDepPath }, "skipping self-referential dependency");
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
110
115
|
builder_util_1.log.debug({ package: pkg.name, dependency: depName, resolvedPath: depPath }, "processing production dependency");
|
|
111
116
|
// Recursively build the dependency tree for this dependency
|
|
112
117
|
prodDeps[depName] = await buildFromPackage(depPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/npmNodeModulesCollector.ts"],"names":[],"mappings":";;;AAAA,+CAAkC;AAClC,6BAA4B;AAC5B,iEAA6D;AAC7D,qDAAqC;AAGrC,MAAa,uBAAwB,SAAQ,2CAA2C;IAAxF;;QACkB,mBAAc,GAAG;YAC/B,OAAO,EAAE,mBAAE,CAAC,GAAG;YACf,QAAQ,EAAE,mBAAmB;SAC9B,CAAA;IAqIH,CAAC;IAnIW,OAAO;QACf,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;IACtH,CAAC;IAES,KAAK,CAAC,mBAAmB,CAAC,EAAM;QACxC,IAAI,CAAC;YACH,0FAA0F;YAC1F,OAAO,MAAM,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,kBAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,wFAAwF,CAAC,CAAA;QAClJ,CAAC;QACD,4FAA4F;QAC5F,OAAO,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,CAAC;IAES,KAAK,CAAC,sBAAsB,CAAC,IAAmB;QACxD,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YAChE,MAAM,EAAE,aAAa,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,KAAK,CAAA;YACvD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;YACtG,IAAI,cAAc,EAAE,CAAC;gBACnB,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;YACjE,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAES,KAAK,CAAC,gCAAgC,CAAC,IAAmB,EAAE,YAAoB;;QACxF,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,OAAM;QACR,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,gBAAgB,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,IAAI,CAAA;QACxE,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;QACzG,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,MAAA,MAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,0CAAE,YAAY,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;QACjH,0FAA0F;QAC1F,6HAA6H;QAC7H,gFAAgF;QAChF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;QACzD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;aAChD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;aACnE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE;YAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAA;YAC/D,MAAM,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;YAC1E,OAAO,iBAAiB,CAAA;QAC1B,CAAC,CAAC,CAAA;QACJ,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QAC/D,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAA;IAC9E,CAAC;IAES,gBAAgB,CAAC,WAAmB,EAAE,IAAmB;;QACjE,OAAO,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAG,WAAW,CAAC,KAAI,IAAI,CAAA;IAClD,CAAC;IAED;;;OAGG;IACO,4BAA4B,CAAC,OAAe;QACpD,0EAA0E;QAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;QAEjC;;WAEG;QACH,MAAM,gBAAgB,GAAG,KAAK,EAAE,UAAkB,EAA0B,EAAE;YAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;YAErD,kBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,4CAA4C,CAAC,CAAA;YAEpE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAA;YACzD,CAAC;YAED,sFAAsF;YACtF,MAAM,GAAG,GAAgB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;YACtD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;YAE7D,8EAA8E;YAC9E,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACpC,kBAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,kCAAkC,CAAC,CAAA;gBACjH,OAAO;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,IAAI,EAAE,kBAAkB;iBACzB,CAAA;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;YAE/B,MAAM,QAAQ,GAAkC,EAAE,CAAA;YAClD,MAAM,eAAe,GAAG;gBACtB,GAAG,GAAG,CAAC,YAAY;gBACnB,GAAG,GAAG,CAAC,oBAAoB;aAC5B,CAAA;YAED,mDAAmD;YACnD,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC;oBACH,uFAAuF;oBACvF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;oBAE3D,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,kBAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gCAAgC,CAAC,CAAA;wBAC3G,SAAQ;oBACV,CAAC;oBAED,kBAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,kCAAkC,CAAC,CAAA;oBAEhH,4DAA4D;oBAC5D,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAA;gBACrD,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,kBAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,wCAAwC,CAAC,CAAA;gBACtH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,kBAAkB;gBACxB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;gBACrE,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;aAC/C,CAAA;QACH,CAAC,CAAA;QAED,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAES,KAAK,CAAC,qBAAqB,CAAC,QAAgB;QACpD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC9C,CAAC;CACF;AAzID,0DAyIC","sourcesContent":["import { log } from \"builder-util\"\nimport * as path from \"path\"\nimport { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { NpmDependency, PackageJson } from \"./types\"\n\nexport class NpmNodeModulesCollector extends NodeModulesCollector<NpmDependency, string> {\n public readonly installOptions = {\n manager: PM.NPM,\n lockfile: \"package-lock.json\",\n }\n\n protected getArgs(): string[] {\n return [\"list\", \"-a\", \"--include\", \"prod\", \"--include\", \"optional\", \"--omit\", \"dev\", \"--json\", \"--long\", \"--silent\"]\n }\n\n protected async getDependenciesTree(pm: PM): Promise<NpmDependency> {\n try {\n // force NPM collection as Yarn Berry extends this class and PnP is not supported directly\n return await super.getDependenciesTree(pm)\n } catch (error: any) {\n log.info({ pm, parser: PM.NPM, error: error.message }, \"unable to process dependency tree, falling back to using manual node_modules traversal\")\n }\n // node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback)\n return this.buildNodeModulesTreeManually(this.rootDir)\n }\n\n protected async collectAllDependencies(tree: NpmDependency) {\n for (const [, value] of Object.entries(tree.dependencies || {})) {\n const { _dependencies = {}, dependencies = {} } = value\n const isDuplicateDep = Object.keys(_dependencies).length > 0 && Object.keys(dependencies).length === 0\n if (isDuplicateDep) {\n continue\n }\n this.allDependencies.set(this.packageVersionString(value), value)\n await this.collectAllDependencies(value)\n }\n }\n\n protected async extractProductionDependencyGraph(tree: NpmDependency, dependencyId: string): Promise<void> {\n if (this.productionGraph[dependencyId]) {\n return\n }\n\n const { _dependencies: prodDependencies = {}, dependencies = {} } = tree\n const isDuplicateDep = Object.keys(prodDependencies).length > 0 && Object.keys(dependencies).length === 0\n const resolvedDeps = isDuplicateDep ? (this.allDependencies.get(dependencyId)?.dependencies ?? {}) : dependencies\n // Initialize with empty dependencies array first to mark this dependency as \"in progress\"\n // After initialization, if there are libraries with the same name+version later, they will not be searched recursively again\n // This will prevents infinite loops when circular dependencies are encountered.\n this.productionGraph[dependencyId] = { dependencies: [] }\n const productionDeps = Object.entries(resolvedDeps)\n .filter(([packageName]) => this.isProdDependency(packageName, tree))\n .map(async ([, dependency]) => {\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n const collectedDependencies = await Promise.all(productionDeps)\n this.productionGraph[dependencyId] = { dependencies: collectedDependencies }\n }\n\n protected isProdDependency(packageName: string, tree: NpmDependency) {\n return tree._dependencies?.[packageName] != null\n }\n\n /**\n * Builds a dependency tree using only package.json dependencies and optionalDependencies.\n * This skips devDependencies and uses Node.js module resolution (require.resolve).\n */\n protected buildNodeModulesTreeManually(baseDir: string): Promise<NpmDependency> {\n // Track visited packages by their resolved path to prevent infinite loops\n const visited = new Set<string>()\n\n /**\n * Recursively builds dependency tree starting from a package directory.\n */\n const buildFromPackage = async (packageDir: string): Promise<NpmDependency> => {\n const pkgPath = path.join(packageDir, \"package.json\")\n\n log.debug({ pkgPath }, \"building dependency node from package.json\")\n\n if (!(await this.existsMemoized(pkgPath))) {\n throw new Error(`package.json not found at ${pkgPath}`)\n }\n\n // Read package.json using memoized require for consistency with Node.js module system\n const pkg: PackageJson = this.requireMemoized(pkgPath)\n const resolvedPackageDir = await this.resolvePath(packageDir)\n\n // Use resolved path as the unique identifier to prevent circular dependencies\n if (visited.has(resolvedPackageDir)) {\n log.debug({ name: pkg.name, version: pkg.version, path: resolvedPackageDir }, \"skipping already visited package\")\n return {\n name: pkg.name,\n version: pkg.version,\n path: resolvedPackageDir,\n }\n }\n\n visited.add(resolvedPackageDir)\n\n const prodDeps: Record<string, NpmDependency> = {}\n const allProdDepNames = {\n ...pkg.dependencies,\n ...pkg.optionalDependencies,\n }\n\n // Process all production and optional dependencies\n for (const [depName, depVersion] of Object.entries(allProdDepNames)) {\n try {\n // Resolve the dependency using Node.js module resolution from this package's directory\n const depPath = this.resolvePackageDir(depName, packageDir)\n\n if (!depPath) {\n log.warn({ package: pkg.name, dependency: depName, version: depVersion }, \"dependency not found, skipping\")\n continue\n }\n\n log.debug({ package: pkg.name, dependency: depName, resolvedPath: depPath }, \"processing production dependency\")\n\n // Recursively build the dependency tree for this dependency\n prodDeps[depName] = await buildFromPackage(depPath)\n } catch (error: any) {\n log.warn({ package: pkg.name, dependency: depName, error: error.message }, \"failed to process dependency, skipping\")\n }\n }\n\n return {\n name: pkg.name,\n version: pkg.version,\n path: resolvedPackageDir,\n dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,\n optionalDependencies: pkg.optionalDependencies,\n }\n }\n\n return buildFromPackage(baseDir)\n }\n\n protected async parseDependenciesTree(jsonBlob: string): Promise<NpmDependency> {\n return Promise.resolve(JSON.parse(jsonBlob))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"npmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/npmNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport * as path from \"path\"\nimport { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { NpmDependency, PackageJson } from \"./types\"\n\nexport class NpmNodeModulesCollector extends NodeModulesCollector<NpmDependency, string> {\n public readonly installOptions = {\n manager: PM.NPM,\n lockfile: \"package-lock.json\",\n }\n\n protected getArgs(): string[] {\n return [\"list\", \"-a\", \"--include\", \"prod\", \"--include\", \"optional\", \"--omit\", \"dev\", \"--json\", \"--long\", \"--silent\"]\n }\n\n protected async getDependenciesTree(pm: PM): Promise<NpmDependency> {\n try {\n return await super.getDependenciesTree(pm)\n } catch (error: any) {\n log.info({ pm: this.installOptions.manager, parser: PM.NPM, error: error.message }, \"unable to process dependency tree, falling back to using manual node_modules traversal\")\n }\n // node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback) [e.g. corepack env will not allow npm CLI to extract tree]\n return this.buildNodeModulesTreeManually(this.rootDir)\n }\n\n protected async collectAllDependencies(tree: NpmDependency) {\n for (const [, value] of Object.entries(tree.dependencies || {})) {\n const { _dependencies = {}, dependencies = {} } = value\n const isDuplicateDep = Object.keys(_dependencies).length > 0 && Object.keys(dependencies).length === 0\n if (isDuplicateDep) {\n continue\n }\n this.allDependencies.set(this.packageVersionString(value), value)\n await this.collectAllDependencies(value)\n }\n }\n\n protected async extractProductionDependencyGraph(tree: NpmDependency, dependencyId: string): Promise<void> {\n if (this.productionGraph[dependencyId]) {\n return\n }\n\n const { _dependencies: prodDependencies = {}, dependencies = {} } = tree\n const isDuplicateDep = Object.keys(prodDependencies).length > 0 && Object.keys(dependencies).length === 0\n const resolvedDeps = isDuplicateDep ? (this.allDependencies.get(dependencyId)?.dependencies ?? {}) : dependencies\n // Initialize with empty dependencies array first to mark this dependency as \"in progress\"\n // After initialization, if there are libraries with the same name+version later, they will not be searched recursively again\n // This will prevents infinite loops when circular dependencies are encountered.\n this.productionGraph[dependencyId] = { dependencies: [] }\n const productionDeps = Object.entries(resolvedDeps)\n .filter(([packageName]) => this.isProdDependency(packageName, tree))\n .map(async ([, dependency]) => {\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n const collectedDependencies = await Promise.all(productionDeps)\n this.productionGraph[dependencyId] = { dependencies: collectedDependencies }\n }\n\n protected isProdDependency(packageName: string, tree: NpmDependency) {\n return tree._dependencies?.[packageName] != null\n }\n\n /**\n * Builds a dependency tree using only package.json dependencies and optionalDependencies.\n * This skips devDependencies and uses Node.js module resolution (require.resolve).\n */\n protected buildNodeModulesTreeManually(baseDir: string): Promise<NpmDependency> {\n // Track visited packages by their resolved path to prevent infinite loops\n const visited = new Set<string>()\n\n /**\n * Recursively builds dependency tree starting from a package directory.\n */\n const buildFromPackage = async (packageDir: string): Promise<NpmDependency> => {\n const pkgPath = path.join(packageDir, \"package.json\")\n\n log.debug({ pkgPath }, \"building dependency node from package.json\")\n\n if (!(await this.existsMemoized(pkgPath))) {\n throw new Error(`package.json not found at ${pkgPath}`)\n }\n\n // Read package.json using memoized require for consistency with Node.js module system\n const pkg: PackageJson = this.requireMemoized(pkgPath)\n const resolvedPackageDir = await this.resolvePath(packageDir)\n\n // Use resolved path as the unique identifier to prevent circular dependencies\n if (visited.has(resolvedPackageDir)) {\n log.debug({ name: pkg.name, version: pkg.version, path: resolvedPackageDir }, \"skipping already visited package\")\n return {\n name: pkg.name,\n version: pkg.version,\n path: resolvedPackageDir,\n }\n }\n\n visited.add(resolvedPackageDir)\n\n const prodDeps: Record<string, NpmDependency> = {}\n const allProdDepNames = {\n ...pkg.dependencies,\n ...pkg.optionalDependencies,\n }\n\n // Process all production and optional dependencies\n for (const [depName, depVersion] of Object.entries(allProdDepNames)) {\n try {\n // Resolve the dependency using Node.js module resolution from this package's directory\n const depPath = await this.resolvePackageDir(depName, packageDir)\n\n if (!depPath) {\n log.warn({ package: pkg.name, dependency: depName, version: depVersion }, \"dependency not found, skipping\")\n continue\n }\n\n const resolvedDepPath = await this.resolvePath(depPath)\n\n // Skip if this dependency resolves to the base directory or any parent we're already processing\n if (resolvedDepPath === resolvedPackageDir || resolvedDepPath === (await this.resolvePath(baseDir))) {\n log.debug({ package: pkg.name, dependency: depName, resolvedPath: resolvedDepPath }, \"skipping self-referential dependency\")\n continue\n }\n\n log.debug({ package: pkg.name, dependency: depName, resolvedPath: depPath }, \"processing production dependency\")\n\n // Recursively build the dependency tree for this dependency\n prodDeps[depName] = await buildFromPackage(depPath)\n } catch (error: any) {\n log.warn({ package: pkg.name, dependency: depName, error: error.message }, \"failed to process dependency, skipping\")\n }\n }\n\n return {\n name: pkg.name,\n version: pkg.version,\n path: resolvedPackageDir,\n dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,\n optionalDependencies: pkg.optionalDependencies,\n }\n }\n\n return buildFromPackage(baseDir)\n }\n\n protected async parseDependenciesTree(jsonBlob: string): Promise<NpmDependency> {\n return Promise.resolve(JSON.parse(jsonBlob))\n }\n}\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
export declare enum PM {
|
|
2
|
-
NPM = "npm",
|
|
3
|
-
YARN = "yarn",
|
|
4
2
|
PNPM = "pnpm",
|
|
3
|
+
YARN = "yarn",
|
|
5
4
|
YARN_BERRY = "yarn-berry",
|
|
6
|
-
BUN = "bun"
|
|
5
|
+
BUN = "bun",
|
|
6
|
+
NPM = "npm"
|
|
7
7
|
}
|
|
8
8
|
export declare function getPackageManagerCommand(pm: PM): string;
|
|
9
|
-
export declare function
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
export declare function detectPackageManager(searchPaths: string[]): Promise<{
|
|
10
|
+
pm: PM;
|
|
11
|
+
corepackConfig: string | undefined;
|
|
12
|
+
resolvedDirectory: string | undefined;
|
|
13
|
+
}>;
|
|
@@ -2,20 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PM = void 0;
|
|
4
4
|
exports.getPackageManagerCommand = getPackageManagerCommand;
|
|
5
|
-
exports.
|
|
6
|
-
exports.detectPackageManagerByFile = detectPackageManagerByFile;
|
|
7
|
-
exports.detectYarnBerry = detectYarnBerry;
|
|
5
|
+
exports.detectPackageManager = detectPackageManager;
|
|
8
6
|
const builder_util_1 = require("builder-util");
|
|
9
7
|
const fs = require("fs-extra");
|
|
10
8
|
const path = require("path");
|
|
11
9
|
const which = require("which");
|
|
12
10
|
var PM;
|
|
13
11
|
(function (PM) {
|
|
14
|
-
PM["NPM"] = "npm";
|
|
15
|
-
PM["YARN"] = "yarn";
|
|
16
12
|
PM["PNPM"] = "pnpm";
|
|
13
|
+
PM["YARN"] = "yarn";
|
|
17
14
|
PM["YARN_BERRY"] = "yarn-berry";
|
|
18
15
|
PM["BUN"] = "bun";
|
|
16
|
+
PM["NPM"] = "npm";
|
|
19
17
|
})(PM || (exports.PM = PM = {}));
|
|
20
18
|
// Cache for resolved paths
|
|
21
19
|
const pmPathCache = {
|
|
@@ -46,6 +44,35 @@ function getPackageManagerCommand(pm) {
|
|
|
46
44
|
pmPathCache[pm] = resolved;
|
|
47
45
|
return resolved;
|
|
48
46
|
}
|
|
47
|
+
async function detectPackageManager(searchPaths) {
|
|
48
|
+
var _a, _b;
|
|
49
|
+
let pm = null;
|
|
50
|
+
const dedupedPaths = Array.from(new Set(searchPaths)); // reduce file operations, dedupe paths since primary use case has projectDir === appDir
|
|
51
|
+
const resolveIfYarn = (pm, version, cwd) => (pm === PM.YARN ? detectYarnBerry(cwd, version) : pm);
|
|
52
|
+
for (const dir of dedupedPaths) {
|
|
53
|
+
const packageJsonPath = path.join(dir, "package.json");
|
|
54
|
+
const packageManager = (await (0, builder_util_1.exists)(packageJsonPath)) ? (_a = (await fs.readJson(packageJsonPath, "utf8"))) === null || _a === void 0 ? void 0 : _a.packageManager : undefined;
|
|
55
|
+
if (packageManager) {
|
|
56
|
+
const [pm, version] = packageManager.split("@");
|
|
57
|
+
if (Object.values(PM).includes(pm)) {
|
|
58
|
+
const resolvedPackageManager = await resolveIfYarn(pm, version, dir);
|
|
59
|
+
builder_util_1.log.debug({ resolvedPackageManager, packageManager, cwd: dir }, "packageManager field detected in package.json");
|
|
60
|
+
return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
pm = await detectPackageManagerByFile(dir);
|
|
64
|
+
if (pm) {
|
|
65
|
+
const resolvedPackageManager = await resolveIfYarn(pm, "", dir);
|
|
66
|
+
builder_util_1.log.debug({ resolvedPackageManager, cwd: dir }, "packageManager detected by file");
|
|
67
|
+
return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
pm = detectPackageManagerByEnv() || PM.NPM;
|
|
71
|
+
const cwd = process.env.npm_package_json ? path.dirname(process.env.npm_package_json) : ((_b = process.env.INIT_CWD) !== null && _b !== void 0 ? _b : process.cwd());
|
|
72
|
+
const resolvedPackageManager = await resolveIfYarn(pm, "", cwd);
|
|
73
|
+
builder_util_1.log.debug({ resolvedPackageManager, detected: cwd }, "packageManager not detected by file, falling back to environment detection");
|
|
74
|
+
return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined };
|
|
75
|
+
}
|
|
49
76
|
function detectPackageManagerByEnv() {
|
|
50
77
|
const priorityChecklist = [(key) => { var _a; return (_a = process.env.npm_config_user_agent) === null || _a === void 0 ? void 0 : _a.includes(key); }, (key) => { var _a; return (_a = process.env.npm_execpath) === null || _a === void 0 ? void 0 : _a.includes(key); }];
|
|
51
78
|
const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { exists, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport * as which from \"which\"\n\nexport enum PM {\n NPM = \"npm\",\n YARN = \"yarn\",\n PNPM = \"pnpm\",\n YARN_BERRY = \"yarn-berry\",\n BUN = \"bun\",\n}\n\n// Cache for resolved paths\nconst pmPathCache: Record<PM, string | null | undefined> = {\n [PM.NPM]: undefined,\n [PM.YARN]: undefined,\n [PM.PNPM]: undefined,\n [PM.YARN_BERRY]: undefined,\n [PM.BUN]: undefined,\n}\n\nfunction resolveCommand(pm: PM): string {\n const fallback = pm === PM.YARN_BERRY ? \"yarn\" : pm\n\n if (process.platform !== \"win32\") {\n return fallback\n }\n\n try {\n return which.sync(fallback)\n } catch {\n // If `which` fails (not found), still return the fallback string\n return fallback\n }\n}\n\nexport function getPackageManagerCommand(pm: PM) {\n if (pmPathCache[pm] !== undefined) {\n return pmPathCache[pm]!\n }\n\n const resolved = resolveCommand(pm)\n pmPathCache[pm] = resolved\n return resolved\n}\n\nexport function detectPackageManagerByEnv(): PM | null {\n const priorityChecklist = [(key: string) => process.env.npm_config_user_agent?.includes(key), (key: string) => process.env.npm_execpath?.includes(key)]\n\n const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY)\n for (const checker of priorityChecklist) {\n for (const pm of pms) {\n if (checker(pm)) {\n return pm\n }\n }\n }\n return null\n}\n\nexport async function detectPackageManagerByFile(dir: string): Promise<PM | null> {\n const has = (file: string) => exists(path.join(dir, file))\n\n const detected: PM[] = []\n if (await has(\"yarn.lock\")) {\n detected.push(PM.YARN)\n }\n if (await has(\"pnpm-lock.yaml\")) {\n detected.push(PM.PNPM)\n }\n if (await has(\"package-lock.json\")) {\n detected.push(PM.NPM)\n }\n if ((await has(\"bun.lock\")) || (await has(\"bun.lockb\"))) {\n detected.push(PM.BUN)\n }\n\n if (detected.length === 1) {\n return detected[0]\n }\n\n return null\n}\n\nexport async function detectYarnBerry(cwd: string, version: string): Promise<PM.YARN | PM.YARN_BERRY> {\n const checkBerry = () => {\n try {\n if (parseInt(version.split(\".\")[0]) > 1) {\n return PM.YARN_BERRY\n }\n } catch (_error) {\n log.debug({ error: _error }, \"cannot determine yarn version, assuming yarn v1\")\n // If `yarn` is not found or another error occurs, fall back to the regular Yarn since we're already determined in a Yarn project\n }\n return undefined\n }\n\n if (version === \"latest\" || version === \"berry\") {\n return PM.YARN_BERRY\n }\n\n if (version.length > 0) {\n return checkBerry() ?? PM.YARN\n }\n\n const lockPath = path.join(cwd, \"yarn.lock\")\n if (!(await exists(lockPath))) {\n return checkBerry() ?? PM.YARN\n }\n // Read the first few lines of yarn.lock to determine the version\n const firstBytes = (await fs.readFile(lockPath, \"utf8\")).split(\"\\n\").slice(0, 10).join(\"\\n\")\n\n // Yarn v2+ (Berry) has a \"__metadata:\" block near the top\n if (firstBytes.includes(\"__metadata:\")) {\n return PM.YARN_BERRY\n }\n\n // Yarn v1 format is classic semi-YAML with comment header\n if (firstBytes.includes(\"DO NOT EDIT THIS FILE DIRECTLY.\")) {\n return PM.YARN\n }\n\n return checkBerry() ?? PM.YARN\n}\n"]}
|
|
1
|
+
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { exists, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport * as which from \"which\"\n\nexport enum PM {\n PNPM = \"pnpm\",\n YARN = \"yarn\",\n YARN_BERRY = \"yarn-berry\",\n BUN = \"bun\",\n NPM = \"npm\",\n}\n\n// Cache for resolved paths\nconst pmPathCache: Record<PM, string | null | undefined> = {\n [PM.NPM]: undefined,\n [PM.YARN]: undefined,\n [PM.PNPM]: undefined,\n [PM.YARN_BERRY]: undefined,\n [PM.BUN]: undefined,\n}\n\nfunction resolveCommand(pm: PM): string {\n const fallback = pm === PM.YARN_BERRY ? \"yarn\" : pm\n\n if (process.platform !== \"win32\") {\n return fallback\n }\n\n try {\n return which.sync(fallback)\n } catch {\n // If `which` fails (not found), still return the fallback string\n return fallback\n }\n}\n\nexport function getPackageManagerCommand(pm: PM) {\n if (pmPathCache[pm] !== undefined) {\n return pmPathCache[pm]!\n }\n\n const resolved = resolveCommand(pm)\n pmPathCache[pm] = resolved\n return resolved\n}\n\nexport async function detectPackageManager(searchPaths: string[]): Promise<{ pm: PM; corepackConfig: string | undefined; resolvedDirectory: string | undefined }> {\n let pm: PM | null = null\n const dedupedPaths = Array.from(new Set(searchPaths)) // reduce file operations, dedupe paths since primary use case has projectDir === appDir\n\n const resolveIfYarn = (pm: PM, version: string, cwd: string) => (pm === PM.YARN ? detectYarnBerry(cwd, version) : pm)\n\n for (const dir of dedupedPaths) {\n const packageJsonPath = path.join(dir, \"package.json\")\n const packageManager = (await exists(packageJsonPath)) ? (await fs.readJson(packageJsonPath, \"utf8\"))?.packageManager : undefined\n if (packageManager) {\n const [pm, version] = packageManager.split(\"@\")\n if (Object.values(PM).includes(pm as PM)) {\n const resolvedPackageManager = await resolveIfYarn(pm as PM, version, dir)\n log.debug({ resolvedPackageManager, packageManager, cwd: dir }, \"packageManager field detected in package.json\")\n return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir }\n }\n }\n\n pm = await detectPackageManagerByFile(dir)\n if (pm) {\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", dir)\n log.debug({ resolvedPackageManager, cwd: dir }, \"packageManager detected by file\")\n return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined }\n }\n }\n\n pm = detectPackageManagerByEnv() || PM.NPM\n const cwd = process.env.npm_package_json ? path.dirname(process.env.npm_package_json) : (process.env.INIT_CWD ?? process.cwd())\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", cwd)\n log.debug({ resolvedPackageManager, detected: cwd }, \"packageManager not detected by file, falling back to environment detection\")\n return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined }\n}\n\nfunction detectPackageManagerByEnv(): PM | null {\n const priorityChecklist = [(key: string) => process.env.npm_config_user_agent?.includes(key), (key: string) => process.env.npm_execpath?.includes(key)]\n\n const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY)\n for (const checker of priorityChecklist) {\n for (const pm of pms) {\n if (checker(pm)) {\n return pm\n }\n }\n }\n return null\n}\n\nasync function detectPackageManagerByFile(dir: string): Promise<PM | null> {\n const has = (file: string) => exists(path.join(dir, file))\n\n const detected: PM[] = []\n if (await has(\"yarn.lock\")) {\n detected.push(PM.YARN)\n }\n if (await has(\"pnpm-lock.yaml\")) {\n detected.push(PM.PNPM)\n }\n if (await has(\"package-lock.json\")) {\n detected.push(PM.NPM)\n }\n if ((await has(\"bun.lock\")) || (await has(\"bun.lockb\"))) {\n detected.push(PM.BUN)\n }\n\n if (detected.length === 1) {\n return detected[0]\n }\n\n return null\n}\n\nasync function detectYarnBerry(cwd: string, version: string): Promise<PM.YARN | PM.YARN_BERRY> {\n const checkBerry = () => {\n try {\n if (parseInt(version.split(\".\")[0]) > 1) {\n return PM.YARN_BERRY\n }\n } catch (_error) {\n log.debug({ error: _error }, \"cannot determine yarn version, assuming yarn v1\")\n // If `yarn` is not found or another error occurs, fall back to the regular Yarn since we're already determined in a Yarn project\n }\n return undefined\n }\n\n if (version === \"latest\" || version === \"berry\") {\n return PM.YARN_BERRY\n }\n\n if (version.length > 0) {\n return checkBerry() ?? PM.YARN\n }\n\n const lockPath = path.join(cwd, \"yarn.lock\")\n if (!(await exists(lockPath))) {\n return checkBerry() ?? PM.YARN\n }\n // Read the first few lines of yarn.lock to determine the version\n const firstBytes = (await fs.readFile(lockPath, \"utf8\")).split(\"\\n\").slice(0, 10).join(\"\\n\")\n\n // Yarn v2+ (Berry) has a \"__metadata:\" block near the top\n if (firstBytes.includes(\"__metadata:\")) {\n return PM.YARN_BERRY\n }\n\n // Yarn v1 format is classic semi-YAML with comment header\n if (firstBytes.includes(\"DO NOT EDIT THIS FILE DIRECTLY.\")) {\n return PM.YARN\n }\n\n return checkBerry() ?? PM.YARN\n}\n"]}
|
|
@@ -21,9 +21,14 @@ class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
|
|
|
21
21
|
if (this.productionGraph[dependencyId]) {
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
const getProductionDependencies = async (
|
|
24
|
+
const getProductionDependencies = async (depTree) => {
|
|
25
25
|
var _a;
|
|
26
|
-
const
|
|
26
|
+
const packageName = depTree.name || depTree.from;
|
|
27
|
+
if ((0, builder_util_1.isEmptyOrSpaces)(packageName)) {
|
|
28
|
+
builder_util_1.log.error(depTree, `Cannot determine production dependencies for package with empty name`);
|
|
29
|
+
throw new Error(`Cannot compute production dependencies for package with empty name: ${packageName}`);
|
|
30
|
+
}
|
|
31
|
+
const p = path.normalize((_a = (await this.resolvePackageDir(packageName, depTree.path))) !== null && _a !== void 0 ? _a : (await this.resolvePath(depTree.path)));
|
|
27
32
|
const pkgJsonPath = path.join(p, "package.json");
|
|
28
33
|
let packageJson;
|
|
29
34
|
try {
|
|
@@ -35,7 +40,8 @@ class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
|
|
|
35
40
|
}
|
|
36
41
|
return { prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } };
|
|
37
42
|
};
|
|
38
|
-
const
|
|
43
|
+
const packageName = tree.name || tree.from;
|
|
44
|
+
const json = packageName === dependencyId ? null : await getProductionDependencies(tree);
|
|
39
45
|
const prodDependencies = (_a = json === null || json === void 0 ? void 0 : json.prodDeps) !== null && _a !== void 0 ? _a : { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
|
|
40
46
|
if (prodDependencies == null) {
|
|
41
47
|
this.productionGraph[dependencyId] = { dependencies: [] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log } from \"builder-util\"\nimport * as path from \"path\"\nimport { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { PackageJson, PnpmDependency } from \"./types\"\n\nexport class PnpmNodeModulesCollector extends NodeModulesCollector<PnpmDependency, PnpmDependency> {\n public readonly installOptions = {\n manager: PM.PNPM,\n lockfile: \"pnpm-lock.yaml\",\n }\n\n protected getArgs(): string[] {\n return [\"list\", \"--prod\", \"--json\", \"--depth\", \"Infinity\"]\n }\n\n protected async extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string) {\n if (this.productionGraph[dependencyId]) {\n return\n }\n\n const getProductionDependencies = async (depTree: PnpmDependency): Promise<{ prodDeps: Record<string, string>; optionalDependencies: Record<string, string> } | null> => {\n const packageName = depTree.name || depTree.from\n if (isEmptyOrSpaces(packageName)) {\n log.error(depTree, `Cannot determine production dependencies for package with empty name`)\n throw new Error(`Cannot compute production dependencies for package with empty name: ${packageName}`)\n }\n\n const p = path.normalize((await this.resolvePackageDir(packageName, depTree.path)) ?? (await this.resolvePath(depTree.path)))\n const pkgJsonPath = path.join(p, \"package.json\")\n\n let packageJson: PackageJson\n try {\n packageJson = this.requireMemoized(pkgJsonPath)\n } catch (error: any) {\n log.warn(null, `Failed to read package.json for ${p}: ${error.message}`)\n return null\n }\n return { prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } }\n }\n\n const packageName = tree.name || tree.from\n const json = packageName === dependencyId ? null : await getProductionDependencies(tree)\n const prodDependencies = json?.prodDeps ?? { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n if (prodDependencies == null) {\n this.productionGraph[dependencyId] = { dependencies: [] }\n return\n }\n const deps = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n this.productionGraph[dependencyId] = { dependencies: [] }\n const depPromises = Object.entries(deps)\n .filter(([packageName, dependency]) => {\n // First check if it's in production dependencies\n if (!prodDependencies[packageName]) {\n return false\n }\n\n // Then check if optional dependency path exists (using memoized version)\n if (json?.optionalDependencies?.[packageName] && !this.existsSyncMemoized(dependency.path)) {\n log.debug(null, `Optional dependency ${packageName}@${dependency.version} path doesn't exist: ${dependency.path}`)\n return false\n }\n\n return true\n })\n .map(async ([, dependency]) => {\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n\n const dependencies = await Promise.all(depPromises)\n this.productionGraph[dependencyId] = { dependencies }\n }\n\n protected async collectAllDependencies(tree: PnpmDependency) {\n // Collect regular dependencies\n for (const [key, value] of Object.entries(tree.dependencies || {})) {\n this.allDependencies.set(`${key}@${value.version}`, value)\n await this.collectAllDependencies(value)\n }\n\n // Collect optional dependencies if they exist\n for (const [key, value] of Object.entries(tree.optionalDependencies || {})) {\n this.allDependencies.set(`${key}@${value.version}`, value)\n await this.collectAllDependencies(value)\n }\n }\n\n protected packageVersionString(pkg: PnpmDependency): string {\n // we use 'from' field because 'name' may be different in case of aliases\n return `${pkg.from}@${pkg.version}`\n }\n\n protected async parseDependenciesTree(jsonBlob: string): Promise<PnpmDependency> {\n const dependencyTree: PnpmDependency[] = JSON.parse(jsonBlob)\n // pnpm returns an array of dependency trees\n return Promise.resolve(dependencyTree[0])\n }\n}\n"]}
|
|
@@ -31,13 +31,13 @@ class YarnBerryNodeModulesCollector extends npmNodeModulesCollector_1.NpmNodeMod
|
|
|
31
31
|
return ((_a = tree.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) != null || ((_b = tree.optionalDependencies) === null || _b === void 0 ? void 0 : _b[packageName]) != null;
|
|
32
32
|
}
|
|
33
33
|
async detectYarnSetup(rootDir) {
|
|
34
|
-
var _a, _b, _c, _d
|
|
34
|
+
var _a, _b, _c, _d;
|
|
35
35
|
let yarnVersion = null;
|
|
36
36
|
let nodeLinker = null;
|
|
37
37
|
let nmHoistingLimits = null;
|
|
38
|
-
const output = await this.asyncExec("yarn", ["config", "
|
|
39
|
-
if (output.stdout
|
|
40
|
-
builder_util_1.log.debug(
|
|
38
|
+
const output = await this.asyncExec("yarn", ["config", "--json"], rootDir);
|
|
39
|
+
if (!output.stdout) {
|
|
40
|
+
builder_util_1.log.debug(null, "Yarn config returned no output, assuming default Yarn v1 behavior (hoisted, non-PnP)");
|
|
41
41
|
return {
|
|
42
42
|
yarnVersion,
|
|
43
43
|
nodeLinker,
|
|
@@ -46,30 +46,40 @@ class YarnBerryNodeModulesCollector extends npmNodeModulesCollector_1.NpmNodeMod
|
|
|
46
46
|
isHoisted: true,
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
-
// Yarn
|
|
50
|
-
|
|
49
|
+
// Yarn 1: multi-line stream with type:"inspect" (not used in this file anyways)
|
|
50
|
+
// Yarn 2–3: multi-line stream with type:"inspect"
|
|
51
|
+
// Yarn 4: single JSON object, no "type"
|
|
52
|
+
const lines = output.stdout
|
|
51
53
|
.split("\n")
|
|
52
54
|
.map(l => l.trim())
|
|
53
|
-
.filter(Boolean)
|
|
54
|
-
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
let data = null;
|
|
57
|
+
for (const line of lines) {
|
|
55
58
|
try {
|
|
56
|
-
|
|
59
|
+
const parsed = JSON.parse(line);
|
|
60
|
+
// Yarn 4: direct object
|
|
61
|
+
if (parsed.rc || parsed.manifest) {
|
|
62
|
+
data = parsed;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
// Yarn 1–3: inspect event
|
|
66
|
+
if (parsed.type === "inspect") {
|
|
67
|
+
data = parsed.data;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
57
70
|
}
|
|
58
71
|
catch {
|
|
59
|
-
|
|
72
|
+
// ignore non-JSON lines
|
|
60
73
|
}
|
|
61
|
-
})
|
|
62
|
-
.filter(Boolean)
|
|
63
|
-
.find(l => l.type === "inspect");
|
|
64
|
-
if (parsed) {
|
|
65
|
-
const data = ((_a = parsed.data) === null || _a === void 0 ? void 0 : _a["rc"]) || parsed.data || {};
|
|
66
|
-
yarnVersion = (_d = (_c = (_b = parsed.data) === null || _b === void 0 ? void 0 : _b["manifest"]) === null || _c === void 0 ? void 0 : _c.version) !== null && _d !== void 0 ? _d : null;
|
|
67
|
-
nodeLinker = (_e = data["nodeLinker"]) !== null && _e !== void 0 ? _e : null;
|
|
68
|
-
nmHoistingLimits = (_f = data["nmHoistingLimits"]) !== null && _f !== void 0 ? _f : null;
|
|
69
74
|
}
|
|
70
|
-
|
|
75
|
+
if (data) {
|
|
76
|
+
const rc = data.rc || data; // Yarn 4: rc in root; Yarn 2–3: rc inside data
|
|
77
|
+
yarnVersion = (_b = (_a = data.manifest) === null || _a === void 0 ? void 0 : _a.version) !== null && _b !== void 0 ? _b : null;
|
|
78
|
+
nodeLinker = (_c = rc.nodeLinker) !== null && _c !== void 0 ? _c : null;
|
|
79
|
+
nmHoistingLimits = (_d = rc.nmHoistingLimits) !== null && _d !== void 0 ? _d : null;
|
|
80
|
+
}
|
|
71
81
|
const isPnP = nodeLinker === "pnp";
|
|
72
|
-
const isHoisted = isPnP
|
|
82
|
+
const isHoisted = !isPnP && (nmHoistingLimits === "dependencies" || nmHoistingLimits === "workspaces");
|
|
73
83
|
return {
|
|
74
84
|
yarnVersion,
|
|
75
85
|
nodeLinker,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yarnBerryNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/yarnBerryNodeModulesCollector.ts"],"names":[],"mappings":";;;AAAA,+CAAkC;AAClC,uCAA+B;AAC/B,uEAAmE;AACnE,qDAAqC;AAWrC,uIAAuI;AACvI,oKAAoK;AACpK,iIAAiI;AACjI,mFAAmF;AACnF,MAAa,6BAA8B,SAAQ,iDAAuB;IAA1E;;QACkB,mBAAc,GAAG;YAC/B,OAAO,EAAE,mBAAE,CAAC,UAAU;YACtB,QAAQ,EAAE,WAAW;SACtB,CAAA;QAEO,kBAAa,GAAwB,IAAI,eAAI,CAAgB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAE1G,cAAS,GAAkB,IAAI,eAAI,CAAU,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"yarnBerryNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/yarnBerryNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { Lazy } from \"lazy-val\"\nimport { NpmNodeModulesCollector } from \"./npmNodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { NpmDependency } from \"./types\"\n\ntype YarnSetupInfo = {\n yarnVersion: string | null\n nodeLinker: \"pnp\" | \"node-modules\" | null\n nmHoistingLimits: \"workspaces\" | \"dependencies\" | \"none\" | null\n isPnP: boolean\n isHoisted: boolean\n}\n\n// Only Yarn v1 uses CLI. We should use pnp.cjs for PnP, but we can't access the files due to virtual file paths within zipped modules.\n// We fallback to npm node module collection (since Yarn Berry could have npm-like structure OR pnpm-like structure, depending on `nmHoistingLimits` configuration).\n// In the latter case, we still can't assume `pnpm` is installed, so we still try to use npm collection as a best-effort attempt.\n// If those fail, such as if using corepack, we attempt to manually build the tree.\nexport class YarnBerryNodeModulesCollector extends NpmNodeModulesCollector {\n public readonly installOptions = {\n manager: PM.YARN_BERRY,\n lockfile: \"yarn.lock\",\n }\n\n private yarnSetupInfo: Lazy<YarnSetupInfo> = new Lazy<YarnSetupInfo>(async () => this.detectYarnSetup(this.rootDir))\n\n protected isHoisted: Lazy<boolean> = new Lazy<boolean>(async () => this.yarnSetupInfo.value.then(info => info.isHoisted))\n\n protected async getDependenciesTree(_pm: PM): Promise<NpmDependency> {\n const isPnp = await this.yarnSetupInfo.value.then(info => !!info.isPnP)\n if (isPnp) {\n log.warn(null, \"Yarn PnP extraction not supported directly due to virtual file paths (<package_name>.zip/<file_path>), falling back to NPM node module collector\")\n }\n\n return super.getDependenciesTree(PM.NPM)\n }\n\n protected isProdDependency(packageName: string, tree: NpmDependency): boolean {\n return tree.dependencies?.[packageName] != null || tree.optionalDependencies?.[packageName] != null\n }\n\n private async detectYarnSetup(rootDir: string): Promise<YarnSetupInfo> {\n let yarnVersion: YarnSetupInfo[\"yarnVersion\"] = null\n let nodeLinker: YarnSetupInfo[\"nodeLinker\"] = null\n let nmHoistingLimits: YarnSetupInfo[\"nmHoistingLimits\"] = null\n\n const output = await this.asyncExec(\"yarn\", [\"config\", \"--json\"], rootDir)\n\n if (!output.stdout) {\n log.debug(null, \"Yarn config returned no output, assuming default Yarn v1 behavior (hoisted, non-PnP)\")\n return {\n yarnVersion,\n nodeLinker,\n nmHoistingLimits,\n isPnP: false,\n isHoisted: true,\n }\n }\n\n // Yarn 1: multi-line stream with type:\"inspect\" (not used in this file anyways)\n // Yarn 2–3: multi-line stream with type:\"inspect\"\n // Yarn 4: single JSON object, no \"type\"\n const lines = output.stdout\n .split(\"\\n\")\n .map(l => l.trim())\n .filter(Boolean)\n\n let data: any = null\n\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line)\n\n // Yarn 4: direct object\n if (parsed.rc || parsed.manifest) {\n data = parsed\n break\n }\n\n // Yarn 1–3: inspect event\n if (parsed.type === \"inspect\") {\n data = parsed.data\n break\n }\n } catch {\n // ignore non-JSON lines\n }\n }\n\n if (data) {\n const rc = data.rc || data // Yarn 4: rc in root; Yarn 2–3: rc inside data\n yarnVersion = data.manifest?.version ?? null\n nodeLinker = rc.nodeLinker ?? null\n nmHoistingLimits = rc.nmHoistingLimits ?? null\n }\n\n const isPnP = nodeLinker === \"pnp\"\n const isHoisted = !isPnP && (nmHoistingLimits === \"dependencies\" || nmHoistingLimits === \"workspaces\")\n\n return {\n yarnVersion,\n nodeLinker,\n nmHoistingLimits,\n isPnP,\n isHoisted,\n }\n }\n}\n"]}
|
package/out/packager.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export declare class Packager {
|
|
|
27
27
|
readonly projectDir: string;
|
|
28
28
|
private _appDir;
|
|
29
29
|
get appDir(): string;
|
|
30
|
-
private _packageManager;
|
|
30
|
+
private readonly _packageManager;
|
|
31
31
|
getPackageManager(): Promise<PM>;
|
|
32
32
|
getWorkspaceRoot(): Promise<string>;
|
|
33
33
|
private _metadata;
|
package/out/packager.js
CHANGED
|
@@ -117,23 +117,6 @@ class Packager {
|
|
|
117
117
|
//noinspection JSUnusedGlobalSymbols
|
|
118
118
|
constructor(options, cancellationToken = new builder_util_runtime_1.CancellationToken()) {
|
|
119
119
|
this.cancellationToken = cancellationToken;
|
|
120
|
-
this._packageManager = new lazy_val_1.Lazy(async () => {
|
|
121
|
-
const availableDirs = [this.projectDir, this.appDir];
|
|
122
|
-
const pm = await (0, node_module_collector_1.detectPackageManager)(availableDirs);
|
|
123
|
-
const workspaceRoot = await (0, node_module_collector_1.findWorkspaceRoot)(pm.pm, this.projectDir);
|
|
124
|
-
if (workspaceRoot != null) {
|
|
125
|
-
// re-detect package manager from workspace root, this seems particularly necessary for pnpm workspaces
|
|
126
|
-
const actualPm = await (0, node_module_collector_1.detectPackageManager)([workspaceRoot]);
|
|
127
|
-
return {
|
|
128
|
-
pm: actualPm.pm,
|
|
129
|
-
workspaceRoot: Promise.resolve(actualPm.resolvedDirectory),
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
pm: pm.pm,
|
|
134
|
-
workspaceRoot: Promise.resolve(pm.resolvedDirectory),
|
|
135
|
-
};
|
|
136
|
-
});
|
|
137
120
|
this._metadata = null;
|
|
138
121
|
this._nodeModulesHandledExternally = false;
|
|
139
122
|
this._isPrepackedAppAsar = false;
|
|
@@ -202,6 +185,7 @@ class Packager {
|
|
|
202
185
|
}
|
|
203
186
|
this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir);
|
|
204
187
|
this._appDir = this.projectDir;
|
|
188
|
+
this._packageManager = (0, node_module_collector_1.determinePackageManagerEnv)({ projectDir: this.projectDir, appDir: this.appDir, workspaceRoot: undefined });
|
|
205
189
|
this.options = {
|
|
206
190
|
...options,
|
|
207
191
|
prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged),
|
|
@@ -286,9 +270,7 @@ class Packager {
|
|
|
286
270
|
this._devMetadata = await (0, builder_util_1.orNullIfFileNotExist)((0, packageMetadata_1.readPackageJson)(devPackageFile));
|
|
287
271
|
const devMetadata = this.devMetadata;
|
|
288
272
|
const configuration = await (0, config_1.getConfig)(projectDir, configPath, configFromOptions, new lazy_val_1.Lazy(() => Promise.resolve(devMetadata)));
|
|
289
|
-
|
|
290
|
-
builder_util_1.log.debug({ config: getSafeEffectiveConfig(configuration) }, "effective config");
|
|
291
|
-
}
|
|
273
|
+
builder_util_1.log.debug({ config: getSafeEffectiveConfig(configuration) }, "effective config");
|
|
292
274
|
this._appDir = await (0, config_1.computeDefaultAppDirectory)(projectDir, configuration.directories.app);
|
|
293
275
|
this.isTwoPackageJsonProjectLayoutUsed = this._appDir !== projectDir;
|
|
294
276
|
const appPackageFile = this.isTwoPackageJsonProjectLayoutUsed ? path.join(this.appDir, "package.json") : devPackageFile;
|