@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.js CHANGED
@@ -145,6 +145,7 @@ var ReleaseType = /* @__PURE__ */ ((ReleaseType2) => {
145
145
  ReleaseType2["Major"] = "major";
146
146
  ReleaseType2["Minor"] = "minor";
147
147
  ReleaseType2["Patch"] = "patch";
148
+ ReleaseType2["Latest"] = "latest";
148
149
  return ReleaseType2;
149
150
  })(ReleaseType || {});
150
151
  const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
@@ -170,6 +171,9 @@ const rangeFactory = (range) => {
170
171
  };
171
172
  const rangeFromReleaseType = (current, identifier) => {
172
173
  switch (identifier) {
174
+ case ReleaseType.Latest: {
175
+ return rangeFactory(`>${current.raw}`);
176
+ }
173
177
  case ReleaseType.Major: {
174
178
  const nextMajor = semVerFactory(current.raw).inc("major");
175
179
  return rangeFactory(`>${current.raw} <=${nextMajor.major}`);
@@ -657,6 +661,11 @@ class NPMCandidateNotFoundError extends Error {
657
661
  this.target = target;
658
662
  }
659
663
  }
664
+ class AbortedError extends Error {
665
+ constructor(message = "Upgrade aborted") {
666
+ super(message);
667
+ }
668
+ }
660
669
  const unknownToError = (e) => {
661
670
  if (e instanceof Error) {
662
671
  return e;
@@ -668,6 +677,7 @@ const unknownToError = (e) => {
668
677
  };
669
678
  const index$9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
670
679
  __proto__: null,
680
+ AbortedError,
671
681
  NPMCandidateNotFoundError,
672
682
  UnexpectedError,
673
683
  unknownToError
@@ -949,6 +959,15 @@ class Upgrader {
949
959
  this.logger = null;
950
960
  this.confirmationCallback = null;
951
961
  }
962
+ getNPMPackage() {
963
+ return this.npmPackage;
964
+ }
965
+ getProject() {
966
+ return this.project;
967
+ }
968
+ getTarget() {
969
+ return semVerFactory(this.target.raw);
970
+ }
952
971
  setRequirements(requirements) {
953
972
  this.requirements = requirements;
954
973
  return this;
@@ -1030,6 +1049,12 @@ class Upgrader {
1030
1049
  }
1031
1050
  return successReport();
1032
1051
  }
1052
+ async confirm(message) {
1053
+ if (typeof this.confirmationCallback !== "function") {
1054
+ return true;
1055
+ }
1056
+ return this.confirmationCallback(message);
1057
+ }
1033
1058
  async checkRequirements(requirements, context) {
1034
1059
  for (const requirement of requirements) {
1035
1060
  const { pass, error } = await requirement.test(context);
@@ -1272,6 +1297,36 @@ const REQUIRE_GIT_INSTALLED = requirementFactory(
1272
1297
  const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
1273
1298
  REQUIRE_GIT_INSTALLED.asOptional()
1274
1299
  );
1300
+ const latest = async (upgrader, options) => {
1301
+ if (options.target !== ReleaseType.Latest) {
1302
+ return;
1303
+ }
1304
+ const npmPackage = upgrader.getNPMPackage();
1305
+ const target = upgrader.getTarget();
1306
+ const project = upgrader.getProject();
1307
+ const { strapiVersion: current } = project;
1308
+ const fTargetMajor = highlight(`v${target.major}`);
1309
+ const fCurrentMajor = highlight(`v${current.major}`);
1310
+ const fTarget = version(target);
1311
+ const fCurrent = version(current);
1312
+ const isMajorUpgrade = target.major > current.major;
1313
+ if (isMajorUpgrade) {
1314
+ options.logger.warn(
1315
+ `Detected a major upgrade for the "${highlight(ReleaseType.Latest)}" tag: ${fCurrent} > ${fTarget}`
1316
+ );
1317
+ const newerPackageRelease = npmPackage.findVersionsInRange(rangeFactory(`>${current.raw} <${target.major}`)).at(-1);
1318
+ if (newerPackageRelease) {
1319
+ const fLatest = version(semVerFactory(newerPackageRelease.version));
1320
+ options.logger.warn(
1321
+ `It's recommended to first upgrade to the latest version of ${fCurrentMajor} (${fLatest}) before upgrading to ${fTargetMajor}.`
1322
+ );
1323
+ }
1324
+ const proceedAnyway = await upgrader.confirm(`I know what I'm doing. Proceed anyway!`);
1325
+ if (!proceedAnyway) {
1326
+ throw new AbortedError();
1327
+ }
1328
+ }
1329
+ };
1275
1330
  const upgrade = async (options) => {
1276
1331
  const timer = timerFactory();
1277
1332
  const { logger, codemodsTarget } = options;
@@ -1292,10 +1347,8 @@ const upgrade = async (options) => {
1292
1347
  if (codemodsTarget !== void 0) {
1293
1348
  upgrader.overrideCodemodsTarget(codemodsTarget);
1294
1349
  }
1295
- if (options.target === ReleaseType.Major) {
1296
- upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1297
- }
1298
- upgrader.addRequirement(REQUIRE_GIT.asOptional());
1350
+ await runUpgradePrompts(upgrader, options);
1351
+ addUpgradeRequirements(upgrader, options);
1299
1352
  const upgradeReport = await upgrader.upgrade();
1300
1353
  if (!upgradeReport.success) {
1301
1354
  throw upgradeReport.error;
@@ -1303,6 +1356,17 @@ const upgrade = async (options) => {
1303
1356
  timer.stop();
1304
1357
  logger.info(`Completed in ${durationMs(timer.elapsedMs)}ms`);
1305
1358
  };
1359
+ const runUpgradePrompts = async (upgrader, options) => {
1360
+ if (options.target === ReleaseType.Latest) {
1361
+ await latest(upgrader, options);
1362
+ }
1363
+ };
1364
+ const addUpgradeRequirements = (upgrader, options) => {
1365
+ if (options.target === ReleaseType.Major) {
1366
+ upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1367
+ }
1368
+ upgrader.addRequirement(REQUIRE_GIT.asOptional());
1369
+ };
1306
1370
  const resolvePath = (cwd) => path__default.default.resolve(cwd ?? process.cwd());
1307
1371
  const getRangeFromTarget = (currentVersion, target) => {
1308
1372
  if (isSemverInstance(target)) {
@@ -1310,6 +1374,8 @@ const getRangeFromTarget = (currentVersion, target) => {
1310
1374
  }
1311
1375
  const { major, minor, patch } = currentVersion;
1312
1376
  switch (target) {
1377
+ case ReleaseType.Latest:
1378
+ throw new Error("Can't use <latest> to create a codemods range: not implemented");
1313
1379
  case ReleaseType.Major:
1314
1380
  return rangeFactory(`${major}`);
1315
1381
  case ReleaseType.Minor: