@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/index.mjs CHANGED
@@ -134,6 +134,7 @@ var ReleaseType = /* @__PURE__ */ ((ReleaseType2) => {
134
134
  ReleaseType2["Major"] = "major";
135
135
  ReleaseType2["Minor"] = "minor";
136
136
  ReleaseType2["Patch"] = "patch";
137
+ ReleaseType2["Latest"] = "latest";
137
138
  return ReleaseType2;
138
139
  })(ReleaseType || {});
139
140
  const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
@@ -159,6 +160,9 @@ const rangeFactory = (range) => {
159
160
  };
160
161
  const rangeFromReleaseType = (current, identifier) => {
161
162
  switch (identifier) {
163
+ case ReleaseType.Latest: {
164
+ return rangeFactory(`>${current.raw}`);
165
+ }
162
166
  case ReleaseType.Major: {
163
167
  const nextMajor = semVerFactory(current.raw).inc("major");
164
168
  return rangeFactory(`>${current.raw} <=${nextMajor.major}`);
@@ -646,6 +650,11 @@ class NPMCandidateNotFoundError extends Error {
646
650
  this.target = target;
647
651
  }
648
652
  }
653
+ class AbortedError extends Error {
654
+ constructor(message = "Upgrade aborted") {
655
+ super(message);
656
+ }
657
+ }
649
658
  const unknownToError = (e) => {
650
659
  if (e instanceof Error) {
651
660
  return e;
@@ -657,6 +666,7 @@ const unknownToError = (e) => {
657
666
  };
658
667
  const index$9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
659
668
  __proto__: null,
669
+ AbortedError,
660
670
  NPMCandidateNotFoundError,
661
671
  UnexpectedError,
662
672
  unknownToError
@@ -938,6 +948,15 @@ class Upgrader {
938
948
  this.logger = null;
939
949
  this.confirmationCallback = null;
940
950
  }
951
+ getNPMPackage() {
952
+ return this.npmPackage;
953
+ }
954
+ getProject() {
955
+ return this.project;
956
+ }
957
+ getTarget() {
958
+ return semVerFactory(this.target.raw);
959
+ }
941
960
  setRequirements(requirements) {
942
961
  this.requirements = requirements;
943
962
  return this;
@@ -1019,6 +1038,12 @@ class Upgrader {
1019
1038
  }
1020
1039
  return successReport();
1021
1040
  }
1041
+ async confirm(message) {
1042
+ if (typeof this.confirmationCallback !== "function") {
1043
+ return true;
1044
+ }
1045
+ return this.confirmationCallback(message);
1046
+ }
1022
1047
  async checkRequirements(requirements, context) {
1023
1048
  for (const requirement of requirements) {
1024
1049
  const { pass, error } = await requirement.test(context);
@@ -1261,6 +1286,36 @@ const REQUIRE_GIT_INSTALLED = requirementFactory(
1261
1286
  const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
1262
1287
  REQUIRE_GIT_INSTALLED.asOptional()
1263
1288
  );
1289
+ const latest = async (upgrader, options) => {
1290
+ if (options.target !== ReleaseType.Latest) {
1291
+ return;
1292
+ }
1293
+ const npmPackage = upgrader.getNPMPackage();
1294
+ const target = upgrader.getTarget();
1295
+ const project = upgrader.getProject();
1296
+ const { strapiVersion: current } = project;
1297
+ const fTargetMajor = highlight(`v${target.major}`);
1298
+ const fCurrentMajor = highlight(`v${current.major}`);
1299
+ const fTarget = version(target);
1300
+ const fCurrent = version(current);
1301
+ const isMajorUpgrade = target.major > current.major;
1302
+ if (isMajorUpgrade) {
1303
+ options.logger.warn(
1304
+ `Detected a major upgrade for the "${highlight(ReleaseType.Latest)}" tag: ${fCurrent} > ${fTarget}`
1305
+ );
1306
+ const newerPackageRelease = npmPackage.findVersionsInRange(rangeFactory(`>${current.raw} <${target.major}`)).at(-1);
1307
+ if (newerPackageRelease) {
1308
+ const fLatest = version(semVerFactory(newerPackageRelease.version));
1309
+ options.logger.warn(
1310
+ `It's recommended to first upgrade to the latest version of ${fCurrentMajor} (${fLatest}) before upgrading to ${fTargetMajor}.`
1311
+ );
1312
+ }
1313
+ const proceedAnyway = await upgrader.confirm(`I know what I'm doing. Proceed anyway!`);
1314
+ if (!proceedAnyway) {
1315
+ throw new AbortedError();
1316
+ }
1317
+ }
1318
+ };
1264
1319
  const upgrade = async (options) => {
1265
1320
  const timer = timerFactory();
1266
1321
  const { logger, codemodsTarget } = options;
@@ -1281,10 +1336,8 @@ const upgrade = async (options) => {
1281
1336
  if (codemodsTarget !== void 0) {
1282
1337
  upgrader.overrideCodemodsTarget(codemodsTarget);
1283
1338
  }
1284
- if (options.target === ReleaseType.Major) {
1285
- upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1286
- }
1287
- upgrader.addRequirement(REQUIRE_GIT.asOptional());
1339
+ await runUpgradePrompts(upgrader, options);
1340
+ addUpgradeRequirements(upgrader, options);
1288
1341
  const upgradeReport = await upgrader.upgrade();
1289
1342
  if (!upgradeReport.success) {
1290
1343
  throw upgradeReport.error;
@@ -1292,6 +1345,17 @@ const upgrade = async (options) => {
1292
1345
  timer.stop();
1293
1346
  logger.info(`Completed in ${durationMs(timer.elapsedMs)}ms`);
1294
1347
  };
1348
+ const runUpgradePrompts = async (upgrader, options) => {
1349
+ if (options.target === ReleaseType.Latest) {
1350
+ await latest(upgrader, options);
1351
+ }
1352
+ };
1353
+ const addUpgradeRequirements = (upgrader, options) => {
1354
+ if (options.target === ReleaseType.Major) {
1355
+ upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1356
+ }
1357
+ upgrader.addRequirement(REQUIRE_GIT.asOptional());
1358
+ };
1295
1359
  const resolvePath = (cwd) => path$1.resolve(cwd ?? process.cwd());
1296
1360
  const getRangeFromTarget = (currentVersion, target) => {
1297
1361
  if (isSemverInstance(target)) {
@@ -1299,6 +1363,8 @@ const getRangeFromTarget = (currentVersion, target) => {
1299
1363
  }
1300
1364
  const { major, minor, patch } = currentVersion;
1301
1365
  switch (target) {
1366
+ case ReleaseType.Latest:
1367
+ throw new Error("Can't use <latest> to create a codemods range: not implemented");
1302
1368
  case ReleaseType.Major:
1303
1369
  return rangeFactory(`${major}`);
1304
1370
  case ReleaseType.Minor: