@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.
- package/LICENSE +19 -4
- package/dist/cli.js +1456 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.js +234 -94
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +235 -95
- package/dist/index.mjs.map +1 -1
- package/dist/modules/codemod/codemod.d.ts +4 -2
- package/dist/modules/codemod/codemod.d.ts.map +1 -1
- package/dist/modules/codemod/types.d.ts +8 -1
- package/dist/modules/codemod/types.d.ts.map +1 -1
- package/dist/modules/codemod-repository/constants.d.ts.map +1 -1
- package/dist/modules/codemod-repository/repository.d.ts +5 -5
- package/dist/modules/codemod-repository/repository.d.ts.map +1 -1
- package/dist/modules/codemod-repository/types.d.ts +7 -3
- package/dist/modules/codemod-repository/types.d.ts.map +1 -1
- package/dist/modules/codemod-runner/codemod-runner.d.ts +6 -3
- package/dist/modules/codemod-runner/codemod-runner.d.ts.map +1 -1
- package/dist/modules/codemod-runner/index.d.ts +1 -0
- package/dist/modules/codemod-runner/index.d.ts.map +1 -1
- package/dist/modules/codemod-runner/types.d.ts +1 -0
- package/dist/modules/codemod-runner/types.d.ts.map +1 -1
- package/dist/modules/format/formats.d.ts +5 -0
- package/dist/modules/format/formats.d.ts.map +1 -1
- package/dist/modules/project/constants.d.ts.map +1 -1
- package/dist/modules/project/project.d.ts +1 -1
- package/dist/modules/project/project.d.ts.map +1 -1
- package/dist/modules/project/types.d.ts +1 -0
- package/dist/modules/project/types.d.ts.map +1 -1
- package/dist/modules/project/utils.d.ts +1 -1
- package/dist/modules/project/utils.d.ts.map +1 -1
- package/dist/modules/report/report.d.ts.map +1 -1
- package/dist/modules/runner/json/transform.d.ts.map +1 -1
- package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
- package/dist/modules/version/range.d.ts +2 -0
- package/dist/modules/version/range.d.ts.map +1 -1
- package/dist/tasks/codemods/index.d.ts +2 -1
- package/dist/tasks/codemods/index.d.ts.map +1 -1
- package/dist/tasks/codemods/list-codemods.d.ts +3 -0
- package/dist/tasks/codemods/list-codemods.d.ts.map +1 -0
- package/dist/tasks/codemods/run-codemods.d.ts +3 -0
- package/dist/tasks/codemods/run-codemods.d.ts.map +1 -0
- package/dist/tasks/codemods/types.d.ts +9 -3
- package/dist/tasks/codemods/types.d.ts.map +1 -1
- package/dist/tasks/codemods/utils.d.ts +6 -0
- package/dist/tasks/codemods/utils.d.ts.map +1 -0
- package/dist/tasks/index.d.ts +1 -1
- package/dist/tasks/index.d.ts.map +1 -1
- package/package.json +9 -8
- package/resources/codemods/5.0.0/change-useAPIErrorHandler-import.code.ts +21 -0
- package/resources/codemods/5.0.0/comment-out-lifecycle-files.code.ts +63 -0
- package/resources/codemods/5.0.0/dependency-upgrade-react-and-react-dom.json.ts +67 -0
- package/resources/codemods/5.0.0/dependency-upgrade-styled-components.json.ts +49 -0
- package/resources/codemods/5.0.0/entity-service-document-service.code.ts +437 -0
- package/resources/codemods/5.0.0/strapi-public-interface.code.ts +126 -0
- package/resources/codemods/5.0.0/useRBAC-hook-import-change.code.ts +21 -0
- package/resources/codemods/5.0.0/utils-public-interface.code.ts +320 -0
- package/resources/utils/change-import.ts +96 -0
- package/dist/_chunks/codemod-runner-mXNzVpHm.js +0 -798
- package/dist/_chunks/codemod-runner-mXNzVpHm.js.map +0 -1
- package/dist/_chunks/codemods-S4mNX9Qg.js +0 -105
- package/dist/_chunks/codemods-S4mNX9Qg.js.map +0 -1
- package/dist/_chunks/index-Pt-TU9MN.js +0 -103
- package/dist/_chunks/index-Pt-TU9MN.js.map +0 -1
- package/dist/_chunks/upgrade-aWNYibWB.js +0 -361
- package/dist/_chunks/upgrade-aWNYibWB.js.map +0 -1
- package/dist/tasks/codemods/codemods.d.ts +0 -3
- 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 = {
|
|
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(
|
|
441
|
+
async runCodemods(codemods, options) {
|
|
432
442
|
const runners = this.createProjectCodemodsRunners(options.dry);
|
|
433
443
|
const reports2 = [];
|
|
434
|
-
for (const codemod of
|
|
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 = "
|
|
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
|
|
587
|
+
const isApplicationProject = (project) => {
|
|
578
588
|
return project instanceof AppProject;
|
|
579
589
|
};
|
|
580
590
|
function assertAppProject(project) {
|
|
581
|
-
if (!
|
|
582
|
-
throw new Error("Project is not an
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
693
|
-
|
|
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
|
-
|
|
721
|
-
return this.findByRange(range).length;
|
|
722
|
-
}
|
|
723
|
-
exists(version2) {
|
|
792
|
+
versionExists(version2) {
|
|
724
793
|
return version2.raw in this.groups;
|
|
725
794
|
}
|
|
726
|
-
|
|
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(
|
|
805
|
+
return entries.filter(maybeFilterByRange).map(([version2, codemods]) => ({
|
|
729
806
|
version: semVerFactory(version2),
|
|
730
|
-
|
|
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
|
|
736
|
-
return
|
|
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,
|
|
830
|
+
return entries.map(([version2, codemods]) => ({
|
|
741
831
|
version: semVerFactory(version2),
|
|
742
|
-
codemods
|
|
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) =>
|
|
775
|
-
|
|
776
|
-
|
|
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
|
-
|
|
901
|
+
createRepository(codemodsDirectory) {
|
|
821
902
|
const repository = codemodRepositoryFactory(
|
|
822
903
|
codemodsDirectory ?? INTERNAL_CODEMODS_DIRECTORY
|
|
823
904
|
);
|
|
824
905
|
repository.refresh();
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
if (
|
|
829
|
-
|
|
830
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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 (!
|
|
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
|
|
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
|
-
|
|
1322
|
+
listCodemods,
|
|
1323
|
+
runCodemods,
|
|
1184
1324
|
upgrade
|
|
1185
1325
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1186
1326
|
class Logger {
|