@strapi/strapi 5.50.1 → 5.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) 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/commander.d.ts +1 -1
  11. package/dist/cli/utils/commander.d.ts.map +1 -1
  12. package/dist/cli/utils/data-transfer.d.ts +56 -3
  13. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  14. package/dist/node/core/admin-vite-alias-modules.d.ts +9 -4
  15. package/dist/node/core/admin-vite-alias-modules.d.ts.map +1 -1
  16. package/dist/node/core/admin-vite-aliases.d.ts +22 -1
  17. package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
  18. package/dist/node/core/admin-vite-optimize-exclude.d.ts +38 -0
  19. package/dist/node/core/admin-vite-optimize-exclude.d.ts.map +1 -0
  20. package/dist/node/core/admin-vite-singleton-modules.d.ts +14 -0
  21. package/dist/node/core/admin-vite-singleton-modules.d.ts.map +1 -0
  22. package/dist/node/core/dependencies.d.ts.map +1 -1
  23. package/dist/node/core/resolve-module.d.ts +14 -2
  24. package/dist/node/core/resolve-module.d.ts.map +1 -1
  25. package/dist/node/create-build-context.d.ts.map +1 -1
  26. package/dist/node/vite/build.d.ts.map +1 -1
  27. package/dist/node/vite/config.d.ts.map +1 -1
  28. package/dist/node/vite/watch.d.ts.map +1 -1
  29. package/dist/node/webpack/config.d.ts.map +1 -1
  30. package/dist/package.json.js +1 -1
  31. package/dist/package.json.mjs +1 -1
  32. package/dist/src/cli/commands/export/action.js +10 -16
  33. package/dist/src/cli/commands/export/action.js.map +1 -1
  34. package/dist/src/cli/commands/export/action.mjs +11 -17
  35. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  36. package/dist/src/cli/commands/export/command.js +1 -1
  37. package/dist/src/cli/commands/export/command.js.map +1 -1
  38. package/dist/src/cli/commands/export/command.mjs +2 -2
  39. package/dist/src/cli/commands/export/command.mjs.map +1 -1
  40. package/dist/src/cli/commands/import/action.js +11 -15
  41. package/dist/src/cli/commands/import/action.js.map +1 -1
  42. package/dist/src/cli/commands/import/action.mjs +12 -16
  43. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  44. package/dist/src/cli/commands/import/command.js +1 -1
  45. package/dist/src/cli/commands/import/command.js.map +1 -1
  46. package/dist/src/cli/commands/import/command.mjs +2 -2
  47. package/dist/src/cli/commands/import/command.mjs.map +1 -1
  48. package/dist/src/cli/commands/transfer/action.js +10 -16
  49. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  50. package/dist/src/cli/commands/transfer/action.mjs +11 -17
  51. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  52. package/dist/src/cli/commands/transfer/command.js +1 -1
  53. package/dist/src/cli/commands/transfer/command.js.map +1 -1
  54. package/dist/src/cli/commands/transfer/command.mjs +2 -2
  55. package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
  56. package/dist/src/cli/utils/data-transfer.js +166 -4
  57. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  58. package/dist/src/cli/utils/data-transfer.mjs +155 -6
  59. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  60. package/dist/src/node/core/admin-vite-alias-modules.js +13 -2
  61. package/dist/src/node/core/admin-vite-alias-modules.js.map +1 -1
  62. package/dist/src/node/core/admin-vite-alias-modules.mjs +13 -3
  63. package/dist/src/node/core/admin-vite-alias-modules.mjs.map +1 -1
  64. package/dist/src/node/core/admin-vite-aliases.js +44 -5
  65. package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
  66. package/dist/src/node/core/admin-vite-aliases.mjs +44 -7
  67. package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
  68. package/dist/src/node/core/admin-vite-optimize-exclude.js +162 -0
  69. package/dist/src/node/core/admin-vite-optimize-exclude.js.map +1 -0
  70. package/dist/src/node/core/admin-vite-optimize-exclude.mjs +149 -0
  71. package/dist/src/node/core/admin-vite-optimize-exclude.mjs.map +1 -0
  72. package/dist/src/node/core/admin-vite-singleton-modules.js +24 -0
  73. package/dist/src/node/core/admin-vite-singleton-modules.js.map +1 -0
  74. package/dist/src/node/core/admin-vite-singleton-modules.mjs +22 -0
  75. package/dist/src/node/core/admin-vite-singleton-modules.mjs.map +1 -0
  76. package/dist/src/node/core/dependencies.js +3 -2
  77. package/dist/src/node/core/dependencies.js.map +1 -1
  78. package/dist/src/node/core/dependencies.mjs +3 -2
  79. package/dist/src/node/core/dependencies.mjs.map +1 -1
  80. package/dist/src/node/core/resolve-module.js +25 -12
  81. package/dist/src/node/core/resolve-module.js.map +1 -1
  82. package/dist/src/node/core/resolve-module.mjs +25 -13
  83. package/dist/src/node/core/resolve-module.mjs.map +1 -1
  84. package/dist/src/node/create-build-context.js +6 -0
  85. package/dist/src/node/create-build-context.js.map +1 -1
  86. package/dist/src/node/create-build-context.mjs +6 -0
  87. package/dist/src/node/create-build-context.mjs.map +1 -1
  88. package/dist/src/node/vite/build.js +3 -0
  89. package/dist/src/node/vite/build.js.map +1 -1
  90. package/dist/src/node/vite/build.mjs +3 -0
  91. package/dist/src/node/vite/build.mjs.map +1 -1
  92. package/dist/src/node/vite/config.js +33 -16
  93. package/dist/src/node/vite/config.js.map +1 -1
  94. package/dist/src/node/vite/config.mjs +33 -12
  95. package/dist/src/node/vite/config.mjs.map +1 -1
  96. package/dist/src/node/vite/watch.js +3 -0
  97. package/dist/src/node/vite/watch.js.map +1 -1
  98. package/dist/src/node/vite/watch.mjs +3 -0
  99. package/dist/src/node/vite/watch.mjs.map +1 -1
  100. package/dist/src/node/webpack/config.js +5 -0
  101. package/dist/src/node/webpack/config.js.map +1 -1
  102. package/dist/src/node/webpack/config.mjs +5 -0
  103. package/dist/src/node/webpack/config.mjs.map +1 -1
  104. package/package.json +25 -24
  105. package/dist/cli/commands/plugin/init/files/typescript.d.ts +0 -22
  106. package/dist/cli/commands/plugin/init/files/typescript.d.ts.map +0 -1
  107. package/dist/test/mocks/inquirer.d.ts +0 -10
  108. package/dist/test/mocks/inquirer.d.ts.map +0 -1
@@ -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,6 +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` / `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.
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') || '';
55
61
  const envKeys = Object.keys(env$1);
56
62
  if (envKeys.length > 0) {
57
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 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","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,6 +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` / `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.
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') || '';
46
52
  const envKeys = Object.keys(env);
47
53
  if (envKeys.length > 0) {
48
54
  logger.debug([
@@ -1 +1 @@
1
- {"version":3,"file":"create-build-context.mjs","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 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","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":";;;;;;;;;AA+CA,MAAMA,oBAAAA,GAAuB;AAC3B,IAAA,uBAAA;AACA,IAAA,aAAA;AACA,IAAA,uBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,kBAAAA,GAAqB,OAAqC,EAC9DC,GAAG,EACHC,MAAM,EACNC,QAAQ,EACRC,MAAM,EACNC,OAAAA,GAAU,EAAc,EACS,GAAA;AACjC;;;;MAKA,MAAMC,cAAAA,GACJF,MAAAA,IACAG,YAAAA,CAAa;;QAEXC,MAAAA,EAAQP,GAAAA;QACRQ,OAAAA,EAASN,QAAAA,EAAUO,MAAAA,CAAOL,OAAAA,CAAQM,MAAAA,IAAU,EAAA;;QAE5CC,UAAAA,EAAY,IAAA;QACZC,eAAAA,EAAiB;AACnB,KAAA,CAAA;AAEF,IAAA,MAAMC,iBAAAA,GAAoBR,cAAAA,CAAeI,MAAM,CAACK,GAAG,CAAS,oBAAA,CAAA;AAC5D,IAAA,MAAMC,gBAAAA,GAAmBV,cAAAA,CAAeI,MAAM,CAACK,GAAG,CAAS,mBAAA,CAAA;AAC3D,IAAA,MAAME,SAAAA,GAAYX,cAAAA,CAAeI,MAAM,CAACK,GAAG,CAAS,YAAA,CAAA;;IAGpD,MAAMG,UAAAA,GAAa,IAAIC,GAAAA,CAAIH,gBAAAA,CAAAA,CAAkBI,MAAM,KAAK,IAAID,GAAAA,CAAIL,iBAAAA,CAAAA,CAAmBM,MAAM;AAEzF,IAAA,MAAMC,eAAAA,GAAkB,IAAIF,GAAAA,CAAIH,gBAAAA,CAAAA,CAAkBM,QAAQ;AAC1D,IAAA,MAAMC,gBAAAA,GAAmB,IAAIJ,GAAAA,CAAIL,iBAAAA,CAAAA,CAAmBQ,QAAQ;AAE5D,IAAA,MAAMd,SAASF,cAAAA,CAAekB,IAAI,CAACC,GAAG,CAACC,IAAI;AAE3C,IAAA,MAAMC,OAAAA,CAAQ1B,GAAAA,CAAAA;AAEd,IAAA,MAAM2B,MAAMC,qBAAAA,CAAsB;QAChCC,UAAAA,EAAYT,eAAAA;AACZU,QAAAA,wBAAAA,EAA0Bb,aAAaK,gBAAAA,GAAmBT,iBAAAA;AAC1DkB,QAAAA,yBAAAA,EAA2BC,MAAAA,CAAO3B,cAAAA,CAAe4B,SAAS,CAACC,UAAU,CAAA;;AAErEC,QAAAA,aAAAA,EACEC,QAAQT,GAAG,CAACQ,aAAa,EAAEE,OAAAA,CAAQ,QAAQ,EAAA,CAAA,IAAO,kCAAA;AACpDC,QAAAA,oBAAAA,EAAsBF,OAAAA,CAAQT,GAAG,CAACW,oBAAoB,IAAI;AAC5D,KAAA,CAAA;IAEA,MAAMC,OAAAA,GAAUC,MAAAA,CAAOC,IAAI,CAACd,GAAAA,CAAAA;IAE5B,IAAIY,OAAAA,CAAQG,MAAM,GAAG,CAAA,EAAG;AACtBzC,QAAAA,MAAAA,CAAO0C,KAAK,CACV;AACE,YAAA,iEAAA;AACGJ,YAAAA,GAAAA,OAAAA,CAAQK,GAAG,CAAC,CAACC,MAAQ,CAAC,MAAM,EAAEA,GAAAA,CAAAA,CAAK;SACvC,CAACC,IAAI,CAACC,EAAAA,CAAGC,GAAG,CAAA,CAAA;AAEjB,IAAA;IAEA,MAAMC,QAAAA,GAAWC,IAAAA,CAAKJ,IAAI,CAACzC,cAAAA,CAAekB,IAAI,CAAC4B,IAAI,CAAC1B,IAAI,EAAE,OAAA,CAAA;AAC1D,IAAA,MAAMjB,OAAAA,GAAU0C,IAAAA,CAAKE,QAAQ,CAACpD,GAAAA,EAAKiD,QAAAA,CAAAA;AAEnC;;AAEC,MACD,IAAI;AACFhD,QAAAA,MAAAA,CAAO0C,KAAK,CAAC,CAAC,sBAAsB,EAAEM,QAAAA,CAAAA,CAAU,CAAA;QAChD,MAAMI,EAAAA,CAAGC,EAAE,CAACL,QAAAA,EAAU;YAAEM,SAAAA,EAAW,IAAA;YAAMC,KAAAA,EAAO;AAAK,SAAA,CAAA;AACrDvD,QAAAA,MAAAA,CAAO0C,KAAK,CAAC,qBAAA,CAAA;AACf,IAAA,CAAA,CAAE,OAAM;;AAEN1C,QAAAA,MAAAA,CAAO0C,KAAK,CAAC,mCAAA,CAAA;AACf,IAAA;AAEA,IAAA,MAAMc,UAAAA,GAAaP,IAAAA,CAAKJ,IAAI,CAAC9C,KAAK,SAAA,EAAW,QAAA,CAAA;IAC7C,MAAM0D,KAAAA,GAAQR,KAAKE,QAAQ,CAACpD,KAAKkD,IAAAA,CAAKJ,IAAI,CAACW,UAAAA,EAAY,QAAA,CAAA,CAAA;IAEvD,MAAME,OAAAA,GAAU,MAAMC,iBAAAA,CAAkB;AAAE5D,QAAAA,GAAAA;AAAKC,QAAAA,MAAAA;AAAQwD,QAAAA,UAAAA;QAAYtD,MAAAA,EAAQE;AAAe,KAAA,CAAA;AAE1FJ,IAAAA,MAAAA,CAAO0C,KAAK,CAAC,iBAAA,EAAmBI,EAAAA,CAAGC,GAAG,EAAEW,OAAAA,CAAAA;AAExC,IAAA,MAAME,mBAAmBC,wBAAAA,CAAyBH,OAAAA,CAAAA;AAElD1D,IAAAA,MAAAA,CAAO0C,KAAK,CAAC,yBAAA,EAA2BI,EAAAA,CAAGC,GAAG,EAAEa,gBAAAA,CAAAA;IAEhD,MAAME,MAAAA,GAASC,YAAAA,CAAaC,UAAU,CAAC;QAAEf,IAAAA,EAAMlD;KAAI,CAAA,IAAMF,oBAAAA;IAEzD,MAAMoE,cAAAA,GAAiB,MAAMC,eAAAA,CAAgB;AAAE5D,QAAAA,MAAAA;AAAQkD,QAAAA;AAAW,KAAA,CAAA;AAElE,IAAA,MAAMW,WAAW/D,cAAAA,CAAeI,MAAM,CAACK,GAAG,CAAC,UAAA,EAAYuD,SAAAA,CAAAA;AAEvD,IAAA,MAAM,EAAEC,OAAAA,GAAU,MAAM,EAAE,GAAGC,aAAa,GAAGnE,OAAAA;AAE7C,IAAA,MAAMoE,YAAAA,GAAe;AACnBjE,QAAAA,MAAAA;AACAS,QAAAA,SAAAA;QACAyD,QAAAA,EAAUrD,eAAAA;AACVkD,QAAAA,OAAAA;AACAJ,QAAAA,cAAAA;AACAlE,QAAAA,GAAAA;AACAQ,QAAAA,OAAAA;AACAyC,QAAAA,QAAAA;AACAS,QAAAA,KAAAA;AACA/B,QAAAA,GAAAA;AACAyC,QAAAA,QAAAA;AACAnE,QAAAA,MAAAA;QACAG,OAAAA,EAASmE,WAAAA;QACTZ,OAAAA,EAASE,gBAAAA;AACTJ,QAAAA,UAAAA;QACAtD,MAAAA,EAAQE,cAAAA;AACR0D,QAAAA,MAAAA;AACA7D,QAAAA;AACF,KAAA;IAEA,OAAOsE,YAAAA;AACT;;;;"}
1
+ {"version":3,"file":"create-build-context.mjs","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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"}
@@ -5,6 +5,9 @@ var config = require('./config.js');
5
5
  const build = async (ctx)=>{
6
6
  const config$1 = await config.resolveProductionConfig(ctx);
7
7
  const finalConfig = await config.mergeConfigWithUserConfig(config$1, ctx);
8
+ // Imported dynamically so this file's CJS build resolves Vite's ESM Node API instead of
9
+ // its CJS entry, which emits "The CJS build of Vite's Node API is deprecated".
10
+ // https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated
8
11
  const { build: viteBuild } = await import('vite');
9
12
  ctx.logger.debug('Vite config', finalConfig);
10
13
  await viteBuild(finalConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sources":["../../../../src/node/vite/build.ts"],"sourcesContent":["import { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n const { build: viteBuild } = await import('vite');\n\n ctx.logger.debug('Vite config', finalConfig);\n\n await viteBuild(finalConfig);\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","viteBuild","logger","debug"],"mappings":";;;;AAIA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,QAAAA,GAAS,MAAMC,8BAAAA,CAAwBF,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,gCAAAA,CAA0BH,QAAAA,EAAQD,GAAAA,CAAAA;AAE5D,IAAA,MAAM,EAAED,KAAAA,EAAOM,SAAS,EAAE,GAAG,MAAM,OAAO,MAAA,CAAA;AAE1CL,IAAAA,GAAAA,CAAIM,MAAM,CAACC,KAAK,CAAC,aAAA,EAAeJ,WAAAA,CAAAA;AAEhC,IAAA,MAAME,SAAAA,CAAUF,WAAAA,CAAAA;AAClB;;;;"}
1
+ {"version":3,"file":"build.js","sources":["../../../../src/node/vite/build.ts"],"sourcesContent":["import { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n // Imported dynamically so this file's CJS build resolves Vite's ESM Node API instead of\n // its CJS entry, which emits \"The CJS build of Vite's Node API is deprecated\".\n // https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated\n const { build: viteBuild } = await import('vite');\n\n ctx.logger.debug('Vite config', finalConfig);\n\n await viteBuild(finalConfig);\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","viteBuild","logger","debug"],"mappings":";;;;AAIA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,QAAAA,GAAS,MAAMC,8BAAAA,CAAwBF,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,gCAAAA,CAA0BH,QAAAA,EAAQD,GAAAA,CAAAA;;;;AAK5D,IAAA,MAAM,EAAED,KAAAA,EAAOM,SAAS,EAAE,GAAG,MAAM,OAAO,MAAA,CAAA;AAE1CL,IAAAA,GAAAA,CAAIM,MAAM,CAACC,KAAK,CAAC,aAAA,EAAeJ,WAAAA,CAAAA;AAEhC,IAAA,MAAME,SAAAA,CAAUF,WAAAA,CAAAA;AAClB;;;;"}
@@ -3,6 +3,9 @@ import { resolveProductionConfig, mergeConfigWithUserConfig } from './config.mjs
3
3
  const build = async (ctx)=>{
4
4
  const config = await resolveProductionConfig(ctx);
5
5
  const finalConfig = await mergeConfigWithUserConfig(config, ctx);
6
+ // Imported dynamically so this file's CJS build resolves Vite's ESM Node API instead of
7
+ // its CJS entry, which emits "The CJS build of Vite's Node API is deprecated".
8
+ // https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated
6
9
  const { build: viteBuild } = await import('vite');
7
10
  ctx.logger.debug('Vite config', finalConfig);
8
11
  await viteBuild(finalConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"build.mjs","sources":["../../../../src/node/vite/build.ts"],"sourcesContent":["import { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n const { build: viteBuild } = await import('vite');\n\n ctx.logger.debug('Vite config', finalConfig);\n\n await viteBuild(finalConfig);\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","viteBuild","logger","debug"],"mappings":";;AAIA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,MAAAA,GAAS,MAAMC,uBAAAA,CAAwBF,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,yBAAAA,CAA0BH,MAAAA,EAAQD,GAAAA,CAAAA;AAE5D,IAAA,MAAM,EAAED,KAAAA,EAAOM,SAAS,EAAE,GAAG,MAAM,OAAO,MAAA,CAAA;AAE1CL,IAAAA,GAAAA,CAAIM,MAAM,CAACC,KAAK,CAAC,aAAA,EAAeJ,WAAAA,CAAAA;AAEhC,IAAA,MAAME,SAAAA,CAAUF,WAAAA,CAAAA;AAClB;;;;"}
1
+ {"version":3,"file":"build.mjs","sources":["../../../../src/node/vite/build.ts"],"sourcesContent":["import { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n // Imported dynamically so this file's CJS build resolves Vite's ESM Node API instead of\n // its CJS entry, which emits \"The CJS build of Vite's Node API is deprecated\".\n // https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated\n const { build: viteBuild } = await import('vite');\n\n ctx.logger.debug('Vite config', finalConfig);\n\n await viteBuild(finalConfig);\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","viteBuild","logger","debug"],"mappings":";;AAIA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,MAAAA,GAAS,MAAMC,uBAAAA,CAAwBF,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,yBAAAA,CAA0BH,MAAAA,EAAQD,GAAAA,CAAAA;;;;AAK5D,IAAA,MAAM,EAAED,KAAAA,EAAOM,SAAS,EAAE,GAAG,MAAM,OAAO,MAAA,CAAA;AAE1CL,IAAAA,GAAAA,CAAIM,MAAM,CAACC,KAAK,CAAC,aAAA,EAAeJ,WAAAA,CAAAA;AAEhC,IAAA,MAAME,SAAAA,CAAUF,WAAAA,CAAAA;AAClB;;;;"}
@@ -1,23 +1,30 @@
1
1
  'use strict';
2
2
 
3
- var react = require('@vitejs/plugin-react-swc');
4
3
  var config = require('../core/config.js');
5
4
  var adminViteAliasModules = require('../core/admin-vite-alias-modules.js');
6
5
  var adminViteAliases = require('../core/admin-vite-aliases.js');
6
+ var adminViteOptimizeExclude = require('../core/admin-vite-optimize-exclude.js');
7
7
  var linkedPackages = require('../core/linked-packages.js');
8
8
  var monorepo = require('../core/monorepo.js');
9
9
  var aliases = require('../core/aliases.js');
10
10
  var plugins = require('./plugins.js');
11
11
 
12
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
-
14
- var react__default = /*#__PURE__*/_interopDefault(react);
15
-
16
12
  const resolveBaseConfig = async (ctx)=>{
17
13
  const { default: browserslistToEsbuild } = await import('browserslist-to-esbuild');
18
14
  const target = browserslistToEsbuild(ctx.target);
19
15
  const isMonorepoExampleApp = ctx.strapi.internal_config?.uuid === 'getstarted';
20
16
  const designSystemLinked = linkedPackages.isDesignSystemLinked();
17
+ const pluginOptimizeDepsExclude = await adminViteOptimizeExclude.collectAdminOptimizeDepsExclude(ctx.cwd, ctx.plugins);
18
+ const optimizeDepsExclude = [
19
+ ...designSystemLinked ? [
20
+ '@strapi/design-system'
21
+ ] : [],
22
+ ...pluginOptimizeDepsExclude
23
+ ];
24
+ // Imported dynamically so this file's CJS build resolves Vite's ESM Node API instead of
25
+ // its CJS entry, which emits "The CJS build of Vite's Node API is deprecated".
26
+ // https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated
27
+ const { default: react } = await import('@vitejs/plugin-react-swc');
21
28
  return {
22
29
  root: ctx.cwd,
23
30
  base: ctx.basePath,
@@ -34,12 +41,14 @@ const resolveBaseConfig = async (ctx)=>{
34
41
  },
35
42
  envPrefix: 'STRAPI_ADMIN_',
36
43
  optimizeDeps: {
44
+ // Contract (#26964, #26944, #27014):
45
+ // - CJS packages imported by @strapi/admin MUST be in optimizeDeps.include (invariant, lodash, …).
46
+ // - The admin entry host (@strapi/strapi) MUST NOT be in optimizeDeps.exclude.
37
47
  // When design-system is linked (portal:, file:, yarn link), exclude from pre-bundling
38
- // so changes are reflected without clearing node_modules/.strapi/vite cache
39
- ...designSystemLinked && {
40
- exclude: [
41
- '@strapi/design-system'
42
- ]
48
+ // so changes are reflected without clearing node_modules/.strapi/vite cache.
49
+ // Also skip pre-built ESM plugin UI libraries with React peers (see collectAdminOptimizeDepsExclude).
50
+ ...optimizeDepsExclude.length > 0 && {
51
+ exclude: optimizeDepsExclude
43
52
  },
44
53
  include: [
45
54
  // pre-bundle React dependencies to avoid React duplicates,
@@ -62,12 +71,21 @@ const resolveBaseConfig = async (ctx)=>{
62
71
  '@strapi/design-system'
63
72
  ] : [],
64
73
  '@radix-ui/react-tooltip',
65
- // Pre-bundle lodash: design-system uses named imports (e.g. assignWith) but lodash
66
- // is CommonJS-only; pre-bundling converts it to ESM for the browser
74
+ // CJS-only; required for @strapi/admin in dev (#26944, #26964, #27014).
67
75
  'lodash',
68
- // Pre-bundle prismjs so plugin chunks get a valid ESM namespace (prismjs is UMD and can
69
- // otherwise expose an empty object when bundled, causing "Prism is not defined" in admin).
76
+ 'invariant',
77
+ // UMD; without pre-bundling plugin chunks get empty namespace "Prism is not defined" (#26964).
70
78
  'prismjs',
79
+ // Do NOT add `prismjs/components/*.js` to include. #26978 prebundled every language for
80
+ // all apps; combined with #27014's optimizeDeps contract, Vite evaluates those chunks in
81
+ // reverse import order so parents (e.g. basic before vbnet) load too late →
82
+ // `Cannot set properties of undefined (setting 'comment')` and a blank admin in develop.
83
+ // Keep `prismjs` only; let language components load as normal ESM side-effect imports.
84
+ // CodeMirror must be a single instance across design-system, lang-json and uiw or the
85
+ // JSON custom field crashes on instanceof checks. Pre-bundle for every build — dev and
86
+ // production — not only monorepo examples. Use the resolvable subset so include stays in
87
+ // lockstep with resolve.alias (an unresolvable singleton must not be forced into pre-bundling).
88
+ ...adminViteAliases.getResolvableSingletonModules(),
71
89
  /**
72
90
  * Pre-bundle other dependencies that would otherwise cause a page reload when imported.
73
91
  * See "performance" section: https://vite.dev/guide/dep-pre-bundling.html#the-why
@@ -113,7 +131,6 @@ const resolveBaseConfig = async (ctx)=>{
113
131
  'markdown-it-mark',
114
132
  'markdown-it-sub',
115
133
  'markdown-it-sup',
116
- 'prismjs/components/*.js',
117
134
  'react-colorful',
118
135
  'react-dnd-html5-backend',
119
136
  'react-window',
@@ -138,7 +155,7 @@ const resolveBaseConfig = async (ctx)=>{
138
155
  alias: adminViteAliases.buildAdminViteResolveAliases()
139
156
  },
140
157
  plugins: [
141
- react__default.default(),
158
+ react(),
142
159
  plugins.buildFilesPlugin(ctx)
143
160
  ]
144
161
  };