@strapi/strapi 5.50.2 → 5.51.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 (91) hide show
  1. package/dist/cli/commands/export/action.d.ts +3 -0
  2. package/dist/cli/commands/export/action.d.ts.map +1 -1
  3. package/dist/cli/commands/export/command.d.ts.map +1 -1
  4. package/dist/cli/commands/import/action.d.ts +3 -0
  5. package/dist/cli/commands/import/action.d.ts.map +1 -1
  6. package/dist/cli/commands/import/command.d.ts.map +1 -1
  7. package/dist/cli/commands/transfer/action.d.ts +3 -0
  8. package/dist/cli/commands/transfer/action.d.ts.map +1 -1
  9. package/dist/cli/commands/transfer/command.d.ts.map +1 -1
  10. package/dist/cli/utils/data-transfer.d.ts +56 -4
  11. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  12. package/dist/node/core/admin-vite-alias-modules.d.ts +7 -2
  13. package/dist/node/core/admin-vite-alias-modules.d.ts.map +1 -1
  14. package/dist/node/core/admin-vite-aliases.d.ts +22 -1
  15. package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
  16. package/dist/node/core/admin-vite-optimize-exclude.d.ts.map +1 -1
  17. package/dist/node/core/admin-vite-singleton-modules.d.ts +14 -0
  18. package/dist/node/core/admin-vite-singleton-modules.d.ts.map +1 -0
  19. package/dist/node/core/dependencies.d.ts.map +1 -1
  20. package/dist/node/core/resolve-module.d.ts +14 -2
  21. package/dist/node/core/resolve-module.d.ts.map +1 -1
  22. package/dist/node/create-build-context.d.ts.map +1 -1
  23. package/dist/node/vite/config.d.ts.map +1 -1
  24. package/dist/node/webpack/config.d.ts.map +1 -1
  25. package/dist/package.json.js +1 -1
  26. package/dist/package.json.mjs +1 -1
  27. package/dist/src/cli/commands/export/action.js +7 -17
  28. package/dist/src/cli/commands/export/action.js.map +1 -1
  29. package/dist/src/cli/commands/export/action.mjs +8 -18
  30. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  31. package/dist/src/cli/commands/export/command.js +1 -1
  32. package/dist/src/cli/commands/export/command.js.map +1 -1
  33. package/dist/src/cli/commands/export/command.mjs +2 -2
  34. package/dist/src/cli/commands/export/command.mjs.map +1 -1
  35. package/dist/src/cli/commands/import/action.js +8 -16
  36. package/dist/src/cli/commands/import/action.js.map +1 -1
  37. package/dist/src/cli/commands/import/action.mjs +9 -17
  38. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  39. package/dist/src/cli/commands/import/command.js +1 -1
  40. package/dist/src/cli/commands/import/command.js.map +1 -1
  41. package/dist/src/cli/commands/import/command.mjs +2 -2
  42. package/dist/src/cli/commands/import/command.mjs.map +1 -1
  43. package/dist/src/cli/commands/transfer/action.js +7 -17
  44. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  45. package/dist/src/cli/commands/transfer/action.mjs +8 -18
  46. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  47. package/dist/src/cli/commands/transfer/command.js +1 -1
  48. package/dist/src/cli/commands/transfer/command.js.map +1 -1
  49. package/dist/src/cli/commands/transfer/command.mjs +2 -2
  50. package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
  51. package/dist/src/cli/utils/data-transfer.js +148 -10
  52. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  53. package/dist/src/cli/utils/data-transfer.mjs +138 -12
  54. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  55. package/dist/src/node/core/admin-vite-alias-modules.js +10 -1
  56. package/dist/src/node/core/admin-vite-alias-modules.js.map +1 -1
  57. package/dist/src/node/core/admin-vite-alias-modules.mjs +10 -2
  58. package/dist/src/node/core/admin-vite-alias-modules.mjs.map +1 -1
  59. package/dist/src/node/core/admin-vite-aliases.js +44 -5
  60. package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
  61. package/dist/src/node/core/admin-vite-aliases.mjs +44 -7
  62. package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
  63. package/dist/src/node/core/admin-vite-optimize-exclude.js +4 -0
  64. package/dist/src/node/core/admin-vite-optimize-exclude.js.map +1 -1
  65. package/dist/src/node/core/admin-vite-optimize-exclude.mjs +4 -0
  66. package/dist/src/node/core/admin-vite-optimize-exclude.mjs.map +1 -1
  67. package/dist/src/node/core/admin-vite-singleton-modules.js +24 -0
  68. package/dist/src/node/core/admin-vite-singleton-modules.js.map +1 -0
  69. package/dist/src/node/core/admin-vite-singleton-modules.mjs +22 -0
  70. package/dist/src/node/core/admin-vite-singleton-modules.mjs.map +1 -0
  71. package/dist/src/node/core/dependencies.js +3 -2
  72. package/dist/src/node/core/dependencies.js.map +1 -1
  73. package/dist/src/node/core/dependencies.mjs +3 -2
  74. package/dist/src/node/core/dependencies.mjs.map +1 -1
  75. package/dist/src/node/core/resolve-module.js +25 -12
  76. package/dist/src/node/core/resolve-module.js.map +1 -1
  77. package/dist/src/node/core/resolve-module.mjs +25 -13
  78. package/dist/src/node/core/resolve-module.mjs.map +1 -1
  79. package/dist/src/node/create-build-context.js +5 -2
  80. package/dist/src/node/create-build-context.js.map +1 -1
  81. package/dist/src/node/create-build-context.mjs +5 -2
  82. package/dist/src/node/create-build-context.mjs.map +1 -1
  83. package/dist/src/node/vite/config.js +13 -1
  84. package/dist/src/node/vite/config.js.map +1 -1
  85. package/dist/src/node/vite/config.mjs +14 -2
  86. package/dist/src/node/vite/config.mjs.map +1 -1
  87. package/dist/src/node/webpack/config.js +5 -0
  88. package/dist/src/node/webpack/config.js.map +1 -1
  89. package/dist/src/node/webpack/config.mjs +5 -0
  90. package/dist/src/node/webpack/config.mjs.map +1 -1
  91. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"admin-vite-optimize-exclude.mjs","sources":["../../../../src/node/core/admin-vite-optimize-exclude.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport readPkgUp from 'read-pkg-up';\n\nimport { ADMIN_VITE_ALIAS_MODULES } from './admin-vite-alias-modules';\nimport { getModule, type PackageJson } from './dependencies';\nimport type { PluginMeta } from './plugins';\n\nconst REACT_PEER_DEPENDENCIES = new Set(['react', 'react-dom']);\n\n/**\n * Packages explicitly pre-bundled or aliased for the admin singleton contract.\n * Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.\n *\n * The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).\n * CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include\n * (see vite/config.ts — #26964, #26944, #27014).\n */\nconst PINNED_OPTIMIZE_MODULES = new Set<string>([...ADMIN_VITE_ALIAS_MODULES, '@strapi/strapi']);\n\nconst isOfficialStrapiPackage = (name: string): boolean => name.startsWith('@strapi/');\n\ntype PackageExportEntry =\n | string\n | {\n import?: string;\n require?: string;\n default?: string;\n };\n\nconst getRootPackageExport = (pkg: PackageJson): PackageExportEntry | undefined => {\n const exportsField = pkg.exports as Record<string, PackageExportEntry> | string | undefined;\n\n if (!exportsField || typeof exportsField === 'string') {\n return undefined;\n }\n\n return exportsField['.'];\n};\n\n/**\n * @internal exported for tests\n */\nexport const isEsmPackage = (pkg: PackageJson): boolean => {\n if (pkg.type === 'module') {\n return true;\n }\n\n const rootExport = getRootPackageExport(pkg);\n\n return (\n typeof rootExport === 'object' &&\n rootExport !== null &&\n 'import' in rootExport &&\n typeof rootExport.import === 'string'\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const hasReactPeerDependency = (pkg: PackageJson): boolean =>\n Object.keys(pkg.peerDependencies ?? {}).some((name) => REACT_PEER_DEPENDENCIES.has(name));\n\n/**\n * Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than\n * source packages like react-intl that still benefit from Vite's dep optimizer.\n *\n * @internal exported for tests\n */\nexport const shipsPreBuiltDist = (pkg: PackageJson): boolean => {\n const rootExport = getRootPackageExport(pkg);\n const exportImport =\n typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport\n ? rootExport.import\n : undefined;\n\n const entryPaths = [pkg.module, pkg.main, exportImport].filter(\n (entry): entry is string => typeof entry === 'string'\n );\n\n if (\n entryPaths.some(\n (entry) =>\n entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/')\n )\n ) {\n return true;\n }\n\n return (\n Array.isArray(pkg.files) &&\n pkg.files.some((file) => file === 'dist' || file.startsWith('dist/'))\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const shouldExcludeFromOptimizeDeps = (pkg: PackageJson): boolean =>\n hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);\n\n/**\n * @internal exported for tests\n */\nexport const getPluginPackageName = (modulePath: string): string => {\n if (modulePath.startsWith('@')) {\n const [scope, name] = modulePath.split('/');\n\n return `${scope}/${name}`;\n }\n\n return modulePath.split('/')[0] ?? modulePath;\n};\n\nconst collectDependencyNames = (pkg: PackageJson): string[] => {\n const names = new Set<string>();\n\n for (const section of [pkg.dependencies, pkg.devDependencies] as const) {\n if (section) {\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n }\n\n return [...names];\n};\n\nconst getPluginPackageJson = async (\n plugin: PluginMeta,\n cwd: string\n): Promise<PackageJson | null> => {\n if (plugin.type === 'local' && plugin.path) {\n try {\n const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');\n\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n }\n\n return getModule(getPluginPackageName(plugin.modulePath), cwd);\n};\n\nconst loadAppPackageJson = async (cwd: string): Promise<PackageJson | null> => {\n const result = await readPkgUp({ cwd });\n\n return result?.packageJson ?? null;\n};\n\n/**\n * Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with\n * Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through\n * the admin resolve aliases instead of being re-bundled by Vite.\n *\n * Scans app and plugin dependency trees (#26944). Official @strapi/* packages and pinned\n * singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on\n * the optimizeDeps.include path (#26944, #27014).\n *\n * @internal\n */\nexport const collectAdminOptimizeDepsExclude = async (\n cwd: string,\n plugins: PluginMeta[]\n): Promise<string[]> => {\n const candidateNames = new Set<string>();\n const appPkg = await loadAppPackageJson(cwd);\n\n if (appPkg) {\n for (const name of collectDependencyNames(appPkg)) {\n candidateNames.add(name);\n }\n }\n\n for (const plugin of plugins) {\n const pluginPkg = await getPluginPackageJson(plugin, cwd);\n\n if (pluginPkg) {\n for (const name of collectDependencyNames(pluginPkg)) {\n candidateNames.add(name);\n }\n }\n }\n\n const exclude: string[] = [];\n\n for (const name of candidateNames) {\n if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {\n continue;\n }\n\n const pkg = await getModule(name, cwd);\n\n if (pkg && shouldExcludeFromOptimizeDeps(pkg)) {\n exclude.push(name);\n }\n }\n\n return exclude.sort();\n};\n"],"names":["REACT_PEER_DEPENDENCIES","Set","PINNED_OPTIMIZE_MODULES","ADMIN_VITE_ALIAS_MODULES","isOfficialStrapiPackage","name","startsWith","getRootPackageExport","pkg","exportsField","exports","undefined","isEsmPackage","type","rootExport","import","hasReactPeerDependency","Object","keys","peerDependencies","some","has","shipsPreBuiltDist","exportImport","entryPaths","module","main","filter","entry","includes","Array","isArray","files","file","shouldExcludeFromOptimizeDeps","getPluginPackageName","modulePath","scope","split","collectDependencyNames","names","section","dependencies","devDependencies","add","getPluginPackageJson","plugin","cwd","path","content","fs","readFile","join","JSON","parse","getModule","loadAppPackageJson","result","readPkgUp","packageJson","collectAdminOptimizeDepsExclude","plugins","candidateNames","appPkg","pluginPkg","exclude","push","sort"],"mappings":";;;;;;AAQA,MAAMA,uBAAAA,GAA0B,IAAIC,GAAAA,CAAI;AAAC,IAAA,OAAA;AAAS,IAAA;AAAY,CAAA,CAAA;AAE9D;;;;;;;IAQA,MAAMC,uBAAAA,GAA0B,IAAID,GAAAA,CAAY;AAAIE,IAAAA,GAAAA,wBAAAA;AAA0B,IAAA;AAAiB,CAAA,CAAA;AAE/F,MAAMC,uBAAAA,GAA0B,CAACC,IAAAA,GAA0BA,IAAAA,CAAKC,UAAU,CAAC,UAAA,CAAA;AAU3E,MAAMC,uBAAuB,CAACC,GAAAA,GAAAA;IAC5B,MAAMC,YAAAA,GAAeD,IAAIE,OAAO;AAEhC,IAAA,IAAI,CAACD,YAAAA,IAAgB,OAAOA,YAAAA,KAAiB,QAAA,EAAU;QACrD,OAAOE,SAAAA;AACT,IAAA;IAEA,OAAOF,YAAY,CAAC,GAAA,CAAI;AAC1B,CAAA;AAEA;;IAGO,MAAMG,YAAAA,GAAe,CAACJ,GAAAA,GAAAA;IAC3B,IAAIA,GAAAA,CAAIK,IAAI,KAAK,QAAA,EAAU;QACzB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,aAAaP,oBAAAA,CAAqBC,GAAAA,CAAAA;IAExC,OACE,OAAOM,UAAAA,KAAe,QAAA,IACtBA,UAAAA,KAAe,IAAA,IACf,YAAYA,UAAAA,IACZ,OAAOA,UAAAA,CAAWC,MAAM,KAAK,QAAA;AAEjC;AAEA;;UAGaC,sBAAAA,GAAyB,CAACR,MACrCS,MAAAA,CAAOC,IAAI,CAACV,GAAAA,CAAIW,gBAAgB,IAAI,EAAC,CAAA,CAAGC,IAAI,CAAC,CAACf,OAASL,uBAAAA,CAAwBqB,GAAG,CAAChB,IAAAA,CAAAA;AAErF;;;;;IAMO,MAAMiB,iBAAAA,GAAoB,CAACd,GAAAA,GAAAA;AAChC,IAAA,MAAMM,aAAaP,oBAAAA,CAAqBC,GAAAA,CAAAA;IACxC,MAAMe,YAAAA,GACJ,OAAOT,UAAAA,KAAe,QAAA,IAAYA,UAAAA,KAAe,QAAQ,QAAA,IAAYA,UAAAA,GACjEA,UAAAA,CAAWC,MAAM,GACjBJ,SAAAA;AAEN,IAAA,MAAMa,UAAAA,GAAa;AAAChB,QAAAA,GAAAA,CAAIiB,MAAM;AAAEjB,QAAAA,GAAAA,CAAIkB,IAAI;AAAEH,QAAAA;AAAa,KAAA,CAACI,MAAM,CAC5D,CAACC,KAAAA,GAA2B,OAAOA,KAAAA,KAAU,QAAA,CAAA;AAG/C,IAAA,IACEJ,WAAWJ,IAAI,CACb,CAACQ,KAAAA,GACCA,MAAMC,QAAQ,CAAC,QAAA,CAAA,IAAaD,KAAAA,CAAMtB,UAAU,CAAC,SAAA,CAAA,IAAcsB,KAAAA,CAAMtB,UAAU,CAAC,OAAA,CAAA,CAAA,EAEhF;QACA,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,OACEwB,MAAMC,OAAO,CAACvB,GAAAA,CAAIwB,KAAK,KACvBxB,GAAAA,CAAIwB,KAAK,CAACZ,IAAI,CAAC,CAACa,IAAAA,GAASA,SAAS,MAAA,IAAUA,IAAAA,CAAK3B,UAAU,CAAC,OAAA,CAAA,CAAA;AAEhE;AAEA;;IAGO,MAAM4B,6BAAAA,GAAgC,CAAC1B,GAAAA,GAC5CQ,uBAAuBR,GAAAA,CAAAA,IAAQI,YAAAA,CAAaJ,GAAAA,CAAAA,IAAQc,iBAAAA,CAAkBd,GAAAA;AAExE;;IAGO,MAAM2B,oBAAAA,GAAuB,CAACC,UAAAA,GAAAA;IACnC,IAAIA,UAAAA,CAAW9B,UAAU,CAAC,GAAA,CAAA,EAAM;AAC9B,QAAA,MAAM,CAAC+B,KAAAA,EAAOhC,IAAAA,CAAK,GAAG+B,UAAAA,CAAWE,KAAK,CAAC,GAAA,CAAA;AAEvC,QAAA,OAAO,CAAA,EAAGD,KAAAA,CAAM,CAAC,EAAEhC,IAAAA,CAAAA,CAAM;AAC3B,IAAA;AAEA,IAAA,OAAO+B,WAAWE,KAAK,CAAC,GAAA,CAAI,CAAC,EAAE,IAAIF,UAAAA;AACrC;AAEA,MAAMG,yBAAyB,CAAC/B,GAAAA,GAAAA;AAC9B,IAAA,MAAMgC,QAAQ,IAAIvC,GAAAA,EAAAA;AAElB,IAAA,KAAK,MAAMwC,OAAAA,IAAW;AAACjC,QAAAA,GAAAA,CAAIkC,YAAY;AAAElC,QAAAA,GAAAA,CAAImC;KAAgB,CAAW;AACtE,QAAA,IAAIF,OAAAA,EAAS;AACX,YAAA,KAAK,MAAMpC,IAAAA,IAAQY,MAAAA,CAAOC,IAAI,CAACuB,OAAAA,CAAAA,CAAU;AACvCD,gBAAAA,KAAAA,CAAMI,GAAG,CAACvC,IAAAA,CAAAA;AACZ,YAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAO;AAAImC,QAAAA,GAAAA;AAAM,KAAA;AACnB,CAAA;AAEA,MAAMK,oBAAAA,GAAuB,OAC3BC,MAAAA,EACAC,GAAAA,GAAAA;AAEA,IAAA,IAAID,OAAOjC,IAAI,KAAK,OAAA,IAAWiC,MAAAA,CAAOE,IAAI,EAAE;QAC1C,IAAI;YACF,MAAMC,OAAAA,GAAU,MAAMC,EAAAA,CAAGC,QAAQ,CAACH,IAAAA,CAAKI,IAAI,CAACN,MAAAA,CAAOE,IAAI,EAAE,cAAA,CAAA,EAAiB,MAAA,CAAA;YAE1E,OAAOK,IAAAA,CAAKC,KAAK,CAACL,OAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAM;YACN,OAAO,IAAA;AACT,QAAA;AACF,IAAA;AAEA,IAAA,OAAOM,SAAAA,CAAUpB,oBAAAA,CAAqBW,MAAAA,CAAOV,UAAU,CAAA,EAAGW,GAAAA,CAAAA;AAC5D,CAAA;AAEA,MAAMS,qBAAqB,OAAOT,GAAAA,GAAAA;IAChC,MAAMU,MAAAA,GAAS,MAAMC,SAAAA,CAAU;AAAEX,QAAAA;AAAI,KAAA,CAAA;AAErC,IAAA,OAAOU,QAAQE,WAAAA,IAAe,IAAA;AAChC,CAAA;AAEA;;;;;;;;;;AAUC,IACM,MAAMC,+BAAAA,GAAkC,OAC7Cb,GAAAA,EACAc,OAAAA,GAAAA;AAEA,IAAA,MAAMC,iBAAiB,IAAI7D,GAAAA,EAAAA;IAC3B,MAAM8D,MAAAA,GAAS,MAAMP,kBAAAA,CAAmBT,GAAAA,CAAAA;AAExC,IAAA,IAAIgB,MAAAA,EAAQ;QACV,KAAK,MAAM1D,IAAAA,IAAQkC,sBAAAA,CAAuBwB,MAAAA,CAAAA,CAAS;AACjDD,YAAAA,cAAAA,CAAelB,GAAG,CAACvC,IAAAA,CAAAA;AACrB,QAAA;AACF,IAAA;IAEA,KAAK,MAAMyC,UAAUe,OAAAA,CAAS;QAC5B,MAAMG,SAAAA,GAAY,MAAMnB,oBAAAA,CAAqBC,MAAAA,EAAQC,GAAAA,CAAAA;AAErD,QAAA,IAAIiB,SAAAA,EAAW;YACb,KAAK,MAAM3D,IAAAA,IAAQkC,sBAAAA,CAAuByB,SAAAA,CAAAA,CAAY;AACpDF,gBAAAA,cAAAA,CAAelB,GAAG,CAACvC,IAAAA,CAAAA;AACrB,YAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,MAAM4D,UAAoB,EAAE;IAE5B,KAAK,MAAM5D,QAAQyD,cAAAA,CAAgB;AACjC,QAAA,IAAI5D,uBAAAA,CAAwBmB,GAAG,CAAChB,IAAAA,CAAAA,IAASD,wBAAwBC,IAAAA,CAAAA,EAAO;AACtE,YAAA;AACF,QAAA;QAEA,MAAMG,GAAAA,GAAM,MAAM+C,SAAAA,CAAUlD,IAAAA,EAAM0C,GAAAA,CAAAA;QAElC,IAAIvC,GAAAA,IAAO0B,8BAA8B1B,GAAAA,CAAAA,EAAM;AAC7CyD,YAAAA,OAAAA,CAAQC,IAAI,CAAC7D,IAAAA,CAAAA;AACf,QAAA;AACF,IAAA;AAEA,IAAA,OAAO4D,QAAQE,IAAI,EAAA;AACrB;;;;"}
1
+ {"version":3,"file":"admin-vite-optimize-exclude.mjs","sources":["../../../../src/node/core/admin-vite-optimize-exclude.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport readPkgUp from 'read-pkg-up';\n\nimport { ADMIN_VITE_ALIAS_MODULES, ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-alias-modules';\nimport { getModule, type PackageJson } from './dependencies';\nimport type { PluginMeta } from './plugins';\n\nconst REACT_PEER_DEPENDENCIES = new Set(['react', 'react-dom']);\n\n/**\n * Packages explicitly pre-bundled or aliased for the admin singleton contract.\n * Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.\n *\n * The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).\n * CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include\n * (see vite/config.ts — #26964, #26944, #27014).\n * The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the\n * exclude heuristic but must stay pre-bundled so the admin keeps a single instance\n */\nconst PINNED_OPTIMIZE_MODULES = new Set<string>([\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n '@strapi/strapi',\n]);\n\nconst isOfficialStrapiPackage = (name: string): boolean => name.startsWith('@strapi/');\n\ntype PackageExportEntry =\n | string\n | {\n import?: string;\n require?: string;\n default?: string;\n };\n\nconst getRootPackageExport = (pkg: PackageJson): PackageExportEntry | undefined => {\n const exportsField = pkg.exports as Record<string, PackageExportEntry> | string | undefined;\n\n if (!exportsField || typeof exportsField === 'string') {\n return undefined;\n }\n\n return exportsField['.'];\n};\n\n/**\n * @internal exported for tests\n */\nexport const isEsmPackage = (pkg: PackageJson): boolean => {\n if (pkg.type === 'module') {\n return true;\n }\n\n const rootExport = getRootPackageExport(pkg);\n\n return (\n typeof rootExport === 'object' &&\n rootExport !== null &&\n 'import' in rootExport &&\n typeof rootExport.import === 'string'\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const hasReactPeerDependency = (pkg: PackageJson): boolean =>\n Object.keys(pkg.peerDependencies ?? {}).some((name) => REACT_PEER_DEPENDENCIES.has(name));\n\n/**\n * Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than\n * source packages like react-intl that still benefit from Vite's dep optimizer.\n *\n * @internal exported for tests\n */\nexport const shipsPreBuiltDist = (pkg: PackageJson): boolean => {\n const rootExport = getRootPackageExport(pkg);\n const exportImport =\n typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport\n ? rootExport.import\n : undefined;\n\n const entryPaths = [pkg.module, pkg.main, exportImport].filter(\n (entry): entry is string => typeof entry === 'string'\n );\n\n if (\n entryPaths.some(\n (entry) =>\n entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/')\n )\n ) {\n return true;\n }\n\n return (\n Array.isArray(pkg.files) &&\n pkg.files.some((file) => file === 'dist' || file.startsWith('dist/'))\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const shouldExcludeFromOptimizeDeps = (pkg: PackageJson): boolean =>\n hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);\n\n/**\n * @internal exported for tests\n */\nexport const getPluginPackageName = (modulePath: string): string => {\n if (modulePath.startsWith('@')) {\n const [scope, name] = modulePath.split('/');\n\n return `${scope}/${name}`;\n }\n\n return modulePath.split('/')[0] ?? modulePath;\n};\n\nconst collectDependencyNames = (pkg: PackageJson): string[] => {\n const names = new Set<string>();\n\n for (const section of [pkg.dependencies, pkg.devDependencies] as const) {\n if (section) {\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n }\n\n return [...names];\n};\n\nconst getPluginPackageJson = async (\n plugin: PluginMeta,\n cwd: string\n): Promise<PackageJson | null> => {\n if (plugin.type === 'local' && plugin.path) {\n try {\n const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');\n\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n }\n\n return getModule(getPluginPackageName(plugin.modulePath), cwd);\n};\n\nconst loadAppPackageJson = async (cwd: string): Promise<PackageJson | null> => {\n const result = await readPkgUp({ cwd });\n\n return result?.packageJson ?? null;\n};\n\n/**\n * Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with\n * Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through\n * the admin resolve aliases instead of being re-bundled by Vite.\n *\n * Scans app and plugin dependency trees (#26944). Official @strapi/* packages and pinned\n * singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on\n * the optimizeDeps.include path (#26944, #27014).\n *\n * @internal\n */\nexport const collectAdminOptimizeDepsExclude = async (\n cwd: string,\n plugins: PluginMeta[]\n): Promise<string[]> => {\n const candidateNames = new Set<string>();\n const appPkg = await loadAppPackageJson(cwd);\n\n if (appPkg) {\n for (const name of collectDependencyNames(appPkg)) {\n candidateNames.add(name);\n }\n }\n\n for (const plugin of plugins) {\n const pluginPkg = await getPluginPackageJson(plugin, cwd);\n\n if (pluginPkg) {\n for (const name of collectDependencyNames(pluginPkg)) {\n candidateNames.add(name);\n }\n }\n }\n\n const exclude: string[] = [];\n\n for (const name of candidateNames) {\n if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {\n continue;\n }\n\n const pkg = await getModule(name, cwd);\n\n if (pkg && shouldExcludeFromOptimizeDeps(pkg)) {\n exclude.push(name);\n }\n }\n\n return exclude.sort();\n};\n"],"names":["REACT_PEER_DEPENDENCIES","Set","PINNED_OPTIMIZE_MODULES","ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_SINGLETON_MODULES","isOfficialStrapiPackage","name","startsWith","getRootPackageExport","pkg","exportsField","exports","undefined","isEsmPackage","type","rootExport","import","hasReactPeerDependency","Object","keys","peerDependencies","some","has","shipsPreBuiltDist","exportImport","entryPaths","module","main","filter","entry","includes","Array","isArray","files","file","shouldExcludeFromOptimizeDeps","getPluginPackageName","modulePath","scope","split","collectDependencyNames","names","section","dependencies","devDependencies","add","getPluginPackageJson","plugin","cwd","path","content","fs","readFile","join","JSON","parse","getModule","loadAppPackageJson","result","readPkgUp","packageJson","collectAdminOptimizeDepsExclude","plugins","candidateNames","appPkg","pluginPkg","exclude","push","sort"],"mappings":";;;;;;;AAQA,MAAMA,uBAAAA,GAA0B,IAAIC,GAAAA,CAAI;AAAC,IAAA,OAAA;AAAS,IAAA;AAAY,CAAA,CAAA;AAE9D;;;;;;;;;IAUA,MAAMC,uBAAAA,GAA0B,IAAID,GAAAA,CAAY;AAC3CE,IAAAA,GAAAA,wBAAAA;AACAC,IAAAA,GAAAA,4BAAAA;AACH,IAAA;AACD,CAAA,CAAA;AAED,MAAMC,uBAAAA,GAA0B,CAACC,IAAAA,GAA0BA,IAAAA,CAAKC,UAAU,CAAC,UAAA,CAAA;AAU3E,MAAMC,uBAAuB,CAACC,GAAAA,GAAAA;IAC5B,MAAMC,YAAAA,GAAeD,IAAIE,OAAO;AAEhC,IAAA,IAAI,CAACD,YAAAA,IAAgB,OAAOA,YAAAA,KAAiB,QAAA,EAAU;QACrD,OAAOE,SAAAA;AACT,IAAA;IAEA,OAAOF,YAAY,CAAC,GAAA,CAAI;AAC1B,CAAA;AAEA;;IAGO,MAAMG,YAAAA,GAAe,CAACJ,GAAAA,GAAAA;IAC3B,IAAIA,GAAAA,CAAIK,IAAI,KAAK,QAAA,EAAU;QACzB,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,aAAaP,oBAAAA,CAAqBC,GAAAA,CAAAA;IAExC,OACE,OAAOM,UAAAA,KAAe,QAAA,IACtBA,UAAAA,KAAe,IAAA,IACf,YAAYA,UAAAA,IACZ,OAAOA,UAAAA,CAAWC,MAAM,KAAK,QAAA;AAEjC;AAEA;;UAGaC,sBAAAA,GAAyB,CAACR,MACrCS,MAAAA,CAAOC,IAAI,CAACV,GAAAA,CAAIW,gBAAgB,IAAI,EAAC,CAAA,CAAGC,IAAI,CAAC,CAACf,OAASN,uBAAAA,CAAwBsB,GAAG,CAAChB,IAAAA,CAAAA;AAErF;;;;;IAMO,MAAMiB,iBAAAA,GAAoB,CAACd,GAAAA,GAAAA;AAChC,IAAA,MAAMM,aAAaP,oBAAAA,CAAqBC,GAAAA,CAAAA;IACxC,MAAMe,YAAAA,GACJ,OAAOT,UAAAA,KAAe,QAAA,IAAYA,UAAAA,KAAe,QAAQ,QAAA,IAAYA,UAAAA,GACjEA,UAAAA,CAAWC,MAAM,GACjBJ,SAAAA;AAEN,IAAA,MAAMa,UAAAA,GAAa;AAAChB,QAAAA,GAAAA,CAAIiB,MAAM;AAAEjB,QAAAA,GAAAA,CAAIkB,IAAI;AAAEH,QAAAA;AAAa,KAAA,CAACI,MAAM,CAC5D,CAACC,KAAAA,GAA2B,OAAOA,KAAAA,KAAU,QAAA,CAAA;AAG/C,IAAA,IACEJ,WAAWJ,IAAI,CACb,CAACQ,KAAAA,GACCA,MAAMC,QAAQ,CAAC,QAAA,CAAA,IAAaD,KAAAA,CAAMtB,UAAU,CAAC,SAAA,CAAA,IAAcsB,KAAAA,CAAMtB,UAAU,CAAC,OAAA,CAAA,CAAA,EAEhF;QACA,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,OACEwB,MAAMC,OAAO,CAACvB,GAAAA,CAAIwB,KAAK,KACvBxB,GAAAA,CAAIwB,KAAK,CAACZ,IAAI,CAAC,CAACa,IAAAA,GAASA,SAAS,MAAA,IAAUA,IAAAA,CAAK3B,UAAU,CAAC,OAAA,CAAA,CAAA;AAEhE;AAEA;;IAGO,MAAM4B,6BAAAA,GAAgC,CAAC1B,GAAAA,GAC5CQ,uBAAuBR,GAAAA,CAAAA,IAAQI,YAAAA,CAAaJ,GAAAA,CAAAA,IAAQc,iBAAAA,CAAkBd,GAAAA;AAExE;;IAGO,MAAM2B,oBAAAA,GAAuB,CAACC,UAAAA,GAAAA;IACnC,IAAIA,UAAAA,CAAW9B,UAAU,CAAC,GAAA,CAAA,EAAM;AAC9B,QAAA,MAAM,CAAC+B,KAAAA,EAAOhC,IAAAA,CAAK,GAAG+B,UAAAA,CAAWE,KAAK,CAAC,GAAA,CAAA;AAEvC,QAAA,OAAO,CAAA,EAAGD,KAAAA,CAAM,CAAC,EAAEhC,IAAAA,CAAAA,CAAM;AAC3B,IAAA;AAEA,IAAA,OAAO+B,WAAWE,KAAK,CAAC,GAAA,CAAI,CAAC,EAAE,IAAIF,UAAAA;AACrC;AAEA,MAAMG,yBAAyB,CAAC/B,GAAAA,GAAAA;AAC9B,IAAA,MAAMgC,QAAQ,IAAIxC,GAAAA,EAAAA;AAElB,IAAA,KAAK,MAAMyC,OAAAA,IAAW;AAACjC,QAAAA,GAAAA,CAAIkC,YAAY;AAAElC,QAAAA,GAAAA,CAAImC;KAAgB,CAAW;AACtE,QAAA,IAAIF,OAAAA,EAAS;AACX,YAAA,KAAK,MAAMpC,IAAAA,IAAQY,MAAAA,CAAOC,IAAI,CAACuB,OAAAA,CAAAA,CAAU;AACvCD,gBAAAA,KAAAA,CAAMI,GAAG,CAACvC,IAAAA,CAAAA;AACZ,YAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAO;AAAImC,QAAAA,GAAAA;AAAM,KAAA;AACnB,CAAA;AAEA,MAAMK,oBAAAA,GAAuB,OAC3BC,MAAAA,EACAC,GAAAA,GAAAA;AAEA,IAAA,IAAID,OAAOjC,IAAI,KAAK,OAAA,IAAWiC,MAAAA,CAAOE,IAAI,EAAE;QAC1C,IAAI;YACF,MAAMC,OAAAA,GAAU,MAAMC,EAAAA,CAAGC,QAAQ,CAACH,IAAAA,CAAKI,IAAI,CAACN,MAAAA,CAAOE,IAAI,EAAE,cAAA,CAAA,EAAiB,MAAA,CAAA;YAE1E,OAAOK,IAAAA,CAAKC,KAAK,CAACL,OAAAA,CAAAA;AACpB,QAAA,CAAA,CAAE,OAAM;YACN,OAAO,IAAA;AACT,QAAA;AACF,IAAA;AAEA,IAAA,OAAOM,SAAAA,CAAUpB,oBAAAA,CAAqBW,MAAAA,CAAOV,UAAU,CAAA,EAAGW,GAAAA,CAAAA;AAC5D,CAAA;AAEA,MAAMS,qBAAqB,OAAOT,GAAAA,GAAAA;IAChC,MAAMU,MAAAA,GAAS,MAAMC,SAAAA,CAAU;AAAEX,QAAAA;AAAI,KAAA,CAAA;AAErC,IAAA,OAAOU,QAAQE,WAAAA,IAAe,IAAA;AAChC,CAAA;AAEA;;;;;;;;;;AAUC,IACM,MAAMC,+BAAAA,GAAkC,OAC7Cb,GAAAA,EACAc,OAAAA,GAAAA;AAEA,IAAA,MAAMC,iBAAiB,IAAI9D,GAAAA,EAAAA;IAC3B,MAAM+D,MAAAA,GAAS,MAAMP,kBAAAA,CAAmBT,GAAAA,CAAAA;AAExC,IAAA,IAAIgB,MAAAA,EAAQ;QACV,KAAK,MAAM1D,IAAAA,IAAQkC,sBAAAA,CAAuBwB,MAAAA,CAAAA,CAAS;AACjDD,YAAAA,cAAAA,CAAelB,GAAG,CAACvC,IAAAA,CAAAA;AACrB,QAAA;AACF,IAAA;IAEA,KAAK,MAAMyC,UAAUe,OAAAA,CAAS;QAC5B,MAAMG,SAAAA,GAAY,MAAMnB,oBAAAA,CAAqBC,MAAAA,EAAQC,GAAAA,CAAAA;AAErD,QAAA,IAAIiB,SAAAA,EAAW;YACb,KAAK,MAAM3D,IAAAA,IAAQkC,sBAAAA,CAAuByB,SAAAA,CAAAA,CAAY;AACpDF,gBAAAA,cAAAA,CAAelB,GAAG,CAACvC,IAAAA,CAAAA;AACrB,YAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,MAAM4D,UAAoB,EAAE;IAE5B,KAAK,MAAM5D,QAAQyD,cAAAA,CAAgB;AACjC,QAAA,IAAI7D,uBAAAA,CAAwBoB,GAAG,CAAChB,IAAAA,CAAAA,IAASD,wBAAwBC,IAAAA,CAAAA,EAAO;AACtE,YAAA;AACF,QAAA;QAEA,MAAMG,GAAAA,GAAM,MAAM+C,SAAAA,CAAUlD,IAAAA,EAAM0C,GAAAA,CAAAA;QAElC,IAAIvC,GAAAA,IAAO0B,8BAA8B1B,GAAAA,CAAAA,EAAM;AAC7CyD,YAAAA,OAAAA,CAAQC,IAAI,CAAC7D,IAAAA,CAAAA;AACf,QAAA;AACF,IAAA;AAEA,IAAA,OAAO4D,QAAQE,IAAI,EAAA;AACrB;;;;"}
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Modules that must resolve to a single runtime instance in the admin bundle.
5
+ *
6
+ * CodeMirror extensions rely on `instanceof` checks internally, so the JSON custom
7
+ * field (JSONInput) crashes if @codemirror/state (or its siblings) is duplicated
8
+ * between @strapi/design-system, @codemirror/lang-json and @uiw/react-codemirror
9
+ * They are resolved from @strapi/design-system's closure — the real
10
+ * consumer that also externalizes them — and forced onto a single copy.
11
+ *
12
+ * @internal
13
+ */ const ADMIN_VITE_SINGLETON_MODULES = [
14
+ '@codemirror/state',
15
+ '@codemirror/view',
16
+ '@codemirror/language',
17
+ '@codemirror/lang-json',
18
+ '@codemirror/commands',
19
+ '@codemirror/lint',
20
+ '@uiw/react-codemirror'
21
+ ];
22
+
23
+ exports.ADMIN_VITE_SINGLETON_MODULES = ADMIN_VITE_SINGLETON_MODULES;
24
+ //# sourceMappingURL=admin-vite-singleton-modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-vite-singleton-modules.js","sources":["../../../../src/node/core/admin-vite-singleton-modules.ts"],"sourcesContent":["/**\n * Modules that must resolve to a single runtime instance in the admin bundle.\n *\n * CodeMirror extensions rely on `instanceof` checks internally, so the JSON custom\n * field (JSONInput) crashes if @codemirror/state (or its siblings) is duplicated\n * between @strapi/design-system, @codemirror/lang-json and @uiw/react-codemirror\n * They are resolved from @strapi/design-system's closure — the real\n * consumer that also externalizes them — and forced onto a single copy.\n *\n * @internal\n */\nexport const ADMIN_VITE_SINGLETON_MODULES = [\n '@codemirror/state',\n '@codemirror/view',\n '@codemirror/language',\n '@codemirror/lang-json',\n '@codemirror/commands',\n '@codemirror/lint',\n '@uiw/react-codemirror',\n] as const;\n\nexport type AdminViteSingletonModule = (typeof ADMIN_VITE_SINGLETON_MODULES)[number];\n"],"names":["ADMIN_VITE_SINGLETON_MODULES"],"mappings":";;AAAA;;;;;;;;;;UAWaA,4BAAAA,GAA+B;AAC1C,IAAA,mBAAA;AACA,IAAA,kBAAA;AACA,IAAA,sBAAA;AACA,IAAA,uBAAA;AACA,IAAA,sBAAA;AACA,IAAA,kBAAA;AACA,IAAA;;;;;"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Modules that must resolve to a single runtime instance in the admin bundle.
3
+ *
4
+ * CodeMirror extensions rely on `instanceof` checks internally, so the JSON custom
5
+ * field (JSONInput) crashes if @codemirror/state (or its siblings) is duplicated
6
+ * between @strapi/design-system, @codemirror/lang-json and @uiw/react-codemirror
7
+ * They are resolved from @strapi/design-system's closure — the real
8
+ * consumer that also externalizes them — and forced onto a single copy.
9
+ *
10
+ * @internal
11
+ */ const ADMIN_VITE_SINGLETON_MODULES = [
12
+ '@codemirror/state',
13
+ '@codemirror/view',
14
+ '@codemirror/language',
15
+ '@codemirror/lang-json',
16
+ '@codemirror/commands',
17
+ '@codemirror/lint',
18
+ '@uiw/react-codemirror'
19
+ ];
20
+
21
+ export { ADMIN_VITE_SINGLETON_MODULES };
22
+ //# sourceMappingURL=admin-vite-singleton-modules.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-vite-singleton-modules.mjs","sources":["../../../../src/node/core/admin-vite-singleton-modules.ts"],"sourcesContent":["/**\n * Modules that must resolve to a single runtime instance in the admin bundle.\n *\n * CodeMirror extensions rely on `instanceof` checks internally, so the JSON custom\n * field (JSONInput) crashes if @codemirror/state (or its siblings) is duplicated\n * between @strapi/design-system, @codemirror/lang-json and @uiw/react-codemirror\n * They are resolved from @strapi/design-system's closure — the real\n * consumer that also externalizes them — and forced onto a single copy.\n *\n * @internal\n */\nexport const ADMIN_VITE_SINGLETON_MODULES = [\n '@codemirror/state',\n '@codemirror/view',\n '@codemirror/language',\n '@codemirror/lang-json',\n '@codemirror/commands',\n '@codemirror/lint',\n '@uiw/react-codemirror',\n] as const;\n\nexport type AdminViteSingletonModule = (typeof ADMIN_VITE_SINGLETON_MODULES)[number];\n"],"names":["ADMIN_VITE_SINGLETON_MODULES"],"mappings":"AAAA;;;;;;;;;;UAWaA,4BAAAA,GAA+B;AAC1C,IAAA,mBAAA;AACA,IAAA,kBAAA;AACA,IAAA,sBAAA;AACA,IAAA,uBAAA;AACA,IAAA,sBAAA;AACA,IAAA,kBAAA;AACA,IAAA;;;;;"}
@@ -105,7 +105,9 @@ const getInstallCommandHint = (missing)=>{
105
105
  if (packageManager === 'pnpm') {
106
106
  return `pnpm add --save-prod ${packages}`;
107
107
  }
108
- return `npm install --legacy-peer-deps --save ${packages}`;
108
+ // Do not use --legacy-peer-deps: it rewrites package-lock in a mode that
109
+ // breaks plain `npm ci` (#27019). Fresh apps install cleanly without it.
110
+ return `npm install --save ${packages}`;
109
111
  };
110
112
  const reportMissingAdminPeerDeps = (logger, missing)=>{
111
113
  logger.error('The Strapi admin is missing required dependencies:', os__default.default.EOL, missing.map(({ name, wantedVersion })=>` - ${name}@${wantedVersion}`).join(os__default.default.EOL));
@@ -166,7 +168,6 @@ const installAdminPeerDeps = async (missing, { cwd, logger })=>{
166
168
  if (packageManager === 'npm') {
167
169
  const npmArgs = [
168
170
  'install',
169
- '--legacy-peer-deps',
170
171
  '--save',
171
172
  ...packages
172
173
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\n\nimport type { Logger } from '../../cli/utils/logger';\nimport { getPackageManager } from './managers';\n\nconst CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');\n\nconst hashPackageJson = async (cwd: string): Promise<string | null> => {\n try {\n const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');\n return crypto.createHash('sha1').update(content).digest('hex');\n } catch {\n return null;\n }\n};\n\nconst readCachedHash = (cwd: string): Promise<string | null> =>\n fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(() => null);\n\nconst writeCachedHash = async (cwd: string, hash: string): Promise<void> => {\n try {\n await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), { recursive: true });\n await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');\n } catch {\n // best-effort cache write — silently ignore\n }\n};\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst ADMIN_PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n} as const;\n\ninterface AdminPeerDep {\n name: string;\n wantedVersion: string;\n}\n\ninterface DeclaredAdminPeerDep extends AdminPeerDep {\n declaredVersion: string;\n}\n\nclass MissingAdminPeerDepsError extends Error {\n readonly missing: AdminPeerDep[];\n\n constructor(missing: AdminPeerDep[]) {\n super('Missing required dependencies. Please install them and re-run this command.');\n this.name = 'MissingAdminPeerDepsError';\n this.missing = missing;\n }\n}\n\nconst loadProjectPackageJson = async (cwd: string) => {\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n return pkg;\n};\n\n/**\n * Returns admin peer dependencies that are not declared in the project's package.json.\n */\nconst findUndeclaredAdminPeerDeps = async (cwd: string): Promise<AdminPeerDep[]> => {\n const pkg = await loadProjectPackageJson(cwd);\n\n return Object.entries(ADMIN_PEER_DEPS).reduce<AdminPeerDep[]>((missing, [name, version]) => {\n const declaredVersion =\n pkg.packageJson.dependencies?.[name] ?? pkg.packageJson.devDependencies?.[name];\n\n if (!declaredVersion) {\n missing.push({\n name,\n wantedVersion: version,\n });\n }\n\n return missing;\n }, []);\n};\n\nconst getDeclaredAdminPeerDeps = (packageJson: PackageJson): DeclaredAdminPeerDep[] => {\n return Object.entries(ADMIN_PEER_DEPS).reduce<DeclaredAdminPeerDep[]>(\n (declared, [name, version]) => {\n const declaredVersion =\n packageJson.dependencies?.[name] ?? packageJson.devDependencies?.[name];\n\n if (declaredVersion) {\n declared.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return declared;\n },\n []\n );\n};\n\nconst getInstallCommandHint = (missing: AdminPeerDep[]) => {\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`).join(' ');\n const packageManager = getPackageManager();\n\n if (packageManager === 'yarn') {\n return `yarn add ${packages}`;\n }\n\n if (packageManager === 'pnpm') {\n return `pnpm add --save-prod ${packages}`;\n }\n\n return `npm install --legacy-peer-deps --save ${packages}`;\n};\n\nconst reportMissingAdminPeerDeps = (logger: Logger, missing: AdminPeerDep[]) => {\n logger.error(\n 'The Strapi admin is missing required dependencies:',\n os.EOL,\n missing.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n logger.error(\n 'Please install them manually before re-running this command:',\n os.EOL,\n ` ${getInstallCommandHint(missing)}`\n );\n};\n\n/**\n * Validates declared admin peer dependencies (versions and node_modules presence).\n */\nconst validateDeclaredAdminPeerDeps = async (cwd: string, logger: Logger) => {\n const pkg = await loadProjectPackageJson(cwd);\n const declared = getDeclaredAdminPeerDeps(pkg.packageJson);\n\n if (!declared.length) {\n return;\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n const errors: string[] = [];\n\n for (const dep of declared) {\n let minDeclaredVersion: SemVer | null = null;\n\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n};\n\nconst installAdminPeerDeps = async (\n missing: AdminPeerDep[],\n { cwd, logger }: { cwd: string; logger: Logger }\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nconst reexecCurrentCommand = async (cwd: string) => {\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nexport {\n ADMIN_PEER_DEPS,\n findUndeclaredAdminPeerDeps,\n validateDeclaredAdminPeerDeps,\n installAdminPeerDeps,\n reexecCurrentCommand,\n reportMissingAdminPeerDeps,\n getInstallCommandHint,\n MissingAdminPeerDepsError,\n getModule,\n hashPackageJson,\n readCachedHash,\n writeCachedHash,\n};\nexport type { AdminPeerDep, PackageJson };\n"],"names":["CACHE_PATH","path","join","hashPackageJson","cwd","content","fs","readFile","crypto","createHash","update","digest","readCachedHash","catch","writeCachedHash","hash","mkdir","dirname","recursive","writeFile","ADMIN_PEER_DEPS","react","MissingAdminPeerDepsError","Error","missing","name","loadProjectPackageJson","pkg","readPkgUp","packageJson","dependencies","findUndeclaredAdminPeerDeps","Object","entries","reduce","version","declaredVersion","devDependencies","push","wantedVersion","getDeclaredAdminPeerDeps","declared","getInstallCommandHint","packages","map","packageManager","getPackageManager","reportMissingAdminPeerDeps","logger","error","os","EOL","validateDeclaredAdminPeerDeps","length","debug","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","warn","installedVersion","getModuleVersion","process","env","NODE_ENV","installAdminPeerDeps","exit","execOptions","encoding","stdio","result","npmArgs","info","execa","yarnArgs","pnpmArgs","exitCode","failed","reexecCurrentCommand","file","args","argv","getModule","modulePackagePath","resolveFrom","silent","then","res","JSON","parse"],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.js","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\n\nimport type { Logger } from '../../cli/utils/logger';\nimport { getPackageManager } from './managers';\n\nconst CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');\n\nconst hashPackageJson = async (cwd: string): Promise<string | null> => {\n try {\n const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');\n return crypto.createHash('sha1').update(content).digest('hex');\n } catch {\n return null;\n }\n};\n\nconst readCachedHash = (cwd: string): Promise<string | null> =>\n fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(() => null);\n\nconst writeCachedHash = async (cwd: string, hash: string): Promise<void> => {\n try {\n await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), { recursive: true });\n await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');\n } catch {\n // best-effort cache write — silently ignore\n }\n};\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst ADMIN_PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n} as const;\n\ninterface AdminPeerDep {\n name: string;\n wantedVersion: string;\n}\n\ninterface DeclaredAdminPeerDep extends AdminPeerDep {\n declaredVersion: string;\n}\n\nclass MissingAdminPeerDepsError extends Error {\n readonly missing: AdminPeerDep[];\n\n constructor(missing: AdminPeerDep[]) {\n super('Missing required dependencies. Please install them and re-run this command.');\n this.name = 'MissingAdminPeerDepsError';\n this.missing = missing;\n }\n}\n\nconst loadProjectPackageJson = async (cwd: string) => {\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n return pkg;\n};\n\n/**\n * Returns admin peer dependencies that are not declared in the project's package.json.\n */\nconst findUndeclaredAdminPeerDeps = async (cwd: string): Promise<AdminPeerDep[]> => {\n const pkg = await loadProjectPackageJson(cwd);\n\n return Object.entries(ADMIN_PEER_DEPS).reduce<AdminPeerDep[]>((missing, [name, version]) => {\n const declaredVersion =\n pkg.packageJson.dependencies?.[name] ?? pkg.packageJson.devDependencies?.[name];\n\n if (!declaredVersion) {\n missing.push({\n name,\n wantedVersion: version,\n });\n }\n\n return missing;\n }, []);\n};\n\nconst getDeclaredAdminPeerDeps = (packageJson: PackageJson): DeclaredAdminPeerDep[] => {\n return Object.entries(ADMIN_PEER_DEPS).reduce<DeclaredAdminPeerDep[]>(\n (declared, [name, version]) => {\n const declaredVersion =\n packageJson.dependencies?.[name] ?? packageJson.devDependencies?.[name];\n\n if (declaredVersion) {\n declared.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return declared;\n },\n []\n );\n};\n\nconst getInstallCommandHint = (missing: AdminPeerDep[]) => {\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`).join(' ');\n const packageManager = getPackageManager();\n\n if (packageManager === 'yarn') {\n return `yarn add ${packages}`;\n }\n\n if (packageManager === 'pnpm') {\n return `pnpm add --save-prod ${packages}`;\n }\n\n // Do not use --legacy-peer-deps: it rewrites package-lock in a mode that\n // breaks plain `npm ci` (#27019). Fresh apps install cleanly without it.\n return `npm install --save ${packages}`;\n};\n\nconst reportMissingAdminPeerDeps = (logger: Logger, missing: AdminPeerDep[]) => {\n logger.error(\n 'The Strapi admin is missing required dependencies:',\n os.EOL,\n missing.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n logger.error(\n 'Please install them manually before re-running this command:',\n os.EOL,\n ` ${getInstallCommandHint(missing)}`\n );\n};\n\n/**\n * Validates declared admin peer dependencies (versions and node_modules presence).\n */\nconst validateDeclaredAdminPeerDeps = async (cwd: string, logger: Logger) => {\n const pkg = await loadProjectPackageJson(cwd);\n const declared = getDeclaredAdminPeerDeps(pkg.packageJson);\n\n if (!declared.length) {\n return;\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n const errors: string[] = [];\n\n for (const dep of declared) {\n let minDeclaredVersion: SemVer | null = null;\n\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n};\n\nconst installAdminPeerDeps = async (\n missing: AdminPeerDep[],\n { cwd, logger }: { cwd: string; logger: Logger }\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nconst reexecCurrentCommand = async (cwd: string) => {\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nexport {\n ADMIN_PEER_DEPS,\n findUndeclaredAdminPeerDeps,\n validateDeclaredAdminPeerDeps,\n installAdminPeerDeps,\n reexecCurrentCommand,\n reportMissingAdminPeerDeps,\n getInstallCommandHint,\n MissingAdminPeerDepsError,\n getModule,\n hashPackageJson,\n readCachedHash,\n writeCachedHash,\n};\nexport type { AdminPeerDep, PackageJson };\n"],"names":["CACHE_PATH","path","join","hashPackageJson","cwd","content","fs","readFile","crypto","createHash","update","digest","readCachedHash","catch","writeCachedHash","hash","mkdir","dirname","recursive","writeFile","ADMIN_PEER_DEPS","react","MissingAdminPeerDepsError","Error","missing","name","loadProjectPackageJson","pkg","readPkgUp","packageJson","dependencies","findUndeclaredAdminPeerDeps","Object","entries","reduce","version","declaredVersion","devDependencies","push","wantedVersion","getDeclaredAdminPeerDeps","declared","getInstallCommandHint","packages","map","packageManager","getPackageManager","reportMissingAdminPeerDeps","logger","error","os","EOL","validateDeclaredAdminPeerDeps","length","debug","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","warn","installedVersion","getModuleVersion","process","env","NODE_ENV","installAdminPeerDeps","exit","execOptions","encoding","stdio","result","npmArgs","info","execa","yarnArgs","pnpmArgs","exitCode","failed","reexecCurrentCommand","file","args","argv","getModule","modulePackagePath","resolveFrom","silent","then","res","JSON","parse"],"mappings":"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"}
@@ -92,7 +92,9 @@ const getInstallCommandHint = (missing)=>{
92
92
  if (packageManager === 'pnpm') {
93
93
  return `pnpm add --save-prod ${packages}`;
94
94
  }
95
- return `npm install --legacy-peer-deps --save ${packages}`;
95
+ // Do not use --legacy-peer-deps: it rewrites package-lock in a mode that
96
+ // breaks plain `npm ci` (#27019). Fresh apps install cleanly without it.
97
+ return `npm install --save ${packages}`;
96
98
  };
97
99
  const reportMissingAdminPeerDeps = (logger, missing)=>{
98
100
  logger.error('The Strapi admin is missing required dependencies:', os.EOL, missing.map(({ name, wantedVersion })=>` - ${name}@${wantedVersion}`).join(os.EOL));
@@ -153,7 +155,6 @@ const installAdminPeerDeps = async (missing, { cwd, logger })=>{
153
155
  if (packageManager === 'npm') {
154
156
  const npmArgs = [
155
157
  'install',
156
- '--legacy-peer-deps',
157
158
  '--save',
158
159
  ...packages
159
160
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.mjs","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\n\nimport type { Logger } from '../../cli/utils/logger';\nimport { getPackageManager } from './managers';\n\nconst CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');\n\nconst hashPackageJson = async (cwd: string): Promise<string | null> => {\n try {\n const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');\n return crypto.createHash('sha1').update(content).digest('hex');\n } catch {\n return null;\n }\n};\n\nconst readCachedHash = (cwd: string): Promise<string | null> =>\n fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(() => null);\n\nconst writeCachedHash = async (cwd: string, hash: string): Promise<void> => {\n try {\n await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), { recursive: true });\n await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');\n } catch {\n // best-effort cache write — silently ignore\n }\n};\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst ADMIN_PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n} as const;\n\ninterface AdminPeerDep {\n name: string;\n wantedVersion: string;\n}\n\ninterface DeclaredAdminPeerDep extends AdminPeerDep {\n declaredVersion: string;\n}\n\nclass MissingAdminPeerDepsError extends Error {\n readonly missing: AdminPeerDep[];\n\n constructor(missing: AdminPeerDep[]) {\n super('Missing required dependencies. Please install them and re-run this command.');\n this.name = 'MissingAdminPeerDepsError';\n this.missing = missing;\n }\n}\n\nconst loadProjectPackageJson = async (cwd: string) => {\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n return pkg;\n};\n\n/**\n * Returns admin peer dependencies that are not declared in the project's package.json.\n */\nconst findUndeclaredAdminPeerDeps = async (cwd: string): Promise<AdminPeerDep[]> => {\n const pkg = await loadProjectPackageJson(cwd);\n\n return Object.entries(ADMIN_PEER_DEPS).reduce<AdminPeerDep[]>((missing, [name, version]) => {\n const declaredVersion =\n pkg.packageJson.dependencies?.[name] ?? pkg.packageJson.devDependencies?.[name];\n\n if (!declaredVersion) {\n missing.push({\n name,\n wantedVersion: version,\n });\n }\n\n return missing;\n }, []);\n};\n\nconst getDeclaredAdminPeerDeps = (packageJson: PackageJson): DeclaredAdminPeerDep[] => {\n return Object.entries(ADMIN_PEER_DEPS).reduce<DeclaredAdminPeerDep[]>(\n (declared, [name, version]) => {\n const declaredVersion =\n packageJson.dependencies?.[name] ?? packageJson.devDependencies?.[name];\n\n if (declaredVersion) {\n declared.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return declared;\n },\n []\n );\n};\n\nconst getInstallCommandHint = (missing: AdminPeerDep[]) => {\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`).join(' ');\n const packageManager = getPackageManager();\n\n if (packageManager === 'yarn') {\n return `yarn add ${packages}`;\n }\n\n if (packageManager === 'pnpm') {\n return `pnpm add --save-prod ${packages}`;\n }\n\n return `npm install --legacy-peer-deps --save ${packages}`;\n};\n\nconst reportMissingAdminPeerDeps = (logger: Logger, missing: AdminPeerDep[]) => {\n logger.error(\n 'The Strapi admin is missing required dependencies:',\n os.EOL,\n missing.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n logger.error(\n 'Please install them manually before re-running this command:',\n os.EOL,\n ` ${getInstallCommandHint(missing)}`\n );\n};\n\n/**\n * Validates declared admin peer dependencies (versions and node_modules presence).\n */\nconst validateDeclaredAdminPeerDeps = async (cwd: string, logger: Logger) => {\n const pkg = await loadProjectPackageJson(cwd);\n const declared = getDeclaredAdminPeerDeps(pkg.packageJson);\n\n if (!declared.length) {\n return;\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n const errors: string[] = [];\n\n for (const dep of declared) {\n let minDeclaredVersion: SemVer | null = null;\n\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n};\n\nconst installAdminPeerDeps = async (\n missing: AdminPeerDep[],\n { cwd, logger }: { cwd: string; logger: Logger }\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nconst reexecCurrentCommand = async (cwd: string) => {\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nexport {\n ADMIN_PEER_DEPS,\n findUndeclaredAdminPeerDeps,\n validateDeclaredAdminPeerDeps,\n installAdminPeerDeps,\n reexecCurrentCommand,\n reportMissingAdminPeerDeps,\n getInstallCommandHint,\n MissingAdminPeerDepsError,\n getModule,\n hashPackageJson,\n readCachedHash,\n writeCachedHash,\n};\nexport type { AdminPeerDep, PackageJson };\n"],"names":["CACHE_PATH","path","join","hashPackageJson","cwd","content","fs","readFile","crypto","createHash","update","digest","readCachedHash","catch","writeCachedHash","hash","mkdir","dirname","recursive","writeFile","ADMIN_PEER_DEPS","react","MissingAdminPeerDepsError","Error","missing","name","loadProjectPackageJson","pkg","readPkgUp","packageJson","dependencies","findUndeclaredAdminPeerDeps","Object","entries","reduce","version","declaredVersion","devDependencies","push","wantedVersion","getDeclaredAdminPeerDeps","declared","getInstallCommandHint","packages","map","packageManager","getPackageManager","reportMissingAdminPeerDeps","logger","error","os","EOL","validateDeclaredAdminPeerDeps","length","debug","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","warn","installedVersion","getModuleVersion","process","env","NODE_ENV","installAdminPeerDeps","exit","execOptions","encoding","stdio","result","npmArgs","info","execa","yarnArgs","pnpmArgs","exitCode","failed","reexecCurrentCommand","file","args","argv","getModule","modulePackagePath","resolveFrom","silent","then","res","JSON","parse"],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.mjs","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\n\nimport type { Logger } from '../../cli/utils/logger';\nimport { getPackageManager } from './managers';\n\nconst CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');\n\nconst hashPackageJson = async (cwd: string): Promise<string | null> => {\n try {\n const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');\n return crypto.createHash('sha1').update(content).digest('hex');\n } catch {\n return null;\n }\n};\n\nconst readCachedHash = (cwd: string): Promise<string | null> =>\n fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(() => null);\n\nconst writeCachedHash = async (cwd: string, hash: string): Promise<void> => {\n try {\n await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), { recursive: true });\n await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');\n } catch {\n // best-effort cache write — silently ignore\n }\n};\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst ADMIN_PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n} as const;\n\ninterface AdminPeerDep {\n name: string;\n wantedVersion: string;\n}\n\ninterface DeclaredAdminPeerDep extends AdminPeerDep {\n declaredVersion: string;\n}\n\nclass MissingAdminPeerDepsError extends Error {\n readonly missing: AdminPeerDep[];\n\n constructor(missing: AdminPeerDep[]) {\n super('Missing required dependencies. Please install them and re-run this command.');\n this.name = 'MissingAdminPeerDepsError';\n this.missing = missing;\n }\n}\n\nconst loadProjectPackageJson = async (cwd: string) => {\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n return pkg;\n};\n\n/**\n * Returns admin peer dependencies that are not declared in the project's package.json.\n */\nconst findUndeclaredAdminPeerDeps = async (cwd: string): Promise<AdminPeerDep[]> => {\n const pkg = await loadProjectPackageJson(cwd);\n\n return Object.entries(ADMIN_PEER_DEPS).reduce<AdminPeerDep[]>((missing, [name, version]) => {\n const declaredVersion =\n pkg.packageJson.dependencies?.[name] ?? pkg.packageJson.devDependencies?.[name];\n\n if (!declaredVersion) {\n missing.push({\n name,\n wantedVersion: version,\n });\n }\n\n return missing;\n }, []);\n};\n\nconst getDeclaredAdminPeerDeps = (packageJson: PackageJson): DeclaredAdminPeerDep[] => {\n return Object.entries(ADMIN_PEER_DEPS).reduce<DeclaredAdminPeerDep[]>(\n (declared, [name, version]) => {\n const declaredVersion =\n packageJson.dependencies?.[name] ?? packageJson.devDependencies?.[name];\n\n if (declaredVersion) {\n declared.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return declared;\n },\n []\n );\n};\n\nconst getInstallCommandHint = (missing: AdminPeerDep[]) => {\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`).join(' ');\n const packageManager = getPackageManager();\n\n if (packageManager === 'yarn') {\n return `yarn add ${packages}`;\n }\n\n if (packageManager === 'pnpm') {\n return `pnpm add --save-prod ${packages}`;\n }\n\n // Do not use --legacy-peer-deps: it rewrites package-lock in a mode that\n // breaks plain `npm ci` (#27019). Fresh apps install cleanly without it.\n return `npm install --save ${packages}`;\n};\n\nconst reportMissingAdminPeerDeps = (logger: Logger, missing: AdminPeerDep[]) => {\n logger.error(\n 'The Strapi admin is missing required dependencies:',\n os.EOL,\n missing.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n logger.error(\n 'Please install them manually before re-running this command:',\n os.EOL,\n ` ${getInstallCommandHint(missing)}`\n );\n};\n\n/**\n * Validates declared admin peer dependencies (versions and node_modules presence).\n */\nconst validateDeclaredAdminPeerDeps = async (cwd: string, logger: Logger) => {\n const pkg = await loadProjectPackageJson(cwd);\n const declared = getDeclaredAdminPeerDeps(pkg.packageJson);\n\n if (!declared.length) {\n return;\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n const errors: string[] = [];\n\n for (const dep of declared) {\n let minDeclaredVersion: SemVer | null = null;\n\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n};\n\nconst installAdminPeerDeps = async (\n missing: AdminPeerDep[],\n { cwd, logger }: { cwd: string; logger: Logger }\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = missing.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nconst reexecCurrentCommand = async (cwd: string) => {\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nexport {\n ADMIN_PEER_DEPS,\n findUndeclaredAdminPeerDeps,\n validateDeclaredAdminPeerDeps,\n installAdminPeerDeps,\n reexecCurrentCommand,\n reportMissingAdminPeerDeps,\n getInstallCommandHint,\n MissingAdminPeerDepsError,\n getModule,\n hashPackageJson,\n readCachedHash,\n writeCachedHash,\n};\nexport type { AdminPeerDep, PackageJson };\n"],"names":["CACHE_PATH","path","join","hashPackageJson","cwd","content","fs","readFile","crypto","createHash","update","digest","readCachedHash","catch","writeCachedHash","hash","mkdir","dirname","recursive","writeFile","ADMIN_PEER_DEPS","react","MissingAdminPeerDepsError","Error","missing","name","loadProjectPackageJson","pkg","readPkgUp","packageJson","dependencies","findUndeclaredAdminPeerDeps","Object","entries","reduce","version","declaredVersion","devDependencies","push","wantedVersion","getDeclaredAdminPeerDeps","declared","getInstallCommandHint","packages","map","packageManager","getPackageManager","reportMissingAdminPeerDeps","logger","error","os","EOL","validateDeclaredAdminPeerDeps","length","debug","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","warn","installedVersion","getModuleVersion","process","env","NODE_ENV","installAdminPeerDeps","exit","execOptions","encoding","stdio","result","npmArgs","info","execa","yarnArgs","pnpmArgs","exitCode","failed","reexecCurrentCommand","file","args","argv","getModule","modulePackagePath","resolveFrom","silent","then","res","JSON","parse"],"mappings":";;;;;;;;;;AAYA,MAAMA,UAAAA,GAAaC,IAAAA,CAAKC,IAAI,CAAC,gBAAgB,SAAA,EAAW,iBAAA,CAAA;AAExD,MAAMC,kBAAkB,OAAOC,GAAAA,GAAAA;IAC7B,IAAI;QACF,MAAMC,OAAAA,GAAU,MAAMC,EAAAA,CAAGC,QAAQ,CAACN,IAAAA,CAAKC,IAAI,CAACE,GAAAA,EAAK,cAAA,CAAA,EAAiB,MAAA,CAAA;QAClE,OAAOI,MAAAA,CAAOC,UAAU,CAAC,MAAA,CAAA,CAAQC,MAAM,CAACL,OAAAA,CAAAA,CAASM,MAAM,CAAC,KAAA,CAAA;AAC1D,IAAA,CAAA,CAAE,OAAM;QACN,OAAO,IAAA;AACT,IAAA;AACF;AAEA,MAAMC,cAAAA,GAAiB,CAACR,GAAAA,GACtBE,EAAAA,CAAGC,QAAQ,CAACN,IAAAA,CAAKC,IAAI,CAACE,GAAAA,EAAKJ,UAAAA,CAAAA,EAAa,MAAA,CAAA,CAAQa,KAAK,CAAC,IAAM,IAAA;AAE9D,MAAMC,eAAAA,GAAkB,OAAOV,GAAAA,EAAaW,IAAAA,GAAAA;IAC1C,IAAI;QACF,MAAMT,EAAAA,CAAGU,KAAK,CAACf,IAAAA,CAAKgB,OAAO,CAAChB,IAAAA,CAAKC,IAAI,CAACE,GAAAA,EAAKJ,UAAAA,CAAAA,CAAAA,EAAc;YAAEkB,SAAAA,EAAW;AAAK,SAAA,CAAA;QAC3E,MAAMZ,EAAAA,CAAGa,SAAS,CAAClB,IAAAA,CAAKC,IAAI,CAACE,GAAAA,EAAKJ,aAAae,IAAAA,EAAM,MAAA,CAAA;AACvD,IAAA,CAAA,CAAE,OAAM;;AAER,IAAA;AACF;AAEA;;AAEC,UACKK,eAAAA,GAAkB;IACtBC,KAAAA,EAAO,SAAA;IACP,WAAA,EAAa,SAAA;IACb,kBAAA,EAAoB,QAAA;IACpB,mBAAA,EAAqB;AACvB;AAWA,MAAMC,yBAAAA,SAAkCC,KAAAA,CAAAA;AAGtC,IAAA,WAAA,CAAYC,OAAuB,CAAE;AACnC,QAAA,KAAK,CAAC,6EAAA,CAAA;QACN,IAAI,CAACC,IAAI,GAAG,2BAAA;QACZ,IAAI,CAACD,OAAO,GAAGA,OAAAA;AACjB,IAAA;AACF;AAEA,MAAME,yBAAyB,OAAOtB,GAAAA,GAAAA;IACpC,MAAMuB,GAAAA,GAAM,MAAMC,SAAAA,CAAU;AAAExB,QAAAA;AAAI,KAAA,CAAA;AAElC,IAAA,IAAI,CAACuB,GAAAA,EAAK;AACR,QAAA,MAAM,IAAIJ,KAAAA,CAAM,CAAC,qCAAqC,EAAEnB,GAAAA,CAAAA,CAAK,CAAA;AAC/D,IAAA;AAEA,IAAA,IAAI,CAACuB,GAAAA,CAAIE,WAAW,CAACC,YAAY,EAAE;AACjC,QAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,qDAAqD,EAAEnB,GAAAA,CAAAA,CAAK,CAAA;AAC/E,IAAA;IAEA,OAAOuB,GAAAA;AACT,CAAA;AAEA;;IAGA,MAAMI,8BAA8B,OAAO3B,GAAAA,GAAAA;IACzC,MAAMuB,GAAAA,GAAM,MAAMD,sBAAAA,CAAuBtB,GAAAA,CAAAA;IAEzC,OAAO4B,MAAAA,CAAOC,OAAO,CAACb,eAAAA,CAAAA,CAAiBc,MAAM,CAAiB,CAACV,OAAAA,EAAS,CAACC,IAAAA,EAAMU,OAAAA,CAAQ,GAAA;AACrF,QAAA,MAAMC,eAAAA,GACJT,GAAAA,CAAIE,WAAW,CAACC,YAAY,GAAGL,IAAAA,CAAK,IAAIE,IAAIE,WAAW,CAACQ,eAAe,GAAGZ,IAAAA,CAAK;AAEjF,QAAA,IAAI,CAACW,eAAAA,EAAiB;AACpBZ,YAAAA,OAAAA,CAAQc,IAAI,CAAC;AACXb,gBAAAA,IAAAA;gBACAc,aAAAA,EAAeJ;AACjB,aAAA,CAAA;AACF,QAAA;QAEA,OAAOX,OAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AACP;AAEA,MAAMgB,2BAA2B,CAACX,WAAAA,GAAAA;IAChC,OAAOG,MAAAA,CAAOC,OAAO,CAACb,eAAAA,CAAAA,CAAiBc,MAAM,CAC3C,CAACO,QAAAA,EAAU,CAAChB,IAAAA,EAAMU,OAAAA,CAAQ,GAAA;QACxB,MAAMC,eAAAA,GACJP,WAAAA,CAAYC,YAAY,GAAGL,IAAAA,CAAK,IAAII,WAAAA,CAAYQ,eAAe,GAAGZ,IAAAA,CAAK;AAEzE,QAAA,IAAIW,eAAAA,EAAiB;AACnBK,YAAAA,QAAAA,CAASH,IAAI,CAAC;AACZb,gBAAAA,IAAAA;gBACAc,aAAAA,EAAeJ,OAAAA;AACfC,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;QAEA,OAAOK,QAAAA;AACT,IAAA,CAAA,EACA,EAAE,CAAA;AAEN,CAAA;AAEA,MAAMC,wBAAwB,CAAClB,OAAAA,GAAAA;AAC7B,IAAA,MAAMmB,WAAWnB,OAAAA,CAAQoB,GAAG,CAAC,CAAC,EAAEnB,IAAI,EAAEc,aAAa,EAAE,GAAK,GAAGd,IAAAA,CAAK,CAAC,EAAEc,aAAAA,CAAAA,CAAe,CAAA,CAAErC,IAAI,CAAC,GAAA,CAAA;AAC3F,IAAA,MAAM2C,cAAAA,GAAiBC,iBAAAA,EAAAA;AAEvB,IAAA,IAAID,mBAAmB,MAAA,EAAQ;QAC7B,OAAO,CAAC,SAAS,EAAEF,QAAAA,CAAAA,CAAU;AAC/B,IAAA;AAEA,IAAA,IAAIE,mBAAmB,MAAA,EAAQ;QAC7B,OAAO,CAAC,qBAAqB,EAAEF,QAAAA,CAAAA,CAAU;AAC3C,IAAA;;;IAIA,OAAO,CAAC,mBAAmB,EAAEA,QAAAA,CAAAA,CAAU;AACzC;AAEA,MAAMI,0BAAAA,GAA6B,CAACC,MAAAA,EAAgBxB,OAAAA,GAAAA;IAClDwB,MAAAA,CAAOC,KAAK,CACV,oDAAA,EACAC,EAAAA,CAAGC,GAAG,EACN3B,OAAAA,CAAQoB,GAAG,CAAC,CAAC,EAAEnB,IAAI,EAAEc,aAAa,EAAE,GAAK,CAAC,IAAI,EAAEd,IAAAA,CAAK,CAAC,EAAEc,aAAAA,CAAAA,CAAe,CAAA,CAAErC,IAAI,CAACgD,EAAAA,CAAGC,GAAG,CAAA,CAAA;IAEtFH,MAAAA,CAAOC,KAAK,CACV,8DAAA,EACAC,EAAAA,CAAGC,GAAG,EACN,CAAC,EAAE,EAAET,qBAAAA,CAAsBlB,OAAAA,CAAAA,CAAAA,CAAU,CAAA;AAEzC;AAEA;;IAGA,MAAM4B,6BAAAA,GAAgC,OAAOhD,GAAAA,EAAa4C,MAAAA,GAAAA;IACxD,MAAMrB,GAAAA,GAAM,MAAMD,sBAAAA,CAAuBtB,GAAAA,CAAAA;IACzC,MAAMqC,QAAAA,GAAWD,wBAAAA,CAAyBb,GAAAA,CAAIE,WAAW,CAAA;IAEzD,IAAI,CAACY,QAAAA,CAASY,MAAM,EAAE;AACpB,QAAA;AACF,IAAA;AAEAL,IAAAA,MAAAA,CAAOM,KAAK,CAAC,sBAAA,EAAwBJ,GAAGC,GAAG,EAAExB,IAAIE,WAAW,CAAA;AAE5D,IAAA,MAAM0B,SAAmB,EAAE;IAE3B,KAAK,MAAMC,OAAOf,QAAAA,CAAU;AAC1B,QAAA,IAAIgB,kBAAAA,GAAoC,IAAA;QAExC,IAAI;AACFA,YAAAA,kBAAAA,GAAqBC,MAAAA,CAAOC,UAAU,CAACH,GAAAA,CAAIpB,eAAe,CAAA;AAC5D,QAAA,CAAA,CAAE,OAAOwB,GAAAA,EAAK;;AAEd,QAAA;AAEA,QAAA,IAAI,CAACH,kBAAAA,EAAoB;AACvBF,YAAAA,MAAAA,CAAOjB,IAAI,CACT,CAAC,yBAAyB,EAAEkB,GAAAA,CAAI/B,IAAI,CAAC,yCAAyC,EAAE+B,GAAAA,CAAIpB,eAAe,CAAA,CAAE,CAAA;QAEzG,CAAA,MAAO,IAAI,CAACsB,MAAAA,CAAOG,SAAS,CAACJ,kBAAAA,EAAoBD,GAAAA,CAAIjB,aAAa,CAAA,EAAG;AACnES,YAAAA,MAAAA,CAAOc,IAAI,CACT;AACE,gBAAA,CAAC,oBAAoB,EAAEN,GAAAA,CAAI/B,IAAI,CAAC,EAAE,EAAEgC,kBAAAA,CAAmB,yDAAyD,EAAED,GAAAA,CAAIjB,aAAa,CAAC,EAAE,CAAC;AACvI,gBAAA;aACD,CAACrC,IAAI,CAACgD,EAAAA,CAAGC,GAAG,CAAA,CAAA;AAEjB,QAAA;AAEA,QAAA,MAAMY,gBAAAA,GAAmB,MAAMC,gBAAAA,CAAiBR,GAAAA,CAAI/B,IAAI,EAAErB,GAAAA,CAAAA;AAE1D,QAAA,IAAI,CAAC2D,gBAAAA,EAAkB;YACrBR,MAAAA,CAAOjB,IAAI,CACT,CAAC,yBAAyB,EAAEkB,GAAAA,CAAI/B,IAAI,CAAC,oEAAoE,CAAC,CAAA;QAE9G,CAAA,MAAO,IAAI,CAACiC,MAAAA,CAAOG,SAAS,CAACE,gBAAAA,EAAkBP,GAAAA,CAAIjB,aAAa,CAAA,EAAG;AACjES,YAAAA,MAAAA,CAAOc,IAAI,CACT;AACE,gBAAA,CAAC,oBAAoB,EAAEN,GAAAA,CAAI/B,IAAI,CAAC,EAAE,EAAEsC,gBAAAA,CAAiB,yDAAyD,EAAEP,GAAAA,CAAIjB,aAAa,CAAC,EAAE,CAAC;AACrI,gBAAA;aACD,CAACrC,IAAI,CAACgD,EAAAA,CAAGC,GAAG,CAAA,CAAA;AAEjB,QAAA;AACF,IAAA;IAEA,IAAII,MAAAA,CAAOF,MAAM,GAAG,CAAA,IAAKY,QAAQC,GAAG,CAACC,QAAQ,KAAK,aAAA,EAAe;AAC/D,QAAA,MAAM,IAAI5C,KAAAA,CAAM,CAAA,EAAG2B,EAAAA,CAAGC,GAAG,CAAC,EAAE,EAAEI,MAAAA,CAAOrD,IAAI,CAAC,CAAA,EAAGgD,EAAAA,CAAGC,GAAG,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5D,IAAA;AACF;AAEA,MAAMiB,uBAAuB,OAC3B5C,OAAAA,EACA,EAAEpB,GAAG,EAAE4C,MAAM,EAAmC,GAAA;AAEhD,IAAA,MAAMH,cAAAA,GAAiBC,iBAAAA,EAAAA;AAEvB,IAAA,IAAI,CAACD,cAAAA,EAAgB;AACnBG,QAAAA,MAAAA,CAAOC,KAAK,CACV,uFAAA,CAAA;AAEFgB,QAAAA,OAAAA,CAAQI,IAAI,CAAC,CAAA,CAAA;AACf,IAAA;AAEA,IAAA,MAAMC,WAAAA,GAAqC;QACzCC,QAAAA,EAAU,MAAA;AACVnE,QAAAA,GAAAA;QACAoE,KAAAA,EAAO;AACT,KAAA;AAEA,IAAA,MAAM7B,QAAAA,GAAWnB,OAAAA,CAAQoB,GAAG,CAAC,CAAC,EAAEnB,IAAI,EAAEc,aAAa,EAAE,GAAK,CAAA,EAAGd,IAAAA,CAAK,CAAC,EAAEc,aAAAA,CAAAA,CAAe,CAAA;IAEpF,IAAIkC,MAAAA;AAEJ,IAAA,IAAI5B,mBAAmB,KAAA,EAAO;AAC5B,QAAA,MAAM6B,OAAAA,GAAU;AAAC,YAAA,SAAA;AAAW,YAAA,QAAA;AAAa/B,YAAAA,GAAAA;AAAS,SAAA;QAClDK,MAAAA,CAAO2B,IAAI,CAAC,CAAC,aAAa,EAAED,QAAQxE,IAAI,CAAC,GAAA,CAAA,CAAK,CAAC,CAAC,CAAA;QAChDuE,MAAAA,GAAS,MAAMG,KAAAA,CAAM,KAAA,EAAOF,OAAAA,EAASJ,WAAAA,CAAAA;IACvC,CAAA,MAAO,IAAIzB,mBAAmB,MAAA,EAAQ;AACpC,QAAA,MAAMgC,QAAAA,GAAW;AAAC,YAAA,KAAA;AAAUlC,YAAAA,GAAAA;AAAS,SAAA;QACrCK,MAAAA,CAAO2B,IAAI,CAAC,CAAC,cAAc,EAAEE,SAAS3E,IAAI,CAAC,GAAA,CAAA,CAAK,CAAC,CAAC,CAAA;QAClDuE,MAAAA,GAAS,MAAMG,KAAAA,CAAM,MAAA,EAAQC,QAAAA,EAAUP,WAAAA,CAAAA;IACzC,CAAA,MAAO,IAAIzB,mBAAmB,MAAA,EAAQ;AACpC,QAAA,MAAMiC,QAAAA,GAAW;AAAC,YAAA,KAAA;AAAO,YAAA,aAAA;AAAkBnC,YAAAA,GAAAA;AAAS,SAAA;QACpDK,MAAAA,CAAO2B,IAAI,CAAC,CAAC,cAAc,EAAEG,SAAS5E,IAAI,CAAC,GAAA,CAAA,CAAK,CAAC,CAAC,CAAA;QAClDuE,MAAAA,GAAS,MAAMG,KAAAA,CAAM,MAAA,EAAQE,QAAAA,EAAUR,WAAAA,CAAAA;AACzC,IAAA;IAEA,IAAIG,MAAAA,EAAQM,QAAAA,IAAYN,MAAAA,EAAQO,MAAAA,EAAQ;AACtC,QAAA,MAAM,IAAIzD,KAAAA,CAAM,6BAAA,CAAA;AAClB,IAAA;AACF;AAEA,MAAM0D,uBAAuB,OAAO7E,GAAAA,GAAAA;AAClC,IAAA,MAAM,CAAC8E,IAAAA,EAAM,GAAGC,IAAAA,CAAK,GAAGlB,QAAQmB,IAAI;AAEpC;;;MAIA,MAAMR,KAAAA,CAAMM,IAAAA,EAAMC,IAAAA,EAAM;AAAE/E,QAAAA,GAAAA;QAAKoE,KAAAA,EAAO;AAAU,KAAA,CAAA;AAClD;AAEA,MAAMa,SAAAA,GAAY,OAAO5D,IAAAA,EAAcrB,GAAAA,GAAAA;IACrC,MAAMkF,iBAAAA,GAAoBC,YAAYC,MAAM,CAACpF,KAAKH,IAAAA,CAAKC,IAAI,CAACuB,IAAAA,EAAM,cAAA,CAAA,CAAA;AAClE,IAAA,IAAI,CAAC6D,iBAAAA,EAAmB;QACtB,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAMJ,IAAAA,GAAO,MAAM5E,EAAAA,CAAGC,QAAQ,CAAC+E,iBAAAA,EAAmB,MAAA,CAAA,CAAQG,IAAI,CAAC,CAACC,GAAAA,GAAQC,IAAAA,CAAKC,KAAK,CAACF,GAAAA,CAAAA,CAAAA;IAEnF,OAAOR,IAAAA;AACT;AAEA,MAAMlB,gBAAAA,GAAmB,OAAOvC,IAAAA,EAAcrB,GAAAA,GAAAA;IAC5C,MAAMuB,GAAAA,GAAM,MAAM0D,SAAAA,CAAU5D,IAAAA,EAAMrB,GAAAA,CAAAA;AAElC,IAAA,OAAOuB,KAAKQ,OAAAA,IAAW,IAAA;AACzB,CAAA;;;;"}
@@ -10,29 +10,42 @@ var path__default = /*#__PURE__*/_interopDefault(path);
10
10
  var readPkgUp__default = /*#__PURE__*/_interopDefault(readPkgUp);
11
11
  var resolveFrom__default = /*#__PURE__*/_interopDefault(resolveFrom);
12
12
 
13
- let adminPkgDir;
13
+ const pkgDirCache = new Map();
14
14
  /**
15
- * Package root of @strapi/admin admin Vite aliases must resolve from here so pnpm
16
- * workspaces cannot pick up a hoisted incompatible major from another package
17
- * (e.g. @reduxjs/toolkit@2.x elsewhere while admin pins 1.9.x).
18
- */ const getAdminPkgDir = ()=>{
19
- if (!adminPkgDir) {
20
- adminPkgDir = path__default.default.dirname(require.resolve('@strapi/admin/package.json'));
15
+ * Package root of an installed package (cached), resolved from this process.
16
+ */ const getPackageDir = (packageName)=>{
17
+ const cached = pkgDirCache.get(packageName);
18
+ if (cached) {
19
+ return cached;
21
20
  }
22
- return adminPkgDir;
21
+ const dir = path__default.default.dirname(require.resolve(`${packageName}/package.json`));
22
+ pkgDirCache.set(packageName, dir);
23
+ return dir;
23
24
  };
24
25
  /**
25
- * Resolve module to package root for use in aliases.
26
- * Ensures pnpm's strict node_modules structure can resolve packages when bundling plugin chunks.
26
+ * Resolve a module to its package root from a host package's dependency context.
27
+ * Ensures pnpm's strict node_modules structure can resolve packages when bundling
28
+ * plugin chunks, and lets callers pin a module to whichever package actually owns it
29
+ * (e.g. CodeMirror from @strapi/design-system's closure).
27
30
  *
28
31
  * @internal
29
- */ const getModulePath = (mod)=>{
30
- const modulePath = resolveFrom__default.default(getAdminPkgDir(), mod);
32
+ */ const getModulePathFrom = (hostPackage, mod)=>{
33
+ const modulePath = resolveFrom__default.default(getPackageDir(hostPackage), mod);
31
34
  const pkg = readPkgUp__default.default.sync({
32
35
  cwd: path__default.default.dirname(modulePath)
33
36
  });
34
37
  return pkg ? path__default.default.dirname(pkg.path) : modulePath;
35
38
  };
39
+ /**
40
+ * Resolve a module to its package root from @strapi/admin's closure.
41
+ *
42
+ * Admin Vite/webpack aliases must resolve from here so pnpm workspaces cannot pick up
43
+ * a hoisted incompatible major from another package (e.g. @reduxjs/toolkit@2.x elsewhere
44
+ * while admin pins 1.9.x).
45
+ *
46
+ * @internal
47
+ */ const getModulePath = (mod)=>getModulePathFrom('@strapi/admin', mod);
36
48
 
37
49
  exports.getModulePath = getModulePath;
50
+ exports.getModulePathFrom = getModulePathFrom;
38
51
  //# sourceMappingURL=resolve-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-module.js","sources":["../../../../src/node/core/resolve-module.ts"],"sourcesContent":["import path from 'node:path';\nimport readPkgUp from 'read-pkg-up';\nimport resolveFrom from 'resolve-from';\n\nlet adminPkgDir: string | undefined;\n\n/**\n * Package root of @strapi/admin admin Vite aliases must resolve from here so pnpm\n * workspaces cannot pick up a hoisted incompatible major from another package\n * (e.g. @reduxjs/toolkit@2.x elsewhere while admin pins 1.9.x).\n */\nconst getAdminPkgDir = (): string => {\n if (!adminPkgDir) {\n adminPkgDir = path.dirname(require.resolve('@strapi/admin/package.json'));\n }\n\n return adminPkgDir;\n};\n\n/**\n * Resolve module to package root for use in aliases.\n * Ensures pnpm's strict node_modules structure can resolve packages when bundling plugin chunks.\n *\n * @internal\n */\nexport const getModulePath = (mod: string): string => {\n const modulePath = resolveFrom(getAdminPkgDir(), mod);\n const pkg = readPkgUp.sync({ cwd: path.dirname(modulePath) });\n return pkg ? path.dirname(pkg.path) : modulePath;\n};\n"],"names":["adminPkgDir","getAdminPkgDir","path","dirname","require","resolve","getModulePath","mod","modulePath","resolveFrom","pkg","readPkgUp","sync","cwd"],"mappings":";;;;;;;;;;;;AAIA,IAAIA,WAAAA;AAEJ;;;;AAIC,IACD,MAAMC,cAAAA,GAAiB,IAAA;AACrB,IAAA,IAAI,CAACD,WAAAA,EAAa;AAChBA,QAAAA,WAAAA,GAAcE,qBAAAA,CAAKC,OAAO,CAACC,OAAAA,CAAQC,OAAO,CAAC,4BAAA,CAAA,CAAA;AAC7C,IAAA;IAEA,OAAOL,WAAAA;AACT,CAAA;AAEA;;;;;IAMO,MAAMM,aAAAA,GAAgB,CAACC,GAAAA,GAAAA;IAC5B,MAAMC,UAAAA,GAAaC,6BAAYR,cAAAA,EAAAA,EAAkBM,GAAAA,CAAAA;IACjD,MAAMG,GAAAA,GAAMC,0BAAAA,CAAUC,IAAI,CAAC;QAAEC,GAAAA,EAAKX,qBAAAA,CAAKC,OAAO,CAACK,UAAAA;AAAY,KAAA,CAAA;AAC3D,IAAA,OAAOE,MAAMR,qBAAAA,CAAKC,OAAO,CAACO,GAAAA,CAAIR,IAAI,CAAA,GAAIM,UAAAA;AACxC;;;;"}
1
+ {"version":3,"file":"resolve-module.js","sources":["../../../../src/node/core/resolve-module.ts"],"sourcesContent":["import path from 'node:path';\nimport readPkgUp from 'read-pkg-up';\nimport resolveFrom from 'resolve-from';\n\nconst pkgDirCache = new Map<string, string>();\n\n/**\n * Package root of an installed package (cached), resolved from this process.\n */\nconst getPackageDir = (packageName: string): string => {\n const cached = pkgDirCache.get(packageName);\n if (cached) {\n return cached;\n }\n\n const dir = path.dirname(require.resolve(`${packageName}/package.json`));\n pkgDirCache.set(packageName, dir);\n return dir;\n};\n\n/**\n * Resolve a module to its package root from a host package's dependency context.\n * Ensures pnpm's strict node_modules structure can resolve packages when bundling\n * plugin chunks, and lets callers pin a module to whichever package actually owns it\n * (e.g. CodeMirror from @strapi/design-system's closure).\n *\n * @internal\n */\nexport const getModulePathFrom = (hostPackage: string, mod: string): string => {\n const modulePath = resolveFrom(getPackageDir(hostPackage), mod);\n const pkg = readPkgUp.sync({ cwd: path.dirname(modulePath) });\n return pkg ? path.dirname(pkg.path) : modulePath;\n};\n\n/**\n * Resolve a module to its package root from @strapi/admin's closure.\n *\n * Admin Vite/webpack aliases must resolve from here so pnpm workspaces cannot pick up\n * a hoisted incompatible major from another package (e.g. @reduxjs/toolkit@2.x elsewhere\n * while admin pins 1.9.x).\n *\n * @internal\n */\nexport const getModulePath = (mod: string): string => getModulePathFrom('@strapi/admin', mod);\n"],"names":["pkgDirCache","Map","getPackageDir","packageName","cached","get","dir","path","dirname","require","resolve","set","getModulePathFrom","hostPackage","mod","modulePath","resolveFrom","pkg","readPkgUp","sync","cwd","getModulePath"],"mappings":";;;;;;;;;;;;AAIA,MAAMA,cAAc,IAAIC,GAAAA,EAAAA;AAExB;;IAGA,MAAMC,gBAAgB,CAACC,WAAAA,GAAAA;IACrB,MAAMC,MAAAA,GAASJ,WAAAA,CAAYK,GAAG,CAACF,WAAAA,CAAAA;AAC/B,IAAA,IAAIC,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,GAAAA,GAAMC,qBAAAA,CAAKC,OAAO,CAACC,OAAAA,CAAQC,OAAO,CAAC,CAAA,EAAGP,WAAAA,CAAY,aAAa,CAAC,CAAA,CAAA;IACtEH,WAAAA,CAAYW,GAAG,CAACR,WAAAA,EAAaG,GAAAA,CAAAA;IAC7B,OAAOA,GAAAA;AACT,CAAA;AAEA;;;;;;;AAOC,IACM,MAAMM,iBAAAA,GAAoB,CAACC,WAAAA,EAAqBC,GAAAA,GAAAA;IACrD,MAAMC,UAAAA,GAAaC,4BAAAA,CAAYd,aAAAA,CAAcW,WAAAA,CAAAA,EAAcC,GAAAA,CAAAA;IAC3D,MAAMG,GAAAA,GAAMC,0BAAAA,CAAUC,IAAI,CAAC;QAAEC,GAAAA,EAAKb,qBAAAA,CAAKC,OAAO,CAACO,UAAAA;AAAY,KAAA,CAAA;AAC3D,IAAA,OAAOE,MAAMV,qBAAAA,CAAKC,OAAO,CAACS,GAAAA,CAAIV,IAAI,CAAA,GAAIQ,UAAAA;AACxC;AAEA;;;;;;;;AAQC,IACM,MAAMM,aAAAA,GAAgB,CAACP,GAAAA,GAAwBF,iBAAAA,CAAkB,iBAAiBE,GAAAA;;;;;"}
@@ -2,29 +2,41 @@ import path from 'node:path';
2
2
  import readPkgUp from 'read-pkg-up';
3
3
  import resolveFrom from 'resolve-from';
4
4
 
5
- let adminPkgDir;
5
+ const pkgDirCache = new Map();
6
6
  /**
7
- * Package root of @strapi/admin admin Vite aliases must resolve from here so pnpm
8
- * workspaces cannot pick up a hoisted incompatible major from another package
9
- * (e.g. @reduxjs/toolkit@2.x elsewhere while admin pins 1.9.x).
10
- */ const getAdminPkgDir = ()=>{
11
- if (!adminPkgDir) {
12
- adminPkgDir = path.dirname(require.resolve('@strapi/admin/package.json'));
7
+ * Package root of an installed package (cached), resolved from this process.
8
+ */ const getPackageDir = (packageName)=>{
9
+ const cached = pkgDirCache.get(packageName);
10
+ if (cached) {
11
+ return cached;
13
12
  }
14
- return adminPkgDir;
13
+ const dir = path.dirname(require.resolve(`${packageName}/package.json`));
14
+ pkgDirCache.set(packageName, dir);
15
+ return dir;
15
16
  };
16
17
  /**
17
- * Resolve module to package root for use in aliases.
18
- * Ensures pnpm's strict node_modules structure can resolve packages when bundling plugin chunks.
18
+ * Resolve a module to its package root from a host package's dependency context.
19
+ * Ensures pnpm's strict node_modules structure can resolve packages when bundling
20
+ * plugin chunks, and lets callers pin a module to whichever package actually owns it
21
+ * (e.g. CodeMirror from @strapi/design-system's closure).
19
22
  *
20
23
  * @internal
21
- */ const getModulePath = (mod)=>{
22
- const modulePath = resolveFrom(getAdminPkgDir(), mod);
24
+ */ const getModulePathFrom = (hostPackage, mod)=>{
25
+ const modulePath = resolveFrom(getPackageDir(hostPackage), mod);
23
26
  const pkg = readPkgUp.sync({
24
27
  cwd: path.dirname(modulePath)
25
28
  });
26
29
  return pkg ? path.dirname(pkg.path) : modulePath;
27
30
  };
31
+ /**
32
+ * Resolve a module to its package root from @strapi/admin's closure.
33
+ *
34
+ * Admin Vite/webpack aliases must resolve from here so pnpm workspaces cannot pick up
35
+ * a hoisted incompatible major from another package (e.g. @reduxjs/toolkit@2.x elsewhere
36
+ * while admin pins 1.9.x).
37
+ *
38
+ * @internal
39
+ */ const getModulePath = (mod)=>getModulePathFrom('@strapi/admin', mod);
28
40
 
29
- export { getModulePath };
41
+ export { getModulePath, getModulePathFrom };
30
42
  //# sourceMappingURL=resolve-module.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-module.mjs","sources":["../../../../src/node/core/resolve-module.ts"],"sourcesContent":["import path from 'node:path';\nimport readPkgUp from 'read-pkg-up';\nimport resolveFrom from 'resolve-from';\n\nlet adminPkgDir: string | undefined;\n\n/**\n * Package root of @strapi/admin admin Vite aliases must resolve from here so pnpm\n * workspaces cannot pick up a hoisted incompatible major from another package\n * (e.g. @reduxjs/toolkit@2.x elsewhere while admin pins 1.9.x).\n */\nconst getAdminPkgDir = (): string => {\n if (!adminPkgDir) {\n adminPkgDir = path.dirname(require.resolve('@strapi/admin/package.json'));\n }\n\n return adminPkgDir;\n};\n\n/**\n * Resolve module to package root for use in aliases.\n * Ensures pnpm's strict node_modules structure can resolve packages when bundling plugin chunks.\n *\n * @internal\n */\nexport const getModulePath = (mod: string): string => {\n const modulePath = resolveFrom(getAdminPkgDir(), mod);\n const pkg = readPkgUp.sync({ cwd: path.dirname(modulePath) });\n return pkg ? path.dirname(pkg.path) : modulePath;\n};\n"],"names":["adminPkgDir","getAdminPkgDir","path","dirname","require","resolve","getModulePath","mod","modulePath","resolveFrom","pkg","readPkgUp","sync","cwd"],"mappings":";;;;AAIA,IAAIA,WAAAA;AAEJ;;;;AAIC,IACD,MAAMC,cAAAA,GAAiB,IAAA;AACrB,IAAA,IAAI,CAACD,WAAAA,EAAa;AAChBA,QAAAA,WAAAA,GAAcE,IAAAA,CAAKC,OAAO,CAACC,OAAAA,CAAQC,OAAO,CAAC,4BAAA,CAAA,CAAA;AAC7C,IAAA;IAEA,OAAOL,WAAAA;AACT,CAAA;AAEA;;;;;IAMO,MAAMM,aAAAA,GAAgB,CAACC,GAAAA,GAAAA;IAC5B,MAAMC,UAAAA,GAAaC,YAAYR,cAAAA,EAAAA,EAAkBM,GAAAA,CAAAA;IACjD,MAAMG,GAAAA,GAAMC,SAAAA,CAAUC,IAAI,CAAC;QAAEC,GAAAA,EAAKX,IAAAA,CAAKC,OAAO,CAACK,UAAAA;AAAY,KAAA,CAAA;AAC3D,IAAA,OAAOE,MAAMR,IAAAA,CAAKC,OAAO,CAACO,GAAAA,CAAIR,IAAI,CAAA,GAAIM,UAAAA;AACxC;;;;"}
1
+ {"version":3,"file":"resolve-module.mjs","sources":["../../../../src/node/core/resolve-module.ts"],"sourcesContent":["import path from 'node:path';\nimport readPkgUp from 'read-pkg-up';\nimport resolveFrom from 'resolve-from';\n\nconst pkgDirCache = new Map<string, string>();\n\n/**\n * Package root of an installed package (cached), resolved from this process.\n */\nconst getPackageDir = (packageName: string): string => {\n const cached = pkgDirCache.get(packageName);\n if (cached) {\n return cached;\n }\n\n const dir = path.dirname(require.resolve(`${packageName}/package.json`));\n pkgDirCache.set(packageName, dir);\n return dir;\n};\n\n/**\n * Resolve a module to its package root from a host package's dependency context.\n * Ensures pnpm's strict node_modules structure can resolve packages when bundling\n * plugin chunks, and lets callers pin a module to whichever package actually owns it\n * (e.g. CodeMirror from @strapi/design-system's closure).\n *\n * @internal\n */\nexport const getModulePathFrom = (hostPackage: string, mod: string): string => {\n const modulePath = resolveFrom(getPackageDir(hostPackage), mod);\n const pkg = readPkgUp.sync({ cwd: path.dirname(modulePath) });\n return pkg ? path.dirname(pkg.path) : modulePath;\n};\n\n/**\n * Resolve a module to its package root from @strapi/admin's closure.\n *\n * Admin Vite/webpack aliases must resolve from here so pnpm workspaces cannot pick up\n * a hoisted incompatible major from another package (e.g. @reduxjs/toolkit@2.x elsewhere\n * while admin pins 1.9.x).\n *\n * @internal\n */\nexport const getModulePath = (mod: string): string => getModulePathFrom('@strapi/admin', mod);\n"],"names":["pkgDirCache","Map","getPackageDir","packageName","cached","get","dir","path","dirname","require","resolve","set","getModulePathFrom","hostPackage","mod","modulePath","resolveFrom","pkg","readPkgUp","sync","cwd","getModulePath"],"mappings":";;;;AAIA,MAAMA,cAAc,IAAIC,GAAAA,EAAAA;AAExB;;IAGA,MAAMC,gBAAgB,CAACC,WAAAA,GAAAA;IACrB,MAAMC,MAAAA,GAASJ,WAAAA,CAAYK,GAAG,CAACF,WAAAA,CAAAA;AAC/B,IAAA,IAAIC,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,GAAAA,GAAMC,IAAAA,CAAKC,OAAO,CAACC,OAAAA,CAAQC,OAAO,CAAC,CAAA,EAAGP,WAAAA,CAAY,aAAa,CAAC,CAAA,CAAA;IACtEH,WAAAA,CAAYW,GAAG,CAACR,WAAAA,EAAaG,GAAAA,CAAAA;IAC7B,OAAOA,GAAAA;AACT,CAAA;AAEA;;;;;;;AAOC,IACM,MAAMM,iBAAAA,GAAoB,CAACC,WAAAA,EAAqBC,GAAAA,GAAAA;IACrD,MAAMC,UAAAA,GAAaC,WAAAA,CAAYd,aAAAA,CAAcW,WAAAA,CAAAA,EAAcC,GAAAA,CAAAA;IAC3D,MAAMG,GAAAA,GAAMC,SAAAA,CAAUC,IAAI,CAAC;QAAEC,GAAAA,EAAKb,IAAAA,CAAKC,OAAO,CAACO,UAAAA;AAAY,KAAA,CAAA;AAC3D,IAAA,OAAOE,MAAMV,IAAAA,CAAKC,OAAO,CAACS,GAAAA,CAAIV,IAAI,CAAA,GAAIQ,UAAAA;AACxC;AAEA;;;;;;;;AAQC,IACM,MAAMM,aAAAA,GAAgB,CAACP,GAAAA,GAAwBF,iBAAAA,CAAkB,iBAAiBE,GAAAA;;;;"}
@@ -52,9 +52,12 @@ const createBuildContext = async ({ cwd, logger, tsconfig, strapi, options = {}
52
52
  STRAPI_AI_URL: process.env.STRAPI_AI_URL?.replace(/\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',
53
53
  STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'
54
54
  });
55
- // NOTE: Transports `admin.auth.cookie.name` into the bundle; always assigned so an
56
- // ambient STRAPI_ADMIN_AUTH_COOKIE_NAME cannot make the bundle disagree with the server.
55
+ // NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always
56
+ // assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree
57
+ // with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.
57
58
  env$1.STRAPI_ADMIN_AUTH_COOKIE_NAME = strapiInstance.config.get('admin.auth.cookie.name') || '';
59
+ env$1.STRAPI_ADMIN_AUTH_COOKIE_PATH = strapiInstance.config.get('admin.auth.cookie.path') || '';
60
+ env$1.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN = strapiInstance.config.get('admin.auth.cookie.domain') || strapiInstance.config.get('admin.auth.domain') || '';
58
61
  const envKeys = Object.keys(env$1);
59
62
  if (envKeys.length > 0) {
60
63
  logger.debug([
@@ -1 +1 @@
1
- {"version":3,"file":"create-build-context.js","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemaps?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n}\n\ninterface BuildContext<TOptions = unknown> extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions & TOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n}\n\ninterface CreateBuildContextArgs<TOptions = unknown> extends CLIContext {\n strapi?: Core.Strapi;\n options?: TOptions;\n}\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async <TOptions extends BaseOptions>({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {} as TOptions,\n}: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n // NOTE: Transports `admin.auth.cookie.name` into the bundle; always assigned so an\n // ambient STRAPI_ADMIN_AUTH_COOKIE_NAME cannot make the bundle disagree with the server.\n env.STRAPI_ADMIN_AUTH_COOKIE_NAME =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.name') || '';\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.debug(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const buildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n options: restOptions as BaseOptions & TOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n strapi: strapiInstance,\n target,\n tsconfig,\n } satisfies BuildContext<TOptions>;\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","STRAPI_ADMIN_AUTH_COOKIE_NAME","envKeys","Object","keys","length","debug","map","key","join","os","EOL","distPath","path","dist","relative","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","buildContext","basePath"],"mappings":"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"}
1
+ {"version":3,"file":"create-build-context.js","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemaps?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n}\n\ninterface BuildContext<TOptions = unknown> extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions & TOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n}\n\ninterface CreateBuildContextArgs<TOptions = unknown> extends CLIContext {\n strapi?: Core.Strapi;\n options?: TOptions;\n}\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async <TOptions extends BaseOptions>({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {} as TOptions,\n}: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n // NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always\n // assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree\n // with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.\n env.STRAPI_ADMIN_AUTH_COOKIE_NAME =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.name') || '';\n env.STRAPI_ADMIN_AUTH_COOKIE_PATH =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.path') || '';\n env.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.domain') ||\n strapiInstance.config.get<string | undefined>('admin.auth.domain') ||\n '';\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.debug(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const buildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n options: restOptions as BaseOptions & TOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n strapi: strapiInstance,\n target,\n tsconfig,\n } satisfies BuildContext<TOptions>;\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","STRAPI_ADMIN_AUTH_COOKIE_NAME","STRAPI_ADMIN_AUTH_COOKIE_PATH","STRAPI_ADMIN_AUTH_COOKIE_DOMAIN","envKeys","Object","keys","length","debug","map","key","join","os","EOL","distPath","path","dist","relative","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","buildContext","basePath"],"mappings":"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"}
@@ -43,9 +43,12 @@ const createBuildContext = async ({ cwd, logger, tsconfig, strapi, options = {}
43
43
  STRAPI_AI_URL: process.env.STRAPI_AI_URL?.replace(/\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',
44
44
  STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'
45
45
  });
46
- // NOTE: Transports `admin.auth.cookie.name` into the bundle; always assigned so an
47
- // ambient STRAPI_ADMIN_AUTH_COOKIE_NAME cannot make the bundle disagree with the server.
46
+ // NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always
47
+ // assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree
48
+ // with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.
48
49
  env.STRAPI_ADMIN_AUTH_COOKIE_NAME = strapiInstance.config.get('admin.auth.cookie.name') || '';
50
+ env.STRAPI_ADMIN_AUTH_COOKIE_PATH = strapiInstance.config.get('admin.auth.cookie.path') || '';
51
+ env.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN = strapiInstance.config.get('admin.auth.cookie.domain') || strapiInstance.config.get('admin.auth.domain') || '';
49
52
  const envKeys = Object.keys(env);
50
53
  if (envKeys.length > 0) {
51
54
  logger.debug([