@strapi/upgrade 0.0.0-experimental.f2351bcfa3965c60f063a492da51faa2c636eee8 → 0.0.0-experimental.f49f46a1c17445a39e8af3f63124bcccf73842e6
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/README.md +1 -1
- package/dist/cli.js +391 -295
- package/dist/cli.js.map +1 -1
- package/dist/index.js +401 -310
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +397 -307
- 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/file-scanner/scanner.d.ts.map +1 -1
- package/dist/modules/project/project.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 +7 -7
- package/resources/codemods/5.0.0/deprecate-helper-plugin.code.ts +192 -0
- package/resources/codemods/5.0.0/sqlite3-to-better-sqlite3.json.ts +0 -1
- package/resources/codemods/5.1.0/dependency-better-sqlite3.json.ts +48 -0
- package/resources/utils/change-import.ts +23 -10
- package/resources/codemods/5.0.0/change-useAPIErrorHandler-import.code.ts +0 -21
- package/resources/codemods/5.0.0/nocontent-migrate-to-emptystatelayout.code.ts +0 -30
- package/resources/codemods/5.0.0/useRBAC-hook-import-change.code.ts +0 -21
package/dist/index.mjs
CHANGED
|
@@ -1,128 +1,15 @@
|
|
|
1
1
|
import path$1 from "node:path";
|
|
2
|
-
import
|
|
2
|
+
import CliTable3 from "cli-table3";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
+
import assert from "node:assert";
|
|
4
5
|
import semver from "semver";
|
|
5
|
-
import { packageManager } from "@strapi/utils";
|
|
6
|
-
import { cloneDeep, get, has, merge, set, omit, isEqual, groupBy, size } from "lodash/fp";
|
|
7
6
|
import fse from "fs-extra";
|
|
8
|
-
import
|
|
9
|
-
import { glob } from "glob";
|
|
7
|
+
import fastglob from "fast-glob";
|
|
10
8
|
import { run } from "jscodeshift/src/Runner";
|
|
9
|
+
import { cloneDeep, get, has, merge, set, omit, isEqual, groupBy, size } from "lodash/fp";
|
|
11
10
|
import { register } from "esbuild-register/dist/node";
|
|
12
|
-
import
|
|
13
|
-
|
|
14
|
-
isRequired;
|
|
15
|
-
name;
|
|
16
|
-
testCallback;
|
|
17
|
-
children;
|
|
18
|
-
constructor(name, testCallback, isRequired) {
|
|
19
|
-
this.name = name;
|
|
20
|
-
this.testCallback = testCallback;
|
|
21
|
-
this.isRequired = isRequired ?? true;
|
|
22
|
-
this.children = [];
|
|
23
|
-
}
|
|
24
|
-
setChildren(children) {
|
|
25
|
-
this.children = children;
|
|
26
|
-
return this;
|
|
27
|
-
}
|
|
28
|
-
addChild(child) {
|
|
29
|
-
this.children.push(child);
|
|
30
|
-
return this;
|
|
31
|
-
}
|
|
32
|
-
asOptional() {
|
|
33
|
-
const newInstance = requirementFactory(this.name, this.testCallback, false);
|
|
34
|
-
newInstance.setChildren(this.children);
|
|
35
|
-
return newInstance;
|
|
36
|
-
}
|
|
37
|
-
asRequired() {
|
|
38
|
-
const newInstance = requirementFactory(this.name, this.testCallback, true);
|
|
39
|
-
newInstance.setChildren(this.children);
|
|
40
|
-
return newInstance;
|
|
41
|
-
}
|
|
42
|
-
async test(context) {
|
|
43
|
-
try {
|
|
44
|
-
await this.testCallback?.(context);
|
|
45
|
-
return ok();
|
|
46
|
-
} catch (e) {
|
|
47
|
-
if (e instanceof Error) {
|
|
48
|
-
return errored(e);
|
|
49
|
-
}
|
|
50
|
-
if (typeof e === "string") {
|
|
51
|
-
return errored(new Error(e));
|
|
52
|
-
}
|
|
53
|
-
return errored(new Error("Unknown error"));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
const ok = () => ({ pass: true, error: null });
|
|
58
|
-
const errored = (error) => ({ pass: false, error });
|
|
59
|
-
const requirementFactory = (name, testCallback, isRequired) => new Requirement(name, testCallback, isRequired);
|
|
60
|
-
const index$g = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
61
|
-
__proto__: null,
|
|
62
|
-
requirementFactory
|
|
63
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
64
|
-
const REQUIRE_AVAILABLE_NEXT_MAJOR = requirementFactory(
|
|
65
|
-
"REQUIRE_AVAILABLE_NEXT_MAJOR",
|
|
66
|
-
(context) => {
|
|
67
|
-
const { project, target } = context;
|
|
68
|
-
const currentMajor = project.strapiVersion.major;
|
|
69
|
-
const targetedMajor = target.major;
|
|
70
|
-
if (targetedMajor === currentMajor) {
|
|
71
|
-
throw new Error(`You're already on the latest major version (v${currentMajor})`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
);
|
|
75
|
-
const REQUIRE_LATEST_FOR_CURRENT_MAJOR = requirementFactory(
|
|
76
|
-
"REQUIRE_LATEST_FOR_CURRENT_MAJOR",
|
|
77
|
-
(context) => {
|
|
78
|
-
const { project, target, npmVersionsMatches } = context;
|
|
79
|
-
if (npmVersionsMatches.length !== 1) {
|
|
80
|
-
const invalidVersions = npmVersionsMatches.slice(0, -1);
|
|
81
|
-
const invalidVersionsAsSemVer = invalidVersions.map((v) => v.version);
|
|
82
|
-
const nbInvalidVersions = npmVersionsMatches.length;
|
|
83
|
-
const currentMajor = project.strapiVersion.major;
|
|
84
|
-
throw new Error(
|
|
85
|
-
`Doing a major upgrade requires to be on the latest v${currentMajor} version, but found ${nbInvalidVersions} versions between the current one and ${target}: ${invalidVersionsAsSemVer}`
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
);
|
|
90
|
-
const REQUIRE_GIT_CLEAN_REPOSITORY = requirementFactory(
|
|
91
|
-
"REQUIRE_GIT_CLEAN_REPOSITORY",
|
|
92
|
-
async (context) => {
|
|
93
|
-
const git = simpleGit({ baseDir: context.project.cwd });
|
|
94
|
-
const status = await git.status();
|
|
95
|
-
if (!status.isClean()) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
"Repository is not clean. Please commit or stash any changes before upgrading"
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
);
|
|
102
|
-
const REQUIRE_GIT_REPOSITORY = requirementFactory(
|
|
103
|
-
"REQUIRE_GIT_REPOSITORY",
|
|
104
|
-
async (context) => {
|
|
105
|
-
const git = simpleGit({ baseDir: context.project.cwd });
|
|
106
|
-
const isRepo = await git.checkIsRepo();
|
|
107
|
-
if (!isRepo) {
|
|
108
|
-
throw new Error("Not a git repository (or any of the parent directories)");
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
).addChild(REQUIRE_GIT_CLEAN_REPOSITORY.asOptional());
|
|
112
|
-
const REQUIRE_GIT_INSTALLED = requirementFactory(
|
|
113
|
-
"REQUIRE_GIT_INSTALLED",
|
|
114
|
-
async (context) => {
|
|
115
|
-
const git = simpleGit({ baseDir: context.project.cwd });
|
|
116
|
-
try {
|
|
117
|
-
await git.version();
|
|
118
|
-
} catch {
|
|
119
|
-
throw new Error("Git is not installed");
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
).addChild(REQUIRE_GIT_REPOSITORY.asOptional());
|
|
123
|
-
const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
|
|
124
|
-
REQUIRE_GIT_INSTALLED.asOptional()
|
|
125
|
-
);
|
|
11
|
+
import { packageManager } from "@strapi/utils";
|
|
12
|
+
import simpleGit from "simple-git";
|
|
126
13
|
class Timer {
|
|
127
14
|
interval;
|
|
128
15
|
constructor() {
|
|
@@ -153,55 +40,101 @@ const constants$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineP
|
|
|
153
40
|
__proto__: null,
|
|
154
41
|
ONE_SECOND_MS
|
|
155
42
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
156
|
-
const index$
|
|
43
|
+
const index$g = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
157
44
|
__proto__: null,
|
|
158
45
|
constants: constants$4,
|
|
159
46
|
timerFactory
|
|
160
47
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
this.json = cloneDeep(json);
|
|
165
|
-
}
|
|
166
|
-
get(path2, defaultValue) {
|
|
167
|
-
if (!path2) {
|
|
168
|
-
return this.root();
|
|
169
|
-
}
|
|
170
|
-
return cloneDeep(get(path2, this.json) ?? defaultValue);
|
|
171
|
-
}
|
|
172
|
-
has(path2) {
|
|
173
|
-
return has(path2, this.json);
|
|
174
|
-
}
|
|
175
|
-
merge(other) {
|
|
176
|
-
this.json = merge(other, this.json);
|
|
177
|
-
return this;
|
|
178
|
-
}
|
|
179
|
-
root() {
|
|
180
|
-
return cloneDeep(this.json);
|
|
181
|
-
}
|
|
182
|
-
set(path2, value) {
|
|
183
|
-
this.json = set(path2, value, this.json);
|
|
184
|
-
return this;
|
|
185
|
-
}
|
|
186
|
-
remove(path2) {
|
|
187
|
-
this.json = omit(path2, this.json);
|
|
188
|
-
return this;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
const createJSONTransformAPI = (object) => new JSONTransformAPI(object);
|
|
192
|
-
const readJSON = async (path2) => {
|
|
193
|
-
const buffer = await fse.readFile(path2);
|
|
194
|
-
return JSON.parse(buffer.toString());
|
|
48
|
+
const path = (path2) => chalk.blue(path2);
|
|
49
|
+
const version = (version2) => {
|
|
50
|
+
return chalk.italic.yellow(`v${version2}`);
|
|
195
51
|
};
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
`;
|
|
199
|
-
await fse.writeFile(path2, jsonAsString);
|
|
52
|
+
const codemodUID = (uid) => {
|
|
53
|
+
return chalk.bold.cyan(uid);
|
|
200
54
|
};
|
|
55
|
+
const projectDetails = (project) => {
|
|
56
|
+
return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;
|
|
57
|
+
};
|
|
58
|
+
const projectType = (type) => chalk.cyan(type);
|
|
59
|
+
const versionRange = (range) => chalk.italic.yellow(range.raw);
|
|
60
|
+
const transform = (transformFilePath) => chalk.cyan(transformFilePath);
|
|
61
|
+
const highlight = (arg) => chalk.bold.underline(arg);
|
|
62
|
+
const upgradeStep = (text, step) => {
|
|
63
|
+
return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);
|
|
64
|
+
};
|
|
65
|
+
const reports = (reports2) => {
|
|
66
|
+
const rows = reports2.map(({ codemod, report }, i) => {
|
|
67
|
+
const fIndex = chalk.grey(i);
|
|
68
|
+
const fVersion = chalk.magenta(codemod.version);
|
|
69
|
+
const fKind = chalk.yellow(codemod.kind);
|
|
70
|
+
const fFormattedTransformPath = chalk.cyan(codemod.format());
|
|
71
|
+
const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${chalk.dim.italic("(cold start)")}` : `${report.timeElapsed}s`;
|
|
72
|
+
const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);
|
|
73
|
+
const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);
|
|
74
|
+
return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];
|
|
75
|
+
});
|
|
76
|
+
const table = new CliTable3({
|
|
77
|
+
style: { compact: true },
|
|
78
|
+
head: [
|
|
79
|
+
chalk.bold.grey("N°"),
|
|
80
|
+
chalk.bold.magenta("Version"),
|
|
81
|
+
chalk.bold.yellow("Kind"),
|
|
82
|
+
chalk.bold.cyan("Name"),
|
|
83
|
+
chalk.bold.green("Affected"),
|
|
84
|
+
chalk.bold.red("Unchanged"),
|
|
85
|
+
chalk.bold.blue("Duration")
|
|
86
|
+
]
|
|
87
|
+
});
|
|
88
|
+
table.push(...rows);
|
|
89
|
+
return table.toString();
|
|
90
|
+
};
|
|
91
|
+
const codemodList = (codemods) => {
|
|
92
|
+
const rows = codemods.map((codemod, index2) => {
|
|
93
|
+
const fIndex = chalk.grey(index2);
|
|
94
|
+
const fVersion = chalk.magenta(codemod.version);
|
|
95
|
+
const fKind = chalk.yellow(codemod.kind);
|
|
96
|
+
const fName = chalk.blue(codemod.format());
|
|
97
|
+
const fUID = codemodUID(codemod.uid);
|
|
98
|
+
return [fIndex, fVersion, fKind, fName, fUID];
|
|
99
|
+
});
|
|
100
|
+
const table = new CliTable3({
|
|
101
|
+
style: { compact: true },
|
|
102
|
+
head: [
|
|
103
|
+
chalk.bold.grey("N°"),
|
|
104
|
+
chalk.bold.magenta("Version"),
|
|
105
|
+
chalk.bold.yellow("Kind"),
|
|
106
|
+
chalk.bold.blue("Name"),
|
|
107
|
+
chalk.bold.cyan("UID")
|
|
108
|
+
]
|
|
109
|
+
});
|
|
110
|
+
table.push(...rows);
|
|
111
|
+
return table.toString();
|
|
112
|
+
};
|
|
113
|
+
const durationMs = (elapsedMs) => {
|
|
114
|
+
const elapsedSeconds = (elapsedMs / ONE_SECOND_MS).toFixed(3);
|
|
115
|
+
return `${elapsedSeconds}s`;
|
|
116
|
+
};
|
|
117
|
+
const index$f = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
118
|
+
__proto__: null,
|
|
119
|
+
codemodList,
|
|
120
|
+
codemodUID,
|
|
121
|
+
durationMs,
|
|
122
|
+
highlight,
|
|
123
|
+
path,
|
|
124
|
+
projectDetails,
|
|
125
|
+
projectType,
|
|
126
|
+
reports,
|
|
127
|
+
transform,
|
|
128
|
+
upgradeStep,
|
|
129
|
+
version,
|
|
130
|
+
versionRange
|
|
131
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
132
|
+
const NPM_REGISTRY_URL = "https://registry.npmjs.org";
|
|
201
133
|
var ReleaseType = /* @__PURE__ */ ((ReleaseType2) => {
|
|
202
134
|
ReleaseType2["Major"] = "major";
|
|
203
135
|
ReleaseType2["Minor"] = "minor";
|
|
204
136
|
ReleaseType2["Patch"] = "patch";
|
|
137
|
+
ReleaseType2["Latest"] = "latest";
|
|
205
138
|
return ReleaseType2;
|
|
206
139
|
})(ReleaseType || {});
|
|
207
140
|
const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -227,17 +160,20 @@ const rangeFactory = (range) => {
|
|
|
227
160
|
};
|
|
228
161
|
const rangeFromReleaseType = (current, identifier) => {
|
|
229
162
|
switch (identifier) {
|
|
230
|
-
case ReleaseType.
|
|
231
|
-
|
|
232
|
-
return rangeFactory(`>${current.raw} <=${nextMajor}`);
|
|
163
|
+
case ReleaseType.Latest: {
|
|
164
|
+
return rangeFactory(`>${current.raw}`);
|
|
233
165
|
}
|
|
234
|
-
case ReleaseType.
|
|
235
|
-
const
|
|
236
|
-
return rangeFactory(`>${current.raw}
|
|
166
|
+
case ReleaseType.Major: {
|
|
167
|
+
const nextMajor = semVerFactory(current.raw).inc("major");
|
|
168
|
+
return rangeFactory(`>${current.raw} <=${nextMajor.major}`);
|
|
237
169
|
}
|
|
238
170
|
case ReleaseType.Minor: {
|
|
239
|
-
const
|
|
240
|
-
return rangeFactory(`>${current.raw} <${
|
|
171
|
+
const nextMajor = semVerFactory(current.raw).inc("major");
|
|
172
|
+
return rangeFactory(`>${current.raw} <${nextMajor.raw}`);
|
|
173
|
+
}
|
|
174
|
+
case ReleaseType.Patch: {
|
|
175
|
+
const nextMinor = semVerFactory(current.raw).inc("minor");
|
|
176
|
+
return rangeFactory(`>${current.raw} <${nextMinor.raw}`);
|
|
241
177
|
}
|
|
242
178
|
default: {
|
|
243
179
|
throw new Error("Not implemented");
|
|
@@ -271,13 +207,57 @@ const index$e = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
271
207
|
rangeFromVersions,
|
|
272
208
|
semVerFactory
|
|
273
209
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
210
|
+
class Package {
|
|
211
|
+
name;
|
|
212
|
+
packageURL;
|
|
213
|
+
npmPackage;
|
|
214
|
+
constructor(name) {
|
|
215
|
+
this.name = name;
|
|
216
|
+
this.packageURL = `${NPM_REGISTRY_URL}/${name}`;
|
|
217
|
+
this.npmPackage = null;
|
|
218
|
+
}
|
|
219
|
+
get isLoaded() {
|
|
220
|
+
return this.npmPackage !== null;
|
|
221
|
+
}
|
|
222
|
+
assertPackageIsLoaded(npmPackage) {
|
|
223
|
+
assert(this.isLoaded, "The package is not loaded yet");
|
|
224
|
+
}
|
|
225
|
+
getVersionsDict() {
|
|
226
|
+
this.assertPackageIsLoaded(this.npmPackage);
|
|
227
|
+
return this.npmPackage.versions;
|
|
228
|
+
}
|
|
229
|
+
getVersionsAsList() {
|
|
230
|
+
this.assertPackageIsLoaded(this.npmPackage);
|
|
231
|
+
return Object.values(this.npmPackage.versions);
|
|
232
|
+
}
|
|
233
|
+
findVersionsInRange(range) {
|
|
234
|
+
const versions = this.getVersionsAsList();
|
|
235
|
+
return versions.filter((v) => range.test(v.version)).filter((v) => isLiteralSemVer(v.version)).sort((v1, v2) => semver.compare(v1.version, v2.version));
|
|
236
|
+
}
|
|
237
|
+
findVersion(version2) {
|
|
238
|
+
const versions = this.getVersionsAsList();
|
|
239
|
+
return versions.find((npmVersion) => semver.eq(npmVersion.version, version2));
|
|
240
|
+
}
|
|
241
|
+
async refresh() {
|
|
242
|
+
const response = await fetch(this.packageURL);
|
|
243
|
+
assert(response.ok, `Request failed for ${this.packageURL}`);
|
|
244
|
+
this.npmPackage = await response.json();
|
|
245
|
+
return this;
|
|
246
|
+
}
|
|
247
|
+
versionExists(version2) {
|
|
248
|
+
return this.findVersion(version2) !== void 0;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const npmPackageFactory = (name) => new Package(name);
|
|
274
252
|
class FileScanner {
|
|
275
253
|
cwd;
|
|
276
254
|
constructor(cwd) {
|
|
277
255
|
this.cwd = cwd;
|
|
278
256
|
}
|
|
279
257
|
scan(patterns) {
|
|
280
|
-
const filenames =
|
|
258
|
+
const filenames = fastglob.sync(patterns, {
|
|
259
|
+
cwd: this.cwd
|
|
260
|
+
});
|
|
281
261
|
return filenames.map((filename) => path$1.join(this.cwd, filename));
|
|
282
262
|
}
|
|
283
263
|
}
|
|
@@ -315,6 +295,46 @@ const index$c = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
315
295
|
__proto__: null,
|
|
316
296
|
codeRunnerFactory
|
|
317
297
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
298
|
+
class JSONTransformAPI {
|
|
299
|
+
json;
|
|
300
|
+
constructor(json) {
|
|
301
|
+
this.json = cloneDeep(json);
|
|
302
|
+
}
|
|
303
|
+
get(path2, defaultValue) {
|
|
304
|
+
if (!path2) {
|
|
305
|
+
return this.root();
|
|
306
|
+
}
|
|
307
|
+
return cloneDeep(get(path2, this.json) ?? defaultValue);
|
|
308
|
+
}
|
|
309
|
+
has(path2) {
|
|
310
|
+
return has(path2, this.json);
|
|
311
|
+
}
|
|
312
|
+
merge(other) {
|
|
313
|
+
this.json = merge(other, this.json);
|
|
314
|
+
return this;
|
|
315
|
+
}
|
|
316
|
+
root() {
|
|
317
|
+
return cloneDeep(this.json);
|
|
318
|
+
}
|
|
319
|
+
set(path2, value) {
|
|
320
|
+
this.json = set(path2, value, this.json);
|
|
321
|
+
return this;
|
|
322
|
+
}
|
|
323
|
+
remove(path2) {
|
|
324
|
+
this.json = omit(path2, this.json);
|
|
325
|
+
return this;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const createJSONTransformAPI = (object) => new JSONTransformAPI(object);
|
|
329
|
+
const readJSON = async (path2) => {
|
|
330
|
+
const buffer = await fse.readFile(path2);
|
|
331
|
+
return JSON.parse(buffer.toString());
|
|
332
|
+
};
|
|
333
|
+
const saveJSON = async (path2, json) => {
|
|
334
|
+
const jsonAsString = `${JSON.stringify(json, null, 2)}
|
|
335
|
+
`;
|
|
336
|
+
await fse.writeFile(path2, jsonAsString);
|
|
337
|
+
};
|
|
318
338
|
const transformJSON = async (codemodPath, paths, config) => {
|
|
319
339
|
const { dry } = config;
|
|
320
340
|
const startTime = process.hrtime();
|
|
@@ -491,6 +511,8 @@ class AppProject extends Project {
|
|
|
491
511
|
return [
|
|
492
512
|
// App default files
|
|
493
513
|
`./${allowedRootPaths}/**/*.${allowedExtensions}`,
|
|
514
|
+
`!./**/node_modules/**/*`,
|
|
515
|
+
`!./**/dist/**/*`,
|
|
494
516
|
// Root package.json file
|
|
495
517
|
PROJECT_PACKAGE_JSON
|
|
496
518
|
];
|
|
@@ -564,6 +586,8 @@ class PluginProject extends Project {
|
|
|
564
586
|
return [
|
|
565
587
|
// Plugin default files
|
|
566
588
|
`./${allowedRootPaths}/**/*.${allowedExtensions}`,
|
|
589
|
+
`!./**/node_modules/**/*`,
|
|
590
|
+
`!./**/dist/**/*`,
|
|
567
591
|
// Root package.json file
|
|
568
592
|
PROJECT_PACKAGE_JSON,
|
|
569
593
|
// Plugin root files
|
|
@@ -619,6 +643,18 @@ class UnexpectedError extends Error {
|
|
|
619
643
|
super("Unexpected Error");
|
|
620
644
|
}
|
|
621
645
|
}
|
|
646
|
+
class NPMCandidateNotFoundError extends Error {
|
|
647
|
+
target;
|
|
648
|
+
constructor(target, message = `Couldn't find a valid NPM candidate for "${target}"`) {
|
|
649
|
+
super(message);
|
|
650
|
+
this.target = target;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
class AbortedError extends Error {
|
|
654
|
+
constructor(message = "Upgrade aborted") {
|
|
655
|
+
super(message);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
622
658
|
const unknownToError = (e) => {
|
|
623
659
|
if (e instanceof Error) {
|
|
624
660
|
return e;
|
|
@@ -630,93 +666,11 @@ const unknownToError = (e) => {
|
|
|
630
666
|
};
|
|
631
667
|
const index$9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
632
668
|
__proto__: null,
|
|
669
|
+
AbortedError,
|
|
670
|
+
NPMCandidateNotFoundError,
|
|
633
671
|
UnexpectedError,
|
|
634
672
|
unknownToError
|
|
635
673
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
636
|
-
const path = (path2) => chalk.blue(path2);
|
|
637
|
-
const version = (version2) => {
|
|
638
|
-
return chalk.italic.yellow(`v${version2}`);
|
|
639
|
-
};
|
|
640
|
-
const codemodUID = (uid) => {
|
|
641
|
-
return chalk.bold.cyan(uid);
|
|
642
|
-
};
|
|
643
|
-
const projectDetails = (project) => {
|
|
644
|
-
return `Project: TYPE=${projectType(project.type)}; CWD=${path(project.cwd)}; PATHS=${project.paths.map(path)}`;
|
|
645
|
-
};
|
|
646
|
-
const projectType = (type) => chalk.cyan(type);
|
|
647
|
-
const versionRange = (range) => chalk.italic.yellow(range.raw);
|
|
648
|
-
const transform = (transformFilePath) => chalk.cyan(transformFilePath);
|
|
649
|
-
const highlight = (arg) => chalk.bold.underline(arg);
|
|
650
|
-
const upgradeStep = (text, step) => {
|
|
651
|
-
return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);
|
|
652
|
-
};
|
|
653
|
-
const reports = (reports2) => {
|
|
654
|
-
const rows = reports2.map(({ codemod, report }, i) => {
|
|
655
|
-
const fIndex = chalk.grey(i);
|
|
656
|
-
const fVersion = chalk.magenta(codemod.version);
|
|
657
|
-
const fKind = chalk.yellow(codemod.kind);
|
|
658
|
-
const fFormattedTransformPath = chalk.cyan(codemod.format());
|
|
659
|
-
const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${chalk.dim.italic("(cold start)")}` : `${report.timeElapsed}s`;
|
|
660
|
-
const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);
|
|
661
|
-
const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);
|
|
662
|
-
return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];
|
|
663
|
-
});
|
|
664
|
-
const table = new CliTable3({
|
|
665
|
-
style: { compact: true },
|
|
666
|
-
head: [
|
|
667
|
-
chalk.bold.grey("N°"),
|
|
668
|
-
chalk.bold.magenta("Version"),
|
|
669
|
-
chalk.bold.yellow("Kind"),
|
|
670
|
-
chalk.bold.cyan("Name"),
|
|
671
|
-
chalk.bold.green("Affected"),
|
|
672
|
-
chalk.bold.red("Unchanged"),
|
|
673
|
-
chalk.bold.blue("Duration")
|
|
674
|
-
]
|
|
675
|
-
});
|
|
676
|
-
table.push(...rows);
|
|
677
|
-
return table.toString();
|
|
678
|
-
};
|
|
679
|
-
const codemodList = (codemods) => {
|
|
680
|
-
const rows = codemods.map((codemod, index2) => {
|
|
681
|
-
const fIndex = chalk.grey(index2);
|
|
682
|
-
const fVersion = chalk.magenta(codemod.version);
|
|
683
|
-
const fKind = chalk.yellow(codemod.kind);
|
|
684
|
-
const fName = chalk.blue(codemod.format());
|
|
685
|
-
const fUID = codemodUID(codemod.uid);
|
|
686
|
-
return [fIndex, fVersion, fKind, fName, fUID];
|
|
687
|
-
});
|
|
688
|
-
const table = new CliTable3({
|
|
689
|
-
style: { compact: true },
|
|
690
|
-
head: [
|
|
691
|
-
chalk.bold.grey("N°"),
|
|
692
|
-
chalk.bold.magenta("Version"),
|
|
693
|
-
chalk.bold.yellow("Kind"),
|
|
694
|
-
chalk.bold.blue("Name"),
|
|
695
|
-
chalk.bold.cyan("UID")
|
|
696
|
-
]
|
|
697
|
-
});
|
|
698
|
-
table.push(...rows);
|
|
699
|
-
return table.toString();
|
|
700
|
-
};
|
|
701
|
-
const durationMs = (elapsedMs) => {
|
|
702
|
-
const elapsedSeconds = (elapsedMs / ONE_SECOND_MS).toFixed(3);
|
|
703
|
-
return `${elapsedSeconds}s`;
|
|
704
|
-
};
|
|
705
|
-
const index$8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
706
|
-
__proto__: null,
|
|
707
|
-
codemodList,
|
|
708
|
-
codemodUID,
|
|
709
|
-
durationMs,
|
|
710
|
-
highlight,
|
|
711
|
-
path,
|
|
712
|
-
projectDetails,
|
|
713
|
-
projectType,
|
|
714
|
-
reports,
|
|
715
|
-
transform,
|
|
716
|
-
upgradeStep,
|
|
717
|
-
version,
|
|
718
|
-
versionRange
|
|
719
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
720
674
|
const CODEMOD_CODE_SUFFIX = "code";
|
|
721
675
|
const CODEMOD_JSON_SUFFIX = "json";
|
|
722
676
|
const CODEMOD_ALLOWED_SUFFIXES = [CODEMOD_CODE_SUFFIX, CODEMOD_JSON_SUFFIX];
|
|
@@ -769,7 +723,7 @@ class Codemod {
|
|
|
769
723
|
}
|
|
770
724
|
}
|
|
771
725
|
const codemodFactory = (options) => new Codemod(options);
|
|
772
|
-
const index$
|
|
726
|
+
const index$8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
773
727
|
__proto__: null,
|
|
774
728
|
codemodFactory,
|
|
775
729
|
constants: constants$2
|
|
@@ -881,7 +835,7 @@ const parseCodemodKindFromFilename = (filename) => {
|
|
|
881
835
|
const codemodRepositoryFactory = (cwd = INTERNAL_CODEMODS_DIRECTORY) => {
|
|
882
836
|
return new CodemodRepository(cwd);
|
|
883
837
|
};
|
|
884
|
-
const index$
|
|
838
|
+
const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
885
839
|
__proto__: null,
|
|
886
840
|
codemodRepositoryFactory,
|
|
887
841
|
constants: constants$1
|
|
@@ -994,6 +948,15 @@ class Upgrader {
|
|
|
994
948
|
this.logger = null;
|
|
995
949
|
this.confirmationCallback = null;
|
|
996
950
|
}
|
|
951
|
+
getNPMPackage() {
|
|
952
|
+
return this.npmPackage;
|
|
953
|
+
}
|
|
954
|
+
getProject() {
|
|
955
|
+
return this.project;
|
|
956
|
+
}
|
|
957
|
+
getTarget() {
|
|
958
|
+
return semVerFactory(this.target.raw);
|
|
959
|
+
}
|
|
997
960
|
setRequirements(requirements) {
|
|
998
961
|
this.requirements = requirements;
|
|
999
962
|
return this;
|
|
@@ -1075,6 +1038,12 @@ class Upgrader {
|
|
|
1075
1038
|
}
|
|
1076
1039
|
return successReport();
|
|
1077
1040
|
}
|
|
1041
|
+
async confirm(message) {
|
|
1042
|
+
if (typeof this.confirmationCallback !== "function") {
|
|
1043
|
+
return true;
|
|
1044
|
+
}
|
|
1045
|
+
return this.confirmationCallback(message);
|
|
1046
|
+
}
|
|
1078
1047
|
async checkRequirements(requirements, context) {
|
|
1079
1048
|
for (const requirement of requirements) {
|
|
1080
1049
|
const { pass, error } = await requirement.test(context);
|
|
@@ -1146,7 +1115,7 @@ class Upgrader {
|
|
|
1146
1115
|
const packageManagerName = await packageManager.getPreferred(projectPath);
|
|
1147
1116
|
this.logger?.debug?.(`Using ${highlight(packageManagerName)} as package manager`);
|
|
1148
1117
|
if (this.isDry) {
|
|
1149
|
-
this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic("dry mode")}`);
|
|
1118
|
+
this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic("dry mode")})`);
|
|
1150
1119
|
return;
|
|
1151
1120
|
}
|
|
1152
1121
|
await packageManager.installDependencies(projectPath, packageManagerName, {
|
|
@@ -1165,23 +1134,28 @@ class Upgrader {
|
|
|
1165
1134
|
}
|
|
1166
1135
|
const resolveNPMTarget = (project, target, npmPackage) => {
|
|
1167
1136
|
if (isSemverInstance(target)) {
|
|
1168
|
-
|
|
1137
|
+
const version2 = npmPackage.findVersion(target);
|
|
1138
|
+
if (!version2) {
|
|
1139
|
+
throw new NPMCandidateNotFoundError(target);
|
|
1140
|
+
}
|
|
1141
|
+
return version2;
|
|
1169
1142
|
}
|
|
1170
1143
|
if (isSemVerReleaseType(target)) {
|
|
1171
1144
|
const range = rangeFromVersions(project.strapiVersion, target);
|
|
1172
1145
|
const npmVersionsMatches = npmPackage.findVersionsInRange(range);
|
|
1173
|
-
|
|
1146
|
+
const version2 = npmVersionsMatches.at(-1);
|
|
1147
|
+
if (!version2) {
|
|
1148
|
+
throw new NPMCandidateNotFoundError(range, `The project is already up-to-date (${target})`);
|
|
1149
|
+
}
|
|
1150
|
+
return version2;
|
|
1174
1151
|
}
|
|
1175
|
-
|
|
1152
|
+
throw new NPMCandidateNotFoundError(target);
|
|
1176
1153
|
};
|
|
1177
1154
|
const upgraderFactory = (project, target, npmPackage) => {
|
|
1178
|
-
const
|
|
1179
|
-
|
|
1180
|
-
throw new Error(`Couldn't find a matching version in the NPM registry for "${target}"`);
|
|
1181
|
-
}
|
|
1182
|
-
const semverTarget = semVerFactory(targetedNPMVersion.version);
|
|
1155
|
+
const npmTarget = resolveNPMTarget(project, target, npmPackage);
|
|
1156
|
+
const semverTarget = semVerFactory(npmTarget.version);
|
|
1183
1157
|
if (semver.eq(semverTarget, project.strapiVersion)) {
|
|
1184
|
-
throw new Error(`The project is already
|
|
1158
|
+
throw new Error(`The project is already using v${semverTarget}`);
|
|
1185
1159
|
}
|
|
1186
1160
|
return new Upgrader(project, semverTarget, npmPackage);
|
|
1187
1161
|
};
|
|
@@ -1192,54 +1166,156 @@ const constants = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
|
|
|
1192
1166
|
__proto__: null,
|
|
1193
1167
|
STRAPI_PACKAGE_NAME
|
|
1194
1168
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1195
|
-
const index$
|
|
1169
|
+
const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1196
1170
|
__proto__: null,
|
|
1197
1171
|
constants,
|
|
1198
1172
|
upgraderFactory
|
|
1199
1173
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1200
|
-
|
|
1201
|
-
|
|
1174
|
+
class Requirement {
|
|
1175
|
+
isRequired;
|
|
1202
1176
|
name;
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
constructor(name) {
|
|
1177
|
+
testCallback;
|
|
1178
|
+
children;
|
|
1179
|
+
constructor(name, testCallback, isRequired) {
|
|
1206
1180
|
this.name = name;
|
|
1207
|
-
this.
|
|
1208
|
-
this.
|
|
1181
|
+
this.testCallback = testCallback;
|
|
1182
|
+
this.isRequired = isRequired ?? true;
|
|
1183
|
+
this.children = [];
|
|
1209
1184
|
}
|
|
1210
|
-
|
|
1211
|
-
|
|
1185
|
+
setChildren(children) {
|
|
1186
|
+
this.children = children;
|
|
1187
|
+
return this;
|
|
1212
1188
|
}
|
|
1213
|
-
|
|
1214
|
-
|
|
1189
|
+
addChild(child) {
|
|
1190
|
+
this.children.push(child);
|
|
1191
|
+
return this;
|
|
1215
1192
|
}
|
|
1216
|
-
|
|
1217
|
-
this.
|
|
1218
|
-
|
|
1193
|
+
asOptional() {
|
|
1194
|
+
const newInstance = requirementFactory(this.name, this.testCallback, false);
|
|
1195
|
+
newInstance.setChildren(this.children);
|
|
1196
|
+
return newInstance;
|
|
1219
1197
|
}
|
|
1220
|
-
|
|
1221
|
-
this.
|
|
1222
|
-
|
|
1198
|
+
asRequired() {
|
|
1199
|
+
const newInstance = requirementFactory(this.name, this.testCallback, true);
|
|
1200
|
+
newInstance.setChildren(this.children);
|
|
1201
|
+
return newInstance;
|
|
1223
1202
|
}
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1203
|
+
async test(context) {
|
|
1204
|
+
try {
|
|
1205
|
+
await this.testCallback?.(context);
|
|
1206
|
+
return ok();
|
|
1207
|
+
} catch (e) {
|
|
1208
|
+
if (e instanceof Error) {
|
|
1209
|
+
return errored(e);
|
|
1210
|
+
}
|
|
1211
|
+
if (typeof e === "string") {
|
|
1212
|
+
return errored(new Error(e));
|
|
1213
|
+
}
|
|
1214
|
+
return errored(new Error("Unknown error"));
|
|
1215
|
+
}
|
|
1227
1216
|
}
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1217
|
+
}
|
|
1218
|
+
const ok = () => ({ pass: true, error: null });
|
|
1219
|
+
const errored = (error) => ({ pass: false, error });
|
|
1220
|
+
const requirementFactory = (name, testCallback, isRequired) => new Requirement(name, testCallback, isRequired);
|
|
1221
|
+
const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1222
|
+
__proto__: null,
|
|
1223
|
+
requirementFactory
|
|
1224
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
1225
|
+
const REQUIRE_AVAILABLE_NEXT_MAJOR = requirementFactory(
|
|
1226
|
+
"REQUIRE_AVAILABLE_NEXT_MAJOR",
|
|
1227
|
+
(context) => {
|
|
1228
|
+
const { project, target } = context;
|
|
1229
|
+
const currentMajor = project.strapiVersion.major;
|
|
1230
|
+
const targetedMajor = target.major;
|
|
1231
|
+
if (targetedMajor === currentMajor) {
|
|
1232
|
+
throw new Error(`You're already on the latest major version (v${currentMajor})`);
|
|
1233
|
+
}
|
|
1231
1234
|
}
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1235
|
+
);
|
|
1236
|
+
const REQUIRE_LATEST_FOR_CURRENT_MAJOR = requirementFactory(
|
|
1237
|
+
"REQUIRE_LATEST_FOR_CURRENT_MAJOR",
|
|
1238
|
+
(context) => {
|
|
1239
|
+
const { project, target, npmVersionsMatches } = context;
|
|
1240
|
+
const { major: currentMajor } = project.strapiVersion;
|
|
1241
|
+
const invalidMatches = npmVersionsMatches.filter(
|
|
1242
|
+
(match) => semVerFactory(match.version).major === currentMajor
|
|
1243
|
+
);
|
|
1244
|
+
if (invalidMatches.length > 0) {
|
|
1245
|
+
const invalidVersions = invalidMatches.map((match) => match.version);
|
|
1246
|
+
const invalidVersionsCount = invalidVersions.length;
|
|
1247
|
+
throw new Error(
|
|
1248
|
+
`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.`
|
|
1249
|
+
);
|
|
1250
|
+
}
|
|
1237
1251
|
}
|
|
1238
|
-
|
|
1239
|
-
|
|
1252
|
+
);
|
|
1253
|
+
const REQUIRE_GIT_CLEAN_REPOSITORY = requirementFactory(
|
|
1254
|
+
"REQUIRE_GIT_CLEAN_REPOSITORY",
|
|
1255
|
+
async (context) => {
|
|
1256
|
+
const git = simpleGit({ baseDir: context.project.cwd });
|
|
1257
|
+
const status = await git.status();
|
|
1258
|
+
if (!status.isClean()) {
|
|
1259
|
+
throw new Error(
|
|
1260
|
+
"Repository is not clean. Please commit or stash any changes before upgrading"
|
|
1261
|
+
);
|
|
1262
|
+
}
|
|
1240
1263
|
}
|
|
1241
|
-
|
|
1242
|
-
const
|
|
1264
|
+
);
|
|
1265
|
+
const REQUIRE_GIT_REPOSITORY = requirementFactory(
|
|
1266
|
+
"REQUIRE_GIT_REPOSITORY",
|
|
1267
|
+
async (context) => {
|
|
1268
|
+
const git = simpleGit({ baseDir: context.project.cwd });
|
|
1269
|
+
const isRepo = await git.checkIsRepo();
|
|
1270
|
+
if (!isRepo) {
|
|
1271
|
+
throw new Error("Not a git repository (or any of the parent directories)");
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
).addChild(REQUIRE_GIT_CLEAN_REPOSITORY.asOptional());
|
|
1275
|
+
const REQUIRE_GIT_INSTALLED = requirementFactory(
|
|
1276
|
+
"REQUIRE_GIT_INSTALLED",
|
|
1277
|
+
async (context) => {
|
|
1278
|
+
const git = simpleGit({ baseDir: context.project.cwd });
|
|
1279
|
+
try {
|
|
1280
|
+
await git.version();
|
|
1281
|
+
} catch {
|
|
1282
|
+
throw new Error("Git is not installed");
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
).addChild(REQUIRE_GIT_REPOSITORY.asOptional());
|
|
1286
|
+
const REQUIRE_GIT = requirementFactory("REQUIRE_GIT", null).addChild(
|
|
1287
|
+
REQUIRE_GIT_INSTALLED.asOptional()
|
|
1288
|
+
);
|
|
1289
|
+
const latest = async (upgrader, options) => {
|
|
1290
|
+
if (options.target !== ReleaseType.Latest) {
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1293
|
+
const npmPackage = upgrader.getNPMPackage();
|
|
1294
|
+
const target = upgrader.getTarget();
|
|
1295
|
+
const project = upgrader.getProject();
|
|
1296
|
+
const { strapiVersion: current } = project;
|
|
1297
|
+
const fTargetMajor = highlight(`v${target.major}`);
|
|
1298
|
+
const fCurrentMajor = highlight(`v${current.major}`);
|
|
1299
|
+
const fTarget = version(target);
|
|
1300
|
+
const fCurrent = version(current);
|
|
1301
|
+
const isMajorUpgrade = target.major > current.major;
|
|
1302
|
+
if (isMajorUpgrade) {
|
|
1303
|
+
options.logger.warn(
|
|
1304
|
+
`Detected a major upgrade for the "${highlight(ReleaseType.Latest)}" tag: ${fCurrent} > ${fTarget}`
|
|
1305
|
+
);
|
|
1306
|
+
const newerPackageRelease = npmPackage.findVersionsInRange(rangeFactory(`>${current.raw} <${target.major}`)).at(-1);
|
|
1307
|
+
if (newerPackageRelease) {
|
|
1308
|
+
const fLatest = version(semVerFactory(newerPackageRelease.version));
|
|
1309
|
+
options.logger.warn(
|
|
1310
|
+
`It's recommended to first upgrade to the latest version of ${fCurrentMajor} (${fLatest}) before upgrading to ${fTargetMajor}.`
|
|
1311
|
+
);
|
|
1312
|
+
}
|
|
1313
|
+
const proceedAnyway = await upgrader.confirm(`I know what I'm doing. Proceed anyway!`);
|
|
1314
|
+
if (!proceedAnyway) {
|
|
1315
|
+
throw new AbortedError();
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
};
|
|
1243
1319
|
const upgrade = async (options) => {
|
|
1244
1320
|
const timer = timerFactory();
|
|
1245
1321
|
const { logger, codemodsTarget } = options;
|
|
@@ -1251,22 +1327,34 @@ const upgrade = async (options) => {
|
|
|
1251
1327
|
`The "${options.target}" upgrade can only be run on a Strapi project; for plugins, please use "codemods".`
|
|
1252
1328
|
);
|
|
1253
1329
|
}
|
|
1330
|
+
logger.debug(
|
|
1331
|
+
`Application: VERSION=${version(project.packageJSON.version)}; STRAPI_VERSION=${version(project.strapiVersion)}`
|
|
1332
|
+
);
|
|
1254
1333
|
const npmPackage = npmPackageFactory(STRAPI_PACKAGE_NAME);
|
|
1255
1334
|
await npmPackage.refresh();
|
|
1256
1335
|
const upgrader = upgraderFactory(project, options.target, npmPackage).dry(options.dry ?? false).onConfirm(options.confirm ?? null).setLogger(logger);
|
|
1257
1336
|
if (codemodsTarget !== void 0) {
|
|
1258
1337
|
upgrader.overrideCodemodsTarget(codemodsTarget);
|
|
1259
1338
|
}
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
}
|
|
1263
|
-
upgrader.addRequirement(REQUIRE_GIT.asOptional());
|
|
1339
|
+
await runUpgradePrompts(upgrader, options);
|
|
1340
|
+
addUpgradeRequirements(upgrader, options);
|
|
1264
1341
|
const upgradeReport = await upgrader.upgrade();
|
|
1265
1342
|
if (!upgradeReport.success) {
|
|
1266
1343
|
throw upgradeReport.error;
|
|
1267
1344
|
}
|
|
1268
1345
|
timer.stop();
|
|
1269
|
-
logger.info(`Completed in ${durationMs(timer.elapsedMs)}`);
|
|
1346
|
+
logger.info(`Completed in ${durationMs(timer.elapsedMs)}ms`);
|
|
1347
|
+
};
|
|
1348
|
+
const runUpgradePrompts = async (upgrader, options) => {
|
|
1349
|
+
if (options.target === ReleaseType.Latest) {
|
|
1350
|
+
await latest(upgrader, options);
|
|
1351
|
+
}
|
|
1352
|
+
};
|
|
1353
|
+
const addUpgradeRequirements = (upgrader, options) => {
|
|
1354
|
+
if (options.target === ReleaseType.Major) {
|
|
1355
|
+
upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
|
|
1356
|
+
}
|
|
1357
|
+
upgrader.addRequirement(REQUIRE_GIT.asOptional());
|
|
1270
1358
|
};
|
|
1271
1359
|
const resolvePath = (cwd) => path$1.resolve(cwd ?? process.cwd());
|
|
1272
1360
|
const getRangeFromTarget = (currentVersion, target) => {
|
|
@@ -1275,6 +1363,8 @@ const getRangeFromTarget = (currentVersion, target) => {
|
|
|
1275
1363
|
}
|
|
1276
1364
|
const { major, minor, patch } = currentVersion;
|
|
1277
1365
|
switch (target) {
|
|
1366
|
+
case ReleaseType.Latest:
|
|
1367
|
+
throw new Error("Can't use <latest> to create a codemods range: not implemented");
|
|
1278
1368
|
case ReleaseType.Major:
|
|
1279
1369
|
return rangeFactory(`${major}`);
|
|
1280
1370
|
case ReleaseType.Minor:
|
|
@@ -1432,18 +1522,18 @@ const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
|
|
|
1432
1522
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1433
1523
|
const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1434
1524
|
__proto__: null,
|
|
1435
|
-
codemod: index$
|
|
1436
|
-
codemodRepository: index$
|
|
1525
|
+
codemod: index$8,
|
|
1526
|
+
codemodRepository: index$7,
|
|
1437
1527
|
error: index$9,
|
|
1438
|
-
f: index$
|
|
1528
|
+
f: index$f,
|
|
1439
1529
|
fileScanner: index$d,
|
|
1440
1530
|
logger: index$3,
|
|
1441
1531
|
project: index$a,
|
|
1442
1532
|
report: index$2,
|
|
1443
|
-
requirement: index$
|
|
1533
|
+
requirement: index$5,
|
|
1444
1534
|
runner: index$1,
|
|
1445
|
-
timer: index$
|
|
1446
|
-
upgrader: index$
|
|
1535
|
+
timer: index$g,
|
|
1536
|
+
upgrader: index$6,
|
|
1447
1537
|
version: index$e
|
|
1448
1538
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1449
1539
|
export {
|