app-builder-lib 26.2.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/asarUtil.js +78 -10
- package/out/asar/asarUtil.js.map +1 -1
- package/out/asar/unpackDetector.js +1 -3
- package/out/asar/unpackDetector.js.map +1 -1
- package/out/codeSign/macCodeSign.js +2 -1
- package/out/codeSign/macCodeSign.js.map +1 -1
- package/out/electron/search-module.js +1 -1
- package/out/electron/search-module.js.map +1 -1
- package/out/fileMatcher.js +1 -1
- package/out/fileMatcher.js.map +1 -1
- package/out/node-module-collector/bunNodeModulesCollector.d.ts +11 -0
- package/out/node-module-collector/bunNodeModulesCollector.js +22 -0
- package/out/node-module-collector/bunNodeModulesCollector.js.map +1 -0
- package/out/node-module-collector/index.d.ts +21 -6
- package/out/node-module-collector/index.js +93 -32
- package/out/node-module-collector/index.js.map +1 -1
- package/out/node-module-collector/moduleCache.d.ts +21 -0
- package/out/node-module-collector/moduleCache.js +16 -0
- package/out/node-module-collector/moduleCache.js.map +1 -0
- package/out/node-module-collector/nodeModulesCollector.d.ts +50 -14
- package/out/node-module-collector/nodeModulesCollector.js +239 -70
- package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/npmNodeModulesCollector.d.ts +10 -3
- package/out/node-module-collector/npmNodeModulesCollector.js +100 -13
- 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 +73 -29
- package/out/node-module-collector/packageManager.js.map +1 -1
- package/out/node-module-collector/pnpmNodeModulesCollector.d.ts +4 -4
- package/out/node-module-collector/pnpmNodeModulesCollector.js +49 -23
- package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/out/node-module-collector/types.d.ts +25 -1
- package/out/node-module-collector/types.js.map +1 -1
- package/out/node-module-collector/yarnBerryNodeModulesCollector.d.ts +15 -0
- package/out/node-module-collector/yarnBerryNodeModulesCollector.js +93 -0
- package/out/node-module-collector/yarnBerryNodeModulesCollector.js.map +1 -0
- package/out/node-module-collector/yarnNodeModulesCollector.d.ts +12 -2
- package/out/node-module-collector/yarnNodeModulesCollector.js +234 -5
- package/out/node-module-collector/yarnNodeModulesCollector.js.map +1 -1
- package/out/options/winOptions.d.ts +2 -1
- package/out/options/winOptions.js.map +1 -1
- package/out/packager.d.ts +6 -1
- package/out/packager.js +12 -5
- package/out/packager.js.map +1 -1
- package/out/publish/PublishManager.js +2 -2
- package/out/publish/PublishManager.js.map +1 -1
- package/out/targets/AppxTarget.js +1 -1
- package/out/targets/AppxTarget.js.map +1 -1
- package/out/targets/MsiTarget.js +1 -1
- package/out/targets/MsiTarget.js.map +1 -1
- package/out/targets/nsis/NsisTarget.js +2 -2
- package/out/targets/nsis/NsisTarget.js.map +1 -1
- package/out/targets/nsis/nsisUtil.js +1 -1
- package/out/targets/nsis/nsisUtil.js.map +1 -1
- package/out/targets/tools.js +12 -12
- package/out/targets/tools.js.map +1 -1
- package/out/util/appFileCopier.js +18 -10
- 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 +4 -2
- package/out/util/yarn.js +34 -24
- 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/out/winPackager.d.ts +1 -1
- package/out/winPackager.js +26 -9
- package/out/winPackager.js.map +1 -1
- package/package.json +9 -9
- package/scheme.json +1 -1
|
@@ -1,28 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NpmNodeModulesCollector = void 0;
|
|
4
|
+
const builder_util_1 = require("builder-util");
|
|
5
|
+
const path = require("path");
|
|
4
6
|
const nodeModulesCollector_1 = require("./nodeModulesCollector");
|
|
5
7
|
const packageManager_1 = require("./packageManager");
|
|
6
8
|
class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollector {
|
|
7
9
|
constructor() {
|
|
8
10
|
super(...arguments);
|
|
9
|
-
this.installOptions = {
|
|
11
|
+
this.installOptions = {
|
|
12
|
+
manager: packageManager_1.PM.NPM,
|
|
13
|
+
lockfile: "package-lock.json",
|
|
14
|
+
};
|
|
10
15
|
}
|
|
11
16
|
getArgs() {
|
|
12
17
|
return ["list", "-a", "--include", "prod", "--include", "optional", "--omit", "dev", "--json", "--long", "--silent"];
|
|
13
18
|
}
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
async getDependenciesTree(pm) {
|
|
20
|
+
try {
|
|
21
|
+
return await super.getDependenciesTree(pm);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
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");
|
|
25
|
+
}
|
|
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]
|
|
27
|
+
return this.buildNodeModulesTreeManually(this.rootDir);
|
|
28
|
+
}
|
|
29
|
+
async collectAllDependencies(tree) {
|
|
30
|
+
for (const [, value] of Object.entries(tree.dependencies || {})) {
|
|
16
31
|
const { _dependencies = {}, dependencies = {} } = value;
|
|
17
32
|
const isDuplicateDep = Object.keys(_dependencies).length > 0 && Object.keys(dependencies).length === 0;
|
|
18
33
|
if (isDuplicateDep) {
|
|
19
34
|
continue;
|
|
20
35
|
}
|
|
21
|
-
this.allDependencies.set(
|
|
22
|
-
this.collectAllDependencies(value);
|
|
36
|
+
this.allDependencies.set(this.packageVersionString(value), value);
|
|
37
|
+
await this.collectAllDependencies(value);
|
|
23
38
|
}
|
|
24
39
|
}
|
|
25
|
-
extractProductionDependencyGraph(tree, dependencyId) {
|
|
40
|
+
async extractProductionDependencyGraph(tree, dependencyId) {
|
|
26
41
|
var _a, _b;
|
|
27
42
|
if (this.productionGraph[dependencyId]) {
|
|
28
43
|
return;
|
|
@@ -35,16 +50,88 @@ class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollecto
|
|
|
35
50
|
// This will prevents infinite loops when circular dependencies are encountered.
|
|
36
51
|
this.productionGraph[dependencyId] = { dependencies: [] };
|
|
37
52
|
const productionDeps = Object.entries(resolvedDeps)
|
|
38
|
-
.filter(([packageName]) =>
|
|
39
|
-
.map(([
|
|
40
|
-
const childDependencyId =
|
|
41
|
-
this.extractProductionDependencyGraph(dependency, childDependencyId);
|
|
53
|
+
.filter(([packageName]) => this.isProdDependency(packageName, tree))
|
|
54
|
+
.map(async ([, dependency]) => {
|
|
55
|
+
const childDependencyId = this.packageVersionString(dependency);
|
|
56
|
+
await this.extractProductionDependencyGraph(dependency, childDependencyId);
|
|
42
57
|
return childDependencyId;
|
|
43
58
|
});
|
|
44
|
-
|
|
59
|
+
const collectedDependencies = await Promise.all(productionDeps);
|
|
60
|
+
this.productionGraph[dependencyId] = { dependencies: collectedDependencies };
|
|
61
|
+
}
|
|
62
|
+
isProdDependency(packageName, tree) {
|
|
63
|
+
var _a;
|
|
64
|
+
return ((_a = tree._dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) != null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Builds a dependency tree using only package.json dependencies and optionalDependencies.
|
|
68
|
+
* This skips devDependencies and uses Node.js module resolution (require.resolve).
|
|
69
|
+
*/
|
|
70
|
+
buildNodeModulesTreeManually(baseDir) {
|
|
71
|
+
// Track visited packages by their resolved path to prevent infinite loops
|
|
72
|
+
const visited = new Set();
|
|
73
|
+
/**
|
|
74
|
+
* Recursively builds dependency tree starting from a package directory.
|
|
75
|
+
*/
|
|
76
|
+
const buildFromPackage = async (packageDir) => {
|
|
77
|
+
const pkgPath = path.join(packageDir, "package.json");
|
|
78
|
+
builder_util_1.log.debug({ pkgPath }, "building dependency node from package.json");
|
|
79
|
+
if (!(await this.existsMemoized(pkgPath))) {
|
|
80
|
+
throw new Error(`package.json not found at ${pkgPath}`);
|
|
81
|
+
}
|
|
82
|
+
// Read package.json using memoized require for consistency with Node.js module system
|
|
83
|
+
const pkg = this.requireMemoized(pkgPath);
|
|
84
|
+
const resolvedPackageDir = await this.resolvePath(packageDir);
|
|
85
|
+
// Use resolved path as the unique identifier to prevent circular dependencies
|
|
86
|
+
if (visited.has(resolvedPackageDir)) {
|
|
87
|
+
builder_util_1.log.debug({ name: pkg.name, version: pkg.version, path: resolvedPackageDir }, "skipping already visited package");
|
|
88
|
+
return {
|
|
89
|
+
name: pkg.name,
|
|
90
|
+
version: pkg.version,
|
|
91
|
+
path: resolvedPackageDir,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
visited.add(resolvedPackageDir);
|
|
95
|
+
const prodDeps = {};
|
|
96
|
+
const allProdDepNames = {
|
|
97
|
+
...pkg.dependencies,
|
|
98
|
+
...pkg.optionalDependencies,
|
|
99
|
+
};
|
|
100
|
+
// Process all production and optional dependencies
|
|
101
|
+
for (const [depName, depVersion] of Object.entries(allProdDepNames)) {
|
|
102
|
+
try {
|
|
103
|
+
// Resolve the dependency using Node.js module resolution from this package's directory
|
|
104
|
+
const depPath = await this.resolvePackageDir(depName, packageDir);
|
|
105
|
+
if (!depPath) {
|
|
106
|
+
builder_util_1.log.warn({ package: pkg.name, dependency: depName, version: depVersion }, "dependency not found, skipping");
|
|
107
|
+
continue;
|
|
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
|
+
}
|
|
115
|
+
builder_util_1.log.debug({ package: pkg.name, dependency: depName, resolvedPath: depPath }, "processing production dependency");
|
|
116
|
+
// Recursively build the dependency tree for this dependency
|
|
117
|
+
prodDeps[depName] = await buildFromPackage(depPath);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
builder_util_1.log.warn({ package: pkg.name, dependency: depName, error: error.message }, "failed to process dependency, skipping");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
name: pkg.name,
|
|
125
|
+
version: pkg.version,
|
|
126
|
+
path: resolvedPackageDir,
|
|
127
|
+
dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,
|
|
128
|
+
optionalDependencies: pkg.optionalDependencies,
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
return buildFromPackage(baseDir);
|
|
45
132
|
}
|
|
46
|
-
parseDependenciesTree(jsonBlob) {
|
|
47
|
-
return JSON.parse(jsonBlob);
|
|
133
|
+
async parseDependenciesTree(jsonBlob) {
|
|
134
|
+
return Promise.resolve(JSON.parse(jsonBlob));
|
|
48
135
|
}
|
|
49
136
|
}
|
|
50
137
|
exports.NpmNodeModulesCollector = NpmNodeModulesCollector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/npmNodeModulesCollector.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAC7D,qDAAqC;AAGrC,MAAa,uBAAwB,SAAQ,2CAA2C;IAAxF;;QACkB,mBAAc,GAAG,EAAE,OAAO,EAAE,mBAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IA2CrF,CAAC;IAzCW,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,sBAAsB,CAAC,IAAmB;QAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACnE,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,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;YAC1D,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAES,gCAAgC,CAAC,IAAmB,EAAE,YAAoB;;QAClF,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,gBAAgB,CAAC,WAAW,CAAC,CAAC;aACxD,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE;YACjC,MAAM,iBAAiB,GAAG,GAAG,WAAW,IAAI,UAAU,CAAC,OAAO,EAAE,CAAA;YAChE,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;YACpE,OAAO,iBAAiB,CAAA;QAC1B,CAAC,CAAC,CAAA;QACJ,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,cAAc,EAAE,CAAA;IACvE,CAAC;IAES,qBAAqB,CAAC,QAAgB;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC;CACF;AA5CD,0DA4CC","sourcesContent":["import { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { NpmDependency } from \"./types\"\n\nexport class NpmNodeModulesCollector extends NodeModulesCollector<NpmDependency, string> {\n public readonly installOptions = { manager: PM.NPM, lockfile: \"package-lock.json\" }\n\n protected getArgs(): string[] {\n return [\"list\", \"-a\", \"--include\", \"prod\", \"--include\", \"optional\", \"--omit\", \"dev\", \"--json\", \"--long\", \"--silent\"]\n }\n\n protected collectAllDependencies(tree: NpmDependency) {\n for (const [key, 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(`${key}@${value.version}`, value)\n this.collectAllDependencies(value)\n }\n }\n\n protected extractProductionDependencyGraph(tree: NpmDependency, dependencyId: string): 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]) => prodDependencies[packageName])\n .map(([packageName, dependency]) => {\n const childDependencyId = `${packageName}@${dependency.version}`\n this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n this.productionGraph[dependencyId] = { dependencies: productionDeps }\n }\n\n protected parseDependenciesTree(jsonBlob: string): NpmDependency {\n return 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
|
-
|
|
7
|
-
|
|
5
|
+
exports.detectPackageManager = detectPackageManager;
|
|
6
|
+
const builder_util_1 = require("builder-util");
|
|
7
|
+
const fs = require("fs-extra");
|
|
8
8
|
const path = require("path");
|
|
9
|
-
const fs = require("fs");
|
|
10
9
|
const which = require("which");
|
|
11
|
-
const child_process_1 = require("child_process");
|
|
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,15 +44,37 @@ 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
|
-
var _a;
|
|
51
|
-
const packageJsonPath = path.join(process.cwd(), "package.json");
|
|
52
|
-
const packageManager = fs.existsSync(packageJsonPath) ? (_a = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"))) === null || _a === void 0 ? void 0 : _a.packageManager : undefined;
|
|
53
|
-
const priorityChecklist = [
|
|
54
|
-
(key) => { var _a; return (_a = process.env.npm_config_user_agent) === null || _a === void 0 ? void 0 : _a.includes(key); },
|
|
55
|
-
(key) => { var _a; return (_a = process.env.npm_execpath) === null || _a === void 0 ? void 0 : _a.includes(key); },
|
|
56
|
-
(key) => packageManager === null || packageManager === void 0 ? void 0 : packageManager.startsWith(`${key}@`),
|
|
57
|
-
];
|
|
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); }];
|
|
58
78
|
const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY);
|
|
59
79
|
for (const checker of priorityChecklist) {
|
|
60
80
|
for (const pm of pms) {
|
|
@@ -65,19 +85,19 @@ function detectPackageManagerByEnv() {
|
|
|
65
85
|
}
|
|
66
86
|
return null;
|
|
67
87
|
}
|
|
68
|
-
function
|
|
69
|
-
const has = (file) =>
|
|
88
|
+
async function detectPackageManagerByFile(dir) {
|
|
89
|
+
const has = (file) => (0, builder_util_1.exists)(path.join(dir, file));
|
|
70
90
|
const detected = [];
|
|
71
|
-
if (has("yarn.lock")) {
|
|
91
|
+
if (await has("yarn.lock")) {
|
|
72
92
|
detected.push(PM.YARN);
|
|
73
93
|
}
|
|
74
|
-
if (has("pnpm-lock.yaml")) {
|
|
94
|
+
if (await has("pnpm-lock.yaml")) {
|
|
75
95
|
detected.push(PM.PNPM);
|
|
76
96
|
}
|
|
77
|
-
if (has("package-lock.json")) {
|
|
97
|
+
if (await has("package-lock.json")) {
|
|
78
98
|
detected.push(PM.NPM);
|
|
79
99
|
}
|
|
80
|
-
if (has("bun.lock") || has("bun.lockb")) {
|
|
100
|
+
if ((await has("bun.lock")) || (await has("bun.lockb"))) {
|
|
81
101
|
detected.push(PM.BUN);
|
|
82
102
|
}
|
|
83
103
|
if (detected.length === 1) {
|
|
@@ -85,16 +105,40 @@ function detectPackageManagerByLockfile(cwd) {
|
|
|
85
105
|
}
|
|
86
106
|
return null;
|
|
87
107
|
}
|
|
88
|
-
function detectYarnBerry() {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
108
|
+
async function detectYarnBerry(cwd, version) {
|
|
109
|
+
var _a, _b, _c;
|
|
110
|
+
const checkBerry = () => {
|
|
111
|
+
try {
|
|
112
|
+
if (parseInt(version.split(".")[0]) > 1) {
|
|
113
|
+
return PM.YARN_BERRY;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (_error) {
|
|
117
|
+
builder_util_1.log.debug({ error: _error }, "cannot determine yarn version, assuming yarn v1");
|
|
118
|
+
// If `yarn` is not found or another error occurs, fall back to the regular Yarn since we're already determined in a Yarn project
|
|
93
119
|
}
|
|
120
|
+
return undefined;
|
|
121
|
+
};
|
|
122
|
+
if (version === "latest" || version === "berry") {
|
|
123
|
+
return PM.YARN_BERRY;
|
|
124
|
+
}
|
|
125
|
+
if (version.length > 0) {
|
|
126
|
+
return (_a = checkBerry()) !== null && _a !== void 0 ? _a : PM.YARN;
|
|
127
|
+
}
|
|
128
|
+
const lockPath = path.join(cwd, "yarn.lock");
|
|
129
|
+
if (!(await (0, builder_util_1.exists)(lockPath))) {
|
|
130
|
+
return (_b = checkBerry()) !== null && _b !== void 0 ? _b : PM.YARN;
|
|
131
|
+
}
|
|
132
|
+
// Read the first few lines of yarn.lock to determine the version
|
|
133
|
+
const firstBytes = (await fs.readFile(lockPath, "utf8")).split("\n").slice(0, 10).join("\n");
|
|
134
|
+
// Yarn v2+ (Berry) has a "__metadata:" block near the top
|
|
135
|
+
if (firstBytes.includes("__metadata:")) {
|
|
136
|
+
return PM.YARN_BERRY;
|
|
94
137
|
}
|
|
95
|
-
|
|
96
|
-
|
|
138
|
+
// Yarn v1 format is classic semi-YAML with comment header
|
|
139
|
+
if (firstBytes.includes("DO NOT EDIT THIS FILE DIRECTLY.")) {
|
|
140
|
+
return PM.YARN;
|
|
97
141
|
}
|
|
98
|
-
return PM.YARN;
|
|
142
|
+
return (_c = checkBerry()) !== null && _c !== void 0 ? _c : PM.YARN;
|
|
99
143
|
}
|
|
100
144
|
//# sourceMappingURL=packageManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":";;;AAqCA,4DAQC;AAED,8DAmBC;AAED,wEAsBC;AAED,0CAUC;AAtGD,6BAA4B;AAC5B,yBAAwB;AACxB,+BAA8B;AAC9B,iDAAwC;AAExC,IAAY,EAMX;AAND,WAAY,EAAE;IACZ,iBAAW,CAAA;IACX,mBAAa,CAAA;IACb,mBAAa,CAAA;IACb,+BAAyB,CAAA;IACzB,iBAAW,CAAA;AACb,CAAC,EANW,EAAE,kBAAF,EAAE,QAMb;AAED,2BAA2B;AAC3B,MAAM,WAAW,GAA0C;IACzD,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS;IACnB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS;IACpB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS;IACpB,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS;IAC1B,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS;CACpB,CAAA;AAED,SAAS,cAAc,CAAC,EAAM;IAC5B,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,OAAO,QAAQ,CAAA;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,wBAAwB,CAAC,EAAM;IAC7C,IAAI,WAAW,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,EAAE,CAAE,CAAA;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;IACnC,WAAW,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAA;IAC1B,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAgB,yBAAyB;;IACvC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,0CAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;IAExI,MAAM,iBAAiB,GAAG;QACxB,CAAC,GAAW,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,0CAAE,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA;QACjE,CAAC,GAAW,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,CAAC,YAAY,0CAAE,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA;QACxD,CAAC,GAAW,EAAE,EAAE,CAAC,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;KACvD,CAAA;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAA;IAChE,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,8BAA8B,CAAC,GAAW;IACxD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;IAEjE,MAAM,QAAQ,GAAS,EAAE,CAAA;IACzB,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;QAC5D,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC,UAAU,CAAA;QACtB,CAAC;IACH,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,+EAA+E;IACjF,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAA;AAChB,CAAC","sourcesContent":["import * as path from \"path\"\nimport * as fs from \"fs\"\nimport * as which from \"which\"\nimport { execSync } from \"child_process\"\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 packageJsonPath = path.join(process.cwd(), \"package.json\")\n const packageManager = fs.existsSync(packageJsonPath) ? JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\"))?.packageManager : undefined\n\n const priorityChecklist = [\n (key: string) => process.env.npm_config_user_agent?.includes(key),\n (key: string) => process.env.npm_execpath?.includes(key),\n (key: string) => packageManager?.startsWith(`${key}@`),\n ]\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 function detectPackageManagerByLockfile(cwd: string): PM | null {\n const has = (file: string) => fs.existsSync(path.join(cwd, file))\n\n const detected: PM[] = []\n if (has(\"yarn.lock\")) {\n detected.push(PM.YARN)\n }\n if (has(\"pnpm-lock.yaml\")) {\n detected.push(PM.PNPM)\n }\n if (has(\"package-lock.json\")) {\n detected.push(PM.NPM)\n }\n if (has(\"bun.lock\") || 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 function detectYarnBerry() {\n try {\n const version = execSync(\"yarn --version\").toString().trim()\n if (parseInt(version.split(\".\")[0]) > 1) {\n return PM.YARN_BERRY\n }\n } catch (_e) {\n // If `yarn` is not found or another error occurs, fallback to the regular Yarn\n }\n return PM.YARN\n}\n"]}
|
|
1
|
+
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":";;;AAqCA,4DAQC;AAED,oDA+BC;AA9ED,+CAA0C;AAC1C,+BAA8B;AAC9B,6BAA4B;AAC5B,+BAA8B;AAE9B,IAAY,EAMX;AAND,WAAY,EAAE;IACZ,mBAAa,CAAA;IACb,mBAAa,CAAA;IACb,+BAAyB,CAAA;IACzB,iBAAW,CAAA;IACX,iBAAW,CAAA;AACb,CAAC,EANW,EAAE,kBAAF,EAAE,QAMb;AAED,2BAA2B;AAC3B,MAAM,WAAW,GAA0C;IACzD,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS;IACnB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS;IACpB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS;IACpB,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS;IAC1B,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS;CACpB,CAAA;AAED,SAAS,cAAc,CAAC,EAAM;IAC5B,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,OAAO,QAAQ,CAAA;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,wBAAwB,CAAC,EAAM;IAC7C,IAAI,WAAW,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,EAAE,CAAE,CAAA;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;IACnC,WAAW,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAA;IAC1B,OAAO,QAAQ,CAAA;AACjB,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,WAAqB;;IAC9D,IAAI,EAAE,GAAc,IAAI,CAAA;IACxB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA,CAAC,wFAAwF;IAE9I,MAAM,aAAa,GAAG,CAAC,EAAM,EAAE,OAAe,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAErH,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QACtD,MAAM,cAAc,GAAG,CAAC,MAAM,IAAA,qBAAM,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,0CAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACjI,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAQ,CAAC,EAAE,CAAC;gBACzC,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC1E,kBAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,+CAA+C,CAAC,CAAA;gBAChH,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAA;YAC/F,CAAC;QACH,CAAC;QAED,EAAE,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAC/D,kBAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAA;YAClF,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,CAAA;QAC1F,CAAC;IACH,CAAC;IAED,EAAE,GAAG,yBAAyB,EAAE,IAAI,EAAE,CAAC,GAAG,CAAA;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,mCAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/H,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAC/D,kBAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,4EAA4E,CAAC,CAAA;IAClI,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,CAAA;AAChG,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,0CAAE,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA,EAAE,CAAC,GAAW,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,CAAC,YAAY,0CAAE,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA,CAAC,CAAA;IAEvJ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAA;IAChE,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,GAAW;IACnD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,qBAAM,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;IAE1D,MAAM,QAAQ,GAAS,EAAE,CAAA;IACzB,IAAI,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IACD,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,OAAe;;IACzD,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,CAAC,UAAU,CAAA;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,kBAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,iDAAiD,CAAC,CAAA;YAC/E,iIAAiI;QACnI,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC,UAAU,CAAA;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,MAAA,UAAU,EAAE,mCAAI,EAAE,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAC5C,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAA,UAAU,EAAE,mCAAI,EAAE,CAAC,IAAI,CAAA;IAChC,CAAC;IACD,iEAAiE;IACjE,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE5F,0DAA0D;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC,UAAU,CAAA;IACtB,CAAC;IAED,0DAA0D;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC,IAAI,CAAA;IAChB,CAAC;IAED,OAAO,MAAA,UAAU,EAAE,mCAAI,EAAE,CAAC,IAAI,CAAA;AAChC,CAAC","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"]}
|
|
@@ -2,13 +2,13 @@ import { NodeModulesCollector } from "./nodeModulesCollector";
|
|
|
2
2
|
import { PM } from "./packageManager";
|
|
3
3
|
import { PnpmDependency } from "./types";
|
|
4
4
|
export declare class PnpmNodeModulesCollector extends NodeModulesCollector<PnpmDependency, PnpmDependency> {
|
|
5
|
-
static isPnpmProjectHoisted(rootDir: string): Promise<boolean>;
|
|
6
5
|
readonly installOptions: {
|
|
7
6
|
manager: PM;
|
|
8
7
|
lockfile: string;
|
|
9
8
|
};
|
|
10
9
|
protected getArgs(): string[];
|
|
11
|
-
extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string): void
|
|
12
|
-
protected collectAllDependencies(tree: PnpmDependency): void
|
|
13
|
-
protected
|
|
10
|
+
protected extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string): Promise<void>;
|
|
11
|
+
protected collectAllDependencies(tree: PnpmDependency): Promise<void>;
|
|
12
|
+
protected packageVersionString(pkg: PnpmDependency): string;
|
|
13
|
+
protected parseDependenciesTree(jsonBlob: string): Promise<PnpmDependency>;
|
|
14
14
|
}
|
|
@@ -2,69 +2,95 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PnpmNodeModulesCollector = void 0;
|
|
4
4
|
const builder_util_1 = require("builder-util");
|
|
5
|
-
const fs = require("fs");
|
|
6
5
|
const path = require("path");
|
|
7
6
|
const nodeModulesCollector_1 = require("./nodeModulesCollector");
|
|
8
7
|
const packageManager_1 = require("./packageManager");
|
|
9
8
|
class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollector {
|
|
10
9
|
constructor() {
|
|
11
10
|
super(...arguments);
|
|
12
|
-
this.installOptions = {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const config = await nodeModulesCollector_1.NodeModulesCollector.safeExec(command, ["config", "list"], rootDir);
|
|
17
|
-
const lines = Object.fromEntries(config.split("\n").map(line => line.split("=").map(s => s.trim())));
|
|
18
|
-
return lines["node-linker"] === "hoisted";
|
|
11
|
+
this.installOptions = {
|
|
12
|
+
manager: packageManager_1.PM.PNPM,
|
|
13
|
+
lockfile: "pnpm-lock.yaml",
|
|
14
|
+
};
|
|
19
15
|
}
|
|
20
16
|
getArgs() {
|
|
21
17
|
return ["list", "--prod", "--json", "--depth", "Infinity"];
|
|
22
18
|
}
|
|
23
|
-
extractProductionDependencyGraph(tree, dependencyId) {
|
|
19
|
+
async extractProductionDependencyGraph(tree, dependencyId) {
|
|
20
|
+
var _a;
|
|
24
21
|
if (this.productionGraph[dependencyId]) {
|
|
25
22
|
return;
|
|
26
23
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
const getProductionDependencies = async (depTree) => {
|
|
25
|
+
var _a;
|
|
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)));
|
|
32
|
+
const pkgJsonPath = path.join(p, "package.json");
|
|
33
|
+
let packageJson;
|
|
34
|
+
try {
|
|
35
|
+
packageJson = this.requireMemoized(pkgJsonPath);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
builder_util_1.log.warn(null, `Failed to read package.json for ${p}: ${error.message}`);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return { prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } };
|
|
42
|
+
};
|
|
43
|
+
const packageName = tree.name || tree.from;
|
|
44
|
+
const json = packageName === dependencyId ? null : await getProductionDependencies(tree);
|
|
45
|
+
const prodDependencies = (_a = json === null || json === void 0 ? void 0 : json.prodDeps) !== null && _a !== void 0 ? _a : { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
|
|
46
|
+
if (prodDependencies == null) {
|
|
47
|
+
this.productionGraph[dependencyId] = { dependencies: [] };
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
30
50
|
const deps = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
|
|
31
51
|
this.productionGraph[dependencyId] = { dependencies: [] };
|
|
32
|
-
const
|
|
52
|
+
const depPromises = Object.entries(deps)
|
|
33
53
|
.filter(([packageName, dependency]) => {
|
|
54
|
+
var _a;
|
|
34
55
|
// First check if it's in production dependencies
|
|
35
56
|
if (!prodDependencies[packageName]) {
|
|
36
57
|
return false;
|
|
37
58
|
}
|
|
38
|
-
// Then check if optional dependency path exists
|
|
39
|
-
if (
|
|
59
|
+
// Then check if optional dependency path exists (using memoized version)
|
|
60
|
+
if (((_a = json === null || json === void 0 ? void 0 : json.optionalDependencies) === null || _a === void 0 ? void 0 : _a[packageName]) && !this.existsSyncMemoized(dependency.path)) {
|
|
40
61
|
builder_util_1.log.debug(null, `Optional dependency ${packageName}@${dependency.version} path doesn't exist: ${dependency.path}`);
|
|
41
62
|
return false;
|
|
42
63
|
}
|
|
43
64
|
return true;
|
|
44
65
|
})
|
|
45
|
-
.map(([
|
|
46
|
-
const childDependencyId =
|
|
47
|
-
this.extractProductionDependencyGraph(dependency, childDependencyId);
|
|
66
|
+
.map(async ([, dependency]) => {
|
|
67
|
+
const childDependencyId = this.packageVersionString(dependency);
|
|
68
|
+
await this.extractProductionDependencyGraph(dependency, childDependencyId);
|
|
48
69
|
return childDependencyId;
|
|
49
70
|
});
|
|
71
|
+
const dependencies = await Promise.all(depPromises);
|
|
50
72
|
this.productionGraph[dependencyId] = { dependencies };
|
|
51
73
|
}
|
|
52
|
-
collectAllDependencies(tree) {
|
|
74
|
+
async collectAllDependencies(tree) {
|
|
53
75
|
// Collect regular dependencies
|
|
54
76
|
for (const [key, value] of Object.entries(tree.dependencies || {})) {
|
|
55
77
|
this.allDependencies.set(`${key}@${value.version}`, value);
|
|
56
|
-
this.collectAllDependencies(value);
|
|
78
|
+
await this.collectAllDependencies(value);
|
|
57
79
|
}
|
|
58
80
|
// Collect optional dependencies if they exist
|
|
59
81
|
for (const [key, value] of Object.entries(tree.optionalDependencies || {})) {
|
|
60
82
|
this.allDependencies.set(`${key}@${value.version}`, value);
|
|
61
|
-
this.collectAllDependencies(value);
|
|
83
|
+
await this.collectAllDependencies(value);
|
|
62
84
|
}
|
|
63
85
|
}
|
|
64
|
-
|
|
86
|
+
packageVersionString(pkg) {
|
|
87
|
+
// we use 'from' field because 'name' may be different in case of aliases
|
|
88
|
+
return `${pkg.from}@${pkg.version}`;
|
|
89
|
+
}
|
|
90
|
+
async parseDependenciesTree(jsonBlob) {
|
|
65
91
|
const dependencyTree = JSON.parse(jsonBlob);
|
|
66
92
|
// pnpm returns an array of dependency trees
|
|
67
|
-
return dependencyTree[0];
|
|
93
|
+
return Promise.resolve(dependencyTree[0]);
|
|
68
94
|
}
|
|
69
95
|
}
|
|
70
96
|
exports.PnpmNodeModulesCollector = PnpmNodeModulesCollector;
|
|
@@ -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"]}
|
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
export type PackageJson = {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
dependencies?: Record<string, string>;
|
|
5
|
+
devDependencies?: Record<string, string>;
|
|
6
|
+
peerDependencies?: Record<string, string>;
|
|
7
|
+
optionalDependencies?: Record<string, string>;
|
|
8
|
+
workspaces?: string[] | {
|
|
9
|
+
packages: string[];
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export type ResolveModuleOptions<T> = {
|
|
13
|
+
dependency: T;
|
|
14
|
+
virtualPath?: string;
|
|
15
|
+
isOptionalDependency?: boolean;
|
|
16
|
+
};
|
|
1
17
|
export interface NodeModuleInfo {
|
|
2
18
|
name: string;
|
|
3
19
|
version: string;
|
|
@@ -8,16 +24,24 @@ export type ParsedDependencyTree = {
|
|
|
8
24
|
readonly name: string;
|
|
9
25
|
readonly version: string;
|
|
10
26
|
readonly path: string;
|
|
11
|
-
readonly workspaces?: string[]
|
|
27
|
+
readonly workspaces?: string[] | {
|
|
28
|
+
packages: string[];
|
|
29
|
+
};
|
|
12
30
|
};
|
|
13
31
|
export interface PnpmDependency extends Dependency<PnpmDependency, PnpmDependency> {
|
|
14
32
|
readonly from: string;
|
|
33
|
+
readonly resolved: string;
|
|
15
34
|
}
|
|
16
35
|
export interface NpmDependency extends Dependency<NpmDependency, string> {
|
|
36
|
+
readonly resolved?: string;
|
|
17
37
|
readonly _dependencies?: {
|
|
18
38
|
[packageName: string]: string;
|
|
19
39
|
};
|
|
20
40
|
}
|
|
41
|
+
export interface YarnBerryDependency extends Dependency<YarnBerryDependency, string> {
|
|
42
|
+
}
|
|
43
|
+
export interface YarnDependency extends Dependency<YarnDependency, YarnDependency> {
|
|
44
|
+
}
|
|
21
45
|
export type Dependency<T, V> = Dependencies<T, V> & ParsedDependencyTree;
|
|
22
46
|
export type Dependencies<T, V> = {
|
|
23
47
|
readonly dependencies?: {
|