@strapi/upgrade 5.47.0 → 5.48.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/README.md +27 -10
- package/dist/modules/npm/package.d.ts +2 -0
- package/dist/modules/npm/package.d.ts.map +1 -1
- package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/upgrade.js +7 -8
- package/dist/src/cli/commands/upgrade.js.map +1 -1
- package/dist/src/cli/commands/upgrade.mjs +9 -10
- package/dist/src/cli/commands/upgrade.mjs.map +1 -1
- package/dist/src/modules/npm/package.js +37 -12
- package/dist/src/modules/npm/package.js.map +1 -1
- package/dist/src/modules/npm/package.mjs +37 -12
- package/dist/src/modules/npm/package.mjs.map +1 -1
- package/dist/src/modules/upgrader/upgrader.js +3 -0
- package/dist/src/modules/upgrader/upgrader.js.map +1 -1
- package/dist/src/modules/upgrader/upgrader.mjs +3 -0
- package/dist/src/modules/upgrader/upgrader.mjs.map +1 -1
- package/dist/src/tasks/upgrade/upgrade.js +2 -2
- package/dist/src/tasks/upgrade/upgrade.js.map +1 -1
- package/dist/src/tasks/upgrade/upgrade.mjs +2 -2
- package/dist/src/tasks/upgrade/upgrade.mjs.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -6,20 +6,34 @@ The Strapi Upgrade Tool is the CLI for facilitating upgrades between Strapi vers
|
|
|
6
6
|
|
|
7
7
|
It handles updating a project's package.json with the correct version of Strapi, running the package installer, and running suggested code transforms for breaking changes (in major versions).
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
It is the recommended way to update to any major, minor, and patch versions of Strapi instead of manually modifying package.json files.
|
|
10
10
|
|
|
11
11
|
The tool offers the following commands:
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
latest [options] Upgrade to the latest available version of Strapi
|
|
15
|
+
major [options] Upgrade to the next available major version of Strapi
|
|
16
|
+
minor [options] Upgrade to the latest minor and patch version of Strapi for the
|
|
17
|
+
current major
|
|
18
|
+
patch [options] Upgrade to latest patch version of Strapi for the current major
|
|
19
|
+
and minor
|
|
20
|
+
to <version> Upgrade to a specific version of Strapi
|
|
19
21
|
codemods [options] Run a set of available codemods for the selected target version
|
|
20
22
|
without updating the Strapi dependencies
|
|
21
23
|
```
|
|
22
24
|
|
|
25
|
+
When `latest` resolves to a version blocked by registry policies such as `min-release-age`, use `to` to target a specific published version instead:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx @strapi/upgrade to 5.42.0
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
For pre-releases, pass `--codemods-target` to select which codemod set to run (defaults to the `major.minor.patch` portion of the target version):
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npx @strapi/upgrade to 5.0.0-beta.951 --codemods-target 5.0.0
|
|
35
|
+
```
|
|
36
|
+
|
|
23
37
|
### What's a codemod / code transform?
|
|
24
38
|
|
|
25
39
|
Codemods are a scripted way to refactor code. Here we are providing and running these scripts for users for any changes necessary in user code between Strapi versions.
|
|
@@ -43,13 +57,16 @@ For Strapi v5, automated data migrations can be added in the `packages/core/data
|
|
|
43
57
|
|
|
44
58
|
## Usage
|
|
45
59
|
|
|
46
|
-
|
|
60
|
+
Run from a Strapi project directory:
|
|
47
61
|
|
|
48
|
-
|
|
62
|
+
```bash
|
|
63
|
+
npx @strapi/upgrade --help
|
|
64
|
+
npx @strapi/upgrade to 5.42.0
|
|
65
|
+
```
|
|
49
66
|
|
|
50
|
-
|
|
67
|
+
Within a project that has Strapi installed, you can also use `strapi upgrade`.
|
|
51
68
|
|
|
52
|
-
|
|
69
|
+
For monorepo development against `/examples`, run `../../packages/utils/upgrade/bin/upgrade` from the example app directory.
|
|
53
70
|
|
|
54
71
|
## Writing a code transforms
|
|
55
72
|
|
|
@@ -12,6 +12,8 @@ export declare class Package implements PackageInterface {
|
|
|
12
12
|
getVersionsDict(): Record<string, NPMPackageVersion>;
|
|
13
13
|
getVersionsAsList(): NPMPackageVersion[];
|
|
14
14
|
findVersionsInRange(range: Version.Range): NPMPackageVersion[];
|
|
15
|
+
private getYarnMajorVersion;
|
|
16
|
+
private normalizeRegistryOutput;
|
|
15
17
|
private getRegistryFromPackageManager;
|
|
16
18
|
private determineRegistryUrl;
|
|
17
19
|
findVersion(version: Version.SemVer): NPMPackageVersion | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/modules/npm/package.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAc,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAKnC,qBAAa,OAAQ,YAAW,gBAAgB;IAC9C,IAAI,EAAE,MAAM,CAAC;IAEb,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,UAAU,CAAoB;gBAE1B,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOrD,IAAI,QAAQ,YAEX;IAED,OAAO,CAAC,qBAAqB;IAI7B,eAAe;IAMf,iBAAiB;IAMjB,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;YAc1B,6BAA6B;
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/modules/npm/package.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAc,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAKnC,qBAAa,OAAQ,YAAW,gBAAgB;IAC9C,IAAI,EAAE,MAAM,CAAC;IAEb,GAAG,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,UAAU,CAAoB;gBAE1B,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOrD,IAAI,QAAQ,YAEX;IAED,OAAO,CAAC,qBAAqB;IAI7B,eAAe;IAMf,iBAAiB;IAMjB,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK;YAc1B,mBAAmB;IAWjC,OAAO,CAAC,uBAAuB;YAWjB,6BAA6B;YA6B7B,oBAAoB;IAgBlC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAM7D,OAAO;IAgBb,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;CAGtC;AAED,eAAO,MAAM,iBAAiB,SAAU,MAAM,OAAO,MAAM,UAAU,MAAM,YAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader.d.ts","sourceRoot":"","sources":["../../../src/modules/upgrader/upgrader.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,IAAI,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,qBAAa,QAAS,YAAW,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IAEzC,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,YAAY,CAA4B;IAEhD,OAAO,CAAC,oBAAoB,CAA8B;gBAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO;IAehF,aAAa,IAAI,GAAG,CAAC,OAAO;IAI5B,UAAU,IAAI,UAAU;IAIxB,SAAS,IAAI,OAAO,CAAC,MAAM;IAI3B,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE;IAKvD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAKhC,kBAAkB;IAqBlB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAU7C,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAK/C,GAAG,CAAC,OAAO,GAAE,OAAc;IAK3B,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW;IAW7C,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAgDjC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAQlC,iBAAiB;YAejB,uBAAuB;YAWvB,mBAAmB;YAyBnB,kBAAkB;IA+ChC,OAAO,CAAC,2BAA2B;YAkBrB,mBAAmB;YAkBnB,WAAW;CAW1B;AAyCD,eAAO,MAAM,eAAe,YACjB,UAAU,UACX,QAAQ,WAAW,GAAG,QAAQ,MAAM,cAChC,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"upgrader.d.ts","sourceRoot":"","sources":["../../../src/modules/upgrader/upgrader.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,IAAI,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAI5D,qBAAa,QAAS,YAAW,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IAEzC,OAAO,CAAC,MAAM,CAAiB;IAE/B,OAAO,CAAC,cAAc,CAAkB;IAExC,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,YAAY,CAA4B;IAEhD,OAAO,CAAC,oBAAoB,CAA8B;gBAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO;IAehF,aAAa,IAAI,GAAG,CAAC,OAAO;IAI5B,UAAU,IAAI,UAAU;IAIxB,SAAS,IAAI,OAAO,CAAC,MAAM;IAI3B,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE;IAKvD,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAKhC,kBAAkB;IAqBlB,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM;IAU7C,SAAS,CAAC,MAAM,EAAE,MAAM;IAKxB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAK/C,GAAG,CAAC,OAAO,GAAE,OAAc;IAK3B,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW;IAW7C,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAgDjC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAQlC,iBAAiB;YAejB,uBAAuB;YAWvB,mBAAmB;YAyBnB,kBAAkB;IA+ChC,OAAO,CAAC,2BAA2B;YAkBrB,mBAAmB;YAkBnB,WAAW;CAW1B;AAyCD,eAAO,MAAM,eAAe,YACjB,UAAU,UACX,QAAQ,WAAW,GAAG,QAAQ,MAAM,cAChC,IAAI,OAAO,aAgBxB,CAAC"}
|
package/dist/package.json.js
CHANGED
package/dist/package.json.mjs
CHANGED
|
@@ -75,21 +75,20 @@ const upgrade = async (options)=>{
|
|
|
75
75
|
// upgrade patch
|
|
76
76
|
addReleaseUpgradeCommand(types.ReleaseType.Patch, 'Upgrade to latest patch version of Strapi for the current major and minor');
|
|
77
77
|
// upgrade to <target>
|
|
78
|
-
program.command('to <target>', {
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
program.command('to').description('Upgrade to a specific version of Strapi').argument('<target>', 'Target version', (target)=>{
|
|
79
|
+
if (!semver.isValidSemVer(target)) {
|
|
80
|
+
throw new commander.InvalidArgumentError(`Invalid target supplied, expected a valid semver but got "${target}"`);
|
|
81
|
+
}
|
|
82
|
+
return semver.semVerFactory(target);
|
|
83
|
+
}).addOption(options.projectPathOption).addOption(options.dryOption).addOption(options.debugOption).addOption(options.silentOption).addOption(options.autoConfirmOption).addOption(new commander.Option('-c, --codemods-target <codemodsTarget>', 'Use a custom target for the codemods execution. Useful when targeting pre-releases').argParser((codemodsTarget)=>{
|
|
81
84
|
if (!semver.isLiteralSemVer(codemodsTarget)) {
|
|
82
85
|
throw new commander.InvalidArgumentError(`Expected a version with the following format: "<number>.<number>.<number>"`);
|
|
83
86
|
}
|
|
84
87
|
return semver.semVerFactory(codemodsTarget);
|
|
85
88
|
})).action(async (target, options)=>{
|
|
86
|
-
if (!semver.isValidSemVer(target)) {
|
|
87
|
-
console.error(`Invalid target supplied, expected a valid semver but got "${target}"`);
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
89
|
return upgrade({
|
|
91
90
|
...options,
|
|
92
|
-
target
|
|
91
|
+
target
|
|
93
92
|
});
|
|
94
93
|
});
|
|
95
94
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sources":["../../../../src/cli/commands/upgrade.ts"],"sourcesContent":["import prompts from 'prompts';\nimport { InvalidArgumentError, Option } from 'commander';\n\nimport type { Command } from 'commander';\n\nimport { loggerFactory } from '../../modules/logger';\nimport { Version, isLiteralSemVer, isValidSemVer, semVerFactory } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport {\n autoConfirmOption,\n debugOption,\n dryOption,\n projectPathOption,\n silentOption,\n} from '../options';\n\nimport type { CLIUpgradeOptions, CLIUpgradeToOptions, UpgradeCommand } from '../types';\n\nexport const upgrade: UpgradeCommand = async (options) => {\n try {\n const { silent, debug, yes } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before upgrading\"\n );\n\n const confirm = async (message: string) => {\n if (yes) {\n return true;\n }\n\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n await tasks.upgrade({\n logger,\n confirm,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.target,\n codemodsTarget: options.codemodsTarget,\n });\n } catch (err) {\n handleError(err, options.silent);\n }\n};\n\n/**\n * Registers upgrade related codemods.\n */\nexport const register = (program: Command) => {\n const addReleaseUpgradeCommand = (releaseType: Version.ReleaseType, description: string) => {\n program\n .command(releaseType)\n .description(description)\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(autoConfirmOption)\n .action(async (options: CLIUpgradeOptions) => {\n return upgrade({ ...options, target: releaseType });\n });\n };\n\n // upgrade latest\n addReleaseUpgradeCommand(\n Version.ReleaseType.Latest,\n 'Upgrade to the latest available version of Strapi'\n );\n\n // upgrade major\n addReleaseUpgradeCommand(\n Version.ReleaseType.Major,\n 'Upgrade to the next available major version of Strapi'\n );\n\n // upgrade minor\n addReleaseUpgradeCommand(\n Version.ReleaseType.Minor,\n 'Upgrade to the latest minor and patch version of Strapi for the current major'\n );\n\n // upgrade patch\n addReleaseUpgradeCommand(\n Version.ReleaseType.Patch,\n 'Upgrade to latest patch version of Strapi for the current major and minor'\n );\n\n // upgrade to <target>\n program\n .command('to
|
|
1
|
+
{"version":3,"file":"upgrade.js","sources":["../../../../src/cli/commands/upgrade.ts"],"sourcesContent":["import prompts from 'prompts';\nimport { InvalidArgumentError, Option } from 'commander';\n\nimport type { Command } from 'commander';\n\nimport { loggerFactory } from '../../modules/logger';\nimport { Version, isLiteralSemVer, isValidSemVer, semVerFactory } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport {\n autoConfirmOption,\n debugOption,\n dryOption,\n projectPathOption,\n silentOption,\n} from '../options';\n\nimport type { CLIUpgradeOptions, CLIUpgradeToOptions, UpgradeCommand } from '../types';\n\nexport const upgrade: UpgradeCommand = async (options) => {\n try {\n const { silent, debug, yes } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before upgrading\"\n );\n\n const confirm = async (message: string) => {\n if (yes) {\n return true;\n }\n\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n await tasks.upgrade({\n logger,\n confirm,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.target,\n codemodsTarget: options.codemodsTarget,\n });\n } catch (err) {\n handleError(err, options.silent);\n }\n};\n\n/**\n * Registers upgrade related codemods.\n */\nexport const register = (program: Command) => {\n const addReleaseUpgradeCommand = (releaseType: Version.ReleaseType, description: string) => {\n program\n .command(releaseType)\n .description(description)\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(autoConfirmOption)\n .action(async (options: CLIUpgradeOptions) => {\n return upgrade({ ...options, target: releaseType });\n });\n };\n\n // upgrade latest\n addReleaseUpgradeCommand(\n Version.ReleaseType.Latest,\n 'Upgrade to the latest available version of Strapi'\n );\n\n // upgrade major\n addReleaseUpgradeCommand(\n Version.ReleaseType.Major,\n 'Upgrade to the next available major version of Strapi'\n );\n\n // upgrade minor\n addReleaseUpgradeCommand(\n Version.ReleaseType.Minor,\n 'Upgrade to the latest minor and patch version of Strapi for the current major'\n );\n\n // upgrade patch\n addReleaseUpgradeCommand(\n Version.ReleaseType.Patch,\n 'Upgrade to latest patch version of Strapi for the current major and minor'\n );\n\n // upgrade to <target>\n program\n .command('to')\n .description('Upgrade to a specific version of Strapi')\n .argument('<target>', 'Target version', (target) => {\n if (!isValidSemVer(target)) {\n throw new InvalidArgumentError(\n `Invalid target supplied, expected a valid semver but got \"${target}\"`\n );\n }\n\n return semVerFactory(target);\n })\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(autoConfirmOption)\n .addOption(\n new Option(\n '-c, --codemods-target <codemodsTarget>',\n 'Use a custom target for the codemods execution. Useful when targeting pre-releases'\n ).argParser((codemodsTarget) => {\n if (!isLiteralSemVer(codemodsTarget)) {\n throw new InvalidArgumentError(\n `Expected a version with the following format: \"<number>.<number>.<number>\"`\n );\n }\n\n return semVerFactory(codemodsTarget);\n })\n )\n .action(async (target: Version.SemVer, options: CLIUpgradeToOptions) => {\n return upgrade({ ...options, target });\n });\n};\n"],"names":["upgrade","options","silent","debug","yes","logger","loggerFactory","warn","confirm","message","prompts","name","type","tasks","dry","cwd","projectPath","target","codemodsTarget","err","handleError","register","program","addReleaseUpgradeCommand","releaseType","description","command","addOption","projectPathOption","dryOption","debugOption","silentOption","autoConfirmOption","action","Version","Latest","Major","Minor","Patch","argument","isValidSemVer","InvalidArgumentError","semVerFactory","Option","argParser","isLiteralSemVer"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import prompts from 'prompts';
|
|
2
|
-
import {
|
|
2
|
+
import { InvalidArgumentError, Option } from 'commander';
|
|
3
3
|
import { loggerFactory } from '../../modules/logger/logger.mjs';
|
|
4
|
-
import {
|
|
4
|
+
import { isValidSemVer, semVerFactory, isLiteralSemVer } from '../../modules/version/semver.mjs';
|
|
5
5
|
import 'semver';
|
|
6
6
|
import { ReleaseType } from '../../modules/version/types.mjs';
|
|
7
7
|
import { handleError } from '../errors.mjs';
|
|
@@ -73,21 +73,20 @@ const upgrade = async (options)=>{
|
|
|
73
73
|
// upgrade patch
|
|
74
74
|
addReleaseUpgradeCommand(ReleaseType.Patch, 'Upgrade to latest patch version of Strapi for the current major and minor');
|
|
75
75
|
// upgrade to <target>
|
|
76
|
-
program.command('to <target>', {
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
program.command('to').description('Upgrade to a specific version of Strapi').argument('<target>', 'Target version', (target)=>{
|
|
77
|
+
if (!isValidSemVer(target)) {
|
|
78
|
+
throw new InvalidArgumentError(`Invalid target supplied, expected a valid semver but got "${target}"`);
|
|
79
|
+
}
|
|
80
|
+
return semVerFactory(target);
|
|
81
|
+
}).addOption(projectPathOption).addOption(dryOption).addOption(debugOption).addOption(silentOption).addOption(autoConfirmOption).addOption(new Option('-c, --codemods-target <codemodsTarget>', 'Use a custom target for the codemods execution. Useful when targeting pre-releases').argParser((codemodsTarget)=>{
|
|
79
82
|
if (!isLiteralSemVer(codemodsTarget)) {
|
|
80
83
|
throw new InvalidArgumentError(`Expected a version with the following format: "<number>.<number>.<number>"`);
|
|
81
84
|
}
|
|
82
85
|
return semVerFactory(codemodsTarget);
|
|
83
86
|
})).action(async (target, options)=>{
|
|
84
|
-
if (!isValidSemVer(target)) {
|
|
85
|
-
console.error(`Invalid target supplied, expected a valid semver but got "${target}"`);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
87
|
return upgrade({
|
|
89
88
|
...options,
|
|
90
|
-
target
|
|
89
|
+
target
|
|
91
90
|
});
|
|
92
91
|
});
|
|
93
92
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.mjs","sources":["../../../../src/cli/commands/upgrade.ts"],"sourcesContent":["import prompts from 'prompts';\nimport { InvalidArgumentError, Option } from 'commander';\n\nimport type { Command } from 'commander';\n\nimport { loggerFactory } from '../../modules/logger';\nimport { Version, isLiteralSemVer, isValidSemVer, semVerFactory } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport {\n autoConfirmOption,\n debugOption,\n dryOption,\n projectPathOption,\n silentOption,\n} from '../options';\n\nimport type { CLIUpgradeOptions, CLIUpgradeToOptions, UpgradeCommand } from '../types';\n\nexport const upgrade: UpgradeCommand = async (options) => {\n try {\n const { silent, debug, yes } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before upgrading\"\n );\n\n const confirm = async (message: string) => {\n if (yes) {\n return true;\n }\n\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n await tasks.upgrade({\n logger,\n confirm,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.target,\n codemodsTarget: options.codemodsTarget,\n });\n } catch (err) {\n handleError(err, options.silent);\n }\n};\n\n/**\n * Registers upgrade related codemods.\n */\nexport const register = (program: Command) => {\n const addReleaseUpgradeCommand = (releaseType: Version.ReleaseType, description: string) => {\n program\n .command(releaseType)\n .description(description)\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(autoConfirmOption)\n .action(async (options: CLIUpgradeOptions) => {\n return upgrade({ ...options, target: releaseType });\n });\n };\n\n // upgrade latest\n addReleaseUpgradeCommand(\n Version.ReleaseType.Latest,\n 'Upgrade to the latest available version of Strapi'\n );\n\n // upgrade major\n addReleaseUpgradeCommand(\n Version.ReleaseType.Major,\n 'Upgrade to the next available major version of Strapi'\n );\n\n // upgrade minor\n addReleaseUpgradeCommand(\n Version.ReleaseType.Minor,\n 'Upgrade to the latest minor and patch version of Strapi for the current major'\n );\n\n // upgrade patch\n addReleaseUpgradeCommand(\n Version.ReleaseType.Patch,\n 'Upgrade to latest patch version of Strapi for the current major and minor'\n );\n\n // upgrade to <target>\n program\n .command('to
|
|
1
|
+
{"version":3,"file":"upgrade.mjs","sources":["../../../../src/cli/commands/upgrade.ts"],"sourcesContent":["import prompts from 'prompts';\nimport { InvalidArgumentError, Option } from 'commander';\n\nimport type { Command } from 'commander';\n\nimport { loggerFactory } from '../../modules/logger';\nimport { Version, isLiteralSemVer, isValidSemVer, semVerFactory } from '../../modules/version';\nimport { handleError } from '../errors';\nimport * as tasks from '../../tasks';\nimport {\n autoConfirmOption,\n debugOption,\n dryOption,\n projectPathOption,\n silentOption,\n} from '../options';\n\nimport type { CLIUpgradeOptions, CLIUpgradeToOptions, UpgradeCommand } from '../types';\n\nexport const upgrade: UpgradeCommand = async (options) => {\n try {\n const { silent, debug, yes } = options;\n const logger = loggerFactory({ silent, debug });\n\n logger.warn(\n \"Please make sure you've created a backup of your codebase and files before upgrading\"\n );\n\n const confirm = async (message: string) => {\n if (yes) {\n return true;\n }\n\n const { confirm } = await prompts({\n name: 'confirm',\n type: 'confirm',\n message,\n });\n\n // If confirm is undefined (Ctrl + C), default to false\n return confirm ?? false;\n };\n\n await tasks.upgrade({\n logger,\n confirm,\n dry: options.dry,\n cwd: options.projectPath,\n target: options.target,\n codemodsTarget: options.codemodsTarget,\n });\n } catch (err) {\n handleError(err, options.silent);\n }\n};\n\n/**\n * Registers upgrade related codemods.\n */\nexport const register = (program: Command) => {\n const addReleaseUpgradeCommand = (releaseType: Version.ReleaseType, description: string) => {\n program\n .command(releaseType)\n .description(description)\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(autoConfirmOption)\n .action(async (options: CLIUpgradeOptions) => {\n return upgrade({ ...options, target: releaseType });\n });\n };\n\n // upgrade latest\n addReleaseUpgradeCommand(\n Version.ReleaseType.Latest,\n 'Upgrade to the latest available version of Strapi'\n );\n\n // upgrade major\n addReleaseUpgradeCommand(\n Version.ReleaseType.Major,\n 'Upgrade to the next available major version of Strapi'\n );\n\n // upgrade minor\n addReleaseUpgradeCommand(\n Version.ReleaseType.Minor,\n 'Upgrade to the latest minor and patch version of Strapi for the current major'\n );\n\n // upgrade patch\n addReleaseUpgradeCommand(\n Version.ReleaseType.Patch,\n 'Upgrade to latest patch version of Strapi for the current major and minor'\n );\n\n // upgrade to <target>\n program\n .command('to')\n .description('Upgrade to a specific version of Strapi')\n .argument('<target>', 'Target version', (target) => {\n if (!isValidSemVer(target)) {\n throw new InvalidArgumentError(\n `Invalid target supplied, expected a valid semver but got \"${target}\"`\n );\n }\n\n return semVerFactory(target);\n })\n .addOption(projectPathOption)\n .addOption(dryOption)\n .addOption(debugOption)\n .addOption(silentOption)\n .addOption(autoConfirmOption)\n .addOption(\n new Option(\n '-c, --codemods-target <codemodsTarget>',\n 'Use a custom target for the codemods execution. Useful when targeting pre-releases'\n ).argParser((codemodsTarget) => {\n if (!isLiteralSemVer(codemodsTarget)) {\n throw new InvalidArgumentError(\n `Expected a version with the following format: \"<number>.<number>.<number>\"`\n );\n }\n\n return semVerFactory(codemodsTarget);\n })\n )\n .action(async (target: Version.SemVer, options: CLIUpgradeToOptions) => {\n return upgrade({ ...options, target });\n });\n};\n"],"names":["upgrade","options","silent","debug","yes","logger","loggerFactory","warn","confirm","message","prompts","name","type","tasks","dry","cwd","projectPath","target","codemodsTarget","err","handleError","register","program","addReleaseUpgradeCommand","releaseType","description","command","addOption","projectPathOption","dryOption","debugOption","silentOption","autoConfirmOption","action","Version","Latest","Major","Minor","Patch","argument","isValidSemVer","InvalidArgumentError","semVerFactory","Option","argParser","isLiteralSemVer"],"mappings":"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"}
|
|
@@ -32,36 +32,61 @@ class Package {
|
|
|
32
32
|
.filter((v)=>semver.isLiteralSemVer(v.version))// Sort in ascending order
|
|
33
33
|
.sort((v1, v2)=>semver$1.compare(v1.version, v2.version));
|
|
34
34
|
}
|
|
35
|
+
async getYarnMajorVersion() {
|
|
36
|
+
try {
|
|
37
|
+
const { stdout } = await execa('yarn', [
|
|
38
|
+
'--version'
|
|
39
|
+
], {
|
|
40
|
+
timeout: 5000
|
|
41
|
+
});
|
|
42
|
+
const version = stdout.trim();
|
|
43
|
+
return parseInt(version.split('.')[0], 10);
|
|
44
|
+
} catch {
|
|
45
|
+
// Default to Yarn Berry (v2+) if version check fails
|
|
46
|
+
return 2;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
normalizeRegistryOutput(stdout) {
|
|
50
|
+
const registry = stdout.trim();
|
|
51
|
+
// Yarn Classic (v1) may return literal "undefined" for unset config values
|
|
52
|
+
if (!registry || registry === 'undefined') {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return registry;
|
|
56
|
+
}
|
|
35
57
|
async getRegistryFromPackageManager() {
|
|
36
58
|
try {
|
|
37
59
|
const packageManagerName = await utils.packageManager.getPreferred(this.cwd);
|
|
38
60
|
if (!packageManagerName) return undefined;
|
|
39
|
-
|
|
40
|
-
|
|
61
|
+
let command;
|
|
62
|
+
if (packageManagerName === 'yarn') {
|
|
63
|
+
const yarnMajorVersion = await this.getYarnMajorVersion();
|
|
64
|
+
// Yarn Classic (v1) uses 'registry', Yarn Berry (v2+) uses 'npmRegistryServer'
|
|
65
|
+
command = yarnMajorVersion >= 2 ? [
|
|
41
66
|
'config',
|
|
42
67
|
'get',
|
|
43
68
|
'npmRegistryServer'
|
|
44
|
-
]
|
|
45
|
-
npm: [
|
|
69
|
+
] : [
|
|
46
70
|
'config',
|
|
47
71
|
'get',
|
|
48
72
|
'registry'
|
|
49
|
-
]
|
|
50
|
-
|
|
73
|
+
];
|
|
74
|
+
} else if (packageManagerName === 'npm' || packageManagerName === 'pnpm') {
|
|
75
|
+
command = [
|
|
51
76
|
'config',
|
|
52
77
|
'get',
|
|
53
78
|
'registry'
|
|
54
|
-
]
|
|
55
|
-
}
|
|
56
|
-
const command = registryCommands[packageManagerName];
|
|
57
|
-
if (!command) {
|
|
79
|
+
];
|
|
80
|
+
} else {
|
|
58
81
|
this.logger.warn(`Unsupported package manager: ${packageManagerName}`);
|
|
59
82
|
return undefined;
|
|
60
83
|
}
|
|
61
|
-
const { stdout } = await execa(packageManagerName,
|
|
84
|
+
const { stdout } = await execa(packageManagerName, [
|
|
85
|
+
...command
|
|
86
|
+
], {
|
|
62
87
|
timeout: 10000
|
|
63
88
|
});
|
|
64
|
-
return
|
|
89
|
+
return this.normalizeRegistryOutput(stdout);
|
|
65
90
|
} catch (error) {
|
|
66
91
|
this.logger.warn('Failed to determine registry URL from package manager');
|
|
67
92
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sources":["../../../../src/modules/npm/package.ts"],"sourcesContent":["import assert from 'node:assert';\nimport semver from 'semver';\nimport execa from 'execa';\nimport { packageManager } from '@strapi/utils';\n\nimport { ProxyAgent } from 'undici';\nimport * as constants from './constants';\nimport { isLiteralSemVer } from '../version';\n\nimport type { Package as PackageInterface, NPMPackage, NPMPackageVersion } from './types';\nimport type { Version } from '../version';\nimport { Logger } from '../logger';\n\nconst proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;\nconst agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;\n\nexport class Package implements PackageInterface {\n name: string;\n\n cwd: string;\n\n private logger: Logger;\n\n private npmPackage: NPMPackage | null;\n\n constructor(name: string, cwd: string, logger: Logger) {\n this.name = name;\n this.cwd = cwd;\n this.logger = logger;\n this.npmPackage = null;\n }\n\n get isLoaded() {\n return this.npmPackage !== null;\n }\n\n private assertPackageIsLoaded(npmPackage: NPMPackage | null): asserts npmPackage is NPMPackage {\n assert(this.isLoaded, 'The package is not loaded yet');\n }\n\n getVersionsDict() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return this.npmPackage.versions;\n }\n\n getVersionsAsList() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return Object.values(this.npmPackage.versions);\n }\n\n findVersionsInRange(range: Version.Range) {\n const versions = this.getVersionsAsList();\n\n return (\n versions\n // Only select versions matching the upgrade range\n .filter((v) => range.test(v.version))\n // Only select supported version format (x.x.x)\n .filter((v) => isLiteralSemVer(v.version))\n // Sort in ascending order\n .sort((v1, v2) => semver.compare(v1.version, v2.version))\n );\n }\n\n private async getRegistryFromPackageManager(): Promise<string | undefined> {\n try {\n const packageManagerName = await packageManager.getPreferred(this.cwd);\n if (!packageManagerName) return undefined;\n\n const registryCommands = {\n yarn: ['config', 'get', 'npmRegistryServer'],\n npm: ['config', 'get', 'registry'],\n pnpm: ['config', 'get', 'registry'],\n } as const;\n\n const command = registryCommands[packageManagerName as keyof typeof registryCommands];\n if (!command) {\n this.logger.warn(`Unsupported package manager: ${packageManagerName}`);\n return undefined;\n }\n\n const { stdout } = await execa(packageManagerName, command, { timeout: 10_000 });\n return stdout.trim() || undefined;\n } catch (error) {\n this.logger.warn('Failed to determine registry URL from package manager');\n return undefined;\n }\n }\n\n private async determineRegistryUrl(): Promise<string> {\n if (process.env.NPM_REGISTRY_URL) {\n this.logger.debug(`Using NPM_REGISTRY_URL: ${process.env.NPM_REGISTRY_URL}`);\n return process.env.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n const packageManagerRegistry = await this.getRegistryFromPackageManager();\n if (packageManagerRegistry) {\n this.logger.debug(`Using package manager registry: ${packageManagerRegistry}`);\n return packageManagerRegistry.replace(/\\/$/, '');\n }\n\n this.logger.debug(`Using default registry: ${constants.NPM_REGISTRY_URL}`);\n return constants.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n findVersion(version: Version.SemVer): NPMPackageVersion | undefined {\n const versions = this.getVersionsAsList();\n\n return versions.find((npmVersion) => semver.eq(npmVersion.version, version));\n }\n\n async refresh() {\n const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;\n\n const response = await fetch(packageURL, {\n // @ts-expect-error Node.js fetch supports dispatcher (undici extension)\n dispatcher: agent,\n });\n\n // TODO: Use a validation library to make sure the response structure is correct\n assert(response.ok, `Request failed for ${packageURL}`);\n\n this.npmPackage = (await response.json()) as NPMPackage;\n\n return this;\n }\n\n versionExists(version: Version.SemVer) {\n return this.findVersion(version) !== undefined;\n }\n}\n\nexport const npmPackageFactory = (name: string, cwd: string, logger: Logger) =>\n new Package(name, cwd, logger);\n"],"names":["proxyUrl","process","env","HTTP_PROXY","HTTPS_PROXY","agent","ProxyAgent","undefined","Package","isLoaded","npmPackage","assertPackageIsLoaded","assert","getVersionsDict","versions","getVersionsAsList","Object","values","findVersionsInRange","range","filter","v","test","version","isLiteralSemVer","sort","v1","v2","semver","compare","getRegistryFromPackageManager","packageManagerName","packageManager","getPreferred","cwd","registryCommands","yarn","npm","pnpm","command","logger","warn","stdout","execa","timeout","trim","error","determineRegistryUrl","NPM_REGISTRY_URL","debug","replace","packageManagerRegistry","constants","findVersion","find","npmVersion","eq","refresh","packageURL","name","response","fetch","dispatcher","ok","json","versionExists","npmPackageFactory"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"package.js","sources":["../../../../src/modules/npm/package.ts"],"sourcesContent":["import assert from 'node:assert';\nimport semver from 'semver';\nimport execa from 'execa';\nimport { packageManager } from '@strapi/utils';\n\nimport { ProxyAgent } from 'undici';\nimport * as constants from './constants';\nimport { isLiteralSemVer } from '../version';\n\nimport type { Package as PackageInterface, NPMPackage, NPMPackageVersion } from './types';\nimport type { Version } from '../version';\nimport { Logger } from '../logger';\n\nconst proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;\nconst agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;\n\nexport class Package implements PackageInterface {\n name: string;\n\n cwd: string;\n\n private logger: Logger;\n\n private npmPackage: NPMPackage | null;\n\n constructor(name: string, cwd: string, logger: Logger) {\n this.name = name;\n this.cwd = cwd;\n this.logger = logger;\n this.npmPackage = null;\n }\n\n get isLoaded() {\n return this.npmPackage !== null;\n }\n\n private assertPackageIsLoaded(npmPackage: NPMPackage | null): asserts npmPackage is NPMPackage {\n assert(this.isLoaded, 'The package is not loaded yet');\n }\n\n getVersionsDict() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return this.npmPackage.versions;\n }\n\n getVersionsAsList() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return Object.values(this.npmPackage.versions);\n }\n\n findVersionsInRange(range: Version.Range) {\n const versions = this.getVersionsAsList();\n\n return (\n versions\n // Only select versions matching the upgrade range\n .filter((v) => range.test(v.version))\n // Only select supported version format (x.x.x)\n .filter((v) => isLiteralSemVer(v.version))\n // Sort in ascending order\n .sort((v1, v2) => semver.compare(v1.version, v2.version))\n );\n }\n\n private async getYarnMajorVersion(): Promise<number> {\n try {\n const { stdout } = await execa('yarn', ['--version'], { timeout: 5_000 });\n const version = stdout.trim();\n return parseInt(version.split('.')[0], 10);\n } catch {\n // Default to Yarn Berry (v2+) if version check fails\n return 2;\n }\n }\n\n private normalizeRegistryOutput(stdout: string): string | undefined {\n const registry = stdout.trim();\n\n // Yarn Classic (v1) may return literal \"undefined\" for unset config values\n if (!registry || registry === 'undefined') {\n return undefined;\n }\n\n return registry;\n }\n\n private async getRegistryFromPackageManager(): Promise<string | undefined> {\n try {\n const packageManagerName = await packageManager.getPreferred(this.cwd);\n if (!packageManagerName) return undefined;\n\n let command: readonly string[];\n\n if (packageManagerName === 'yarn') {\n const yarnMajorVersion = await this.getYarnMajorVersion();\n // Yarn Classic (v1) uses 'registry', Yarn Berry (v2+) uses 'npmRegistryServer'\n command =\n yarnMajorVersion >= 2\n ? ['config', 'get', 'npmRegistryServer']\n : ['config', 'get', 'registry'];\n } else if (packageManagerName === 'npm' || packageManagerName === 'pnpm') {\n command = ['config', 'get', 'registry'];\n } else {\n this.logger.warn(`Unsupported package manager: ${packageManagerName}`);\n return undefined;\n }\n\n const { stdout } = await execa(packageManagerName, [...command], { timeout: 10_000 });\n return this.normalizeRegistryOutput(stdout);\n } catch (error) {\n this.logger.warn('Failed to determine registry URL from package manager');\n return undefined;\n }\n }\n\n private async determineRegistryUrl(): Promise<string> {\n if (process.env.NPM_REGISTRY_URL) {\n this.logger.debug(`Using NPM_REGISTRY_URL: ${process.env.NPM_REGISTRY_URL}`);\n return process.env.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n const packageManagerRegistry = await this.getRegistryFromPackageManager();\n if (packageManagerRegistry) {\n this.logger.debug(`Using package manager registry: ${packageManagerRegistry}`);\n return packageManagerRegistry.replace(/\\/$/, '');\n }\n\n this.logger.debug(`Using default registry: ${constants.NPM_REGISTRY_URL}`);\n return constants.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n findVersion(version: Version.SemVer): NPMPackageVersion | undefined {\n const versions = this.getVersionsAsList();\n\n return versions.find((npmVersion) => semver.eq(npmVersion.version, version));\n }\n\n async refresh() {\n const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;\n\n const response = await fetch(packageURL, {\n // @ts-expect-error Node.js fetch supports dispatcher (undici extension)\n dispatcher: agent,\n });\n\n // TODO: Use a validation library to make sure the response structure is correct\n assert(response.ok, `Request failed for ${packageURL}`);\n\n this.npmPackage = (await response.json()) as NPMPackage;\n\n return this;\n }\n\n versionExists(version: Version.SemVer) {\n return this.findVersion(version) !== undefined;\n }\n}\n\nexport const npmPackageFactory = (name: string, cwd: string, logger: Logger) =>\n new Package(name, cwd, logger);\n"],"names":["proxyUrl","process","env","HTTP_PROXY","HTTPS_PROXY","agent","ProxyAgent","undefined","Package","isLoaded","npmPackage","assertPackageIsLoaded","assert","getVersionsDict","versions","getVersionsAsList","Object","values","findVersionsInRange","range","filter","v","test","version","isLiteralSemVer","sort","v1","v2","semver","compare","getYarnMajorVersion","stdout","execa","timeout","trim","parseInt","split","normalizeRegistryOutput","registry","getRegistryFromPackageManager","packageManagerName","packageManager","getPreferred","cwd","command","yarnMajorVersion","logger","warn","error","determineRegistryUrl","NPM_REGISTRY_URL","debug","replace","packageManagerRegistry","constants","findVersion","find","npmVersion","eq","refresh","packageURL","name","response","fetch","dispatcher","ok","json","versionExists","npmPackageFactory"],"mappings":"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"}
|
|
@@ -30,36 +30,61 @@ class Package {
|
|
|
30
30
|
.filter((v)=>isLiteralSemVer(v.version))// Sort in ascending order
|
|
31
31
|
.sort((v1, v2)=>semver.compare(v1.version, v2.version));
|
|
32
32
|
}
|
|
33
|
+
async getYarnMajorVersion() {
|
|
34
|
+
try {
|
|
35
|
+
const { stdout } = await execa('yarn', [
|
|
36
|
+
'--version'
|
|
37
|
+
], {
|
|
38
|
+
timeout: 5000
|
|
39
|
+
});
|
|
40
|
+
const version = stdout.trim();
|
|
41
|
+
return parseInt(version.split('.')[0], 10);
|
|
42
|
+
} catch {
|
|
43
|
+
// Default to Yarn Berry (v2+) if version check fails
|
|
44
|
+
return 2;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
normalizeRegistryOutput(stdout) {
|
|
48
|
+
const registry = stdout.trim();
|
|
49
|
+
// Yarn Classic (v1) may return literal "undefined" for unset config values
|
|
50
|
+
if (!registry || registry === 'undefined') {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return registry;
|
|
54
|
+
}
|
|
33
55
|
async getRegistryFromPackageManager() {
|
|
34
56
|
try {
|
|
35
57
|
const packageManagerName = await packageManager.getPreferred(this.cwd);
|
|
36
58
|
if (!packageManagerName) return undefined;
|
|
37
|
-
|
|
38
|
-
|
|
59
|
+
let command;
|
|
60
|
+
if (packageManagerName === 'yarn') {
|
|
61
|
+
const yarnMajorVersion = await this.getYarnMajorVersion();
|
|
62
|
+
// Yarn Classic (v1) uses 'registry', Yarn Berry (v2+) uses 'npmRegistryServer'
|
|
63
|
+
command = yarnMajorVersion >= 2 ? [
|
|
39
64
|
'config',
|
|
40
65
|
'get',
|
|
41
66
|
'npmRegistryServer'
|
|
42
|
-
]
|
|
43
|
-
npm: [
|
|
67
|
+
] : [
|
|
44
68
|
'config',
|
|
45
69
|
'get',
|
|
46
70
|
'registry'
|
|
47
|
-
]
|
|
48
|
-
|
|
71
|
+
];
|
|
72
|
+
} else if (packageManagerName === 'npm' || packageManagerName === 'pnpm') {
|
|
73
|
+
command = [
|
|
49
74
|
'config',
|
|
50
75
|
'get',
|
|
51
76
|
'registry'
|
|
52
|
-
]
|
|
53
|
-
}
|
|
54
|
-
const command = registryCommands[packageManagerName];
|
|
55
|
-
if (!command) {
|
|
77
|
+
];
|
|
78
|
+
} else {
|
|
56
79
|
this.logger.warn(`Unsupported package manager: ${packageManagerName}`);
|
|
57
80
|
return undefined;
|
|
58
81
|
}
|
|
59
|
-
const { stdout } = await execa(packageManagerName,
|
|
82
|
+
const { stdout } = await execa(packageManagerName, [
|
|
83
|
+
...command
|
|
84
|
+
], {
|
|
60
85
|
timeout: 10000
|
|
61
86
|
});
|
|
62
|
-
return
|
|
87
|
+
return this.normalizeRegistryOutput(stdout);
|
|
63
88
|
} catch (error) {
|
|
64
89
|
this.logger.warn('Failed to determine registry URL from package manager');
|
|
65
90
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.mjs","sources":["../../../../src/modules/npm/package.ts"],"sourcesContent":["import assert from 'node:assert';\nimport semver from 'semver';\nimport execa from 'execa';\nimport { packageManager } from '@strapi/utils';\n\nimport { ProxyAgent } from 'undici';\nimport * as constants from './constants';\nimport { isLiteralSemVer } from '../version';\n\nimport type { Package as PackageInterface, NPMPackage, NPMPackageVersion } from './types';\nimport type { Version } from '../version';\nimport { Logger } from '../logger';\n\nconst proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;\nconst agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;\n\nexport class Package implements PackageInterface {\n name: string;\n\n cwd: string;\n\n private logger: Logger;\n\n private npmPackage: NPMPackage | null;\n\n constructor(name: string, cwd: string, logger: Logger) {\n this.name = name;\n this.cwd = cwd;\n this.logger = logger;\n this.npmPackage = null;\n }\n\n get isLoaded() {\n return this.npmPackage !== null;\n }\n\n private assertPackageIsLoaded(npmPackage: NPMPackage | null): asserts npmPackage is NPMPackage {\n assert(this.isLoaded, 'The package is not loaded yet');\n }\n\n getVersionsDict() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return this.npmPackage.versions;\n }\n\n getVersionsAsList() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return Object.values(this.npmPackage.versions);\n }\n\n findVersionsInRange(range: Version.Range) {\n const versions = this.getVersionsAsList();\n\n return (\n versions\n // Only select versions matching the upgrade range\n .filter((v) => range.test(v.version))\n // Only select supported version format (x.x.x)\n .filter((v) => isLiteralSemVer(v.version))\n // Sort in ascending order\n .sort((v1, v2) => semver.compare(v1.version, v2.version))\n );\n }\n\n private async getRegistryFromPackageManager(): Promise<string | undefined> {\n try {\n const packageManagerName = await packageManager.getPreferred(this.cwd);\n if (!packageManagerName) return undefined;\n\n const registryCommands = {\n yarn: ['config', 'get', 'npmRegistryServer'],\n npm: ['config', 'get', 'registry'],\n pnpm: ['config', 'get', 'registry'],\n } as const;\n\n const command = registryCommands[packageManagerName as keyof typeof registryCommands];\n if (!command) {\n this.logger.warn(`Unsupported package manager: ${packageManagerName}`);\n return undefined;\n }\n\n const { stdout } = await execa(packageManagerName, command, { timeout: 10_000 });\n return stdout.trim() || undefined;\n } catch (error) {\n this.logger.warn('Failed to determine registry URL from package manager');\n return undefined;\n }\n }\n\n private async determineRegistryUrl(): Promise<string> {\n if (process.env.NPM_REGISTRY_URL) {\n this.logger.debug(`Using NPM_REGISTRY_URL: ${process.env.NPM_REGISTRY_URL}`);\n return process.env.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n const packageManagerRegistry = await this.getRegistryFromPackageManager();\n if (packageManagerRegistry) {\n this.logger.debug(`Using package manager registry: ${packageManagerRegistry}`);\n return packageManagerRegistry.replace(/\\/$/, '');\n }\n\n this.logger.debug(`Using default registry: ${constants.NPM_REGISTRY_URL}`);\n return constants.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n findVersion(version: Version.SemVer): NPMPackageVersion | undefined {\n const versions = this.getVersionsAsList();\n\n return versions.find((npmVersion) => semver.eq(npmVersion.version, version));\n }\n\n async refresh() {\n const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;\n\n const response = await fetch(packageURL, {\n // @ts-expect-error Node.js fetch supports dispatcher (undici extension)\n dispatcher: agent,\n });\n\n // TODO: Use a validation library to make sure the response structure is correct\n assert(response.ok, `Request failed for ${packageURL}`);\n\n this.npmPackage = (await response.json()) as NPMPackage;\n\n return this;\n }\n\n versionExists(version: Version.SemVer) {\n return this.findVersion(version) !== undefined;\n }\n}\n\nexport const npmPackageFactory = (name: string, cwd: string, logger: Logger) =>\n new Package(name, cwd, logger);\n"],"names":["proxyUrl","process","env","HTTP_PROXY","HTTPS_PROXY","agent","ProxyAgent","undefined","Package","isLoaded","npmPackage","assertPackageIsLoaded","assert","getVersionsDict","versions","getVersionsAsList","Object","values","findVersionsInRange","range","filter","v","test","version","isLiteralSemVer","sort","v1","v2","semver","compare","getRegistryFromPackageManager","packageManagerName","packageManager","getPreferred","cwd","registryCommands","yarn","npm","pnpm","command","logger","warn","stdout","execa","timeout","trim","error","determineRegistryUrl","NPM_REGISTRY_URL","debug","replace","packageManagerRegistry","constants","findVersion","find","npmVersion","eq","refresh","packageURL","name","response","fetch","dispatcher","ok","json","versionExists","npmPackageFactory"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"package.mjs","sources":["../../../../src/modules/npm/package.ts"],"sourcesContent":["import assert from 'node:assert';\nimport semver from 'semver';\nimport execa from 'execa';\nimport { packageManager } from '@strapi/utils';\n\nimport { ProxyAgent } from 'undici';\nimport * as constants from './constants';\nimport { isLiteralSemVer } from '../version';\n\nimport type { Package as PackageInterface, NPMPackage, NPMPackageVersion } from './types';\nimport type { Version } from '../version';\nimport { Logger } from '../logger';\n\nconst proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;\nconst agent = proxyUrl ? new ProxyAgent(proxyUrl) : undefined;\n\nexport class Package implements PackageInterface {\n name: string;\n\n cwd: string;\n\n private logger: Logger;\n\n private npmPackage: NPMPackage | null;\n\n constructor(name: string, cwd: string, logger: Logger) {\n this.name = name;\n this.cwd = cwd;\n this.logger = logger;\n this.npmPackage = null;\n }\n\n get isLoaded() {\n return this.npmPackage !== null;\n }\n\n private assertPackageIsLoaded(npmPackage: NPMPackage | null): asserts npmPackage is NPMPackage {\n assert(this.isLoaded, 'The package is not loaded yet');\n }\n\n getVersionsDict() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return this.npmPackage.versions;\n }\n\n getVersionsAsList() {\n this.assertPackageIsLoaded(this.npmPackage);\n\n return Object.values(this.npmPackage.versions);\n }\n\n findVersionsInRange(range: Version.Range) {\n const versions = this.getVersionsAsList();\n\n return (\n versions\n // Only select versions matching the upgrade range\n .filter((v) => range.test(v.version))\n // Only select supported version format (x.x.x)\n .filter((v) => isLiteralSemVer(v.version))\n // Sort in ascending order\n .sort((v1, v2) => semver.compare(v1.version, v2.version))\n );\n }\n\n private async getYarnMajorVersion(): Promise<number> {\n try {\n const { stdout } = await execa('yarn', ['--version'], { timeout: 5_000 });\n const version = stdout.trim();\n return parseInt(version.split('.')[0], 10);\n } catch {\n // Default to Yarn Berry (v2+) if version check fails\n return 2;\n }\n }\n\n private normalizeRegistryOutput(stdout: string): string | undefined {\n const registry = stdout.trim();\n\n // Yarn Classic (v1) may return literal \"undefined\" for unset config values\n if (!registry || registry === 'undefined') {\n return undefined;\n }\n\n return registry;\n }\n\n private async getRegistryFromPackageManager(): Promise<string | undefined> {\n try {\n const packageManagerName = await packageManager.getPreferred(this.cwd);\n if (!packageManagerName) return undefined;\n\n let command: readonly string[];\n\n if (packageManagerName === 'yarn') {\n const yarnMajorVersion = await this.getYarnMajorVersion();\n // Yarn Classic (v1) uses 'registry', Yarn Berry (v2+) uses 'npmRegistryServer'\n command =\n yarnMajorVersion >= 2\n ? ['config', 'get', 'npmRegistryServer']\n : ['config', 'get', 'registry'];\n } else if (packageManagerName === 'npm' || packageManagerName === 'pnpm') {\n command = ['config', 'get', 'registry'];\n } else {\n this.logger.warn(`Unsupported package manager: ${packageManagerName}`);\n return undefined;\n }\n\n const { stdout } = await execa(packageManagerName, [...command], { timeout: 10_000 });\n return this.normalizeRegistryOutput(stdout);\n } catch (error) {\n this.logger.warn('Failed to determine registry URL from package manager');\n return undefined;\n }\n }\n\n private async determineRegistryUrl(): Promise<string> {\n if (process.env.NPM_REGISTRY_URL) {\n this.logger.debug(`Using NPM_REGISTRY_URL: ${process.env.NPM_REGISTRY_URL}`);\n return process.env.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n const packageManagerRegistry = await this.getRegistryFromPackageManager();\n if (packageManagerRegistry) {\n this.logger.debug(`Using package manager registry: ${packageManagerRegistry}`);\n return packageManagerRegistry.replace(/\\/$/, '');\n }\n\n this.logger.debug(`Using default registry: ${constants.NPM_REGISTRY_URL}`);\n return constants.NPM_REGISTRY_URL.replace(/\\/$/, '');\n }\n\n findVersion(version: Version.SemVer): NPMPackageVersion | undefined {\n const versions = this.getVersionsAsList();\n\n return versions.find((npmVersion) => semver.eq(npmVersion.version, version));\n }\n\n async refresh() {\n const packageURL = `${await this.determineRegistryUrl()}/${this.name}`;\n\n const response = await fetch(packageURL, {\n // @ts-expect-error Node.js fetch supports dispatcher (undici extension)\n dispatcher: agent,\n });\n\n // TODO: Use a validation library to make sure the response structure is correct\n assert(response.ok, `Request failed for ${packageURL}`);\n\n this.npmPackage = (await response.json()) as NPMPackage;\n\n return this;\n }\n\n versionExists(version: Version.SemVer) {\n return this.findVersion(version) !== undefined;\n }\n}\n\nexport const npmPackageFactory = (name: string, cwd: string, logger: Logger) =>\n new Package(name, cwd, logger);\n"],"names":["proxyUrl","process","env","HTTP_PROXY","HTTPS_PROXY","agent","ProxyAgent","undefined","Package","isLoaded","npmPackage","assertPackageIsLoaded","assert","getVersionsDict","versions","getVersionsAsList","Object","values","findVersionsInRange","range","filter","v","test","version","isLiteralSemVer","sort","v1","v2","semver","compare","getYarnMajorVersion","stdout","execa","timeout","trim","parseInt","split","normalizeRegistryOutput","registry","getRegistryFromPackageManager","packageManagerName","packageManager","getPreferred","cwd","command","yarnMajorVersion","logger","warn","error","determineRegistryUrl","NPM_REGISTRY_URL","debug","replace","packageManagerRegistry","constants","findVersion","find","npmVersion","eq","refresh","packageURL","name","response","fetch","dispatcher","ok","json","versionExists","npmPackageFactory"],"mappings":"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"}
|
|
@@ -254,6 +254,9 @@ const upgraderFactory = (project, target, npmPackage)=>{
|
|
|
254
254
|
if (semver$1.eq(semverTarget, project.strapiVersion)) {
|
|
255
255
|
throw new Error(`The project is already using v${semverTarget}`);
|
|
256
256
|
}
|
|
257
|
+
if (semver$1.lt(semverTarget, project.strapiVersion)) {
|
|
258
|
+
throw new Error(`The target version v${semverTarget} must be greater than the current version v${project.strapiVersion}`);
|
|
259
|
+
}
|
|
257
260
|
return new Upgrader(project, semverTarget, npmPackage);
|
|
258
261
|
};
|
|
259
262
|
const successReport = ()=>({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader.js","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const devDependencies = json.get<Record<string, string>>('devDependencies', {});\n\n const strapiProductionDependencies = this.getScopedStrapiDependencies(dependencies);\n const strapiDevelopmentDependencies = this.getScopedStrapiDependencies(devDependencies);\n\n const strapiPackagesToUpgradeCount =\n strapiProductionDependencies.length + strapiDevelopmentDependencies.length;\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiPackagesToUpgradeCount)} dependency(ies) to update`\n );\n strapiProductionDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n strapiDevelopmentDependencies.forEach((dependency) =>\n this.logger?.debug?.(\n `- ${dependency[0]} (devDependencies) (${dependency[1]} -> ${this.target})`\n )\n );\n\n if (strapiPackagesToUpgradeCount === 0) {\n return;\n }\n\n strapiProductionDependencies.forEach(([name]) =>\n json.set(`dependencies.${name}`, this.target.raw)\n );\n strapiDevelopmentDependencies.forEach(([name]) =>\n json.set(`devDependencies.${name}`, this.target.raw)\n );\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","devDependencies","strapiProductionDependencies","getScopedStrapiDependencies","strapiDevelopmentDependencies","strapiPackagesToUpgradeCount","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","strapiDependencies","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","success"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upgrader.js","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const devDependencies = json.get<Record<string, string>>('devDependencies', {});\n\n const strapiProductionDependencies = this.getScopedStrapiDependencies(dependencies);\n const strapiDevelopmentDependencies = this.getScopedStrapiDependencies(devDependencies);\n\n const strapiPackagesToUpgradeCount =\n strapiProductionDependencies.length + strapiDevelopmentDependencies.length;\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiPackagesToUpgradeCount)} dependency(ies) to update`\n );\n strapiProductionDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n strapiDevelopmentDependencies.forEach((dependency) =>\n this.logger?.debug?.(\n `- ${dependency[0]} (devDependencies) (${dependency[1]} -> ${this.target})`\n )\n );\n\n if (strapiPackagesToUpgradeCount === 0) {\n return;\n }\n\n strapiProductionDependencies.forEach(([name]) =>\n json.set(`dependencies.${name}`, this.target.raw)\n );\n strapiDevelopmentDependencies.forEach(([name]) =>\n json.set(`devDependencies.${name}`, this.target.raw)\n );\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n if (semver.lt(semverTarget, project.strapiVersion)) {\n throw new Error(\n `The target version v${semverTarget} must be greater than the current version v${project.strapiVersion}`\n );\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","devDependencies","strapiProductionDependencies","getScopedStrapiDependencies","strapiDevelopmentDependencies","strapiPackagesToUpgradeCount","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","strapiDependencies","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","lt","success"],"mappings":"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"}
|
|
@@ -252,6 +252,9 @@ const upgraderFactory = (project, target, npmPackage)=>{
|
|
|
252
252
|
if (semver.eq(semverTarget, project.strapiVersion)) {
|
|
253
253
|
throw new Error(`The project is already using v${semverTarget}`);
|
|
254
254
|
}
|
|
255
|
+
if (semver.lt(semverTarget, project.strapiVersion)) {
|
|
256
|
+
throw new Error(`The target version v${semverTarget} must be greater than the current version v${project.strapiVersion}`);
|
|
257
|
+
}
|
|
255
258
|
return new Upgrader(project, semverTarget, npmPackage);
|
|
256
259
|
};
|
|
257
260
|
const successReport = ()=>({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrader.mjs","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const devDependencies = json.get<Record<string, string>>('devDependencies', {});\n\n const strapiProductionDependencies = this.getScopedStrapiDependencies(dependencies);\n const strapiDevelopmentDependencies = this.getScopedStrapiDependencies(devDependencies);\n\n const strapiPackagesToUpgradeCount =\n strapiProductionDependencies.length + strapiDevelopmentDependencies.length;\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiPackagesToUpgradeCount)} dependency(ies) to update`\n );\n strapiProductionDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n strapiDevelopmentDependencies.forEach((dependency) =>\n this.logger?.debug?.(\n `- ${dependency[0]} (devDependencies) (${dependency[1]} -> ${this.target})`\n )\n );\n\n if (strapiPackagesToUpgradeCount === 0) {\n return;\n }\n\n strapiProductionDependencies.forEach(([name]) =>\n json.set(`dependencies.${name}`, this.target.raw)\n );\n strapiDevelopmentDependencies.forEach(([name]) =>\n json.set(`devDependencies.${name}`, this.target.raw)\n );\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","devDependencies","strapiProductionDependencies","getScopedStrapiDependencies","strapiDevelopmentDependencies","strapiPackagesToUpgradeCount","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","strapiDependencies","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","success"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"upgrader.mjs","sources":["../../../../src/modules/upgrader/upgrader.ts"],"sourcesContent":["import chalk from 'chalk';\nimport semver from 'semver';\nimport { packageManager } from '@strapi/utils';\n\nimport { createJSONTransformAPI, saveJSON } from '../json';\nimport { constants as projectConstants } from '../project';\nimport {\n isSemverInstance,\n isSemVerReleaseType,\n isValidSemVer,\n rangeFromVersions,\n semVerFactory,\n} from '../version';\nimport { NPMCandidateNotFoundError, unknownToError } from '../error';\nimport * as f from '../format';\nimport { codemodRunnerFactory } from '../codemod-runner';\n\nimport type { Upgrader as UpgraderInterface, UpgradeReport } from './types';\nimport type { Version } from '../version';\nimport type { Logger } from '../logger';\nimport type { Requirement } from '../requirement';\nimport type { NPM } from '../npm';\nimport type { AppProject } from '../project';\nimport type { ConfirmationCallback } from '../common/types';\n\ntype DependenciesEntries = Array<[name: string, version: Version.SemVer]>;\n\nexport class Upgrader implements UpgraderInterface {\n private readonly project: AppProject;\n\n private readonly npmPackage: NPM.Package;\n\n private target: Version.SemVer;\n\n private codemodsTarget!: Version.SemVer;\n\n private isDry: boolean;\n\n private logger: Logger | null;\n\n private requirements: Requirement.Requirement[];\n\n private confirmationCallback: ConfirmationCallback | null;\n\n constructor(project: AppProject, target: Version.SemVer, npmPackage: NPM.Package) {\n this.project = project;\n this.npmPackage = npmPackage;\n\n this.target = target;\n this.syncCodemodsTarget();\n\n this.isDry = false;\n\n this.requirements = [];\n\n this.logger = null;\n this.confirmationCallback = null;\n }\n\n getNPMPackage(): NPM.Package {\n return this.npmPackage;\n }\n\n getProject(): AppProject {\n return this.project;\n }\n\n getTarget(): Version.SemVer {\n return semVerFactory(this.target.raw);\n }\n\n setRequirements(requirements: Requirement.Requirement[]) {\n this.requirements = requirements;\n return this;\n }\n\n setTarget(target: Version.SemVer) {\n this.target = target;\n return this;\n }\n\n syncCodemodsTarget() {\n // Extract the <major>.<minor>.<patch> version from the target and assign it to the codemods target\n //\n // This is useful when dealing with alphas, betas or release candidates:\n // e.g. \"5.0.0-beta.951\" becomes \"5.0.0\"\n //\n // For experimental versions (e.g. \"0.0.0-experimental.hex\"), it is necessary to\n // override the codemods target manually in order to run the appropriate ones.\n this.codemodsTarget = semVerFactory(\n `${this.target.major}.${this.target.minor}.${this.target.patch}`\n );\n\n this.logger?.debug?.(\n `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${f.version(\n this.codemodsTarget\n )}`\n );\n\n return this;\n }\n\n overrideCodemodsTarget(target: Version.SemVer) {\n this.codemodsTarget = target;\n\n this.logger?.debug?.(\n `Overriding the codemods target. The codemod runner will now look for ${f.version(target)}`\n );\n\n return this;\n }\n\n setLogger(logger: Logger) {\n this.logger = logger;\n return this;\n }\n\n onConfirm(callback: ConfirmationCallback | null) {\n this.confirmationCallback = callback;\n return this;\n }\n\n dry(enabled: boolean = true) {\n this.isDry = enabled;\n return this;\n }\n\n addRequirement(requirement: Requirement.Requirement) {\n this.requirements.push(requirement);\n\n const fRequired = requirement.isRequired ? '(required)' : '(optional)';\n this.logger?.debug?.(\n `Added a new requirement to the upgrade: ${f.highlight(requirement.name)} ${fRequired}`\n );\n\n return this;\n }\n\n async upgrade(): Promise<UpgradeReport> {\n this.logger?.info?.(\n `Upgrading from ${f.version(this.project.strapiVersion)} to ${f.version(this.target)}`\n );\n\n if (this.isDry) {\n this.logger?.warn?.(\n 'Running the upgrade in dry mode. No files will be modified during the process.'\n );\n }\n\n const range = rangeFromVersions(this.project.strapiVersion, this.target);\n const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);\n\n const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];\n\n this.logger?.debug?.(\n `Found ${f.highlight(npmVersionsMatches.length)} versions satisfying ${f.versionRange(range)}`\n );\n\n try {\n this.logger?.info?.(f.upgradeStep('Checking requirement', [1, 4]));\n await this.checkRequirements(this.requirements, {\n npmVersionsMatches,\n project: this.project,\n target: this.target,\n });\n\n this.logger?.info?.(f.upgradeStep('Applying the latest code modifications', [2, 4]));\n await this.runCodemods(codemodsRange);\n\n // We need to refresh the project files to make sure we have\n // the latest version of each file (including package.json) for the next steps\n this.logger?.debug?.('Refreshing project information...');\n this.project.refresh();\n\n this.logger?.info?.(f.upgradeStep('Upgrading Strapi dependencies', [3, 4]));\n await this.updateDependencies();\n\n this.logger?.info?.(f.upgradeStep('Installing dependencies', [4, 4]));\n await this.installDependencies();\n } catch (e) {\n return erroredReport(unknownToError(e));\n }\n\n return successReport();\n }\n\n async confirm(message: string): Promise<boolean> {\n if (typeof this.confirmationCallback !== 'function') {\n return true;\n }\n\n return this.confirmationCallback(message);\n }\n\n private async checkRequirements(\n requirements: Requirement.Requirement[],\n context: Requirement.TestContext\n ) {\n for (const requirement of requirements) {\n const { pass, error } = await requirement.test(context);\n\n if (pass) {\n await this.onSuccessfulRequirement(requirement, context);\n } else {\n await this.onFailedRequirement(requirement, error);\n }\n }\n }\n\n private async onSuccessfulRequirement(\n requirement: Requirement.Requirement,\n context: Requirement.TestContext\n ): Promise<void> {\n const hasChildren = requirement.children.length > 0;\n\n if (hasChildren) {\n await this.checkRequirements(requirement.children, context);\n }\n }\n\n private async onFailedRequirement(\n requirement: Requirement.Requirement,\n originalError: Error\n ): Promise<void> {\n const errorMessage = `Requirement failed: ${originalError.message} (${f.highlight(\n requirement.name\n )})`;\n const warningMessage = originalError.message;\n const confirmationMessage = `Ignore optional requirement \"${f.highlight(requirement.name)}\" ?`;\n\n const error = new Error(errorMessage);\n\n if (requirement.isRequired) {\n throw error;\n }\n\n this.logger?.warn?.(warningMessage);\n\n const response = await this.confirmationCallback?.(confirmationMessage);\n\n if (!response) {\n throw error;\n }\n }\n\n private async updateDependencies(): Promise<void> {\n const { packageJSON, packageJSONPath } = this.project;\n\n const json = createJSONTransformAPI(packageJSON);\n\n const dependencies = json.get<Record<string, string>>('dependencies', {});\n const devDependencies = json.get<Record<string, string>>('devDependencies', {});\n\n const strapiProductionDependencies = this.getScopedStrapiDependencies(dependencies);\n const strapiDevelopmentDependencies = this.getScopedStrapiDependencies(devDependencies);\n\n const strapiPackagesToUpgradeCount =\n strapiProductionDependencies.length + strapiDevelopmentDependencies.length;\n\n this.logger?.debug?.(\n `Found ${f.highlight(strapiPackagesToUpgradeCount)} dependency(ies) to update`\n );\n strapiProductionDependencies.forEach((dependency) =>\n this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)\n );\n strapiDevelopmentDependencies.forEach((dependency) =>\n this.logger?.debug?.(\n `- ${dependency[0]} (devDependencies) (${dependency[1]} -> ${this.target})`\n )\n );\n\n if (strapiPackagesToUpgradeCount === 0) {\n return;\n }\n\n strapiProductionDependencies.forEach(([name]) =>\n json.set(`dependencies.${name}`, this.target.raw)\n );\n strapiDevelopmentDependencies.forEach(([name]) =>\n json.set(`devDependencies.${name}`, this.target.raw)\n );\n\n const updatedPackageJSON = json.root();\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies update (${chalk.italic('dry mode')})`);\n return;\n }\n\n await saveJSON(packageJSONPath, updatedPackageJSON);\n }\n\n private getScopedStrapiDependencies(dependencies: Record<string, string>): DependenciesEntries {\n const { strapiVersion } = this.project;\n\n const strapiDependencies: DependenciesEntries = [];\n\n // Find all @strapi/* packages matching the current Strapi version\n for (const [name, version] of Object.entries(dependencies)) {\n const isScopedStrapiPackage = name.startsWith(projectConstants.SCOPED_STRAPI_PACKAGE_PREFIX);\n const isOnCurrentStrapiVersion = isValidSemVer(version) && version === strapiVersion.raw;\n\n if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {\n strapiDependencies.push([name, semVerFactory(version)]);\n }\n }\n\n return strapiDependencies;\n }\n\n private async installDependencies(): Promise<void> {\n const projectPath = this.project.cwd;\n\n const packageManagerName = await packageManager.getPreferred(projectPath);\n\n this.logger?.debug?.(`Using ${f.highlight(packageManagerName)} as package manager`);\n\n if (this.isDry) {\n this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic('dry mode')})`);\n return;\n }\n\n await packageManager.installDependencies(projectPath, packageManagerName, {\n stdout: this.logger?.stdout,\n stderr: this.logger?.stderr,\n });\n }\n\n private async runCodemods(range: Version.Range): Promise<void> {\n const codemodRunner = codemodRunnerFactory(this.project, range);\n\n codemodRunner.dry(this.isDry);\n\n if (this.logger) {\n codemodRunner.setLogger(this.logger);\n }\n\n await codemodRunner.run();\n }\n}\n\n/**\n * Resolves the NPM target version based on the given project, target, and NPM package.\n * If target is a SemVer, it directly finds it. If it's a release type (major, minor, patch),\n * it calculates the range of versions for this release type and returns the latest version within this range.\n */\nconst resolveNPMTarget = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n): NPM.NPMPackageVersion => {\n // Semver\n if (isSemverInstance(target)) {\n const version = npmPackage.findVersion(target);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(target);\n }\n\n return version;\n }\n\n // Release Types\n if (isSemVerReleaseType(target)) {\n const range = rangeFromVersions(project.strapiVersion, target);\n const npmVersionsMatches = npmPackage.findVersionsInRange(range);\n\n // The targeted version is the latest one that matches the given range\n const version = npmVersionsMatches.at(-1);\n\n if (!version) {\n throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);\n }\n\n return version;\n }\n\n throw new NPMCandidateNotFoundError(target);\n};\n\nexport const upgraderFactory = (\n project: AppProject,\n target: Version.ReleaseType | Version.SemVer,\n npmPackage: NPM.Package\n) => {\n const npmTarget = resolveNPMTarget(project, target, npmPackage);\n const semverTarget = semVerFactory(npmTarget.version);\n\n if (semver.eq(semverTarget, project.strapiVersion)) {\n throw new Error(`The project is already using v${semverTarget}`);\n }\n\n if (semver.lt(semverTarget, project.strapiVersion)) {\n throw new Error(\n `The target version v${semverTarget} must be greater than the current version v${project.strapiVersion}`\n );\n }\n\n return new Upgrader(project, semverTarget, npmPackage);\n};\n\nconst successReport = (): UpgradeReport => ({ success: true, error: null });\nconst erroredReport = (error: Error): UpgradeReport => ({ success: false, error });\n"],"names":["Upgrader","getNPMPackage","npmPackage","getProject","project","getTarget","semVerFactory","target","raw","setRequirements","requirements","setTarget","syncCodemodsTarget","codemodsTarget","major","minor","patch","logger","debug","f","overrideCodemodsTarget","setLogger","onConfirm","callback","confirmationCallback","dry","enabled","isDry","addRequirement","requirement","push","fRequired","isRequired","name","upgrade","info","strapiVersion","warn","range","rangeFromVersions","codemodsRange","npmVersionsMatches","findVersionsInRange","length","checkRequirements","runCodemods","refresh","updateDependencies","installDependencies","e","erroredReport","unknownToError","successReport","confirm","message","context","pass","error","test","onSuccessfulRequirement","onFailedRequirement","hasChildren","children","originalError","errorMessage","warningMessage","confirmationMessage","Error","response","packageJSON","packageJSONPath","json","createJSONTransformAPI","dependencies","get","devDependencies","strapiProductionDependencies","getScopedStrapiDependencies","strapiDevelopmentDependencies","strapiPackagesToUpgradeCount","forEach","dependency","set","updatedPackageJSON","root","chalk","italic","saveJSON","strapiDependencies","version","Object","entries","isScopedStrapiPackage","startsWith","projectConstants","isOnCurrentStrapiVersion","isValidSemVer","projectPath","cwd","packageManagerName","packageManager","getPreferred","stdout","stderr","codemodRunner","codemodRunnerFactory","run","resolveNPMTarget","isSemverInstance","findVersion","NPMCandidateNotFoundError","isSemVerReleaseType","at","upgraderFactory","npmTarget","semverTarget","semver","eq","lt","success"],"mappings":"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"}
|
|
@@ -55,8 +55,8 @@ const runUpgradePrompts = async (upgrader, options)=>{
|
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
57
|
const addUpgradeRequirements = (upgrader, options)=>{
|
|
58
|
-
//
|
|
59
|
-
//
|
|
58
|
+
// Major release upgrades enforce stepping through the latest patch for the current major.
|
|
59
|
+
// Semver targets (via the "to" command) skip these checks intentionally.
|
|
60
60
|
if (options.target === types.ReleaseType.Major) {
|
|
61
61
|
upgrader.addRequirement(major.REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(major.REQUIRE_LATEST_FOR_CURRENT_MAJOR);
|
|
62
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sources":["../../../../src/tasks/upgrade/upgrade.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as f from '../../modules/format';\nimport { npmPackageFactory } from '../../modules/npm';\nimport { isApplicationProject, projectFactory } from '../../modules/project';\nimport { timerFactory } from '../../modules/timer';\nimport { constants as upgraderConstants, upgraderFactory } from '../../modules/upgrader';\nimport { Version } from '../../modules/version';\n\nimport * as requirements from './requirements';\nimport * as prompts from './prompts';\n\nimport type { UpgradeOptions } from './types';\nimport type { Upgrader } from '../../modules/upgrader';\n\nexport const upgrade = async (options: UpgradeOptions) => {\n const timer = timerFactory();\n const { logger, codemodsTarget } = options;\n\n // Resolves the correct working directory based on the given input\n const cwd = path.resolve(options.cwd ?? process.cwd());\n\n const project = projectFactory(cwd);\n\n logger.debug(f.projectDetails(project));\n\n if (!isApplicationProject(project)) {\n throw new Error(\n `The \"${options.target}\" upgrade can only be run on a Strapi project; for plugins, please use \"codemods\".`\n );\n }\n\n logger.debug(\n `Application: VERSION=${f.version(project.packageJSON.version as Version.LiteralVersion)}; STRAPI_VERSION=${f.version(project.strapiVersion)}`\n );\n\n const npmPackage = npmPackageFactory(upgraderConstants.STRAPI_PACKAGE_NAME, project.cwd, logger);\n\n // Load all available versions from the NPM registry\n await npmPackage.refresh();\n\n // Initialize the upgrade instance\n // Throws during initialization if the provided target is incompatible with the current version\n const upgrader = upgraderFactory(project, options.target, npmPackage)\n .dry(options.dry ?? false)\n .onConfirm(options.confirm ?? null)\n .setLogger(logger);\n\n // Manually override the target version for codemods if it's explicitly provided\n if (codemodsTarget !== undefined) {\n upgrader.overrideCodemodsTarget(codemodsTarget);\n }\n\n // Prompt user for confirmation details before upgrading\n await runUpgradePrompts(upgrader, options);\n\n // Add specific requirements before upgrading\n addUpgradeRequirements(upgrader, options);\n\n // Actually run the upgrade process once configured,\n // The response contains information about the final status: success/error\n const upgradeReport = await upgrader.upgrade();\n\n if (!upgradeReport.success) {\n throw upgradeReport.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${f.durationMs(timer.elapsedMs)}ms`);\n};\n\nconst runUpgradePrompts = async (upgrader: Upgrader, options: UpgradeOptions) => {\n if (options.target === Version.ReleaseType.Latest) {\n await prompts.latest(upgrader, options);\n }\n};\n\nconst addUpgradeRequirements = (upgrader: Upgrader, options: UpgradeOptions): void => {\n //
|
|
1
|
+
{"version":3,"file":"upgrade.js","sources":["../../../../src/tasks/upgrade/upgrade.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as f from '../../modules/format';\nimport { npmPackageFactory } from '../../modules/npm';\nimport { isApplicationProject, projectFactory } from '../../modules/project';\nimport { timerFactory } from '../../modules/timer';\nimport { constants as upgraderConstants, upgraderFactory } from '../../modules/upgrader';\nimport { Version } from '../../modules/version';\n\nimport * as requirements from './requirements';\nimport * as prompts from './prompts';\n\nimport type { UpgradeOptions } from './types';\nimport type { Upgrader } from '../../modules/upgrader';\n\nexport const upgrade = async (options: UpgradeOptions) => {\n const timer = timerFactory();\n const { logger, codemodsTarget } = options;\n\n // Resolves the correct working directory based on the given input\n const cwd = path.resolve(options.cwd ?? process.cwd());\n\n const project = projectFactory(cwd);\n\n logger.debug(f.projectDetails(project));\n\n if (!isApplicationProject(project)) {\n throw new Error(\n `The \"${options.target}\" upgrade can only be run on a Strapi project; for plugins, please use \"codemods\".`\n );\n }\n\n logger.debug(\n `Application: VERSION=${f.version(project.packageJSON.version as Version.LiteralVersion)}; STRAPI_VERSION=${f.version(project.strapiVersion)}`\n );\n\n const npmPackage = npmPackageFactory(upgraderConstants.STRAPI_PACKAGE_NAME, project.cwd, logger);\n\n // Load all available versions from the NPM registry\n await npmPackage.refresh();\n\n // Initialize the upgrade instance\n // Throws during initialization if the provided target is incompatible with the current version\n const upgrader = upgraderFactory(project, options.target, npmPackage)\n .dry(options.dry ?? false)\n .onConfirm(options.confirm ?? null)\n .setLogger(logger);\n\n // Manually override the target version for codemods if it's explicitly provided\n if (codemodsTarget !== undefined) {\n upgrader.overrideCodemodsTarget(codemodsTarget);\n }\n\n // Prompt user for confirmation details before upgrading\n await runUpgradePrompts(upgrader, options);\n\n // Add specific requirements before upgrading\n addUpgradeRequirements(upgrader, options);\n\n // Actually run the upgrade process once configured,\n // The response contains information about the final status: success/error\n const upgradeReport = await upgrader.upgrade();\n\n if (!upgradeReport.success) {\n throw upgradeReport.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${f.durationMs(timer.elapsedMs)}ms`);\n};\n\nconst runUpgradePrompts = async (upgrader: Upgrader, options: UpgradeOptions) => {\n if (options.target === Version.ReleaseType.Latest) {\n await prompts.latest(upgrader, options);\n }\n};\n\nconst addUpgradeRequirements = (upgrader: Upgrader, options: UpgradeOptions): void => {\n // Major release upgrades enforce stepping through the latest patch for the current major.\n // Semver targets (via the \"to\" command) skip these checks intentionally.\n if (options.target === Version.ReleaseType.Major) {\n upgrader\n .addRequirement(requirements.major.REQUIRE_AVAILABLE_NEXT_MAJOR)\n .addRequirement(requirements.major.REQUIRE_LATEST_FOR_CURRENT_MAJOR);\n }\n\n // Make sure the git repository is in an optimal state before running the upgrade\n // Mainly used to ease rollbacks in case the upgrade is corrupted\n upgrader.addRequirement(requirements.common.REQUIRE_GIT.asOptional());\n};\n"],"names":["upgrade","options","timer","timerFactory","logger","codemodsTarget","cwd","path","resolve","process","project","projectFactory","debug","f","isApplicationProject","Error","target","packageJSON","version","strapiVersion","npmPackage","npmPackageFactory","upgraderConstants","refresh","upgrader","upgraderFactory","dry","onConfirm","confirm","setLogger","undefined","overrideCodemodsTarget","runUpgradePrompts","addUpgradeRequirements","upgradeReport","success","error","stop","info","elapsedMs","Version","Latest","prompts","Major","addRequirement","requirements","asOptional"],"mappings":";;;;;;;;;;;;;;;;;AAeO,MAAMA,UAAU,OAAOC,OAAAA,GAAAA;AAC5B,IAAA,MAAMC,OAAAA,GAAQC,kBAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAE,GAAGJ,OAAAA;;IAGnC,MAAMK,GAAAA,GAAMC,KAAKC,OAAO,CAACP,QAAQK,GAAG,IAAIG,QAAQH,GAAG,EAAA,CAAA;AAEnD,IAAA,MAAMI,YAAUC,sBAAAA,CAAeL,GAAAA,CAAAA;AAE/BF,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,sBAAgB,CAACH,SAAAA,CAAAA,CAAAA;IAE9B,IAAI,CAACI,2BAAqBJ,SAAAA,CAAAA,EAAU;QAClC,MAAM,IAAIK,MACR,CAAC,KAAK,EAAEd,OAAAA,CAAQe,MAAM,CAAC,kFAAkF,CAAC,CAAA;AAE9G,IAAA;IAEAZ,MAAAA,CAAOQ,KAAK,CACV,CAAC,qBAAqB,EAAEC,eAAS,CAACH,SAAAA,CAAQO,WAAW,CAACC,OAAO,CAAA,CAA4B,iBAAiB,EAAEL,eAAS,CAACH,SAAAA,CAAQS,aAAa,CAAA,CAAA,CAAG,CAAA;AAGhJ,IAAA,MAAMC,aAAaC,0BAAAA,CAAkBC,6BAAqC,EAAEZ,SAAAA,CAAQJ,GAAG,EAAEF,MAAAA,CAAAA;;AAGzF,IAAA,MAAMgB,WAAWG,OAAO,EAAA;;;IAIxB,MAAMC,UAAAA,GAAWC,yBAAgBf,SAAAA,EAAST,OAAAA,CAAQe,MAAM,EAAEI,UAAAA,CAAAA,CACvDM,GAAG,CAACzB,OAAAA,CAAQyB,GAAG,IAAI,KAAA,CAAA,CACnBC,SAAS,CAAC1B,OAAAA,CAAQ2B,OAAO,IAAI,IAAA,CAAA,CAC7BC,SAAS,CAACzB,MAAAA,CAAAA;;AAGb,IAAA,IAAIC,mBAAmByB,SAAAA,EAAW;AAChCN,QAAAA,UAAAA,CAASO,sBAAsB,CAAC1B,cAAAA,CAAAA;AAClC,IAAA;;AAGA,IAAA,MAAM2B,kBAAkBR,UAAAA,EAAUvB,OAAAA,CAAAA;;AAGlCgC,IAAAA,sBAAAA,CAAuBT,UAAAA,EAAUvB,OAAAA,CAAAA;;;IAIjC,MAAMiC,aAAAA,GAAgB,MAAMV,UAAAA,CAASxB,OAAO,EAAA;IAE5C,IAAI,CAACkC,aAAAA,CAAcC,OAAO,EAAE;AAC1B,QAAA,MAAMD,cAAcE,KAAK;AAC3B,IAAA;AAEAlC,IAAAA,OAAAA,CAAMmC,IAAI,EAAA;AAEVjC,IAAAA,MAAAA,CAAOkC,IAAI,CAAC,CAAC,aAAa,EAAEzB,kBAAY,CAACX,OAAAA,CAAMqC,SAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/D;AAEA,MAAMP,iBAAAA,GAAoB,OAAOR,QAAAA,EAAoBvB,OAAAA,GAAAA;AACnD,IAAA,IAAIA,QAAQe,MAAM,KAAKwB,iBAAmB,CAACC,MAAM,EAAE;QACjD,MAAMC,aAAc,CAAClB,QAAAA,EAAUvB,OAAAA,CAAAA;AACjC,IAAA;AACF,CAAA;AAEA,MAAMgC,sBAAAA,GAAyB,CAACT,QAAAA,EAAoBvB,OAAAA,GAAAA;;;AAGlD,IAAA,IAAIA,QAAQe,MAAM,KAAKwB,iBAAmB,CAACG,KAAK,EAAE;AAChDnB,QAAAA,QAAAA,CACGoB,cAAc,CAACC,kCAA+C,CAAA,CAC9DD,cAAc,CAACC,sCAAmD,CAAA;AACvE,IAAA;;;AAIArB,IAAAA,QAAAA,CAASoB,cAAc,CAACC,kBAA+B,CAACC,UAAU,EAAA,CAAA;AACpE,CAAA;;;;"}
|
|
@@ -53,8 +53,8 @@ const runUpgradePrompts = async (upgrader, options)=>{
|
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
55
|
const addUpgradeRequirements = (upgrader, options)=>{
|
|
56
|
-
//
|
|
57
|
-
//
|
|
56
|
+
// Major release upgrades enforce stepping through the latest patch for the current major.
|
|
57
|
+
// Semver targets (via the "to" command) skip these checks intentionally.
|
|
58
58
|
if (options.target === ReleaseType.Major) {
|
|
59
59
|
upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
|
|
60
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.mjs","sources":["../../../../src/tasks/upgrade/upgrade.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as f from '../../modules/format';\nimport { npmPackageFactory } from '../../modules/npm';\nimport { isApplicationProject, projectFactory } from '../../modules/project';\nimport { timerFactory } from '../../modules/timer';\nimport { constants as upgraderConstants, upgraderFactory } from '../../modules/upgrader';\nimport { Version } from '../../modules/version';\n\nimport * as requirements from './requirements';\nimport * as prompts from './prompts';\n\nimport type { UpgradeOptions } from './types';\nimport type { Upgrader } from '../../modules/upgrader';\n\nexport const upgrade = async (options: UpgradeOptions) => {\n const timer = timerFactory();\n const { logger, codemodsTarget } = options;\n\n // Resolves the correct working directory based on the given input\n const cwd = path.resolve(options.cwd ?? process.cwd());\n\n const project = projectFactory(cwd);\n\n logger.debug(f.projectDetails(project));\n\n if (!isApplicationProject(project)) {\n throw new Error(\n `The \"${options.target}\" upgrade can only be run on a Strapi project; for plugins, please use \"codemods\".`\n );\n }\n\n logger.debug(\n `Application: VERSION=${f.version(project.packageJSON.version as Version.LiteralVersion)}; STRAPI_VERSION=${f.version(project.strapiVersion)}`\n );\n\n const npmPackage = npmPackageFactory(upgraderConstants.STRAPI_PACKAGE_NAME, project.cwd, logger);\n\n // Load all available versions from the NPM registry\n await npmPackage.refresh();\n\n // Initialize the upgrade instance\n // Throws during initialization if the provided target is incompatible with the current version\n const upgrader = upgraderFactory(project, options.target, npmPackage)\n .dry(options.dry ?? false)\n .onConfirm(options.confirm ?? null)\n .setLogger(logger);\n\n // Manually override the target version for codemods if it's explicitly provided\n if (codemodsTarget !== undefined) {\n upgrader.overrideCodemodsTarget(codemodsTarget);\n }\n\n // Prompt user for confirmation details before upgrading\n await runUpgradePrompts(upgrader, options);\n\n // Add specific requirements before upgrading\n addUpgradeRequirements(upgrader, options);\n\n // Actually run the upgrade process once configured,\n // The response contains information about the final status: success/error\n const upgradeReport = await upgrader.upgrade();\n\n if (!upgradeReport.success) {\n throw upgradeReport.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${f.durationMs(timer.elapsedMs)}ms`);\n};\n\nconst runUpgradePrompts = async (upgrader: Upgrader, options: UpgradeOptions) => {\n if (options.target === Version.ReleaseType.Latest) {\n await prompts.latest(upgrader, options);\n }\n};\n\nconst addUpgradeRequirements = (upgrader: Upgrader, options: UpgradeOptions): void => {\n //
|
|
1
|
+
{"version":3,"file":"upgrade.mjs","sources":["../../../../src/tasks/upgrade/upgrade.ts"],"sourcesContent":["import path from 'node:path';\n\nimport * as f from '../../modules/format';\nimport { npmPackageFactory } from '../../modules/npm';\nimport { isApplicationProject, projectFactory } from '../../modules/project';\nimport { timerFactory } from '../../modules/timer';\nimport { constants as upgraderConstants, upgraderFactory } from '../../modules/upgrader';\nimport { Version } from '../../modules/version';\n\nimport * as requirements from './requirements';\nimport * as prompts from './prompts';\n\nimport type { UpgradeOptions } from './types';\nimport type { Upgrader } from '../../modules/upgrader';\n\nexport const upgrade = async (options: UpgradeOptions) => {\n const timer = timerFactory();\n const { logger, codemodsTarget } = options;\n\n // Resolves the correct working directory based on the given input\n const cwd = path.resolve(options.cwd ?? process.cwd());\n\n const project = projectFactory(cwd);\n\n logger.debug(f.projectDetails(project));\n\n if (!isApplicationProject(project)) {\n throw new Error(\n `The \"${options.target}\" upgrade can only be run on a Strapi project; for plugins, please use \"codemods\".`\n );\n }\n\n logger.debug(\n `Application: VERSION=${f.version(project.packageJSON.version as Version.LiteralVersion)}; STRAPI_VERSION=${f.version(project.strapiVersion)}`\n );\n\n const npmPackage = npmPackageFactory(upgraderConstants.STRAPI_PACKAGE_NAME, project.cwd, logger);\n\n // Load all available versions from the NPM registry\n await npmPackage.refresh();\n\n // Initialize the upgrade instance\n // Throws during initialization if the provided target is incompatible with the current version\n const upgrader = upgraderFactory(project, options.target, npmPackage)\n .dry(options.dry ?? false)\n .onConfirm(options.confirm ?? null)\n .setLogger(logger);\n\n // Manually override the target version for codemods if it's explicitly provided\n if (codemodsTarget !== undefined) {\n upgrader.overrideCodemodsTarget(codemodsTarget);\n }\n\n // Prompt user for confirmation details before upgrading\n await runUpgradePrompts(upgrader, options);\n\n // Add specific requirements before upgrading\n addUpgradeRequirements(upgrader, options);\n\n // Actually run the upgrade process once configured,\n // The response contains information about the final status: success/error\n const upgradeReport = await upgrader.upgrade();\n\n if (!upgradeReport.success) {\n throw upgradeReport.error;\n }\n\n timer.stop();\n\n logger.info(`Completed in ${f.durationMs(timer.elapsedMs)}ms`);\n};\n\nconst runUpgradePrompts = async (upgrader: Upgrader, options: UpgradeOptions) => {\n if (options.target === Version.ReleaseType.Latest) {\n await prompts.latest(upgrader, options);\n }\n};\n\nconst addUpgradeRequirements = (upgrader: Upgrader, options: UpgradeOptions): void => {\n // Major release upgrades enforce stepping through the latest patch for the current major.\n // Semver targets (via the \"to\" command) skip these checks intentionally.\n if (options.target === Version.ReleaseType.Major) {\n upgrader\n .addRequirement(requirements.major.REQUIRE_AVAILABLE_NEXT_MAJOR)\n .addRequirement(requirements.major.REQUIRE_LATEST_FOR_CURRENT_MAJOR);\n }\n\n // Make sure the git repository is in an optimal state before running the upgrade\n // Mainly used to ease rollbacks in case the upgrade is corrupted\n upgrader.addRequirement(requirements.common.REQUIRE_GIT.asOptional());\n};\n"],"names":["upgrade","options","timer","timerFactory","logger","codemodsTarget","cwd","path","resolve","process","project","projectFactory","debug","f","isApplicationProject","Error","target","packageJSON","version","strapiVersion","npmPackage","npmPackageFactory","upgraderConstants","refresh","upgrader","upgraderFactory","dry","onConfirm","confirm","setLogger","undefined","overrideCodemodsTarget","runUpgradePrompts","addUpgradeRequirements","upgradeReport","success","error","stop","info","elapsedMs","Version","Latest","prompts","Major","addRequirement","requirements","asOptional"],"mappings":";;;;;;;;;;;;;;;AAeO,MAAMA,UAAU,OAAOC,OAAAA,GAAAA;AAC5B,IAAA,MAAMC,KAAAA,GAAQC,YAAAA,EAAAA;AACd,IAAA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAE,GAAGJ,OAAAA;;IAGnC,MAAMK,GAAAA,GAAMC,KAAKC,OAAO,CAACP,QAAQK,GAAG,IAAIG,QAAQH,GAAG,EAAA,CAAA;AAEnD,IAAA,MAAMI,UAAUC,cAAAA,CAAeL,GAAAA,CAAAA;AAE/BF,IAAAA,MAAAA,CAAOQ,KAAK,CAACC,cAAgB,CAACH,OAAAA,CAAAA,CAAAA;IAE9B,IAAI,CAACI,qBAAqBJ,OAAAA,CAAAA,EAAU;QAClC,MAAM,IAAIK,MACR,CAAC,KAAK,EAAEd,OAAAA,CAAQe,MAAM,CAAC,kFAAkF,CAAC,CAAA;AAE9G,IAAA;IAEAZ,MAAAA,CAAOQ,KAAK,CACV,CAAC,qBAAqB,EAAEC,OAAS,CAACH,OAAAA,CAAQO,WAAW,CAACC,OAAO,CAAA,CAA4B,iBAAiB,EAAEL,OAAS,CAACH,OAAAA,CAAQS,aAAa,CAAA,CAAA,CAAG,CAAA;AAGhJ,IAAA,MAAMC,aAAaC,iBAAAA,CAAkBC,mBAAqC,EAAEZ,OAAAA,CAAQJ,GAAG,EAAEF,MAAAA,CAAAA;;AAGzF,IAAA,MAAMgB,WAAWG,OAAO,EAAA;;;IAIxB,MAAMC,QAAAA,GAAWC,gBAAgBf,OAAAA,EAAST,OAAAA,CAAQe,MAAM,EAAEI,UAAAA,CAAAA,CACvDM,GAAG,CAACzB,OAAAA,CAAQyB,GAAG,IAAI,KAAA,CAAA,CACnBC,SAAS,CAAC1B,OAAAA,CAAQ2B,OAAO,IAAI,IAAA,CAAA,CAC7BC,SAAS,CAACzB,MAAAA,CAAAA;;AAGb,IAAA,IAAIC,mBAAmByB,SAAAA,EAAW;AAChCN,QAAAA,QAAAA,CAASO,sBAAsB,CAAC1B,cAAAA,CAAAA;AAClC,IAAA;;AAGA,IAAA,MAAM2B,kBAAkBR,QAAAA,EAAUvB,OAAAA,CAAAA;;AAGlCgC,IAAAA,sBAAAA,CAAuBT,QAAAA,EAAUvB,OAAAA,CAAAA;;;IAIjC,MAAMiC,aAAAA,GAAgB,MAAMV,QAAAA,CAASxB,OAAO,EAAA;IAE5C,IAAI,CAACkC,aAAAA,CAAcC,OAAO,EAAE;AAC1B,QAAA,MAAMD,cAAcE,KAAK;AAC3B,IAAA;AAEAlC,IAAAA,KAAAA,CAAMmC,IAAI,EAAA;AAEVjC,IAAAA,MAAAA,CAAOkC,IAAI,CAAC,CAAC,aAAa,EAAEzB,UAAY,CAACX,KAAAA,CAAMqC,SAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AAC/D;AAEA,MAAMP,iBAAAA,GAAoB,OAAOR,QAAAA,EAAoBvB,OAAAA,GAAAA;AACnD,IAAA,IAAIA,QAAQe,MAAM,KAAKwB,WAAmB,CAACC,MAAM,EAAE;QACjD,MAAMC,MAAc,CAAClB,QAAAA,EAAUvB,OAAAA,CAAAA;AACjC,IAAA;AACF,CAAA;AAEA,MAAMgC,sBAAAA,GAAyB,CAACT,QAAAA,EAAoBvB,OAAAA,GAAAA;;;AAGlD,IAAA,IAAIA,QAAQe,MAAM,KAAKwB,WAAmB,CAACG,KAAK,EAAE;AAChDnB,QAAAA,QAAAA,CACGoB,cAAc,CAACC,4BAA+C,CAAA,CAC9DD,cAAc,CAACC,gCAAmD,CAAA;AACvE,IAAA;;;AAIArB,IAAAA,QAAAA,CAASoB,cAAc,CAACC,WAA+B,CAACC,UAAU,EAAA,CAAA;AACpE,CAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/upgrade",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.48.0",
|
|
4
4
|
"description": "CLI to upgrade Strapi applications effortless",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"watch": "run -T rollup -c -w"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@strapi/utils": "5.
|
|
68
|
+
"@strapi/utils": "5.48.0",
|
|
69
69
|
"chalk": "4.1.2",
|
|
70
70
|
"cli-table3": "0.6.5",
|
|
71
71
|
"commander": "8.3.0",
|
|
@@ -83,10 +83,10 @@
|
|
|
83
83
|
"undici": "6.25.0"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
|
-
"@strapi/types": "5.
|
|
86
|
+
"@strapi/types": "5.48.0",
|
|
87
87
|
"@types/fs-extra": "11.0.4",
|
|
88
88
|
"@types/jscodeshift": "17.3.0",
|
|
89
|
-
"eslint-config-custom": "5.
|
|
89
|
+
"eslint-config-custom": "5.48.0",
|
|
90
90
|
"rimraf": "6.1.3"
|
|
91
91
|
},
|
|
92
92
|
"engines": {
|