app-builder-lib 26.3.6 → 26.4.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 (59) hide show
  1. package/out/asar/asarUtil.js +105 -73
  2. package/out/asar/asarUtil.js.map +1 -1
  3. package/out/macPackager.js +4 -0
  4. package/out/macPackager.js.map +1 -1
  5. package/out/node-module-collector/bunNodeModulesCollector.d.ts +4 -5
  6. package/out/node-module-collector/bunNodeModulesCollector.js +5 -9
  7. package/out/node-module-collector/bunNodeModulesCollector.js.map +1 -1
  8. package/out/node-module-collector/index.d.ts +5 -4
  9. package/out/node-module-collector/index.js +7 -4
  10. package/out/node-module-collector/index.js.map +1 -1
  11. package/out/node-module-collector/moduleManager.d.ts +52 -0
  12. package/out/node-module-collector/moduleManager.js +227 -0
  13. package/out/node-module-collector/moduleManager.js.map +1 -0
  14. package/out/node-module-collector/nodeModulesCollector.d.ts +11 -25
  15. package/out/node-module-collector/nodeModulesCollector.js +17 -180
  16. package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
  17. package/out/node-module-collector/npmNodeModulesCollector.d.ts +3 -9
  18. package/out/node-module-collector/npmNodeModulesCollector.js +14 -85
  19. package/out/node-module-collector/npmNodeModulesCollector.js.map +1 -1
  20. package/out/node-module-collector/packageManager.d.ts +2 -1
  21. package/out/node-module-collector/packageManager.js +2 -0
  22. package/out/node-module-collector/packageManager.js.map +1 -1
  23. package/out/node-module-collector/pnpmNodeModulesCollector.d.ts +0 -1
  24. package/out/node-module-collector/pnpmNodeModulesCollector.js +21 -54
  25. package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  26. package/out/node-module-collector/traversalNodeModulesCollector.d.ts +19 -0
  27. package/out/node-module-collector/traversalNodeModulesCollector.js +122 -0
  28. package/out/node-module-collector/traversalNodeModulesCollector.js.map +1 -0
  29. package/out/node-module-collector/types.d.ts +5 -10
  30. package/out/node-module-collector/types.js.map +1 -1
  31. package/out/node-module-collector/yarnBerryNodeModulesCollector.js +3 -3
  32. package/out/node-module-collector/yarnBerryNodeModulesCollector.js.map +1 -1
  33. package/out/node-module-collector/yarnNodeModulesCollector.d.ts +1 -2
  34. package/out/node-module-collector/yarnNodeModulesCollector.js +4 -32
  35. package/out/node-module-collector/yarnNodeModulesCollector.js.map +1 -1
  36. package/out/publish/PublishManager.d.ts +3 -10
  37. package/out/publish/PublishManager.js +8 -6
  38. package/out/publish/PublishManager.js.map +1 -1
  39. package/out/targets/AppImageTarget.js +1 -1
  40. package/out/targets/AppImageTarget.js.map +1 -1
  41. package/out/targets/FpmTarget.js +2 -2
  42. package/out/targets/FpmTarget.js.map +1 -1
  43. package/out/util/appFileCopier.js +17 -13
  44. package/out/util/appFileCopier.js.map +1 -1
  45. package/out/util/normalizePackageData.js +6 -4
  46. package/out/util/normalizePackageData.js.map +1 -1
  47. package/out/util/pathManager.d.ts +1 -0
  48. package/out/util/pathManager.js +10 -0
  49. package/out/util/pathManager.js.map +1 -1
  50. package/out/version.d.ts +1 -1
  51. package/out/version.js +1 -1
  52. package/out/version.js.map +1 -1
  53. package/out/winPackager.d.ts +2 -0
  54. package/out/winPackager.js +7 -1
  55. package/out/winPackager.js.map +1 -1
  56. package/package.json +7 -7
  57. package/out/node-module-collector/moduleCache.d.ts +0 -27
  58. package/out/node-module-collector/moduleCache.js +0 -57
  59. package/out/node-module-collector/moduleCache.js.map +0 -1
@@ -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 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\ntype PackageManagerSetup = {\n pm: PM\n corepackConfig: string | undefined\n resolvedDirectory: string | undefined\n detectionMethod: string\n}\n\nexport async function detectPackageManager(searchPaths: string[]): Promise<PackageManagerSetup> {\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 return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir, detectionMethod: \"packageManager field\" }\n }\n }\n\n pm = await detectPackageManagerByFile(dir)\n if (pm) {\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", dir)\n return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined, detectionMethod: \"lock file\" }\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.info({ resolvedPackageManager, detected: cwd }, \"packageManager not detected by file, falling back to environment detection\")\n return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined, detectionMethod: \"process environment\" }\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"]}
1
+ {"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/node-module-collector/packageManager.ts"],"names":[],"mappings":";;;AAuCA,4DAQC;AASD,oDA6BC;AArFD,+CAA0C;AAC1C,+BAA8B;AAC9B,6BAA4B;AAC5B,+BAA8B;AAE9B,IAAY,EAOX;AAPD,WAAY,EAAE;IACZ,mBAAa,CAAA;IACb,mBAAa,CAAA;IACb,+BAAyB,CAAA;IACzB,iBAAW,CAAA;IACX,iBAAW,CAAA;IACX,6BAAuB,CAAA;AACzB,CAAC,EAPW,EAAE,kBAAF,EAAE,QAOb;AAED,2BAA2B;AAC3B,MAAM,WAAW,GAA0C;IACzD,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS;IACnB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS;IACpB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS;IACpB,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS;IAC1B,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS;IACnB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS;CAC1B,CAAA;AAED,SAAS,cAAc,CAAC,EAAM;IAC5B,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,OAAO,QAAQ,CAAA;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,wBAAwB,CAAC,EAAM;IAC7C,IAAI,WAAW,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,WAAW,CAAC,EAAE,CAAE,CAAA;IACzB,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;IACnC,WAAW,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAA;IAC1B,OAAO,QAAQ,CAAA;AACjB,CAAC;AASM,KAAK,UAAU,oBAAoB,CAAC,WAAqB;;IAC9D,IAAI,EAAE,GAAc,IAAI,CAAA;IACxB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA,CAAC,wFAAwF;IAE9I,MAAM,aAAa,GAAG,CAAC,EAAM,EAAE,OAAe,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAErH,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QACtD,MAAM,cAAc,GAAG,CAAC,MAAM,IAAA,qBAAM,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,0CAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;QACjI,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAQ,CAAC,EAAE,CAAC;gBACzC,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC1E,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,EAAE,eAAe,EAAE,sBAAsB,EAAE,CAAA;YACxI,CAAC;QACH,CAAC;QAED,EAAE,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAC/D,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,CAAA;QACxH,CAAC;IACH,CAAC;IAED,EAAE,GAAG,yBAAyB,EAAE,IAAI,EAAE,CAAC,GAAG,CAAA;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,mCAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/H,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAC/D,kBAAG,CAAC,IAAI,CAAC,EAAE,sBAAsB,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,4EAA4E,CAAC,CAAA;IACjI,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAA;AACxI,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,iBAAiB,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,0CAAE,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA,EAAE,CAAC,GAAW,EAAE,EAAE,WAAC,OAAA,MAAA,OAAO,CAAC,GAAG,CAAC,YAAY,0CAAE,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA,CAAC,CAAA;IAEvJ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAA;IAChE,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,GAAW;IACnD,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,qBAAM,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;IAE1D,MAAM,QAAQ,GAAS,EAAE,CAAA;IACzB,IAAI,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IACD,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,OAAe;;IACzD,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,CAAC,UAAU,CAAA;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,kBAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,iDAAiD,CAAC,CAAA;YAC/E,iIAAiI;QACnI,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC,UAAU,CAAA;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,MAAA,UAAU,EAAE,mCAAI,EAAE,CAAC,IAAI,CAAA;IAChC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAC5C,IAAI,CAAC,CAAC,MAAM,IAAA,qBAAM,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAA,UAAU,EAAE,mCAAI,EAAE,CAAC,IAAI,CAAA;IAChC,CAAC;IACD,iEAAiE;IACjE,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE5F,0DAA0D;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC,UAAU,CAAA;IACtB,CAAC;IAED,0DAA0D;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC,IAAI,CAAA;IAChB,CAAC;IAED,OAAO,MAAA,UAAU,EAAE,mCAAI,EAAE,CAAC,IAAI,CAAA;AAChC,CAAC","sourcesContent":["import { exists, log } from \"builder-util\"\nimport * as fs from \"fs-extra\"\nimport * as path from \"path\"\nimport * as which from \"which\"\n\nexport enum PM {\n PNPM = \"pnpm\",\n YARN = \"yarn\",\n YARN_BERRY = \"yarn-berry\",\n BUN = \"bun\",\n NPM = \"npm\",\n TRAVERSAL = \"traversal\",\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 [PM.TRAVERSAL]: 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\ntype PackageManagerSetup = {\n pm: PM\n corepackConfig: string | undefined\n resolvedDirectory: string | undefined\n detectionMethod: string\n}\n\nexport async function detectPackageManager(searchPaths: string[]): Promise<PackageManagerSetup> {\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 return { pm: resolvedPackageManager, corepackConfig: packageManager, resolvedDirectory: dir, detectionMethod: \"packageManager field\" }\n }\n }\n\n pm = await detectPackageManagerByFile(dir)\n if (pm) {\n const resolvedPackageManager = await resolveIfYarn(pm, \"\", dir)\n return { pm: resolvedPackageManager, resolvedDirectory: dir, corepackConfig: undefined, detectionMethod: \"lock file\" }\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.info({ resolvedPackageManager, detected: cwd }, \"packageManager not detected by file, falling back to environment detection\")\n return { pm: resolvedPackageManager, resolvedDirectory: undefined, corepackConfig: undefined, detectionMethod: \"process environment\" }\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"]}
@@ -7,7 +7,6 @@ export declare class PnpmNodeModulesCollector extends NodeModulesCollector<PnpmD
7
7
  lockfile: string;
8
8
  };
9
9
  protected getArgs(): string[];
10
- private resolveActualPath;
11
10
  private getProductionDependencies;
12
11
  protected extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string): Promise<void>;
13
12
  protected collectAllDependencies(tree: PnpmDependency): Promise<void>;
@@ -14,21 +14,7 @@ class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
14
14
  };
15
15
  }
16
16
  getArgs() {
17
- return ["list", "--prod", "--json", "--depth", "Infinity", "--long"];
18
- }
19
- async resolveActualPath(depTree) {
20
- // If using hoisted mode, try to find the package at the hoisted location first
21
- if (await this.isHoisted.value) {
22
- const packageName = depTree.name || depTree.from;
23
- if (packageName) {
24
- const hoistedPath = path.join(this.rootDir, "node_modules", packageName);
25
- if (await this.cache.exists[hoistedPath]) {
26
- return hoistedPath;
27
- }
28
- }
29
- }
30
- // Fall back to the reported path (which might be the .pnpm store path)
31
- return depTree.path;
17
+ return ["list", "--prod", "--json", "--depth", "Infinity"];
32
18
  }
33
19
  async getProductionDependencies(depTree) {
34
20
  const packageName = depTree.name || depTree.from;
@@ -36,65 +22,46 @@ class PnpmNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
36
22
  builder_util_1.log.error(depTree, `Cannot determine production dependencies for package with empty name`);
37
23
  throw new Error(`Cannot compute production dependencies for package with empty name: ${packageName}`);
38
24
  }
39
- const actualPath = await this.resolveActualPath(depTree);
40
- const resolvedLocalPath = await this.cache.realPath[actualPath];
41
- const p = path.normalize(resolvedLocalPath);
42
- const pkgJsonPath = path.join(p, "package.json");
43
- let packageJson;
44
- try {
45
- packageJson = await this.cache.packageJson[pkgJsonPath];
25
+ const result = await this.cache.locatePackageVersion({ parentDir: depTree.path, pkgName: packageName, requiredRange: depTree.version });
26
+ if (result == null) {
27
+ return { path: path.resolve(depTree.path), dependencies: {}, optionalDependencies: {} };
46
28
  }
47
- catch (error) {
48
- builder_util_1.log.warn(null, `Failed to read package.json for ${p}: ${error.message}`);
49
- return { path: p, prodDeps: {}, optionalDependencies: {} };
50
- }
51
- return { path: p, prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } };
29
+ const { dependencies, optionalDependencies } = result.packageJson;
30
+ return { path: result.packageDir, dependencies: { ...dependencies }, optionalDependencies: { ...optionalDependencies } };
52
31
  }
53
32
  async extractProductionDependencyGraph(tree, dependencyId) {
54
- var _a;
33
+ var _a, _b, _c, _d;
55
34
  if (this.productionGraph[dependencyId]) {
56
35
  return;
57
36
  }
37
+ this.productionGraph[dependencyId] = { dependencies: [] };
58
38
  const packageName = tree.name || tree.from;
39
+ const treeDep = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
59
40
  const json = packageName === dependencyId ? null : await this.getProductionDependencies(tree);
60
- const prodDependencies = (_a = json === null || json === void 0 ? void 0 : json.prodDeps) !== null && _a !== void 0 ? _a : { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
61
- if (prodDependencies == null) {
62
- this.productionGraph[dependencyId] = { dependencies: [] };
63
- return;
64
- }
65
- const deps = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
66
- this.productionGraph[dependencyId] = { dependencies: [] };
67
- const depPromises = Object.entries(deps).map(async ([packageName, dependency]) => {
68
- var _a;
69
- // First check if it's in production dependencies
41
+ const prodDependencies = json ? { ...json.dependencies, ...json.optionalDependencies } : treeDep;
42
+ const collectedDependencies = [];
43
+ for (const packageName in treeDep) {
70
44
  if (!prodDependencies[packageName]) {
71
- return undefined;
45
+ continue;
72
46
  }
73
47
  // Then check if optional dependency path exists (using actual resolved path)
74
- if ((_a = json === null || json === void 0 ? void 0 : json.optionalDependencies) === null || _a === void 0 ? void 0 : _a[packageName]) {
75
- const actualPath = await this.resolveActualPath(dependency);
76
- if (!(await this.cache.exists[actualPath])) {
77
- builder_util_1.log.debug(null, `Optional dependency ${packageName}@${dependency.version} path doesn't exist: ${actualPath}`);
78
- return undefined;
79
- }
48
+ const version = ((_a = json === null || json === void 0 ? void 0 : json.optionalDependencies) === null || _a === void 0 ? void 0 : _a[packageName]) || ((_c = (_b = tree.optionalDependencies) === null || _b === void 0 ? void 0 : _b[packageName]) === null || _c === void 0 ? void 0 : _c.version) || "";
49
+ const result = await this.locatePackageWithVersion({ name: packageName, version, path: (_d = json === null || json === void 0 ? void 0 : json.path) !== null && _d !== void 0 ? _d : tree.path });
50
+ if (result == null || !(await this.cache.exists[result.packageDir])) {
51
+ builder_util_1.log.debug({ packageName, version: version, searchPath: result === null || result === void 0 ? void 0 : result.packageDir }, `optional dependency not installed, skipping`);
52
+ continue;
80
53
  }
54
+ const dependency = treeDep[packageName];
81
55
  const childDependencyId = this.packageVersionString(dependency);
82
56
  await this.extractProductionDependencyGraph(dependency, childDependencyId);
83
- return childDependencyId;
84
- });
85
- const collectedDependencies = [];
86
- for (const dep of depPromises) {
87
- const result = await dep;
88
- if (result !== undefined) {
89
- collectedDependencies.push(result);
90
- }
57
+ collectedDependencies.push(childDependencyId);
91
58
  }
92
59
  this.productionGraph[dependencyId] = { dependencies: collectedDependencies };
93
60
  }
94
61
  async collectAllDependencies(tree) {
95
62
  // Collect regular dependencies
96
63
  for (const [key, value] of Object.entries(tree.dependencies || {})) {
97
- const json = await this.getProductionDependencies(value);
64
+ const json = await this.getProductionDependencies({ ...value, name: key });
98
65
  this.allDependencies.set(`${key}@${value.version}`, { ...value, path: json.path });
99
66
  await this.collectAllDependencies(value);
100
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pnpmNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/pnpmNodeModulesCollector.ts"],"names":[],"mappings":";;;AAAA,+CAAmD;AACnD,6BAA4B;AAC5B,iEAA6D;AAC7D,qDAAqC;AAGrC,MAAa,wBAAyB,SAAQ,2CAAoD;IAAlG;;QACkB,mBAAc,GAAG;YAC/B,OAAO,EAAE,mBAAE,CAAC,IAAI;YAChB,QAAQ,EAAE,gBAAgB;SAC3B,CAAA;IAgHH,CAAC;IA9GW,OAAO;QACf,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;IACtE,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAAuB;QACrD,+EAA+E;QAC/E,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAA;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,CAAC,CAAA;gBACxE,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;oBACzC,OAAO,WAAW,CAAA;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QACD,uEAAuE;QACvE,OAAO,OAAO,CAAC,IAAI,CAAA;IACrB,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,OAAuB;QAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAA;QAChD,IAAI,IAAA,8BAAe,EAAC,WAAW,CAAC,EAAE,CAAC;YACjC,kBAAG,CAAC,KAAK,CAAC,OAAO,EAAE,sEAAsE,CAAC,CAAA;YAC1F,MAAM,IAAI,KAAK,CAAC,uEAAuE,WAAW,EAAE,CAAC,CAAA;QACvG,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACxD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;QAEhD,IAAI,WAAwB,CAAA;QAC5B,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;QACzD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,kBAAG,CAAC,IAAI,CAAC,IAAI,EAAE,mCAAmC,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YACxE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAA;QAC5D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,WAAW,CAAC,oBAAoB,EAAE,EAAE,oBAAoB,EAAE,EAAE,GAAG,WAAW,CAAC,oBAAoB,EAAE,EAAE,CAAA;IACnK,CAAC;IAES,KAAK,CAAC,gCAAgC,CAAC,IAAoB,EAAE,YAAoB;;QACzF,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,OAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAA;QAC1C,MAAM,IAAI,GAAG,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;QAC7F,MAAM,gBAAgB,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,mCAAI,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAA;QACjH,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;YACzD,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAA;QACnF,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE;;YAC/E,iDAAiD;YACjD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnC,OAAO,SAAS,CAAA;YAClB,CAAC;YAED,6EAA6E;YAC7E,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,oBAAoB,0CAAG,WAAW,CAAC,EAAE,CAAC;gBAC9C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAA;gBAC3D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oBAC3C,kBAAG,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,WAAW,IAAI,UAAU,CAAC,OAAO,wBAAwB,UAAU,EAAE,CAAC,CAAA;oBAC7G,OAAO,SAAS,CAAA;gBAClB,CAAC;YACH,CAAC;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAA;YAC/D,MAAM,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;YAC1E,OAAO,iBAAiB,CAAA;QAC1B,CAAC,CAAC,CAAA;QAEF,MAAM,qBAAqB,GAAa,EAAE,CAAA;QAC1C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAA;YACxB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAA;IAC9E,CAAC;IAES,KAAK,CAAC,sBAAsB,CAAC,IAAoB;QACzD,+BAA+B;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAA;YACxD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAClF,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;QAED,8CAA8C;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAA;YACxD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAClF,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAES,oBAAoB,CAAC,GAAmB;QAChD,yEAAyE;QACzE,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAA;IACrC,CAAC;IAES,KAAK,CAAC,qBAAqB,CAAC,QAAgB;QACpD,MAAM,cAAc,GAAqB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC7D,4CAA4C;QAC5C,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC;CACF;AApHD,4DAoHC","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\", \"--long\"]\n }\n\n private async resolveActualPath(depTree: PnpmDependency): Promise<string> {\n // If using hoisted mode, try to find the package at the hoisted location first\n if (await this.isHoisted.value) {\n const packageName = depTree.name || depTree.from\n if (packageName) {\n const hoistedPath = path.join(this.rootDir, \"node_modules\", packageName)\n if (await this.cache.exists[hoistedPath]) {\n return hoistedPath\n }\n }\n }\n // Fall back to the reported path (which might be the .pnpm store path)\n return depTree.path\n }\n\n private async getProductionDependencies(depTree: PnpmDependency): Promise<{ path: string; prodDeps: Record<string, string>; optionalDependencies: Record<string, string> }> {\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 actualPath = await this.resolveActualPath(depTree)\n const resolvedLocalPath = await this.cache.realPath[actualPath]\n const p = path.normalize(resolvedLocalPath)\n const pkgJsonPath = path.join(p, \"package.json\")\n\n let packageJson: PackageJson\n try {\n packageJson = await this.cache.packageJson[pkgJsonPath]\n } catch (error: any) {\n log.warn(null, `Failed to read package.json for ${p}: ${error.message}`)\n return { path: p, prodDeps: {}, optionalDependencies: {} }\n }\n return { path: p, prodDeps: { ...packageJson.dependencies, ...packageJson.optionalDependencies }, optionalDependencies: { ...packageJson.optionalDependencies } }\n }\n\n protected async extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string) {\n if (this.productionGraph[dependencyId]) {\n return\n }\n\n const packageName = tree.name || tree.from\n const json = packageName === dependencyId ? null : await this.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).map(async ([packageName, dependency]) => {\n // First check if it's in production dependencies\n if (!prodDependencies[packageName]) {\n return undefined\n }\n\n // Then check if optional dependency path exists (using actual resolved path)\n if (json?.optionalDependencies?.[packageName]) {\n const actualPath = await this.resolveActualPath(dependency)\n if (!(await this.cache.exists[actualPath])) {\n log.debug(null, `Optional dependency ${packageName}@${dependency.version} path doesn't exist: ${actualPath}`)\n return undefined\n }\n }\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n return childDependencyId\n })\n\n const collectedDependencies: string[] = []\n for (const dep of depPromises) {\n const result = await dep\n if (result !== undefined) {\n collectedDependencies.push(result)\n }\n }\n this.productionGraph[dependencyId] = { dependencies: collectedDependencies }\n }\n\n protected async collectAllDependencies(tree: PnpmDependency) {\n // Collect regular dependencies\n for (const [key, value] of Object.entries(tree.dependencies || {})) {\n const json = await this.getProductionDependencies(value)\n this.allDependencies.set(`${key}@${value.version}`, { ...value, path: json.path })\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 const json = await this.getProductionDependencies(value)\n this.allDependencies.set(`${key}@${value.version}`, { ...value, path: json.path })\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 { 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 private async getProductionDependencies(depTree: PnpmDependency): Promise<{ path: string; dependencies: Record<string, string>; optionalDependencies: Record<string, string> }> {\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 result = await this.cache.locatePackageVersion({ parentDir: depTree.path, pkgName: packageName, requiredRange: depTree.version })\n if (result == null) {\n return { path: path.resolve(depTree.path), dependencies: {}, optionalDependencies: {} }\n }\n\n const { dependencies, optionalDependencies } = result.packageJson\n return { path: result.packageDir, dependencies: { ...dependencies }, optionalDependencies: { ...optionalDependencies } }\n }\n\n protected async extractProductionDependencyGraph(tree: PnpmDependency, dependencyId: string) {\n if (this.productionGraph[dependencyId]) {\n return\n }\n this.productionGraph[dependencyId] = { dependencies: [] }\n\n const packageName = tree.name || tree.from\n\n const treeDep = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n const json = packageName === dependencyId ? null : await this.getProductionDependencies(tree)\n const prodDependencies = json ? { ...json.dependencies, ...json.optionalDependencies } : treeDep\n\n const collectedDependencies: string[] = []\n for (const packageName in treeDep) {\n if (!prodDependencies[packageName]) {\n continue\n }\n\n // Then check if optional dependency path exists (using actual resolved path)\n const version = json?.optionalDependencies?.[packageName] || tree.optionalDependencies?.[packageName]?.version || \"\"\n const result = await this.locatePackageWithVersion({ name: packageName, version, path: json?.path ?? tree.path })\n if (result == null || !(await this.cache.exists[result.packageDir])) {\n log.debug({ packageName, version: version, searchPath: result?.packageDir }, `optional dependency not installed, skipping`)\n continue\n }\n const dependency = treeDep[packageName]\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n collectedDependencies.push(childDependencyId)\n }\n this.productionGraph[dependencyId] = { dependencies: collectedDependencies }\n }\n\n protected async collectAllDependencies(tree: PnpmDependency) {\n // Collect regular dependencies\n for (const [key, value] of Object.entries(tree.dependencies || {})) {\n const json = await this.getProductionDependencies({ ...value, name: key })\n this.allDependencies.set(`${key}@${value.version}`, { ...value, path: json.path })\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 const json = await this.getProductionDependencies(value)\n this.allDependencies.set(`${key}@${value.version}`, { ...value, path: json.path })\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"]}
@@ -0,0 +1,19 @@
1
+ import { NodeModulesCollector } from "./nodeModulesCollector";
2
+ import { PM } from "./packageManager.js";
3
+ import { TraversedDependency } from "./types.js";
4
+ export declare class TraversalNodeModulesCollector extends NodeModulesCollector<TraversedDependency, TraversedDependency> {
5
+ installOptions: {
6
+ manager: PM;
7
+ lockfile: string;
8
+ };
9
+ protected getArgs(): string[];
10
+ protected getDependenciesTree(_pm: PM): Promise<TraversedDependency>;
11
+ protected collectAllDependencies(tree: TraversedDependency, appPackageName: string): Promise<void>;
12
+ protected extractProductionDependencyGraph(tree: TraversedDependency, dependencyId: string): Promise<void>;
13
+ protected parseDependenciesTree(jsonBlob: string): Promise<TraversedDependency>;
14
+ /**
15
+ * Builds a dependency tree using only package.json dependencies and optionalDependencies.
16
+ * This skips devDependencies and uses Node.js module resolution (require.resolve).
17
+ */
18
+ private buildNodeModulesTreeManually;
19
+ }
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TraversalNodeModulesCollector = void 0;
4
+ const builder_util_1 = require("builder-util");
5
+ const nodeModulesCollector_1 = require("./nodeModulesCollector");
6
+ const packageManager_js_1 = require("./packageManager.js");
7
+ const path = require("path");
8
+ // manual traversal of node_modules for package managers without CLI support for dependency tree extraction (e.g., bun) OR as a fallback (e.g. corepack enabled w/ strict mode)
9
+ class TraversalNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollector {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.installOptions = {
13
+ manager: packageManager_js_1.PM.TRAVERSAL,
14
+ lockfile: "none",
15
+ };
16
+ }
17
+ getArgs() {
18
+ return [];
19
+ }
20
+ getDependenciesTree(_pm) {
21
+ builder_util_1.log.info(null, "using manual traversal of node_modules to build dependency tree");
22
+ return this.buildNodeModulesTreeManually(this.rootDir, undefined);
23
+ }
24
+ async collectAllDependencies(tree, appPackageName) {
25
+ for (const [, value] of Object.entries({ ...tree.dependencies, ...tree.optionalDependencies })) {
26
+ this.allDependencies.set(this.packageVersionString(value), value);
27
+ await this.collectAllDependencies(value, appPackageName);
28
+ }
29
+ }
30
+ // we don't need to check optional dependencies here because they're pre-processed in `buildNodeModulesTreeManually`
31
+ async extractProductionDependencyGraph(tree, dependencyId) {
32
+ if (this.productionGraph[dependencyId]) {
33
+ return;
34
+ }
35
+ this.productionGraph[dependencyId] = { dependencies: [] };
36
+ const prodDependencies = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) };
37
+ const collectedDependencies = [];
38
+ for (const packageName in prodDependencies) {
39
+ const dependency = prodDependencies[packageName];
40
+ const childDependencyId = this.packageVersionString(dependency);
41
+ await this.extractProductionDependencyGraph(dependency, childDependencyId);
42
+ collectedDependencies.push(childDependencyId);
43
+ }
44
+ this.productionGraph[dependencyId] = { dependencies: collectedDependencies };
45
+ }
46
+ async parseDependenciesTree(jsonBlob) {
47
+ return Promise.resolve(JSON.parse(jsonBlob));
48
+ }
49
+ /**
50
+ * Builds a dependency tree using only package.json dependencies and optionalDependencies.
51
+ * This skips devDependencies and uses Node.js module resolution (require.resolve).
52
+ */
53
+ async buildNodeModulesTreeManually(baseDir, aliasName) {
54
+ // Track visited packages by their resolved path to prevent infinite loops
55
+ const visited = new Set();
56
+ const resolvedBaseDir = await this.cache.realPath[baseDir];
57
+ /**
58
+ * Recursively builds dependency tree starting from a package directory.
59
+ * @param packageDir - The directory of the package to process
60
+ * @param aliasName - Optional alias name for npm aliased dependencies (e.g., "foo": "npm:@scope/bar@1.0.0")
61
+ * When provided, this name is used instead of the package.json name for the module name,
62
+ * ensuring the package is copied to the correct location in node_modules.
63
+ */
64
+ const buildFromPackage = async (packageDir, aliasName) => {
65
+ const pkgPath = path.join(packageDir, "package.json");
66
+ if (!(await this.cache.exists[pkgPath])) {
67
+ throw new Error(`package.json not found at ${pkgPath}`);
68
+ }
69
+ const pkg = (await this.cache.json[pkgPath]);
70
+ const resolvedPackageDir = await this.cache.realPath[packageDir];
71
+ // Use the alias name if provided, otherwise fall back to the package.json name
72
+ // This ensures npm aliased packages are copied to the correct location
73
+ const moduleName = aliasName !== null && aliasName !== void 0 ? aliasName : pkg.name;
74
+ // Use resolved path as the unique identifier to prevent circular dependencies
75
+ if (visited.has(resolvedPackageDir)) {
76
+ builder_util_1.log.debug({ name: moduleName, version: pkg.version, path: resolvedPackageDir }, "skipping already visited package");
77
+ return {
78
+ name: moduleName,
79
+ version: pkg.version,
80
+ path: resolvedPackageDir,
81
+ };
82
+ }
83
+ visited.add(resolvedPackageDir);
84
+ const buildPackage = async (dependencies, nullHandler) => {
85
+ const builtPackages = {};
86
+ for (const [depName, depVersion] of Object.entries(dependencies || {})) {
87
+ const pkg = await this.locatePackageWithVersion({ name: depName, version: depVersion, path: resolvedPackageDir });
88
+ const logFields = { parent: moduleName, dependency: depName, version: depVersion };
89
+ if (pkg == null) {
90
+ nullHandler(depName, depVersion);
91
+ continue;
92
+ }
93
+ // Skip if this dependency resolves to the base directory or any parent we're already processing
94
+ if (pkg.packageDir === resolvedPackageDir || pkg.packageDir === resolvedBaseDir) {
95
+ builder_util_1.log.debug({ ...logFields, resolvedPath: pkg.packageDir }, "skipping self-referential dependency");
96
+ continue;
97
+ }
98
+ builder_util_1.log.debug(logFields, "processing production dependency");
99
+ builtPackages[depName] = await buildFromPackage(pkg.packageDir, depName);
100
+ }
101
+ return builtPackages;
102
+ };
103
+ const prodDeps = await buildPackage(pkg.dependencies, (depName, version) => {
104
+ builder_util_1.log.error({ parent: moduleName, dependency: depName, version }, "production dependency not found");
105
+ throw new Error(`Production dependency ${depName} not found for package ${moduleName}`);
106
+ });
107
+ const optionalDeps = await buildPackage(pkg.optionalDependencies, (depName) => {
108
+ builder_util_1.log.debug({ parent: moduleName, dependency: depName }, "optional dependency not installed, skipping");
109
+ });
110
+ return {
111
+ name: moduleName,
112
+ version: pkg.version,
113
+ path: resolvedPackageDir,
114
+ dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,
115
+ optionalDependencies: Object.keys(optionalDeps).length > 0 ? optionalDeps : undefined,
116
+ };
117
+ };
118
+ return buildFromPackage(baseDir, aliasName);
119
+ }
120
+ }
121
+ exports.TraversalNodeModulesCollector = TraversalNodeModulesCollector;
122
+ //# sourceMappingURL=traversalNodeModulesCollector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversalNodeModulesCollector.js","sourceRoot":"","sources":["../../src/node-module-collector/traversalNodeModulesCollector.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { NodeModulesCollector } from \"./nodeModulesCollector\"\nimport { PM } from \"./packageManager.js\"\nimport { TraversedDependency } from \"./types.js\"\nimport * as path from \"path\"\n\n// manual traversal of node_modules for package managers without CLI support for dependency tree extraction (e.g., bun) OR as a fallback (e.g. corepack enabled w/ strict mode)\nexport class TraversalNodeModulesCollector extends NodeModulesCollector<TraversedDependency, TraversedDependency> {\n public installOptions = {\n manager: PM.TRAVERSAL,\n lockfile: \"none\",\n }\n\n protected getArgs(): string[] {\n return []\n }\n\n protected getDependenciesTree(_pm: PM): Promise<TraversedDependency> {\n log.info(null, \"using manual traversal of node_modules to build dependency tree\")\n return this.buildNodeModulesTreeManually(this.rootDir, undefined)\n }\n\n protected async collectAllDependencies(tree: TraversedDependency, appPackageName: string) {\n for (const [, value] of Object.entries({ ...tree.dependencies, ...tree.optionalDependencies })) {\n this.allDependencies.set(this.packageVersionString(value), value)\n await this.collectAllDependencies(value, appPackageName)\n }\n }\n\n // we don't need to check optional dependencies here because they're pre-processed in `buildNodeModulesTreeManually`\n protected async extractProductionDependencyGraph(tree: TraversedDependency, dependencyId: string): Promise<void> {\n if (this.productionGraph[dependencyId]) {\n return\n }\n this.productionGraph[dependencyId] = { dependencies: [] }\n\n const prodDependencies = { ...(tree.dependencies || {}), ...(tree.optionalDependencies || {}) }\n\n const collectedDependencies: string[] = []\n for (const packageName in prodDependencies) {\n const dependency = prodDependencies[packageName]\n const childDependencyId = this.packageVersionString(dependency)\n await this.extractProductionDependencyGraph(dependency, childDependencyId)\n collectedDependencies.push(childDependencyId)\n }\n this.productionGraph[dependencyId] = { dependencies: collectedDependencies }\n }\n\n protected async parseDependenciesTree(jsonBlob: string): Promise<TraversedDependency> {\n return Promise.resolve(JSON.parse(jsonBlob))\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 private async buildNodeModulesTreeManually(baseDir: string, aliasName: string | undefined): Promise<TraversedDependency> {\n // Track visited packages by their resolved path to prevent infinite loops\n const visited = new Set<string>()\n const resolvedBaseDir = await this.cache.realPath[baseDir]\n\n /**\n * Recursively builds dependency tree starting from a package directory.\n * @param packageDir - The directory of the package to process\n * @param aliasName - Optional alias name for npm aliased dependencies (e.g., \"foo\": \"npm:@scope/bar@1.0.0\")\n * When provided, this name is used instead of the package.json name for the module name,\n * ensuring the package is copied to the correct location in node_modules.\n */\n const buildFromPackage = async (packageDir: string, aliasName: string | undefined): Promise<TraversedDependency> => {\n const pkgPath = path.join(packageDir, \"package.json\")\n\n if (!(await this.cache.exists[pkgPath])) {\n throw new Error(`package.json not found at ${pkgPath}`)\n }\n\n const pkg = (await this.cache.json[pkgPath])!\n const resolvedPackageDir = await this.cache.realPath[packageDir]\n\n // Use the alias name if provided, otherwise fall back to the package.json name\n // This ensures npm aliased packages are copied to the correct location\n const moduleName = aliasName ?? pkg.name\n\n // Use resolved path as the unique identifier to prevent circular dependencies\n if (visited.has(resolvedPackageDir)) {\n log.debug({ name: moduleName, version: pkg.version, path: resolvedPackageDir }, \"skipping already visited package\")\n\n return {\n name: moduleName,\n version: pkg.version,\n path: resolvedPackageDir,\n }\n }\n\n visited.add(resolvedPackageDir)\n\n const buildPackage = async (dependencies: Record<string, string> | undefined, nullHandler: (depName: string, version: string) => void) => {\n const builtPackages: Record<string, TraversedDependency> = {}\n for (const [depName, depVersion] of Object.entries(dependencies || {})) {\n const pkg = await this.locatePackageWithVersion({ name: depName, version: depVersion, path: resolvedPackageDir })\n\n const logFields = { parent: moduleName, dependency: depName, version: depVersion }\n if (pkg == null) {\n nullHandler(depName, depVersion)\n continue\n }\n\n // Skip if this dependency resolves to the base directory or any parent we're already processing\n if (pkg.packageDir === resolvedPackageDir || pkg.packageDir === resolvedBaseDir) {\n log.debug({ ...logFields, resolvedPath: pkg.packageDir }, \"skipping self-referential dependency\")\n continue\n }\n\n log.debug(logFields, \"processing production dependency\")\n builtPackages[depName] = await buildFromPackage(pkg.packageDir, depName)\n }\n return builtPackages\n }\n\n const prodDeps = await buildPackage(pkg.dependencies, (depName: string, version: string) => {\n log.error({ parent: moduleName, dependency: depName, version }, \"production dependency not found\")\n throw new Error(`Production dependency ${depName} not found for package ${moduleName}`)\n })\n\n const optionalDeps = await buildPackage(pkg.optionalDependencies, (depName: string) => {\n log.debug({ parent: moduleName, dependency: depName }, \"optional dependency not installed, skipping\")\n })\n\n return {\n name: moduleName,\n version: pkg.version,\n path: resolvedPackageDir,\n dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,\n optionalDependencies: Object.keys(optionalDeps).length > 0 ? optionalDeps : undefined,\n }\n }\n\n return buildFromPackage(baseDir, aliasName)\n }\n}\n"]}
@@ -9,11 +9,6 @@ export type PackageJson = {
9
9
  packages: string[];
10
10
  };
11
11
  };
12
- export type ResolveModuleOptions<T> = {
13
- dependency: T;
14
- virtualPath?: string;
15
- isOptionalDependency?: boolean;
16
- };
17
12
  export interface NodeModuleInfo {
18
13
  name: string;
19
14
  version: string;
@@ -42,6 +37,8 @@ export interface YarnBerryDependency extends Dependency<YarnBerryDependency, str
42
37
  }
43
38
  export interface YarnDependency extends Dependency<YarnDependency, YarnDependency> {
44
39
  }
40
+ export interface TraversedDependency extends Dependency<TraversedDependency, TraversedDependency> {
41
+ }
45
42
  export type Dependency<T, V> = Dependencies<T, V> & ParsedDependencyTree;
46
43
  export type Dependencies<T, V> = {
47
44
  readonly dependencies?: {
@@ -52,9 +49,7 @@ export type Dependencies<T, V> = {
52
49
  };
53
50
  };
54
51
  export interface DependencyGraph {
55
- [packageNameAndVersion: string]: PackageDependencies;
56
- }
57
- interface PackageDependencies {
58
- readonly dependencies: string[];
52
+ [packageNameAndVersion: string]: {
53
+ readonly dependencies: string[];
54
+ };
59
55
  }
60
- export {};
@@ -1 +1 @@
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"]}
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 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, returned only through `npm list`\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\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface TraversedDependency extends Dependency<TraversedDependency, TraversedDependency> {}\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]: {\n readonly dependencies: string[]\n }\n}\n"]}
@@ -22,13 +22,13 @@ class YarnBerryNodeModulesCollector extends npmNodeModulesCollector_1.NpmNodeMod
22
22
  async getDependenciesTree(_pm) {
23
23
  const isPnp = await this.yarnSetupInfo.value.then(info => !!info.isPnP);
24
24
  if (isPnp) {
25
- builder_util_1.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");
25
+ builder_util_1.log.warn(null, "Yarn PnP extraction not supported directly due to virtual file paths (<package_name>.zip/<file_path>), utilizing NPM node module collector");
26
26
  }
27
27
  return super.getDependenciesTree(packageManager_1.PM.NPM);
28
28
  }
29
29
  isProdDependency(packageName, tree) {
30
- var _a, _b, _c;
31
- return ((_a = tree._dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) != null || ((_b = tree.dependencies) === null || _b === void 0 ? void 0 : _b[packageName]) != null || ((_c = tree.optionalDependencies) === null || _c === void 0 ? void 0 : _c[packageName]) != null;
30
+ var _a, _b;
31
+ return super.isProdDependency(packageName, tree) || ((_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
34
  var _a, _b, _c, _d;
@@ -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.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"]}
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>), utilizing NPM node module collector\")\n }\n\n return super.getDependenciesTree(PM.NPM)\n }\n\n protected isProdDependency(packageName: string, tree: NpmDependency): boolean {\n return super.isProdDependency(packageName, tree) || 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"]}
@@ -1,7 +1,7 @@
1
1
  import { Lazy } from "lazy-val";
2
2
  import { NodeModulesCollector } from "./nodeModulesCollector";
3
3
  import { PM } from "./packageManager";
4
- import { PackageJson, YarnDependency } from "./types";
4
+ import { YarnDependency } from "./types";
5
5
  export declare class YarnNodeModulesCollector extends NodeModulesCollector<YarnDependency, YarnDependency> {
6
6
  readonly installOptions: {
7
7
  manager: PM;
@@ -10,7 +10,6 @@ export declare class YarnNodeModulesCollector extends NodeModulesCollector<YarnD
10
10
  protected isHoisted: Lazy<boolean>;
11
11
  protected getArgs(): string[];
12
12
  protected extractProductionDependencyGraph(tree: YarnDependency, dependencyId: string): Promise<void>;
13
- protected getDependencyType(pkgName: string, parentPkgJson: PackageJson): "prod" | "dev" | "optional";
14
13
  protected parseDependenciesTree(jsonBlob: string): Promise<YarnDependency>;
15
14
  private normalizeTree;
16
15
  protected collectAllDependencies(tree: YarnDependency, packageToExclude: string): Promise<void>;
@@ -39,19 +39,6 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
39
39
  }
40
40
  this.productionGraph[dependencyId] = { dependencies };
41
41
  }
42
- getDependencyType(pkgName, parentPkgJson) {
43
- var _a, _b, _c;
44
- if ((_a = parentPkgJson.optionalDependencies) === null || _a === void 0 ? void 0 : _a[pkgName]) {
45
- return "optional";
46
- }
47
- if ((_b = parentPkgJson.devDependencies) === null || _b === void 0 ? void 0 : _b[pkgName]) {
48
- return "dev";
49
- }
50
- if ((_c = parentPkgJson.dependencies) === null || _c === void 0 ? void 0 : _c[pkgName]) {
51
- return "prod";
52
- }
53
- return "prod";
54
- }
55
42
  async parseDependenciesTree(jsonBlob) {
56
43
  const lines = jsonBlob
57
44
  .split("\n")
@@ -73,8 +60,8 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
73
60
  if (!parsedTree) {
74
61
  throw new Error('Failed to extract Yarn tree: no "type":"tree" line found in console output');
75
62
  }
76
- const rootPkgJson = await this.cache.packageJson[path.join(this.rootDir, "package.json")];
77
- const normalizedTree = await this.normalizeTree({ tree: parsedTree, seen: new Set(), appName: rootPkgJson.name, parentPath: this.rootDir, parentPkgJson: rootPkgJson });
63
+ const rootPkgJson = (await this.cache.json[path.join(this.rootDir, "package.json")]);
64
+ const normalizedTree = await this.normalizeTree({ tree: parsedTree, seen: new Set(), appName: rootPkgJson.name, parentPath: this.rootDir });
78
65
  const dependencies = {};
79
66
  for (const [name, dep] of Object.entries(normalizedTree)) {
80
67
  dependencies[name] = dep;
@@ -89,18 +76,7 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
89
76
  }
90
77
  async normalizeTree(options) {
91
78
  const { tree, seen, appName, parentPath = this.rootDir } = options;
92
- let parentPkgJson = options.parentPkgJson;
93
79
  const normalized = {};
94
- // Load parent's package.json if not provided
95
- if (!parentPkgJson && parentPath) {
96
- const parentPkgPath = path.join(parentPath, "package.json");
97
- try {
98
- parentPkgJson = await this.cache.packageJson[parentPkgPath];
99
- }
100
- catch {
101
- // Parent might not have package.json (e.g., root workspace)
102
- }
103
- }
104
80
  for (const node of tree) {
105
81
  const match = node.name.match(/^(.*)@([^@]+)$/);
106
82
  if (!match) {
@@ -117,7 +93,7 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
117
93
  continue;
118
94
  }
119
95
  // Find the correct package path that matches the required version
120
- const pkg = await this.locatePackageVersion(parentPath, pkgName, version);
96
+ const pkg = await this.locatePackageWithVersion({ name: pkgName, version, path: parentPath });
121
97
  const pkgPath = pkg === null || pkg === void 0 ? void 0 : pkg.packageDir;
122
98
  if (!pkgPath) {
123
99
  builder_util_1.log.warn({ pkgName, version, parentPath }, "could not find package matching version");
@@ -133,13 +109,11 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
133
109
  };
134
110
  // Recursively process children, passing this package's info
135
111
  if (node.children && node.children.length > 0) {
136
- const childPkgJson = await this.cache.packageJson[path.join(pkgPath, "package.json")];
137
112
  const childDeps = await this.normalizeTree({
138
113
  tree: node.children,
139
114
  seen,
140
115
  appName,
141
116
  parentPath: pkgPath,
142
- parentPkgJson: childPkgJson, // Pass this package's package.json to children
143
117
  });
144
118
  for (const [childDepName, childDep] of Object.entries(childDeps)) {
145
119
  normalizedDep.dependencies[childDepName] = childDep;
@@ -150,9 +124,8 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
150
124
  return normalized;
151
125
  }
152
126
  async collectAllDependencies(tree, packageToExclude) {
153
- const rootPkgJson = await this.cache.packageJson[path.join(this.rootDir, "package.json")];
127
+ const rootPkgJson = (await this.cache.json[path.join(this.rootDir, "package.json")]);
154
128
  const failedPackages = new Set();
155
- builder_util_1.log.debug({ packageToExclude, hasWorkspaces: !!tree.workspaces }, "collectAllDependencies starting");
156
129
  const collect = async (deps = {}, isOptionalDependency, parentIsOptional = false) => {
157
130
  var _a, _b, _c, _d;
158
131
  for (const [, value] of Object.entries(deps)) {
@@ -160,7 +133,6 @@ class YarnNodeModulesCollector extends nodeModulesCollector_1.NodeModulesCollect
160
133
  const isDirectRootDep = ((_b = rootPkgJson.dependencies) === null || _b === void 0 ? void 0 : _b[value.name]) || ((_c = rootPkgJson.optionalDependencies) === null || _c === void 0 ? void 0 : _c[value.name]) || ((_d = rootPkgJson.devDependencies) === null || _d === void 0 ? void 0 : _d[value.name]);
161
134
  const treatAsOptional = isOptionalDependency || parentIsOptional || isRootOptional;
162
135
  const logFields = { name: value.name, version: value.version, path: value.path };
163
- builder_util_1.log.debug(logFields, "collecting dependency");
164
136
  const p = await this.cache.realPath[value.path];
165
137
  if (!(await this.cache.exists[p])) {
166
138
  if (treatAsOptional) {