@strapi/upgrade 5.0.5 → 5.1.0
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 +382 -293
- package/dist/cli.js.map +1 -1
- package/dist/index.js +392 -308
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +389 -305
- package/dist/index.mjs.map +1 -1
- package/dist/modules/error/utils.d.ts +8 -0
- package/dist/modules/error/utils.d.ts.map +1 -1
- package/dist/modules/upgrader/types.d.ts +6 -0
- package/dist/modules/upgrader/types.d.ts.map +1 -1
- package/dist/modules/upgrader/upgrader.d.ts +4 -0
- package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
- package/dist/modules/version/range.d.ts.map +1 -1
- package/dist/modules/version/types.d.ts +2 -1
- package/dist/modules/version/types.d.ts.map +1 -1
- package/dist/tasks/codemods/utils.d.ts.map +1 -1
- package/dist/tasks/upgrade/prompts/index.d.ts +2 -0
- package/dist/tasks/upgrade/prompts/index.d.ts.map +1 -0
- package/dist/tasks/upgrade/prompts/latest.d.ts +9 -0
- package/dist/tasks/upgrade/prompts/latest.d.ts.map +1 -0
- package/dist/tasks/upgrade/requirements/major.d.ts.map +1 -1
- package/dist/tasks/upgrade/upgrade.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -1,139 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const path$1 = require("node:path");
|
|
4
|
-
const
|
|
4
|
+
const CliTable3 = require("cli-table3");
|
|
5
5
|
const chalk = require("chalk");
|
|
6
|
+
const assert = require("node:assert");
|
|
6
7
|
const semver = require("semver");
|
|
7
|
-
const utils = require("@strapi/utils");
|
|
8
|
-
const fp = require("lodash/fp");
|
|
9
8
|
const fse = require("fs-extra");
|
|
10
|
-
const assert = require("node:assert");
|
|
11
9
|
const fastglob = require("fast-glob");
|
|
12
10
|
const Runner = require("jscodeshift/src/Runner");
|
|
11
|
+
const fp = require("lodash/fp");
|
|
13
12
|
const node = require("esbuild-register/dist/node");
|
|
14
|
-
const
|
|
13
|
+
const utils = require("@strapi/utils");
|
|
14
|
+
const simpleGit = require("simple-git");
|
|
15
15
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
16
16
|
const path__default = /* @__PURE__ */ _interopDefault(path$1);
|
|
17
|
-
const
|
|
17
|
+
const CliTable3__default = /* @__PURE__ */ _interopDefault(CliTable3);
|
|
18
18
|
const chalk__default = /* @__PURE__ */ _interopDefault(chalk);
|
|
19
|
+
const assert__default = /* @__PURE__ */ _interopDefault(assert);
|
|
19
20
|
const semver__default = /* @__PURE__ */ _interopDefault(semver);
|
|
20
21
|
const fse__default = /* @__PURE__ */ _interopDefault(fse);
|
|
21
|
-
const assert__default = /* @__PURE__ */ _interopDefault(assert);
|
|
22
22
|
const fastglob__default = /* @__PURE__ */ _interopDefault(fastglob);
|
|
23
|
-
const
|
|
24
|
-
class Requirement {
|
|
25
|
-
isRequired;
|
|
26
|
-
name;
|
|
27
|
-
testCallback;
|
|
28
|
-
children;
|
|
29
|
-
constructor(name, testCallback, isRequired) {
|
|
30
|
-
this.name = name;
|
|
31
|
-
this.testCallback = testCallback;
|
|
32
|
-
this.isRequired = isRequired ?? true;
|
|
33
|
-
this.children = [];
|
|
34
|
-
}
|
|
35
|
-
setChildren(children) {
|
|
36
|
-
this.children = children;
|
|
37
|
-
return this;
|
|
38
|
-
}
|
|
39
|
-
addChild(child) {
|
|
40
|
-
this.children.push(child);
|
|
41
|
-
return this;
|
|
42
|
-
}
|
|
43
|
-
asOptional() {
|
|
44
|
-
const newInstance = requirementFactory(this.name, this.testCallback, false);
|
|
45
|
-
newInstance.setChildren(this.children);
|
|
46
|
-
return newInstance;
|
|
47
|
-
}
|
|
48
|
-
asRequired() {
|
|
49
|
-
const newInstance = requirementFactory(this.name, this.testCallback, true);
|
|
50
|
-
newInstance.setChildren(this.children);
|
|
51
|
-
return newInstance;
|
|
52
|
-
}
|
|
53
|
-
async test(context) {
|
|
54
|
-
try {
|
|
55
|
-
await this.testCallback?.(context);
|
|
56
|
-
return ok();
|
|
57
|
-
} catch (e) {
|
|
58
|
-
if (e instanceof Error) {
|
|
59
|
-
return errored(e);
|
|
60
|
-
}
|
|
61
|
-
if (typeof e === "string") {
|
|
62
|
-
return errored(new Error(e));
|
|
63
|
-
}
|
|
64
|
-
return errored(new Error("Unknown error"));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const ok = () => ({ pass: true, error: null });
|
|
69
|
-
const errored = (error) => ({ pass: false, error });
|
|
70
|
-
const requirementFactory = (name, testCallback, isRequired) => new Requirement(name, testCallback, isRequired);
|
|
71
|
-
const index$g = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
72
|
-
__proto__: null,
|
|
73
|
-
requirementFactory
|
|
74
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
75
|
-
const REQUIRE_AVAILABLE_NEXT_MAJOR = requirementFactory(
|
|
76
|
-
"REQUIRE_AVAILABLE_NEXT_MAJOR",
|
|
77
|
-
(context) => {
|
|
78
|
-
const { project, target } = context;
|
|
79
|
-
const currentMajor = project.strapiVersion.major;
|
|
80
|
-
const targetedMajor = target.major;
|
|
81
|
-
if (targetedMajor === currentMajor) {
|
|
82
|
-
throw new Error(`You're already on the latest major version (v${currentMajor})`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
);
|
|
86
|
-
const REQUIRE_LATEST_FOR_CURRENT_MAJOR = requirementFactory(
|
|
87
|
-
"REQUIRE_LATEST_FOR_CURRENT_MAJOR",
|
|
88
|
-
(context) => {
|
|
89
|
-
const { project, target, npmVersionsMatches } = context;
|
|
90
|
-
if (npmVersionsMatches.length !== 1) {
|
|
91
|
-
const invalidVersions = npmVersionsMatches.slice(0, -1);
|
|
92
|
-
const invalidVersionsAsSemVer = invalidVersions.map((v) => v.version);
|
|
93
|
-
const nbInvalidVersions = npmVersionsMatches.length;
|
|
94
|
-
const currentMajor = project.strapiVersion.major;
|
|
95
|
-
throw new Error(
|
|
96
|
-
`Doing a major upgrade requires to be on the latest v${currentMajor} version, but found ${nbInvalidVersions} versions between the current one and ${target}: ${invalidVersionsAsSemVer}`
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
);
|
|
101
|
-
const REQUIRE_GIT_CLEAN_REPOSITORY = requirementFactory(
|
|
102
|
-
"REQUIRE_GIT_CLEAN_REPOSITORY",
|
|
103
|
-
async (context) => {
|
|
104
|
-
const git = simpleGit__default.default({ baseDir: context.project.cwd });
|
|
105
|
-
const status = await git.status();
|
|
106
|
-
if (!status.isClean()) {
|
|
107
|
-
throw new Error(
|
|
108
|
-
"Repository is not clean. Please commit or stash any changes before upgrading"
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
);
|
|
113
|
-
const REQUIRE_GIT_REPOSITORY = requirementFactory(
|
|
114
|
-
"REQUIRE_GIT_REPOSITORY",
|
|
115
|
-
async (context) => {
|
|
116
|
-
const git = simpleGit__default.default({ baseDir: context.project.cwd });
|
|
117
|
-
const isRepo = await git.checkIsRepo();
|
|
118
|
-
if (!isRepo) {
|
|
119
|
-
throw new Error("Not a git repository (or any of the parent directories)");
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
).addChild(REQUIRE_GIT_CLEAN_REPOSITORY.asOptional());
|
|
123
|
-
const REQUIRE_GIT_INSTALLED = requirementFactory(
|
|
124
|
-
"REQUIRE_GIT_INSTALLED",
|
|
125
|
-
async (context) => {
|
|
126
|
-
const git = simpleGit__default.default({ baseDir: context.project.cwd });
|
|
127
|
-
try {
|
|
128
|
-
await git.version();
|
|
129
|
-
} catch {
|
|
130
|
-
throw new Error("Git is not installed");
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
).addChild(REQUIRE_GIT_REPOSITORY.asOptional());
|
|
134
|
-
const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
|
|
135
|
-
REQUIRE_GIT_INSTALLED.asOptional()
|
|
136
|
-
);
|
|
23
|
+
const simpleGit__default = /* @__PURE__ */ _interopDefault(simpleGit);
|
|
137
24
|
class Timer {
|
|
138
25
|
interval;
|
|
139
26
|
constructor() {
|
|
@@ -164,55 +51,101 @@ const constants$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
164
51
|
__proto__: null,
|
|
165
52
|
ONE_SECOND_MS
|
|
166
53
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
167
|
-
const index$
|
|
54
|
+
const index$g = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
168
55
|
__proto__: null,
|
|
169
56
|
constants: constants$4,
|
|
170
57
|
timerFactory
|
|
171
58
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
this.json = fp.cloneDeep(json);
|
|
176
|
-
}
|
|
177
|
-
get(path2, defaultValue) {
|
|
178
|
-
if (!path2) {
|
|
179
|
-
return this.root();
|
|
180
|
-
}
|
|
181
|
-
return fp.cloneDeep(fp.get(path2, this.json) ?? defaultValue);
|
|
182
|
-
}
|
|
183
|
-
has(path2) {
|
|
184
|
-
return fp.has(path2, this.json);
|
|
185
|
-
}
|
|
186
|
-
merge(other) {
|
|
187
|
-
this.json = fp.merge(other, this.json);
|
|
188
|
-
return this;
|
|
189
|
-
}
|
|
190
|
-
root() {
|
|
191
|
-
return fp.cloneDeep(this.json);
|
|
192
|
-
}
|
|
193
|
-
set(path2, value) {
|
|
194
|
-
this.json = fp.set(path2, value, this.json);
|
|
195
|
-
return this;
|
|
196
|
-
}
|
|
197
|
-
remove(path2) {
|
|
198
|
-
this.json = fp.omit(path2, this.json);
|
|
199
|
-
return this;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
const createJSONTransformAPI = (object) => new JSONTransformAPI(object);
|
|
203
|
-
const readJSON = async (path2) => {
|
|
204
|
-
const buffer = await fse__default.default.readFile(path2);
|
|
205
|
-
return JSON.parse(buffer.toString());
|
|
59
|
+
const path = (path2) => chalk__default.default.blue(path2);
|
|
60
|
+
const version = (version2) => {
|
|
61
|
+
return chalk__default.default.italic.yellow(`v${version2}`);
|
|
206
62
|
};
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
63
|
+
const codemodUID = (uid) => {
|
|
64
|
+
return chalk__default.default.bold.cyan(uid);
|
|
65
|
+
};
|
|
66
|
+
const projectDetails = (project) => {
|
|
67
|
+
return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;
|
|
68
|
+
};
|
|
69
|
+
const projectType = (type) => chalk__default.default.cyan(type);
|
|
70
|
+
const versionRange = (range) => chalk__default.default.italic.yellow(range.raw);
|
|
71
|
+
const transform = (transformFilePath) => chalk__default.default.cyan(transformFilePath);
|
|
72
|
+
const highlight = (arg) => chalk__default.default.bold.underline(arg);
|
|
73
|
+
const upgradeStep = (text, step) => {
|
|
74
|
+
return chalk__default.default.bold(`(${step[0]}/${step[1]}) ${text}...`);
|
|
75
|
+
};
|
|
76
|
+
const reports = (reports2) => {
|
|
77
|
+
const rows = reports2.map(({ codemod, report }, i) => {
|
|
78
|
+
const fIndex = chalk__default.default.grey(i);
|
|
79
|
+
const fVersion = chalk__default.default.magenta(codemod.version);
|
|
80
|
+
const fKind = chalk__default.default.yellow(codemod.kind);
|
|
81
|
+
const fFormattedTransformPath = chalk__default.default.cyan(codemod.format());
|
|
82
|
+
const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${chalk__default.default.dim.italic("(cold start)")}` : `${report.timeElapsed}s`;
|
|
83
|
+
const fAffected = report.ok > 0 ? chalk__default.default.green(report.ok) : chalk__default.default.grey(0);
|
|
84
|
+
const fUnchanged = report.ok === 0 ? chalk__default.default.red(report.nochange) : chalk__default.default.grey(report.nochange);
|
|
85
|
+
return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];
|
|
86
|
+
});
|
|
87
|
+
const table = new CliTable3__default.default({
|
|
88
|
+
style: { compact: true },
|
|
89
|
+
head: [
|
|
90
|
+
chalk__default.default.bold.grey("N°"),
|
|
91
|
+
chalk__default.default.bold.magenta("Version"),
|
|
92
|
+
chalk__default.default.bold.yellow("Kind"),
|
|
93
|
+
chalk__default.default.bold.cyan("Name"),
|
|
94
|
+
chalk__default.default.bold.green("Affected"),
|
|
95
|
+
chalk__default.default.bold.red("Unchanged"),
|
|
96
|
+
chalk__default.default.bold.blue("Duration")
|
|
97
|
+
]
|
|
98
|
+
});
|
|
99
|
+
table.push(...rows);
|
|
100
|
+
return table.toString();
|
|
211
101
|
};
|
|
102
|
+
const codemodList = (codemods) => {
|
|
103
|
+
const rows = codemods.map((codemod, index2) => {
|
|
104
|
+
const fIndex = chalk__default.default.grey(index2);
|
|
105
|
+
const fVersion = chalk__default.default.magenta(codemod.version);
|
|
106
|
+
const fKind = chalk__default.default.yellow(codemod.kind);
|
|
107
|
+
const fName = chalk__default.default.blue(codemod.format());
|
|
108
|
+
const fUID = codemodUID(codemod.uid);
|
|
109
|
+
return [fIndex, fVersion, fKind, fName, fUID];
|
|
110
|
+
});
|
|
111
|
+
const table = new CliTable3__default.default({
|
|
112
|
+
style: { compact: true },
|
|
113
|
+
head: [
|
|
114
|
+
chalk__default.default.bold.grey("N°"),
|
|
115
|
+
chalk__default.default.bold.magenta("Version"),
|
|
116
|
+
chalk__default.default.bold.yellow("Kind"),
|
|
117
|
+
chalk__default.default.bold.blue("Name"),
|
|
118
|
+
chalk__default.default.bold.cyan("UID")
|
|
119
|
+
]
|
|
120
|
+
});
|
|
121
|
+
table.push(...rows);
|
|
122
|
+
return table.toString();
|
|
123
|
+
};
|
|
124
|
+
const durationMs = (elapsedMs) => {
|
|
125
|
+
const elapsedSeconds = (elapsedMs / ONE_SECOND_MS).toFixed(3);
|
|
126
|
+
return `${elapsedSeconds}s`;
|
|
127
|
+
};
|
|
128
|
+
const index$f = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
129
|
+
__proto__: null,
|
|
130
|
+
codemodList,
|
|
131
|
+
codemodUID,
|
|
132
|
+
durationMs,
|
|
133
|
+
highlight,
|
|
134
|
+
path,
|
|
135
|
+
projectDetails,
|
|
136
|
+
projectType,
|
|
137
|
+
reports,
|
|
138
|
+
transform,
|
|
139
|
+
upgradeStep,
|
|
140
|
+
version,
|
|
141
|
+
versionRange
|
|
142
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
143
|
+
const NPM_REGISTRY_URL = "https://registry.npmjs.org";
|
|
212
144
|
var ReleaseType = /* @__PURE__ */ ((ReleaseType2) => {
|
|
213
145
|
ReleaseType2["Major"] = "major";
|
|
214
146
|
ReleaseType2["Minor"] = "minor";
|
|
215
147
|
ReleaseType2["Patch"] = "patch";
|
|
148
|
+
ReleaseType2["Latest"] = "latest";
|
|
216
149
|
return ReleaseType2;
|
|
217
150
|
})(ReleaseType || {});
|
|
218
151
|
const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -238,17 +171,20 @@ const rangeFactory = (range) => {
|
|
|
238
171
|
};
|
|
239
172
|
const rangeFromReleaseType = (current, identifier) => {
|
|
240
173
|
switch (identifier) {
|
|
241
|
-
case ReleaseType.
|
|
242
|
-
|
|
243
|
-
return rangeFactory(`>${current.raw} <=${nextMajor}`);
|
|
174
|
+
case ReleaseType.Latest: {
|
|
175
|
+
return rangeFactory(`>${current.raw}`);
|
|
244
176
|
}
|
|
245
|
-
case ReleaseType.
|
|
246
|
-
const
|
|
247
|
-
return rangeFactory(`>${current.raw}
|
|
177
|
+
case ReleaseType.Major: {
|
|
178
|
+
const nextMajor = semVerFactory(current.raw).inc("major");
|
|
179
|
+
return rangeFactory(`>${current.raw} <=${nextMajor.major}`);
|
|
248
180
|
}
|
|
249
181
|
case ReleaseType.Minor: {
|
|
250
|
-
const
|
|
251
|
-
return rangeFactory(`>${current.raw} <${
|
|
182
|
+
const nextMajor = semVerFactory(current.raw).inc("major");
|
|
183
|
+
return rangeFactory(`>${current.raw} <${nextMajor.raw}`);
|
|
184
|
+
}
|
|
185
|
+
case ReleaseType.Patch: {
|
|
186
|
+
const nextMinor = semVerFactory(current.raw).inc("minor");
|
|
187
|
+
return rangeFactory(`>${current.raw} <${nextMinor.raw}`);
|
|
252
188
|
}
|
|
253
189
|
default: {
|
|
254
190
|
throw new Error("Not implemented");
|
|
@@ -282,6 +218,48 @@ const index$e = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
282
218
|
rangeFromVersions,
|
|
283
219
|
semVerFactory
|
|
284
220
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
221
|
+
class Package {
|
|
222
|
+
name;
|
|
223
|
+
packageURL;
|
|
224
|
+
npmPackage;
|
|
225
|
+
constructor(name) {
|
|
226
|
+
this.name = name;
|
|
227
|
+
this.packageURL = `${NPM_REGISTRY_URL}/${name}`;
|
|
228
|
+
this.npmPackage = null;
|
|
229
|
+
}
|
|
230
|
+
get isLoaded() {
|
|
231
|
+
return this.npmPackage !== null;
|
|
232
|
+
}
|
|
233
|
+
assertPackageIsLoaded(npmPackage) {
|
|
234
|
+
assert__default.default(this.isLoaded, "The package is not loaded yet");
|
|
235
|
+
}
|
|
236
|
+
getVersionsDict() {
|
|
237
|
+
this.assertPackageIsLoaded(this.npmPackage);
|
|
238
|
+
return this.npmPackage.versions;
|
|
239
|
+
}
|
|
240
|
+
getVersionsAsList() {
|
|
241
|
+
this.assertPackageIsLoaded(this.npmPackage);
|
|
242
|
+
return Object.values(this.npmPackage.versions);
|
|
243
|
+
}
|
|
244
|
+
findVersionsInRange(range) {
|
|
245
|
+
const versions = this.getVersionsAsList();
|
|
246
|
+
return versions.filter((v) => range.test(v.version)).filter((v) => isLiteralSemVer(v.version)).sort((v1, v2) => semver__default.default.compare(v1.version, v2.version));
|
|
247
|
+
}
|
|
248
|
+
findVersion(version2) {
|
|
249
|
+
const versions = this.getVersionsAsList();
|
|
250
|
+
return versions.find((npmVersion) => semver__default.default.eq(npmVersion.version, version2));
|
|
251
|
+
}
|
|
252
|
+
async refresh() {
|
|
253
|
+
const response = await fetch(this.packageURL);
|
|
254
|
+
assert__default.default(response.ok, `Request failed for ${this.packageURL}`);
|
|
255
|
+
this.npmPackage = await response.json();
|
|
256
|
+
return this;
|
|
257
|
+
}
|
|
258
|
+
versionExists(version2) {
|
|
259
|
+
return this.findVersion(version2) !== void 0;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const npmPackageFactory = (name) => new Package(name);
|
|
285
263
|
class FileScanner {
|
|
286
264
|
cwd;
|
|
287
265
|
constructor(cwd) {
|
|
@@ -328,6 +306,46 @@ const index$c = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
328
306
|
__proto__: null,
|
|
329
307
|
codeRunnerFactory
|
|
330
308
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
309
|
+
class JSONTransformAPI {
|
|
310
|
+
json;
|
|
311
|
+
constructor(json) {
|
|
312
|
+
this.json = fp.cloneDeep(json);
|
|
313
|
+
}
|
|
314
|
+
get(path2, defaultValue) {
|
|
315
|
+
if (!path2) {
|
|
316
|
+
return this.root();
|
|
317
|
+
}
|
|
318
|
+
return fp.cloneDeep(fp.get(path2, this.json) ?? defaultValue);
|
|
319
|
+
}
|
|
320
|
+
has(path2) {
|
|
321
|
+
return fp.has(path2, this.json);
|
|
322
|
+
}
|
|
323
|
+
merge(other) {
|
|
324
|
+
this.json = fp.merge(other, this.json);
|
|
325
|
+
return this;
|
|
326
|
+
}
|
|
327
|
+
root() {
|
|
328
|
+
return fp.cloneDeep(this.json);
|
|
329
|
+
}
|
|
330
|
+
set(path2, value) {
|
|
331
|
+
this.json = fp.set(path2, value, this.json);
|
|
332
|
+
return this;
|
|
333
|
+
}
|
|
334
|
+
remove(path2) {
|
|
335
|
+
this.json = fp.omit(path2, this.json);
|
|
336
|
+
return this;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const createJSONTransformAPI = (object) => new JSONTransformAPI(object);
|
|
340
|
+
const readJSON = async (path2) => {
|
|
341
|
+
const buffer = await fse__default.default.readFile(path2);
|
|
342
|
+
return JSON.parse(buffer.toString());
|
|
343
|
+
};
|
|
344
|
+
const saveJSON = async (path2, json) => {
|
|
345
|
+
const jsonAsString = `${JSON.stringify(json, null, 2)}
|
|
346
|
+
`;
|
|
347
|
+
await fse__default.default.writeFile(path2, jsonAsString);
|
|
348
|
+
};
|
|
331
349
|
const transformJSON = async (codemodPath, paths, config) => {
|
|
332
350
|
const { dry } = config;
|
|
333
351
|
const startTime = process.hrtime();
|
|
@@ -636,6 +654,18 @@ class UnexpectedError extends Error {
|
|
|
636
654
|
super("Unexpected Error");
|
|
637
655
|
}
|
|
638
656
|
}
|
|
657
|
+
class NPMCandidateNotFoundError extends Error {
|
|
658
|
+
target;
|
|
659
|
+
constructor(target, message = `Couldn't find a valid NPM candidate for "${target}"`) {
|
|
660
|
+
super(message);
|
|
661
|
+
this.target = target;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
class AbortedError extends Error {
|
|
665
|
+
constructor(message = "Upgrade aborted") {
|
|
666
|
+
super(message);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
639
669
|
const unknownToError = (e) => {
|
|
640
670
|
if (e instanceof Error) {
|
|
641
671
|
return e;
|
|
@@ -647,93 +677,11 @@ const unknownToError = (e) => {
|
|
|
647
677
|
};
|
|
648
678
|
const index$9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
649
679
|
__proto__: null,
|
|
680
|
+
AbortedError,
|
|
681
|
+
NPMCandidateNotFoundError,
|
|
650
682
|
UnexpectedError,
|
|
651
683
|
unknownToError
|
|
652
684
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
653
|
-
const path = (path2) => chalk__default.default.blue(path2);
|
|
654
|
-
const version = (version2) => {
|
|
655
|
-
return chalk__default.default.italic.yellow(`v${version2}`);
|
|
656
|
-
};
|
|
657
|
-
const codemodUID = (uid) => {
|
|
658
|
-
return chalk__default.default.bold.cyan(uid);
|
|
659
|
-
};
|
|
660
|
-
const projectDetails = (project) => {
|
|
661
|
-
return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;
|
|
662
|
-
};
|
|
663
|
-
const projectType = (type) => chalk__default.default.cyan(type);
|
|
664
|
-
const versionRange = (range) => chalk__default.default.italic.yellow(range.raw);
|
|
665
|
-
const transform = (transformFilePath) => chalk__default.default.cyan(transformFilePath);
|
|
666
|
-
const highlight = (arg) => chalk__default.default.bold.underline(arg);
|
|
667
|
-
const upgradeStep = (text, step) => {
|
|
668
|
-
return chalk__default.default.bold(`(${step[0]}/${step[1]}) ${text}...`);
|
|
669
|
-
};
|
|
670
|
-
const reports = (reports2) => {
|
|
671
|
-
const rows = reports2.map(({ codemod, report }, i) => {
|
|
672
|
-
const fIndex = chalk__default.default.grey(i);
|
|
673
|
-
const fVersion = chalk__default.default.magenta(codemod.version);
|
|
674
|
-
const fKind = chalk__default.default.yellow(codemod.kind);
|
|
675
|
-
const fFormattedTransformPath = chalk__default.default.cyan(codemod.format());
|
|
676
|
-
const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${chalk__default.default.dim.italic("(cold start)")}` : `${report.timeElapsed}s`;
|
|
677
|
-
const fAffected = report.ok > 0 ? chalk__default.default.green(report.ok) : chalk__default.default.grey(0);
|
|
678
|
-
const fUnchanged = report.ok === 0 ? chalk__default.default.red(report.nochange) : chalk__default.default.grey(report.nochange);
|
|
679
|
-
return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];
|
|
680
|
-
});
|
|
681
|
-
const table = new CliTable3__default.default({
|
|
682
|
-
style: { compact: true },
|
|
683
|
-
head: [
|
|
684
|
-
chalk__default.default.bold.grey("N°"),
|
|
685
|
-
chalk__default.default.bold.magenta("Version"),
|
|
686
|
-
chalk__default.default.bold.yellow("Kind"),
|
|
687
|
-
chalk__default.default.bold.cyan("Name"),
|
|
688
|
-
chalk__default.default.bold.green("Affected"),
|
|
689
|
-
chalk__default.default.bold.red("Unchanged"),
|
|
690
|
-
chalk__default.default.bold.blue("Duration")
|
|
691
|
-
]
|
|
692
|
-
});
|
|
693
|
-
table.push(...rows);
|
|
694
|
-
return table.toString();
|
|
695
|
-
};
|
|
696
|
-
const codemodList = (codemods) => {
|
|
697
|
-
const rows = codemods.map((codemod, index2) => {
|
|
698
|
-
const fIndex = chalk__default.default.grey(index2);
|
|
699
|
-
const fVersion = chalk__default.default.magenta(codemod.version);
|
|
700
|
-
const fKind = chalk__default.default.yellow(codemod.kind);
|
|
701
|
-
const fName = chalk__default.default.blue(codemod.format());
|
|
702
|
-
const fUID = codemodUID(codemod.uid);
|
|
703
|
-
return [fIndex, fVersion, fKind, fName, fUID];
|
|
704
|
-
});
|
|
705
|
-
const table = new CliTable3__default.default({
|
|
706
|
-
style: { compact: true },
|
|
707
|
-
head: [
|
|
708
|
-
chalk__default.default.bold.grey("N°"),
|
|
709
|
-
chalk__default.default.bold.magenta("Version"),
|
|
710
|
-
chalk__default.default.bold.yellow("Kind"),
|
|
711
|
-
chalk__default.default.bold.blue("Name"),
|
|
712
|
-
chalk__default.default.bold.cyan("UID")
|
|
713
|
-
]
|
|
714
|
-
});
|
|
715
|
-
table.push(...rows);
|
|
716
|
-
return table.toString();
|
|
717
|
-
};
|
|
718
|
-
const durationMs = (elapsedMs) => {
|
|
719
|
-
const elapsedSeconds = (elapsedMs / ONE_SECOND_MS).toFixed(3);
|
|
720
|
-
return `${elapsedSeconds}s`;
|
|
721
|
-
};
|
|
722
|
-
const index$8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
723
|
-
__proto__: null,
|
|
724
|
-
codemodList,
|
|
725
|
-
codemodUID,
|
|
726
|
-
durationMs,
|
|
727
|
-
highlight,
|
|
728
|
-
path,
|
|
729
|
-
projectDetails,
|
|
730
|
-
projectType,
|
|
731
|
-
reports,
|
|
732
|
-
transform,
|
|
733
|
-
upgradeStep,
|
|
734
|
-
version,
|
|
735
|
-
versionRange
|
|
736
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
737
685
|
const CODEMOD_CODE_SUFFIX = "code";
|
|
738
686
|
const CODEMOD_JSON_SUFFIX = "json";
|
|
739
687
|
const CODEMOD_ALLOWED_SUFFIXES = [CODEMOD_CODE_SUFFIX, CODEMOD_JSON_SUFFIX];
|
|
@@ -786,7 +734,7 @@ class Codemod {
|
|
|
786
734
|
}
|
|
787
735
|
}
|
|
788
736
|
const codemodFactory = (options) => new Codemod(options);
|
|
789
|
-
const index$
|
|
737
|
+
const index$8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
790
738
|
__proto__: null,
|
|
791
739
|
codemodFactory,
|
|
792
740
|
constants: constants$2
|
|
@@ -898,7 +846,7 @@ const parseCodemodKindFromFilename = (filename) => {
|
|
|
898
846
|
const codemodRepositoryFactory = (cwd = INTERNAL_CODEMODS_DIRECTORY) => {
|
|
899
847
|
return new CodemodRepository(cwd);
|
|
900
848
|
};
|
|
901
|
-
const index$
|
|
849
|
+
const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
902
850
|
__proto__: null,
|
|
903
851
|
codemodRepositoryFactory,
|
|
904
852
|
constants: constants$1
|
|
@@ -1011,6 +959,15 @@ class Upgrader {
|
|
|
1011
959
|
this.logger = null;
|
|
1012
960
|
this.confirmationCallback = null;
|
|
1013
961
|
}
|
|
962
|
+
getNPMPackage() {
|
|
963
|
+
return this.npmPackage;
|
|
964
|
+
}
|
|
965
|
+
getProject() {
|
|
966
|
+
return this.project;
|
|
967
|
+
}
|
|
968
|
+
getTarget() {
|
|
969
|
+
return semVerFactory(this.target.raw);
|
|
970
|
+
}
|
|
1014
971
|
setRequirements(requirements) {
|
|
1015
972
|
this.requirements = requirements;
|
|
1016
973
|
return this;
|
|
@@ -1092,6 +1049,12 @@ class Upgrader {
|
|
|
1092
1049
|
}
|
|
1093
1050
|
return successReport();
|
|
1094
1051
|
}
|
|
1052
|
+
async confirm(message) {
|
|
1053
|
+
if (typeof this.confirmationCallback !== "function") {
|
|
1054
|
+
return true;
|
|
1055
|
+
}
|
|
1056
|
+
return this.confirmationCallback(message);
|
|
1057
|
+
}
|
|
1095
1058
|
async checkRequirements(requirements, context) {
|
|
1096
1059
|
for (const requirement of requirements) {
|
|
1097
1060
|
const { pass, error } = await requirement.test(context);
|
|
@@ -1163,7 +1126,7 @@ class Upgrader {
|
|
|
1163
1126
|
const packageManagerName = await utils.packageManager.getPreferred(projectPath);
|
|
1164
1127
|
this.logger?.debug?.(`Using ${highlight(packageManagerName)} as package manager`);
|
|
1165
1128
|
if (this.isDry) {
|
|
1166
|
-
this.logger?.debug?.(`Skipping dependencies installation (${chalk__default.default.italic("dry mode")}`);
|
|
1129
|
+
this.logger?.debug?.(`Skipping dependencies installation (${chalk__default.default.italic("dry mode")})`);
|
|
1167
1130
|
return;
|
|
1168
1131
|
}
|
|
1169
1132
|
await utils.packageManager.installDependencies(projectPath, packageManagerName, {
|
|
@@ -1182,23 +1145,28 @@ class Upgrader {
|
|
|
1182
1145
|
}
|
|
1183
1146
|
const resolveNPMTarget = (project, target, npmPackage) => {
|
|
1184
1147
|
if (isSemverInstance(target)) {
|
|
1185
|
-
|
|
1148
|
+
const version2 = npmPackage.findVersion(target);
|
|
1149
|
+
if (!version2) {
|
|
1150
|
+
throw new NPMCandidateNotFoundError(target);
|
|
1151
|
+
}
|
|
1152
|
+
return version2;
|
|
1186
1153
|
}
|
|
1187
1154
|
if (isSemVerReleaseType(target)) {
|
|
1188
1155
|
const range = rangeFromVersions(project.strapiVersion, target);
|
|
1189
1156
|
const npmVersionsMatches = npmPackage.findVersionsInRange(range);
|
|
1190
|
-
|
|
1157
|
+
const version2 = npmVersionsMatches.at(-1);
|
|
1158
|
+
if (!version2) {
|
|
1159
|
+
throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);
|
|
1160
|
+
}
|
|
1161
|
+
return version2;
|
|
1191
1162
|
}
|
|
1192
|
-
|
|
1163
|
+
throw new NPMCandidateNotFoundError(target);
|
|
1193
1164
|
};
|
|
1194
1165
|
const upgraderFactory = (project, target, npmPackage) => {
|
|
1195
|
-
const
|
|
1196
|
-
|
|
1197
|
-
throw new Error(`Couldn't find a matching version in the NPM registry for "${target}"`);
|
|
1198
|
-
}
|
|
1199
|
-
const semverTarget = semVerFactory(targetedNPMVersion.version);
|
|
1166
|
+
const npmTarget = resolveNPMTarget(project, target, npmPackage);
|
|
1167
|
+
const semverTarget = semVerFactory(npmTarget.version);
|
|
1200
1168
|
if (semver__default.default.eq(semverTarget, project.strapiVersion)) {
|
|
1201
|
-
throw new Error(`The project is already
|
|
1169
|
+
throw new Error(`The project is already using v${semverTarget}`);
|
|
1202
1170
|
}
|
|
1203
1171
|
return new Upgrader(project, semverTarget, npmPackage);
|
|
1204
1172
|
};
|
|
@@ -1209,54 +1177,156 @@ const constants = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
|
|
|
1209
1177
|
__proto__: null,
|
|
1210
1178
|
STRAPI_PACKAGE_NAME
|
|
1211
1179
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1212
|
-
const index$
|
|
1180
|
+
const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1213
1181
|
__proto__: null,
|
|
1214
1182
|
constants,
|
|
1215
1183
|
upgraderFactory
|
|
1216
1184
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1217
|
-
|
|
1218
|
-
|
|
1185
|
+
class Requirement {
|
|
1186
|
+
isRequired;
|
|
1219
1187
|
name;
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
constructor(name) {
|
|
1188
|
+
testCallback;
|
|
1189
|
+
children;
|
|
1190
|
+
constructor(name, testCallback, isRequired) {
|
|
1223
1191
|
this.name = name;
|
|
1224
|
-
this.
|
|
1225
|
-
this.
|
|
1192
|
+
this.testCallback = testCallback;
|
|
1193
|
+
this.isRequired = isRequired ?? true;
|
|
1194
|
+
this.children = [];
|
|
1226
1195
|
}
|
|
1227
|
-
|
|
1228
|
-
|
|
1196
|
+
setChildren(children) {
|
|
1197
|
+
this.children = children;
|
|
1198
|
+
return this;
|
|
1229
1199
|
}
|
|
1230
|
-
|
|
1231
|
-
|
|
1200
|
+
addChild(child) {
|
|
1201
|
+
this.children.push(child);
|
|
1202
|
+
return this;
|
|
1232
1203
|
}
|
|
1233
|
-
|
|
1234
|
-
this.
|
|
1235
|
-
|
|
1204
|
+
asOptional() {
|
|
1205
|
+
const newInstance = requirementFactory(this.name, this.testCallback, false);
|
|
1206
|
+
newInstance.setChildren(this.children);
|
|
1207
|
+
return newInstance;
|
|
1236
1208
|
}
|
|
1237
|
-
|
|
1238
|
-
this.
|
|
1239
|
-
|
|
1209
|
+
asRequired() {
|
|
1210
|
+
const newInstance = requirementFactory(this.name, this.testCallback, true);
|
|
1211
|
+
newInstance.setChildren(this.children);
|
|
1212
|
+
return newInstance;
|
|
1240
1213
|
}
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1214
|
+
async test(context) {
|
|
1215
|
+
try {
|
|
1216
|
+
await this.testCallback?.(context);
|
|
1217
|
+
return ok();
|
|
1218
|
+
} catch (e) {
|
|
1219
|
+
if (e instanceof Error) {
|
|
1220
|
+
return errored(e);
|
|
1221
|
+
}
|
|
1222
|
+
if (typeof e === "string") {
|
|
1223
|
+
return errored(new Error(e));
|
|
1224
|
+
}
|
|
1225
|
+
return errored(new Error("Unknown error"));
|
|
1226
|
+
}
|
|
1244
1227
|
}
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1228
|
+
}
|
|
1229
|
+
const ok = () => ({ pass: true, error: null });
|
|
1230
|
+
const errored = (error) => ({ pass: false, error });
|
|
1231
|
+
const requirementFactory = (name, testCallback, isRequired) => new Requirement(name, testCallback, isRequired);
|
|
1232
|
+
const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1233
|
+
__proto__: null,
|
|
1234
|
+
requirementFactory
|
|
1235
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
1236
|
+
const REQUIRE_AVAILABLE_NEXT_MAJOR = requirementFactory(
|
|
1237
|
+
"REQUIRE_AVAILABLE_NEXT_MAJOR",
|
|
1238
|
+
(context) => {
|
|
1239
|
+
const { project, target } = context;
|
|
1240
|
+
const currentMajor = project.strapiVersion.major;
|
|
1241
|
+
const targetedMajor = target.major;
|
|
1242
|
+
if (targetedMajor === currentMajor) {
|
|
1243
|
+
throw new Error(`You're already on the latest major version (v${currentMajor})`);
|
|
1244
|
+
}
|
|
1248
1245
|
}
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1246
|
+
);
|
|
1247
|
+
const REQUIRE_LATEST_FOR_CURRENT_MAJOR = requirementFactory(
|
|
1248
|
+
"REQUIRE_LATEST_FOR_CURRENT_MAJOR",
|
|
1249
|
+
(context) => {
|
|
1250
|
+
const { project, target, npmVersionsMatches } = context;
|
|
1251
|
+
const { major: currentMajor } = project.strapiVersion;
|
|
1252
|
+
const invalidMatches = npmVersionsMatches.filter(
|
|
1253
|
+
(match) => semVerFactory(match.version).major === currentMajor
|
|
1254
|
+
);
|
|
1255
|
+
if (invalidMatches.length > 0) {
|
|
1256
|
+
const invalidVersions = invalidMatches.map((match) => match.version);
|
|
1257
|
+
const invalidVersionsCount = invalidVersions.length;
|
|
1258
|
+
throw new Error(
|
|
1259
|
+
`Doing a major upgrade requires to be on the latest v${currentMajor} version, but found ${invalidVersionsCount} versions between the current one and ${target}. Please upgrade to ${invalidVersions.at(-1)} and try again.`
|
|
1260
|
+
);
|
|
1261
|
+
}
|
|
1254
1262
|
}
|
|
1255
|
-
|
|
1256
|
-
|
|
1263
|
+
);
|
|
1264
|
+
const REQUIRE_GIT_CLEAN_REPOSITORY = requirementFactory(
|
|
1265
|
+
"REQUIRE_GIT_CLEAN_REPOSITORY",
|
|
1266
|
+
async (context) => {
|
|
1267
|
+
const git = simpleGit__default.default({ baseDir: context.project.cwd });
|
|
1268
|
+
const status = await git.status();
|
|
1269
|
+
if (!status.isClean()) {
|
|
1270
|
+
throw new Error(
|
|
1271
|
+
"Repository is not clean. Please commit or stash any changes before upgrading"
|
|
1272
|
+
);
|
|
1273
|
+
}
|
|
1257
1274
|
}
|
|
1258
|
-
|
|
1259
|
-
const
|
|
1275
|
+
);
|
|
1276
|
+
const REQUIRE_GIT_REPOSITORY = requirementFactory(
|
|
1277
|
+
"REQUIRE_GIT_REPOSITORY",
|
|
1278
|
+
async (context) => {
|
|
1279
|
+
const git = simpleGit__default.default({ baseDir: context.project.cwd });
|
|
1280
|
+
const isRepo = await git.checkIsRepo();
|
|
1281
|
+
if (!isRepo) {
|
|
1282
|
+
throw new Error("Not a git repository (or any of the parent directories)");
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
).addChild(REQUIRE_GIT_CLEAN_REPOSITORY.asOptional());
|
|
1286
|
+
const REQUIRE_GIT_INSTALLED = requirementFactory(
|
|
1287
|
+
"REQUIRE_GIT_INSTALLED",
|
|
1288
|
+
async (context) => {
|
|
1289
|
+
const git = simpleGit__default.default({ baseDir: context.project.cwd });
|
|
1290
|
+
try {
|
|
1291
|
+
await git.version();
|
|
1292
|
+
} catch {
|
|
1293
|
+
throw new Error("Git is not installed");
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
).addChild(REQUIRE_GIT_REPOSITORY.asOptional());
|
|
1297
|
+
const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
|
|
1298
|
+
REQUIRE_GIT_INSTALLED.asOptional()
|
|
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
|
+
};
|
|
1260
1330
|
const upgrade = async (options) => {
|
|
1261
1331
|
const timer = timerFactory();
|
|
1262
1332
|
const { logger, codemodsTarget } = options;
|
|
@@ -1268,22 +1338,34 @@ const upgrade = async (options) => {
|
|
|
1268
1338
|
`The "${options.target}" upgrade can only be run on a Strapi project; for plugins, please use "codemods".`
|
|
1269
1339
|
);
|
|
1270
1340
|
}
|
|
1341
|
+
logger.debug(
|
|
1342
|
+
`Application: VERSION=${version(project.packageJSON.version)}; STRAPI_VERSION=${version(project.strapiVersion)}`
|
|
1343
|
+
);
|
|
1271
1344
|
const npmPackage = npmPackageFactory(STRAPI_PACKAGE_NAME);
|
|
1272
1345
|
await npmPackage.refresh();
|
|
1273
1346
|
const upgrader = upgraderFactory(project, options.target, npmPackage).dry(options.dry ?? false).onConfirm(options.confirm ?? null).setLogger(logger);
|
|
1274
1347
|
if (codemodsTarget !== void 0) {
|
|
1275
1348
|
upgrader.overrideCodemodsTarget(codemodsTarget);
|
|
1276
1349
|
}
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
}
|
|
1280
|
-
upgrader.addRequirement(REQUIRE_GIT.asOptional());
|
|
1350
|
+
await runUpgradePrompts(upgrader, options);
|
|
1351
|
+
addUpgradeRequirements(upgrader, options);
|
|
1281
1352
|
const upgradeReport = await upgrader.upgrade();
|
|
1282
1353
|
if (!upgradeReport.success) {
|
|
1283
1354
|
throw upgradeReport.error;
|
|
1284
1355
|
}
|
|
1285
1356
|
timer.stop();
|
|
1286
|
-
logger.info(`Completed in ${durationMs(timer.elapsedMs)}`);
|
|
1357
|
+
logger.info(`Completed in ${durationMs(timer.elapsedMs)}ms`);
|
|
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());
|
|
1287
1369
|
};
|
|
1288
1370
|
const resolvePath = (cwd) => path__default.default.resolve(cwd ?? process.cwd());
|
|
1289
1371
|
const getRangeFromTarget = (currentVersion, target) => {
|
|
@@ -1292,6 +1374,8 @@ const getRangeFromTarget = (currentVersion, target) => {
|
|
|
1292
1374
|
}
|
|
1293
1375
|
const { major, minor, patch } = currentVersion;
|
|
1294
1376
|
switch (target) {
|
|
1377
|
+
case ReleaseType.Latest:
|
|
1378
|
+
throw new Error("Can't use <latest> to create a codemods range: not implemented");
|
|
1295
1379
|
case ReleaseType.Major:
|
|
1296
1380
|
return rangeFactory(`${major}`);
|
|
1297
1381
|
case ReleaseType.Minor:
|
|
@@ -1449,18 +1533,18 @@ const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
1449
1533
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1450
1534
|
const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1451
1535
|
__proto__: null,
|
|
1452
|
-
codemod: index$
|
|
1453
|
-
codemodRepository: index$
|
|
1536
|
+
codemod: index$8,
|
|
1537
|
+
codemodRepository: index$7,
|
|
1454
1538
|
error: index$9,
|
|
1455
|
-
f: index$
|
|
1539
|
+
f: index$f,
|
|
1456
1540
|
fileScanner: index$d,
|
|
1457
1541
|
logger: index$3,
|
|
1458
1542
|
project: index$a,
|
|
1459
1543
|
report: index$2,
|
|
1460
|
-
requirement: index$
|
|
1544
|
+
requirement: index$5,
|
|
1461
1545
|
runner: index$1,
|
|
1462
|
-
timer: index$
|
|
1463
|
-
upgrader: index$
|
|
1546
|
+
timer: index$g,
|
|
1547
|
+
upgrader: index$6,
|
|
1464
1548
|
version: index$e
|
|
1465
1549
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1466
1550
|
exports.modules = index;
|