@strapi/upgrade 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.e65c671348c825470427c509f1273497b0b4b828

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/LICENSE +19 -4
  2. package/README.md +1 -1
  3. package/dist/cli.js +13 -1451
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli.mjs +14 -0
  6. package/dist/cli.mjs.map +1 -0
  7. package/dist/index.js +9 -1428
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +4 -1420
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/modules/codemod-repository/constants.d.ts.map +1 -1
  12. package/dist/modules/error/utils.d.ts +8 -0
  13. package/dist/modules/error/utils.d.ts.map +1 -1
  14. package/dist/modules/file-scanner/scanner.d.ts.map +1 -1
  15. package/dist/modules/format/formats.d.ts +2 -1
  16. package/dist/modules/format/formats.d.ts.map +1 -1
  17. package/dist/modules/npm/package.d.ts.map +1 -1
  18. package/dist/modules/project/constants.d.ts +6 -5
  19. package/dist/modules/project/constants.d.ts.map +1 -1
  20. package/dist/modules/project/project.d.ts +16 -2
  21. package/dist/modules/project/project.d.ts.map +1 -1
  22. package/dist/modules/project/types.d.ts +3 -0
  23. package/dist/modules/project/types.d.ts.map +1 -1
  24. package/dist/modules/runner/json/transform.d.ts.map +1 -1
  25. package/dist/modules/upgrader/types.d.ts +6 -0
  26. package/dist/modules/upgrader/types.d.ts.map +1 -1
  27. package/dist/modules/upgrader/upgrader.d.ts +4 -0
  28. package/dist/modules/upgrader/upgrader.d.ts.map +1 -1
  29. package/dist/modules/version/range.d.ts.map +1 -1
  30. package/dist/modules/version/types.d.ts +2 -1
  31. package/dist/modules/version/types.d.ts.map +1 -1
  32. package/dist/package.json.js +6 -0
  33. package/dist/package.json.js.map +1 -0
  34. package/dist/package.json.mjs +4 -0
  35. package/dist/package.json.mjs.map +1 -0
  36. package/dist/src/cli/commands/codemods.js +121 -0
  37. package/dist/src/cli/commands/codemods.js.map +1 -0
  38. package/dist/src/cli/commands/codemods.mjs +117 -0
  39. package/dist/src/cli/commands/codemods.mjs.map +1 -0
  40. package/dist/src/cli/commands/upgrade.js +99 -0
  41. package/dist/src/cli/commands/upgrade.js.map +1 -0
  42. package/dist/src/cli/commands/upgrade.mjs +96 -0
  43. package/dist/src/cli/commands/upgrade.mjs.map +1 -0
  44. package/dist/src/cli/errors.js +18 -0
  45. package/dist/src/cli/errors.js.map +1 -0
  46. package/dist/src/cli/errors.mjs +16 -0
  47. package/dist/src/cli/errors.mjs.map +1 -0
  48. package/dist/src/cli/options.js +26 -0
  49. package/dist/src/cli/options.js.map +1 -0
  50. package/dist/src/cli/options.mjs +19 -0
  51. package/dist/src/cli/options.mjs.map +1 -0
  52. package/dist/src/modules/codemod/codemod.js +44 -0
  53. package/dist/src/modules/codemod/codemod.js.map +1 -0
  54. package/dist/src/modules/codemod/codemod.mjs +41 -0
  55. package/dist/src/modules/codemod/codemod.mjs.map +1 -0
  56. package/dist/src/modules/codemod/constants.js +17 -0
  57. package/dist/src/modules/codemod/constants.js.map +1 -0
  58. package/dist/src/modules/codemod/constants.mjs +11 -0
  59. package/dist/src/modules/codemod/constants.mjs.map +1 -0
  60. package/dist/src/modules/codemod/index.js +10 -0
  61. package/dist/src/modules/codemod/index.js.map +1 -0
  62. package/dist/src/modules/codemod/index.mjs +4 -0
  63. package/dist/src/modules/codemod/index.mjs.map +1 -0
  64. package/dist/src/modules/codemod-repository/constants.js +9 -0
  65. package/dist/src/modules/codemod-repository/constants.js.map +1 -0
  66. package/dist/src/modules/codemod-repository/constants.mjs +7 -0
  67. package/dist/src/modules/codemod-repository/constants.mjs.map +1 -0
  68. package/dist/src/modules/codemod-repository/index.js +10 -0
  69. package/dist/src/modules/codemod-repository/index.js.map +1 -0
  70. package/dist/src/modules/codemod-repository/index.mjs +4 -0
  71. package/dist/src/modules/codemod-repository/index.mjs.map +1 -0
  72. package/dist/src/modules/codemod-repository/repository.js +127 -0
  73. package/dist/src/modules/codemod-repository/repository.js.map +1 -0
  74. package/dist/src/modules/codemod-repository/repository.mjs +123 -0
  75. package/dist/src/modules/codemod-repository/repository.mjs.map +1 -0
  76. package/dist/src/modules/codemod-runner/codemod-runner.js +113 -0
  77. package/dist/src/modules/codemod-runner/codemod-runner.js.map +1 -0
  78. package/dist/src/modules/codemod-runner/codemod-runner.mjs +110 -0
  79. package/dist/src/modules/codemod-runner/codemod-runner.mjs.map +1 -0
  80. package/dist/src/modules/error/index.js +11 -0
  81. package/dist/src/modules/error/index.js.map +1 -0
  82. package/dist/src/modules/error/index.mjs +2 -0
  83. package/dist/src/modules/error/index.mjs.map +1 -0
  84. package/dist/src/modules/error/utils.js +33 -0
  85. package/dist/src/modules/error/utils.js.map +1 -0
  86. package/dist/src/modules/error/utils.mjs +28 -0
  87. package/dist/src/modules/error/utils.mjs.map +1 -0
  88. package/dist/src/modules/file-scanner/index.js +8 -0
  89. package/dist/src/modules/file-scanner/index.js.map +1 -0
  90. package/dist/src/modules/file-scanner/index.mjs +2 -0
  91. package/dist/src/modules/file-scanner/index.mjs.map +1 -0
  92. package/dist/src/modules/file-scanner/scanner.js +23 -0
  93. package/dist/src/modules/file-scanner/scanner.js.map +1 -0
  94. package/dist/src/modules/file-scanner/scanner.mjs +20 -0
  95. package/dist/src/modules/file-scanner/scanner.mjs.map +1 -0
  96. package/dist/src/modules/format/formats.js +107 -0
  97. package/dist/src/modules/format/formats.js.map +1 -0
  98. package/dist/src/modules/format/formats.mjs +94 -0
  99. package/dist/src/modules/format/formats.mjs.map +1 -0
  100. package/dist/src/modules/format/index.js +19 -0
  101. package/dist/src/modules/format/index.js.map +1 -0
  102. package/dist/src/modules/format/index.mjs +2 -0
  103. package/dist/src/modules/format/index.mjs.map +1 -0
  104. package/dist/src/modules/index.js +32 -0
  105. package/dist/src/modules/index.js.map +1 -0
  106. package/dist/src/modules/index.mjs +27 -0
  107. package/dist/src/modules/index.mjs.map +1 -0
  108. package/dist/src/modules/json/file.js +16 -0
  109. package/dist/src/modules/json/file.js.map +1 -0
  110. package/dist/src/modules/json/file.mjs +13 -0
  111. package/dist/src/modules/json/file.mjs.map +1 -0
  112. package/dist/src/modules/json/transform-api.js +38 -0
  113. package/dist/src/modules/json/transform-api.js.map +1 -0
  114. package/dist/src/modules/json/transform-api.mjs +35 -0
  115. package/dist/src/modules/json/transform-api.mjs.map +1 -0
  116. package/dist/src/modules/logger/index.js +8 -0
  117. package/dist/src/modules/logger/index.js.map +1 -0
  118. package/dist/src/modules/logger/index.mjs +2 -0
  119. package/dist/src/modules/logger/index.mjs.map +1 -0
  120. package/dist/src/modules/logger/logger.js +76 -0
  121. package/dist/src/modules/logger/logger.js.map +1 -0
  122. package/dist/src/modules/logger/logger.mjs +73 -0
  123. package/dist/src/modules/logger/logger.mjs.map +1 -0
  124. package/dist/src/modules/npm/constants.js +6 -0
  125. package/dist/src/modules/npm/constants.js.map +1 -0
  126. package/dist/src/modules/npm/constants.mjs +4 -0
  127. package/dist/src/modules/npm/constants.mjs.map +1 -0
  128. package/dist/src/modules/npm/package.js +61 -0
  129. package/dist/src/modules/npm/package.js.map +1 -0
  130. package/dist/src/modules/npm/package.mjs +58 -0
  131. package/dist/src/modules/npm/package.mjs.map +1 -0
  132. package/dist/src/modules/project/constants.js +45 -0
  133. package/dist/src/modules/project/constants.js.map +1 -0
  134. package/dist/src/modules/project/constants.mjs +35 -0
  135. package/dist/src/modules/project/constants.mjs.map +1 -0
  136. package/dist/src/modules/project/index.js +15 -0
  137. package/dist/src/modules/project/index.js.map +1 -0
  138. package/dist/src/modules/project/index.mjs +5 -0
  139. package/dist/src/modules/project/index.mjs.map +1 -0
  140. package/dist/src/modules/project/project.js +208 -0
  141. package/dist/src/modules/project/project.js.map +1 -0
  142. package/dist/src/modules/project/project.mjs +203 -0
  143. package/dist/src/modules/project/project.mjs.map +1 -0
  144. package/dist/src/modules/project/utils.js +26 -0
  145. package/dist/src/modules/project/utils.js.map +1 -0
  146. package/dist/src/modules/project/utils.mjs +21 -0
  147. package/dist/src/modules/project/utils.mjs.map +1 -0
  148. package/dist/src/modules/report/index.js +9 -0
  149. package/dist/src/modules/report/index.js.map +1 -0
  150. package/dist/src/modules/report/index.mjs +2 -0
  151. package/dist/src/modules/report/index.mjs.map +1 -0
  152. package/dist/src/modules/report/report.js +13 -0
  153. package/dist/src/modules/report/report.js.map +1 -0
  154. package/dist/src/modules/report/report.mjs +10 -0
  155. package/dist/src/modules/report/report.mjs.map +1 -0
  156. package/dist/src/modules/requirement/index.js +8 -0
  157. package/dist/src/modules/requirement/index.js.map +1 -0
  158. package/dist/src/modules/requirement/index.mjs +2 -0
  159. package/dist/src/modules/requirement/index.mjs.map +1 -0
  160. package/dist/src/modules/requirement/requirement.js +55 -0
  161. package/dist/src/modules/requirement/requirement.js.map +1 -0
  162. package/dist/src/modules/requirement/requirement.mjs +52 -0
  163. package/dist/src/modules/requirement/requirement.mjs.map +1 -0
  164. package/dist/src/modules/runner/code/code.js +21 -0
  165. package/dist/src/modules/runner/code/code.js.map +1 -0
  166. package/dist/src/modules/runner/code/code.mjs +18 -0
  167. package/dist/src/modules/runner/code/code.mjs.map +1 -0
  168. package/dist/src/modules/runner/code/index.js +8 -0
  169. package/dist/src/modules/runner/code/index.js.map +1 -0
  170. package/dist/src/modules/runner/code/index.mjs +2 -0
  171. package/dist/src/modules/runner/code/index.mjs.map +1 -0
  172. package/dist/src/modules/runner/index.js +10 -0
  173. package/dist/src/modules/runner/index.js.map +1 -0
  174. package/dist/src/modules/runner/index.mjs +5 -0
  175. package/dist/src/modules/runner/index.mjs.map +1 -0
  176. package/dist/src/modules/runner/json/index.js +8 -0
  177. package/dist/src/modules/runner/json/index.js.map +1 -0
  178. package/dist/src/modules/runner/json/index.mjs +2 -0
  179. package/dist/src/modules/runner/json/index.mjs.map +1 -0
  180. package/dist/src/modules/runner/json/json.js +21 -0
  181. package/dist/src/modules/runner/json/json.js.map +1 -0
  182. package/dist/src/modules/runner/json/json.mjs +18 -0
  183. package/dist/src/modules/runner/json/json.mjs.map +1 -0
  184. package/dist/src/modules/runner/json/transform.js +85 -0
  185. package/dist/src/modules/runner/json/transform.js.map +1 -0
  186. package/dist/src/modules/runner/json/transform.mjs +83 -0
  187. package/dist/src/modules/runner/json/transform.mjs.map +1 -0
  188. package/dist/src/modules/runner/runner.js +22 -0
  189. package/dist/src/modules/runner/runner.js.map +1 -0
  190. package/dist/src/modules/runner/runner.mjs +20 -0
  191. package/dist/src/modules/runner/runner.mjs.map +1 -0
  192. package/dist/src/modules/timer/constants.js +6 -0
  193. package/dist/src/modules/timer/constants.js.map +1 -0
  194. package/dist/src/modules/timer/constants.mjs +4 -0
  195. package/dist/src/modules/timer/constants.mjs.map +1 -0
  196. package/dist/src/modules/timer/index.js +10 -0
  197. package/dist/src/modules/timer/index.js.map +1 -0
  198. package/dist/src/modules/timer/index.mjs +4 -0
  199. package/dist/src/modules/timer/index.mjs.map +1 -0
  200. package/dist/src/modules/timer/timer.js +33 -0
  201. package/dist/src/modules/timer/timer.js.map +1 -0
  202. package/dist/src/modules/timer/timer.mjs +30 -0
  203. package/dist/src/modules/timer/timer.mjs.map +1 -0
  204. package/dist/src/modules/upgrader/constants.js +6 -0
  205. package/dist/src/modules/upgrader/constants.js.map +1 -0
  206. package/dist/src/modules/upgrader/constants.mjs +4 -0
  207. package/dist/src/modules/upgrader/constants.mjs.map +1 -0
  208. package/dist/src/modules/upgrader/index.js +10 -0
  209. package/dist/src/modules/upgrader/index.js.map +1 -0
  210. package/dist/src/modules/upgrader/index.mjs +4 -0
  211. package/dist/src/modules/upgrader/index.mjs.map +1 -0
  212. package/dist/src/modules/upgrader/upgrader.js +266 -0
  213. package/dist/src/modules/upgrader/upgrader.js.map +1 -0
  214. package/dist/src/modules/upgrader/upgrader.mjs +263 -0
  215. package/dist/src/modules/upgrader/upgrader.mjs.map +1 -0
  216. package/dist/src/modules/version/index.js +20 -0
  217. package/dist/src/modules/version/index.js.map +1 -0
  218. package/dist/src/modules/version/index.mjs +5 -0
  219. package/dist/src/modules/version/index.mjs.map +1 -0
  220. package/dist/src/modules/version/range.js +81 -0
  221. package/dist/src/modules/version/range.js.map +1 -0
  222. package/dist/src/modules/version/range.mjs +75 -0
  223. package/dist/src/modules/version/range.mjs.map +1 -0
  224. package/dist/src/modules/version/semver.js +26 -0
  225. package/dist/src/modules/version/semver.js.map +1 -0
  226. package/dist/src/modules/version/semver.mjs +20 -0
  227. package/dist/src/modules/version/semver.mjs.map +1 -0
  228. package/dist/src/modules/version/types.js +12 -0
  229. package/dist/src/modules/version/types.js.map +1 -0
  230. package/dist/src/modules/version/types.mjs +12 -0
  231. package/dist/src/modules/version/types.mjs.map +1 -0
  232. package/dist/src/tasks/codemods/list-codemods.js +40 -0
  233. package/dist/src/tasks/codemods/list-codemods.js.map +1 -0
  234. package/dist/src/tasks/codemods/list-codemods.mjs +38 -0
  235. package/dist/src/tasks/codemods/list-codemods.mjs.map +1 -0
  236. package/dist/src/tasks/codemods/run-codemods.js +36 -0
  237. package/dist/src/tasks/codemods/run-codemods.js.map +1 -0
  238. package/dist/src/tasks/codemods/run-codemods.mjs +34 -0
  239. package/dist/src/tasks/codemods/run-codemods.mjs.map +1 -0
  240. package/dist/src/tasks/codemods/utils.js +54 -0
  241. package/dist/src/tasks/codemods/utils.js.map +1 -0
  242. package/dist/src/tasks/codemods/utils.mjs +50 -0
  243. package/dist/src/tasks/codemods/utils.mjs.map +1 -0
  244. package/dist/src/tasks/index.js +15 -0
  245. package/dist/src/tasks/index.js.map +1 -0
  246. package/dist/src/tasks/index.mjs +7 -0
  247. package/dist/src/tasks/index.mjs.map +1 -0
  248. package/dist/src/tasks/upgrade/prompts/latest.js +48 -0
  249. package/dist/src/tasks/upgrade/prompts/latest.js.map +1 -0
  250. package/dist/src/tasks/upgrade/prompts/latest.mjs +46 -0
  251. package/dist/src/tasks/upgrade/prompts/latest.mjs.map +1 -0
  252. package/dist/src/tasks/upgrade/requirements/common.js +40 -0
  253. package/dist/src/tasks/upgrade/requirements/common.js.map +1 -0
  254. package/dist/src/tasks/upgrade/requirements/common.mjs +35 -0
  255. package/dist/src/tasks/upgrade/requirements/common.mjs.map +1 -0
  256. package/dist/src/tasks/upgrade/requirements/major.js +29 -0
  257. package/dist/src/tasks/upgrade/requirements/major.js.map +1 -0
  258. package/dist/src/tasks/upgrade/requirements/major.mjs +26 -0
  259. package/dist/src/tasks/upgrade/requirements/major.mjs.map +1 -0
  260. package/dist/src/tasks/upgrade/upgrade.js +69 -0
  261. package/dist/src/tasks/upgrade/upgrade.js.map +1 -0
  262. package/dist/src/tasks/upgrade/upgrade.mjs +67 -0
  263. package/dist/src/tasks/upgrade/upgrade.mjs.map +1 -0
  264. package/dist/tasks/codemods/utils.d.ts.map +1 -1
  265. package/dist/tasks/upgrade/prompts/index.d.ts +2 -0
  266. package/dist/tasks/upgrade/prompts/index.d.ts.map +1 -0
  267. package/dist/tasks/upgrade/prompts/latest.d.ts +9 -0
  268. package/dist/tasks/upgrade/prompts/latest.d.ts.map +1 -0
  269. package/dist/tasks/upgrade/requirements/major.d.ts.map +1 -1
  270. package/dist/tasks/upgrade/upgrade.d.ts.map +1 -1
  271. package/package.json +15 -14
  272. package/resources/codemods/5.0.0/comment-out-lifecycle-files.code.ts +63 -0
  273. package/resources/codemods/5.0.0/dependency-upgrade-react-and-react-dom.json.ts +67 -0
  274. package/resources/codemods/5.0.0/dependency-upgrade-styled-components.json.ts +49 -0
  275. package/resources/codemods/5.0.0/deprecate-helper-plugin.code.ts +192 -0
  276. package/resources/codemods/5.0.0/sqlite3-to-better-sqlite3.json.ts +0 -1
  277. package/resources/codemods/5.1.0/dependency-better-sqlite3.json.ts +48 -0
  278. package/resources/utils/change-import.ts +118 -0
  279. package/resources/utils/replace-jsx.ts +49 -0
package/dist/index.mjs CHANGED
@@ -1,1421 +1,5 @@
1
- import path$1 from "node:path";
2
- import simpleGit from "simple-git";
3
- import chalk from "chalk";
4
- 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
- import fse from "fs-extra";
8
- import assert from "node:assert";
9
- import { glob } from "glob";
10
- import { run } from "jscodeshift/src/Runner";
11
- import { register } from "esbuild-register/dist/node";
12
- import CliTable3 from "cli-table3";
13
- class Requirement {
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
- );
126
- class Timer {
127
- interval;
128
- constructor() {
129
- this.reset();
130
- }
131
- get elapsedMs() {
132
- const { start, end } = this.interval;
133
- return end ? end - start : Date.now() - start;
134
- }
135
- get end() {
136
- return this.interval.end;
137
- }
138
- get start() {
139
- return this.interval.start;
140
- }
141
- stop() {
142
- this.interval.end = Date.now();
143
- return this.elapsedMs;
144
- }
145
- reset() {
146
- this.interval = { start: Date.now(), end: null };
147
- return this;
148
- }
149
- }
150
- const timerFactory = () => new Timer();
151
- const ONE_SECOND_MS = 1e3;
152
- const constants$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
153
- __proto__: null,
154
- ONE_SECOND_MS
155
- }, Symbol.toStringTag, { value: "Module" }));
156
- const index$f = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
157
- __proto__: null,
158
- constants: constants$4,
159
- timerFactory
160
- }, Symbol.toStringTag, { value: "Module" }));
161
- class JSONTransformAPI {
162
- json;
163
- constructor(json) {
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());
195
- };
196
- const saveJSON = async (path2, json) => {
197
- const jsonAsString = `${JSON.stringify(json, null, 2)}
198
- `;
199
- await fse.writeFile(path2, jsonAsString);
200
- };
201
- var ReleaseType = /* @__PURE__ */ ((ReleaseType2) => {
202
- ReleaseType2["Major"] = "major";
203
- ReleaseType2["Minor"] = "minor";
204
- ReleaseType2["Patch"] = "patch";
205
- return ReleaseType2;
206
- })(ReleaseType || {});
207
- const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
208
- __proto__: null,
209
- ReleaseType
210
- }, Symbol.toStringTag, { value: "Module" }));
211
- const semVerFactory = (version2) => {
212
- return new semver.SemVer(version2);
213
- };
214
- const isLiteralSemVer = (str) => {
215
- const tokens = str.split(".");
216
- return tokens.length === 3 && tokens.every((token) => !Number.isNaN(+token) && Number.isInteger(+token));
217
- };
218
- const isValidSemVer = (str) => semver.valid(str) !== null;
219
- const isSemverInstance = (value) => {
220
- return value instanceof semver.SemVer;
221
- };
222
- const isSemVerReleaseType = (str) => {
223
- return Object.values(ReleaseType).includes(str);
224
- };
225
- const rangeFactory = (range) => {
226
- return new semver.Range(range);
227
- };
228
- const rangeFromReleaseType = (current, identifier) => {
229
- switch (identifier) {
230
- case ReleaseType.Major: {
231
- const nextMajor = semver.inc(current, "major");
232
- return rangeFactory(`>${current.raw} <=${nextMajor}`);
233
- }
234
- case ReleaseType.Patch: {
235
- const minor = semver.inc(current, "minor");
236
- return rangeFactory(`>${current.raw} <${minor}`);
237
- }
238
- case ReleaseType.Minor: {
239
- const major = semver.inc(current, "major");
240
- return rangeFactory(`>${current.raw} <${major}`);
241
- }
242
- default: {
243
- throw new Error("Not implemented");
244
- }
245
- }
246
- };
247
- const rangeFromVersions = (currentVersion, target) => {
248
- if (isSemverInstance(target)) {
249
- return rangeFactory(`>${currentVersion.raw} <=${target.raw}`);
250
- }
251
- if (isSemVerReleaseType(target)) {
252
- return rangeFromReleaseType(currentVersion, target);
253
- }
254
- throw new Error(`Invalid target set: ${target}`);
255
- };
256
- const isValidStringifiedRange = (str) => semver.validRange(str) !== null;
257
- const isRangeInstance = (range) => {
258
- return range instanceof semver.Range;
259
- };
260
- const index$e = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
261
- __proto__: null,
262
- Version: types,
263
- isLiteralSemVer,
264
- isRangeInstance,
265
- isSemVerReleaseType,
266
- isSemverInstance,
267
- isValidSemVer,
268
- isValidStringifiedRange,
269
- rangeFactory,
270
- rangeFromReleaseType,
271
- rangeFromVersions,
272
- semVerFactory
273
- }, Symbol.toStringTag, { value: "Module" }));
274
- class FileScanner {
275
- cwd;
276
- constructor(cwd) {
277
- this.cwd = cwd;
278
- }
279
- scan(patterns) {
280
- const filenames = glob.sync(patterns, { cwd: this.cwd });
281
- return filenames.map((filename) => path$1.join(this.cwd, filename));
282
- }
283
- }
284
- const fileScannerFactory = (cwd) => new FileScanner(cwd);
285
- const index$d = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
286
- __proto__: null,
287
- fileScannerFactory
288
- }, Symbol.toStringTag, { value: "Module" }));
289
- class AbstractRunner {
290
- paths;
291
- configuration;
292
- constructor(paths, configuration) {
293
- this.paths = paths;
294
- this.configuration = configuration;
295
- }
296
- async run(codemod, configuration) {
297
- const isValidCodemod = this.valid(codemod);
298
- if (!isValidCodemod) {
299
- throw new Error(`Invalid codemod provided to the runner: ${codemod.filename}`);
300
- }
301
- const runConfiguration = { ...this.configuration, ...configuration };
302
- return this.runner(codemod.path, this.paths, runConfiguration);
303
- }
304
- }
305
- class CodeRunner extends AbstractRunner {
306
- runner = run;
307
- valid(codemod) {
308
- return codemod.kind === "code";
309
- }
310
- }
311
- const codeRunnerFactory = (paths, configuration) => {
312
- return new CodeRunner(paths, configuration);
313
- };
314
- const index$c = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
315
- __proto__: null,
316
- codeRunnerFactory
317
- }, Symbol.toStringTag, { value: "Module" }));
318
- const transformJSON = async (codemodPath, paths, config) => {
319
- const { dry } = config;
320
- const startTime = process.hrtime();
321
- const report = {
322
- ok: 0,
323
- nochange: 0,
324
- skip: 0,
325
- error: 0,
326
- timeElapsed: "",
327
- stats: {}
328
- };
329
- const esbuildOptions = { extensions: [".js", ".mjs", ".ts"] };
330
- const { unregister } = register(esbuildOptions);
331
- const module = require(codemodPath);
332
- unregister();
333
- const codemod = typeof module.default === "function" ? module.default : module;
334
- assert(typeof codemod === "function", `Codemod must be a function. Found ${typeof codemod}`);
335
- for (const path2 of paths) {
336
- try {
337
- const json = await readJSON(path2);
338
- assert(typeof json === "object" && !Array.isArray(json) && json !== null);
339
- const file = { path: path2, json };
340
- const params = { cwd: config.cwd, json: createJSONTransformAPI };
341
- const out = await codemod(file, params);
342
- if (out === void 0) {
343
- report.error += 1;
344
- } else if (!isEqual(json, out)) {
345
- if (!dry) {
346
- await saveJSON(path2, out);
347
- }
348
- report.ok += 1;
349
- } else {
350
- report.nochange += 1;
351
- }
352
- } catch {
353
- report.error += 1;
354
- }
355
- }
356
- const endTime = process.hrtime(startTime);
357
- report.timeElapsed = (endTime[0] + endTime[1] / 1e9).toFixed(3);
358
- return report;
359
- };
360
- class JSONRunner extends AbstractRunner {
361
- runner = transformJSON;
362
- valid(codemod) {
363
- return codemod.kind === "json";
364
- }
365
- }
366
- const jsonRunnerFactory = (paths, configuration) => {
367
- return new JSONRunner(paths, configuration);
368
- };
369
- const index$b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
370
- __proto__: null,
371
- jsonRunnerFactory
372
- }, Symbol.toStringTag, { value: "Module" }));
373
- const PROJECT_PACKAGE_JSON = "package.json";
374
- const PROJECT_DEFAULT_ALLOWED_ROOT_PATHS = ["src", "config", "public"];
375
- const PROJECT_DEFAULT_CODE_EXTENSIONS = [
376
- // Source files
377
- "js",
378
- "mjs",
379
- "ts",
380
- // React files
381
- "jsx",
382
- "tsx"
383
- ];
384
- const PROJECT_DEFAULT_JSON_EXTENSIONS = ["json"];
385
- const PROJECT_DEFAULT_ALLOWED_EXTENSIONS = [
386
- ...PROJECT_DEFAULT_CODE_EXTENSIONS,
387
- ...PROJECT_DEFAULT_JSON_EXTENSIONS
388
- ];
389
- const PROJECT_DEFAULT_PATTERNS = ["package.json"];
390
- const SCOPED_STRAPI_PACKAGE_PREFIX = "@strapi/";
391
- const STRAPI_DEPENDENCY_NAME = `${SCOPED_STRAPI_PACKAGE_PREFIX}strapi`;
392
- const constants$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
393
- __proto__: null,
394
- PROJECT_DEFAULT_ALLOWED_EXTENSIONS,
395
- PROJECT_DEFAULT_ALLOWED_ROOT_PATHS,
396
- PROJECT_DEFAULT_CODE_EXTENSIONS,
397
- PROJECT_DEFAULT_JSON_EXTENSIONS,
398
- PROJECT_DEFAULT_PATTERNS,
399
- PROJECT_PACKAGE_JSON,
400
- SCOPED_STRAPI_PACKAGE_PREFIX,
401
- STRAPI_DEPENDENCY_NAME
402
- }, Symbol.toStringTag, { value: "Module" }));
403
- class Project {
404
- cwd;
405
- // The following properties are assigned during the .refresh() call in the constructor.
406
- files;
407
- packageJSONPath;
408
- packageJSON;
409
- constructor(cwd) {
410
- if (!fse.pathExistsSync(cwd)) {
411
- throw new Error(`ENOENT: no such file or directory, access '${cwd}'`);
412
- }
413
- this.cwd = cwd;
414
- this.refresh();
415
- }
416
- getFilesByExtensions(extensions) {
417
- return this.files.filter((filePath) => {
418
- const fileExtension = path$1.extname(filePath);
419
- return extensions.includes(fileExtension);
420
- });
421
- }
422
- refresh() {
423
- this.refreshPackageJSON();
424
- this.refreshProjectFiles();
425
- return this;
426
- }
427
- async runCodemods(codemods, options) {
428
- const runners = this.createProjectCodemodsRunners(options.dry);
429
- const reports2 = [];
430
- for (const codemod of codemods) {
431
- for (const runner of runners) {
432
- if (runner.valid(codemod)) {
433
- const report = await runner.run(codemod);
434
- reports2.push({ codemod, report });
435
- }
436
- }
437
- }
438
- return reports2;
439
- }
440
- createProjectCodemodsRunners(dry = false) {
441
- const jsonExtensions = PROJECT_DEFAULT_JSON_EXTENSIONS.map(
442
- (ext) => `.${ext}`
443
- );
444
- const codeExtensions = PROJECT_DEFAULT_CODE_EXTENSIONS.map(
445
- (ext) => `.${ext}`
446
- );
447
- const jsonFiles = this.getFilesByExtensions(jsonExtensions);
448
- const codeFiles = this.getFilesByExtensions(codeExtensions);
449
- const codeRunner = codeRunnerFactory(codeFiles, {
450
- dry,
451
- parser: "ts",
452
- runInBand: true,
453
- babel: true,
454
- extensions: PROJECT_DEFAULT_CODE_EXTENSIONS.join(","),
455
- // Don't output any log coming from the runner
456
- print: false,
457
- silent: true,
458
- verbose: 0
459
- });
460
- const jsonRunner = jsonRunnerFactory(jsonFiles, { dry, cwd: this.cwd });
461
- return [codeRunner, jsonRunner];
462
- }
463
- refreshPackageJSON() {
464
- const packageJSONPath = path$1.join(this.cwd, PROJECT_PACKAGE_JSON);
465
- try {
466
- fse.accessSync(packageJSONPath);
467
- } catch {
468
- throw new Error(`Could not find a ${PROJECT_PACKAGE_JSON} file in ${this.cwd}`);
469
- }
470
- const packageJSONBuffer = fse.readFileSync(packageJSONPath);
471
- this.packageJSONPath = packageJSONPath;
472
- this.packageJSON = JSON.parse(packageJSONBuffer.toString());
473
- }
474
- refreshProjectFiles() {
475
- const allowedRootPaths = formatGlobCollectionPattern(
476
- PROJECT_DEFAULT_ALLOWED_ROOT_PATHS
477
- );
478
- const allowedExtensions = formatGlobCollectionPattern(
479
- PROJECT_DEFAULT_ALLOWED_EXTENSIONS
480
- );
481
- const projectFilesPattern = `./${allowedRootPaths}/**/*.${allowedExtensions}`;
482
- const patterns = [projectFilesPattern, ...PROJECT_DEFAULT_PATTERNS];
483
- const scanner = fileScannerFactory(this.cwd);
484
- this.files = scanner.scan(patterns);
485
- }
486
- }
487
- class AppProject extends Project {
488
- strapiVersion;
489
- type = "application";
490
- constructor(cwd) {
491
- super(cwd);
492
- this.refreshStrapiVersion();
493
- }
494
- refresh() {
495
- super.refresh();
496
- this.refreshStrapiVersion();
497
- return this;
498
- }
499
- refreshStrapiVersion() {
500
- this.strapiVersion = // First try to get the strapi version from the package.json dependencies
501
- this.findStrapiVersionFromProjectPackageJSON() ?? // If the version found is not a valid SemVer, get the Strapi version from the installed package
502
- this.findLocallyInstalledStrapiVersion();
503
- }
504
- findStrapiVersionFromProjectPackageJSON() {
505
- const projectName = this.packageJSON.name;
506
- const version2 = this.packageJSON.dependencies?.[STRAPI_DEPENDENCY_NAME];
507
- if (version2 === void 0) {
508
- throw new Error(
509
- `No version of ${STRAPI_DEPENDENCY_NAME} was found in ${projectName}. Are you in a valid Strapi project?`
510
- );
511
- }
512
- const isValidSemVer2 = isLiteralSemVer(version2) && semver.valid(version2) === version2;
513
- return isValidSemVer2 ? semVerFactory(version2) : void 0;
514
- }
515
- findLocallyInstalledStrapiVersion() {
516
- const packageSearchText = `${STRAPI_DEPENDENCY_NAME}/package.json`;
517
- let strapiPackageJSONPath;
518
- let strapiPackageJSON;
519
- try {
520
- strapiPackageJSONPath = require.resolve(packageSearchText, { paths: [this.cwd] });
521
- strapiPackageJSON = require(strapiPackageJSONPath);
522
- assert(typeof strapiPackageJSON === "object");
523
- } catch {
524
- throw new Error(
525
- `Cannot resolve module "${STRAPI_DEPENDENCY_NAME}" from paths [${this.cwd}]`
526
- );
527
- }
528
- const strapiVersion = strapiPackageJSON.version;
529
- if (!isValidSemVer(strapiVersion)) {
530
- throw new Error(
531
- `Invalid ${STRAPI_DEPENDENCY_NAME} version found in ${strapiPackageJSONPath} (${strapiVersion})`
532
- );
533
- }
534
- return semVerFactory(strapiVersion);
535
- }
536
- }
537
- const formatGlobCollectionPattern = (collection) => {
538
- assert(
539
- collection.length > 0,
540
- "Invalid pattern provided, the given collection needs at least 1 element"
541
- );
542
- return collection.length === 1 ? collection[0] : `{${collection}}`;
543
- };
544
- class PluginProject extends Project {
545
- type = "plugin";
546
- }
547
- const isPlugin = (cwd) => {
548
- const packageJSONPath = path$1.join(cwd, PROJECT_PACKAGE_JSON);
549
- try {
550
- fse.accessSync(packageJSONPath);
551
- } catch {
552
- throw new Error(`Could not find a ${PROJECT_PACKAGE_JSON} file in ${cwd}`);
553
- }
554
- const packageJSONBuffer = fse.readFileSync(packageJSONPath);
555
- const packageJSON = JSON.parse(packageJSONBuffer.toString());
556
- return packageJSON?.strapi?.kind === "plugin";
557
- };
558
- const projectFactory = (cwd) => {
559
- fse.accessSync(cwd);
560
- if (isPlugin(cwd)) {
561
- return new PluginProject(cwd);
562
- }
563
- return new AppProject(cwd);
564
- };
565
- const isPluginProject = (project) => {
566
- return project instanceof PluginProject;
567
- };
568
- function assertPluginProject(project) {
569
- if (!isPluginProject(project)) {
570
- throw new Error("Project is not a plugin");
571
- }
572
- }
573
- const isApplicationProject = (project) => {
574
- return project instanceof AppProject;
575
- };
576
- function assertAppProject(project) {
577
- if (!isApplicationProject(project)) {
578
- throw new Error("Project is not an application");
579
- }
580
- }
581
- const index$a = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
582
- __proto__: null,
583
- assertAppProject,
584
- assertPluginProject,
585
- constants: constants$3,
586
- isApplicationProject,
587
- isPluginProject,
588
- projectFactory
589
- }, Symbol.toStringTag, { value: "Module" }));
590
- class UnexpectedError extends Error {
591
- constructor() {
592
- super("Unexpected Error");
593
- }
594
- }
595
- const unknownToError = (e) => {
596
- if (e instanceof Error) {
597
- return e;
598
- }
599
- if (typeof e === "string") {
600
- return new Error(e);
601
- }
602
- return new UnexpectedError();
603
- };
604
- const index$9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
605
- __proto__: null,
606
- UnexpectedError,
607
- unknownToError
608
- }, Symbol.toStringTag, { value: "Module" }));
609
- const path = (path2) => chalk.blue(path2);
610
- const version = (version2) => {
611
- return chalk.italic.yellow(`v${version2}`);
612
- };
613
- const codemodUID = (uid) => {
614
- return chalk.bold.cyan(uid);
615
- };
616
- const projectType = (type) => chalk.cyan(type);
617
- const versionRange = (range) => chalk.italic.yellow(range.raw);
618
- const transform = (transformFilePath) => chalk.cyan(transformFilePath);
619
- const highlight = (arg) => chalk.bold.underline(arg);
620
- const upgradeStep = (text, step) => {
621
- return chalk.bold(`(${step[0]}/${step[1]}) ${text}...`);
622
- };
623
- const reports = (reports2) => {
624
- const rows = reports2.map(({ codemod, report }, i) => {
625
- const fIndex = chalk.grey(i);
626
- const fVersion = chalk.magenta(codemod.version);
627
- const fKind = chalk.yellow(codemod.kind);
628
- const fFormattedTransformPath = chalk.cyan(codemod.format());
629
- const fTimeElapsed = i === 0 ? `${report.timeElapsed}s ${chalk.dim.italic("(cold start)")}` : `${report.timeElapsed}s`;
630
- const fAffected = report.ok > 0 ? chalk.green(report.ok) : chalk.grey(0);
631
- const fUnchanged = report.ok === 0 ? chalk.red(report.nochange) : chalk.grey(report.nochange);
632
- return [fIndex, fVersion, fKind, fFormattedTransformPath, fAffected, fUnchanged, fTimeElapsed];
633
- });
634
- const table = new CliTable3({
635
- style: { compact: true },
636
- head: [
637
- chalk.bold.grey("N°"),
638
- chalk.bold.magenta("Version"),
639
- chalk.bold.yellow("Kind"),
640
- chalk.bold.cyan("Name"),
641
- chalk.bold.green("Affected"),
642
- chalk.bold.red("Unchanged"),
643
- chalk.bold.blue("Duration")
644
- ]
645
- });
646
- table.push(...rows);
647
- return table.toString();
648
- };
649
- const codemodList = (codemods) => {
650
- const rows = codemods.map((codemod, index2) => {
651
- const fIndex = chalk.grey(index2);
652
- const fVersion = chalk.magenta(codemod.version);
653
- const fKind = chalk.yellow(codemod.kind);
654
- const fName = chalk.blue(codemod.format());
655
- const fUID = codemodUID(codemod.uid);
656
- return [fIndex, fVersion, fKind, fName, fUID];
657
- });
658
- const table = new CliTable3({
659
- style: { compact: true },
660
- head: [
661
- chalk.bold.grey("N°"),
662
- chalk.bold.magenta("Version"),
663
- chalk.bold.yellow("Kind"),
664
- chalk.bold.blue("Name"),
665
- chalk.bold.cyan("UID")
666
- ]
667
- });
668
- table.push(...rows);
669
- return table.toString();
670
- };
671
- const durationMs = (elapsedMs) => {
672
- const elapsedSeconds = (elapsedMs / ONE_SECOND_MS).toFixed(3);
673
- return `${elapsedSeconds}s`;
674
- };
675
- const index$8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
676
- __proto__: null,
677
- codemodList,
678
- codemodUID,
679
- durationMs,
680
- highlight,
681
- path,
682
- projectType,
683
- reports,
684
- transform,
685
- upgradeStep,
686
- version,
687
- versionRange
688
- }, Symbol.toStringTag, { value: "Module" }));
689
- const CODEMOD_CODE_SUFFIX = "code";
690
- const CODEMOD_JSON_SUFFIX = "json";
691
- const CODEMOD_ALLOWED_SUFFIXES = [CODEMOD_CODE_SUFFIX, CODEMOD_JSON_SUFFIX];
692
- const CODEMOD_EXTENSION = "ts";
693
- const CODEMOD_FILE_REGEXP = new RegExp(
694
- `^.+[.](${CODEMOD_ALLOWED_SUFFIXES.join("|")})[.]${CODEMOD_EXTENSION}$`
695
- );
696
- const constants$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
697
- __proto__: null,
698
- CODEMOD_ALLOWED_SUFFIXES,
699
- CODEMOD_CODE_SUFFIX,
700
- CODEMOD_EXTENSION,
701
- CODEMOD_FILE_REGEXP,
702
- CODEMOD_JSON_SUFFIX
703
- }, Symbol.toStringTag, { value: "Module" }));
704
- class Codemod {
705
- uid;
706
- kind;
707
- version;
708
- baseDirectory;
709
- filename;
710
- path;
711
- constructor(options) {
712
- this.kind = options.kind;
713
- this.version = options.version;
714
- this.baseDirectory = options.baseDirectory;
715
- this.filename = options.filename;
716
- this.path = path$1.join(this.baseDirectory, this.version.raw, this.filename);
717
- this.uid = this.createUID();
718
- }
719
- createUID() {
720
- const name = this.format({ stripExtension: true, stripKind: true, stripHyphens: false });
721
- const kind = this.kind;
722
- const version2 = this.version.raw;
723
- return `${version2}-${name}-${kind}`;
724
- }
725
- format(options) {
726
- const { stripExtension = true, stripKind = true, stripHyphens = true } = options ?? {};
727
- let formatted = this.filename;
728
- if (stripExtension) {
729
- formatted = formatted.replace(new RegExp(`\\.${CODEMOD_EXTENSION}$`, "i"), "");
730
- }
731
- if (stripKind) {
732
- formatted = formatted.replace(`.${CODEMOD_CODE_SUFFIX}`, "").replace(`.${CODEMOD_JSON_SUFFIX}`, "");
733
- }
734
- if (stripHyphens) {
735
- formatted = formatted.replaceAll("-", " ");
736
- }
737
- return formatted;
738
- }
739
- }
740
- const codemodFactory = (options) => new Codemod(options);
741
- const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
742
- __proto__: null,
743
- codemodFactory,
744
- constants: constants$2
745
- }, Symbol.toStringTag, { value: "Module" }));
746
- const INTERNAL_CODEMODS_DIRECTORY = path$1.join(
747
- __dirname,
748
- // upgrade/dist
749
- "..",
750
- // upgrade
751
- "resources",
752
- // upgrade/resources
753
- "codemods"
754
- // upgrade/resources/codemods
755
- );
756
- const constants$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
757
- __proto__: null,
758
- INTERNAL_CODEMODS_DIRECTORY
759
- }, Symbol.toStringTag, { value: "Module" }));
760
- class CodemodRepository {
761
- groups;
762
- versions;
763
- cwd;
764
- constructor(cwd) {
765
- assert(fse.existsSync(cwd), `Invalid codemods directory provided "${cwd}"`);
766
- this.cwd = cwd;
767
- this.groups = {};
768
- this.versions = [];
769
- }
770
- refresh() {
771
- this.refreshAvailableVersions();
772
- this.refreshAvailableFiles();
773
- return this;
774
- }
775
- count(version2) {
776
- return this.findByVersion(version2).length;
777
- }
778
- versionExists(version2) {
779
- return version2.raw in this.groups;
780
- }
781
- has(uid) {
782
- const result = this.find({ uids: [uid] });
783
- if (result.length !== 1) {
784
- return false;
785
- }
786
- const { codemods } = result[0];
787
- return codemods.length === 1 && codemods[0].uid === uid;
788
- }
789
- find(q) {
790
- const entries = Object.entries(this.groups);
791
- return entries.filter(maybeFilterByRange).map(([version2, codemods]) => ({
792
- version: semVerFactory(version2),
793
- // Filter by UID if provided in the query
794
- codemods: codemods.filter(maybeFilterByUIDs)
795
- })).filter(({ codemods }) => codemods.length > 0);
796
- function maybeFilterByRange([version2]) {
797
- if (!isRangeInstance(q.range)) {
798
- return true;
799
- }
800
- return q.range.test(version2);
801
- }
802
- function maybeFilterByUIDs(codemod) {
803
- if (q.uids === void 0) {
804
- return true;
805
- }
806
- return q.uids.includes(codemod.uid);
807
- }
808
- }
809
- findByVersion(version2) {
810
- const literalVersion = version2.raw;
811
- const codemods = this.groups[literalVersion];
812
- return codemods ?? [];
813
- }
814
- findAll() {
815
- const entries = Object.entries(this.groups);
816
- return entries.map(([version2, codemods]) => ({
817
- version: semVerFactory(version2),
818
- codemods
819
- }));
820
- }
821
- refreshAvailableVersions() {
822
- this.versions = fse.readdirSync(this.cwd).filter((filename) => fse.statSync(path$1.join(this.cwd, filename)).isDirectory()).filter((filename) => semver.valid(filename) !== null).map((version2) => semVerFactory(version2)).sort(semver.compare);
823
- return this;
824
- }
825
- refreshAvailableFiles() {
826
- this.groups = {};
827
- for (const version2 of this.versions) {
828
- this.refreshAvailableFilesForVersion(version2);
829
- }
830
- }
831
- refreshAvailableFilesForVersion(version2) {
832
- const literalVersion = version2.raw;
833
- const versionDirectory = path$1.join(this.cwd, literalVersion);
834
- if (!fse.existsSync(versionDirectory)) {
835
- return;
836
- }
837
- this.groups[literalVersion] = fse.readdirSync(versionDirectory).filter((filename) => fse.statSync(path$1.join(versionDirectory, filename)).isFile()).filter((filename) => CODEMOD_FILE_REGEXP.test(filename)).map((filename) => {
838
- const kind = parseCodemodKindFromFilename(filename);
839
- const baseDirectory = this.cwd;
840
- return codemodFactory({ kind, baseDirectory, version: version2, filename });
841
- });
842
- }
843
- }
844
- const parseCodemodKindFromFilename = (filename) => {
845
- const kind = filename.split(".").at(-2);
846
- assert(kind !== void 0);
847
- assert(CODEMOD_ALLOWED_SUFFIXES.includes(kind));
848
- return kind;
849
- };
850
- const codemodRepositoryFactory = (cwd = INTERNAL_CODEMODS_DIRECTORY) => {
851
- return new CodemodRepository(cwd);
852
- };
853
- const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
854
- __proto__: null,
855
- codemodRepositoryFactory,
856
- constants: constants$1
857
- }, Symbol.toStringTag, { value: "Module" }));
858
- class CodemodRunner {
859
- project;
860
- range;
861
- isDry;
862
- logger;
863
- selectCodemodsCallback;
864
- constructor(project, range) {
865
- this.project = project;
866
- this.range = range;
867
- this.isDry = false;
868
- this.logger = null;
869
- this.selectCodemodsCallback = null;
870
- }
871
- setRange(range) {
872
- this.range = range;
873
- return this;
874
- }
875
- setLogger(logger) {
876
- this.logger = logger;
877
- return this;
878
- }
879
- onSelectCodemods(callback) {
880
- this.selectCodemodsCallback = callback;
881
- return this;
882
- }
883
- dry(enabled = true) {
884
- this.isDry = enabled;
885
- return this;
886
- }
887
- createRepository(codemodsDirectory) {
888
- const repository = codemodRepositoryFactory(
889
- codemodsDirectory ?? INTERNAL_CODEMODS_DIRECTORY
890
- );
891
- repository.refresh();
892
- return repository;
893
- }
894
- async safeRunAndReport(codemods) {
895
- if (this.isDry) {
896
- this.logger?.warn?.(
897
- "Running the codemods in dry mode. No files will be modified during the process."
898
- );
899
- }
900
- try {
901
- const reports$1 = await this.project.runCodemods(codemods, { dry: this.isDry });
902
- this.logger?.raw?.(reports(reports$1));
903
- if (!this.isDry) {
904
- const nbAffectedTotal = reports$1.flatMap((report) => report.report.ok).reduce((acc, nb) => acc + nb, 0);
905
- this.logger?.debug?.(
906
- `Successfully ran ${highlight(codemods.length)} codemod(s), ${highlight(nbAffectedTotal)} change(s) have been detected`
907
- );
908
- }
909
- return successReport$1();
910
- } catch (e) {
911
- return erroredReport$1(unknownToError(e));
912
- }
913
- }
914
- async runByUID(uid, codemodsDirectory) {
915
- const repository = this.createRepository(codemodsDirectory);
916
- if (!repository.has(uid)) {
917
- throw new Error(`Unknown codemod UID provided: ${uid}`);
918
- }
919
- const codemods = repository.find({ uids: [uid] }).flatMap(({ codemods: codemods2 }) => codemods2);
920
- return this.safeRunAndReport(codemods);
921
- }
922
- async run(codemodsDirectory) {
923
- const repository = this.createRepository(codemodsDirectory);
924
- const codemodsInRange = repository.find({ range: this.range });
925
- const selectedCodemods = this.selectCodemodsCallback ? await this.selectCodemodsCallback(codemodsInRange) : codemodsInRange;
926
- if (selectedCodemods.length === 0) {
927
- this.logger?.debug?.(`Found no codemods to run for ${versionRange(this.range)}`);
928
- return successReport$1();
929
- }
930
- const codemods = selectedCodemods.flatMap(({ codemods: codemods2 }) => codemods2);
931
- const codemodsByVersion = groupBy("version", codemods);
932
- const fRange = versionRange(this.range);
933
- this.logger?.debug?.(
934
- `Found ${highlight(codemods.length)} codemods for ${highlight(size(codemodsByVersion))} version(s) using ${fRange}`
935
- );
936
- for (const [version$1, codemods2] of Object.entries(codemodsByVersion)) {
937
- this.logger?.debug?.(`- ${version(semVerFactory(version$1))} (${codemods2.length})`);
938
- }
939
- return this.safeRunAndReport(codemods);
940
- }
941
- }
942
- const codemodRunnerFactory = (project, range) => {
943
- return new CodemodRunner(project, range);
944
- };
945
- const successReport$1 = () => ({ success: true, error: null });
946
- const erroredReport$1 = (error) => ({ success: false, error });
947
- class Upgrader {
948
- project;
949
- npmPackage;
950
- target;
951
- codemodsTarget;
952
- isDry;
953
- logger;
954
- requirements;
955
- confirmationCallback;
956
- constructor(project, target, npmPackage) {
957
- this.project = project;
958
- this.npmPackage = npmPackage;
959
- this.target = target;
960
- this.syncCodemodsTarget();
961
- this.isDry = false;
962
- this.requirements = [];
963
- this.logger = null;
964
- this.confirmationCallback = null;
965
- }
966
- setRequirements(requirements) {
967
- this.requirements = requirements;
968
- return this;
969
- }
970
- setTarget(target) {
971
- this.target = target;
972
- return this;
973
- }
974
- syncCodemodsTarget() {
975
- this.codemodsTarget = semVerFactory(
976
- `${this.target.major}.${this.target.minor}.${this.target.patch}`
977
- );
978
- this.logger?.debug?.(
979
- `The codemods target has been synced with the upgrade target. The codemod runner will now look for ${version(
980
- this.codemodsTarget
981
- )}`
982
- );
983
- return this;
984
- }
985
- overrideCodemodsTarget(target) {
986
- this.codemodsTarget = target;
987
- this.logger?.debug?.(
988
- `Overriding the codemods target. The codemod runner will now look for ${version(target)}`
989
- );
990
- return this;
991
- }
992
- setLogger(logger) {
993
- this.logger = logger;
994
- return this;
995
- }
996
- onConfirm(callback) {
997
- this.confirmationCallback = callback;
998
- return this;
999
- }
1000
- dry(enabled = true) {
1001
- this.isDry = enabled;
1002
- return this;
1003
- }
1004
- addRequirement(requirement) {
1005
- this.requirements.push(requirement);
1006
- const fRequired = requirement.isRequired ? "(required)" : "(optional)";
1007
- this.logger?.debug?.(
1008
- `Added a new requirement to the upgrade: ${highlight(requirement.name)} ${fRequired}`
1009
- );
1010
- return this;
1011
- }
1012
- async upgrade() {
1013
- this.logger?.info?.(
1014
- `Upgrading from ${version(this.project.strapiVersion)} to ${version(this.target)}`
1015
- );
1016
- if (this.isDry) {
1017
- this.logger?.warn?.(
1018
- "Running the upgrade in dry mode. No files will be modified during the process."
1019
- );
1020
- }
1021
- const range = rangeFromVersions(this.project.strapiVersion, this.target);
1022
- const codemodsRange = rangeFromVersions(this.project.strapiVersion, this.codemodsTarget);
1023
- const npmVersionsMatches = this.npmPackage?.findVersionsInRange(range) ?? [];
1024
- this.logger?.debug?.(
1025
- `Found ${highlight(npmVersionsMatches.length)} versions satisfying ${versionRange(range)}`
1026
- );
1027
- try {
1028
- this.logger?.info?.(upgradeStep("Checking requirement", [1, 4]));
1029
- await this.checkRequirements(this.requirements, {
1030
- npmVersionsMatches,
1031
- project: this.project,
1032
- target: this.target
1033
- });
1034
- this.logger?.info?.(upgradeStep("Applying the latest code modifications", [2, 4]));
1035
- await this.runCodemods(codemodsRange);
1036
- this.logger?.debug?.("Refreshing project information...");
1037
- this.project.refresh();
1038
- this.logger?.info?.(upgradeStep("Upgrading Strapi dependencies", [3, 4]));
1039
- await this.updateDependencies();
1040
- this.logger?.info?.(upgradeStep("Installing dependencies", [4, 4]));
1041
- await this.installDependencies();
1042
- } catch (e) {
1043
- return erroredReport(unknownToError(e));
1044
- }
1045
- return successReport();
1046
- }
1047
- async checkRequirements(requirements, context) {
1048
- for (const requirement of requirements) {
1049
- const { pass, error } = await requirement.test(context);
1050
- if (pass) {
1051
- await this.onSuccessfulRequirement(requirement, context);
1052
- } else {
1053
- await this.onFailedRequirement(requirement, error);
1054
- }
1055
- }
1056
- }
1057
- async onSuccessfulRequirement(requirement, context) {
1058
- const hasChildren = requirement.children.length > 0;
1059
- if (hasChildren) {
1060
- await this.checkRequirements(requirement.children, context);
1061
- }
1062
- }
1063
- async onFailedRequirement(requirement, originalError) {
1064
- const errorMessage = `Requirement failed: ${originalError.message} (${highlight(
1065
- requirement.name
1066
- )})`;
1067
- const warningMessage = originalError.message;
1068
- const confirmationMessage = `Ignore optional requirement "${highlight(requirement.name)}" ?`;
1069
- const error = new Error(errorMessage);
1070
- if (requirement.isRequired) {
1071
- throw error;
1072
- }
1073
- this.logger?.warn?.(warningMessage);
1074
- const response = await this.confirmationCallback?.(confirmationMessage);
1075
- if (!response) {
1076
- throw error;
1077
- }
1078
- }
1079
- async updateDependencies() {
1080
- const { packageJSON, packageJSONPath } = this.project;
1081
- const json = createJSONTransformAPI(packageJSON);
1082
- const dependencies = json.get("dependencies", {});
1083
- const strapiDependencies = this.getScopedStrapiDependencies(dependencies);
1084
- this.logger?.debug?.(
1085
- `Found ${highlight(strapiDependencies.length)} dependency(ies) to update`
1086
- );
1087
- strapiDependencies.forEach(
1088
- (dependency) => this.logger?.debug?.(`- ${dependency[0]} (${dependency[1]} -> ${this.target})`)
1089
- );
1090
- if (strapiDependencies.length === 0) {
1091
- return;
1092
- }
1093
- strapiDependencies.forEach(([name]) => json.set(`dependencies.${name}`, this.target.raw));
1094
- const updatedPackageJSON = json.root();
1095
- if (this.isDry) {
1096
- this.logger?.debug?.(`Skipping dependencies update (${chalk.italic("dry mode")})`);
1097
- return;
1098
- }
1099
- await saveJSON(packageJSONPath, updatedPackageJSON);
1100
- }
1101
- getScopedStrapiDependencies(dependencies) {
1102
- const { strapiVersion } = this.project;
1103
- const strapiDependencies = [];
1104
- for (const [name, version2] of Object.entries(dependencies)) {
1105
- const isScopedStrapiPackage = name.startsWith(SCOPED_STRAPI_PACKAGE_PREFIX);
1106
- const isOnCurrentStrapiVersion = isValidSemVer(version2) && version2 === strapiVersion.raw;
1107
- if (isScopedStrapiPackage && isOnCurrentStrapiVersion) {
1108
- strapiDependencies.push([name, semVerFactory(version2)]);
1109
- }
1110
- }
1111
- return strapiDependencies;
1112
- }
1113
- async installDependencies() {
1114
- const projectPath = this.project.cwd;
1115
- const packageManagerName = await packageManager.getPreferred(projectPath);
1116
- this.logger?.debug?.(`Using ${highlight(packageManagerName)} as package manager`);
1117
- if (this.isDry) {
1118
- this.logger?.debug?.(`Skipping dependencies installation (${chalk.italic("dry mode")}`);
1119
- return;
1120
- }
1121
- await packageManager.installDependencies(projectPath, packageManagerName, {
1122
- stdout: this.logger?.stdout,
1123
- stderr: this.logger?.stderr
1124
- });
1125
- }
1126
- async runCodemods(range) {
1127
- const codemodRunner = codemodRunnerFactory(this.project, range);
1128
- codemodRunner.dry(this.isDry);
1129
- if (this.logger) {
1130
- codemodRunner.setLogger(this.logger);
1131
- }
1132
- await codemodRunner.run();
1133
- }
1134
- }
1135
- const resolveNPMTarget = (project, target, npmPackage) => {
1136
- if (isSemverInstance(target)) {
1137
- return npmPackage.findVersion(target);
1138
- }
1139
- if (isSemVerReleaseType(target)) {
1140
- const range = rangeFromVersions(project.strapiVersion, target);
1141
- const npmVersionsMatches = npmPackage.findVersionsInRange(range);
1142
- return npmVersionsMatches.at(-1);
1143
- }
1144
- return void 0;
1145
- };
1146
- const upgraderFactory = (project, target, npmPackage) => {
1147
- const targetedNPMVersion = resolveNPMTarget(project, target, npmPackage);
1148
- if (!targetedNPMVersion) {
1149
- throw new Error(`Couldn't find a matching version in the NPM registry for "${target}"`);
1150
- }
1151
- const semverTarget = semVerFactory(targetedNPMVersion.version);
1152
- if (semver.eq(semverTarget, project.strapiVersion)) {
1153
- throw new Error(`The project is already on ${version(semverTarget)}`);
1154
- }
1155
- return new Upgrader(project, semverTarget, npmPackage);
1156
- };
1157
- const successReport = () => ({ success: true, error: null });
1158
- const erroredReport = (error) => ({ success: false, error });
1159
- const STRAPI_PACKAGE_NAME = "@strapi/strapi";
1160
- const constants = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1161
- __proto__: null,
1162
- STRAPI_PACKAGE_NAME
1163
- }, Symbol.toStringTag, { value: "Module" }));
1164
- const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1165
- __proto__: null,
1166
- constants,
1167
- upgraderFactory
1168
- }, Symbol.toStringTag, { value: "Module" }));
1169
- const NPM_REGISTRY_URL = "https://registry.npmjs.org";
1170
- class Package {
1171
- name;
1172
- packageURL;
1173
- npmPackage;
1174
- constructor(name) {
1175
- this.name = name;
1176
- this.packageURL = `${NPM_REGISTRY_URL}/${name}`;
1177
- this.npmPackage = null;
1178
- }
1179
- get isLoaded() {
1180
- return this.npmPackage !== null;
1181
- }
1182
- assertPackageIsLoaded(npmPackage) {
1183
- assert(this.isLoaded, "The package is not loaded yet");
1184
- }
1185
- getVersionsDict() {
1186
- this.assertPackageIsLoaded(this.npmPackage);
1187
- return this.npmPackage.versions;
1188
- }
1189
- getVersionsAsList() {
1190
- this.assertPackageIsLoaded(this.npmPackage);
1191
- return Object.values(this.npmPackage.versions);
1192
- }
1193
- findVersionsInRange(range) {
1194
- const versions = this.getVersionsAsList();
1195
- return versions.filter((v) => range.test(v.version)).filter((v) => isLiteralSemVer(v.version)).sort((v1, v2) => semver.compare(v1.version, v2.version));
1196
- }
1197
- findVersion(version2) {
1198
- const versions = this.getVersionsAsList();
1199
- return versions.find((npmVersion) => semver.eq(npmVersion.version, version2));
1200
- }
1201
- async refresh() {
1202
- const response = await fetch(this.packageURL);
1203
- assert(response.ok, `Request failed for ${this.packageURL}`);
1204
- this.npmPackage = await response.json();
1205
- return this;
1206
- }
1207
- versionExists(version2) {
1208
- return this.findVersion(version2) !== void 0;
1209
- }
1210
- }
1211
- const npmPackageFactory = (name) => new Package(name);
1212
- const upgrade = async (options) => {
1213
- const timer = timerFactory();
1214
- const { logger, codemodsTarget } = options;
1215
- const cwd = path$1.resolve(options.cwd ?? process.cwd());
1216
- const project = projectFactory(cwd);
1217
- if (!isApplicationProject(project)) {
1218
- throw new Error(
1219
- `The "${options.target}" upgrade can only be run on a Strapi project; for plugins, please use "codemods".`
1220
- );
1221
- }
1222
- const npmPackage = npmPackageFactory(STRAPI_PACKAGE_NAME);
1223
- await npmPackage.refresh();
1224
- const upgrader = upgraderFactory(project, options.target, npmPackage).dry(options.dry ?? false).onConfirm(options.confirm ?? null).setLogger(logger);
1225
- if (codemodsTarget !== void 0) {
1226
- upgrader.overrideCodemodsTarget(codemodsTarget);
1227
- }
1228
- if (options.target === ReleaseType.Major) {
1229
- upgrader.addRequirement(REQUIRE_AVAILABLE_NEXT_MAJOR).addRequirement(REQUIRE_LATEST_FOR_CURRENT_MAJOR);
1230
- }
1231
- upgrader.addRequirement(REQUIRE_GIT.asOptional());
1232
- const upgradeReport = await upgrader.upgrade();
1233
- if (!upgradeReport.success) {
1234
- throw upgradeReport.error;
1235
- }
1236
- timer.stop();
1237
- logger.info(`Completed in ${durationMs(timer.elapsedMs)}`);
1238
- };
1239
- const resolvePath = (cwd) => path$1.resolve(cwd ?? process.cwd());
1240
- const getRangeFromTarget = (currentVersion, target) => {
1241
- if (isSemverInstance(target)) {
1242
- return rangeFactory(target);
1243
- }
1244
- const { major, minor, patch } = currentVersion;
1245
- switch (target) {
1246
- case ReleaseType.Major:
1247
- return rangeFactory(`${major}`);
1248
- case ReleaseType.Minor:
1249
- return rangeFactory(`${major}.${minor}`);
1250
- case ReleaseType.Patch:
1251
- return rangeFactory(`${major}.${minor}.${patch}`);
1252
- default:
1253
- throw new Error(`Invalid target set: ${target}`);
1254
- }
1255
- };
1256
- const findRangeFromTarget = (project, target) => {
1257
- if (isRangeInstance(target)) {
1258
- return target;
1259
- }
1260
- if (isApplicationProject(project)) {
1261
- return getRangeFromTarget(project.strapiVersion, target);
1262
- }
1263
- return rangeFactory("*");
1264
- };
1265
- const runCodemods = async (options) => {
1266
- const timer = timerFactory();
1267
- const { logger, uid } = options;
1268
- const cwd = resolvePath(options.cwd);
1269
- const project = projectFactory(cwd);
1270
- const range = findRangeFromTarget(project, options.target);
1271
- logger.debug(`Project: ${projectType(project.type)} found in ${path(cwd)}`);
1272
- logger.debug(`Range: set to ${versionRange(range)}`);
1273
- const codemodRunner = codemodRunnerFactory(project, range).dry(options.dry ?? false).onSelectCodemods(options.selectCodemods ?? null).setLogger(logger);
1274
- let report;
1275
- if (uid !== void 0) {
1276
- logger.debug(`Running a single codemod: ${codemodUID(uid)}`);
1277
- report = await codemodRunner.runByUID(uid);
1278
- } else {
1279
- report = await codemodRunner.run();
1280
- }
1281
- if (!report.success) {
1282
- throw report.error;
1283
- }
1284
- timer.stop();
1285
- logger.info(`Completed in ${timer.elapsedMs}`);
1286
- };
1287
- const listCodemods = async (options) => {
1288
- const { logger, target } = options;
1289
- const cwd = resolvePath(options.cwd);
1290
- const project = projectFactory(cwd);
1291
- const range = findRangeFromTarget(project, target);
1292
- logger.debug(`Project: ${projectType(project.type)} found in ${path(cwd)}`);
1293
- logger.debug(`Range: set to ${versionRange(range)}`);
1294
- const repo = codemodRepositoryFactory();
1295
- repo.refresh();
1296
- const groups = repo.find({ range });
1297
- const codemods = groups.flatMap((collection) => collection.codemods);
1298
- logger.debug(`Found ${highlight(codemods.length)} codemods`);
1299
- if (codemods.length === 0) {
1300
- logger.info(`Found no codemods matching ${versionRange(range)}`);
1301
- return;
1302
- }
1303
- const fCodemods = codemodList(codemods);
1304
- logger.raw(fCodemods);
1305
- };
1306
- const index$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1307
- __proto__: null,
1308
- listCodemods,
1309
- runCodemods,
1310
- upgrade
1311
- }, Symbol.toStringTag, { value: "Module" }));
1312
- class Logger {
1313
- isDebug;
1314
- isSilent;
1315
- nbErrorsCalls;
1316
- nbWarningsCalls;
1317
- constructor(options = {}) {
1318
- this.isDebug = options.debug ?? false;
1319
- this.isSilent = options.silent ?? false;
1320
- this.nbErrorsCalls = 0;
1321
- this.nbWarningsCalls = 0;
1322
- }
1323
- get isNotSilent() {
1324
- return !this.isSilent;
1325
- }
1326
- get errors() {
1327
- return this.nbErrorsCalls;
1328
- }
1329
- get warnings() {
1330
- return this.nbWarningsCalls;
1331
- }
1332
- get stdout() {
1333
- return this.isSilent ? void 0 : process.stdout;
1334
- }
1335
- get stderr() {
1336
- return this.isSilent ? void 0 : process.stderr;
1337
- }
1338
- setDebug(debug) {
1339
- this.isDebug = debug;
1340
- return this;
1341
- }
1342
- setSilent(silent) {
1343
- this.isSilent = silent;
1344
- return this;
1345
- }
1346
- debug(...args) {
1347
- const isDebugEnabled = this.isNotSilent && this.isDebug;
1348
- if (isDebugEnabled) {
1349
- console.log(chalk.cyan(`[DEBUG] [${nowAsISO()}]`), ...args);
1350
- }
1351
- return this;
1352
- }
1353
- error(...args) {
1354
- this.nbErrorsCalls += 1;
1355
- if (this.isNotSilent) {
1356
- console.error(chalk.red(`[ERROR] [${nowAsISO()}]`), ...args);
1357
- }
1358
- return this;
1359
- }
1360
- info(...args) {
1361
- if (this.isNotSilent) {
1362
- console.info(chalk.blue(`[INFO] [${(/* @__PURE__ */ new Date()).toISOString()}]`), ...args);
1363
- }
1364
- return this;
1365
- }
1366
- raw(...args) {
1367
- if (this.isNotSilent) {
1368
- console.log(...args);
1369
- }
1370
- return this;
1371
- }
1372
- warn(...args) {
1373
- this.nbWarningsCalls += 1;
1374
- if (this.isNotSilent) {
1375
- console.warn(chalk.yellow(`[WARN] [${(/* @__PURE__ */ new Date()).toISOString()}]`), ...args);
1376
- }
1377
- return this;
1378
- }
1379
- }
1380
- const nowAsISO = () => (/* @__PURE__ */ new Date()).toISOString();
1381
- const loggerFactory = (options = {}) => new Logger(options);
1382
- const index$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1383
- __proto__: null,
1384
- loggerFactory
1385
- }, Symbol.toStringTag, { value: "Module" }));
1386
- const codemodReportFactory = (codemod, report) => ({
1387
- codemod,
1388
- report
1389
- });
1390
- const reportFactory = (report) => ({ ...report });
1391
- const index$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1392
- __proto__: null,
1393
- codemodReportFactory,
1394
- reportFactory
1395
- }, Symbol.toStringTag, { value: "Module" }));
1396
- const index$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1397
- __proto__: null,
1398
- code: index$c,
1399
- json: index$b
1400
- }, Symbol.toStringTag, { value: "Module" }));
1401
- const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1402
- __proto__: null,
1403
- codemod: index$7,
1404
- codemodRepository: index$6,
1405
- error: index$9,
1406
- f: index$8,
1407
- fileScanner: index$d,
1408
- logger: index$3,
1409
- project: index$a,
1410
- report: index$2,
1411
- requirement: index$g,
1412
- runner: index$1,
1413
- timer: index$f,
1414
- upgrader: index$5,
1415
- version: index$e
1416
- }, Symbol.toStringTag, { value: "Module" }));
1417
- export {
1418
- index as modules,
1419
- index$4 as tasks
1420
- };
1
+ import * as index from './src/tasks/index.mjs';
2
+ export { index as tasks };
3
+ import * as index$1 from './src/modules/index.mjs';
4
+ export { index$1 as modules };
1421
5
  //# sourceMappingURL=index.mjs.map