@strapi/strapi 5.56.0 → 5.58.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/build.d.ts.map +1 -1
- package/dist/cli/commands/content-types/rename-field.d.ts +13 -0
- package/dist/cli/commands/content-types/rename-field.d.ts.map +1 -0
- package/dist/cli/commands/develop.d.ts.map +1 -1
- package/dist/cli/commands/enterprise/index.d.ts +7 -0
- package/dist/cli/commands/enterprise/index.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/action.d.ts +36 -0
- package/dist/cli/commands/enterprise/install/action.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts +14 -0
- package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/constants.d.ts +7 -0
- package/dist/cli/commands/enterprise/install/constants.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/directories.d.ts +3 -0
- package/dist/cli/commands/enterprise/install/directories.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/discovery.d.ts +29 -0
- package/dist/cli/commands/enterprise/install/discovery.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/errors.d.ts +11 -0
- package/dist/cli/commands/enterprise/install/errors.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/install-packages.d.ts +11 -0
- package/dist/cli/commands/enterprise/install/install-packages.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/license.d.ts +27 -0
- package/dist/cli/commands/enterprise/install/license.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/package-manager.d.ts +17 -0
- package/dist/cli/commands/enterprise/install/package-manager.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/plugin-status.d.ts +44 -0
- package/dist/cli/commands/enterprise/install/plugin-status.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/registry-access.d.ts +55 -0
- package/dist/cli/commands/enterprise/install/registry-access.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/registry.d.ts +54 -0
- package/dist/cli/commands/enterprise/install/registry.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/selection.d.ts +62 -0
- package/dist/cli/commands/enterprise/install/selection.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/setup-links.d.ts +16 -0
- package/dist/cli/commands/enterprise/install/setup-links.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/versions.d.ts +42 -0
- package/dist/cli/commands/enterprise/install/versions.d.ts.map +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/utils/commander.d.ts.map +1 -1
- package/dist/cli/utils/helpers.d.ts +1 -1
- package/dist/cli/utils/helpers.d.ts.map +1 -1
- package/dist/node/vite/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/build.js +4 -2
- package/dist/src/cli/commands/build.js.map +1 -1
- package/dist/src/cli/commands/build.mjs +4 -2
- package/dist/src/cli/commands/build.mjs.map +1 -1
- package/dist/src/cli/commands/content-types/rename-field.js +63 -0
- package/dist/src/cli/commands/content-types/rename-field.js.map +1 -0
- package/dist/src/cli/commands/content-types/rename-field.mjs +54 -0
- package/dist/src/cli/commands/content-types/rename-field.mjs.map +1 -0
- package/dist/src/cli/commands/develop.js +4 -2
- package/dist/src/cli/commands/develop.js.map +1 -1
- package/dist/src/cli/commands/develop.mjs +4 -2
- package/dist/src/cli/commands/develop.mjs.map +1 -1
- package/dist/src/cli/commands/enterprise/index.js +17 -0
- package/dist/src/cli/commands/enterprise/index.js.map +1 -0
- package/dist/src/cli/commands/enterprise/index.mjs +15 -0
- package/dist/src/cli/commands/enterprise/index.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/action.js +253 -0
- package/dist/src/cli/commands/enterprise/install/action.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/action.mjs +244 -0
- package/dist/src/cli/commands/enterprise/install/action.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.js +117 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs +110 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/constants.js +16 -0
- package/dist/src/cli/commands/enterprise/install/constants.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/constants.mjs +9 -0
- package/dist/src/cli/commands/enterprise/install/constants.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/directories.js +23 -0
- package/dist/src/cli/commands/enterprise/install/directories.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/directories.mjs +17 -0
- package/dist/src/cli/commands/enterprise/install/directories.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/discovery.js +109 -0
- package/dist/src/cli/commands/enterprise/install/discovery.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/discovery.mjs +104 -0
- package/dist/src/cli/commands/enterprise/install/discovery.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/errors.js +26 -0
- package/dist/src/cli/commands/enterprise/install/errors.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/errors.mjs +22 -0
- package/dist/src/cli/commands/enterprise/install/errors.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.js +39 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.mjs +32 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/license.js +144 -0
- package/dist/src/cli/commands/enterprise/install/license.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/license.mjs +132 -0
- package/dist/src/cli/commands/enterprise/install/license.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.js +72 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.mjs +62 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.js +47 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.mjs +45 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.js +293 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.mjs +277 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry.js +98 -0
- package/dist/src/cli/commands/enterprise/install/registry.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry.mjs +95 -0
- package/dist/src/cli/commands/enterprise/install/registry.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/selection.js +148 -0
- package/dist/src/cli/commands/enterprise/install/selection.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/selection.mjs +141 -0
- package/dist/src/cli/commands/enterprise/install/selection.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.js +34 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.mjs +31 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/versions.js +127 -0
- package/dist/src/cli/commands/enterprise/install/versions.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/versions.mjs +107 -0
- package/dist/src/cli/commands/enterprise/install/versions.mjs.map +1 -0
- package/dist/src/cli/commands/export/action.js +4 -4
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +2 -2
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js +2 -2
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +1 -1
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/index.js +4 -0
- package/dist/src/cli/commands/index.js.map +1 -1
- package/dist/src/cli/commands/index.mjs +24 -20
- package/dist/src/cli/commands/index.mjs.map +1 -1
- package/dist/src/cli/commands/routes/list.js +2 -2
- package/dist/src/cli/commands/routes/list.js.map +1 -1
- package/dist/src/cli/commands/routes/list.mjs +1 -1
- package/dist/src/cli/commands/routes/list.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/action.js +2 -2
- package/dist/src/cli/commands/transfer/action.js.map +1 -1
- package/dist/src/cli/commands/transfer/action.mjs +1 -1
- package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
- package/dist/src/cli/utils/commander.js +1 -2
- package/dist/src/cli/utils/commander.js.map +1 -1
- package/dist/src/cli/utils/commander.mjs +1 -2
- package/dist/src/cli/utils/commander.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js +2 -2
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs +2 -2
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/cli/utils/helpers.js +6 -6
- package/dist/src/cli/utils/helpers.js.map +1 -1
- package/dist/src/cli/utils/helpers.mjs +4 -4
- package/dist/src/cli/utils/helpers.mjs.map +1 -1
- package/dist/src/node/vite/config.js +0 -1
- package/dist/src/node/vite/config.js.map +1 -1
- package/dist/src/node/vite/config.mjs +0 -1
- package/dist/src/node/vite/config.mjs.map +1 -1
- package/package.json +23 -23
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var constants = require('./constants.js');
|
|
4
|
+
var discovery = require('./discovery.js');
|
|
5
|
+
var versions = require('./versions.js');
|
|
6
|
+
|
|
7
|
+
const readSetupLink = async (appDir, packageName)=>{
|
|
8
|
+
const packageJson = await versions.readInstalledPackageJson(appDir, packageName);
|
|
9
|
+
if (!packageJson?.strapi || !discovery.declaresStrapiKind(packageJson.strapi.kind)) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const { homepage } = packageJson;
|
|
13
|
+
return {
|
|
14
|
+
packageName,
|
|
15
|
+
url: typeof homepage === 'string' && homepage.length > 0 ? homepage : constants.ENTERPRISE_PLUGINS_DOCS_URL
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
const printSetupLinks = async ({ appDir, installedPackages, logger })=>{
|
|
19
|
+
for (const { packageName, replacesInstalledVersion } of installedPackages){
|
|
20
|
+
const setupLink = await readSetupLink(appDir, packageName);
|
|
21
|
+
if (!setupLink) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (replacesInstalledVersion) {
|
|
25
|
+
logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);
|
|
26
|
+
} else {
|
|
27
|
+
logger.warn(`Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
exports.printSetupLinks = printSetupLinks;
|
|
33
|
+
exports.readSetupLink = readSetupLink;
|
|
34
|
+
//# sourceMappingURL=setup-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-links.js","sources":["../../../../../../src/cli/commands/enterprise/install/setup-links.ts"],"sourcesContent":["import type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_PLUGINS_DOCS_URL } from './constants';\nimport { declaresStrapiKind } from './discovery';\nimport { readInstalledPackageJson } from './versions';\n\nexport interface SetupLink {\n packageName: string;\n url: string;\n}\n\nexport const readSetupLink = async (\n appDir: string,\n packageName: string\n): Promise<SetupLink | undefined> => {\n const packageJson = await readInstalledPackageJson(appDir, packageName);\n\n if (!packageJson?.strapi || !declaresStrapiKind(packageJson.strapi.kind)) {\n return undefined;\n }\n\n const { homepage } = packageJson;\n\n return {\n packageName,\n url:\n typeof homepage === 'string' && homepage.length > 0 ? homepage : ENTERPRISE_PLUGINS_DOCS_URL,\n };\n};\n\nexport interface InstalledPackage {\n packageName: string;\n replacesInstalledVersion: boolean;\n}\n\nexport const printSetupLinks = async ({\n appDir,\n installedPackages,\n logger,\n}: {\n appDir: string;\n installedPackages: InstalledPackage[];\n logger: Logger;\n}): Promise<void> => {\n for (const { packageName, replacesInstalledVersion } of installedPackages) {\n const setupLink = await readSetupLink(appDir, packageName);\n\n if (!setupLink) {\n continue;\n }\n\n if (replacesInstalledVersion) {\n logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);\n } else {\n logger.warn(\n `Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`\n );\n }\n }\n};\n"],"names":["readSetupLink","appDir","packageName","packageJson","readInstalledPackageJson","strapi","declaresStrapiKind","kind","undefined","homepage","url","length","ENTERPRISE_PLUGINS_DOCS_URL","printSetupLinks","installedPackages","logger","replacesInstalledVersion","setupLink","info","warn"],"mappings":";;;;;;AAUO,MAAMA,aAAAA,GAAgB,OAC3BC,MAAAA,EACAC,WAAAA,GAAAA;IAEA,MAAMC,WAAAA,GAAc,MAAMC,iCAAAA,CAAyBH,MAAAA,EAAQC,WAAAA,CAAAA;IAE3D,IAAI,CAACC,aAAaE,MAAAA,IAAU,CAACC,6BAAmBH,WAAAA,CAAYE,MAAM,CAACE,IAAI,CAAA,EAAG;QACxE,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAM,EAAEC,QAAQ,EAAE,GAAGN,WAAAA;IAErB,OAAO;AACLD,QAAAA,WAAAA;AACAQ,QAAAA,GAAAA,EACE,OAAOD,QAAAA,KAAa,QAAA,IAAYA,SAASE,MAAM,GAAG,IAAIF,QAAAA,GAAWG;AACrE,KAAA;AACF;AAOO,MAAMC,kBAAkB,OAAO,EACpCZ,MAAM,EACNa,iBAAiB,EACjBC,MAAM,EAKP,GAAA;AACC,IAAA,KAAK,MAAM,EAAEb,WAAW,EAAEc,wBAAwB,EAAE,IAAIF,iBAAAA,CAAmB;QACzE,MAAMG,SAAAA,GAAY,MAAMjB,aAAAA,CAAcC,MAAAA,EAAQC,WAAAA,CAAAA;AAE9C,QAAA,IAAI,CAACe,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AAEA,QAAA,IAAID,wBAAAA,EAA0B;AAC5BD,YAAAA,MAAAA,CAAOG,IAAI,CAAC,CAAC,QAAQ,EAAED,SAAAA,CAAUf,WAAW,CAAC,sBAAsB,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;QACtF,CAAA,MAAO;AACLK,YAAAA,MAAAA,CAAOI,IAAI,CACT,CAAC,OAAO,EAAEF,SAAAA,CAAUf,WAAW,CAAC,gDAAgD,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;AAErG,QAAA;AACF,IAAA;AACF;;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ENTERPRISE_PLUGINS_DOCS_URL } from './constants.mjs';
|
|
2
|
+
import { declaresStrapiKind } from './discovery.mjs';
|
|
3
|
+
import { readInstalledPackageJson } from './versions.mjs';
|
|
4
|
+
|
|
5
|
+
const readSetupLink = async (appDir, packageName)=>{
|
|
6
|
+
const packageJson = await readInstalledPackageJson(appDir, packageName);
|
|
7
|
+
if (!packageJson?.strapi || !declaresStrapiKind(packageJson.strapi.kind)) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const { homepage } = packageJson;
|
|
11
|
+
return {
|
|
12
|
+
packageName,
|
|
13
|
+
url: typeof homepage === 'string' && homepage.length > 0 ? homepage : ENTERPRISE_PLUGINS_DOCS_URL
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const printSetupLinks = async ({ appDir, installedPackages, logger })=>{
|
|
17
|
+
for (const { packageName, replacesInstalledVersion } of installedPackages){
|
|
18
|
+
const setupLink = await readSetupLink(appDir, packageName);
|
|
19
|
+
if (!setupLink) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (replacesInstalledVersion) {
|
|
23
|
+
logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);
|
|
24
|
+
} else {
|
|
25
|
+
logger.warn(`Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export { printSetupLinks, readSetupLink };
|
|
31
|
+
//# sourceMappingURL=setup-links.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-links.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/setup-links.ts"],"sourcesContent":["import type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_PLUGINS_DOCS_URL } from './constants';\nimport { declaresStrapiKind } from './discovery';\nimport { readInstalledPackageJson } from './versions';\n\nexport interface SetupLink {\n packageName: string;\n url: string;\n}\n\nexport const readSetupLink = async (\n appDir: string,\n packageName: string\n): Promise<SetupLink | undefined> => {\n const packageJson = await readInstalledPackageJson(appDir, packageName);\n\n if (!packageJson?.strapi || !declaresStrapiKind(packageJson.strapi.kind)) {\n return undefined;\n }\n\n const { homepage } = packageJson;\n\n return {\n packageName,\n url:\n typeof homepage === 'string' && homepage.length > 0 ? homepage : ENTERPRISE_PLUGINS_DOCS_URL,\n };\n};\n\nexport interface InstalledPackage {\n packageName: string;\n replacesInstalledVersion: boolean;\n}\n\nexport const printSetupLinks = async ({\n appDir,\n installedPackages,\n logger,\n}: {\n appDir: string;\n installedPackages: InstalledPackage[];\n logger: Logger;\n}): Promise<void> => {\n for (const { packageName, replacesInstalledVersion } of installedPackages) {\n const setupLink = await readSetupLink(appDir, packageName);\n\n if (!setupLink) {\n continue;\n }\n\n if (replacesInstalledVersion) {\n logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);\n } else {\n logger.warn(\n `Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`\n );\n }\n }\n};\n"],"names":["readSetupLink","appDir","packageName","packageJson","readInstalledPackageJson","strapi","declaresStrapiKind","kind","undefined","homepage","url","length","ENTERPRISE_PLUGINS_DOCS_URL","printSetupLinks","installedPackages","logger","replacesInstalledVersion","setupLink","info","warn"],"mappings":";;;;AAUO,MAAMA,aAAAA,GAAgB,OAC3BC,MAAAA,EACAC,WAAAA,GAAAA;IAEA,MAAMC,WAAAA,GAAc,MAAMC,wBAAAA,CAAyBH,MAAAA,EAAQC,WAAAA,CAAAA;IAE3D,IAAI,CAACC,aAAaE,MAAAA,IAAU,CAACC,mBAAmBH,WAAAA,CAAYE,MAAM,CAACE,IAAI,CAAA,EAAG;QACxE,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAM,EAAEC,QAAQ,EAAE,GAAGN,WAAAA;IAErB,OAAO;AACLD,QAAAA,WAAAA;AACAQ,QAAAA,GAAAA,EACE,OAAOD,QAAAA,KAAa,QAAA,IAAYA,SAASE,MAAM,GAAG,IAAIF,QAAAA,GAAWG;AACrE,KAAA;AACF;AAOO,MAAMC,kBAAkB,OAAO,EACpCZ,MAAM,EACNa,iBAAiB,EACjBC,MAAM,EAKP,GAAA;AACC,IAAA,KAAK,MAAM,EAAEb,WAAW,EAAEc,wBAAwB,EAAE,IAAIF,iBAAAA,CAAmB;QACzE,MAAMG,SAAAA,GAAY,MAAMjB,aAAAA,CAAcC,MAAAA,EAAQC,WAAAA,CAAAA;AAE9C,QAAA,IAAI,CAACe,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AAEA,QAAA,IAAID,wBAAAA,EAA0B;AAC5BD,YAAAA,MAAAA,CAAOG,IAAI,CAAC,CAAC,QAAQ,EAAED,SAAAA,CAAUf,WAAW,CAAC,sBAAsB,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;QACtF,CAAA,MAAO;AACLK,YAAAA,MAAAA,CAAOI,IAAI,CACT,CAAC,OAAO,EAAEF,SAAAA,CAAUf,WAAW,CAAC,gDAAgD,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;AAErG,QAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var fse = require('fs-extra');
|
|
5
|
+
var semver = require('semver');
|
|
6
|
+
var constants = require('./constants.js');
|
|
7
|
+
var errors = require('./errors.js');
|
|
8
|
+
var directories = require('./directories.js');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
13
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
14
|
+
var semver__default = /*#__PURE__*/_interopDefault(semver);
|
|
15
|
+
|
|
16
|
+
const listNodeModulesDirectories = (appDir)=>directories.listAncestorDirectories(appDir).map((directory)=>path__default.default.join(directory, 'node_modules'));
|
|
17
|
+
/** Reads the `package.json` of an installed package, found the way Node resolves packages. */ const readInstalledPackageJson = async (appDir, packageName)=>{
|
|
18
|
+
for (const nodeModulesDirectory of listNodeModulesDirectories(appDir)){
|
|
19
|
+
const packageJsonPath = path__default.default.join(nodeModulesDirectory, packageName, 'package.json');
|
|
20
|
+
if (await fse__default.default.pathExists(packageJsonPath)) {
|
|
21
|
+
return fse__default.default.readJson(packageJsonPath).catch(()=>{
|
|
22
|
+
throw new errors.EnterpriseInstallError(`Could not read ${packageJsonPath}. Reinstall the app's dependencies, then try again.`);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
};
|
|
28
|
+
const readInstalledVersion = async (appDir, packageName)=>{
|
|
29
|
+
const { version } = await readInstalledPackageJson(appDir, packageName) ?? {};
|
|
30
|
+
return typeof version === 'string' ? version : undefined;
|
|
31
|
+
};
|
|
32
|
+
const DEPENDENCY_FIELDS = [
|
|
33
|
+
'dependencies',
|
|
34
|
+
'devDependencies',
|
|
35
|
+
'optionalDependencies'
|
|
36
|
+
];
|
|
37
|
+
/** The packages the app's own `package.json` depends on. */ const readAppDependencyNames = async (appDir)=>{
|
|
38
|
+
const packageJson = await fse__default.default.readJson(path__default.default.join(appDir, 'package.json')).catch(()=>({}));
|
|
39
|
+
return new Set(DEPENDENCY_FIELDS.flatMap((field)=>Object.keys(packageJson?.[field] ?? {})));
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The installed version of a package the app depends on. Undefined when the app's `package.json`
|
|
43
|
+
* does not list it, even if a parent `node_modules` holds a copy hoisted for another app of the
|
|
44
|
+
* same monorepo: that copy is not the app's, so it is neither up to date nor an upgrade for it.
|
|
45
|
+
*/ const readAppDependencyVersion = async (appDir, packageName)=>(await readAppDependencyNames(appDir)).has(packageName) ? readInstalledVersion(appDir, packageName) : undefined;
|
|
46
|
+
const canCheckStrapiCompatibility = (strapiVersion)=>strapiVersion !== undefined && semver__default.default.valid(strapiVersion) !== null && semver__default.default.prerelease(strapiVersion) === null;
|
|
47
|
+
const getStrapiRange = (packumentVersion)=>packumentVersion?.peerDependencies?.[constants.STRAPI_PACKAGE_NAME];
|
|
48
|
+
const fitsStrapiVersion = (packumentVersion, strapiVersion)=>{
|
|
49
|
+
const strapiRange = getStrapiRange(packumentVersion);
|
|
50
|
+
return !canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined || semver__default.default.satisfies(strapiVersion, strapiRange);
|
|
51
|
+
};
|
|
52
|
+
const pickTargetVersion = (packument, strapiVersion)=>{
|
|
53
|
+
const latestVersion = packument['dist-tags']?.latest;
|
|
54
|
+
const versionCap = latestVersion !== undefined && semver__default.default.valid(latestVersion) && !isPrerelease(latestVersion) ? latestVersion : undefined;
|
|
55
|
+
const stableVersions = Object.values(packument.versions ?? {}).filter((packumentVersion)=>semver__default.default.valid(packumentVersion.version) !== null && semver__default.default.prerelease(packumentVersion.version) === null && !packumentVersion.deprecated && (versionCap === undefined || semver__default.default.lte(packumentVersion.version, versionCap))).sort((left, right)=>semver__default.default.rcompare(left.version, right.version));
|
|
56
|
+
const newest = stableVersions[0];
|
|
57
|
+
return {
|
|
58
|
+
targetVersion: stableVersions.find((packumentVersion)=>fitsStrapiVersion(packumentVersion, strapiVersion))?.version,
|
|
59
|
+
newestVersion: newest?.version,
|
|
60
|
+
newestVersionStrapiRange: getStrapiRange(newest)
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const describeNewerIncompatibleVersion = ({ targetVersion, newestVersion, newestVersionStrapiRange }, installedVersion)=>{
|
|
64
|
+
if (!newestVersion || newestVersion === targetVersion || !newestVersionStrapiRange) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
// Nothing to announce when that version, or a later one, is already installed.
|
|
68
|
+
if (installedVersion && semver__default.default.valid(installedVersion) && semver__default.default.gte(installedVersion, newestVersion)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return `${newestVersion} is available but requires Strapi ${newestVersionStrapiRange}.`;
|
|
72
|
+
};
|
|
73
|
+
const resolveRequestedVersion = (packument, requestedVersion, strapiVersion)=>{
|
|
74
|
+
const publishedVersions = Object.keys(packument.versions ?? {});
|
|
75
|
+
const taggedVersion = packument['dist-tags']?.[requestedVersion];
|
|
76
|
+
if (publishedVersions.includes(requestedVersion)) {
|
|
77
|
+
return requestedVersion;
|
|
78
|
+
}
|
|
79
|
+
if (taggedVersion !== undefined && publishedVersions.includes(taggedVersion)) {
|
|
80
|
+
return taggedVersion;
|
|
81
|
+
}
|
|
82
|
+
if (!semver__default.default.validRange(requestedVersion)) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
// A range asks for "something in it", not for one version: like the automatic choice, prefer a
|
|
86
|
+
// version that is not deprecated and fits the app's Strapi, and like npm, prefer `latest`.
|
|
87
|
+
const inRange = Object.values(packument.versions ?? {}).filter((packumentVersion)=>semver__default.default.valid(packumentVersion.version) !== null && semver__default.default.satisfies(packumentVersion.version, requestedVersion));
|
|
88
|
+
const notDeprecated = inRange.filter((packumentVersion)=>!packumentVersion.deprecated);
|
|
89
|
+
const fitting = notDeprecated.filter((packumentVersion)=>fitsStrapiVersion(packumentVersion, strapiVersion));
|
|
90
|
+
const pick = (candidates)=>{
|
|
91
|
+
const versions = candidates.map((packumentVersion)=>packumentVersion.version);
|
|
92
|
+
const latestVersion = packument['dist-tags']?.latest;
|
|
93
|
+
if (latestVersion !== undefined && versions.includes(latestVersion)) {
|
|
94
|
+
return latestVersion;
|
|
95
|
+
}
|
|
96
|
+
return semver__default.default.maxSatisfying(versions, requestedVersion) ?? undefined;
|
|
97
|
+
};
|
|
98
|
+
return pick(fitting) ?? pick(notDeprecated) ?? pick(inRange);
|
|
99
|
+
};
|
|
100
|
+
/** The Strapi range a version requires, when the app's Strapi version is known not to fit it. */ const findUnsupportedStrapiRange = (packument, version, strapiVersion)=>{
|
|
101
|
+
const strapiRange = getStrapiRange(packument.versions?.[version]);
|
|
102
|
+
if (!canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
return semver__default.default.satisfies(strapiVersion, strapiRange) ? undefined : strapiRange;
|
|
106
|
+
};
|
|
107
|
+
/** A prerelease, such as an experimental build, is usually ahead of the latest stable release. */ const isPrerelease = (version)=>semver__default.default.prerelease(version) !== null;
|
|
108
|
+
/**
|
|
109
|
+
* True when semver lets the target break the installed version: a new major, or a new minor in 0.x,
|
|
110
|
+
* as npm's `^` range reads it.
|
|
111
|
+
*/ const isMajorUpgrade = (installedVersion, targetVersion)=>semver__default.default.valid(installedVersion) !== null && !semver__default.default.satisfies(targetVersion, `^${installedVersion}`);
|
|
112
|
+
/** True when the target is newer than what is installed. A newer install is never downgraded. */ const isUpgrade = (installedVersion, targetVersion)=>semver__default.default.valid(installedVersion) === null || semver__default.default.gt(targetVersion, installedVersion);
|
|
113
|
+
|
|
114
|
+
exports.canCheckStrapiCompatibility = canCheckStrapiCompatibility;
|
|
115
|
+
exports.describeNewerIncompatibleVersion = describeNewerIncompatibleVersion;
|
|
116
|
+
exports.findUnsupportedStrapiRange = findUnsupportedStrapiRange;
|
|
117
|
+
exports.isMajorUpgrade = isMajorUpgrade;
|
|
118
|
+
exports.isPrerelease = isPrerelease;
|
|
119
|
+
exports.isUpgrade = isUpgrade;
|
|
120
|
+
exports.listNodeModulesDirectories = listNodeModulesDirectories;
|
|
121
|
+
exports.pickTargetVersion = pickTargetVersion;
|
|
122
|
+
exports.readAppDependencyNames = readAppDependencyNames;
|
|
123
|
+
exports.readAppDependencyVersion = readAppDependencyVersion;
|
|
124
|
+
exports.readInstalledPackageJson = readInstalledPackageJson;
|
|
125
|
+
exports.readInstalledVersion = readInstalledVersion;
|
|
126
|
+
exports.resolveRequestedVersion = resolveRequestedVersion;
|
|
127
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sources":["../../../../../../src/cli/commands/enterprise/install/versions.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport semver from 'semver';\n\nimport { STRAPI_PACKAGE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\nimport { listAncestorDirectories } from './directories';\nimport type { Packument, PackumentVersion, StrapiPackageMetadata } from './registry';\n\nexport interface InstalledPackageJson {\n version?: string;\n homepage?: string;\n strapi?: StrapiPackageMetadata;\n}\n\nexport const listNodeModulesDirectories = (appDir: string): string[] =>\n listAncestorDirectories(appDir).map((directory) => path.join(directory, 'node_modules'));\n\n/** Reads the `package.json` of an installed package, found the way Node resolves packages. */\nexport const readInstalledPackageJson = async (\n appDir: string,\n packageName: string\n): Promise<InstalledPackageJson | undefined> => {\n for (const nodeModulesDirectory of listNodeModulesDirectories(appDir)) {\n const packageJsonPath = path.join(nodeModulesDirectory, packageName, 'package.json');\n\n if (await fse.pathExists(packageJsonPath)) {\n return fse.readJson(packageJsonPath).catch(() => {\n throw new EnterpriseInstallError(\n `Could not read ${packageJsonPath}. Reinstall the app's dependencies, then try again.`\n );\n });\n }\n }\n\n return undefined;\n};\n\nexport const readInstalledVersion = async (\n appDir: string,\n packageName: string\n): Promise<string | undefined> => {\n const { version } = (await readInstalledPackageJson(appDir, packageName)) ?? {};\n\n return typeof version === 'string' ? version : undefined;\n};\n\nconst DEPENDENCY_FIELDS = ['dependencies', 'devDependencies', 'optionalDependencies'] as const;\n\n/** The packages the app's own `package.json` depends on. */\nexport const readAppDependencyNames = async (appDir: string): Promise<Set<string>> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n\n return new Set(DEPENDENCY_FIELDS.flatMap((field) => Object.keys(packageJson?.[field] ?? {})));\n};\n\n/**\n * The installed version of a package the app depends on. Undefined when the app's `package.json`\n * does not list it, even if a parent `node_modules` holds a copy hoisted for another app of the\n * same monorepo: that copy is not the app's, so it is neither up to date nor an upgrade for it.\n */\nexport const readAppDependencyVersion = async (\n appDir: string,\n packageName: string\n): Promise<string | undefined> =>\n (await readAppDependencyNames(appDir)).has(packageName)\n ? readInstalledVersion(appDir, packageName)\n : undefined;\n\nexport const canCheckStrapiCompatibility = (\n strapiVersion: string | undefined\n): strapiVersion is string =>\n strapiVersion !== undefined &&\n semver.valid(strapiVersion) !== null &&\n semver.prerelease(strapiVersion) === null;\n\nexport interface VersionChoice {\n /** The highest stable version that fits the app's Strapi version. */\n targetVersion?: string;\n /** The highest stable version, whether it fits or not. */\n newestVersion?: string;\n /** The Strapi range the newest version requires, when it declares one. */\n newestVersionStrapiRange?: string;\n}\n\nconst getStrapiRange = (packumentVersion: PackumentVersion | undefined) =>\n packumentVersion?.peerDependencies?.[STRAPI_PACKAGE_NAME];\n\nconst fitsStrapiVersion = (\n packumentVersion: PackumentVersion,\n strapiVersion: string | undefined\n) => {\n const strapiRange = getStrapiRange(packumentVersion);\n\n return (\n !canCheckStrapiCompatibility(strapiVersion) ||\n strapiRange === undefined ||\n semver.satisfies(strapiVersion, strapiRange)\n );\n};\n\nexport const pickTargetVersion = (\n packument: Packument,\n strapiVersion: string | undefined\n): VersionChoice => {\n const latestVersion = packument['dist-tags']?.latest;\n const versionCap =\n latestVersion !== undefined && semver.valid(latestVersion) && !isPrerelease(latestVersion)\n ? latestVersion\n : undefined;\n\n const stableVersions = Object.values(packument.versions ?? {})\n .filter(\n (packumentVersion) =>\n semver.valid(packumentVersion.version) !== null &&\n semver.prerelease(packumentVersion.version) === null &&\n !packumentVersion.deprecated &&\n (versionCap === undefined || semver.lte(packumentVersion.version, versionCap))\n )\n .sort((left, right) => semver.rcompare(left.version, right.version));\n\n const newest = stableVersions[0];\n\n return {\n targetVersion: stableVersions.find((packumentVersion) =>\n fitsStrapiVersion(packumentVersion, strapiVersion)\n )?.version,\n newestVersion: newest?.version,\n newestVersionStrapiRange: getStrapiRange(newest),\n };\n};\n\nexport const describeNewerIncompatibleVersion = (\n { targetVersion, newestVersion, newestVersionStrapiRange }: VersionChoice,\n installedVersion?: string\n): string | undefined => {\n if (!newestVersion || newestVersion === targetVersion || !newestVersionStrapiRange) {\n return undefined;\n }\n\n // Nothing to announce when that version, or a later one, is already installed.\n if (\n installedVersion &&\n semver.valid(installedVersion) &&\n semver.gte(installedVersion, newestVersion)\n ) {\n return undefined;\n }\n\n return `${newestVersion} is available but requires Strapi ${newestVersionStrapiRange}.`;\n};\n\nexport const resolveRequestedVersion = (\n packument: Packument,\n requestedVersion: string,\n strapiVersion: string | undefined\n): string | undefined => {\n const publishedVersions = Object.keys(packument.versions ?? {});\n const taggedVersion = packument['dist-tags']?.[requestedVersion];\n\n if (publishedVersions.includes(requestedVersion)) {\n return requestedVersion;\n }\n\n if (taggedVersion !== undefined && publishedVersions.includes(taggedVersion)) {\n return taggedVersion;\n }\n\n if (!semver.validRange(requestedVersion)) {\n return undefined;\n }\n\n // A range asks for \"something in it\", not for one version: like the automatic choice, prefer a\n // version that is not deprecated and fits the app's Strapi, and like npm, prefer `latest`.\n const inRange = Object.values(packument.versions ?? {}).filter(\n (packumentVersion) =>\n semver.valid(packumentVersion.version) !== null &&\n semver.satisfies(packumentVersion.version, requestedVersion)\n );\n const notDeprecated = inRange.filter((packumentVersion) => !packumentVersion.deprecated);\n const fitting = notDeprecated.filter((packumentVersion) =>\n fitsStrapiVersion(packumentVersion, strapiVersion)\n );\n const pick = (candidates: PackumentVersion[]): string | undefined => {\n const versions = candidates.map((packumentVersion) => packumentVersion.version);\n const latestVersion = packument['dist-tags']?.latest;\n\n if (latestVersion !== undefined && versions.includes(latestVersion)) {\n return latestVersion;\n }\n\n return semver.maxSatisfying(versions, requestedVersion) ?? undefined;\n };\n\n return pick(fitting) ?? pick(notDeprecated) ?? pick(inRange);\n};\n\n/** The Strapi range a version requires, when the app's Strapi version is known not to fit it. */\nexport const findUnsupportedStrapiRange = (\n packument: Packument,\n version: string,\n strapiVersion: string | undefined\n): string | undefined => {\n const strapiRange = getStrapiRange(packument.versions?.[version]);\n\n if (!canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined) {\n return undefined;\n }\n\n return semver.satisfies(strapiVersion, strapiRange) ? undefined : strapiRange;\n};\n\n/** A prerelease, such as an experimental build, is usually ahead of the latest stable release. */\nexport const isPrerelease = (version: string): boolean => semver.prerelease(version) !== null;\n\n/**\n * True when semver lets the target break the installed version: a new major, or a new minor in 0.x,\n * as npm's `^` range reads it.\n */\nexport const isMajorUpgrade = (installedVersion: string, targetVersion: string): boolean =>\n semver.valid(installedVersion) !== null &&\n !semver.satisfies(targetVersion, `^${installedVersion}`);\n\n/** True when the target is newer than what is installed. A newer install is never downgraded. */\nexport const isUpgrade = (installedVersion: string, targetVersion: string): boolean =>\n semver.valid(installedVersion) === null || semver.gt(targetVersion, installedVersion);\n"],"names":["listNodeModulesDirectories","appDir","listAncestorDirectories","map","directory","path","join","readInstalledPackageJson","packageName","nodeModulesDirectory","packageJsonPath","fse","pathExists","readJson","catch","EnterpriseInstallError","undefined","readInstalledVersion","version","DEPENDENCY_FIELDS","readAppDependencyNames","packageJson","Set","flatMap","field","Object","keys","readAppDependencyVersion","has","canCheckStrapiCompatibility","strapiVersion","semver","valid","prerelease","getStrapiRange","packumentVersion","peerDependencies","STRAPI_PACKAGE_NAME","fitsStrapiVersion","strapiRange","satisfies","pickTargetVersion","packument","latestVersion","latest","versionCap","isPrerelease","stableVersions","values","versions","filter","deprecated","lte","sort","left","right","rcompare","newest","targetVersion","find","newestVersion","newestVersionStrapiRange","describeNewerIncompatibleVersion","installedVersion","gte","resolveRequestedVersion","requestedVersion","publishedVersions","taggedVersion","includes","validRange","inRange","notDeprecated","fitting","pick","candidates","maxSatisfying","findUnsupportedStrapiRange","isMajorUpgrade","isUpgrade","gt"],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fse from 'fs-extra';
|
|
3
|
+
import semver from 'semver';
|
|
4
|
+
import { STRAPI_PACKAGE_NAME } from './constants.mjs';
|
|
5
|
+
import { EnterpriseInstallError } from './errors.mjs';
|
|
6
|
+
import { listAncestorDirectories } from './directories.mjs';
|
|
7
|
+
|
|
8
|
+
const listNodeModulesDirectories = (appDir)=>listAncestorDirectories(appDir).map((directory)=>path.join(directory, 'node_modules'));
|
|
9
|
+
/** Reads the `package.json` of an installed package, found the way Node resolves packages. */ const readInstalledPackageJson = async (appDir, packageName)=>{
|
|
10
|
+
for (const nodeModulesDirectory of listNodeModulesDirectories(appDir)){
|
|
11
|
+
const packageJsonPath = path.join(nodeModulesDirectory, packageName, 'package.json');
|
|
12
|
+
if (await fse.pathExists(packageJsonPath)) {
|
|
13
|
+
return fse.readJson(packageJsonPath).catch(()=>{
|
|
14
|
+
throw new EnterpriseInstallError(`Could not read ${packageJsonPath}. Reinstall the app's dependencies, then try again.`);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
};
|
|
20
|
+
const readInstalledVersion = async (appDir, packageName)=>{
|
|
21
|
+
const { version } = await readInstalledPackageJson(appDir, packageName) ?? {};
|
|
22
|
+
return typeof version === 'string' ? version : undefined;
|
|
23
|
+
};
|
|
24
|
+
const DEPENDENCY_FIELDS = [
|
|
25
|
+
'dependencies',
|
|
26
|
+
'devDependencies',
|
|
27
|
+
'optionalDependencies'
|
|
28
|
+
];
|
|
29
|
+
/** The packages the app's own `package.json` depends on. */ const readAppDependencyNames = async (appDir)=>{
|
|
30
|
+
const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(()=>({}));
|
|
31
|
+
return new Set(DEPENDENCY_FIELDS.flatMap((field)=>Object.keys(packageJson?.[field] ?? {})));
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The installed version of a package the app depends on. Undefined when the app's `package.json`
|
|
35
|
+
* does not list it, even if a parent `node_modules` holds a copy hoisted for another app of the
|
|
36
|
+
* same monorepo: that copy is not the app's, so it is neither up to date nor an upgrade for it.
|
|
37
|
+
*/ const readAppDependencyVersion = async (appDir, packageName)=>(await readAppDependencyNames(appDir)).has(packageName) ? readInstalledVersion(appDir, packageName) : undefined;
|
|
38
|
+
const canCheckStrapiCompatibility = (strapiVersion)=>strapiVersion !== undefined && semver.valid(strapiVersion) !== null && semver.prerelease(strapiVersion) === null;
|
|
39
|
+
const getStrapiRange = (packumentVersion)=>packumentVersion?.peerDependencies?.[STRAPI_PACKAGE_NAME];
|
|
40
|
+
const fitsStrapiVersion = (packumentVersion, strapiVersion)=>{
|
|
41
|
+
const strapiRange = getStrapiRange(packumentVersion);
|
|
42
|
+
return !canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined || semver.satisfies(strapiVersion, strapiRange);
|
|
43
|
+
};
|
|
44
|
+
const pickTargetVersion = (packument, strapiVersion)=>{
|
|
45
|
+
const latestVersion = packument['dist-tags']?.latest;
|
|
46
|
+
const versionCap = latestVersion !== undefined && semver.valid(latestVersion) && !isPrerelease(latestVersion) ? latestVersion : undefined;
|
|
47
|
+
const stableVersions = Object.values(packument.versions ?? {}).filter((packumentVersion)=>semver.valid(packumentVersion.version) !== null && semver.prerelease(packumentVersion.version) === null && !packumentVersion.deprecated && (versionCap === undefined || semver.lte(packumentVersion.version, versionCap))).sort((left, right)=>semver.rcompare(left.version, right.version));
|
|
48
|
+
const newest = stableVersions[0];
|
|
49
|
+
return {
|
|
50
|
+
targetVersion: stableVersions.find((packumentVersion)=>fitsStrapiVersion(packumentVersion, strapiVersion))?.version,
|
|
51
|
+
newestVersion: newest?.version,
|
|
52
|
+
newestVersionStrapiRange: getStrapiRange(newest)
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
const describeNewerIncompatibleVersion = ({ targetVersion, newestVersion, newestVersionStrapiRange }, installedVersion)=>{
|
|
56
|
+
if (!newestVersion || newestVersion === targetVersion || !newestVersionStrapiRange) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
// Nothing to announce when that version, or a later one, is already installed.
|
|
60
|
+
if (installedVersion && semver.valid(installedVersion) && semver.gte(installedVersion, newestVersion)) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return `${newestVersion} is available but requires Strapi ${newestVersionStrapiRange}.`;
|
|
64
|
+
};
|
|
65
|
+
const resolveRequestedVersion = (packument, requestedVersion, strapiVersion)=>{
|
|
66
|
+
const publishedVersions = Object.keys(packument.versions ?? {});
|
|
67
|
+
const taggedVersion = packument['dist-tags']?.[requestedVersion];
|
|
68
|
+
if (publishedVersions.includes(requestedVersion)) {
|
|
69
|
+
return requestedVersion;
|
|
70
|
+
}
|
|
71
|
+
if (taggedVersion !== undefined && publishedVersions.includes(taggedVersion)) {
|
|
72
|
+
return taggedVersion;
|
|
73
|
+
}
|
|
74
|
+
if (!semver.validRange(requestedVersion)) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
// A range asks for "something in it", not for one version: like the automatic choice, prefer a
|
|
78
|
+
// version that is not deprecated and fits the app's Strapi, and like npm, prefer `latest`.
|
|
79
|
+
const inRange = Object.values(packument.versions ?? {}).filter((packumentVersion)=>semver.valid(packumentVersion.version) !== null && semver.satisfies(packumentVersion.version, requestedVersion));
|
|
80
|
+
const notDeprecated = inRange.filter((packumentVersion)=>!packumentVersion.deprecated);
|
|
81
|
+
const fitting = notDeprecated.filter((packumentVersion)=>fitsStrapiVersion(packumentVersion, strapiVersion));
|
|
82
|
+
const pick = (candidates)=>{
|
|
83
|
+
const versions = candidates.map((packumentVersion)=>packumentVersion.version);
|
|
84
|
+
const latestVersion = packument['dist-tags']?.latest;
|
|
85
|
+
if (latestVersion !== undefined && versions.includes(latestVersion)) {
|
|
86
|
+
return latestVersion;
|
|
87
|
+
}
|
|
88
|
+
return semver.maxSatisfying(versions, requestedVersion) ?? undefined;
|
|
89
|
+
};
|
|
90
|
+
return pick(fitting) ?? pick(notDeprecated) ?? pick(inRange);
|
|
91
|
+
};
|
|
92
|
+
/** The Strapi range a version requires, when the app's Strapi version is known not to fit it. */ const findUnsupportedStrapiRange = (packument, version, strapiVersion)=>{
|
|
93
|
+
const strapiRange = getStrapiRange(packument.versions?.[version]);
|
|
94
|
+
if (!canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
return semver.satisfies(strapiVersion, strapiRange) ? undefined : strapiRange;
|
|
98
|
+
};
|
|
99
|
+
/** A prerelease, such as an experimental build, is usually ahead of the latest stable release. */ const isPrerelease = (version)=>semver.prerelease(version) !== null;
|
|
100
|
+
/**
|
|
101
|
+
* True when semver lets the target break the installed version: a new major, or a new minor in 0.x,
|
|
102
|
+
* as npm's `^` range reads it.
|
|
103
|
+
*/ const isMajorUpgrade = (installedVersion, targetVersion)=>semver.valid(installedVersion) !== null && !semver.satisfies(targetVersion, `^${installedVersion}`);
|
|
104
|
+
/** True when the target is newer than what is installed. A newer install is never downgraded. */ const isUpgrade = (installedVersion, targetVersion)=>semver.valid(installedVersion) === null || semver.gt(targetVersion, installedVersion);
|
|
105
|
+
|
|
106
|
+
export { canCheckStrapiCompatibility, describeNewerIncompatibleVersion, findUnsupportedStrapiRange, isMajorUpgrade, isPrerelease, isUpgrade, listNodeModulesDirectories, pickTargetVersion, readAppDependencyNames, readAppDependencyVersion, readInstalledPackageJson, readInstalledVersion, resolveRequestedVersion };
|
|
107
|
+
//# sourceMappingURL=versions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/versions.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport semver from 'semver';\n\nimport { STRAPI_PACKAGE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\nimport { listAncestorDirectories } from './directories';\nimport type { Packument, PackumentVersion, StrapiPackageMetadata } from './registry';\n\nexport interface InstalledPackageJson {\n version?: string;\n homepage?: string;\n strapi?: StrapiPackageMetadata;\n}\n\nexport const listNodeModulesDirectories = (appDir: string): string[] =>\n listAncestorDirectories(appDir).map((directory) => path.join(directory, 'node_modules'));\n\n/** Reads the `package.json` of an installed package, found the way Node resolves packages. */\nexport const readInstalledPackageJson = async (\n appDir: string,\n packageName: string\n): Promise<InstalledPackageJson | undefined> => {\n for (const nodeModulesDirectory of listNodeModulesDirectories(appDir)) {\n const packageJsonPath = path.join(nodeModulesDirectory, packageName, 'package.json');\n\n if (await fse.pathExists(packageJsonPath)) {\n return fse.readJson(packageJsonPath).catch(() => {\n throw new EnterpriseInstallError(\n `Could not read ${packageJsonPath}. Reinstall the app's dependencies, then try again.`\n );\n });\n }\n }\n\n return undefined;\n};\n\nexport const readInstalledVersion = async (\n appDir: string,\n packageName: string\n): Promise<string | undefined> => {\n const { version } = (await readInstalledPackageJson(appDir, packageName)) ?? {};\n\n return typeof version === 'string' ? version : undefined;\n};\n\nconst DEPENDENCY_FIELDS = ['dependencies', 'devDependencies', 'optionalDependencies'] as const;\n\n/** The packages the app's own `package.json` depends on. */\nexport const readAppDependencyNames = async (appDir: string): Promise<Set<string>> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n\n return new Set(DEPENDENCY_FIELDS.flatMap((field) => Object.keys(packageJson?.[field] ?? {})));\n};\n\n/**\n * The installed version of a package the app depends on. Undefined when the app's `package.json`\n * does not list it, even if a parent `node_modules` holds a copy hoisted for another app of the\n * same monorepo: that copy is not the app's, so it is neither up to date nor an upgrade for it.\n */\nexport const readAppDependencyVersion = async (\n appDir: string,\n packageName: string\n): Promise<string | undefined> =>\n (await readAppDependencyNames(appDir)).has(packageName)\n ? readInstalledVersion(appDir, packageName)\n : undefined;\n\nexport const canCheckStrapiCompatibility = (\n strapiVersion: string | undefined\n): strapiVersion is string =>\n strapiVersion !== undefined &&\n semver.valid(strapiVersion) !== null &&\n semver.prerelease(strapiVersion) === null;\n\nexport interface VersionChoice {\n /** The highest stable version that fits the app's Strapi version. */\n targetVersion?: string;\n /** The highest stable version, whether it fits or not. */\n newestVersion?: string;\n /** The Strapi range the newest version requires, when it declares one. */\n newestVersionStrapiRange?: string;\n}\n\nconst getStrapiRange = (packumentVersion: PackumentVersion | undefined) =>\n packumentVersion?.peerDependencies?.[STRAPI_PACKAGE_NAME];\n\nconst fitsStrapiVersion = (\n packumentVersion: PackumentVersion,\n strapiVersion: string | undefined\n) => {\n const strapiRange = getStrapiRange(packumentVersion);\n\n return (\n !canCheckStrapiCompatibility(strapiVersion) ||\n strapiRange === undefined ||\n semver.satisfies(strapiVersion, strapiRange)\n );\n};\n\nexport const pickTargetVersion = (\n packument: Packument,\n strapiVersion: string | undefined\n): VersionChoice => {\n const latestVersion = packument['dist-tags']?.latest;\n const versionCap =\n latestVersion !== undefined && semver.valid(latestVersion) && !isPrerelease(latestVersion)\n ? latestVersion\n : undefined;\n\n const stableVersions = Object.values(packument.versions ?? {})\n .filter(\n (packumentVersion) =>\n semver.valid(packumentVersion.version) !== null &&\n semver.prerelease(packumentVersion.version) === null &&\n !packumentVersion.deprecated &&\n (versionCap === undefined || semver.lte(packumentVersion.version, versionCap))\n )\n .sort((left, right) => semver.rcompare(left.version, right.version));\n\n const newest = stableVersions[0];\n\n return {\n targetVersion: stableVersions.find((packumentVersion) =>\n fitsStrapiVersion(packumentVersion, strapiVersion)\n )?.version,\n newestVersion: newest?.version,\n newestVersionStrapiRange: getStrapiRange(newest),\n };\n};\n\nexport const describeNewerIncompatibleVersion = (\n { targetVersion, newestVersion, newestVersionStrapiRange }: VersionChoice,\n installedVersion?: string\n): string | undefined => {\n if (!newestVersion || newestVersion === targetVersion || !newestVersionStrapiRange) {\n return undefined;\n }\n\n // Nothing to announce when that version, or a later one, is already installed.\n if (\n installedVersion &&\n semver.valid(installedVersion) &&\n semver.gte(installedVersion, newestVersion)\n ) {\n return undefined;\n }\n\n return `${newestVersion} is available but requires Strapi ${newestVersionStrapiRange}.`;\n};\n\nexport const resolveRequestedVersion = (\n packument: Packument,\n requestedVersion: string,\n strapiVersion: string | undefined\n): string | undefined => {\n const publishedVersions = Object.keys(packument.versions ?? {});\n const taggedVersion = packument['dist-tags']?.[requestedVersion];\n\n if (publishedVersions.includes(requestedVersion)) {\n return requestedVersion;\n }\n\n if (taggedVersion !== undefined && publishedVersions.includes(taggedVersion)) {\n return taggedVersion;\n }\n\n if (!semver.validRange(requestedVersion)) {\n return undefined;\n }\n\n // A range asks for \"something in it\", not for one version: like the automatic choice, prefer a\n // version that is not deprecated and fits the app's Strapi, and like npm, prefer `latest`.\n const inRange = Object.values(packument.versions ?? {}).filter(\n (packumentVersion) =>\n semver.valid(packumentVersion.version) !== null &&\n semver.satisfies(packumentVersion.version, requestedVersion)\n );\n const notDeprecated = inRange.filter((packumentVersion) => !packumentVersion.deprecated);\n const fitting = notDeprecated.filter((packumentVersion) =>\n fitsStrapiVersion(packumentVersion, strapiVersion)\n );\n const pick = (candidates: PackumentVersion[]): string | undefined => {\n const versions = candidates.map((packumentVersion) => packumentVersion.version);\n const latestVersion = packument['dist-tags']?.latest;\n\n if (latestVersion !== undefined && versions.includes(latestVersion)) {\n return latestVersion;\n }\n\n return semver.maxSatisfying(versions, requestedVersion) ?? undefined;\n };\n\n return pick(fitting) ?? pick(notDeprecated) ?? pick(inRange);\n};\n\n/** The Strapi range a version requires, when the app's Strapi version is known not to fit it. */\nexport const findUnsupportedStrapiRange = (\n packument: Packument,\n version: string,\n strapiVersion: string | undefined\n): string | undefined => {\n const strapiRange = getStrapiRange(packument.versions?.[version]);\n\n if (!canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined) {\n return undefined;\n }\n\n return semver.satisfies(strapiVersion, strapiRange) ? undefined : strapiRange;\n};\n\n/** A prerelease, such as an experimental build, is usually ahead of the latest stable release. */\nexport const isPrerelease = (version: string): boolean => semver.prerelease(version) !== null;\n\n/**\n * True when semver lets the target break the installed version: a new major, or a new minor in 0.x,\n * as npm's `^` range reads it.\n */\nexport const isMajorUpgrade = (installedVersion: string, targetVersion: string): boolean =>\n semver.valid(installedVersion) !== null &&\n !semver.satisfies(targetVersion, `^${installedVersion}`);\n\n/** True when the target is newer than what is installed. A newer install is never downgraded. */\nexport const isUpgrade = (installedVersion: string, targetVersion: string): boolean =>\n semver.valid(installedVersion) === null || semver.gt(targetVersion, installedVersion);\n"],"names":["listNodeModulesDirectories","appDir","listAncestorDirectories","map","directory","path","join","readInstalledPackageJson","packageName","nodeModulesDirectory","packageJsonPath","fse","pathExists","readJson","catch","EnterpriseInstallError","undefined","readInstalledVersion","version","DEPENDENCY_FIELDS","readAppDependencyNames","packageJson","Set","flatMap","field","Object","keys","readAppDependencyVersion","has","canCheckStrapiCompatibility","strapiVersion","semver","valid","prerelease","getStrapiRange","packumentVersion","peerDependencies","STRAPI_PACKAGE_NAME","fitsStrapiVersion","strapiRange","satisfies","pickTargetVersion","packument","latestVersion","latest","versionCap","isPrerelease","stableVersions","values","versions","filter","deprecated","lte","sort","left","right","rcompare","newest","targetVersion","find","newestVersion","newestVersionStrapiRange","describeNewerIncompatibleVersion","installedVersion","gte","resolveRequestedVersion","requestedVersion","publishedVersions","taggedVersion","includes","validRange","inRange","notDeprecated","fitting","pick","candidates","maxSatisfying","findUnsupportedStrapiRange","isMajorUpgrade","isUpgrade","gt"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var path = require('path');
|
|
4
|
-
var
|
|
4
|
+
var _ = require('lodash');
|
|
5
5
|
var fse = require('fs-extra');
|
|
6
6
|
var chalk = require('chalk');
|
|
7
7
|
var dataTransfer = require('@strapi/data-transfer');
|
|
@@ -26,7 +26,7 @@ const BYTES_IN_MB = 1024 * 1024;
|
|
|
26
26
|
* @param {ExportCommandOptions} opts
|
|
27
27
|
*/ var action = (async (opts)=>{
|
|
28
28
|
// Validate inputs from Commander
|
|
29
|
-
if (!
|
|
29
|
+
if (!_.isObject(opts)) {
|
|
30
30
|
helpers.exitWith(1, 'Could not parse command arguments');
|
|
31
31
|
}
|
|
32
32
|
validateDirFormat.normalizeExportDirFormatOpts(opts);
|
|
@@ -112,8 +112,8 @@ const BYTES_IN_MB = 1024 * 1024;
|
|
|
112
112
|
* It creates a local file or directory destination provider based on the given options
|
|
113
113
|
*/ const createDestinationProvider = (opts)=>{
|
|
114
114
|
const { file, compress, encrypt, key, maxSizeJsonl, format = 'tar' } = opts;
|
|
115
|
-
const filepath =
|
|
116
|
-
const maxSizeJsonlInMb =
|
|
115
|
+
const filepath = _.isString(file) && file.length > 0 ? file : dataTransfer$1.getDefaultExportName();
|
|
116
|
+
const maxSizeJsonlInMb = Number.isFinite(_.toNumber(maxSizeJsonl)) ? _.toNumber(maxSizeJsonl) * BYTES_IN_MB : undefined;
|
|
117
117
|
if (format === 'dir') {
|
|
118
118
|
const { createLocalDirectoryDestinationProvider } = dataTransfer.directory.providers;
|
|
119
119
|
const dirPath = path__default.default.isAbsolute(filepath) ? filepath : path__default.default.resolve(process.cwd(), filepath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import path from 'path';\nimport { isObject, isString, isFinite, toNumber } from 'lodash/fp';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n directory as directoryDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n buildTransferTransforms,\n normalizeTransferFilterOptions,\n validateContentTypeTransferOptionsForStrapi,\n logTransferFilterSummary,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\nimport { normalizeExportDirFormatOpts } from './validate-dir-format';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n /** @default 'tar' */\n format?: 'tar' | 'dir';\n encrypt?: boolean;\n verbose?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n excludeContentTypes?: string[];\n onlyContentTypes?: string[];\n filesAutoExcluded?: boolean;\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n normalizeExportDirFormatOpts(opts);\n normalizeTransferFilterOptions(opts);\n\n const strapi = await createStrapiInstance();\n validateContentTypeTransferOptionsForStrapi(opts, strapi);\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: buildTransferTransforms(opts),\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n logTransferFilterSummary({\n exclude: opts.exclude,\n only: opts.only,\n excludeContentTypes: opts.excludeContentTypes,\n onlyContentTypes: opts.onlyContentTypes,\n filesAutoExcluded: opts.filesAutoExcluded,\n });\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n if ((opts.format ?? 'tar') === 'dir') {\n const metadataPath = path.join(outFile, 'metadata.json');\n if (!(await fs.pathExists(metadataPath))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export directory was not created correctly \"${outFile}\"`\n );\n }\n } else if (!(await fs.pathExists(outFile))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file or directory destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl, format = 'tar' } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n if (format === 'dir') {\n const { createLocalDirectoryDestinationProvider } = directoryDataTransfer.providers;\n const dirPath = path.isAbsolute(filepath) ? filepath : path.resolve(process.cwd(), filepath);\n return createLocalDirectoryDestinationProvider({\n directory: { path: dirPath },\n file: {\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n });\n }\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["providers","createLocalFileDestinationProvider","fileDataTransfer","createLocalStrapiSourceProvider","strapiDataTransfer","BYTES_IN_MB","opts","isObject","exitWith","normalizeExportDirFormatOpts","normalizeTransferFilterOptions","strapi","createStrapiInstance","validateContentTypeTransferOptionsForStrapi","source","createSourceProvider","destination","createDestinationProvider","engine","engineDataTransfer","createTransferEngine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","buildTransferTransforms","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","updateLoader","loadersFactory","on","stage","data","start","succeed","console","log","logTransferFilterSummary","excludeContentTypes","onlyContentTypes","filesAutoExcluded","telemetry","send","getTransferTelemetryPayload","results","outFile","setSignalHandler","abortTransfer","transfer","file","path","format","metadataPath","join","fs","pathExists","errors","TransferEngineTransferError","table","buildTransferTable","toString","error","chalk","green","exitMessageText","getStrapi","compress","encrypt","key","maxSizeJsonl","filepath","isString","length","getDefaultExportName","maxSizeJsonlInMb","isFinite","toNumber","undefined","createLocalDirectoryDestinationProvider","directoryDataTransfer","dirPath","isAbsolute","resolve","process","cwd","directory","encryption","enabled","compression"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import path from 'path';\nimport { isObject, isString, toNumber } from 'lodash';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n directory as directoryDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n buildTransferTransforms,\n normalizeTransferFilterOptions,\n validateContentTypeTransferOptionsForStrapi,\n logTransferFilterSummary,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\nimport { normalizeExportDirFormatOpts } from './validate-dir-format';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n /** @default 'tar' */\n format?: 'tar' | 'dir';\n encrypt?: boolean;\n verbose?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n excludeContentTypes?: string[];\n onlyContentTypes?: string[];\n filesAutoExcluded?: boolean;\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n normalizeExportDirFormatOpts(opts);\n normalizeTransferFilterOptions(opts);\n\n const strapi = await createStrapiInstance();\n validateContentTypeTransferOptionsForStrapi(opts, strapi);\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: buildTransferTransforms(opts),\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n logTransferFilterSummary({\n exclude: opts.exclude,\n only: opts.only,\n excludeContentTypes: opts.excludeContentTypes,\n onlyContentTypes: opts.onlyContentTypes,\n filesAutoExcluded: opts.filesAutoExcluded,\n });\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n if ((opts.format ?? 'tar') === 'dir') {\n const metadataPath = path.join(outFile, 'metadata.json');\n if (!(await fs.pathExists(metadataPath))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export directory was not created correctly \"${outFile}\"`\n );\n }\n } else if (!(await fs.pathExists(outFile))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file or directory destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl, format = 'tar' } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = Number.isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n if (format === 'dir') {\n const { createLocalDirectoryDestinationProvider } = directoryDataTransfer.providers;\n const dirPath = path.isAbsolute(filepath) ? filepath : path.resolve(process.cwd(), filepath);\n return createLocalDirectoryDestinationProvider({\n directory: { path: dirPath },\n file: {\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n });\n }\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["providers","createLocalFileDestinationProvider","fileDataTransfer","createLocalStrapiSourceProvider","strapiDataTransfer","BYTES_IN_MB","opts","isObject","exitWith","normalizeExportDirFormatOpts","normalizeTransferFilterOptions","strapi","createStrapiInstance","validateContentTypeTransferOptionsForStrapi","source","createSourceProvider","destination","createDestinationProvider","engine","engineDataTransfer","createTransferEngine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","buildTransferTransforms","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","updateLoader","loadersFactory","on","stage","data","start","succeed","console","log","logTransferFilterSummary","excludeContentTypes","onlyContentTypes","filesAutoExcluded","telemetry","send","getTransferTelemetryPayload","results","outFile","setSignalHandler","abortTransfer","transfer","file","path","format","metadataPath","join","fs","pathExists","errors","TransferEngineTransferError","table","buildTransferTable","toString","error","chalk","green","exitMessageText","getStrapi","compress","encrypt","key","maxSizeJsonl","filepath","isString","length","getDefaultExportName","maxSizeJsonlInMb","Number","isFinite","toNumber","undefined","createLocalDirectoryDestinationProvider","directoryDataTransfer","dirPath","isAbsolute","resolve","process","cwd","directory","encryption","enabled","compression"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
import { isObject, isString,
|
|
2
|
+
import { isObject, isString, toNumber } from 'lodash';
|
|
3
3
|
import fse from 'fs-extra';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { file, strapi, engine, directory } from '@strapi/data-transfer';
|
|
@@ -105,7 +105,7 @@ const BYTES_IN_MB = 1024 * 1024;
|
|
|
105
105
|
*/ const createDestinationProvider = (opts)=>{
|
|
106
106
|
const { file, compress, encrypt, key, maxSizeJsonl, format = 'tar' } = opts;
|
|
107
107
|
const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();
|
|
108
|
-
const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl)) ? toNumber(maxSizeJsonl) * BYTES_IN_MB : undefined;
|
|
108
|
+
const maxSizeJsonlInMb = Number.isFinite(toNumber(maxSizeJsonl)) ? toNumber(maxSizeJsonl) * BYTES_IN_MB : undefined;
|
|
109
109
|
if (format === 'dir') {
|
|
110
110
|
const { createLocalDirectoryDestinationProvider } = directory.providers;
|
|
111
111
|
const dirPath = path.isAbsolute(filepath) ? filepath : path.resolve(process.cwd(), filepath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import path from 'path';\nimport { isObject, isString, isFinite, toNumber } from 'lodash/fp';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n directory as directoryDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n buildTransferTransforms,\n normalizeTransferFilterOptions,\n validateContentTypeTransferOptionsForStrapi,\n logTransferFilterSummary,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\nimport { normalizeExportDirFormatOpts } from './validate-dir-format';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n /** @default 'tar' */\n format?: 'tar' | 'dir';\n encrypt?: boolean;\n verbose?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n excludeContentTypes?: string[];\n onlyContentTypes?: string[];\n filesAutoExcluded?: boolean;\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n normalizeExportDirFormatOpts(opts);\n normalizeTransferFilterOptions(opts);\n\n const strapi = await createStrapiInstance();\n validateContentTypeTransferOptionsForStrapi(opts, strapi);\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: buildTransferTransforms(opts),\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n logTransferFilterSummary({\n exclude: opts.exclude,\n only: opts.only,\n excludeContentTypes: opts.excludeContentTypes,\n onlyContentTypes: opts.onlyContentTypes,\n filesAutoExcluded: opts.filesAutoExcluded,\n });\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n if ((opts.format ?? 'tar') === 'dir') {\n const metadataPath = path.join(outFile, 'metadata.json');\n if (!(await fs.pathExists(metadataPath))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export directory was not created correctly \"${outFile}\"`\n );\n }\n } else if (!(await fs.pathExists(outFile))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file or directory destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl, format = 'tar' } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n if (format === 'dir') {\n const { createLocalDirectoryDestinationProvider } = directoryDataTransfer.providers;\n const dirPath = path.isAbsolute(filepath) ? filepath : path.resolve(process.cwd(), filepath);\n return createLocalDirectoryDestinationProvider({\n directory: { path: dirPath },\n file: {\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n });\n }\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["providers","createLocalFileDestinationProvider","fileDataTransfer","createLocalStrapiSourceProvider","strapiDataTransfer","BYTES_IN_MB","opts","isObject","exitWith","normalizeExportDirFormatOpts","normalizeTransferFilterOptions","strapi","createStrapiInstance","validateContentTypeTransferOptionsForStrapi","source","createSourceProvider","destination","createDestinationProvider","engine","engineDataTransfer","createTransferEngine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","buildTransferTransforms","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","updateLoader","loadersFactory","on","stage","data","start","succeed","console","log","logTransferFilterSummary","excludeContentTypes","onlyContentTypes","filesAutoExcluded","telemetry","send","getTransferTelemetryPayload","results","outFile","setSignalHandler","abortTransfer","transfer","file","path","format","metadataPath","join","fs","pathExists","errors","TransferEngineTransferError","table","buildTransferTable","toString","error","chalk","green","exitMessageText","getStrapi","compress","encrypt","key","maxSizeJsonl","filepath","isString","length","getDefaultExportName","maxSizeJsonlInMb","isFinite","toNumber","undefined","createLocalDirectoryDestinationProvider","directoryDataTransfer","dirPath","isAbsolute","resolve","process","cwd","directory","encryption","enabled","compression"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../../../../src/cli/commands/export/action.ts"],"sourcesContent":["import path from 'path';\nimport { isObject, isString, toNumber } from 'lodash';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport type { Core } from '@strapi/types';\n\nimport {\n engine as engineDataTransfer,\n strapi as strapiDataTransfer,\n file as fileDataTransfer,\n directory as directoryDataTransfer,\n} from '@strapi/data-transfer';\n\nimport {\n getDefaultExportName,\n buildTransferTable,\n createStrapiInstance,\n formatDiagnostic,\n loadersFactory,\n exitMessageText,\n abortTransfer,\n getTransferTelemetryPayload,\n setSignalHandler,\n buildTransferTransforms,\n normalizeTransferFilterOptions,\n validateContentTypeTransferOptionsForStrapi,\n logTransferFilterSummary,\n} from '../../utils/data-transfer';\nimport { exitWith } from '../../utils/helpers';\nimport { normalizeExportDirFormatOpts } from './validate-dir-format';\n\nconst {\n providers: { createLocalFileDestinationProvider },\n} = fileDataTransfer;\n\nconst {\n providers: { createLocalStrapiSourceProvider },\n} = strapiDataTransfer;\n\nconst BYTES_IN_MB = 1024 * 1024;\n\ninterface CmdOptions {\n file?: string;\n /** @default 'tar' */\n format?: 'tar' | 'dir';\n encrypt?: boolean;\n verbose?: boolean;\n key?: string;\n compress?: boolean;\n only?: (keyof engineDataTransfer.TransferGroupFilter)[];\n exclude?: (keyof engineDataTransfer.TransferGroupFilter)[];\n excludeContentTypes?: string[];\n onlyContentTypes?: string[];\n filesAutoExcluded?: boolean;\n throttle?: number;\n maxSizeJsonl?: number;\n}\n\n/**\n * Export command.\n *\n * It transfers data from a local Strapi instance to a file\n *\n * @param {ExportCommandOptions} opts\n */\nexport default async (opts: CmdOptions) => {\n // Validate inputs from Commander\n if (!isObject(opts)) {\n exitWith(1, 'Could not parse command arguments');\n }\n\n normalizeExportDirFormatOpts(opts);\n normalizeTransferFilterOptions(opts);\n\n const strapi = await createStrapiInstance();\n validateContentTypeTransferOptionsForStrapi(opts, strapi);\n\n const source = createSourceProvider(strapi);\n const destination = createDestinationProvider(opts);\n\n const engine = engineDataTransfer.createTransferEngine(source, destination, {\n versionStrategy: 'ignore', // for an export to file, versionStrategy will always be skipped\n schemaStrategy: 'ignore', // for an export to file, schemaStrategy will always be skipped\n exclude: opts.exclude,\n only: opts.only,\n throttle: opts.throttle,\n transforms: buildTransferTransforms(opts),\n });\n\n engine.diagnostics.onDiagnostic(formatDiagnostic('export', opts.verbose));\n\n const progress = engine.progress.stream;\n\n const { updateLoader } = loadersFactory();\n\n progress.on(`stage::start`, ({ stage, data }) => {\n updateLoader(stage, data).start();\n });\n\n progress.on('stage::finish', ({ stage, data }) => {\n updateLoader(stage, data).succeed();\n });\n\n progress.on('stage::progress', ({ stage, data }) => {\n updateLoader(stage, data);\n });\n\n progress.on('transfer::start', async () => {\n console.log(`Starting export...`);\n logTransferFilterSummary({\n exclude: opts.exclude,\n only: opts.only,\n excludeContentTypes: opts.excludeContentTypes,\n onlyContentTypes: opts.onlyContentTypes,\n filesAutoExcluded: opts.filesAutoExcluded,\n });\n\n await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine));\n });\n\n let results: engineDataTransfer.ITransferResults<typeof source, typeof destination>;\n let outFile: string;\n try {\n // Abort transfer if user interrupts process\n setSignalHandler(() => abortTransfer({ engine, strapi }));\n\n results = await engine.transfer();\n outFile = results.destination?.file?.path ?? '';\n if ((opts.format ?? 'tar') === 'dir') {\n const metadataPath = path.join(outFile, 'metadata.json');\n if (!(await fs.pathExists(metadataPath))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export directory was not created correctly \"${outFile}\"`\n );\n }\n } else if (!(await fs.pathExists(outFile))) {\n throw new engineDataTransfer.errors.TransferEngineTransferError(\n `Export file not created \"${outFile}\"`\n );\n }\n\n // Note: we need to await telemetry or else the process ends before it is sent\n await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine));\n\n try {\n const table = buildTransferTable(results.engine);\n console.log(table?.toString());\n } catch {\n console.error('There was an error displaying the results of the transfer.');\n }\n\n console.log(`Export archive is in ${chalk.green(outFile)}`);\n exitWith(0, exitMessageText('export'));\n } catch {\n await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine));\n exitWith(1, exitMessageText('export', true));\n }\n};\n\n/**\n * It creates a local strapi destination provider\n */\nconst createSourceProvider = (strapi: Core.Strapi) => {\n return createLocalStrapiSourceProvider({\n async getStrapi() {\n return strapi;\n },\n });\n};\n\n/**\n * It creates a local file or directory destination provider based on the given options\n */\nconst createDestinationProvider = (opts: CmdOptions) => {\n const { file, compress, encrypt, key, maxSizeJsonl, format = 'tar' } = opts;\n\n const filepath = isString(file) && file.length > 0 ? file : getDefaultExportName();\n\n const maxSizeJsonlInMb = Number.isFinite(toNumber(maxSizeJsonl))\n ? toNumber(maxSizeJsonl) * BYTES_IN_MB\n : undefined;\n\n if (format === 'dir') {\n const { createLocalDirectoryDestinationProvider } = directoryDataTransfer.providers;\n const dirPath = path.isAbsolute(filepath) ? filepath : path.resolve(process.cwd(), filepath);\n return createLocalDirectoryDestinationProvider({\n directory: { path: dirPath },\n file: {\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n });\n }\n\n return createLocalFileDestinationProvider({\n file: {\n path: filepath,\n maxSizeJsonl: maxSizeJsonlInMb,\n },\n encryption: {\n enabled: encrypt ?? false,\n key: encrypt ? key : undefined,\n },\n compression: {\n enabled: compress ?? false,\n },\n });\n};\n"],"names":["providers","createLocalFileDestinationProvider","fileDataTransfer","createLocalStrapiSourceProvider","strapiDataTransfer","BYTES_IN_MB","opts","isObject","exitWith","normalizeExportDirFormatOpts","normalizeTransferFilterOptions","strapi","createStrapiInstance","validateContentTypeTransferOptionsForStrapi","source","createSourceProvider","destination","createDestinationProvider","engine","engineDataTransfer","createTransferEngine","versionStrategy","schemaStrategy","exclude","only","throttle","transforms","buildTransferTransforms","diagnostics","onDiagnostic","formatDiagnostic","verbose","progress","stream","updateLoader","loadersFactory","on","stage","data","start","succeed","console","log","logTransferFilterSummary","excludeContentTypes","onlyContentTypes","filesAutoExcluded","telemetry","send","getTransferTelemetryPayload","results","outFile","setSignalHandler","abortTransfer","transfer","file","path","format","metadataPath","join","fs","pathExists","errors","TransferEngineTransferError","table","buildTransferTable","toString","error","chalk","green","exitMessageText","getStrapi","compress","encrypt","key","maxSizeJsonl","filepath","isString","length","getDefaultExportName","maxSizeJsonlInMb","Number","isFinite","toNumber","undefined","createLocalDirectoryDestinationProvider","directoryDataTransfer","dirPath","isAbsolute","resolve","process","cwd","directory","encryption","enabled","compression"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var chalk = require('chalk');
|
|
5
5
|
var fse = require('fs-extra');
|
|
6
6
|
var dataTransfer = require('@strapi/data-transfer');
|
|
@@ -21,7 +21,7 @@ const { createTransferEngine, DEFAULT_VERSION_STRATEGY, DEFAULT_SCHEMA_STRATEGY
|
|
|
21
21
|
* It transfers data from a Strapi backup file or unpacked export directory to a local Strapi instance
|
|
22
22
|
*/ var action = (async (opts)=>{
|
|
23
23
|
// validate inputs from Commander
|
|
24
|
-
if (!
|
|
24
|
+
if (!_.isObject(opts)) {
|
|
25
25
|
helpers.exitWith(1, 'Could not parse arguments');
|
|
26
26
|
}
|
|
27
27
|
dataTransfer$1.normalizeTransferFilterOptions(opts);
|