app-builder-lib 26.1.0 → 26.3.0

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.
Files changed (86) hide show
  1. package/out/asar/asarUtil.js +78 -10
  2. package/out/asar/asarUtil.js.map +1 -1
  3. package/out/codeSign/macCodeSign.js +2 -1
  4. package/out/codeSign/macCodeSign.js.map +1 -1
  5. package/out/codeSign/windowsCodeSign.js +1 -1
  6. package/out/codeSign/windowsCodeSign.js.map +1 -1
  7. package/out/electron/search-module.js +1 -1
  8. package/out/electron/search-module.js.map +1 -1
  9. package/out/fileMatcher.js +1 -1
  10. package/out/fileMatcher.js.map +1 -1
  11. package/out/linuxPackager.js +1 -1
  12. package/out/linuxPackager.js.map +1 -1
  13. package/out/macPackager.js +31 -6
  14. package/out/macPackager.js.map +1 -1
  15. package/out/node-module-collector/bunNodeModulesCollector.d.ts +11 -0
  16. package/out/node-module-collector/bunNodeModulesCollector.js +22 -0
  17. package/out/node-module-collector/bunNodeModulesCollector.js.map +1 -0
  18. package/out/node-module-collector/index.d.ts +18 -6
  19. package/out/node-module-collector/index.js +102 -28
  20. package/out/node-module-collector/index.js.map +1 -1
  21. package/out/node-module-collector/moduleCache.d.ts +21 -0
  22. package/out/node-module-collector/moduleCache.js +16 -0
  23. package/out/node-module-collector/moduleCache.js.map +1 -0
  24. package/out/node-module-collector/nodeModulesCollector.d.ts +48 -13
  25. package/out/node-module-collector/nodeModulesCollector.js +184 -59
  26. package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
  27. package/out/node-module-collector/npmNodeModulesCollector.d.ts +10 -3
  28. package/out/node-module-collector/npmNodeModulesCollector.js +95 -13
  29. package/out/node-module-collector/npmNodeModulesCollector.js.map +1 -1
  30. package/out/node-module-collector/packageManager.d.ts +2 -2
  31. package/out/node-module-collector/packageManager.js +44 -22
  32. package/out/node-module-collector/packageManager.js.map +1 -1
  33. package/out/node-module-collector/pnpmNodeModulesCollector.d.ts +4 -4
  34. package/out/node-module-collector/pnpmNodeModulesCollector.js +43 -23
  35. package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  36. package/out/node-module-collector/types.d.ts +25 -1
  37. package/out/node-module-collector/types.js.map +1 -1
  38. package/out/node-module-collector/yarnBerryNodeModulesCollector.d.ts +15 -0
  39. package/out/node-module-collector/yarnBerryNodeModulesCollector.js +83 -0
  40. package/out/node-module-collector/yarnBerryNodeModulesCollector.js.map +1 -0
  41. package/out/node-module-collector/yarnNodeModulesCollector.d.ts +12 -2
  42. package/out/node-module-collector/yarnNodeModulesCollector.js +234 -5
  43. package/out/node-module-collector/yarnNodeModulesCollector.js.map +1 -1
  44. package/out/options/PlatformSpecificBuildOptions.d.ts +2 -1
  45. package/out/options/PlatformSpecificBuildOptions.js.map +1 -1
  46. package/out/options/macOptions.d.ts +2 -0
  47. package/out/options/macOptions.js.map +1 -1
  48. package/out/options/winOptions.d.ts +3 -2
  49. package/out/options/winOptions.js.map +1 -1
  50. package/out/packager.d.ts +6 -1
  51. package/out/packager.js +27 -2
  52. package/out/packager.js.map +1 -1
  53. package/out/platformPackager.d.ts +5 -0
  54. package/out/platformPackager.js +50 -0
  55. package/out/platformPackager.js.map +1 -1
  56. package/out/publish/PublishManager.js +2 -2
  57. package/out/publish/PublishManager.js.map +1 -1
  58. package/out/targets/AppxTarget.js +1 -1
  59. package/out/targets/AppxTarget.js.map +1 -1
  60. package/out/targets/LinuxTargetHelper.js +2 -1
  61. package/out/targets/LinuxTargetHelper.js.map +1 -1
  62. package/out/targets/MsiTarget.js +1 -1
  63. package/out/targets/MsiTarget.js.map +1 -1
  64. package/out/targets/nsis/NsisTarget.js +2 -2
  65. package/out/targets/nsis/NsisTarget.js.map +1 -1
  66. package/out/targets/nsis/nsisUtil.js +7 -1
  67. package/out/targets/nsis/nsisUtil.js.map +1 -1
  68. package/out/targets/snap.js +13 -2
  69. package/out/targets/snap.js.map +1 -1
  70. package/out/util/appFileCopier.js +17 -10
  71. package/out/util/appFileCopier.js.map +1 -1
  72. package/out/util/macosIconComposer.d.ts +10 -0
  73. package/out/util/macosIconComposer.js +95 -0
  74. package/out/util/macosIconComposer.js.map +1 -0
  75. package/out/util/yarn.d.ts +3 -2
  76. package/out/util/yarn.js +16 -12
  77. package/out/util/yarn.js.map +1 -1
  78. package/out/version.d.ts +1 -1
  79. package/out/version.js +1 -1
  80. package/out/version.js.map +1 -1
  81. package/out/winPackager.d.ts +1 -1
  82. package/out/winPackager.js +26 -9
  83. package/out/winPackager.js.map +1 -1
  84. package/package.json +9 -9
  85. package/scheme.json +9 -9
  86. package/templates/nsis/uninstaller.nsh +7 -0
@@ -1,28 +1,44 @@
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 = { manager: packageManager_1.PM.NPM, lockfile: "package-lock.json" };
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
- collectAllDependencies(tree) {
15
- for (const [key, value] of Object.entries(tree.dependencies || {})) {
19
+ async getDependenciesTree(pm) {
20
+ try {
21
+ // force NPM collection as Yarn Berry extends this class and PnP is not supported directly
22
+ return await super.getDependenciesTree(pm);
23
+ }
24
+ 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");
26
+ }
27
+ // node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback)
28
+ return this.buildNodeModulesTreeManually(this.rootDir);
29
+ }
30
+ async collectAllDependencies(tree) {
31
+ for (const [, value] of Object.entries(tree.dependencies || {})) {
16
32
  const { _dependencies = {}, dependencies = {} } = value;
17
33
  const isDuplicateDep = Object.keys(_dependencies).length > 0 && Object.keys(dependencies).length === 0;
18
34
  if (isDuplicateDep) {
19
35
  continue;
20
36
  }
21
- this.allDependencies.set(`${key}@${value.version}`, value);
22
- this.collectAllDependencies(value);
37
+ this.allDependencies.set(this.packageVersionString(value), value);
38
+ await this.collectAllDependencies(value);
23
39
  }
24
40
  }
25
- extractProductionDependencyGraph(tree, dependencyId) {
41
+ async extractProductionDependencyGraph(tree, dependencyId) {
26
42
  var _a, _b;
27
43
  if (this.productionGraph[dependencyId]) {
28
44
  return;
@@ -35,16 +51,82 @@ class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollecto
35
51
  // This will prevents infinite loops when circular dependencies are encountered.
36
52
  this.productionGraph[dependencyId] = { dependencies: [] };
37
53
  const productionDeps = Object.entries(resolvedDeps)
38
- .filter(([packageName]) => prodDependencies[packageName])
39
- .map(([packageName, dependency]) => {
40
- const childDependencyId = `${packageName}@${dependency.version}`;
41
- this.extractProductionDependencyGraph(dependency, childDependencyId);
54
+ .filter(([packageName]) => this.isProdDependency(packageName, tree))
55
+ .map(async ([, dependency]) => {
56
+ const childDependencyId = this.packageVersionString(dependency);
57
+ await this.extractProductionDependencyGraph(dependency, childDependencyId);
42
58
  return childDependencyId;
43
59
  });
44
- this.productionGraph[dependencyId] = { dependencies: productionDeps };
60
+ const collectedDependencies = await Promise.all(productionDeps);
61
+ this.productionGraph[dependencyId] = { dependencies: collectedDependencies };
62
+ }
63
+ isProdDependency(packageName, tree) {
64
+ var _a;
65
+ return ((_a = tree._dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) != null;
66
+ }
67
+ /**
68
+ * Builds a dependency tree using only package.json dependencies and optionalDependencies.
69
+ * This skips devDependencies and uses Node.js module resolution (require.resolve).
70
+ */
71
+ buildNodeModulesTreeManually(baseDir) {
72
+ // Track visited packages by their resolved path to prevent infinite loops
73
+ const visited = new Set();
74
+ /**
75
+ * Recursively builds dependency tree starting from a package directory.
76
+ */
77
+ const buildFromPackage = async (packageDir) => {
78
+ const pkgPath = path.join(packageDir, "package.json");
79
+ builder_util_1.log.debug({ pkgPath }, "building dependency node from package.json");
80
+ if (!(await this.existsMemoized(pkgPath))) {
81
+ throw new Error(`package.json not found at ${pkgPath}`);
82
+ }
83
+ // Read package.json using memoized require for consistency with Node.js module system
84
+ const pkg = this.requireMemoized(pkgPath);
85
+ const resolvedPackageDir = await this.resolvePath(packageDir);
86
+ // Use resolved path as the unique identifier to prevent circular dependencies
87
+ if (visited.has(resolvedPackageDir)) {
88
+ builder_util_1.log.debug({ name: pkg.name, version: pkg.version, path: resolvedPackageDir }, "skipping already visited package");
89
+ return {
90
+ name: pkg.name,
91
+ version: pkg.version,
92
+ path: resolvedPackageDir,
93
+ };
94
+ }
95
+ visited.add(resolvedPackageDir);
96
+ const prodDeps = {};
97
+ const allProdDepNames = {
98
+ ...pkg.dependencies,
99
+ ...pkg.optionalDependencies,
100
+ };
101
+ // Process all production and optional dependencies
102
+ for (const [depName, depVersion] of Object.entries(allProdDepNames)) {
103
+ try {
104
+ // Resolve the dependency using Node.js module resolution from this package's directory
105
+ const depPath = this.resolvePackageDir(depName, packageDir);
106
+ if (!depPath) {
107
+ builder_util_1.log.warn({ package: pkg.name, dependency: depName, version: depVersion }, "dependency not found, skipping");
108
+ continue;
109
+ }
110
+ builder_util_1.log.debug({ package: pkg.name, dependency: depName, resolvedPath: depPath }, "processing production dependency");
111
+ // Recursively build the dependency tree for this dependency
112
+ prodDeps[depName] = await buildFromPackage(depPath);
113
+ }
114
+ catch (error) {
115
+ builder_util_1.log.warn({ package: pkg.name, dependency: depName, error: error.message }, "failed to process dependency, skipping");
116
+ }
117
+ }
118
+ return {
119
+ name: pkg.name,
120
+ version: pkg.version,
121
+ path: resolvedPackageDir,
122
+ dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,
123
+ optionalDependencies: pkg.optionalDependencies,
124
+ };
125
+ };
126
+ return buildFromPackage(baseDir);
45
127
  }
46
- parseDependenciesTree(jsonBlob) {
47
- return JSON.parse(jsonBlob);
128
+ async parseDependenciesTree(jsonBlob) {
129
+ return Promise.resolve(JSON.parse(jsonBlob));
48
130
  }
49
131
  }
50
132
  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 // 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"]}
@@ -7,5 +7,5 @@ export declare enum PM {
7
7
  }
8
8
  export declare function getPackageManagerCommand(pm: PM): string;
9
9
  export declare function detectPackageManagerByEnv(): PM | null;
10
- export declare function detectPackageManagerByLockfile(cwd: string): PM | null;
11
- export declare function detectYarnBerry(): PM.YARN | PM.YARN_BERRY;
10
+ export declare function detectPackageManagerByFile(dir: string): Promise<PM | null>;
11
+ export declare function detectYarnBerry(cwd: string, version: string): Promise<PM.YARN | PM.YARN_BERRY>;
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PM = void 0;
4
4
  exports.getPackageManagerCommand = getPackageManagerCommand;
5
5
  exports.detectPackageManagerByEnv = detectPackageManagerByEnv;
6
- exports.detectPackageManagerByLockfile = detectPackageManagerByLockfile;
6
+ exports.detectPackageManagerByFile = detectPackageManagerByFile;
7
7
  exports.detectYarnBerry = detectYarnBerry;
8
+ const builder_util_1 = require("builder-util");
9
+ const fs = require("fs-extra");
8
10
  const path = require("path");
9
- const fs = require("fs");
10
11
  const which = require("which");
11
- const child_process_1 = require("child_process");
12
12
  var PM;
13
13
  (function (PM) {
14
14
  PM["NPM"] = "npm";
@@ -47,14 +47,7 @@ function getPackageManagerCommand(pm) {
47
47
  return resolved;
48
48
  }
49
49
  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
- ];
50
+ 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
51
  const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY);
59
52
  for (const checker of priorityChecklist) {
60
53
  for (const pm of pms) {
@@ -65,19 +58,19 @@ function detectPackageManagerByEnv() {
65
58
  }
66
59
  return null;
67
60
  }
68
- function detectPackageManagerByLockfile(cwd) {
69
- const has = (file) => fs.existsSync(path.join(cwd, file));
61
+ async function detectPackageManagerByFile(dir) {
62
+ const has = (file) => (0, builder_util_1.exists)(path.join(dir, file));
70
63
  const detected = [];
71
- if (has("yarn.lock")) {
64
+ if (await has("yarn.lock")) {
72
65
  detected.push(PM.YARN);
73
66
  }
74
- if (has("pnpm-lock.yaml")) {
67
+ if (await has("pnpm-lock.yaml")) {
75
68
  detected.push(PM.PNPM);
76
69
  }
77
- if (has("package-lock.json")) {
70
+ if (await has("package-lock.json")) {
78
71
  detected.push(PM.NPM);
79
72
  }
80
- if (has("bun.lock") || has("bun.lockb")) {
73
+ if ((await has("bun.lock")) || (await has("bun.lockb"))) {
81
74
  detected.push(PM.BUN);
82
75
  }
83
76
  if (detected.length === 1) {
@@ -85,11 +78,40 @@ function detectPackageManagerByLockfile(cwd) {
85
78
  }
86
79
  return null;
87
80
  }
88
- function detectYarnBerry() {
89
- // yarn --version
90
- const version = (0, child_process_1.execSync)("yarn --version").toString().trim();
91
- if (parseInt(version.split(".")[0]) > 1)
81
+ async function detectYarnBerry(cwd, version) {
82
+ var _a, _b, _c;
83
+ const checkBerry = () => {
84
+ try {
85
+ if (parseInt(version.split(".")[0]) > 1) {
86
+ return PM.YARN_BERRY;
87
+ }
88
+ }
89
+ catch (_error) {
90
+ builder_util_1.log.debug({ error: _error }, "cannot determine yarn version, assuming yarn v1");
91
+ // If `yarn` is not found or another error occurs, fall back to the regular Yarn since we're already determined in a Yarn project
92
+ }
93
+ return undefined;
94
+ };
95
+ if (version === "latest" || version === "berry") {
92
96
  return PM.YARN_BERRY;
93
- return PM.YARN;
97
+ }
98
+ if (version.length > 0) {
99
+ return (_a = checkBerry()) !== null && _a !== void 0 ? _a : PM.YARN;
100
+ }
101
+ const lockPath = path.join(cwd, "yarn.lock");
102
+ if (!(await (0, builder_util_1.exists)(lockPath))) {
103
+ return (_b = checkBerry()) !== null && _b !== void 0 ? _b : PM.YARN;
104
+ }
105
+ // Read the first few lines of yarn.lock to determine the version
106
+ const firstBytes = (await fs.readFile(lockPath, "utf8")).split("\n").slice(0, 10).join("\n");
107
+ // Yarn v2+ (Berry) has a "__metadata:" block near the top
108
+ if (firstBytes.includes("__metadata:")) {
109
+ return PM.YARN_BERRY;
110
+ }
111
+ // Yarn v1 format is classic semi-YAML with comment header
112
+ if (firstBytes.includes("DO NOT EDIT THIS FILE DIRECTLY.")) {
113
+ return PM.YARN;
114
+ }
115
+ return (_c = checkBerry()) !== null && _c !== void 0 ? _c : PM.YARN;
94
116
  }
95
117
  //# sourceMappingURL=packageManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":"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","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 // yarn --version\n const version = execSync(\"yarn --version\").toString().trim()\n if (parseInt(version.split(\".\")[0]) > 1) return PM.YARN_BERRY\n return 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 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"]}
@@ -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 parseDependenciesTree(jsonBlob: string): PnpmDependency;
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,89 @@
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 = { manager: packageManager_1.PM.PNPM, lockfile: "pnpm-lock.yaml" };
13
- }
14
- static async isPnpmProjectHoisted(rootDir) {
15
- const command = (0, packageManager_1.getPackageManagerCommand)(packageManager_1.PM.PNPM);
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 p = path.normalize(this.resolvePath(tree.path));
28
- const packageJson = require(path.join(p, "package.json"));
29
- const prodDependencies = { ...packageJson.dependencies, ...packageJson.optionalDependencies };
24
+ const getProductionDependencies = async (tree) => {
25
+ var _a;
26
+ const p = path.normalize((_a = this.resolvePackageDir(tree.name, tree.path)) !== null && _a !== void 0 ? _a : (await this.resolvePath(tree.path)));
27
+ const pkgJsonPath = path.join(p, "package.json");
28
+ let packageJson;
29
+ try {
30
+ packageJson = this.requireMemoized(pkgJsonPath);
31
+ }
32
+ catch (error) {
33
+ builder_util_1.log.warn(null, `Failed to read package.json for ${p}: ${error.message}`);
34
+ return null;
35
+ }
36
+ return { prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } };
37
+ };
38
+ const json = tree.name === dependencyId ? null : await getProductionDependencies(tree);
39
+ const prodDependencies = (_a = json === null || json === void 0 ? void 0 : json.prodDeps) !== null && _a !== void 0 ? _a : { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
40
+ if (prodDependencies == null) {
41
+ this.productionGraph[dependencyId] = { dependencies: [] };
42
+ return;
43
+ }
30
44
  const deps = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
31
45
  this.productionGraph[dependencyId] = { dependencies: [] };
32
- const dependencies = Object.entries(deps)
46
+ const depPromises = Object.entries(deps)
33
47
  .filter(([packageName, dependency]) => {
48
+ var _a;
34
49
  // First check if it's in production dependencies
35
50
  if (!prodDependencies[packageName]) {
36
51
  return false;
37
52
  }
38
- // Then check if optional dependency path exists
39
- if (packageJson.optionalDependencies && packageJson.optionalDependencies[packageName] && !fs.existsSync(dependency.path)) {
53
+ // Then check if optional dependency path exists (using memoized version)
54
+ if (((_a = json === null || json === void 0 ? void 0 : json.optionalDependencies) === null || _a === void 0 ? void 0 : _a[packageName]) && !this.existsSyncMemoized(dependency.path)) {
40
55
  builder_util_1.log.debug(null, `Optional dependency ${packageName}@${dependency.version} path doesn't exist: ${dependency.path}`);
41
56
  return false;
42
57
  }
43
58
  return true;
44
59
  })
45
- .map(([packageName, dependency]) => {
46
- const childDependencyId = `${packageName}@${dependency.version}`;
47
- this.extractProductionDependencyGraph(dependency, childDependencyId);
60
+ .map(async ([, dependency]) => {
61
+ const childDependencyId = this.packageVersionString(dependency);
62
+ await this.extractProductionDependencyGraph(dependency, childDependencyId);
48
63
  return childDependencyId;
49
64
  });
65
+ const dependencies = await Promise.all(depPromises);
50
66
  this.productionGraph[dependencyId] = { dependencies };
51
67
  }
52
- collectAllDependencies(tree) {
68
+ async collectAllDependencies(tree) {
53
69
  // Collect regular dependencies
54
70
  for (const [key, value] of Object.entries(tree.dependencies || {})) {
55
71
  this.allDependencies.set(`${key}@${value.version}`, value);
56
- this.collectAllDependencies(value);
72
+ await this.collectAllDependencies(value);
57
73
  }
58
74
  // Collect optional dependencies if they exist
59
75
  for (const [key, value] of Object.entries(tree.optionalDependencies || {})) {
60
76
  this.allDependencies.set(`${key}@${value.version}`, value);
61
- this.collectAllDependencies(value);
77
+ await this.collectAllDependencies(value);
62
78
  }
63
79
  }
64
- parseDependenciesTree(jsonBlob) {
80
+ packageVersionString(pkg) {
81
+ // we use 'from' field because 'name' may be different in case of aliases
82
+ return `${pkg.from}@${pkg.version}`;
83
+ }
84
+ async parseDependenciesTree(jsonBlob) {
65
85
  const dependencyTree = JSON.parse(jsonBlob);
66
86
  // pnpm returns an array of dependency trees
67
- return dependencyTree[0];
87
+ return Promise.resolve(dependencyTree[0]);
68
88
  }
69
89
  }
70
90
  exports.PnpmNodeModulesCollector = PnpmNodeModulesCollector;
@@ -1 +1 @@
1
- {"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { getPackageManagerCommand, PM } from \"./packageManager\"\nimport { Dependency, PnpmDependency } from \"./types\"\n\nexport class PnpmNodeModulesCollector extends NodeModulesCollector<PnpmDependency, PnpmDependency> {\n static async isPnpmProjectHoisted(rootDir: string) {\n const command = getPackageManagerCommand(PM.PNPM)\n const config = await NodeModulesCollector.safeExec(command, [\"config\", \"list\"], rootDir)\n const lines = Object.fromEntries(config.split(\"\\n\").map(line => line.split(\"=\").map(s => s.trim())))\n return lines[\"node-linker\"] === \"hoisted\"\n }\n\n public readonly installOptions = { manager: PM.PNPM, lockfile: \"pnpm-lock.yaml\" }\n\n protected getArgs(): string[] {\n return [\"list\", \"--prod\", \"--json\", \"--depth\", \"Infinity\"]\n }\n\n extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string): void {\n if (this.productionGraph[dependencyId]) {\n return\n }\n\n const p = path.normalize(this.resolvePath(tree.path))\n const packageJson: Dependency<string, string> = require(path.join(p, \"package.json\"))\n const prodDependencies = { ...packageJson.dependencies, ...packageJson.optionalDependencies }\n\n const deps = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n this.productionGraph[dependencyId] = { dependencies: [] }\n const dependencies = 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\n if (packageJson.optionalDependencies && packageJson.optionalDependencies[packageName] && !fs.existsSync(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(([packageName, dependency]) => {\n const childDependencyId = `${packageName}@${dependency.version}`\n this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n\n this.productionGraph[dependencyId] = { dependencies }\n }\n\n protected 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 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 this.collectAllDependencies(value)\n }\n }\n\n protected parseDependenciesTree(jsonBlob: string): PnpmDependency {\n const dependencyTree: PnpmDependency[] = JSON.parse(jsonBlob)\n // pnpm returns an array of dependency trees\n return dependencyTree[0]\n }\n}\n"]}
1
+ {"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.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 { 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 (tree: PnpmDependency): Promise<{ prodDeps: Record<string, string>; optionalDependencies: Record<string, string> } | null> => {\n const p = path.normalize(this.resolvePackageDir(tree.name, tree.path) ?? (await this.resolvePath(tree.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 json = tree.name === 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?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/node-module-collector/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface NodeModuleInfo {\n name: string\n version: string\n dir: string\n dependencies?: Array<NodeModuleInfo>\n}\n\nexport type ParsedDependencyTree = {\n readonly name: string\n readonly version: string\n readonly path: string\n readonly workspaces?: string[] // we only use this at root level\n}\n\n// Note: `PnpmDependency` and `NpmDependency` include the output of `JSON.parse(...)` of `pnpm list` and `npm list` respectively\n// This object has a TON of info - a majority, if not all, of each dependency's package.json\n// We extract only what we need when constructing DependencyTree in `extractProductionDependencyTree`\nexport interface PnpmDependency extends Dependency<PnpmDependency, PnpmDependency> {\n readonly from: string\n}\n\nexport interface NpmDependency extends Dependency<NpmDependency, string> {\n // implicit dependencies\n readonly _dependencies?: {\n [packageName: string]: string\n }\n}\n\nexport type Dependency<T, V> = Dependencies<T, V> & ParsedDependencyTree\n\nexport type Dependencies<T, V> = {\n readonly dependencies?: {\n [packageName: string]: T\n }\n readonly optionalDependencies?: {\n [packageName: string]: V\n }\n}\n\nexport interface DependencyGraph {\n [packageNameAndVersion: string]: PackageDependencies\n}\n\ninterface PackageDependencies {\n readonly dependencies: string[]\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/node-module-collector/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PackageJson = {\n name: string\n version: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n workspaces?: string[] | { packages: string[] }\n}\n\nexport type ResolveModuleOptions<T> = {\n dependency: T\n virtualPath?: string // e.g. for file: dependencies or symlinked dependencies\n isOptionalDependency?: boolean\n}\n\nexport interface NodeModuleInfo {\n name: string\n version: string\n dir: string\n dependencies?: Array<NodeModuleInfo>\n}\n\nexport type ParsedDependencyTree = {\n readonly name: string\n readonly version: string\n readonly path: string\n readonly workspaces?: string[] | { packages: string[] } // we only use this at root level\n}\n\n// Note: `PnpmDependency` and `NpmDependency` include the output of `JSON.parse(...)` of `pnpm list` and `npm list` respectively\n// This object has a TON of info - a majority, if not all, of each dependency's package.json\n// We extract only what we need when constructing DependencyTree in `extractProductionDependencyTree`\nexport interface PnpmDependency extends Dependency<PnpmDependency, PnpmDependency> {\n readonly from: string\n readonly resolved: string\n}\n\nexport interface NpmDependency extends Dependency<NpmDependency, string> {\n readonly resolved?: string\n // implicit dependencies\n readonly _dependencies?: {\n [packageName: string]: string\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface YarnBerryDependency extends Dependency<YarnBerryDependency, string> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface YarnDependency extends Dependency<YarnDependency, YarnDependency> {}\n\nexport type Dependency<T, V> = Dependencies<T, V> & ParsedDependencyTree\n\nexport type Dependencies<T, V> = {\n readonly dependencies?: {\n [packageName: string]: T\n }\n readonly optionalDependencies?: {\n [packageName: string]: V\n }\n}\n\nexport interface DependencyGraph {\n [packageNameAndVersion: string]: PackageDependencies\n}\n\ninterface PackageDependencies {\n readonly dependencies: string[]\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { Lazy } from "lazy-val";
2
+ import { NpmNodeModulesCollector } from "./npmNodeModulesCollector";
3
+ import { PM } from "./packageManager";
4
+ import { NpmDependency } from "./types";
5
+ export declare class YarnBerryNodeModulesCollector extends NpmNodeModulesCollector {
6
+ readonly installOptions: {
7
+ manager: PM;
8
+ lockfile: string;
9
+ };
10
+ private yarnSetupInfo;
11
+ protected isHoisted: Lazy<boolean>;
12
+ protected getDependenciesTree(_pm: PM): Promise<NpmDependency>;
13
+ protected isProdDependency(packageName: string, tree: NpmDependency): boolean;
14
+ private detectYarnSetup;
15
+ }