@strapi/strapi 5.56.0 → 5.57.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,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var fse = require('fs-extra');
|
|
5
|
+
var dotenv = require('dotenv');
|
|
6
|
+
var getInquirer = require('../../../utils/get-inquirer.js');
|
|
7
|
+
var constants = require('./constants.js');
|
|
8
|
+
var errors = require('./errors.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 dotenv__default = /*#__PURE__*/_interopDefault(dotenv);
|
|
15
|
+
|
|
16
|
+
const LICENSE_SOURCE_LABELS = {
|
|
17
|
+
environment: 'the STRAPI_LICENSE environment variable',
|
|
18
|
+
'env-file': 'STRAPI_LICENSE in .env',
|
|
19
|
+
'license-file': constants.LICENSE_FILE_NAME
|
|
20
|
+
};
|
|
21
|
+
const cleanLicense = (value)=>value?.trim() || undefined;
|
|
22
|
+
const readLicenseFile = async (appDir)=>{
|
|
23
|
+
try {
|
|
24
|
+
return await fse__default.default.readFile(path__default.default.join(appDir, constants.LICENSE_FILE_NAME), 'utf8');
|
|
25
|
+
} catch (error) {
|
|
26
|
+
if (error?.code === 'ENOENT') {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const readLicenseInfo = (license)=>{
|
|
33
|
+
const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\n');
|
|
34
|
+
if (!signature || !base64Content) {
|
|
35
|
+
throw new Error('Invalid license.');
|
|
36
|
+
}
|
|
37
|
+
const licenseInfo = JSON.parse(Buffer.from(base64Content, 'base64').toString());
|
|
38
|
+
if (typeof licenseInfo !== 'object' || licenseInfo === null) {
|
|
39
|
+
throw new Error('Invalid license.');
|
|
40
|
+
}
|
|
41
|
+
return licenseInfo;
|
|
42
|
+
};
|
|
43
|
+
const readEnvFileLicense = async (appDir, env)=>{
|
|
44
|
+
const envFilePath = env.ENV_PATH ? path__default.default.resolve(appDir, env.ENV_PATH) : path__default.default.join(appDir, '.env');
|
|
45
|
+
if (!await fse__default.default.pathExists(envFilePath)) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return cleanLicense(dotenv__default.default.parse(await fse__default.default.readFile(envFilePath)).STRAPI_LICENSE);
|
|
49
|
+
};
|
|
50
|
+
const findLicense = async ({ appDir, env })=>{
|
|
51
|
+
const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);
|
|
52
|
+
if (licenseFromEnvironment) {
|
|
53
|
+
const isFromEnvFile = await readEnvFileLicense(appDir, env) === licenseFromEnvironment;
|
|
54
|
+
return {
|
|
55
|
+
license: licenseFromEnvironment,
|
|
56
|
+
source: isFromEnvFile ? 'env-file' : 'environment'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
let licenseFromLicenseFile;
|
|
60
|
+
try {
|
|
61
|
+
licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));
|
|
62
|
+
} catch {
|
|
63
|
+
throw new errors.EnterpriseInstallError(`Could not read ${constants.LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`);
|
|
64
|
+
}
|
|
65
|
+
if (licenseFromLicenseFile) {
|
|
66
|
+
return {
|
|
67
|
+
license: licenseFromLicenseFile,
|
|
68
|
+
source: 'license-file'
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
};
|
|
73
|
+
const validateLicense = (license, now)=>{
|
|
74
|
+
let licenseInfo;
|
|
75
|
+
try {
|
|
76
|
+
licenseInfo = readLicenseInfo(license);
|
|
77
|
+
} catch {
|
|
78
|
+
throw new errors.EnterpriseInstallError(`This Strapi license is not valid. Check that you copied all of it, or find it at ${constants.BILLING_URL}`);
|
|
79
|
+
}
|
|
80
|
+
const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);
|
|
81
|
+
if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {
|
|
82
|
+
throw new errors.EnterpriseInstallError(`This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${constants.BILLING_URL}`);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const promptForLicense = async ()=>{
|
|
86
|
+
const inquirer = await getInquirer.getInquirer();
|
|
87
|
+
const { license } = await inquirer.prompt([
|
|
88
|
+
{
|
|
89
|
+
type: 'password',
|
|
90
|
+
name: 'license',
|
|
91
|
+
message: 'Strapi license?',
|
|
92
|
+
validate: (value)=>value.trim().length > 0 || 'The license cannot be empty.'
|
|
93
|
+
}
|
|
94
|
+
]);
|
|
95
|
+
return license.trim();
|
|
96
|
+
};
|
|
97
|
+
const isLicenseFileIgnored = (gitignoreContent)=>gitignoreContent.split(/\r?\n/).map((line)=>line.trim()).some((line)=>line === constants.LICENSE_FILE_NAME || line === `/${constants.LICENSE_FILE_NAME}`);
|
|
98
|
+
const ensureLicenseFileIsIgnored = async (appDir, logger)=>{
|
|
99
|
+
const gitignorePath = path__default.default.join(appDir, '.gitignore');
|
|
100
|
+
const gitignoreContent = await fse__default.default.pathExists(gitignorePath) ? await fse__default.default.readFile(gitignorePath, 'utf8') : '';
|
|
101
|
+
if (isLicenseFileIgnored(gitignoreContent)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\n') ? '\n' : '';
|
|
105
|
+
await fse__default.default.writeFile(gitignorePath, `${gitignoreContent}${separator}${constants.LICENSE_FILE_NAME}\n`);
|
|
106
|
+
logger.info(`Added ${constants.LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);
|
|
107
|
+
};
|
|
108
|
+
const saveLicenseFile = async (appDir, license, logger)=>{
|
|
109
|
+
const licenseFilePath = path__default.default.join(appDir, constants.LICENSE_FILE_NAME);
|
|
110
|
+
await fse__default.default.writeFile(licenseFilePath, `${license}\n`);
|
|
111
|
+
// Also restricts a license.txt that already existed, empty, with wider permissions.
|
|
112
|
+
await fse__default.default.chmod(licenseFilePath, 0o600);
|
|
113
|
+
await ensureLicenseFileIsIgnored(appDir, logger);
|
|
114
|
+
};
|
|
115
|
+
const resolveLicense = async ({ appDir, isInteractive, logger, env, now, prompt })=>{
|
|
116
|
+
const foundLicense = await findLicense({
|
|
117
|
+
appDir,
|
|
118
|
+
env
|
|
119
|
+
});
|
|
120
|
+
if (foundLicense) {
|
|
121
|
+
validateLicense(foundLicense.license, now);
|
|
122
|
+
logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);
|
|
123
|
+
return foundLicense;
|
|
124
|
+
}
|
|
125
|
+
if (!isInteractive) {
|
|
126
|
+
throw new errors.EnterpriseInstallError('No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.');
|
|
127
|
+
}
|
|
128
|
+
logger.info(`No Strapi license found. You can find yours at ${constants.BILLING_URL}`);
|
|
129
|
+
const pastedLicense = await prompt();
|
|
130
|
+
validateLicense(pastedLicense, now);
|
|
131
|
+
await saveLicenseFile(appDir, pastedLicense, logger);
|
|
132
|
+
logger.success(`Saved the license to ${constants.LICENSE_FILE_NAME}.`);
|
|
133
|
+
return {
|
|
134
|
+
license: pastedLicense,
|
|
135
|
+
source: 'prompt'
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
exports.findLicense = findLicense;
|
|
140
|
+
exports.promptForLicense = promptForLicense;
|
|
141
|
+
exports.resolveLicense = resolveLicense;
|
|
142
|
+
exports.saveLicenseFile = saveLicenseFile;
|
|
143
|
+
exports.validateLicense = validateLicense;
|
|
144
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sources":["../../../../../../src/cli/commands/enterprise/install/license.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport dotenv from 'dotenv';\n\nimport { getInquirer } from '../../../utils/get-inquirer';\nimport type { Logger } from '../../../utils/logger';\nimport { BILLING_URL, LICENSE_FILE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\n\nexport type LicenseSource = 'environment' | 'env-file' | 'license-file';\n\nexport interface FoundLicense {\n license: string;\n source: LicenseSource;\n}\n\nexport interface ResolvedLicense {\n license: string;\n /** `prompt` when the user pasted it, which also saved it to license.txt. */\n source: LicenseSource | 'prompt';\n}\n\nconst LICENSE_SOURCE_LABELS: Record<LicenseSource, string> = {\n environment: 'the STRAPI_LICENSE environment variable',\n 'env-file': 'STRAPI_LICENSE in .env',\n 'license-file': LICENSE_FILE_NAME,\n};\n\nconst cleanLicense = (value: string | undefined): string | undefined => value?.trim() || undefined;\n\nconst readLicenseFile = async (appDir: string): Promise<string | undefined> => {\n try {\n return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n};\n\ninterface LicenseInfo {\n expireAt?: string | number;\n}\n\nconst readLicenseInfo = (license: string): LicenseInfo => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: unknown = JSON.parse(Buffer.from(base64Content, 'base64').toString());\n\n if (typeof licenseInfo !== 'object' || licenseInfo === null) {\n throw new Error('Invalid license.');\n }\n\n return licenseInfo as LicenseInfo;\n};\n\nconst readEnvFileLicense = async (\n appDir: string,\n env: NodeJS.ProcessEnv\n): Promise<string | undefined> => {\n const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');\n\n if (!(await fse.pathExists(envFilePath))) {\n return undefined;\n }\n\n return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);\n};\n\nexport const findLicense = async ({\n appDir,\n env,\n}: {\n appDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<FoundLicense | undefined> => {\n const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);\n if (licenseFromEnvironment) {\n const isFromEnvFile = (await readEnvFileLicense(appDir, env)) === licenseFromEnvironment;\n\n return { license: licenseFromEnvironment, source: isFromEnvFile ? 'env-file' : 'environment' };\n }\n\n let licenseFromLicenseFile: string | undefined;\n\n try {\n licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));\n } catch {\n throw new EnterpriseInstallError(\n `Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`\n );\n }\n\n if (licenseFromLicenseFile) {\n return { license: licenseFromLicenseFile, source: 'license-file' };\n }\n\n return undefined;\n};\n\nexport const validateLicense = (license: string, now: Date): void => {\n let licenseInfo: LicenseInfo;\n\n try {\n licenseInfo = readLicenseInfo(license);\n } catch {\n throw new EnterpriseInstallError(\n `This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`\n );\n }\n\n const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);\n\n if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {\n throw new EnterpriseInstallError(\n `This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`\n );\n }\n};\n\nexport const promptForLicense = async (): Promise<string> => {\n const inquirer = await getInquirer();\n const { license } = await inquirer.prompt<{ license: string }>([\n {\n type: 'password',\n name: 'license',\n message: 'Strapi license?',\n validate: (value: string) => value.trim().length > 0 || 'The license cannot be empty.',\n },\n ]);\n\n return license.trim();\n};\n\nconst isLicenseFileIgnored = (gitignoreContent: string): boolean =>\n gitignoreContent\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);\n\nconst ensureLicenseFileIsIgnored = async (appDir: string, logger: Logger): Promise<void> => {\n const gitignorePath = path.join(appDir, '.gitignore');\n const gitignoreContent = (await fse.pathExists(gitignorePath))\n ? await fse.readFile(gitignorePath, 'utf8')\n : '';\n\n if (isLicenseFileIgnored(gitignoreContent)) {\n return;\n }\n\n const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\\n') ? '\\n' : '';\n await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\\n`);\n logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);\n};\n\nexport const saveLicenseFile = async (\n appDir: string,\n license: string,\n logger: Logger\n): Promise<void> => {\n const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);\n\n await fse.writeFile(licenseFilePath, `${license}\\n`);\n // Also restricts a license.txt that already existed, empty, with wider permissions.\n await fse.chmod(licenseFilePath, 0o600);\n await ensureLicenseFileIsIgnored(appDir, logger);\n};\n\nexport const resolveLicense = async ({\n appDir,\n isInteractive,\n logger,\n env,\n now,\n prompt,\n}: {\n appDir: string;\n isInteractive: boolean;\n logger: Logger;\n env: NodeJS.ProcessEnv;\n now: Date;\n prompt: () => Promise<string>;\n}): Promise<ResolvedLicense> => {\n const foundLicense = await findLicense({ appDir, env });\n\n if (foundLicense) {\n validateLicense(foundLicense.license, now);\n logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);\n\n return foundLicense;\n }\n\n if (!isInteractive) {\n throw new EnterpriseInstallError(\n 'No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.'\n );\n }\n\n logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);\n\n const pastedLicense = await prompt();\n validateLicense(pastedLicense, now);\n await saveLicenseFile(appDir, pastedLicense, logger);\n logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);\n\n return { license: pastedLicense, source: 'prompt' };\n};\n"],"names":["LICENSE_SOURCE_LABELS","environment","LICENSE_FILE_NAME","cleanLicense","value","trim","undefined","readLicenseFile","appDir","fse","readFile","path","join","error","code","readLicenseInfo","license","signature","base64Content","Buffer","from","toString","split","Error","licenseInfo","JSON","parse","readEnvFileLicense","env","envFilePath","ENV_PATH","resolve","pathExists","dotenv","STRAPI_LICENSE","findLicense","licenseFromEnvironment","isFromEnvFile","source","licenseFromLicenseFile","EnterpriseInstallError","validateLicense","now","BILLING_URL","expiresAt","expireAt","Date","Number","isNaN","getTime","toISOString","slice","promptForLicense","inquirer","getInquirer","prompt","type","name","message","validate","length","isLicenseFileIgnored","gitignoreContent","map","line","some","ensureLicenseFileIsIgnored","logger","gitignorePath","separator","endsWith","writeFile","info","saveLicenseFile","licenseFilePath","chmod","resolveLicense","isInteractive","foundLicense","pastedLicense","success"],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fse from 'fs-extra';
|
|
3
|
+
import dotenv from 'dotenv';
|
|
4
|
+
import { getInquirer } from '../../../utils/get-inquirer.mjs';
|
|
5
|
+
import { LICENSE_FILE_NAME, BILLING_URL } from './constants.mjs';
|
|
6
|
+
import { EnterpriseInstallError } from './errors.mjs';
|
|
7
|
+
|
|
8
|
+
const LICENSE_SOURCE_LABELS = {
|
|
9
|
+
environment: 'the STRAPI_LICENSE environment variable',
|
|
10
|
+
'env-file': 'STRAPI_LICENSE in .env',
|
|
11
|
+
'license-file': LICENSE_FILE_NAME
|
|
12
|
+
};
|
|
13
|
+
const cleanLicense = (value)=>value?.trim() || undefined;
|
|
14
|
+
const readLicenseFile = async (appDir)=>{
|
|
15
|
+
try {
|
|
16
|
+
return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');
|
|
17
|
+
} catch (error) {
|
|
18
|
+
if (error?.code === 'ENOENT') {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const readLicenseInfo = (license)=>{
|
|
25
|
+
const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\n');
|
|
26
|
+
if (!signature || !base64Content) {
|
|
27
|
+
throw new Error('Invalid license.');
|
|
28
|
+
}
|
|
29
|
+
const licenseInfo = JSON.parse(Buffer.from(base64Content, 'base64').toString());
|
|
30
|
+
if (typeof licenseInfo !== 'object' || licenseInfo === null) {
|
|
31
|
+
throw new Error('Invalid license.');
|
|
32
|
+
}
|
|
33
|
+
return licenseInfo;
|
|
34
|
+
};
|
|
35
|
+
const readEnvFileLicense = async (appDir, env)=>{
|
|
36
|
+
const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');
|
|
37
|
+
if (!await fse.pathExists(envFilePath)) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);
|
|
41
|
+
};
|
|
42
|
+
const findLicense = async ({ appDir, env })=>{
|
|
43
|
+
const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);
|
|
44
|
+
if (licenseFromEnvironment) {
|
|
45
|
+
const isFromEnvFile = await readEnvFileLicense(appDir, env) === licenseFromEnvironment;
|
|
46
|
+
return {
|
|
47
|
+
license: licenseFromEnvironment,
|
|
48
|
+
source: isFromEnvFile ? 'env-file' : 'environment'
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
let licenseFromLicenseFile;
|
|
52
|
+
try {
|
|
53
|
+
licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));
|
|
54
|
+
} catch {
|
|
55
|
+
throw new EnterpriseInstallError(`Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`);
|
|
56
|
+
}
|
|
57
|
+
if (licenseFromLicenseFile) {
|
|
58
|
+
return {
|
|
59
|
+
license: licenseFromLicenseFile,
|
|
60
|
+
source: 'license-file'
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
};
|
|
65
|
+
const validateLicense = (license, now)=>{
|
|
66
|
+
let licenseInfo;
|
|
67
|
+
try {
|
|
68
|
+
licenseInfo = readLicenseInfo(license);
|
|
69
|
+
} catch {
|
|
70
|
+
throw new EnterpriseInstallError(`This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`);
|
|
71
|
+
}
|
|
72
|
+
const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);
|
|
73
|
+
if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {
|
|
74
|
+
throw new EnterpriseInstallError(`This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const promptForLicense = async ()=>{
|
|
78
|
+
const inquirer = await getInquirer();
|
|
79
|
+
const { license } = await inquirer.prompt([
|
|
80
|
+
{
|
|
81
|
+
type: 'password',
|
|
82
|
+
name: 'license',
|
|
83
|
+
message: 'Strapi license?',
|
|
84
|
+
validate: (value)=>value.trim().length > 0 || 'The license cannot be empty.'
|
|
85
|
+
}
|
|
86
|
+
]);
|
|
87
|
+
return license.trim();
|
|
88
|
+
};
|
|
89
|
+
const isLicenseFileIgnored = (gitignoreContent)=>gitignoreContent.split(/\r?\n/).map((line)=>line.trim()).some((line)=>line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);
|
|
90
|
+
const ensureLicenseFileIsIgnored = async (appDir, logger)=>{
|
|
91
|
+
const gitignorePath = path.join(appDir, '.gitignore');
|
|
92
|
+
const gitignoreContent = await fse.pathExists(gitignorePath) ? await fse.readFile(gitignorePath, 'utf8') : '';
|
|
93
|
+
if (isLicenseFileIgnored(gitignoreContent)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\n') ? '\n' : '';
|
|
97
|
+
await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\n`);
|
|
98
|
+
logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);
|
|
99
|
+
};
|
|
100
|
+
const saveLicenseFile = async (appDir, license, logger)=>{
|
|
101
|
+
const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);
|
|
102
|
+
await fse.writeFile(licenseFilePath, `${license}\n`);
|
|
103
|
+
// Also restricts a license.txt that already existed, empty, with wider permissions.
|
|
104
|
+
await fse.chmod(licenseFilePath, 0o600);
|
|
105
|
+
await ensureLicenseFileIsIgnored(appDir, logger);
|
|
106
|
+
};
|
|
107
|
+
const resolveLicense = async ({ appDir, isInteractive, logger, env, now, prompt })=>{
|
|
108
|
+
const foundLicense = await findLicense({
|
|
109
|
+
appDir,
|
|
110
|
+
env
|
|
111
|
+
});
|
|
112
|
+
if (foundLicense) {
|
|
113
|
+
validateLicense(foundLicense.license, now);
|
|
114
|
+
logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);
|
|
115
|
+
return foundLicense;
|
|
116
|
+
}
|
|
117
|
+
if (!isInteractive) {
|
|
118
|
+
throw new EnterpriseInstallError('No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.');
|
|
119
|
+
}
|
|
120
|
+
logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);
|
|
121
|
+
const pastedLicense = await prompt();
|
|
122
|
+
validateLicense(pastedLicense, now);
|
|
123
|
+
await saveLicenseFile(appDir, pastedLicense, logger);
|
|
124
|
+
logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);
|
|
125
|
+
return {
|
|
126
|
+
license: pastedLicense,
|
|
127
|
+
source: 'prompt'
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export { findLicense, promptForLicense, resolveLicense, saveLicenseFile, validateLicense };
|
|
132
|
+
//# sourceMappingURL=license.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/license.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport dotenv from 'dotenv';\n\nimport { getInquirer } from '../../../utils/get-inquirer';\nimport type { Logger } from '../../../utils/logger';\nimport { BILLING_URL, LICENSE_FILE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\n\nexport type LicenseSource = 'environment' | 'env-file' | 'license-file';\n\nexport interface FoundLicense {\n license: string;\n source: LicenseSource;\n}\n\nexport interface ResolvedLicense {\n license: string;\n /** `prompt` when the user pasted it, which also saved it to license.txt. */\n source: LicenseSource | 'prompt';\n}\n\nconst LICENSE_SOURCE_LABELS: Record<LicenseSource, string> = {\n environment: 'the STRAPI_LICENSE environment variable',\n 'env-file': 'STRAPI_LICENSE in .env',\n 'license-file': LICENSE_FILE_NAME,\n};\n\nconst cleanLicense = (value: string | undefined): string | undefined => value?.trim() || undefined;\n\nconst readLicenseFile = async (appDir: string): Promise<string | undefined> => {\n try {\n return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n};\n\ninterface LicenseInfo {\n expireAt?: string | number;\n}\n\nconst readLicenseInfo = (license: string): LicenseInfo => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: unknown = JSON.parse(Buffer.from(base64Content, 'base64').toString());\n\n if (typeof licenseInfo !== 'object' || licenseInfo === null) {\n throw new Error('Invalid license.');\n }\n\n return licenseInfo as LicenseInfo;\n};\n\nconst readEnvFileLicense = async (\n appDir: string,\n env: NodeJS.ProcessEnv\n): Promise<string | undefined> => {\n const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');\n\n if (!(await fse.pathExists(envFilePath))) {\n return undefined;\n }\n\n return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);\n};\n\nexport const findLicense = async ({\n appDir,\n env,\n}: {\n appDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<FoundLicense | undefined> => {\n const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);\n if (licenseFromEnvironment) {\n const isFromEnvFile = (await readEnvFileLicense(appDir, env)) === licenseFromEnvironment;\n\n return { license: licenseFromEnvironment, source: isFromEnvFile ? 'env-file' : 'environment' };\n }\n\n let licenseFromLicenseFile: string | undefined;\n\n try {\n licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));\n } catch {\n throw new EnterpriseInstallError(\n `Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`\n );\n }\n\n if (licenseFromLicenseFile) {\n return { license: licenseFromLicenseFile, source: 'license-file' };\n }\n\n return undefined;\n};\n\nexport const validateLicense = (license: string, now: Date): void => {\n let licenseInfo: LicenseInfo;\n\n try {\n licenseInfo = readLicenseInfo(license);\n } catch {\n throw new EnterpriseInstallError(\n `This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`\n );\n }\n\n const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);\n\n if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {\n throw new EnterpriseInstallError(\n `This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`\n );\n }\n};\n\nexport const promptForLicense = async (): Promise<string> => {\n const inquirer = await getInquirer();\n const { license } = await inquirer.prompt<{ license: string }>([\n {\n type: 'password',\n name: 'license',\n message: 'Strapi license?',\n validate: (value: string) => value.trim().length > 0 || 'The license cannot be empty.',\n },\n ]);\n\n return license.trim();\n};\n\nconst isLicenseFileIgnored = (gitignoreContent: string): boolean =>\n gitignoreContent\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);\n\nconst ensureLicenseFileIsIgnored = async (appDir: string, logger: Logger): Promise<void> => {\n const gitignorePath = path.join(appDir, '.gitignore');\n const gitignoreContent = (await fse.pathExists(gitignorePath))\n ? await fse.readFile(gitignorePath, 'utf8')\n : '';\n\n if (isLicenseFileIgnored(gitignoreContent)) {\n return;\n }\n\n const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\\n') ? '\\n' : '';\n await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\\n`);\n logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);\n};\n\nexport const saveLicenseFile = async (\n appDir: string,\n license: string,\n logger: Logger\n): Promise<void> => {\n const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);\n\n await fse.writeFile(licenseFilePath, `${license}\\n`);\n // Also restricts a license.txt that already existed, empty, with wider permissions.\n await fse.chmod(licenseFilePath, 0o600);\n await ensureLicenseFileIsIgnored(appDir, logger);\n};\n\nexport const resolveLicense = async ({\n appDir,\n isInteractive,\n logger,\n env,\n now,\n prompt,\n}: {\n appDir: string;\n isInteractive: boolean;\n logger: Logger;\n env: NodeJS.ProcessEnv;\n now: Date;\n prompt: () => Promise<string>;\n}): Promise<ResolvedLicense> => {\n const foundLicense = await findLicense({ appDir, env });\n\n if (foundLicense) {\n validateLicense(foundLicense.license, now);\n logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);\n\n return foundLicense;\n }\n\n if (!isInteractive) {\n throw new EnterpriseInstallError(\n 'No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.'\n );\n }\n\n logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);\n\n const pastedLicense = await prompt();\n validateLicense(pastedLicense, now);\n await saveLicenseFile(appDir, pastedLicense, logger);\n logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);\n\n return { license: pastedLicense, source: 'prompt' };\n};\n"],"names":["LICENSE_SOURCE_LABELS","environment","LICENSE_FILE_NAME","cleanLicense","value","trim","undefined","readLicenseFile","appDir","fse","readFile","path","join","error","code","readLicenseInfo","license","signature","base64Content","Buffer","from","toString","split","Error","licenseInfo","JSON","parse","readEnvFileLicense","env","envFilePath","ENV_PATH","resolve","pathExists","dotenv","STRAPI_LICENSE","findLicense","licenseFromEnvironment","isFromEnvFile","source","licenseFromLicenseFile","EnterpriseInstallError","validateLicense","now","BILLING_URL","expiresAt","expireAt","Date","Number","isNaN","getTime","toISOString","slice","promptForLicense","inquirer","getInquirer","prompt","type","name","message","validate","length","isLicenseFileIgnored","gitignoreContent","map","line","some","ensureLicenseFileIsIgnored","logger","gitignorePath","separator","endsWith","writeFile","info","saveLicenseFile","licenseFilePath","chmod","resolveLicense","isInteractive","foundLicense","pastedLicense","success"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var fse = require('fs-extra');
|
|
5
|
+
var execa = require('execa');
|
|
6
|
+
var utils = require('@strapi/utils');
|
|
7
|
+
var errors = require('./errors.js');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
12
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
13
|
+
var execa__default = /*#__PURE__*/_interopDefault(execa);
|
|
14
|
+
|
|
15
|
+
/** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */ const parsePackageManagerField = (packageManagerField)=>{
|
|
16
|
+
if (typeof packageManagerField !== 'string') {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\d+)/);
|
|
20
|
+
if (!fieldMatch) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
name: fieldMatch[1],
|
|
25
|
+
majorVersion: Number(fieldMatch[2])
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const YARN_VERSION_UNKNOWN = 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set "packageManager" in package.json.';
|
|
29
|
+
const readYarnMajorVersion = async (appDir)=>{
|
|
30
|
+
const { stdout } = await execa__default.default('yarn', [
|
|
31
|
+
'--version'
|
|
32
|
+
], {
|
|
33
|
+
cwd: appDir
|
|
34
|
+
}).catch(()=>{
|
|
35
|
+
throw new errors.EnterpriseInstallError(YARN_VERSION_UNKNOWN);
|
|
36
|
+
});
|
|
37
|
+
const majorVersion = Number.parseInt(stdout.trim(), 10);
|
|
38
|
+
// Guessing Yarn 1 would set up a file that Yarn 2+ never reads.
|
|
39
|
+
if (Number.isNaN(majorVersion)) {
|
|
40
|
+
throw new errors.EnterpriseInstallError(YARN_VERSION_UNKNOWN);
|
|
41
|
+
}
|
|
42
|
+
return majorVersion;
|
|
43
|
+
};
|
|
44
|
+
const detectPackageManager = async (appDir)=>{
|
|
45
|
+
const packageJson = await fse__default.default.readJson(path__default.default.join(appDir, 'package.json')).catch(()=>({}));
|
|
46
|
+
const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);
|
|
47
|
+
if (packageManagerFromField) {
|
|
48
|
+
return packageManagerFromField;
|
|
49
|
+
}
|
|
50
|
+
// Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a
|
|
51
|
+
// fresh clone whose dependencies are not installed yet.
|
|
52
|
+
const packageManagerName = await utils.packageManager.getPreferred(appDir).catch(()=>{
|
|
53
|
+
throw new errors.EnterpriseInstallError('Could not tell which package manager this app uses. Install its dependencies first, or set "packageManager" in package.json.');
|
|
54
|
+
});
|
|
55
|
+
if (packageManagerName === 'yarn') {
|
|
56
|
+
return {
|
|
57
|
+
name: 'yarn',
|
|
58
|
+
majorVersion: await readYarnMajorVersion(appDir)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
name: packageManagerName
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.
|
|
67
|
+
*/ const readsYarnrcYml = (packageManager)=>packageManager.name === 'yarn' && packageManager.majorVersion >= 2;
|
|
68
|
+
|
|
69
|
+
exports.detectPackageManager = detectPackageManager;
|
|
70
|
+
exports.parsePackageManagerField = parsePackageManagerField;
|
|
71
|
+
exports.readsYarnrcYml = readsYarnrcYml;
|
|
72
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sources":["../../../../../../src/cli/commands/enterprise/install/package-manager.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport execa from 'execa';\nimport { packageManager as packageManagerUtils } from '@strapi/utils';\n\nimport { EnterpriseInstallError } from './errors';\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn';\n\n/** Yarn's major version matters: Yarn 2 and later read another configuration file. */\nexport type DetectedPackageManager =\n | { name: 'npm' | 'pnpm'; majorVersion?: number }\n | { name: 'yarn'; majorVersion: number };\n\n/** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */\nexport const parsePackageManagerField = (\n packageManagerField: unknown\n): DetectedPackageManager | undefined => {\n if (typeof packageManagerField !== 'string') {\n return undefined;\n }\n\n const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\\d+)/);\n\n if (!fieldMatch) {\n return undefined;\n }\n\n return { name: fieldMatch[1] as PackageManagerName, majorVersion: Number(fieldMatch[2]) };\n};\n\nconst YARN_VERSION_UNKNOWN =\n 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set \"packageManager\" in package.json.';\n\nconst readYarnMajorVersion = async (appDir: string): Promise<number> => {\n const { stdout } = await execa('yarn', ['--version'], { cwd: appDir }).catch(() => {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n });\n const majorVersion = Number.parseInt(stdout.trim(), 10);\n\n // Guessing Yarn 1 would set up a file that Yarn 2+ never reads.\n if (Number.isNaN(majorVersion)) {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n }\n\n return majorVersion;\n};\n\nexport const detectPackageManager = async (appDir: string): Promise<DetectedPackageManager> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);\n\n if (packageManagerFromField) {\n return packageManagerFromField;\n }\n\n // Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a\n // fresh clone whose dependencies are not installed yet.\n const packageManagerName = await packageManagerUtils.getPreferred(appDir).catch(() => {\n throw new EnterpriseInstallError(\n 'Could not tell which package manager this app uses. Install its dependencies first, or set \"packageManager\" in package.json.'\n );\n });\n\n if (packageManagerName === 'yarn') {\n return { name: 'yarn', majorVersion: await readYarnMajorVersion(appDir) };\n }\n\n return { name: packageManagerName };\n};\n\n/**\n * Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.\n */\nexport const readsYarnrcYml = (packageManager: DetectedPackageManager): boolean =>\n packageManager.name === 'yarn' && packageManager.majorVersion >= 2;\n"],"names":["parsePackageManagerField","packageManagerField","undefined","fieldMatch","match","name","majorVersion","Number","YARN_VERSION_UNKNOWN","readYarnMajorVersion","appDir","stdout","execa","cwd","catch","EnterpriseInstallError","parseInt","trim","isNaN","detectPackageManager","packageJson","fse","readJson","path","join","packageManagerFromField","packageManager","packageManagerName","packageManagerUtils","getPreferred","readsYarnrcYml"],"mappings":";;;;;;;;;;;;;;AAcA,sFACO,MAAMA,wBAAAA,GAA2B,CACtCC,mBAAAA,GAAAA;IAEA,IAAI,OAAOA,wBAAwB,QAAA,EAAU;QAC3C,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAMC,UAAAA,GAAaF,mBAAAA,CAAoBG,KAAK,CAAC,wBAAA,CAAA;AAE7C,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,OAAOD,SAAAA;AACT,IAAA;IAEA,OAAO;QAAEG,IAAAA,EAAMF,UAAU,CAAC,CAAA,CAAE;QAAwBG,YAAAA,EAAcC,MAAAA,CAAOJ,UAAU,CAAC,CAAA,CAAE;AAAE,KAAA;AAC1F;AAEA,MAAMK,oBAAAA,GACJ,kIAAA;AAEF,MAAMC,uBAAuB,OAAOC,MAAAA,GAAAA;AAClC,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,uBAAM,MAAA,EAAQ;AAAC,QAAA;KAAY,EAAE;QAAEC,GAAAA,EAAKH;AAAO,KAAA,CAAA,CAAGI,KAAK,CAAC,IAAA;AAC3E,QAAA,MAAM,IAAIC,6BAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA,CAAA,CAAA;AACA,IAAA,MAAMF,eAAeC,MAAAA,CAAOS,QAAQ,CAACL,MAAAA,CAAOM,IAAI,EAAA,EAAI,EAAA,CAAA;;IAGpD,IAAIV,MAAAA,CAAOW,KAAK,CAACZ,YAAAA,CAAAA,EAAe;AAC9B,QAAA,MAAM,IAAIS,6BAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA;IAEA,OAAOF,YAAAA;AACT,CAAA;AAEO,MAAMa,uBAAuB,OAAOT,MAAAA,GAAAA;AACzC,IAAA,MAAMU,WAAAA,GAAc,MAAMC,oBAAAA,CAAIC,QAAQ,CAACC,qBAAAA,CAAKC,IAAI,CAACd,MAAAA,EAAQ,iBAAiBI,KAAK,CAAC,KAAO,EAAC,CAAA,CAAA;IACxF,MAAMW,uBAAAA,GAA0BzB,wBAAAA,CAAyBoB,WAAAA,CAAYM,cAAc,CAAA;AAEnF,IAAA,IAAID,uBAAAA,EAAyB;QAC3B,OAAOA,uBAAAA;AACT,IAAA;;;AAIA,IAAA,MAAME,qBAAqB,MAAMC,oBAAAA,CAAoBC,YAAY,CAACnB,MAAAA,CAAAA,CAAQI,KAAK,CAAC,IAAA;AAC9E,QAAA,MAAM,IAAIC,6BAAAA,CACR,8HAAA,CAAA;AAEJ,IAAA,CAAA,CAAA;AAEA,IAAA,IAAIY,uBAAuB,MAAA,EAAQ;QACjC,OAAO;YAAEtB,IAAAA,EAAM,MAAA;AAAQC,YAAAA,YAAAA,EAAc,MAAMG,oBAAAA,CAAqBC,MAAAA;AAAQ,SAAA;AAC1E,IAAA;IAEA,OAAO;QAAEL,IAAAA,EAAMsB;AAAmB,KAAA;AACpC;AAEA;;AAEC,IACM,MAAMG,cAAAA,GAAiB,CAACJ,cAAAA,GAC7BA,cAAAA,CAAerB,IAAI,KAAK,MAAA,IAAUqB,cAAAA,CAAepB,YAAY,IAAI;;;;;;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fse from 'fs-extra';
|
|
3
|
+
import execa from 'execa';
|
|
4
|
+
import { packageManager } from '@strapi/utils';
|
|
5
|
+
import { EnterpriseInstallError } from './errors.mjs';
|
|
6
|
+
|
|
7
|
+
/** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */ const parsePackageManagerField = (packageManagerField)=>{
|
|
8
|
+
if (typeof packageManagerField !== 'string') {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\d+)/);
|
|
12
|
+
if (!fieldMatch) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
name: fieldMatch[1],
|
|
17
|
+
majorVersion: Number(fieldMatch[2])
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
const YARN_VERSION_UNKNOWN = 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set "packageManager" in package.json.';
|
|
21
|
+
const readYarnMajorVersion = async (appDir)=>{
|
|
22
|
+
const { stdout } = await execa('yarn', [
|
|
23
|
+
'--version'
|
|
24
|
+
], {
|
|
25
|
+
cwd: appDir
|
|
26
|
+
}).catch(()=>{
|
|
27
|
+
throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);
|
|
28
|
+
});
|
|
29
|
+
const majorVersion = Number.parseInt(stdout.trim(), 10);
|
|
30
|
+
// Guessing Yarn 1 would set up a file that Yarn 2+ never reads.
|
|
31
|
+
if (Number.isNaN(majorVersion)) {
|
|
32
|
+
throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);
|
|
33
|
+
}
|
|
34
|
+
return majorVersion;
|
|
35
|
+
};
|
|
36
|
+
const detectPackageManager = async (appDir)=>{
|
|
37
|
+
const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(()=>({}));
|
|
38
|
+
const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);
|
|
39
|
+
if (packageManagerFromField) {
|
|
40
|
+
return packageManagerFromField;
|
|
41
|
+
}
|
|
42
|
+
// Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a
|
|
43
|
+
// fresh clone whose dependencies are not installed yet.
|
|
44
|
+
const packageManagerName = await packageManager.getPreferred(appDir).catch(()=>{
|
|
45
|
+
throw new EnterpriseInstallError('Could not tell which package manager this app uses. Install its dependencies first, or set "packageManager" in package.json.');
|
|
46
|
+
});
|
|
47
|
+
if (packageManagerName === 'yarn') {
|
|
48
|
+
return {
|
|
49
|
+
name: 'yarn',
|
|
50
|
+
majorVersion: await readYarnMajorVersion(appDir)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
name: packageManagerName
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.
|
|
59
|
+
*/ const readsYarnrcYml = (packageManager)=>packageManager.name === 'yarn' && packageManager.majorVersion >= 2;
|
|
60
|
+
|
|
61
|
+
export { detectPackageManager, parsePackageManagerField, readsYarnrcYml };
|
|
62
|
+
//# sourceMappingURL=package-manager.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/package-manager.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport execa from 'execa';\nimport { packageManager as packageManagerUtils } from '@strapi/utils';\n\nimport { EnterpriseInstallError } from './errors';\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn';\n\n/** Yarn's major version matters: Yarn 2 and later read another configuration file. */\nexport type DetectedPackageManager =\n | { name: 'npm' | 'pnpm'; majorVersion?: number }\n | { name: 'yarn'; majorVersion: number };\n\n/** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */\nexport const parsePackageManagerField = (\n packageManagerField: unknown\n): DetectedPackageManager | undefined => {\n if (typeof packageManagerField !== 'string') {\n return undefined;\n }\n\n const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\\d+)/);\n\n if (!fieldMatch) {\n return undefined;\n }\n\n return { name: fieldMatch[1] as PackageManagerName, majorVersion: Number(fieldMatch[2]) };\n};\n\nconst YARN_VERSION_UNKNOWN =\n 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set \"packageManager\" in package.json.';\n\nconst readYarnMajorVersion = async (appDir: string): Promise<number> => {\n const { stdout } = await execa('yarn', ['--version'], { cwd: appDir }).catch(() => {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n });\n const majorVersion = Number.parseInt(stdout.trim(), 10);\n\n // Guessing Yarn 1 would set up a file that Yarn 2+ never reads.\n if (Number.isNaN(majorVersion)) {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n }\n\n return majorVersion;\n};\n\nexport const detectPackageManager = async (appDir: string): Promise<DetectedPackageManager> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);\n\n if (packageManagerFromField) {\n return packageManagerFromField;\n }\n\n // Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a\n // fresh clone whose dependencies are not installed yet.\n const packageManagerName = await packageManagerUtils.getPreferred(appDir).catch(() => {\n throw new EnterpriseInstallError(\n 'Could not tell which package manager this app uses. Install its dependencies first, or set \"packageManager\" in package.json.'\n );\n });\n\n if (packageManagerName === 'yarn') {\n return { name: 'yarn', majorVersion: await readYarnMajorVersion(appDir) };\n }\n\n return { name: packageManagerName };\n};\n\n/**\n * Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.\n */\nexport const readsYarnrcYml = (packageManager: DetectedPackageManager): boolean =>\n packageManager.name === 'yarn' && packageManager.majorVersion >= 2;\n"],"names":["parsePackageManagerField","packageManagerField","undefined","fieldMatch","match","name","majorVersion","Number","YARN_VERSION_UNKNOWN","readYarnMajorVersion","appDir","stdout","execa","cwd","catch","EnterpriseInstallError","parseInt","trim","isNaN","detectPackageManager","packageJson","fse","readJson","path","join","packageManagerFromField","packageManager","packageManagerName","packageManagerUtils","getPreferred","readsYarnrcYml"],"mappings":";;;;;;AAcA,sFACO,MAAMA,wBAAAA,GAA2B,CACtCC,mBAAAA,GAAAA;IAEA,IAAI,OAAOA,wBAAwB,QAAA,EAAU;QAC3C,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAMC,UAAAA,GAAaF,mBAAAA,CAAoBG,KAAK,CAAC,wBAAA,CAAA;AAE7C,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,OAAOD,SAAAA;AACT,IAAA;IAEA,OAAO;QAAEG,IAAAA,EAAMF,UAAU,CAAC,CAAA,CAAE;QAAwBG,YAAAA,EAAcC,MAAAA,CAAOJ,UAAU,CAAC,CAAA,CAAE;AAAE,KAAA;AAC1F;AAEA,MAAMK,oBAAAA,GACJ,kIAAA;AAEF,MAAMC,uBAAuB,OAAOC,MAAAA,GAAAA;AAClC,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,MAAM,MAAA,EAAQ;AAAC,QAAA;KAAY,EAAE;QAAEC,GAAAA,EAAKH;AAAO,KAAA,CAAA,CAAGI,KAAK,CAAC,IAAA;AAC3E,QAAA,MAAM,IAAIC,sBAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA,CAAA,CAAA;AACA,IAAA,MAAMF,eAAeC,MAAAA,CAAOS,QAAQ,CAACL,MAAAA,CAAOM,IAAI,EAAA,EAAI,EAAA,CAAA;;IAGpD,IAAIV,MAAAA,CAAOW,KAAK,CAACZ,YAAAA,CAAAA,EAAe;AAC9B,QAAA,MAAM,IAAIS,sBAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA;IAEA,OAAOF,YAAAA;AACT,CAAA;AAEO,MAAMa,uBAAuB,OAAOT,MAAAA,GAAAA;AACzC,IAAA,MAAMU,WAAAA,GAAc,MAAMC,GAAAA,CAAIC,QAAQ,CAACC,IAAAA,CAAKC,IAAI,CAACd,MAAAA,EAAQ,iBAAiBI,KAAK,CAAC,KAAO,EAAC,CAAA,CAAA;IACxF,MAAMW,uBAAAA,GAA0BzB,wBAAAA,CAAyBoB,WAAAA,CAAYM,cAAc,CAAA;AAEnF,IAAA,IAAID,uBAAAA,EAAyB;QAC3B,OAAOA,uBAAAA;AACT,IAAA;;;AAIA,IAAA,MAAME,qBAAqB,MAAMC,cAAAA,CAAoBC,YAAY,CAACnB,MAAAA,CAAAA,CAAQI,KAAK,CAAC,IAAA;AAC9E,QAAA,MAAM,IAAIC,sBAAAA,CACR,8HAAA,CAAA;AAEJ,IAAA,CAAA,CAAA;AAEA,IAAA,IAAIY,uBAAuB,MAAA,EAAQ;QACjC,OAAO;YAAEtB,IAAAA,EAAM,MAAA;AAAQC,YAAAA,YAAAA,EAAc,MAAMG,oBAAAA,CAAqBC,MAAAA;AAAQ,SAAA;AAC1E,IAAA;IAEA,OAAO;QAAEL,IAAAA,EAAMsB;AAAmB,KAAA;AACpC;AAEA;;AAEC,IACM,MAAMG,cAAAA,GAAiB,CAACJ,cAAAA,GAC7BA,cAAAA,CAAerB,IAAI,KAAK,MAAA,IAAUqB,cAAAA,CAAepB,YAAY,IAAI;;;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('./errors.js');
|
|
4
|
+
var versions = require('./versions.js');
|
|
5
|
+
|
|
6
|
+
const resolvePluginStatus = ({ lookup, installedVersion, strapiVersion })=>{
|
|
7
|
+
if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {
|
|
8
|
+
throw new errors.EnterpriseInstallError(lookup.message);
|
|
9
|
+
}
|
|
10
|
+
if (lookup.status !== 'available') {
|
|
11
|
+
return {
|
|
12
|
+
state: lookup.status
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const versionChoice = versions.pickTargetVersion(lookup.packument, strapiVersion);
|
|
16
|
+
const newerVersionNote = versions.describeNewerIncompatibleVersion(versionChoice, installedVersion);
|
|
17
|
+
const { targetVersion, newestVersionStrapiRange } = versionChoice;
|
|
18
|
+
if (!targetVersion) {
|
|
19
|
+
// A stable version only fails to fit when it declares a Strapi range, so the newest one has one.
|
|
20
|
+
return newestVersionStrapiRange ? {
|
|
21
|
+
state: 'no-compatible-version',
|
|
22
|
+
requiredStrapiRange: newestVersionStrapiRange,
|
|
23
|
+
newerVersionNote
|
|
24
|
+
} : {
|
|
25
|
+
state: 'no-stable-release'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (!installedVersion) {
|
|
29
|
+
return {
|
|
30
|
+
state: 'install',
|
|
31
|
+
targetVersion,
|
|
32
|
+
newerVersionNote
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return versions.isUpgrade(installedVersion, targetVersion) ? {
|
|
36
|
+
state: 'upgrade',
|
|
37
|
+
targetVersion,
|
|
38
|
+
isMajorUpgrade: !versions.isPrerelease(installedVersion) && versions.isMajorUpgrade(installedVersion, targetVersion),
|
|
39
|
+
newerVersionNote
|
|
40
|
+
} : {
|
|
41
|
+
state: 'installed',
|
|
42
|
+
newerVersionNote
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
exports.resolvePluginStatus = resolvePluginStatus;
|
|
47
|
+
//# sourceMappingURL=plugin-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-status.js","sources":["../../../../../../src/cli/commands/enterprise/install/plugin-status.ts"],"sourcesContent":["import { EnterpriseInstallError } from './errors';\nimport type { PackumentLookup } from './registry';\nimport {\n describeNewerIncompatibleVersion,\n isMajorUpgrade,\n isPrerelease,\n isUpgrade,\n pickTargetVersion,\n} from './versions';\n\nexport type PluginStatus =\n /** Not installed, and a stable version fits this Strapi version. */\n | { state: 'install'; targetVersion: string; newerVersionNote?: string }\n /** Installed, and a newer compatible version exists. */\n | { state: 'upgrade'; targetVersion: string; isMajorUpgrade: boolean; newerVersionNote?: string }\n /** Installed and up to date for this Strapi version. */\n | { state: 'installed'; newerVersionNote?: string }\n /** No stable version fits this Strapi version. */\n | { state: 'no-compatible-version'; requiredStrapiRange: string; newerVersionNote?: string }\n /** Only prerelease versions exist. */\n | { state: 'no-stable-release' }\n /** The license does not include it. */\n | { state: 'not-licensed' }\n /** The registry has no such package. */\n | { state: 'not-found' };\n\nexport const resolvePluginStatus = ({\n lookup,\n installedVersion,\n strapiVersion,\n}: {\n lookup: PackumentLookup;\n installedVersion?: string;\n strapiVersion?: string;\n}): PluginStatus => {\n if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {\n throw new EnterpriseInstallError(lookup.message);\n }\n\n if (lookup.status !== 'available') {\n return { state: lookup.status };\n }\n\n const versionChoice = pickTargetVersion(lookup.packument, strapiVersion);\n const newerVersionNote = describeNewerIncompatibleVersion(versionChoice, installedVersion);\n const { targetVersion, newestVersionStrapiRange } = versionChoice;\n\n if (!targetVersion) {\n // A stable version only fails to fit when it declares a Strapi range, so the newest one has one.\n return newestVersionStrapiRange\n ? {\n state: 'no-compatible-version',\n requiredStrapiRange: newestVersionStrapiRange,\n newerVersionNote,\n }\n : { state: 'no-stable-release' };\n }\n\n if (!installedVersion) {\n return { state: 'install', targetVersion, newerVersionNote };\n }\n\n return isUpgrade(installedVersion, targetVersion)\n ? {\n state: 'upgrade',\n targetVersion,\n isMajorUpgrade:\n !isPrerelease(installedVersion) && isMajorUpgrade(installedVersion, targetVersion),\n newerVersionNote,\n }\n : { state: 'installed', newerVersionNote };\n};\n"],"names":["resolvePluginStatus","lookup","installedVersion","strapiVersion","status","EnterpriseInstallError","message","state","versionChoice","pickTargetVersion","packument","newerVersionNote","describeNewerIncompatibleVersion","targetVersion","newestVersionStrapiRange","requiredStrapiRange","isUpgrade","isMajorUpgrade","isPrerelease"],"mappings":";;;;;AA0BO,MAAMA,sBAAsB,CAAC,EAClCC,MAAM,EACNC,gBAAgB,EAChBC,aAAa,EAKd,GAAA;AACC,IAAA,IAAIF,OAAOG,MAAM,KAAK,sBAAsBH,MAAAA,CAAOG,MAAM,KAAK,aAAA,EAAe;QAC3E,MAAM,IAAIC,6BAAAA,CAAuBJ,MAAAA,CAAOK,OAAO,CAAA;AACjD,IAAA;IAEA,IAAIL,MAAAA,CAAOG,MAAM,KAAK,WAAA,EAAa;QACjC,OAAO;AAAEG,YAAAA,KAAAA,EAAON,OAAOG;AAAO,SAAA;AAChC,IAAA;AAEA,IAAA,MAAMI,aAAAA,GAAgBC,0BAAAA,CAAkBR,MAAAA,CAAOS,SAAS,EAAEP,aAAAA,CAAAA;IAC1D,MAAMQ,gBAAAA,GAAmBC,0CAAiCJ,aAAAA,EAAeN,gBAAAA,CAAAA;AACzE,IAAA,MAAM,EAAEW,aAAa,EAAEC,wBAAwB,EAAE,GAAGN,aAAAA;AAEpD,IAAA,IAAI,CAACK,aAAAA,EAAe;;AAElB,QAAA,OAAOC,wBAAAA,GACH;YACEP,KAAAA,EAAO,uBAAA;YACPQ,mBAAAA,EAAqBD,wBAAAA;AACrBH,YAAAA;SACF,GACA;YAAEJ,KAAAA,EAAO;AAAoB,SAAA;AACnC,IAAA;AAEA,IAAA,IAAI,CAACL,gBAAAA,EAAkB;QACrB,OAAO;YAAEK,KAAAA,EAAO,SAAA;AAAWM,YAAAA,aAAAA;AAAeF,YAAAA;AAAiB,SAAA;AAC7D,IAAA;IAEA,OAAOK,kBAAAA,CAAUd,kBAAkBW,aAAAA,CAAAA,GAC/B;QACEN,KAAAA,EAAO,SAAA;AACPM,QAAAA,aAAAA;AACAI,QAAAA,cAAAA,EACE,CAACC,qBAAAA,CAAahB,gBAAAA,CAAAA,IAAqBe,uBAAAA,CAAef,gBAAAA,EAAkBW,aAAAA,CAAAA;AACtEF,QAAAA;KACF,GACA;QAAEJ,KAAAA,EAAO,WAAA;AAAaI,QAAAA;AAAiB,KAAA;AAC7C;;;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { EnterpriseInstallError } from './errors.mjs';
|
|
2
|
+
import { pickTargetVersion, describeNewerIncompatibleVersion, isUpgrade, isPrerelease, isMajorUpgrade } from './versions.mjs';
|
|
3
|
+
|
|
4
|
+
const resolvePluginStatus = ({ lookup, installedVersion, strapiVersion })=>{
|
|
5
|
+
if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {
|
|
6
|
+
throw new EnterpriseInstallError(lookup.message);
|
|
7
|
+
}
|
|
8
|
+
if (lookup.status !== 'available') {
|
|
9
|
+
return {
|
|
10
|
+
state: lookup.status
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const versionChoice = pickTargetVersion(lookup.packument, strapiVersion);
|
|
14
|
+
const newerVersionNote = describeNewerIncompatibleVersion(versionChoice, installedVersion);
|
|
15
|
+
const { targetVersion, newestVersionStrapiRange } = versionChoice;
|
|
16
|
+
if (!targetVersion) {
|
|
17
|
+
// A stable version only fails to fit when it declares a Strapi range, so the newest one has one.
|
|
18
|
+
return newestVersionStrapiRange ? {
|
|
19
|
+
state: 'no-compatible-version',
|
|
20
|
+
requiredStrapiRange: newestVersionStrapiRange,
|
|
21
|
+
newerVersionNote
|
|
22
|
+
} : {
|
|
23
|
+
state: 'no-stable-release'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (!installedVersion) {
|
|
27
|
+
return {
|
|
28
|
+
state: 'install',
|
|
29
|
+
targetVersion,
|
|
30
|
+
newerVersionNote
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return isUpgrade(installedVersion, targetVersion) ? {
|
|
34
|
+
state: 'upgrade',
|
|
35
|
+
targetVersion,
|
|
36
|
+
isMajorUpgrade: !isPrerelease(installedVersion) && isMajorUpgrade(installedVersion, targetVersion),
|
|
37
|
+
newerVersionNote
|
|
38
|
+
} : {
|
|
39
|
+
state: 'installed',
|
|
40
|
+
newerVersionNote
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { resolvePluginStatus };
|
|
45
|
+
//# sourceMappingURL=plugin-status.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-status.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/plugin-status.ts"],"sourcesContent":["import { EnterpriseInstallError } from './errors';\nimport type { PackumentLookup } from './registry';\nimport {\n describeNewerIncompatibleVersion,\n isMajorUpgrade,\n isPrerelease,\n isUpgrade,\n pickTargetVersion,\n} from './versions';\n\nexport type PluginStatus =\n /** Not installed, and a stable version fits this Strapi version. */\n | { state: 'install'; targetVersion: string; newerVersionNote?: string }\n /** Installed, and a newer compatible version exists. */\n | { state: 'upgrade'; targetVersion: string; isMajorUpgrade: boolean; newerVersionNote?: string }\n /** Installed and up to date for this Strapi version. */\n | { state: 'installed'; newerVersionNote?: string }\n /** No stable version fits this Strapi version. */\n | { state: 'no-compatible-version'; requiredStrapiRange: string; newerVersionNote?: string }\n /** Only prerelease versions exist. */\n | { state: 'no-stable-release' }\n /** The license does not include it. */\n | { state: 'not-licensed' }\n /** The registry has no such package. */\n | { state: 'not-found' };\n\nexport const resolvePluginStatus = ({\n lookup,\n installedVersion,\n strapiVersion,\n}: {\n lookup: PackumentLookup;\n installedVersion?: string;\n strapiVersion?: string;\n}): PluginStatus => {\n if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {\n throw new EnterpriseInstallError(lookup.message);\n }\n\n if (lookup.status !== 'available') {\n return { state: lookup.status };\n }\n\n const versionChoice = pickTargetVersion(lookup.packument, strapiVersion);\n const newerVersionNote = describeNewerIncompatibleVersion(versionChoice, installedVersion);\n const { targetVersion, newestVersionStrapiRange } = versionChoice;\n\n if (!targetVersion) {\n // A stable version only fails to fit when it declares a Strapi range, so the newest one has one.\n return newestVersionStrapiRange\n ? {\n state: 'no-compatible-version',\n requiredStrapiRange: newestVersionStrapiRange,\n newerVersionNote,\n }\n : { state: 'no-stable-release' };\n }\n\n if (!installedVersion) {\n return { state: 'install', targetVersion, newerVersionNote };\n }\n\n return isUpgrade(installedVersion, targetVersion)\n ? {\n state: 'upgrade',\n targetVersion,\n isMajorUpgrade:\n !isPrerelease(installedVersion) && isMajorUpgrade(installedVersion, targetVersion),\n newerVersionNote,\n }\n : { state: 'installed', newerVersionNote };\n};\n"],"names":["resolvePluginStatus","lookup","installedVersion","strapiVersion","status","EnterpriseInstallError","message","state","versionChoice","pickTargetVersion","packument","newerVersionNote","describeNewerIncompatibleVersion","targetVersion","newestVersionStrapiRange","requiredStrapiRange","isUpgrade","isMajorUpgrade","isPrerelease"],"mappings":";;;AA0BO,MAAMA,sBAAsB,CAAC,EAClCC,MAAM,EACNC,gBAAgB,EAChBC,aAAa,EAKd,GAAA;AACC,IAAA,IAAIF,OAAOG,MAAM,KAAK,sBAAsBH,MAAAA,CAAOG,MAAM,KAAK,aAAA,EAAe;QAC3E,MAAM,IAAIC,sBAAAA,CAAuBJ,MAAAA,CAAOK,OAAO,CAAA;AACjD,IAAA;IAEA,IAAIL,MAAAA,CAAOG,MAAM,KAAK,WAAA,EAAa;QACjC,OAAO;AAAEG,YAAAA,KAAAA,EAAON,OAAOG;AAAO,SAAA;AAChC,IAAA;AAEA,IAAA,MAAMI,aAAAA,GAAgBC,iBAAAA,CAAkBR,MAAAA,CAAOS,SAAS,EAAEP,aAAAA,CAAAA;IAC1D,MAAMQ,gBAAAA,GAAmBC,iCAAiCJ,aAAAA,EAAeN,gBAAAA,CAAAA;AACzE,IAAA,MAAM,EAAEW,aAAa,EAAEC,wBAAwB,EAAE,GAAGN,aAAAA;AAEpD,IAAA,IAAI,CAACK,aAAAA,EAAe;;AAElB,QAAA,OAAOC,wBAAAA,GACH;YACEP,KAAAA,EAAO,uBAAA;YACPQ,mBAAAA,EAAqBD,wBAAAA;AACrBH,YAAAA;SACF,GACA;YAAEJ,KAAAA,EAAO;AAAoB,SAAA;AACnC,IAAA;AAEA,IAAA,IAAI,CAACL,gBAAAA,EAAkB;QACrB,OAAO;YAAEK,KAAAA,EAAO,SAAA;AAAWM,YAAAA,aAAAA;AAAeF,YAAAA;AAAiB,SAAA;AAC7D,IAAA;IAEA,OAAOK,SAAAA,CAAUd,kBAAkBW,aAAAA,CAAAA,GAC/B;QACEN,KAAAA,EAAO,SAAA;AACPM,QAAAA,aAAAA;AACAI,QAAAA,cAAAA,EACE,CAACC,YAAAA,CAAahB,gBAAAA,CAAAA,IAAqBe,cAAAA,CAAef,gBAAAA,EAAkBW,aAAAA,CAAAA;AACtEF,QAAAA;KACF,GACA;QAAEJ,KAAAA,EAAO,WAAA;AAAaI,QAAAA;AAAiB,KAAA;AAC7C;;;;"}
|