@strapi/upgrade 0.0.0-next.3c5400321681b66eb35ab84c11113a78c1d9386e → 0.0.0-next.3db8f1fc613b89bf7742dc5746bf21a8d8ba0d04

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -99,6 +99,7 @@ var ReleaseType = /* @__PURE__ */ ((ReleaseType2) => {
99
99
  ReleaseType2["Major"] = "major";
100
100
  ReleaseType2["Minor"] = "minor";
101
101
  ReleaseType2["Patch"] = "patch";
102
+ ReleaseType2["Latest"] = "latest";
102
103
  return ReleaseType2;
103
104
  })(ReleaseType || {});
104
105
  const semVerFactory = (version2) => {
@@ -120,6 +121,9 @@ const rangeFactory = (range) => {
120
121
  };
121
122
  const rangeFromReleaseType = (current, identifier) => {
122
123
  switch (identifier) {
124
+ case ReleaseType.Latest: {
125
+ return rangeFactory(`>${current.raw}`);
126
+ }
123
127
  case ReleaseType.Major: {
124
128
  const nextMajor = semVerFactory(current.raw).inc("major");
125
129
  return rangeFactory(`>${current.raw} <=${nextMajor.major}`);
@@ -150,7 +154,36 @@ const isValidStringifiedRange = (str) => semver__default.default.validRange(str)
150
154
  const isRangeInstance = (range) => {
151
155
  return range instanceof semver__default.default.Range;
152
156
  };
157
+ class UnexpectedError extends Error {
158
+ constructor() {
159
+ super("Unexpected Error");
160
+ }
161
+ }
162
+ class NPMCandidateNotFoundError extends Error {
163
+ target;
164
+ constructor(target, message = `Couldn't find a valid NPM candidate for "${target}"`) {
165
+ super(message);
166
+ this.target = target;
167
+ }
168
+ }
169
+ class AbortedError extends Error {
170
+ constructor(message = "Upgrade aborted") {
171
+ super(message);
172
+ }
173
+ }
174
+ const unknownToError = (e) => {
175
+ if (e instanceof Error) {
176
+ return e;
177
+ }
178
+ if (typeof e === "string") {
179
+ return new Error(e);
180
+ }
181
+ return new UnexpectedError();
182
+ };
153
183
  const handleError = (err, isSilent) => {
184
+ if (err instanceof AbortedError) {
185
+ process.exit(0);
186
+ }
154
187
  if (!isSilent) {
155
188
  console.error(
156
189
  chalk__default.default.red(`[ERROR] [${(/* @__PURE__ */ new Date()).toISOString()}]`),
@@ -639,27 +672,6 @@ const projectFactory = (cwd) => {
639
672
  const isApplicationProject = (project) => {
640
673
  return project instanceof AppProject;
641
674
  };
642
- class UnexpectedError extends Error {
643
- constructor() {
644
- super("Unexpected Error");
645
- }
646
- }
647
- class NPMCandidateNotFoundError extends Error {
648
- target;
649
- constructor(target, message = `Couldn't find a valid NPM candidate for "${target}"`) {
650
- super(message);
651
- this.target = target;
652
- }
653
- }
654
- const unknownToError = (e) => {
655
- if (e instanceof Error) {
656
- return e;
657
- }
658
- if (typeof e === "string") {
659
- return new Error(e);
660
- }
661
- return new UnexpectedError();
662
- };
663
675
  const CODEMOD_CODE_SUFFIX = "code";
664
676
  const CODEMOD_JSON_SUFFIX = "json";
665
677
  const CODEMOD_ALLOWED_SUFFIXES = [CODEMOD_CODE_SUFFIX, CODEMOD_JSON_SUFFIX];
@@ -915,6 +927,15 @@ class Upgrader {
915
927
  this.logger = null;
916
928
  this.confirmationCallback = null;
917
929
  }
930
+ getNPMPackage() {
931
+ return this.npmPackage;
932
+ }
933
+ getProject() {
934
+ return this.project;
935
+ }
936
+ getTarget() {
937
+ return semVerFactory(this.target.raw);
938
+ }
918
939
  setRequirements(requirements) {
919
940
  this.requirements = requirements;
920
941
  return this;
@@ -996,6 +1017,12 @@ class Upgrader {
996
1017
  }
997
1018
  return successReport();
998
1019
  }
1020
+ async confirm(message) {
1021
+ if (typeof this.confirmationCallback !== "function") {
1022
+ return true;
1023
+ }
1024
+ return this.confirmationCallback(message);
1025
+ }
999
1026
  async checkRequirements(requirements, context) {
1000
1027
  for (const requirement of requirements) {
1001
1028
  const { pass, error } = await requirement.test(context);
@@ -1225,6 +1252,36 @@ const REQUIRE_GIT_INSTALLED = requirementFactory(
1225
1252
  const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
1226
1253
  REQUIRE_GIT_INSTALLED.asOptional()
1227
1254
  );
1255
+ const latest = async (upgrader, options) => {
1256
+ if (options.target !== ReleaseType.Latest) {
1257
+ return;
1258
+ }
1259
+ const npmPackage = upgrader.getNPMPackage();
1260
+ const target = upgrader.getTarget();
1261
+ const project = upgrader.getProject();
1262
+ const { strapiVersion: current } = project;
1263
+ const fTargetMajor = highlight(`v${target.major}`);
1264
+ const fCurrentMajor = highlight(`v${current.major}`);
1265
+ const fTarget = version$1(target);
1266
+ const fCurrent = version$1(current);
1267
+ const isMajorUpgrade = target.major > current.major;
1268
+ if (isMajorUpgrade) {
1269
+ options.logger.warn(
1270
+ `Detected a major upgrade for the "${highlight(ReleaseType.Latest)}" tag: ${fCurrent} > ${fTarget}`
1271
+ );
1272
+ const newerPackageRelease = npmPackage.findVersionsInRange(rangeFactory(`>${current.raw} <${target.major}`)).at(-1);
1273
+ if (newerPackageRelease) {
1274
+ const fLatest = version$1(semVerFactory(newerPackageRelease.version));
1275
+ options.logger.warn(
1276
+ `It's recommended to first upgrade to the latest version of ${fCurrentMajor} (${fLatest}) before upgrading to ${fTargetMajor}.`
1277
+ );
1278
+ }
1279
+ const proceedAnyway = await upgrader.confirm(`I know what I'm doing. Proceed anyway!`);
1280
+ if (!proceedAnyway) {
1281
+ throw new AbortedError();
1282
+ }
1283
+ }
1284
+ };
1228
1285
  const upgrade$1 = async (options) => {
1229
1286
  const timer = timerFactory();
1230
1287
  const { logger, codemodsTarget } = options;
@@ -1245,10 +1302,8 @@ const upgrade$1 = async (options) => {
1245
1302
  if (codemodsTarget !== void 0) {
1246
1303
  upgrader.overrideCodemodsTarget(codemodsTarget);
1247
1304
  }
1248
- if (options.target === ReleaseType.Major) {
1249
- upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1250
- }
1251
- upgrader.addRequirement(REQUIRE_GIT.asOptional());
1305
+ await runUpgradePrompts(upgrader, options);
1306
+ addUpgradeRequirements(upgrader, options);
1252
1307
  const upgradeReport = await upgrader.upgrade();
1253
1308
  if (!upgradeReport.success) {
1254
1309
  throw upgradeReport.error;
@@ -1256,6 +1311,17 @@ const upgrade$1 = async (options) => {
1256
1311
  timer.stop();
1257
1312
  logger.info(`Completed in ${durationMs(timer.elapsedMs)}ms`);
1258
1313
  };
1314
+ const runUpgradePrompts = async (upgrader, options) => {
1315
+ if (options.target === ReleaseType.Latest) {
1316
+ await latest(upgrader, options);
1317
+ }
1318
+ };
1319
+ const addUpgradeRequirements = (upgrader, options) => {
1320
+ if (options.target === ReleaseType.Major) {
1321
+ upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1322
+ }
1323
+ upgrader.addRequirement(REQUIRE_GIT.asOptional());
1324
+ };
1259
1325
  const resolvePath = (cwd) => path__default.default.resolve(cwd ?? process.cwd());
1260
1326
  const getRangeFromTarget = (currentVersion, target) => {
1261
1327
  if (isSemverInstance(target)) {
@@ -1263,6 +1329,8 @@ const getRangeFromTarget = (currentVersion, target) => {
1263
1329
  }
1264
1330
  const { major, minor, patch } = currentVersion;
1265
1331
  switch (target) {
1332
+ case ReleaseType.Latest:
1333
+ throw new Error("Can't use <latest> to create a codemods range: not implemented");
1266
1334
  case ReleaseType.Major:
1267
1335
  return rangeFactory(`${major}`);
1268
1336
  case ReleaseType.Minor:
@@ -1382,6 +1450,10 @@ const register$1 = (program) => {
1382
1450
  return upgrade({ ...options, target: releaseType });
1383
1451
  });
1384
1452
  };
1453
+ addReleaseUpgradeCommand(
1454
+ ReleaseType.Latest,
1455
+ "Upgrade to the latest available version of Strapi"
1456
+ );
1385
1457
  addReleaseUpgradeCommand(
1386
1458
  ReleaseType.Major,
1387
1459
  "Upgrade to the next available major version of Strapi"
@@ -1494,7 +1566,7 @@ When executed on a Strapi plugin project, it shows every codemods.
1494
1566
  return listCodemods(options);
1495
1567
  });
1496
1568
  };
1497
- const version = "0.0.0-next.3c5400321681b66eb35ab84c11113a78c1d9386e";
1569
+ const version = "0.0.0-next.3db8f1fc613b89bf7742dc5746bf21a8d8ba0d04";
1498
1570
  register$1(commander.program);
1499
1571
  register(commander.program);
1500
1572
  commander.program.usage("<command> [options]").on("command:*", ([invalidCmd]) => {