@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.
- package/dist/cli/commands/export/action.d.ts +3 -0
- package/dist/cli/commands/export/action.d.ts.map +1 -1
- package/dist/cli/commands/export/command.d.ts.map +1 -1
- package/dist/cli/commands/import/action.d.ts +3 -0
- package/dist/cli/commands/import/action.d.ts.map +1 -1
- package/dist/cli/commands/import/command.d.ts.map +1 -1
- package/dist/cli/commands/transfer/action.d.ts +3 -0
- package/dist/cli/commands/transfer/action.d.ts.map +1 -1
- package/dist/cli/commands/transfer/command.d.ts.map +1 -1
- package/dist/cli/utils/commander.d.ts +1 -1
- package/dist/cli/utils/commander.d.ts.map +1 -1
- package/dist/cli/utils/data-transfer.d.ts +56 -3
- package/dist/cli/utils/data-transfer.d.ts.map +1 -1
- package/dist/node/core/admin-vite-alias-modules.d.ts +9 -4
- package/dist/node/core/admin-vite-alias-modules.d.ts.map +1 -1
- package/dist/node/core/admin-vite-aliases.d.ts +22 -1
- package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
- package/dist/node/core/admin-vite-optimize-exclude.d.ts +38 -0
- package/dist/node/core/admin-vite-optimize-exclude.d.ts.map +1 -0
- package/dist/node/core/admin-vite-singleton-modules.d.ts +14 -0
- package/dist/node/core/admin-vite-singleton-modules.d.ts.map +1 -0
- package/dist/node/core/dependencies.d.ts.map +1 -1
- package/dist/node/core/resolve-module.d.ts +14 -2
- package/dist/node/core/resolve-module.d.ts.map +1 -1
- package/dist/node/create-build-context.d.ts.map +1 -1
- package/dist/node/vite/build.d.ts.map +1 -1
- package/dist/node/vite/config.d.ts.map +1 -1
- package/dist/node/vite/watch.d.ts.map +1 -1
- package/dist/node/webpack/config.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/export/action.js +10 -16
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +11 -17
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/export/command.js +1 -1
- package/dist/src/cli/commands/export/command.js.map +1 -1
- package/dist/src/cli/commands/export/command.mjs +2 -2
- package/dist/src/cli/commands/export/command.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js +11 -15
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +12 -16
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/command.js +1 -1
- package/dist/src/cli/commands/import/command.js.map +1 -1
- package/dist/src/cli/commands/import/command.mjs +2 -2
- package/dist/src/cli/commands/import/command.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/action.js +10 -16
- package/dist/src/cli/commands/transfer/action.js.map +1 -1
- package/dist/src/cli/commands/transfer/action.mjs +11 -17
- package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/command.js +1 -1
- package/dist/src/cli/commands/transfer/command.js.map +1 -1
- package/dist/src/cli/commands/transfer/command.mjs +2 -2
- package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js +166 -4
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs +155 -6
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-alias-modules.js +13 -2
- package/dist/src/node/core/admin-vite-alias-modules.js.map +1 -1
- package/dist/src/node/core/admin-vite-alias-modules.mjs +13 -3
- package/dist/src/node/core/admin-vite-alias-modules.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-aliases.js +44 -5
- package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
- package/dist/src/node/core/admin-vite-aliases.mjs +44 -7
- package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-optimize-exclude.js +162 -0
- package/dist/src/node/core/admin-vite-optimize-exclude.js.map +1 -0
- package/dist/src/node/core/admin-vite-optimize-exclude.mjs +149 -0
- package/dist/src/node/core/admin-vite-optimize-exclude.mjs.map +1 -0
- package/dist/src/node/core/admin-vite-singleton-modules.js +24 -0
- package/dist/src/node/core/admin-vite-singleton-modules.js.map +1 -0
- package/dist/src/node/core/admin-vite-singleton-modules.mjs +22 -0
- package/dist/src/node/core/admin-vite-singleton-modules.mjs.map +1 -0
- package/dist/src/node/core/dependencies.js +3 -2
- package/dist/src/node/core/dependencies.js.map +1 -1
- package/dist/src/node/core/dependencies.mjs +3 -2
- package/dist/src/node/core/dependencies.mjs.map +1 -1
- package/dist/src/node/core/resolve-module.js +25 -12
- package/dist/src/node/core/resolve-module.js.map +1 -1
- package/dist/src/node/core/resolve-module.mjs +25 -13
- package/dist/src/node/core/resolve-module.mjs.map +1 -1
- package/dist/src/node/create-build-context.js +6 -0
- package/dist/src/node/create-build-context.js.map +1 -1
- package/dist/src/node/create-build-context.mjs +6 -0
- package/dist/src/node/create-build-context.mjs.map +1 -1
- package/dist/src/node/vite/build.js +3 -0
- package/dist/src/node/vite/build.js.map +1 -1
- package/dist/src/node/vite/build.mjs +3 -0
- package/dist/src/node/vite/build.mjs.map +1 -1
- package/dist/src/node/vite/config.js +33 -16
- package/dist/src/node/vite/config.js.map +1 -1
- package/dist/src/node/vite/config.mjs +33 -12
- package/dist/src/node/vite/config.mjs.map +1 -1
- package/dist/src/node/vite/watch.js +3 -0
- package/dist/src/node/vite/watch.js.map +1 -1
- package/dist/src/node/vite/watch.mjs +3 -0
- package/dist/src/node/vite/watch.mjs.map +1 -1
- package/dist/src/node/webpack/config.js +5 -0
- package/dist/src/node/webpack/config.js.map +1 -1
- package/dist/src/node/webpack/config.mjs +5 -0
- package/dist/src/node/webpack/config.mjs.map +1 -1
- package/package.json +25 -24
- package/dist/cli/commands/plugin/init/files/typescript.d.ts +0 -22
- package/dist/cli/commands/plugin/init/files/typescript.d.ts.map +0 -1
- package/dist/test/mocks/inquirer.d.ts +0 -10
- package/dist/test/mocks/inquirer.d.ts.map +0 -1
|
@@ -1,14 +1,51 @@
|
|
|
1
1
|
import { ADMIN_VITE_ALIAS_MODULES } from './admin-vite-alias-modules.mjs';
|
|
2
|
-
import { getModulePath } from './resolve-module.mjs';
|
|
2
|
+
import { getModulePathFrom, getModulePath } from './resolve-module.mjs';
|
|
3
|
+
import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules.mjs';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
|
-
* Vite resolve.alias entries for the admin bundle
|
|
6
|
+
* Vite resolve.alias entries for the admin bundle.
|
|
7
|
+
*
|
|
8
|
+
* Admin alias modules resolve from @strapi/admin's closure. CodeMirror singletons resolve
|
|
9
|
+
* from @strapi/design-system's closure (the real consumer), tolerantly: optional/transitive
|
|
10
|
+
* CodeMirror packages that cannot be resolved are skipped rather than crashing the build
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
*/ const buildAdminViteResolveAliases = ()=>Object.fromEntries([
|
|
14
|
+
...ADMIN_VITE_ALIAS_MODULES.map((mod)=>[
|
|
15
|
+
mod,
|
|
16
|
+
getModulePath(mod)
|
|
17
|
+
]),
|
|
18
|
+
...buildSingletonAliasEntries()
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Resolve the CodeMirror singleton aliases from @strapi/design-system's closure, skipping any
|
|
22
|
+
* package that cannot be resolved (e.g. optional or transitive CodeMirror packages not installed).
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/ const buildSingletonAliasEntries = ()=>{
|
|
26
|
+
const entries = [];
|
|
27
|
+
for (const mod of ADMIN_VITE_SINGLETON_MODULES){
|
|
28
|
+
try {
|
|
29
|
+
entries.push([
|
|
30
|
+
mod,
|
|
31
|
+
getModulePathFrom('@strapi/design-system', mod)
|
|
32
|
+
]);
|
|
33
|
+
} catch {
|
|
34
|
+
// Optional/transitive CodeMirror package not resolvable here — skip it rather than
|
|
35
|
+
// throwing, so a missing singleton never breaks the admin build.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return entries;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Names of the CodeMirror singletons that actually resolve from @strapi/design-system's closure.
|
|
42
|
+
*
|
|
43
|
+
* Mirrors buildSingletonAliasEntries so optimizeDeps.include stays in lockstep with resolve.alias:
|
|
44
|
+
* a singleton that cannot be aliased must not be forced into pre-bundling either, or Vite chokes
|
|
45
|
+
* on an unresolvable optimizeDeps.include entry.
|
|
6
46
|
*
|
|
7
47
|
* @internal
|
|
8
|
-
*/ const
|
|
9
|
-
mod,
|
|
10
|
-
getModulePath(mod)
|
|
11
|
-
]));
|
|
48
|
+
*/ const getResolvableSingletonModules = ()=>buildSingletonAliasEntries().map(([mod])=>mod);
|
|
12
49
|
|
|
13
|
-
export { buildAdminViteResolveAliases };
|
|
50
|
+
export { buildAdminViteResolveAliases, buildSingletonAliasEntries, getResolvableSingletonModules };
|
|
14
51
|
//# sourceMappingURL=admin-vite-aliases.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-vite-aliases.mjs","sources":["../../../../src/node/core/admin-vite-aliases.ts"],"sourcesContent":["import { ADMIN_VITE_ALIAS_MODULES } from './admin-vite-alias-modules';\nimport { getModulePath } from './resolve-module';\n\n/**\n * Vite resolve.alias entries for the admin bundle
|
|
1
|
+
{"version":3,"file":"admin-vite-aliases.mjs","sources":["../../../../src/node/core/admin-vite-aliases.ts"],"sourcesContent":["import { ADMIN_VITE_ALIAS_MODULES, ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-alias-modules';\nimport { getModulePath, getModulePathFrom } from './resolve-module';\n\n/**\n * Vite resolve.alias entries for the admin bundle.\n *\n * Admin alias modules resolve from @strapi/admin's closure. CodeMirror singletons resolve\n * from @strapi/design-system's closure (the real consumer), tolerantly: optional/transitive\n * CodeMirror packages that cannot be resolved are skipped rather than crashing the build\n *\n * @internal\n */\nexport const buildAdminViteResolveAliases = (): Record<string, string> =>\n Object.fromEntries([\n ...ADMIN_VITE_ALIAS_MODULES.map((mod) => [mod, getModulePath(mod)] as const),\n ...buildSingletonAliasEntries(),\n ]);\n\n/**\n * Resolve the CodeMirror singleton aliases from @strapi/design-system's closure, skipping any\n * package that cannot be resolved (e.g. optional or transitive CodeMirror packages not installed).\n *\n * @internal\n */\nexport const buildSingletonAliasEntries = (): Array<readonly [string, string]> => {\n const entries: Array<readonly [string, string]> = [];\n\n for (const mod of ADMIN_VITE_SINGLETON_MODULES) {\n try {\n entries.push([mod, getModulePathFrom('@strapi/design-system', mod)] as const);\n } catch {\n // Optional/transitive CodeMirror package not resolvable here — skip it rather than\n // throwing, so a missing singleton never breaks the admin build.\n }\n }\n\n return entries;\n};\n\n/**\n * Names of the CodeMirror singletons that actually resolve from @strapi/design-system's closure.\n *\n * Mirrors buildSingletonAliasEntries so optimizeDeps.include stays in lockstep with resolve.alias:\n * a singleton that cannot be aliased must not be forced into pre-bundling either, or Vite chokes\n * on an unresolvable optimizeDeps.include entry.\n *\n * @internal\n */\nexport const getResolvableSingletonModules = (): string[] =>\n buildSingletonAliasEntries().map(([mod]) => mod);\n"],"names":["buildAdminViteResolveAliases","Object","fromEntries","ADMIN_VITE_ALIAS_MODULES","map","mod","getModulePath","buildSingletonAliasEntries","entries","ADMIN_VITE_SINGLETON_MODULES","push","getModulePathFrom","getResolvableSingletonModules"],"mappings":";;;;AAGA;;;;;;;;AAQC,IACM,MAAMA,4BAAAA,GAA+B,IAC1CC,MAAAA,CAAOC,WAAW,CAAC;WACdC,wBAAAA,CAAyBC,GAAG,CAAC,CAACC,GAAAA,GAAQ;AAACA,gBAAAA,GAAAA;gBAAKC,aAAAA,CAAcD,GAAAA;AAAK,aAAA,CAAA;AAC/DE,QAAAA,GAAAA,0BAAAA;KACJ;AAEH;;;;;UAMaA,0BAAAA,GAA6B,IAAA;AACxC,IAAA,MAAMC,UAA4C,EAAE;IAEpD,KAAK,MAAMH,OAAOI,4BAAAA,CAA8B;QAC9C,IAAI;AACFD,YAAAA,OAAAA,CAAQE,IAAI,CAAC;AAACL,gBAAAA,GAAAA;AAAKM,gBAAAA,iBAAAA,CAAkB,uBAAA,EAAyBN,GAAAA;AAAK,aAAA,CAAA;AACrE,QAAA,CAAA,CAAE,OAAM;;;AAGR,QAAA;AACF,IAAA;IAEA,OAAOG,OAAAA;AACT;AAEA;;;;;;;;IASO,MAAMI,6BAAAA,GAAgC,IAC3CL,0BAAAA,EAAAA,CAA6BH,GAAG,CAAC,CAAC,CAACC,GAAAA,CAAI,GAAKA,GAAAA;;;;"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var fs = require('node:fs/promises');
|
|
5
|
+
var readPkgUp = require('read-pkg-up');
|
|
6
|
+
var adminViteAliasModules = require('./admin-vite-alias-modules.js');
|
|
7
|
+
var dependencies = require('./dependencies.js');
|
|
8
|
+
var adminViteSingletonModules = require('./admin-vite-singleton-modules.js');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
13
|
+
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
14
|
+
var readPkgUp__default = /*#__PURE__*/_interopDefault(readPkgUp);
|
|
15
|
+
|
|
16
|
+
const REACT_PEER_DEPENDENCIES = new Set([
|
|
17
|
+
'react',
|
|
18
|
+
'react-dom'
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Packages explicitly pre-bundled or aliased for the admin singleton contract.
|
|
22
|
+
* Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.
|
|
23
|
+
*
|
|
24
|
+
* The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).
|
|
25
|
+
* CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include
|
|
26
|
+
* (see vite/config.ts — #26964, #26944, #27014).
|
|
27
|
+
* The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the
|
|
28
|
+
* exclude heuristic but must stay pre-bundled so the admin keeps a single instance
|
|
29
|
+
*/ const PINNED_OPTIMIZE_MODULES = new Set([
|
|
30
|
+
...adminViteAliasModules.ADMIN_VITE_ALIAS_MODULES,
|
|
31
|
+
...adminViteSingletonModules.ADMIN_VITE_SINGLETON_MODULES,
|
|
32
|
+
'@strapi/strapi'
|
|
33
|
+
]);
|
|
34
|
+
const isOfficialStrapiPackage = (name)=>name.startsWith('@strapi/');
|
|
35
|
+
const getRootPackageExport = (pkg)=>{
|
|
36
|
+
const exportsField = pkg.exports;
|
|
37
|
+
if (!exportsField || typeof exportsField === 'string') {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return exportsField['.'];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* @internal exported for tests
|
|
44
|
+
*/ const isEsmPackage = (pkg)=>{
|
|
45
|
+
if (pkg.type === 'module') {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
const rootExport = getRootPackageExport(pkg);
|
|
49
|
+
return typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport && typeof rootExport.import === 'string';
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* @internal exported for tests
|
|
53
|
+
*/ const hasReactPeerDependency = (pkg)=>Object.keys(pkg.peerDependencies ?? {}).some((name)=>REACT_PEER_DEPENDENCIES.has(name));
|
|
54
|
+
/**
|
|
55
|
+
* Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than
|
|
56
|
+
* source packages like react-intl that still benefit from Vite's dep optimizer.
|
|
57
|
+
*
|
|
58
|
+
* @internal exported for tests
|
|
59
|
+
*/ const shipsPreBuiltDist = (pkg)=>{
|
|
60
|
+
const rootExport = getRootPackageExport(pkg);
|
|
61
|
+
const exportImport = typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport ? rootExport.import : undefined;
|
|
62
|
+
const entryPaths = [
|
|
63
|
+
pkg.module,
|
|
64
|
+
pkg.main,
|
|
65
|
+
exportImport
|
|
66
|
+
].filter((entry)=>typeof entry === 'string');
|
|
67
|
+
if (entryPaths.some((entry)=>entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/'))) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
return Array.isArray(pkg.files) && pkg.files.some((file)=>file === 'dist' || file.startsWith('dist/'));
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* @internal exported for tests
|
|
74
|
+
*/ const shouldExcludeFromOptimizeDeps = (pkg)=>hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);
|
|
75
|
+
/**
|
|
76
|
+
* @internal exported for tests
|
|
77
|
+
*/ const getPluginPackageName = (modulePath)=>{
|
|
78
|
+
if (modulePath.startsWith('@')) {
|
|
79
|
+
const [scope, name] = modulePath.split('/');
|
|
80
|
+
return `${scope}/${name}`;
|
|
81
|
+
}
|
|
82
|
+
return modulePath.split('/')[0] ?? modulePath;
|
|
83
|
+
};
|
|
84
|
+
const collectDependencyNames = (pkg)=>{
|
|
85
|
+
const names = new Set();
|
|
86
|
+
for (const section of [
|
|
87
|
+
pkg.dependencies,
|
|
88
|
+
pkg.devDependencies
|
|
89
|
+
]){
|
|
90
|
+
if (section) {
|
|
91
|
+
for (const name of Object.keys(section)){
|
|
92
|
+
names.add(name);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return [
|
|
97
|
+
...names
|
|
98
|
+
];
|
|
99
|
+
};
|
|
100
|
+
const getPluginPackageJson = async (plugin, cwd)=>{
|
|
101
|
+
if (plugin.type === 'local' && plugin.path) {
|
|
102
|
+
try {
|
|
103
|
+
const content = await fs__default.default.readFile(path__default.default.join(plugin.path, 'package.json'), 'utf8');
|
|
104
|
+
return JSON.parse(content);
|
|
105
|
+
} catch {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return dependencies.getModule(getPluginPackageName(plugin.modulePath), cwd);
|
|
110
|
+
};
|
|
111
|
+
const loadAppPackageJson = async (cwd)=>{
|
|
112
|
+
const result = await readPkgUp__default.default({
|
|
113
|
+
cwd
|
|
114
|
+
});
|
|
115
|
+
return result?.packageJson ?? null;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with
|
|
119
|
+
* Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through
|
|
120
|
+
* the admin resolve aliases instead of being re-bundled by Vite.
|
|
121
|
+
*
|
|
122
|
+
* Scans app and plugin dependency trees (#26944). Official @strapi/* packages and pinned
|
|
123
|
+
* singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on
|
|
124
|
+
* the optimizeDeps.include path (#26944, #27014).
|
|
125
|
+
*
|
|
126
|
+
* @internal
|
|
127
|
+
*/ const collectAdminOptimizeDepsExclude = async (cwd, plugins)=>{
|
|
128
|
+
const candidateNames = new Set();
|
|
129
|
+
const appPkg = await loadAppPackageJson(cwd);
|
|
130
|
+
if (appPkg) {
|
|
131
|
+
for (const name of collectDependencyNames(appPkg)){
|
|
132
|
+
candidateNames.add(name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (const plugin of plugins){
|
|
136
|
+
const pluginPkg = await getPluginPackageJson(plugin, cwd);
|
|
137
|
+
if (pluginPkg) {
|
|
138
|
+
for (const name of collectDependencyNames(pluginPkg)){
|
|
139
|
+
candidateNames.add(name);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const exclude = [];
|
|
144
|
+
for (const name of candidateNames){
|
|
145
|
+
if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const pkg = await dependencies.getModule(name, cwd);
|
|
149
|
+
if (pkg && shouldExcludeFromOptimizeDeps(pkg)) {
|
|
150
|
+
exclude.push(name);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return exclude.sort();
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
exports.collectAdminOptimizeDepsExclude = collectAdminOptimizeDepsExclude;
|
|
157
|
+
exports.getPluginPackageName = getPluginPackageName;
|
|
158
|
+
exports.hasReactPeerDependency = hasReactPeerDependency;
|
|
159
|
+
exports.isEsmPackage = isEsmPackage;
|
|
160
|
+
exports.shipsPreBuiltDist = shipsPreBuiltDist;
|
|
161
|
+
exports.shouldExcludeFromOptimizeDeps = shouldExcludeFromOptimizeDeps;
|
|
162
|
+
//# sourceMappingURL=admin-vite-optimize-exclude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-vite-optimize-exclude.js","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":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import readPkgUp from 'read-pkg-up';
|
|
4
|
+
import { ADMIN_VITE_ALIAS_MODULES } from './admin-vite-alias-modules.mjs';
|
|
5
|
+
import { getModule } from './dependencies.mjs';
|
|
6
|
+
import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules.mjs';
|
|
7
|
+
|
|
8
|
+
const REACT_PEER_DEPENDENCIES = new Set([
|
|
9
|
+
'react',
|
|
10
|
+
'react-dom'
|
|
11
|
+
]);
|
|
12
|
+
/**
|
|
13
|
+
* Packages explicitly pre-bundled or aliased for the admin singleton contract.
|
|
14
|
+
* Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.
|
|
15
|
+
*
|
|
16
|
+
* The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).
|
|
17
|
+
* CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include
|
|
18
|
+
* (see vite/config.ts — #26964, #26944, #27014).
|
|
19
|
+
* The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the
|
|
20
|
+
* exclude heuristic but must stay pre-bundled so the admin keeps a single instance
|
|
21
|
+
*/ const PINNED_OPTIMIZE_MODULES = new Set([
|
|
22
|
+
...ADMIN_VITE_ALIAS_MODULES,
|
|
23
|
+
...ADMIN_VITE_SINGLETON_MODULES,
|
|
24
|
+
'@strapi/strapi'
|
|
25
|
+
]);
|
|
26
|
+
const isOfficialStrapiPackage = (name)=>name.startsWith('@strapi/');
|
|
27
|
+
const getRootPackageExport = (pkg)=>{
|
|
28
|
+
const exportsField = pkg.exports;
|
|
29
|
+
if (!exportsField || typeof exportsField === 'string') {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return exportsField['.'];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* @internal exported for tests
|
|
36
|
+
*/ const isEsmPackage = (pkg)=>{
|
|
37
|
+
if (pkg.type === 'module') {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const rootExport = getRootPackageExport(pkg);
|
|
41
|
+
return typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport && typeof rootExport.import === 'string';
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* @internal exported for tests
|
|
45
|
+
*/ const hasReactPeerDependency = (pkg)=>Object.keys(pkg.peerDependencies ?? {}).some((name)=>REACT_PEER_DEPENDENCIES.has(name));
|
|
46
|
+
/**
|
|
47
|
+
* Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than
|
|
48
|
+
* source packages like react-intl that still benefit from Vite's dep optimizer.
|
|
49
|
+
*
|
|
50
|
+
* @internal exported for tests
|
|
51
|
+
*/ const shipsPreBuiltDist = (pkg)=>{
|
|
52
|
+
const rootExport = getRootPackageExport(pkg);
|
|
53
|
+
const exportImport = typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport ? rootExport.import : undefined;
|
|
54
|
+
const entryPaths = [
|
|
55
|
+
pkg.module,
|
|
56
|
+
pkg.main,
|
|
57
|
+
exportImport
|
|
58
|
+
].filter((entry)=>typeof entry === 'string');
|
|
59
|
+
if (entryPaths.some((entry)=>entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/'))) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return Array.isArray(pkg.files) && pkg.files.some((file)=>file === 'dist' || file.startsWith('dist/'));
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* @internal exported for tests
|
|
66
|
+
*/ const shouldExcludeFromOptimizeDeps = (pkg)=>hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);
|
|
67
|
+
/**
|
|
68
|
+
* @internal exported for tests
|
|
69
|
+
*/ const getPluginPackageName = (modulePath)=>{
|
|
70
|
+
if (modulePath.startsWith('@')) {
|
|
71
|
+
const [scope, name] = modulePath.split('/');
|
|
72
|
+
return `${scope}/${name}`;
|
|
73
|
+
}
|
|
74
|
+
return modulePath.split('/')[0] ?? modulePath;
|
|
75
|
+
};
|
|
76
|
+
const collectDependencyNames = (pkg)=>{
|
|
77
|
+
const names = new Set();
|
|
78
|
+
for (const section of [
|
|
79
|
+
pkg.dependencies,
|
|
80
|
+
pkg.devDependencies
|
|
81
|
+
]){
|
|
82
|
+
if (section) {
|
|
83
|
+
for (const name of Object.keys(section)){
|
|
84
|
+
names.add(name);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return [
|
|
89
|
+
...names
|
|
90
|
+
];
|
|
91
|
+
};
|
|
92
|
+
const getPluginPackageJson = async (plugin, cwd)=>{
|
|
93
|
+
if (plugin.type === 'local' && plugin.path) {
|
|
94
|
+
try {
|
|
95
|
+
const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');
|
|
96
|
+
return JSON.parse(content);
|
|
97
|
+
} catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return getModule(getPluginPackageName(plugin.modulePath), cwd);
|
|
102
|
+
};
|
|
103
|
+
const loadAppPackageJson = async (cwd)=>{
|
|
104
|
+
const result = await readPkgUp({
|
|
105
|
+
cwd
|
|
106
|
+
});
|
|
107
|
+
return result?.packageJson ?? null;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with
|
|
111
|
+
* Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through
|
|
112
|
+
* the admin resolve aliases instead of being re-bundled by Vite.
|
|
113
|
+
*
|
|
114
|
+
* Scans app and plugin dependency trees (#26944). Official @strapi/* packages and pinned
|
|
115
|
+
* singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on
|
|
116
|
+
* the optimizeDeps.include path (#26944, #27014).
|
|
117
|
+
*
|
|
118
|
+
* @internal
|
|
119
|
+
*/ const collectAdminOptimizeDepsExclude = async (cwd, plugins)=>{
|
|
120
|
+
const candidateNames = new Set();
|
|
121
|
+
const appPkg = await loadAppPackageJson(cwd);
|
|
122
|
+
if (appPkg) {
|
|
123
|
+
for (const name of collectDependencyNames(appPkg)){
|
|
124
|
+
candidateNames.add(name);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const plugin of plugins){
|
|
128
|
+
const pluginPkg = await getPluginPackageJson(plugin, cwd);
|
|
129
|
+
if (pluginPkg) {
|
|
130
|
+
for (const name of collectDependencyNames(pluginPkg)){
|
|
131
|
+
candidateNames.add(name);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const exclude = [];
|
|
136
|
+
for (const name of candidateNames){
|
|
137
|
+
if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const pkg = await getModule(name, cwd);
|
|
141
|
+
if (pkg && shouldExcludeFromOptimizeDeps(pkg)) {
|
|
142
|
+
exclude.push(name);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return exclude.sort();
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export { collectAdminOptimizeDepsExclude, getPluginPackageName, hasReactPeerDependency, isEsmPackage, shipsPreBuiltDist, shouldExcludeFromOptimizeDeps };
|
|
149
|
+
//# sourceMappingURL=admin-vite-optimize-exclude.mjs.map
|
|
@@ -0,0 +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, 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":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
];
|