@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 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
- Once released, it will be the recommended way to update to any major, minor, and patch versions of Strapi instead of manually modifying package.json files.
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
- major [options] Upgrade to the next available major version of Strapi
15
- minor [options] Upgrade to the latest minor and patch version of Strapi for the
16
- current major
17
- patch [options] Upgrade to latest patch version of Strapi for the current major
18
- and minor
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
- This package is not yet released, so currently it can be run on a project in the monorepo /examples directory with the following command:
60
+ Run from a Strapi project directory:
47
61
 
48
- `../../packages/utils/upgrade/bin/upgrade`
62
+ ```bash
63
+ npx @strapi/upgrade --help
64
+ npx @strapi/upgrade to 5.42.0
65
+ ```
49
66
 
50
- Run the command with the `--help` option to see all the available options.
67
+ Within a project that has Strapi installed, you can also use `strapi upgrade`.
51
68
 
52
- [Coming Soon] The Strapi Upgrade tool will be available using `npx @strapi/upgrade` and an alias for that within a project using `strapi upgrade`
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;YAyB7B,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
+ {"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,aAUxB,CAAC"}
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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "5.47.0";
3
+ var version = "5.48.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.js.map
@@ -1,4 +1,4 @@
1
- var version = "5.47.0";
1
+ var version = "5.48.0";
2
2
 
3
3
  export { version };
4
4
  //# sourceMappingURL=package.json.mjs.map
@@ -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
- hidden: true
80
- }).description('Upgrade to the specified version of Strapi').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)=>{
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: semver.semVerFactory(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 <target>', { hidden: true })\n .description('Upgrade to the specified version of Strapi')\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: string, options: CLIUpgradeToOptions) => {\n if (!isValidSemVer(target)) {\n console.error(`Invalid target supplied, expected a valid semver but got \"${target}\"`);\n process.exit(1);\n }\n\n return upgrade({ ...options, target: semVerFactory(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","hidden","Option","argParser","isLiteralSemVer","InvalidArgumentError","semVerFactory","isValidSemVer","console","error","process","exit"],"mappings":"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"}
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 { Option, InvalidArgumentError } from 'commander';
2
+ import { InvalidArgumentError, Option } from 'commander';
3
3
  import { loggerFactory } from '../../modules/logger/logger.mjs';
4
- import { isLiteralSemVer, semVerFactory, isValidSemVer } from '../../modules/version/semver.mjs';
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
- hidden: true
78
- }).description('Upgrade to the specified version of Strapi').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)=>{
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: semVerFactory(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 <target>', { hidden: true })\n .description('Upgrade to the specified version of Strapi')\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: string, options: CLIUpgradeToOptions) => {\n if (!isValidSemVer(target)) {\n console.error(`Invalid target supplied, expected a valid semver but got \"${target}\"`);\n process.exit(1);\n }\n\n return upgrade({ ...options, target: semVerFactory(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","hidden","Option","argParser","isLiteralSemVer","InvalidArgumentError","semVerFactory","isValidSemVer","console","error","process","exit"],"mappings":"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"}
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
- const registryCommands = {
40
- yarn: [
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
- pnpm: [
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, command, {
84
+ const { stdout } = await execa(packageManagerName, [
85
+ ...command
86
+ ], {
62
87
  timeout: 10000
63
88
  });
64
- return stdout.trim() || undefined;
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
- const registryCommands = {
38
- yarn: [
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
- pnpm: [
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, command, {
82
+ const { stdout } = await execa(packageManagerName, [
83
+ ...command
84
+ ], {
60
85
  timeout: 10000
61
86
  });
62
- return stdout.trim() || undefined;
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
- // Don't add the same requirements when manually targeting a major upgrade
59
- // using a semver as it's implied that the users know what they're doing
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 // Don't add the same requirements when manually targeting a major upgrade\n // using a semver as it's implied that the users know what they're doing\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;;;;"}
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
- // Don't add the same requirements when manually targeting a major upgrade
57
- // using a semver as it's implied that the users know what they're doing
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 // Don't add the same requirements when manually targeting a major upgrade\n // using a semver as it's implied that the users know what they're doing\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;;;;"}
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.47.0",
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.47.0",
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.47.0",
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.47.0",
89
+ "eslint-config-custom": "5.48.0",
90
90
  "rimraf": "6.1.3"
91
91
  },
92
92
  "engines": {