@strapi/upgrade 0.0.0-experimental.d362bf200f5f9359a4bbd4a549603de5ee1f04ca → 0.0.0-experimental.d834c9e658d1fb037e6da1105150593521c667cc

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.
Files changed (68) hide show
  1. package/LICENSE +19 -4
  2. package/dist/cli.js +1456 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/index.js +234 -94
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +235 -95
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/modules/codemod/codemod.d.ts +4 -2
  9. package/dist/modules/codemod/codemod.d.ts.map +1 -1
  10. package/dist/modules/codemod/types.d.ts +8 -1
  11. package/dist/modules/codemod/types.d.ts.map +1 -1
  12. package/dist/modules/codemod-repository/constants.d.ts.map +1 -1
  13. package/dist/modules/codemod-repository/repository.d.ts +5 -5
  14. package/dist/modules/codemod-repository/repository.d.ts.map +1 -1
  15. package/dist/modules/codemod-repository/types.d.ts +7 -3
  16. package/dist/modules/codemod-repository/types.d.ts.map +1 -1
  17. package/dist/modules/codemod-runner/codemod-runner.d.ts +6 -3
  18. package/dist/modules/codemod-runner/codemod-runner.d.ts.map +1 -1
  19. package/dist/modules/codemod-runner/index.d.ts +1 -0
  20. package/dist/modules/codemod-runner/index.d.ts.map +1 -1
  21. package/dist/modules/codemod-runner/types.d.ts +1 -0
  22. package/dist/modules/codemod-runner/types.d.ts.map +1 -1
  23. package/dist/modules/format/formats.d.ts +5 -0
  24. package/dist/modules/format/formats.d.ts.map +1 -1
  25. package/dist/modules/project/constants.d.ts.map +1 -1
  26. package/dist/modules/project/project.d.ts +1 -1
  27. package/dist/modules/project/project.d.ts.map +1 -1
  28. package/dist/modules/project/types.d.ts +1 -0
  29. package/dist/modules/project/types.d.ts.map +1 -1
  30. package/dist/modules/project/utils.d.ts +1 -1
  31. package/dist/modules/project/utils.d.ts.map +1 -1
  32. package/dist/modules/report/report.d.ts.map +1 -1
  33. package/dist/modules/runner/json/transform.d.ts.map +1 -1
  34. package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
  35. package/dist/modules/version/range.d.ts +2 -0
  36. package/dist/modules/version/range.d.ts.map +1 -1
  37. package/dist/tasks/codemods/index.d.ts +2 -1
  38. package/dist/tasks/codemods/index.d.ts.map +1 -1
  39. package/dist/tasks/codemods/list-codemods.d.ts +3 -0
  40. package/dist/tasks/codemods/list-codemods.d.ts.map +1 -0
  41. package/dist/tasks/codemods/run-codemods.d.ts +3 -0
  42. package/dist/tasks/codemods/run-codemods.d.ts.map +1 -0
  43. package/dist/tasks/codemods/types.d.ts +9 -3
  44. package/dist/tasks/codemods/types.d.ts.map +1 -1
  45. package/dist/tasks/codemods/utils.d.ts +6 -0
  46. package/dist/tasks/codemods/utils.d.ts.map +1 -0
  47. package/dist/tasks/index.d.ts +1 -1
  48. package/dist/tasks/index.d.ts.map +1 -1
  49. package/package.json +9 -8
  50. package/resources/codemods/5.0.0/change-useAPIErrorHandler-import.code.ts +21 -0
  51. package/resources/codemods/5.0.0/comment-out-lifecycle-files.code.ts +63 -0
  52. package/resources/codemods/5.0.0/dependency-upgrade-react-and-react-dom.json.ts +67 -0
  53. package/resources/codemods/5.0.0/dependency-upgrade-styled-components.json.ts +49 -0
  54. package/resources/codemods/5.0.0/entity-service-document-service.code.ts +437 -0
  55. package/resources/codemods/5.0.0/strapi-public-interface.code.ts +126 -0
  56. package/resources/codemods/5.0.0/useRBAC-hook-import-change.code.ts +21 -0
  57. package/resources/codemods/5.0.0/utils-public-interface.code.ts +320 -0
  58. package/resources/utils/change-import.ts +96 -0
  59. package/dist/_chunks/codemod-runner-mXNzVpHm.js +0 -798
  60. package/dist/_chunks/codemod-runner-mXNzVpHm.js.map +0 -1
  61. package/dist/_chunks/codemods-S4mNX9Qg.js +0 -105
  62. package/dist/_chunks/codemods-S4mNX9Qg.js.map +0 -1
  63. package/dist/_chunks/index-Pt-TU9MN.js +0 -103
  64. package/dist/_chunks/index-Pt-TU9MN.js.map +0 -1
  65. package/dist/_chunks/upgrade-aWNYibWB.js +0 -361
  66. package/dist/_chunks/upgrade-aWNYibWB.js.map +0 -1
  67. package/dist/tasks/codemods/codemods.d.ts +0 -3
  68. package/dist/tasks/codemods/codemods.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -263,13 +263,19 @@ const rangeFromVersions = (currentVersion, target) => {
263
263
  }
264
264
  throw new Error(`Invalid target set: ${target}`);
265
265
  };
266
+ const isValidStringifiedRange = (str) => semver__default.default.validRange(str) !== null;
267
+ const isRangeInstance = (range) => {
268
+ return range instanceof semver__default.default.Range;
269
+ };
266
270
  const index$e = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
267
271
  __proto__: null,
268
272
  Version: types,
269
273
  isLiteralSemVer,
274
+ isRangeInstance,
270
275
  isSemVerReleaseType,
271
276
  isSemverInstance,
272
277
  isValidSemVer,
278
+ isValidStringifiedRange,
273
279
  rangeFactory,
274
280
  rangeFromReleaseType,
275
281
  rangeFromVersions,
@@ -330,7 +336,11 @@ const transformJSON = async (codemodPath, paths, config) => {
330
336
  timeElapsed: "",
331
337
  stats: {}
332
338
  };
333
- const esbuildOptions = { extensions: [".js", ".mjs", ".ts"] };
339
+ const esbuildOptions = {
340
+ extensions: [".js", ".mjs", ".ts"],
341
+ hookIgnoreNodeModules: false,
342
+ hookMatcher: fp.isEqual(codemodPath)
343
+ };
334
344
  const { unregister } = node.register(esbuildOptions);
335
345
  const module2 = require(codemodPath);
336
346
  unregister();
@@ -375,7 +385,7 @@ const index$b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
375
385
  jsonRunnerFactory
376
386
  }, Symbol.toStringTag, { value: "Module" }));
377
387
  const PROJECT_PACKAGE_JSON = "package.json";
378
- const PROJECT_DEFAULT_ALLOWED_ROOT_PATHS = ["src", "config", "public"];
388
+ const PROJECT_DEFAULT_ALLOWED_ROOT_PATHS = ["src", "config", "public", "admin", "server"];
379
389
  const PROJECT_DEFAULT_CODE_EXTENSIONS = [
380
390
  // Source files
381
391
  "js",
@@ -428,10 +438,10 @@ class Project {
428
438
  this.refreshProjectFiles();
429
439
  return this;
430
440
  }
431
- async runCodemods(codemods2, options) {
441
+ async runCodemods(codemods, options) {
432
442
  const runners = this.createProjectCodemodsRunners(options.dry);
433
443
  const reports2 = [];
434
- for (const codemod of codemods2) {
444
+ for (const codemod of codemods) {
435
445
  for (const runner of runners) {
436
446
  if (runner.valid(codemod)) {
437
447
  const report = await runner.run(codemod);
@@ -490,7 +500,7 @@ class Project {
490
500
  }
491
501
  class AppProject extends Project {
492
502
  strapiVersion;
493
- type = "app";
503
+ type = "application";
494
504
  constructor(cwd) {
495
505
  super(cwd);
496
506
  this.refreshStrapiVersion();
@@ -574,12 +584,12 @@ function assertPluginProject(project) {
574
584
  throw new Error("Project is not a plugin");
575
585
  }
576
586
  }
577
- const isAppProject = (project) => {
587
+ const isApplicationProject = (project) => {
578
588
  return project instanceof AppProject;
579
589
  };
580
590
  function assertAppProject(project) {
581
- if (!isAppProject(project)) {
582
- throw new Error("Project is not an app");
591
+ if (!isApplicationProject(project)) {
592
+ throw new Error("Project is not an application");
583
593
  }
584
594
  }
585
595
  const index$a = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
@@ -587,7 +597,7 @@ const index$a = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
587
597
  assertAppProject,
588
598
  assertPluginProject,
589
599
  constants: constants$3,
590
- isAppProject,
600
+ isApplicationProject,
591
601
  isPluginProject,
592
602
  projectFactory
593
603
  }, Symbol.toStringTag, { value: "Module" }));
@@ -614,7 +624,11 @@ const path = (path2) => chalk__default.default.blue(path2);
614
624
  const version = (version2) => {
615
625
  return chalk__default.default.italic.yellow(`v${version2}`);
616
626
  };
617
- const versionRange = (range) => chalk__default.default.italic.yellow(range);
627
+ const codemodUID = (uid) => {
628
+ return chalk__default.default.bold.cyan(uid);
629
+ };
630
+ const projectType = (type) => chalk__default.default.cyan(type);
631
+ const versionRange = (range) => chalk__default.default.italic.yellow(range.raw);
618
632
  const transform = (transformFilePath) => chalk__default.default.cyan(transformFilePath);
619
633
  const highlight = (arg) => chalk__default.default.bold.underline(arg);
620
634
  const upgradeStep = (text, step) => {
@@ -646,15 +660,40 @@ const reports = (reports2) => {
646
660
  table.push(...rows);
647
661
  return table.toString();
648
662
  };
663
+ const codemodList = (codemods) => {
664
+ const rows = codemods.map((codemod, index2) => {
665
+ const fIndex = chalk__default.default.grey(index2);
666
+ const fVersion = chalk__default.default.magenta(codemod.version);
667
+ const fKind = chalk__default.default.yellow(codemod.kind);
668
+ const fName = chalk__default.default.blue(codemod.format());
669
+ const fUID = codemodUID(codemod.uid);
670
+ return [fIndex, fVersion, fKind, fName, fUID];
671
+ });
672
+ const table = new CliTable3__default.default({
673
+ style: { compact: true },
674
+ head: [
675
+ chalk__default.default.bold.grey("N°"),
676
+ chalk__default.default.bold.magenta("Version"),
677
+ chalk__default.default.bold.yellow("Kind"),
678
+ chalk__default.default.bold.blue("Name"),
679
+ chalk__default.default.bold.cyan("UID")
680
+ ]
681
+ });
682
+ table.push(...rows);
683
+ return table.toString();
684
+ };
649
685
  const durationMs = (elapsedMs) => {
650
686
  const elapsedSeconds = (elapsedMs / ONE_SECOND_MS).toFixed(3);
651
687
  return `${elapsedSeconds}s`;
652
688
  };
653
689
  const index$8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
654
690
  __proto__: null,
691
+ codemodList,
692
+ codemodUID,
655
693
  durationMs,
656
694
  highlight,
657
695
  path,
696
+ projectType,
658
697
  reports,
659
698
  transform,
660
699
  upgradeStep,
@@ -677,6 +716,7 @@ const constants$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
677
716
  CODEMOD_JSON_SUFFIX
678
717
  }, Symbol.toStringTag, { value: "Module" }));
679
718
  class Codemod {
719
+ uid;
680
720
  kind;
681
721
  version;
682
722
  baseDirectory;
@@ -688,9 +728,27 @@ class Codemod {
688
728
  this.baseDirectory = options.baseDirectory;
689
729
  this.filename = options.filename;
690
730
  this.path = path__default.default.join(this.baseDirectory, this.version.raw, this.filename);
691
- }
692
- format() {
693
- return this.filename.replace(`.${CODEMOD_CODE_SUFFIX}.${CODEMOD_EXTENSION}`, "").replace(`.${CODEMOD_JSON_SUFFIX}.${CODEMOD_EXTENSION}`, "").replaceAll("-", " ");
731
+ this.uid = this.createUID();
732
+ }
733
+ createUID() {
734
+ const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });
735
+ const kind = this.kind;
736
+ const version2 = this.version.raw;
737
+ return `${version2}-${name}-${kind}`;
738
+ }
739
+ format(options) {
740
+ const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};
741
+ let formatted = this.filename;
742
+ if (stripExtension) {
743
+ formatted = formatted.replace(new RegExp(`\\.${CODEMOD_EXTENSION}$`, "i"), "");
744
+ }
745
+ if (stripKind) {
746
+ formatted = formatted.replace(`.${CODEMOD_CODE_SUFFIX}`, "").replace(`.${CODEMOD_JSON_SUFFIX}`, "");
747
+ }
748
+ if (stripHyphens) {
749
+ formatted = formatted.replaceAll("-", " ");
750
+ }
751
+ return formatted;
694
752
  }
695
753
  }
696
754
  const codemodFactory = (options) => new Codemod(options);
@@ -699,6 +757,20 @@ const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
699
757
  codemodFactory,
700
758
  constants: constants$2
701
759
  }, Symbol.toStringTag, { value: "Module" }));
760
+ const INTERNAL_CODEMODS_DIRECTORY = path__default.default.join(
761
+ __dirname,
762
+ // upgrade/dist
763
+ "..",
764
+ // upgrade
765
+ "resources",
766
+ // upgrade/resources
767
+ "codemods"
768
+ // upgrade/resources/codemods
769
+ );
770
+ const constants$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
771
+ __proto__: null,
772
+ INTERNAL_CODEMODS_DIRECTORY
773
+ }, Symbol.toStringTag, { value: "Module" }));
702
774
  class CodemodRepository {
703
775
  groups;
704
776
  versions;
@@ -717,29 +789,47 @@ class CodemodRepository {
717
789
  count(version2) {
718
790
  return this.findByVersion(version2).length;
719
791
  }
720
- countRange(range) {
721
- return this.findByRange(range).length;
722
- }
723
- exists(version2) {
792
+ versionExists(version2) {
724
793
  return version2.raw in this.groups;
725
794
  }
726
- findByRange(range) {
795
+ has(uid) {
796
+ const result = this.find({ uids: [uid] });
797
+ if (result.length !== 1) {
798
+ return false;
799
+ }
800
+ const { codemods } = result[0];
801
+ return codemods.length === 1 && codemods[0].uid === uid;
802
+ }
803
+ find(q) {
727
804
  const entries = Object.entries(this.groups);
728
- return entries.filter(([version2]) => range.test(version2)).map(([version2, codemods2]) => ({
805
+ return entries.filter(maybeFilterByRange).map(([version2, codemods]) => ({
729
806
  version: semVerFactory(version2),
730
- codemods: codemods2
731
- }));
807
+ // Filter by UID if provided in the query
808
+ codemods: codemods.filter(maybeFilterByUIDs)
809
+ })).filter(({ codemods }) => codemods.length > 0);
810
+ function maybeFilterByRange([version2]) {
811
+ if (!isRangeInstance(q.range)) {
812
+ return true;
813
+ }
814
+ return q.range.test(version2);
815
+ }
816
+ function maybeFilterByUIDs(codemod) {
817
+ if (q.uids === void 0) {
818
+ return true;
819
+ }
820
+ return q.uids.includes(codemod.uid);
821
+ }
732
822
  }
733
823
  findByVersion(version2) {
734
824
  const literalVersion = version2.raw;
735
- const codemods2 = this.groups[literalVersion];
736
- return codemods2 ?? [];
825
+ const codemods = this.groups[literalVersion];
826
+ return codemods ?? [];
737
827
  }
738
828
  findAll() {
739
829
  const entries = Object.entries(this.groups);
740
- return entries.map(([version2, codemods2]) => ({
830
+ return entries.map(([version2, codemods]) => ({
741
831
  version: semVerFactory(version2),
742
- codemods: codemods2
832
+ codemods
743
833
  }));
744
834
  }
745
835
  refreshAvailableVersions() {
@@ -771,18 +861,9 @@ const parseCodemodKindFromFilename = (filename) => {
771
861
  assert__default.default(CODEMOD_ALLOWED_SUFFIXES.includes(kind));
772
862
  return kind;
773
863
  };
774
- const codemodRepositoryFactory = (cwd) => new CodemodRepository(cwd);
775
- const INTERNAL_CODEMODS_DIRECTORY = path__default.default.join(
776
- __dirname,
777
- "..",
778
- "..",
779
- "resources",
780
- "codemods"
781
- );
782
- const constants$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
783
- __proto__: null,
784
- INTERNAL_CODEMODS_DIRECTORY
785
- }, Symbol.toStringTag, { value: "Module" }));
864
+ const codemodRepositoryFactory = (cwd = INTERNAL_CODEMODS_DIRECTORY) => {
865
+ return new CodemodRepository(cwd);
866
+ };
786
867
  const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
787
868
  __proto__: null,
788
869
  codemodRepositoryFactory,
@@ -817,40 +898,59 @@ class CodemodRunner {
817
898
  this.isDry = enabled;
818
899
  return this;
819
900
  }
820
- async run(codemodsDirectory) {
901
+ createRepository(codemodsDirectory) {
821
902
  const repository = codemodRepositoryFactory(
822
903
  codemodsDirectory ?? INTERNAL_CODEMODS_DIRECTORY
823
904
  );
824
905
  repository.refresh();
825
- const allVersionedCodemods = this.range ? repository.findByRange(this.range) : repository.findAll();
826
- const versionedCodemods = this.selectCodemodsCallback ? await this.selectCodemodsCallback(allVersionedCodemods) : allVersionedCodemods;
827
- const hasCodemodsToRun = versionedCodemods.length > 0;
828
- if (!hasCodemodsToRun) {
829
- if (this.range) {
830
- this.logger?.debug(`Found no codemods to run for ${versionRange(this.range)}`);
831
- } else {
832
- this.logger?.debug(`Found no codemods to run`);
833
- }
834
- return successReport$1();
835
- }
836
- if (this.range) {
837
- this.logger?.debug(
838
- `Found codemods for ${highlight(versionedCodemods.length)} version(s) using ${this.range}`
906
+ return repository;
907
+ }
908
+ async safeRunAndReport(codemods) {
909
+ if (this.isDry) {
910
+ this.logger?.warn?.(
911
+ "Running the codemods in dry mode. No files will be modified during the process."
839
912
  );
840
- } else {
841
- this.logger?.debug(`Found codemods for ${highlight(versionedCodemods.length)} version(s)`);
842
913
  }
843
- versionedCodemods.forEach(
844
- ({ version: version$1, codemods: codemods22 }) => this.logger?.debug(`- ${version(version$1)} (${codemods22.length})`)
845
- );
846
- const codemods2 = versionedCodemods.map(({ codemods: codemods22 }) => codemods22).flat();
847
914
  try {
848
- const reports$1 = await this.project.runCodemods(codemods2, { dry: this.isDry });
849
- this.logger?.raw(reports(reports$1));
915
+ const reports$1 = await this.project.runCodemods(codemods, { dry: this.isDry });
916
+ this.logger?.raw?.(reports(reports$1));
917
+ if (!this.isDry) {
918
+ const nbAffectedTotal = reports$1.flatMap((report) => report.report.ok).reduce((acc, nb) => acc + nb, 0);
919
+ this.logger?.debug?.(
920
+ `Successfully ran ${highlight(codemods.length)} codemod(s), ${highlight(nbAffectedTotal)} change(s) have been detected`
921
+ );
922
+ }
923
+ return successReport$1();
850
924
  } catch (e) {
851
925
  return erroredReport$1(unknownToError(e));
852
926
  }
853
- return successReport$1();
927
+ }
928
+ async runByUID(uid, codemodsDirectory) {
929
+ const repository = this.createRepository(codemodsDirectory);
930
+ if (!repository.has(uid)) {
931
+ throw new Error(`Unknown codemod UID provided: ${uid}`);
932
+ }
933
+ const codemods = repository.find({ uids: [uid] }).flatMap(({ codemods: codemods2 }) => codemods2);
934
+ return this.safeRunAndReport(codemods);
935
+ }
936
+ async run(codemodsDirectory) {
937
+ const repository = this.createRepository(codemodsDirectory);
938
+ const codemodsInRange = repository.find({ range: this.range });
939
+ const selectedCodemods = this.selectCodemodsCallback ? await this.selectCodemodsCallback(codemodsInRange) : codemodsInRange;
940
+ if (selectedCodemods.length === 0) {
941
+ this.logger?.debug?.(`Found no codemods to run for ${versionRange(this.range)}`);
942
+ return successReport$1();
943
+ }
944
+ const codemods = selectedCodemods.flatMap(({ codemods: codemods2 }) => codemods2);
945
+ const codemodsByVersion = fp.groupBy("version", codemods);
946
+ const fRange = versionRange(this.range);
947
+ this.logger?.debug?.(
948
+ `Found ${highlight(codemods.length)} codemods for ${highlight(fp.size(codemodsByVersion))} version(s) using ${fRange}`
949
+ );
950
+ for (const [version$1, codemods2] of Object.entries(codemodsByVersion)) {
951
+ this.logger?.debug?.(`- ${version(semVerFactory(version$1))} (${codemods2.length})`);
952
+ }
953
+ return this.safeRunAndReport(codemods);
854
954
  }
855
955
  }
856
956
  const codemodRunnerFactory = (project, range) => {
@@ -889,7 +989,7 @@ class Upgrader {
889
989
  this.codemodsTarget = semVerFactory(
890
990
  `${this.target.major}.${this.target.minor}.${this.target.patch}`
891
991
  );
892
- this.logger?.debug(
992
+ this.logger?.debug?.(
893
993
  `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${version(
894
994
  this.codemodsTarget
895
995
  )}`
@@ -898,7 +998,7 @@ class Upgrader {
898
998
  }
899
999
  overrideCodemodsTarget(target) {
900
1000
  this.codemodsTarget = target;
901
- this.logger?.debug(
1001
+ this.logger?.debug?.(
902
1002
  `Overriding the codemods target. The codemod runner will now look for ${version(target)}`
903
1003
  );
904
1004
  return this;
@@ -918,40 +1018,40 @@ class Upgrader {
918
1018
  addRequirement(requirement) {
919
1019
  this.requirements.push(requirement);
920
1020
  const fRequired = requirement.isRequired ? "(required)" : "(optional)";
921
- this.logger?.debug(
1021
+ this.logger?.debug?.(
922
1022
  `Added a new requirement to the upgrade: ${highlight(requirement.name)} ${fRequired}`
923
1023
  );
924
1024
  return this;
925
1025
  }
926
1026
  async upgrade() {
927
- this.logger?.info(
1027
+ this.logger?.info?.(
928
1028
  `Upgrading from ${version(this.project.strapiVersion)} to ${version(this.target)}`
929
1029
  );
930
1030
  if (this.isDry) {
931
- this.logger?.warn(
1031
+ this.logger?.warn?.(
932
1032
  "Running the upgrade in dry mode. No files will be modified during the process."
933
1033
  );
934
1034
  }
935
1035
  const range = rangeFromVersions(this.project.strapiVersion, this.target);
936
1036
  const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);
937
1037
  const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];
938
- this.logger?.debug(
1038
+ this.logger?.debug?.(
939
1039
  `Found ${highlight(npmVersionsMatches.length)} versions satisfying ${versionRange(range)}`
940
1040
  );
941
1041
  try {
942
- this.logger?.info(upgradeStep("Checking requirement", [1, 4]));
1042
+ this.logger?.info?.(upgradeStep("Checking requirement", [1, 4]));
943
1043
  await this.checkRequirements(this.requirements, {
944
1044
  npmVersionsMatches,
945
1045
  project: this.project,
946
1046
  target: this.target
947
1047
  });
948
- this.logger?.info(upgradeStep("Applying the latest code modifications", [2, 4]));
1048
+ this.logger?.info?.(upgradeStep("Applying the latest code modifications", [2, 4]));
949
1049
  await this.runCodemods(codemodsRange);
950
- this.logger?.debug("Refreshing project information...");
1050
+ this.logger?.debug?.("Refreshing project information...");
951
1051
  this.project.refresh();
952
- this.logger?.info(upgradeStep("Upgrading Strapi dependencies", [3, 4]));
1052
+ this.logger?.info?.(upgradeStep("Upgrading Strapi dependencies", [3, 4]));
953
1053
  await this.updateDependencies();
954
- this.logger?.info(upgradeStep("Installing dependencies", [4, 4]));
1054
+ this.logger?.info?.(upgradeStep("Installing dependencies", [4, 4]));
955
1055
  await this.installDependencies();
956
1056
  } catch (e) {
957
1057
  return erroredReport(unknownToError(e));
@@ -984,7 +1084,7 @@ class Upgrader {
984
1084
  if (requirement.isRequired) {
985
1085
  throw error;
986
1086
  }
987
- this.logger?.warn(warningMessage);
1087
+ this.logger?.warn?.(warningMessage);
988
1088
  const response = await this.confirmationCallback?.(confirmationMessage);
989
1089
  if (!response) {
990
1090
  throw error;
@@ -995,9 +1095,11 @@ class Upgrader {
995
1095
  const json = createJSONTransformAPI(packageJSON);
996
1096
  const dependencies = json.get("dependencies", {});
997
1097
  const strapiDependencies = this.getScopedStrapiDependencies(dependencies);
998
- this.logger?.debug(`Found ${highlight(strapiDependencies.length)} dependency(ies) to update`);
1098
+ this.logger?.debug?.(
1099
+ `Found ${highlight(strapiDependencies.length)} dependency(ies) to update`
1100
+ );
999
1101
  strapiDependencies.forEach(
1000
- (dependency) => this.logger?.debug(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)
1102
+ (dependency) => this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)
1001
1103
  );
1002
1104
  if (strapiDependencies.length === 0) {
1003
1105
  return;
@@ -1005,7 +1107,7 @@ class Upgrader {
1005
1107
  strapiDependencies.forEach(([name]) => json.set(`dependencies.${name}`, this.target.raw));
1006
1108
  const updatedPackageJSON = json.root();
1007
1109
  if (this.isDry) {
1008
- this.logger?.debug(`Skipping dependencies update (${chalk__default.default.italic("dry mode")})`);
1110
+ this.logger?.debug?.(`Skipping dependencies update (${chalk__default.default.italic("dry mode")})`);
1009
1111
  return;
1010
1112
  }
1011
1113
  await saveJSON(packageJSONPath, updatedPackageJSON);
@@ -1025,9 +1127,9 @@ class Upgrader {
1025
1127
  async installDependencies() {
1026
1128
  const projectPath = this.project.cwd;
1027
1129
  const packageManagerName = await utils.packageManager.getPreferred(projectPath);
1028
- this.logger?.debug(`Using ${highlight(packageManagerName)} as package manager`);
1130
+ this.logger?.debug?.(`Using ${highlight(packageManagerName)} as package manager`);
1029
1131
  if (this.isDry) {
1030
- this.logger?.debug(`Skipping dependencies installation (${chalk__default.default.italic("dry mode")}`);
1132
+ this.logger?.debug?.(`Skipping dependencies installation (${chalk__default.default.italic("dry mode")}`);
1031
1133
  return;
1032
1134
  }
1033
1135
  await utils.packageManager.installDependencies(projectPath, packageManagerName, {
@@ -1126,7 +1228,7 @@ const upgrade = async (options) => {
1126
1228
  const { logger, codemodsTarget } = options;
1127
1229
  const cwd = path__default.default.resolve(options.cwd ?? process.cwd());
1128
1230
  const project = projectFactory(cwd);
1129
- if (!isAppProject(project)) {
1231
+ if (!isApplicationProject(project)) {
1130
1232
  throw new Error(
1131
1233
  `The "${options.target}" upgrade can only be run on a Strapi project; for plugins, please use "codemods".`
1132
1234
  );
@@ -1148,20 +1250,7 @@ const upgrade = async (options) => {
1148
1250
  timer.stop();
1149
1251
  logger.info(`Completed in ${durationMs(timer.elapsedMs)}`);
1150
1252
  };
1151
- const codemods = async (options) => {
1152
- const timer = timerFactory();
1153
- const { logger } = options;
1154
- const cwd = path__default.default.resolve(options.cwd ?? process.cwd());
1155
- const project = projectFactory(cwd);
1156
- const range = isAppProject(project) ? getRangeFromTarget(project.strapiVersion, options.target) : void 0;
1157
- const codemodRunner = codemodRunnerFactory(project, range).dry(options.dry ?? false).onSelectCodemods(options.selectCodemods ?? null).setLogger(logger);
1158
- const executionReport = await codemodRunner.run();
1159
- if (!executionReport.success) {
1160
- throw executionReport.error;
1161
- }
1162
- timer.stop();
1163
- logger.info(`Completed in ${timer.elapsedMs}`);
1164
- };
1253
+ const resolvePath = (cwd) => path__default.default.resolve(cwd ?? process.cwd());
1165
1254
  const getRangeFromTarget = (currentVersion, target) => {
1166
1255
  if (isSemverInstance(target)) {
1167
1256
  return rangeFactory(target);
@@ -1178,9 +1267,60 @@ const getRangeFromTarget = (currentVersion, target) => {
1178
1267
  throw new Error(`Invalid target set: ${target}`);
1179
1268
  }
1180
1269
  };
1270
+ const findRangeFromTarget = (project, target) => {
1271
+ if (isRangeInstance(target)) {
1272
+ return target;
1273
+ }
1274
+ if (isApplicationProject(project)) {
1275
+ return getRangeFromTarget(project.strapiVersion, target);
1276
+ }
1277
+ return rangeFactory("*");
1278
+ };
1279
+ const runCodemods = async (options) => {
1280
+ const timer = timerFactory();
1281
+ const { logger, uid } = options;
1282
+ const cwd = resolvePath(options.cwd);
1283
+ const project = projectFactory(cwd);
1284
+ const range = findRangeFromTarget(project, options.target);
1285
+ logger.debug(`Project: ${projectType(project.type)} found in ${path(cwd)}`);
1286
+ logger.debug(`Range: set to ${versionRange(range)}`);
1287
+ const codemodRunner = codemodRunnerFactory(project, range).dry(options.dry ?? false).onSelectCodemods(options.selectCodemods ?? null).setLogger(logger);
1288
+ let report;
1289
+ if (uid !== void 0) {
1290
+ logger.debug(`Running a single codemod: ${codemodUID(uid)}`);
1291
+ report = await codemodRunner.runByUID(uid);
1292
+ } else {
1293
+ report = await codemodRunner.run();
1294
+ }
1295
+ if (!report.success) {
1296
+ throw report.error;
1297
+ }
1298
+ timer.stop();
1299
+ logger.info(`Completed in ${timer.elapsedMs}`);
1300
+ };
1301
+ const listCodemods = async (options) => {
1302
+ const { logger, target } = options;
1303
+ const cwd = resolvePath(options.cwd);
1304
+ const project = projectFactory(cwd);
1305
+ const range = findRangeFromTarget(project, target);
1306
+ logger.debug(`Project: ${projectType(project.type)} found in ${path(cwd)}`);
1307
+ logger.debug(`Range: set to ${versionRange(range)}`);
1308
+ const repo = codemodRepositoryFactory();
1309
+ repo.refresh();
1310
+ const groups = repo.find({ range });
1311
+ const codemods = groups.flatMap((collection) => collection.codemods);
1312
+ logger.debug(`Found ${highlight(codemods.length)} codemods`);
1313
+ if (codemods.length === 0) {
1314
+ logger.info(`Found no codemods matching ${versionRange(range)}`);
1315
+ return;
1316
+ }
1317
+ const fCodemods = codemodList(codemods);
1318
+ logger.raw(fCodemods);
1319
+ };
1181
1320
  const index$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1182
1321
  __proto__: null,
1183
- codemods,
1322
+ listCodemods,
1323
+ runCodemods,
1184
1324
  upgrade
1185
1325
  }, Symbol.toStringTag, { value: "Module" }));
1186
1326
  class Logger {