app-builder-lib 26.3.0 → 26.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/out/asar/unpackDetector.js +1 -3
  2. package/out/asar/unpackDetector.js.map +1 -1
  3. package/out/node-module-collector/index.d.ts +8 -5
  4. package/out/node-module-collector/index.js +23 -36
  5. package/out/node-module-collector/index.js.map +1 -1
  6. package/out/node-module-collector/nodeModulesCollector.d.ts +4 -3
  7. package/out/node-module-collector/nodeModulesCollector.js +95 -51
  8. package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
  9. package/out/node-module-collector/npmNodeModulesCollector.js +9 -4
  10. package/out/node-module-collector/npmNodeModulesCollector.js.map +1 -1
  11. package/out/node-module-collector/packageManager.d.ts +8 -6
  12. package/out/node-module-collector/packageManager.js +32 -5
  13. package/out/node-module-collector/packageManager.js.map +1 -1
  14. package/out/node-module-collector/pnpmNodeModulesCollector.js +9 -3
  15. package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  16. package/out/node-module-collector/yarnBerryNodeModulesCollector.js +30 -20
  17. package/out/node-module-collector/yarnBerryNodeModulesCollector.js.map +1 -1
  18. package/out/packager.d.ts +1 -1
  19. package/out/packager.js +2 -20
  20. package/out/packager.js.map +1 -1
  21. package/out/targets/tools.js +12 -12
  22. package/out/targets/tools.js.map +1 -1
  23. package/out/util/appFileCopier.js +2 -1
  24. package/out/util/appFileCopier.js.map +1 -1
  25. package/out/util/macosIconComposer.js +11 -4
  26. package/out/util/macosIconComposer.js.map +1 -1
  27. package/out/util/yarn.d.ts +2 -1
  28. package/out/util/yarn.js +19 -13
  29. package/out/util/yarn.js.map +1 -1
  30. package/out/version.d.ts +1 -1
  31. package/out/version.js +1 -1
  32. package/out/version.js.map +1 -1
  33. package/package.json +7 -7
@@ -18,13 +18,12 @@ class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollecto
18
18
  }
19
19
  async getDependenciesTree(pm) {
20
20
  try {
21
- // force NPM collection as Yarn Berry extends this class and PnP is not supported directly
22
21
  return await super.getDependenciesTree(pm);
23
22
  }
24
23
  catch (error) {
25
- builder_util_1.log.info({ pm, parser: packageManager_1.PM.NPM, error: error.message }, "unable to process dependency tree, falling back to using manual node_modules traversal");
24
+ builder_util_1.log.info({ pm: this.installOptions.manager, parser: packageManager_1.PM.NPM, error: error.message }, "unable to process dependency tree, falling back to using manual node_modules traversal");
26
25
  }
27
- // node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback)
26
+ // node_modules linker fallback. (Slower due to system ops, so we only use it as a fallback) [e.g. corepack env will not allow npm CLI to extract tree]
28
27
  return this.buildNodeModulesTreeManually(this.rootDir);
29
28
  }
30
29
  async collectAllDependencies(tree) {
@@ -102,11 +101,17 @@ class NpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollecto
102
101
  for (const [depName, depVersion] of Object.entries(allProdDepNames)) {
103
102
  try {
104
103
  // Resolve the dependency using Node.js module resolution from this package's directory
105
- const depPath = this.resolvePackageDir(depName, packageDir);
104
+ const depPath = await this.resolvePackageDir(depName, packageDir);
106
105
  if (!depPath) {
107
106
  builder_util_1.log.warn({ package: pkg.name, dependency: depName, version: depVersion }, "dependency not found, skipping");
108
107
  continue;
109
108
  }
109
+ const resolvedDepPath = await this.resolvePath(depPath);
110
+ // Skip if this dependency resolves to the base directory or any parent we're already processing
111
+ if (resolvedDepPath === resolvedPackageDir || resolvedDepPath === (await this.resolvePath(baseDir))) {
112
+ builder_util_1.log.debug({ package: pkg.name, dependency: depName, resolvedPath: resolvedDepPath }, "skipping self-referential dependency");
113
+ continue;
114
+ }
110
115
  builder_util_1.log.debug({ package: pkg.name, dependency: depName, resolvedPath: depPath }, "processing production dependency");
111
116
  // Recursively build the dependency tree for this dependency
112
117
  prodDeps[depName] = await buildFromPackage(depPath);
@@ -1 +1 @@
1
- {"version":3,"file":"npmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/npmNodeModulesCollector.ts"],"names":[],"mappings":"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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"]}
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 detectPackageManagerByEnv(): PM | null;
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>;
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.detectPackageManagerByEnv = detectPackageManagerByEnv;
6
- exports.detectPackageManagerByFile = detectPackageManagerByFile;
7
- exports.detectYarnBerry = detectYarnBerry;
5
+ exports.detectPackageManager = detectPackageManager;
8
6
  const builder_util_1 = require("builder-util");
9
7
  const fs = require("fs-extra");
10
8
  const path = require("path");
11
9
  const which = require("which");
12
10
  var PM;
13
11
  (function (PM) {
14
- PM["NPM"] = "npm";
15
- PM["YARN"] = "yarn";
16
12
  PM["PNPM"] = "pnpm";
13
+ PM["YARN"] = "yarn";
17
14
  PM["YARN_BERRY"] = "yarn-berry";
18
15
  PM["BUN"] = "bun";
16
+ PM["NPM"] = "npm";
19
17
  })(PM || (exports.PM = PM = {}));
20
18
  // Cache for resolved paths
21
19
  const pmPathCache = {
@@ -46,6 +44,35 @@ function getPackageManagerCommand(pm) {
46
44
  pmPathCache[pm] = resolved;
47
45
  return resolved;
48
46
  }
47
+ async function detectPackageManager(searchPaths) {
48
+ var _a, _b;
49
+ let pm = null;
50
+ const dedupedPaths = Array.from(new Set(searchPaths)); // reduce file operations, dedupe paths since primary use case has projectDir === appDir
51
+ const resolveIfYarn = (pm, version, cwd) => (pm === PM.YARN ? detectYarnBerry(cwd, version) : pm);
52
+ for (const dir of dedupedPaths) {
53
+ const packageJsonPath = path.join(dir, "package.json");
54
+ const packageManager = (await (0, builder_util_1.exists)(packageJsonPath)) ? (_a = (await fs.readJson(packageJsonPath, "utf8"))) === null || _a === void 0 ? void 0 : _a.packageManager : undefined;
55
+ if (packageManager) {
56
+ const [pm, version] = packageManager.split("@");
57
+ if (Object.values(PM).includes(pm)) {
58
+ const resolvedPackageManager = await resolveIfYarn(pm, version, dir);
59
+ builder_util_1.log.debug({ resolvedPackageManager, packageManager, cwd: dir }, "packageManager field detected in package.json");
60
+ return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir };
61
+ }
62
+ }
63
+ pm = await detectPackageManagerByFile(dir);
64
+ if (pm) {
65
+ const resolvedPackageManager = await resolveIfYarn(pm, "", dir);
66
+ builder_util_1.log.debug({ resolvedPackageManager, cwd: dir }, "packageManager detected by file");
67
+ return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined };
68
+ }
69
+ }
70
+ pm = detectPackageManagerByEnv() || PM.NPM;
71
+ const cwd = process.env.npm_package_json ? path.dirname(process.env.npm_package_json) : ((_b = process.env.INIT_CWD) !== null && _b !== void 0 ? _b : process.cwd());
72
+ const resolvedPackageManager = await resolveIfYarn(pm, "", cwd);
73
+ builder_util_1.log.debug({ resolvedPackageManager, detected: cwd }, "packageManager not detected by file, falling back to environment detection");
74
+ return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined };
75
+ }
49
76
  function detectPackageManagerByEnv() {
50
77
  const priorityChecklist = [(key) => { var _a; return (_a = process.env.npm_config_user_agent) === null || _a === void 0 ? void 0 : _a.includes(key); }, (key) => { var _a; return (_a = process.env.npm_execpath) === null || _a === void 0 ? void 0 : _a.includes(key); }];
51
78
  const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY);
@@ -1 +1 @@
1
- {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { exists, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport * as which from \"which\"\n\nexport enum PM {\n NPM = \"npm\",\n YARN = \"yarn\",\n PNPM = \"pnpm\",\n YARN_BERRY = \"yarn-berry\",\n BUN = \"bun\",\n}\n\n// Cache for resolved paths\nconst pmPathCache: Record<PM, string | null | undefined> = {\n [PM.NPM]: undefined,\n [PM.YARN]: undefined,\n [PM.PNPM]: undefined,\n [PM.YARN_BERRY]: undefined,\n [PM.BUN]: undefined,\n}\n\nfunction resolveCommand(pm: PM): string {\n const fallback = pm === PM.YARN_BERRY ? \"yarn\" : pm\n\n if (process.platform !== \"win32\") {\n return fallback\n }\n\n try {\n return which.sync(fallback)\n } catch {\n // If `which` fails (not found), still return the fallback string\n return fallback\n }\n}\n\nexport function getPackageManagerCommand(pm: PM) {\n if (pmPathCache[pm] !== undefined) {\n return pmPathCache[pm]!\n }\n\n const resolved = resolveCommand(pm)\n pmPathCache[pm] = resolved\n return resolved\n}\n\nexport function detectPackageManagerByEnv(): PM | null {\n const priorityChecklist = [(key: string) => process.env.npm_config_user_agent?.includes(key), (key: string) => process.env.npm_execpath?.includes(key)]\n\n const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY)\n for (const checker of priorityChecklist) {\n for (const pm of pms) {\n if (checker(pm)) {\n return pm\n }\n }\n }\n return null\n}\n\nexport async function detectPackageManagerByFile(dir: string): Promise<PM | null> {\n const has = (file: string) => exists(path.join(dir, file))\n\n const detected: PM[] = []\n if (await has(\"yarn.lock\")) {\n detected.push(PM.YARN)\n }\n if (await has(\"pnpm-lock.yaml\")) {\n detected.push(PM.PNPM)\n }\n if (await has(\"package-lock.json\")) {\n detected.push(PM.NPM)\n }\n if ((await has(\"bun.lock\")) || (await has(\"bun.lockb\"))) {\n detected.push(PM.BUN)\n }\n\n if (detected.length === 1) {\n return detected[0]\n }\n\n return null\n}\n\nexport async function detectYarnBerry(cwd: string, version: string): Promise<PM.YARN | PM.YARN_BERRY> {\n const checkBerry = () => {\n try {\n if (parseInt(version.split(\".\")[0]) > 1) {\n return PM.YARN_BERRY\n }\n } catch (_error) {\n log.debug({ error: _error }, \"cannot determine yarn version, assuming yarn v1\")\n // If `yarn` is not found or another error occurs, fall back to the regular Yarn since we're already determined in a Yarn project\n }\n return undefined\n }\n\n if (version === \"latest\" || version === \"berry\") {\n return PM.YARN_BERRY\n }\n\n if (version.length > 0) {\n return checkBerry() ?? PM.YARN\n }\n\n const lockPath = path.join(cwd, \"yarn.lock\")\n if (!(await exists(lockPath))) {\n return checkBerry() ?? PM.YARN\n }\n // Read the first few lines of yarn.lock to determine the version\n const firstBytes = (await fs.readFile(lockPath, \"utf8\")).split(\"\\n\").slice(0, 10).join(\"\\n\")\n\n // Yarn v2+ (Berry) has a \"__metadata:\" block near the top\n if (firstBytes.includes(\"__metadata:\")) {\n return PM.YARN_BERRY\n }\n\n // Yarn v1 format is classic semi-YAML with comment header\n if (firstBytes.includes(\"DO NOT EDIT THIS FILE DIRECTLY.\")) {\n return PM.YARN\n }\n\n return checkBerry() ?? PM.YARN\n}\n"]}
1
+ {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { exists, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport * as which from \"which\"\n\nexport enum PM {\n PNPM = \"pnpm\",\n YARN = \"yarn\",\n YARN_BERRY = \"yarn-berry\",\n BUN = \"bun\",\n NPM = \"npm\",\n}\n\n// Cache for resolved paths\nconst pmPathCache: Record<PM, string | null | undefined> = {\n [PM.NPM]: undefined,\n [PM.YARN]: undefined,\n [PM.PNPM]: undefined,\n [PM.YARN_BERRY]: undefined,\n [PM.BUN]: undefined,\n}\n\nfunction resolveCommand(pm: PM): string {\n const fallback = pm === PM.YARN_BERRY ? \"yarn\" : pm\n\n if (process.platform !== \"win32\") {\n return fallback\n }\n\n try {\n return which.sync(fallback)\n } catch {\n // If `which` fails (not found), still return the fallback string\n return fallback\n }\n}\n\nexport function getPackageManagerCommand(pm: PM) {\n if (pmPathCache[pm] !== undefined) {\n return pmPathCache[pm]!\n }\n\n const resolved = resolveCommand(pm)\n pmPathCache[pm] = resolved\n return resolved\n}\n\nexport async function detectPackageManager(searchPaths: string[]): Promise<{ pm: PM; corepackConfig: string | undefined; resolvedDirectory: string | undefined }> {\n let pm: PM | null = null\n const dedupedPaths = Array.from(new Set(searchPaths)) // reduce file operations, dedupe paths since primary use case has projectDir === appDir\n\n const resolveIfYarn = (pm: PM, version: string, cwd: string) => (pm === PM.YARN ? detectYarnBerry(cwd, version) : pm)\n\n for (const dir of dedupedPaths) {\n const packageJsonPath = path.join(dir, \"package.json\")\n const packageManager = (await exists(packageJsonPath)) ? (await fs.readJson(packageJsonPath, \"utf8\"))?.packageManager : undefined\n if (packageManager) {\n const [pm, version] = packageManager.split(\"@\")\n if (Object.values(PM).includes(pm as PM)) {\n const resolvedPackageManager = await resolveIfYarn(pm as PM, version, dir)\n log.debug({ resolvedPackageManager, packageManager, cwd: dir }, \"packageManager field detected in package.json\")\n return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir }\n }\n }\n\n pm = await detectPackageManagerByFile(dir)\n if (pm) {\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", dir)\n log.debug({ resolvedPackageManager, cwd: dir }, \"packageManager detected by file\")\n return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined }\n }\n }\n\n pm = detectPackageManagerByEnv() || PM.NPM\n const cwd = process.env.npm_package_json ? path.dirname(process.env.npm_package_json) : (process.env.INIT_CWD ?? process.cwd())\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", cwd)\n log.debug({ resolvedPackageManager, detected: cwd }, \"packageManager not detected by file, falling back to environment detection\")\n return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined }\n}\n\nfunction detectPackageManagerByEnv(): PM | null {\n const priorityChecklist = [(key: string) => process.env.npm_config_user_agent?.includes(key), (key: string) => process.env.npm_execpath?.includes(key)]\n\n const pms = Object.values(PM).filter(pm => pm !== PM.YARN_BERRY)\n for (const checker of priorityChecklist) {\n for (const pm of pms) {\n if (checker(pm)) {\n return pm\n }\n }\n }\n return null\n}\n\nasync function detectPackageManagerByFile(dir: string): Promise<PM | null> {\n const has = (file: string) => exists(path.join(dir, file))\n\n const detected: PM[] = []\n if (await has(\"yarn.lock\")) {\n detected.push(PM.YARN)\n }\n if (await has(\"pnpm-lock.yaml\")) {\n detected.push(PM.PNPM)\n }\n if (await has(\"package-lock.json\")) {\n detected.push(PM.NPM)\n }\n if ((await has(\"bun.lock\")) || (await has(\"bun.lockb\"))) {\n detected.push(PM.BUN)\n }\n\n if (detected.length === 1) {\n return detected[0]\n }\n\n return null\n}\n\nasync function detectYarnBerry(cwd: string, version: string): Promise<PM.YARN | PM.YARN_BERRY> {\n const checkBerry = () => {\n try {\n if (parseInt(version.split(\".\")[0]) > 1) {\n return PM.YARN_BERRY\n }\n } catch (_error) {\n log.debug({ error: _error }, \"cannot determine yarn version, assuming yarn v1\")\n // If `yarn` is not found or another error occurs, fall back to the regular Yarn since we're already determined in a Yarn project\n }\n return undefined\n }\n\n if (version === \"latest\" || version === \"berry\") {\n return PM.YARN_BERRY\n }\n\n if (version.length > 0) {\n return checkBerry() ?? PM.YARN\n }\n\n const lockPath = path.join(cwd, \"yarn.lock\")\n if (!(await exists(lockPath))) {\n return checkBerry() ?? PM.YARN\n }\n // Read the first few lines of yarn.lock to determine the version\n const firstBytes = (await fs.readFile(lockPath, \"utf8\")).split(\"\\n\").slice(0, 10).join(\"\\n\")\n\n // Yarn v2+ (Berry) has a \"__metadata:\" block near the top\n if (firstBytes.includes(\"__metadata:\")) {\n return PM.YARN_BERRY\n }\n\n // Yarn v1 format is classic semi-YAML with comment header\n if (firstBytes.includes(\"DO NOT EDIT THIS FILE DIRECTLY.\")) {\n return PM.YARN\n }\n\n return checkBerry() ?? PM.YARN\n}\n"]}
@@ -21,9 +21,14 @@ class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
21
21
  if (this.productionGraph[dependencyId]) {
22
22
  return;
23
23
  }
24
- const getProductionDependencies = async (tree) => {
24
+ const getProductionDependencies = async (depTree) => {
25
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)));
26
+ const packageName = depTree.name || depTree.from;
27
+ if ((0, builder_util_1.isEmptyOrSpaces)(packageName)) {
28
+ builder_util_1.log.error(depTree, `Cannot determine production dependencies for package with empty name`);
29
+ throw new Error(`Cannot compute production dependencies for package with empty name: ${packageName}`);
30
+ }
31
+ const p = path.normalize((_a = (await this.resolvePackageDir(packageName, depTree.path))) !== null && _a !== void 0 ? _a : (await this.resolvePath(depTree.path)));
27
32
  const pkgJsonPath = path.join(p, "package.json");
28
33
  let packageJson;
29
34
  try {
@@ -35,7 +40,8 @@ class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
35
40
  }
36
41
  return { prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } };
37
42
  };
38
- const json = tree.name === dependencyId ? null : await getProductionDependencies(tree);
43
+ const packageName = tree.name || tree.from;
44
+ const json = packageName === dependencyId ? null : await getProductionDependencies(tree);
39
45
  const prodDependencies = (_a = json === null || json === void 0 ? void 0 : json.prodDeps) !== null && _a !== void 0 ? _a : { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
40
46
  if (prodDependencies == null) {
41
47
  this.productionGraph[dependencyId] = { dependencies: [] };
@@ -1 +1 @@
1
- {"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.ts"],"names":[],"mappings":"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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
+ {"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { isEmptyOrSpaces, log } from \"builder-util\"\nimport * as path from \"path\"\nimport { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { PackageJson, PnpmDependency } from \"./types\"\n\nexport class PnpmNodeModulesCollector extends NodeModulesCollector<PnpmDependency, PnpmDependency> {\n public readonly installOptions = {\n manager: PM.PNPM,\n lockfile: \"pnpm-lock.yaml\",\n }\n\n protected getArgs(): string[] {\n return [\"list\", \"--prod\", \"--json\", \"--depth\", \"Infinity\"]\n }\n\n protected async extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string) {\n if (this.productionGraph[dependencyId]) {\n return\n }\n\n const getProductionDependencies = async (depTree: PnpmDependency): Promise<{ prodDeps: Record<string, string>; optionalDependencies: Record<string, string> } | null> => {\n const packageName = depTree.name || depTree.from\n if (isEmptyOrSpaces(packageName)) {\n log.error(depTree, `Cannot determine production dependencies for package with empty name`)\n throw new Error(`Cannot compute production dependencies for package with empty name: ${packageName}`)\n }\n\n const p = path.normalize((await this.resolvePackageDir(packageName, depTree.path)) ?? (await this.resolvePath(depTree.path)))\n const pkgJsonPath = path.join(p, \"package.json\")\n\n let packageJson: PackageJson\n try {\n packageJson = this.requireMemoized(pkgJsonPath)\n } catch (error: any) {\n log.warn(null, `Failed to read package.json for ${p}: ${error.message}`)\n return null\n }\n return { prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } }\n }\n\n const packageName = tree.name || tree.from\n const json = packageName === dependencyId ? null : await getProductionDependencies(tree)\n const prodDependencies = json?.prodDeps ?? { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n if (prodDependencies == null) {\n this.productionGraph[dependencyId] = { dependencies: [] }\n return\n }\n const deps = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n this.productionGraph[dependencyId] = { dependencies: [] }\n const depPromises = Object.entries(deps)\n .filter(([packageName, dependency]) => {\n // First check if it's in production dependencies\n if (!prodDependencies[packageName]) {\n return false\n }\n\n // Then check if optional dependency path exists (using memoized version)\n if (json?.optionalDependencies?.[packageName] && !this.existsSyncMemoized(dependency.path)) {\n log.debug(null, `Optional dependency ${packageName}@${dependency.version} path doesn't exist: ${dependency.path}`)\n return false\n }\n\n return true\n })\n .map(async ([, dependency]) => {\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n\n const dependencies = await Promise.all(depPromises)\n this.productionGraph[dependencyId] = { dependencies }\n }\n\n protected async collectAllDependencies(tree: PnpmDependency) {\n // Collect regular dependencies\n for (const [key, value] of Object.entries(tree.dependencies || {})) {\n this.allDependencies.set(`${key}@${value.version}`, value)\n await this.collectAllDependencies(value)\n }\n\n // Collect optional dependencies if they exist\n for (const [key, value] of Object.entries(tree.optionalDependencies || {})) {\n this.allDependencies.set(`${key}@${value.version}`, value)\n await this.collectAllDependencies(value)\n }\n }\n\n protected packageVersionString(pkg: PnpmDependency): string {\n // we use 'from' field because 'name' may be different in case of aliases\n return `${pkg.from}@${pkg.version}`\n }\n\n protected async parseDependenciesTree(jsonBlob: string): Promise<PnpmDependency> {\n const dependencyTree: PnpmDependency[] = JSON.parse(jsonBlob)\n // pnpm returns an array of dependency trees\n return Promise.resolve(dependencyTree[0])\n }\n}\n"]}
@@ -31,13 +31,13 @@ class YarnBerryNodeModulesCollector extends npmNodeModulesCollector_1.NpmNodeMod
31
31
  return ((_a = tree.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) != null || ((_b = tree.optionalDependencies) === null || _b === void 0 ? void 0 : _b[packageName]) != null;
32
32
  }
33
33
  async detectYarnSetup(rootDir) {
34
- var _a, _b, _c, _d, _e, _f;
34
+ var _a, _b, _c, _d;
35
35
  let yarnVersion = null;
36
36
  let nodeLinker = null;
37
37
  let nmHoistingLimits = null;
38
- const output = await this.asyncExec("yarn", ["config", "list", "--json"], rootDir);
39
- if (output.stdout == null) {
40
- builder_util_1.log.debug({ stderr: output.stderr }, "there was no config output, falling back to hoisted mode");
38
+ const output = await this.asyncExec("yarn", ["config", "--json"], rootDir);
39
+ if (!output.stdout) {
40
+ builder_util_1.log.debug(null, "Yarn config returned no output, assuming default Yarn v1 behavior (hoisted, non-PnP)");
41
41
  return {
42
42
  yarnVersion,
43
43
  nodeLinker,
@@ -46,30 +46,40 @@ class YarnBerryNodeModulesCollector extends npmNodeModulesCollector_1.NpmNodeMod
46
46
  isHoisted: true,
47
47
  };
48
48
  }
49
- // Yarn prints multiple JSON lines; find the one with type: 'inspect'
50
- const parsed = output.stdout
49
+ // Yarn 1: multi-line stream with type:"inspect" (not used in this file anyways)
50
+ // Yarn 2–3: multi-line stream with type:"inspect"
51
+ // Yarn 4: single JSON object, no "type"
52
+ const lines = output.stdout
51
53
  .split("\n")
52
54
  .map(l => l.trim())
53
- .filter(Boolean)
54
- .map(l => {
55
+ .filter(Boolean);
56
+ let data = null;
57
+ for (const line of lines) {
55
58
  try {
56
- return JSON.parse(l);
59
+ const parsed = JSON.parse(line);
60
+ // Yarn 4: direct object
61
+ if (parsed.rc || parsed.manifest) {
62
+ data = parsed;
63
+ break;
64
+ }
65
+ // Yarn 1–3: inspect event
66
+ if (parsed.type === "inspect") {
67
+ data = parsed.data;
68
+ break;
69
+ }
57
70
  }
58
71
  catch {
59
- return undefined;
72
+ // ignore non-JSON lines
60
73
  }
61
- })
62
- .filter(Boolean)
63
- .find(l => l.type === "inspect");
64
- if (parsed) {
65
- const data = ((_a = parsed.data) === null || _a === void 0 ? void 0 : _a["rc"]) || parsed.data || {};
66
- yarnVersion = (_d = (_c = (_b = parsed.data) === null || _b === void 0 ? void 0 : _b["manifest"]) === null || _c === void 0 ? void 0 : _c.version) !== null && _d !== void 0 ? _d : null;
67
- nodeLinker = (_e = data["nodeLinker"]) !== null && _e !== void 0 ? _e : null;
68
- nmHoistingLimits = (_f = data["nmHoistingLimits"]) !== null && _f !== void 0 ? _f : null;
69
74
  }
70
- // Determine if using PnP
75
+ if (data) {
76
+ const rc = data.rc || data; // Yarn 4: rc in root; Yarn 2–3: rc inside data
77
+ yarnVersion = (_b = (_a = data.manifest) === null || _a === void 0 ? void 0 : _a.version) !== null && _b !== void 0 ? _b : null;
78
+ nodeLinker = (_c = rc.nodeLinker) !== null && _c !== void 0 ? _c : null;
79
+ nmHoistingLimits = (_d = rc.nmHoistingLimits) !== null && _d !== void 0 ? _d : null;
80
+ }
71
81
  const isPnP = nodeLinker === "pnp";
72
- const isHoisted = isPnP ? false : nmHoistingLimits === "dependencies" || nmHoistingLimits === "workspaces";
82
+ const isHoisted = !isPnP && (nmHoistingLimits === "dependencies" || nmHoistingLimits === "workspaces");
73
83
  return {
74
84
  yarnVersion,
75
85
  nodeLinker,
@@ -1 +1 @@
1
- {"version":3,"file":"yarnBerryNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/yarnBerryNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { Lazy } from \"lazy-val\"\nimport { NpmNodeModulesCollector } from \"./npmNodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { NpmDependency } from \"./types\"\n\ntype YarnSetupInfo = {\n yarnVersion: string | null\n nodeLinker: \"pnp\" | \"node-modules\" | null\n nmHoistingLimits: \"workspaces\" | \"dependencies\" | \"none\" | null\n isPnP: boolean\n isHoisted: boolean\n}\n\n// Only Yarn v1 uses CLI. We should use pnp.cjs for PnP, but we can't access the files due to virtual file paths within zipped modules.\n// We fallback to npm node module collection (since Yarn Berry could have npm-like structure OR pnpm-like structure, depending on `nmHoistingLimits` configuration).\n// In the latter case, we still can't assume `pnpm` is installed, so we still try to use npm collection as a best-effort attempt.\n// If those fail, such as if using corepack, we attempt to manually build the tree.\nexport class YarnBerryNodeModulesCollector extends NpmNodeModulesCollector {\n public readonly installOptions = {\n manager: PM.YARN_BERRY,\n lockfile: \"yarn.lock\",\n }\n\n private yarnSetupInfo: Lazy<YarnSetupInfo> = new Lazy<YarnSetupInfo>(async () => this.detectYarnSetup(this.rootDir))\n\n protected isHoisted: Lazy<boolean> = new Lazy<boolean>(async () => this.yarnSetupInfo.value.then(info => info.isHoisted))\n\n protected async getDependenciesTree(_pm: PM): Promise<NpmDependency> {\n const isPnp = await this.yarnSetupInfo.value.then(info => !!info.isPnP)\n if (isPnp) {\n log.warn(null, \"Yarn PnP extraction not supported directly due to virtual file paths (<package_name>.zip/<file_path>), falling back to NPM node module collector\")\n }\n\n return super.getDependenciesTree(PM.NPM)\n }\n\n protected isProdDependency(packageName: string, tree: NpmDependency): boolean {\n return tree.dependencies?.[packageName] != null || tree.optionalDependencies?.[packageName] != null\n }\n\n private async detectYarnSetup(rootDir: string): Promise<YarnSetupInfo> {\n let yarnVersion: YarnSetupInfo[\"yarnVersion\"] = null\n let nodeLinker: YarnSetupInfo[\"nodeLinker\"] = null\n let nmHoistingLimits: YarnSetupInfo[\"nmHoistingLimits\"] = null\n\n const output = await this.asyncExec(\"yarn\", [\"config\", \"list\", \"--json\"], rootDir)\n\n if (output.stdout == null) {\n log.debug({ stderr: output.stderr }, \"there was no config output, falling back to hoisted mode\")\n return {\n yarnVersion,\n nodeLinker,\n nmHoistingLimits,\n isPnP: false,\n isHoisted: true,\n }\n }\n\n // Yarn prints multiple JSON lines; find the one with type: 'inspect'\n const parsed = output.stdout\n .split(\"\\n\")\n .map(l => l.trim())\n .filter(Boolean)\n .map(l => {\n try {\n return JSON.parse(l)\n } catch {\n return undefined\n }\n })\n .filter(Boolean)\n .find(l => l.type === \"inspect\")\n\n if (parsed) {\n const data = parsed.data?.[\"rc\"] || parsed.data || {}\n\n yarnVersion = parsed.data?.[\"manifest\"]?.version ?? null\n nodeLinker = data[\"nodeLinker\"] ?? null\n nmHoistingLimits = data[\"nmHoistingLimits\"] ?? null\n }\n\n // Determine if using PnP\n const isPnP = nodeLinker === \"pnp\"\n const isHoisted = isPnP ? false : nmHoistingLimits === \"dependencies\" || nmHoistingLimits === \"workspaces\"\n\n return {\n yarnVersion,\n nodeLinker,\n nmHoistingLimits,\n isPnP,\n isHoisted,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"yarnBerryNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/yarnBerryNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { Lazy } from \"lazy-val\"\nimport { NpmNodeModulesCollector } from \"./npmNodeModulesCollector\"\nimport { PM } from \"./packageManager\"\nimport { NpmDependency } from \"./types\"\n\ntype YarnSetupInfo = {\n yarnVersion: string | null\n nodeLinker: \"pnp\" | \"node-modules\" | null\n nmHoistingLimits: \"workspaces\" | \"dependencies\" | \"none\" | null\n isPnP: boolean\n isHoisted: boolean\n}\n\n// Only Yarn v1 uses CLI. We should use pnp.cjs for PnP, but we can't access the files due to virtual file paths within zipped modules.\n// We fallback to npm node module collection (since Yarn Berry could have npm-like structure OR pnpm-like structure, depending on `nmHoistingLimits` configuration).\n// In the latter case, we still can't assume `pnpm` is installed, so we still try to use npm collection as a best-effort attempt.\n// If those fail, such as if using corepack, we attempt to manually build the tree.\nexport class YarnBerryNodeModulesCollector extends NpmNodeModulesCollector {\n public readonly installOptions = {\n manager: PM.YARN_BERRY,\n lockfile: \"yarn.lock\",\n }\n\n private yarnSetupInfo: Lazy<YarnSetupInfo> = new Lazy<YarnSetupInfo>(async () => this.detectYarnSetup(this.rootDir))\n\n protected isHoisted: Lazy<boolean> = new Lazy<boolean>(async () => this.yarnSetupInfo.value.then(info => info.isHoisted))\n\n protected async getDependenciesTree(_pm: PM): Promise<NpmDependency> {\n const isPnp = await this.yarnSetupInfo.value.then(info => !!info.isPnP)\n if (isPnp) {\n log.warn(null, \"Yarn PnP extraction not supported directly due to virtual file paths (<package_name>.zip/<file_path>), falling back to NPM node module collector\")\n }\n\n return super.getDependenciesTree(PM.NPM)\n }\n\n protected isProdDependency(packageName: string, tree: NpmDependency): boolean {\n return tree.dependencies?.[packageName] != null || tree.optionalDependencies?.[packageName] != null\n }\n\n private async detectYarnSetup(rootDir: string): Promise<YarnSetupInfo> {\n let yarnVersion: YarnSetupInfo[\"yarnVersion\"] = null\n let nodeLinker: YarnSetupInfo[\"nodeLinker\"] = null\n let nmHoistingLimits: YarnSetupInfo[\"nmHoistingLimits\"] = null\n\n const output = await this.asyncExec(\"yarn\", [\"config\", \"--json\"], rootDir)\n\n if (!output.stdout) {\n log.debug(null, \"Yarn config returned no output, assuming default Yarn v1 behavior (hoisted, non-PnP)\")\n return {\n yarnVersion,\n nodeLinker,\n nmHoistingLimits,\n isPnP: false,\n isHoisted: true,\n }\n }\n\n // Yarn 1: multi-line stream with type:\"inspect\" (not used in this file anyways)\n // Yarn 2–3: multi-line stream with type:\"inspect\"\n // Yarn 4: single JSON object, no \"type\"\n const lines = output.stdout\n .split(\"\\n\")\n .map(l => l.trim())\n .filter(Boolean)\n\n let data: any = null\n\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line)\n\n // Yarn 4: direct object\n if (parsed.rc || parsed.manifest) {\n data = parsed\n break\n }\n\n // Yarn 1–3: inspect event\n if (parsed.type === \"inspect\") {\n data = parsed.data\n break\n }\n } catch {\n // ignore non-JSON lines\n }\n }\n\n if (data) {\n const rc = data.rc || data // Yarn 4: rc in root; Yarn 2–3: rc inside data\n yarnVersion = data.manifest?.version ?? null\n nodeLinker = rc.nodeLinker ?? null\n nmHoistingLimits = rc.nmHoistingLimits ?? null\n }\n\n const isPnP = nodeLinker === \"pnp\"\n const isHoisted = !isPnP && (nmHoistingLimits === \"dependencies\" || nmHoistingLimits === \"workspaces\")\n\n return {\n yarnVersion,\n nodeLinker,\n nmHoistingLimits,\n isPnP,\n isHoisted,\n }\n }\n}\n"]}
package/out/packager.d.ts CHANGED
@@ -27,7 +27,7 @@ export declare class Packager {
27
27
  readonly projectDir: string;
28
28
  private _appDir;
29
29
  get appDir(): string;
30
- private _packageManager;
30
+ private readonly _packageManager;
31
31
  getPackageManager(): Promise<PM>;
32
32
  getWorkspaceRoot(): Promise<string>;
33
33
  private _metadata;
package/out/packager.js CHANGED
@@ -117,23 +117,6 @@ class Packager {
117
117
  //noinspection JSUnusedGlobalSymbols
118
118
  constructor(options, cancellationToken = new builder_util_runtime_1.CancellationToken()) {
119
119
  this.cancellationToken = cancellationToken;
120
- this._packageManager = new lazy_val_1.Lazy(async () => {
121
- const availableDirs = [this.projectDir, this.appDir];
122
- const pm = await (0, node_module_collector_1.detectPackageManager)(availableDirs);
123
- const workspaceRoot = await (0, node_module_collector_1.findWorkspaceRoot)(pm.pm, this.projectDir);
124
- if (workspaceRoot != null) {
125
- // re-detect package manager from workspace root, this seems particularly necessary for pnpm workspaces
126
- const actualPm = await (0, node_module_collector_1.detectPackageManager)([workspaceRoot]);
127
- return {
128
- pm: actualPm.pm,
129
- workspaceRoot: Promise.resolve(actualPm.resolvedDirectory),
130
- };
131
- }
132
- return {
133
- pm: pm.pm,
134
- workspaceRoot: Promise.resolve(pm.resolvedDirectory),
135
- };
136
- });
137
120
  this._metadata = null;
138
121
  this._nodeModulesHandledExternally = false;
139
122
  this._isPrepackedAppAsar = false;
@@ -202,6 +185,7 @@ class Packager {
202
185
  }
203
186
  this.projectDir = options.projectDir == null ? process.cwd() : path.resolve(options.projectDir);
204
187
  this._appDir = this.projectDir;
188
+ this._packageManager = (0, node_module_collector_1.determinePackageManagerEnv)({ projectDir: this.projectDir, appDir: this.appDir, workspaceRoot: undefined });
205
189
  this.options = {
206
190
  ...options,
207
191
  prepackaged: options.prepackaged == null ? null : path.resolve(this.projectDir, options.prepackaged),
@@ -286,9 +270,7 @@ class Packager {
286
270
  this._devMetadata = await (0, builder_util_1.orNullIfFileNotExist)((0, packageMetadata_1.readPackageJson)(devPackageFile));
287
271
  const devMetadata = this.devMetadata;
288
272
  const configuration = await (0, config_1.getConfig)(projectDir, configPath, configFromOptions, new lazy_val_1.Lazy(() => Promise.resolve(devMetadata)));
289
- if (builder_util_1.log.isDebugEnabled) {
290
- builder_util_1.log.debug({ config: getSafeEffectiveConfig(configuration) }, "effective config");
291
- }
273
+ builder_util_1.log.debug({ config: getSafeEffectiveConfig(configuration) }, "effective config");
292
274
  this._appDir = await (0, config_1.computeDefaultAppDirectory)(projectDir, configuration.directories.app);
293
275
  this.isTwoPackageJsonProjectLayoutUsed = this._appDir !== projectDir;
294
276
  const appPackageFile = this.isTwoPackageJsonProjectLayoutUsed ? path.join(this.appDir, "package.json") : devPackageFile;