@strapi/strapi 5.0.0-beta.1 → 5.0.0-beta.10

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 (250) hide show
  1. package/README.md +4 -4
  2. package/dist/admin.d.ts.map +1 -1
  3. package/dist/admin.js +12 -4
  4. package/dist/admin.js.map +1 -1
  5. package/dist/admin.mjs +10 -4
  6. package/dist/admin.mjs.map +1 -1
  7. package/dist/cli/commands/admin/create-user.js +2 -2
  8. package/dist/cli/commands/admin/create-user.js.map +1 -1
  9. package/dist/cli/commands/admin/create-user.mjs +88 -0
  10. package/dist/cli/commands/admin/create-user.mjs.map +1 -0
  11. package/dist/cli/commands/admin/reset-user-password.js +2 -2
  12. package/dist/cli/commands/admin/reset-user-password.js.map +1 -1
  13. package/dist/cli/commands/admin/reset-user-password.mjs +44 -0
  14. package/dist/cli/commands/admin/reset-user-password.mjs.map +1 -0
  15. package/dist/cli/commands/build.mjs +30 -0
  16. package/dist/cli/commands/build.mjs.map +1 -0
  17. package/dist/cli/commands/components/list.js +2 -2
  18. package/dist/cli/commands/components/list.js.map +1 -1
  19. package/dist/cli/commands/components/list.mjs +24 -0
  20. package/dist/cli/commands/components/list.mjs.map +1 -0
  21. package/dist/cli/commands/configuration/dump.js +2 -2
  22. package/dist/cli/commands/configuration/dump.js.map +1 -1
  23. package/dist/cli/commands/configuration/dump.mjs +41 -0
  24. package/dist/cli/commands/configuration/dump.mjs.map +1 -0
  25. package/dist/cli/commands/configuration/restore.js +2 -2
  26. package/dist/cli/commands/configuration/restore.js.map +1 -1
  27. package/dist/cli/commands/configuration/restore.mjs +140 -0
  28. package/dist/cli/commands/configuration/restore.mjs.map +1 -0
  29. package/dist/cli/commands/console.js +2 -2
  30. package/dist/cli/commands/console.js.map +1 -1
  31. package/dist/cli/commands/console.mjs +27 -0
  32. package/dist/cli/commands/console.mjs.map +1 -0
  33. package/dist/cli/commands/content-types/list.js +2 -2
  34. package/dist/cli/commands/content-types/list.js.map +1 -1
  35. package/dist/cli/commands/content-types/list.mjs +24 -0
  36. package/dist/cli/commands/content-types/list.mjs.map +1 -0
  37. package/dist/cli/commands/controllers/list.js +2 -2
  38. package/dist/cli/commands/controllers/list.js.map +1 -1
  39. package/dist/cli/commands/controllers/list.mjs +24 -0
  40. package/dist/cli/commands/controllers/list.mjs.map +1 -0
  41. package/dist/cli/commands/develop.mjs +27 -0
  42. package/dist/cli/commands/develop.mjs.map +1 -0
  43. package/dist/cli/commands/export/action.js.map +1 -1
  44. package/dist/cli/commands/export/action.mjs +116 -0
  45. package/dist/cli/commands/export/action.mjs.map +1 -0
  46. package/dist/cli/commands/export/command.mjs +24 -0
  47. package/dist/cli/commands/export/command.mjs.map +1 -0
  48. package/dist/cli/commands/generate.mjs +13 -0
  49. package/dist/cli/commands/generate.mjs.map +1 -0
  50. package/dist/cli/commands/hooks/list.js +2 -2
  51. package/dist/cli/commands/hooks/list.js.map +1 -1
  52. package/dist/cli/commands/hooks/list.mjs +24 -0
  53. package/dist/cli/commands/hooks/list.mjs.map +1 -0
  54. package/dist/cli/commands/import/action.js.map +1 -1
  55. package/dist/cli/commands/import/action.mjs +105 -0
  56. package/dist/cli/commands/import/action.mjs.map +1 -0
  57. package/dist/cli/commands/import/command.mjs +68 -0
  58. package/dist/cli/commands/import/command.mjs.map +1 -0
  59. package/dist/cli/commands/index.d.ts.map +1 -1
  60. package/dist/cli/commands/index.js +1 -14
  61. package/dist/cli/commands/index.js.map +1 -1
  62. package/dist/cli/commands/index.mjs +58 -0
  63. package/dist/cli/commands/index.mjs.map +1 -0
  64. package/dist/cli/commands/middlewares/list.js +2 -2
  65. package/dist/cli/commands/middlewares/list.js.map +1 -1
  66. package/dist/cli/commands/middlewares/list.mjs +24 -0
  67. package/dist/cli/commands/middlewares/list.mjs.map +1 -0
  68. package/dist/cli/commands/plugin/init/files/typescript.d.ts.map +1 -1
  69. package/dist/cli/commands/policies/list.js +2 -2
  70. package/dist/cli/commands/policies/list.js.map +1 -1
  71. package/dist/cli/commands/policies/list.mjs +24 -0
  72. package/dist/cli/commands/policies/list.mjs.map +1 -0
  73. package/dist/cli/commands/report.js +2 -2
  74. package/dist/cli/commands/report.js.map +1 -1
  75. package/dist/cli/commands/report.mjs +35 -0
  76. package/dist/cli/commands/report.mjs.map +1 -0
  77. package/dist/cli/commands/routes/list.js +2 -2
  78. package/dist/cli/commands/routes/list.js.map +1 -1
  79. package/dist/cli/commands/routes/list.mjs +28 -0
  80. package/dist/cli/commands/routes/list.mjs.map +1 -0
  81. package/dist/cli/commands/services/list.js +2 -2
  82. package/dist/cli/commands/services/list.js.map +1 -1
  83. package/dist/cli/commands/services/list.mjs +24 -0
  84. package/dist/cli/commands/services/list.mjs.map +1 -0
  85. package/dist/cli/commands/start.js +1 -1
  86. package/dist/cli/commands/start.js.map +1 -1
  87. package/dist/cli/commands/start.mjs +24 -0
  88. package/dist/cli/commands/start.mjs.map +1 -0
  89. package/dist/cli/commands/telemetry/disable.mjs +67 -0
  90. package/dist/cli/commands/telemetry/disable.mjs.map +1 -0
  91. package/dist/cli/commands/telemetry/enable.mjs +86 -0
  92. package/dist/cli/commands/telemetry/enable.mjs.map +1 -0
  93. package/dist/cli/commands/templates/generate.mjs +74 -0
  94. package/dist/cli/commands/templates/generate.mjs.map +1 -0
  95. package/dist/cli/commands/transfer/action.mjs +131 -0
  96. package/dist/cli/commands/transfer/action.mjs.map +1 -0
  97. package/dist/cli/commands/transfer/command.mjs +84 -0
  98. package/dist/cli/commands/transfer/command.mjs.map +1 -0
  99. package/dist/cli/commands/ts/generate-types.d.ts.map +1 -1
  100. package/dist/cli/commands/ts/generate-types.js +4 -5
  101. package/dist/cli/commands/ts/generate-types.js.map +1 -1
  102. package/dist/cli/commands/ts/generate-types.mjs +34 -0
  103. package/dist/cli/commands/ts/generate-types.mjs.map +1 -0
  104. package/dist/cli/commands/version.mjs +13 -0
  105. package/dist/cli/commands/version.mjs.map +1 -0
  106. package/dist/cli/index.d.ts.map +1 -1
  107. package/dist/cli/index.js +30 -0
  108. package/dist/cli/index.js.map +1 -1
  109. package/dist/cli/index.mjs +79 -0
  110. package/dist/cli/index.mjs.map +1 -0
  111. package/dist/cli/utils/commander.d.ts +2 -2
  112. package/dist/cli/utils/commander.d.ts.map +1 -1
  113. package/dist/cli/utils/commander.mjs +109 -0
  114. package/dist/cli/utils/commander.mjs.map +1 -0
  115. package/dist/cli/utils/data-transfer.d.ts +4 -4
  116. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  117. package/dist/cli/utils/data-transfer.js +32 -24
  118. package/dist/cli/utils/data-transfer.js.map +1 -1
  119. package/dist/cli/utils/data-transfer.mjs +347 -0
  120. package/dist/cli/utils/data-transfer.mjs.map +1 -0
  121. package/dist/cli/utils/helpers.d.ts +1 -1
  122. package/dist/cli/utils/helpers.d.ts.map +1 -1
  123. package/dist/cli/utils/helpers.mjs +100 -0
  124. package/dist/cli/utils/helpers.mjs.map +1 -0
  125. package/dist/cli/utils/logger.mjs +80 -0
  126. package/dist/cli/utils/logger.mjs.map +1 -0
  127. package/dist/cli/utils/pkg.d.ts.map +1 -1
  128. package/dist/cli/utils/telemetry.mjs +22 -0
  129. package/dist/cli/utils/telemetry.mjs.map +1 -0
  130. package/dist/cli/utils/tsconfig.d.ts.map +1 -1
  131. package/dist/cli/utils/tsconfig.mjs +23 -0
  132. package/dist/cli/utils/tsconfig.mjs.map +1 -0
  133. package/dist/node/build.mjs +58 -0
  134. package/dist/node/build.mjs.map +1 -0
  135. package/dist/node/core/admin-customisations.mjs +22 -0
  136. package/dist/node/core/admin-customisations.mjs.map +1 -0
  137. package/dist/node/core/aliases.d.ts +1 -1
  138. package/dist/node/core/aliases.d.ts.map +1 -1
  139. package/dist/node/core/aliases.js +8 -5
  140. package/dist/node/core/aliases.js.map +1 -1
  141. package/dist/node/core/aliases.mjs +31 -0
  142. package/dist/node/core/aliases.mjs.map +1 -0
  143. package/dist/node/core/config.d.ts.map +1 -1
  144. package/dist/node/core/config.mjs +16 -0
  145. package/dist/node/core/config.mjs.map +1 -0
  146. package/dist/node/core/dependencies.d.ts.map +1 -1
  147. package/dist/node/core/dependencies.js +5 -1
  148. package/dist/node/core/dependencies.js.map +1 -1
  149. package/dist/node/core/dependencies.mjs +155 -0
  150. package/dist/node/core/dependencies.mjs.map +1 -0
  151. package/dist/node/core/env.d.ts.map +1 -1
  152. package/dist/node/core/env.js +7 -4
  153. package/dist/node/core/env.js.map +1 -1
  154. package/dist/node/core/env.mjs +23 -0
  155. package/dist/node/core/env.mjs.map +1 -0
  156. package/dist/node/core/errors.mjs +29 -0
  157. package/dist/node/core/errors.mjs.map +1 -0
  158. package/dist/node/core/files.mjs +43 -0
  159. package/dist/node/core/files.mjs.map +1 -0
  160. package/dist/node/core/managers.mjs +17 -0
  161. package/dist/node/core/managers.mjs.map +1 -0
  162. package/dist/node/core/monorepo.mjs +20 -0
  163. package/dist/node/core/monorepo.mjs.map +1 -0
  164. package/dist/node/core/plugins.mjs +93 -0
  165. package/dist/node/core/plugins.mjs.map +1 -0
  166. package/dist/node/core/timer.mjs +27 -0
  167. package/dist/node/core/timer.mjs.map +1 -0
  168. package/dist/node/create-build-context.d.ts.map +1 -1
  169. package/dist/node/create-build-context.js +1 -1
  170. package/dist/node/create-build-context.js.map +1 -1
  171. package/dist/node/create-build-context.mjs +91 -0
  172. package/dist/node/create-build-context.mjs.map +1 -0
  173. package/dist/node/develop.js +1 -1
  174. package/dist/node/develop.js.map +1 -1
  175. package/dist/node/develop.mjs +252 -0
  176. package/dist/node/develop.mjs.map +1 -0
  177. package/dist/node/staticFiles.d.ts.map +1 -1
  178. package/dist/node/staticFiles.js +25 -3
  179. package/dist/node/staticFiles.js.map +1 -1
  180. package/dist/node/staticFiles.mjs +76 -0
  181. package/dist/node/staticFiles.mjs.map +1 -0
  182. package/dist/node/vite/build.mjs +12 -0
  183. package/dist/node/vite/build.mjs.map +1 -0
  184. package/dist/node/vite/config.mjs +99 -0
  185. package/dist/node/vite/config.mjs.map +1 -0
  186. package/dist/node/vite/plugins.mjs +43 -0
  187. package/dist/node/vite/plugins.mjs.map +1 -0
  188. package/dist/node/vite/watch.mjs +52 -0
  189. package/dist/node/vite/watch.mjs.map +1 -0
  190. package/dist/node/webpack/build.mjs +39 -0
  191. package/dist/node/webpack/build.mjs.map +1 -0
  192. package/dist/node/webpack/config.mjs +228 -0
  193. package/dist/node/webpack/config.mjs.map +1 -0
  194. package/dist/node/webpack/watch.mjs +92 -0
  195. package/dist/node/webpack/watch.mjs.map +1 -0
  196. package/package.json +33 -40
  197. package/dist/cli/commands/plugin/build.d.ts +0 -7
  198. package/dist/cli/commands/plugin/build.d.ts.map +0 -1
  199. package/dist/cli/commands/plugin/build.js +0 -88
  200. package/dist/cli/commands/plugin/build.js.map +0 -1
  201. package/dist/cli/commands/plugin/init/action.d.ts +0 -6
  202. package/dist/cli/commands/plugin/init/action.d.ts.map +0 -1
  203. package/dist/cli/commands/plugin/init/action.js +0 -414
  204. package/dist/cli/commands/plugin/init/action.js.map +0 -1
  205. package/dist/cli/commands/plugin/init/command.d.ts +0 -7
  206. package/dist/cli/commands/plugin/init/command.d.ts.map +0 -1
  207. package/dist/cli/commands/plugin/init/command.js +0 -9
  208. package/dist/cli/commands/plugin/init/command.js.map +0 -1
  209. package/dist/cli/commands/plugin/init/files/admin.d.ts +0 -5
  210. package/dist/cli/commands/plugin/init/files/admin.d.ts.map +0 -1
  211. package/dist/cli/commands/plugin/init/files/admin.js +0 -283
  212. package/dist/cli/commands/plugin/init/files/admin.js.map +0 -1
  213. package/dist/cli/commands/plugin/init/files/editorConfig.d.ts +0 -4
  214. package/dist/cli/commands/plugin/init/files/editorConfig.d.ts.map +0 -1
  215. package/dist/cli/commands/plugin/init/files/editorConfig.js +0 -26
  216. package/dist/cli/commands/plugin/init/files/editorConfig.js.map +0 -1
  217. package/dist/cli/commands/plugin/init/files/eslint.d.ts +0 -4
  218. package/dist/cli/commands/plugin/init/files/eslint.d.ts.map +0 -1
  219. package/dist/cli/commands/plugin/init/files/eslint.js +0 -11
  220. package/dist/cli/commands/plugin/init/files/eslint.js.map +0 -1
  221. package/dist/cli/commands/plugin/init/files/gitIgnore.d.ts +0 -4
  222. package/dist/cli/commands/plugin/init/files/gitIgnore.d.ts.map +0 -1
  223. package/dist/cli/commands/plugin/init/files/gitIgnore.js +0 -34
  224. package/dist/cli/commands/plugin/init/files/gitIgnore.js.map +0 -1
  225. package/dist/cli/commands/plugin/init/files/prettier.d.ts +0 -5
  226. package/dist/cli/commands/plugin/init/files/prettier.d.ts.map +0 -1
  227. package/dist/cli/commands/plugin/init/files/prettier.js +0 -25
  228. package/dist/cli/commands/plugin/init/files/prettier.js.map +0 -1
  229. package/dist/cli/commands/plugin/init/files/server.d.ts +0 -5
  230. package/dist/cli/commands/plugin/init/files/server.d.ts.map +0 -1
  231. package/dist/cli/commands/plugin/init/files/server.js +0 -360
  232. package/dist/cli/commands/plugin/init/files/server.js.map +0 -1
  233. package/dist/cli/commands/plugin/init/files/typescript.js +0 -66
  234. package/dist/cli/commands/plugin/init/files/typescript.js.map +0 -1
  235. package/dist/cli/commands/plugin/init/index.d.ts +0 -2
  236. package/dist/cli/commands/plugin/init/index.d.ts.map +0 -1
  237. package/dist/cli/commands/plugin/link-watch.d.ts +0 -7
  238. package/dist/cli/commands/plugin/link-watch.d.ts.map +0 -1
  239. package/dist/cli/commands/plugin/link-watch.js +0 -89
  240. package/dist/cli/commands/plugin/link-watch.js.map +0 -1
  241. package/dist/cli/commands/plugin/verify.d.ts +0 -7
  242. package/dist/cli/commands/plugin/verify.d.ts.map +0 -1
  243. package/dist/cli/commands/plugin/verify.js +0 -37
  244. package/dist/cli/commands/plugin/verify.js.map +0 -1
  245. package/dist/cli/commands/plugin/watch.d.ts +0 -7
  246. package/dist/cli/commands/plugin/watch.d.ts.map +0 -1
  247. package/dist/cli/commands/plugin/watch.js +0 -86
  248. package/dist/cli/commands/plugin/watch.js.map +0 -1
  249. package/dist/cli/utils/pkg.js +0 -108
  250. package/dist/cli/utils/pkg.js.map +0 -1
@@ -0,0 +1,100 @@
1
+ import chalk from "chalk";
2
+ import { isString, isArray, has } from "lodash/fp";
3
+ import "inquirer";
4
+ import "boxen";
5
+ const bytesPerKb = 1024;
6
+ const sizes = ["B ", "KB", "MB", "GB", "TB", "PB"];
7
+ const readableBytes = (bytes, decimals = 1, padStart = 0) => {
8
+ if (!bytes) {
9
+ return "0";
10
+ }
11
+ const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));
12
+ const result = `${parseFloat((bytes / bytesPerKb ** i).toFixed(decimals))} ${sizes[i].padStart(
13
+ 2
14
+ )}`;
15
+ return result.padStart(padStart);
16
+ };
17
+ const exitWith = (code, message, options = {}) => {
18
+ const { logger = console, prc = process } = options;
19
+ const log = (message2) => {
20
+ if (code === 0) {
21
+ logger.log(chalk.green(message2));
22
+ } else {
23
+ logger.error(chalk.red(message2));
24
+ }
25
+ };
26
+ if (isString(message)) {
27
+ log(message);
28
+ } else if (isArray(message)) {
29
+ message.forEach((msg) => log(msg));
30
+ }
31
+ prc.exit(code);
32
+ };
33
+ const assertUrlHasProtocol = (url, protocol) => {
34
+ if (!url.protocol) {
35
+ exitWith(1, `${url.toString()} does not have a protocol`);
36
+ }
37
+ if (!protocol) {
38
+ return;
39
+ }
40
+ if (isString(protocol)) {
41
+ if (protocol !== url.protocol) {
42
+ exitWith(1, `${url.toString()} must have the protocol ${protocol}`);
43
+ }
44
+ return;
45
+ }
46
+ if (!protocol.some((protocol2) => url.protocol === protocol2)) {
47
+ return exitWith(
48
+ 1,
49
+ `${url.toString()} must have one of the following protocols: ${protocol.join(",")}`
50
+ );
51
+ }
52
+ };
53
+ const ifOptions = (conditionCallback, isMetCallback = async () => {
54
+ }, isNotMetCallback = async () => {
55
+ }) => {
56
+ return async (command) => {
57
+ const opts = command.opts();
58
+ if (await conditionCallback(opts)) {
59
+ await isMetCallback(command);
60
+ } else {
61
+ await isNotMetCallback(command);
62
+ }
63
+ };
64
+ };
65
+ const assertCwdContainsStrapiProject = (name) => {
66
+ const logErrorAndExit = () => {
67
+ console.log(
68
+ `You need to run ${chalk.yellow(
69
+ `strapi ${name}`
70
+ )} in a Strapi project. Make sure you are in the right directory.`
71
+ );
72
+ process.exit(1);
73
+ };
74
+ try {
75
+ const pkgJSON = require(`${process.cwd()}/package.json`);
76
+ if (!has("dependencies.@strapi/strapi", pkgJSON) && !has("devDependencies.@strapi/strapi", pkgJSON)) {
77
+ logErrorAndExit();
78
+ }
79
+ } catch (err) {
80
+ logErrorAndExit();
81
+ }
82
+ };
83
+ const runAction = (name, action) => (...args) => {
84
+ assertCwdContainsStrapiProject(name);
85
+ Promise.resolve().then(() => {
86
+ return action(...args);
87
+ }).catch((error) => {
88
+ console.error(error);
89
+ process.exit(1);
90
+ });
91
+ };
92
+ export {
93
+ assertCwdContainsStrapiProject,
94
+ assertUrlHasProtocol,
95
+ exitWith,
96
+ ifOptions,
97
+ readableBytes,
98
+ runAction
99
+ };
100
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","sources":["../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport { prompt } from 'inquirer';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${parseFloat((bytes / bytesPerKb ** i).toFixed(decimals))} ${sizes[i].padStart(\n 2\n )}`;\n\n return result.padStart(padStart);\n};\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const { confirmed } = await prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["message","protocol"],"mappings":";;;;AAUA,MAAM,aAAa;AACnB,MAAM,QAAQ,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AAKjD,MAAM,gBAAgB,CAAC,OAAe,WAAW,GAAG,WAAW,MAAM;AACnE,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EACT;AACM,QAAA,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,UAAU,CAAC;AAC3D,QAAM,SAAS,GAAG,YAAY,QAAQ,cAAc,GAAG,QAAQ,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE;AAAA,IACpF;AAAA,EACD,CAAA;AAEM,SAAA,OAAO,SAAS,QAAQ;AACjC;AAaA,MAAM,WAAW,CAAC,MAAc,SAA6B,UAA2B,CAAA,MAAO;AAC7F,QAAM,EAAE,SAAS,SAAS,MAAM,YAAY;AAEtC,QAAA,MAAM,CAACA,aAAoB;AAC/B,QAAI,SAAS,GAAG;AACd,aAAO,IAAI,MAAM,MAAMA,QAAO,CAAC;AAAA,IAAA,OAC1B;AACL,aAAO,MAAM,MAAM,IAAIA,QAAO,CAAC;AAAA,IACjC;AAAA,EAAA;AAGE,MAAA,SAAS,OAAO,GAAG;AACrB,QAAI,OAAO;AAAA,EAAA,WACF,QAAQ,OAAO,GAAG;AAC3B,YAAQ,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;AAAA,EACnC;AAEA,MAAI,KAAK,IAAI;AACf;AAMM,MAAA,uBAAuB,CAAC,KAAU,aAAiC;AACnE,MAAA,CAAC,IAAI,UAAU;AACjB,aAAS,GAAG,GAAG,IAAI,SAAU,CAAA,2BAA2B;AAAA,EAC1D;AAGA,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEI,MAAA,SAAS,QAAQ,GAAG;AAClB,QAAA,aAAa,IAAI,UAAU;AAC7B,eAAS,GAAG,GAAG,IAAI,UAAU,2BAA2B,QAAQ,EAAE;AAAA,IACpE;AACA;AAAA,EACF;AAGI,MAAA,CAAC,SAAS,KAAK,CAACC,cAAa,IAAI,aAAaA,SAAQ,GAAG;AACpD,WAAA;AAAA,MACL;AAAA,MACA,GAAG,IAAI,UAAU,8CAA8C,SAAS,KAAK,GAAG,CAAC;AAAA,IAAA;AAAA,EAErF;AACF;AASA,MAAM,YAAY,CAChB,mBACA,gBAA+B,YAAY;AAAC,GAC5C,mBAAqC,YAAY;AAAC,MAC/C;AACH,SAAO,OAAO,YAAqB;AAC3B,UAAA,OAAO,QAAQ;AACjB,QAAA,MAAM,kBAAkB,IAAI,GAAG;AACjC,YAAM,cAAc,OAAO;AAAA,IAAA,OACtB;AACL,YAAM,iBAAiB,OAAO;AAAA,IAChC;AAAA,EAAA;AAEJ;AAEM,MAAA,iCAAiC,CAAC,SAAiB;AACvD,QAAM,kBAAkB,MAAM;AACpB,YAAA;AAAA,MACN,mBAAmB,MAAM;AAAA,QACvB,UAAU,IAAI;AAAA,MACf,CAAA;AAAA,IAAA;AAEH,YAAQ,KAAK,CAAC;AAAA,EAAA;AAGZ,MAAA;AACF,UAAM,UAAU,QAAQ,GAAG,QAAQ,IAAK,CAAA,eAAe;AAErD,QAAA,CAAC,IAAI,+BAA+B,OAAO,KAC3C,CAAC,IAAI,kCAAkC,OAAO,GAC9C;AACgB;IAClB;AAAA,WACO,KAAK;AACI;EAClB;AACF;AAEA,MAAM,YACJ,CAAC,MAAc,WACf,IAAI,SAAoB;AACtB,iCAA+B,IAAI;AAE3B,UAAA,UACL,KAAK,MAAM;AACH,WAAA,OAAO,GAAG,IAAI;AAAA,EAAA,CACtB,EACA,MAAM,CAAC,UAAU;AAChB,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAAA,CACf;AACL;"}
@@ -0,0 +1,80 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ const createLogger = (options = {}) => {
4
+ const { silent = false, debug = false, timestamp = true } = options;
5
+ const state = { errors: 0, warning: 0 };
6
+ return {
7
+ get warnings() {
8
+ return state.warning;
9
+ },
10
+ get errors() {
11
+ return state.errors;
12
+ },
13
+ debug(...args) {
14
+ if (silent || !debug) {
15
+ return;
16
+ }
17
+ console.log(
18
+ chalk.cyan(`[DEBUG]${timestamp ? ` [${(/* @__PURE__ */ new Date()).toISOString()}]` : ""}`),
19
+ ...args
20
+ );
21
+ },
22
+ info(...args) {
23
+ if (silent) {
24
+ return;
25
+ }
26
+ console.info(
27
+ chalk.blue(`[INFO]${timestamp ? ` [${(/* @__PURE__ */ new Date()).toISOString()}]` : ""}`),
28
+ ...args
29
+ );
30
+ },
31
+ log(...args) {
32
+ if (silent) {
33
+ return;
34
+ }
35
+ console.info(chalk.blue(`${timestamp ? ` [${(/* @__PURE__ */ new Date()).toISOString()}]` : ""}`), ...args);
36
+ },
37
+ warn(...args) {
38
+ state.warning += 1;
39
+ if (silent) {
40
+ return;
41
+ }
42
+ console.warn(
43
+ chalk.yellow(`[WARN]${timestamp ? ` [${(/* @__PURE__ */ new Date()).toISOString()}]` : ""}`),
44
+ ...args
45
+ );
46
+ },
47
+ error(...args) {
48
+ state.errors += 1;
49
+ if (silent) {
50
+ return;
51
+ }
52
+ console.error(
53
+ chalk.red(`[ERROR]${timestamp ? ` [${(/* @__PURE__ */ new Date()).toISOString()}]` : ""}`),
54
+ ...args
55
+ );
56
+ },
57
+ // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.
58
+ spinner(text) {
59
+ if (silent) {
60
+ return {
61
+ succeed() {
62
+ return this;
63
+ },
64
+ fail() {
65
+ return this;
66
+ },
67
+ start() {
68
+ return this;
69
+ },
70
+ text: ""
71
+ };
72
+ }
73
+ return ora(text);
74
+ }
75
+ };
76
+ };
77
+ export {
78
+ createLogger
79
+ };
80
+ //# sourceMappingURL=logger.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.mjs","sources":["../../../src/cli/utils/logger.ts"],"sourcesContent":["import chalk from 'chalk';\nimport ora from 'ora';\n\nexport interface LoggerOptions {\n silent?: boolean;\n debug?: boolean;\n timestamp?: boolean;\n}\n\nexport interface Logger {\n warnings: number;\n errors: number;\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n log: (...args: unknown[]) => void;\n spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text'>;\n}\n\nconst createLogger = (options: LoggerOptions = {}): Logger => {\n const { silent = false, debug = false, timestamp = true } = options;\n\n const state = { errors: 0, warning: 0 };\n\n return {\n get warnings() {\n return state.warning;\n },\n\n get errors() {\n return state.errors;\n },\n\n debug(...args) {\n if (silent || !debug) {\n return;\n }\n\n console.log(\n chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args\n );\n },\n\n info(...args) {\n if (silent) {\n return;\n }\n\n console.info(\n chalk.blue(`[INFO]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args\n );\n },\n\n log(...args) {\n if (silent) {\n return;\n }\n\n console.info(chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`), ...args);\n },\n\n warn(...args) {\n state.warning += 1;\n\n if (silent) {\n return;\n }\n\n console.warn(\n chalk.yellow(`[WARN]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args\n );\n },\n\n error(...args) {\n state.errors += 1;\n\n if (silent) {\n return;\n }\n\n console.error(\n chalk.red(`[ERROR]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args\n );\n },\n\n // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.\n spinner(text: string) {\n if (silent) {\n return {\n succeed() {\n return this;\n },\n fail() {\n return this;\n },\n start() {\n return this;\n },\n text: '',\n };\n }\n\n return ora(text);\n },\n };\n};\n\nexport { createLogger };\n"],"names":[],"mappings":";;AAoBA,MAAM,eAAe,CAAC,UAAyB,OAAe;AAC5D,QAAM,EAAE,SAAS,OAAO,QAAQ,OAAO,YAAY,KAAS,IAAA;AAE5D,QAAM,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE;AAE/B,SAAA;AAAA,IACL,IAAI,WAAW;AACb,aAAO,MAAM;AAAA,IACf;AAAA,IAEA,IAAI,SAAS;AACX,aAAO,MAAM;AAAA,IACf;AAAA,IAEA,SAAS,MAAM;AACT,UAAA,UAAU,CAAC,OAAO;AACpB;AAAA,MACF;AAEQ,cAAA;AAAA,QACN,MAAM,KAAK,UAAU,YAAY,MAAM,oBAAI,KAAK,GAAE,YAAa,CAAA,MAAM,EAAE,EAAE;AAAA,QACzE,GAAG;AAAA,MAAA;AAAA,IAEP;AAAA,IAEA,QAAQ,MAAM;AACZ,UAAI,QAAQ;AACV;AAAA,MACF;AAEQ,cAAA;AAAA,QACN,MAAM,KAAK,SAAS,YAAY,MAAM,oBAAI,KAAK,GAAE,YAAa,CAAA,MAAM,EAAE,EAAE;AAAA,QACxE,GAAG;AAAA,MAAA;AAAA,IAEP;AAAA,IAEA,OAAO,MAAM;AACX,UAAI,QAAQ;AACV;AAAA,MACF;AAEA,cAAQ,KAAK,MAAM,KAAK,GAAG,YAAY,MAAU,oBAAA,KAAA,GAAO,YAAa,CAAA,MAAM,EAAE,EAAE,GAAG,GAAG,IAAI;AAAA,IAC3F;AAAA,IAEA,QAAQ,MAAM;AACZ,YAAM,WAAW;AAEjB,UAAI,QAAQ;AACV;AAAA,MACF;AAEQ,cAAA;AAAA,QACN,MAAM,OAAO,SAAS,YAAY,MAAM,oBAAI,KAAK,GAAE,YAAa,CAAA,MAAM,EAAE,EAAE;AAAA,QAC1E,GAAG;AAAA,MAAA;AAAA,IAEP;AAAA,IAEA,SAAS,MAAM;AACb,YAAM,UAAU;AAEhB,UAAI,QAAQ;AACV;AAAA,MACF;AAEQ,cAAA;AAAA,QACN,MAAM,IAAI,UAAU,YAAY,MAAM,oBAAI,KAAK,GAAE,YAAa,CAAA,MAAM,EAAE,EAAE;AAAA,QACxE,GAAG;AAAA,MAAA;AAAA,IAEP;AAAA;AAAA,IAGA,QAAQ,MAAc;AACpB,UAAI,QAAQ;AACH,eAAA;AAAA,UACL,UAAU;AACD,mBAAA;AAAA,UACT;AAAA,UACA,OAAO;AACE,mBAAA;AAAA,UACT;AAAA,UACA,QAAQ;AACC,mBAAA;AAAA,UACT;AAAA,UACA,MAAM;AAAA,QAAA;AAAA,MAEV;AAEA,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EAAA;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pkg.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/pkg.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,UAAU,MAAM;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BrB,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,OAAO;SAAkC,MAAM;YAAU,MAAM;MAAK,QAAQ,MAAM,CAcvF,CAAC;AAEF,KAAK,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEzD;;;GAGG;AACH,QAAA,MAAM,WAAW;SAA0B,MAAM;MAAK,QAAQ,WAAW,CA+CxE,CAAC;AAEF,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"pkg.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/pkg.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,UAAU,MAAM;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCrB,CAAC;AAEH;;;;GAIG;AACH,QAAA,MAAM,OAAO,oBAA2B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KAAG,QAAQ,MAAM,CAcvF,CAAC;AAEF,KAAK,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEzD;;;GAGG;AACH,QAAA,MAAM,WAAW,YAAmB;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,KAAG,QAAQ,WAAW,CA+CxE,CAAC;AAEF,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { machineID } from "@strapi/utils";
2
+ const sendEvent = async (event, uuid) => {
3
+ try {
4
+ await fetch("https://analytics.strapi.io/api/v2/track", {
5
+ method: "POST",
6
+ body: JSON.stringify({
7
+ event,
8
+ deviceId: machineID(),
9
+ groupProperties: { projectId: uuid }
10
+ }),
11
+ headers: {
12
+ "Content-Type": "application/json",
13
+ "X-Strapi-Event": event
14
+ }
15
+ });
16
+ } catch (e) {
17
+ }
18
+ };
19
+ export {
20
+ sendEvent
21
+ };
22
+ //# sourceMappingURL=telemetry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.mjs","sources":["../../../src/cli/utils/telemetry.ts"],"sourcesContent":["import { machineID } from '@strapi/utils';\n\nexport const sendEvent = async (event: string, uuid: string) => {\n try {\n await fetch('https://analytics.strapi.io/api/v2/track', {\n method: 'POST',\n body: JSON.stringify({\n event,\n deviceId: machineID(),\n groupProperties: { projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch (e) {\n // ...\n }\n};\n"],"names":[],"mappings":";AAEa,MAAA,YAAY,OAAO,OAAe,SAAiB;AAC1D,MAAA;AACF,UAAM,MAAM,4CAA4C;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,UAAU,UAAU;AAAA,QACpB,iBAAiB,EAAE,WAAW,KAAK;AAAA,MAAA,CACpC;AAAA,MACD,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,kBAAkB;AAAA,MACpB;AAAA,IAAA,CACD;AAAA,WACM,GAAG;AAAA,EAEZ;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/tsconfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,UAAU,QAAQ;IAChB,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,QAAA,MAAM,YAAY;SAKX,MAAM;UACL,MAAM;YACJ,MAAM;MACZ,QAAQ,GAAG,SAiBd,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/tsconfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,UAAU,QAAQ;IAChB,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,QAAA,MAAM,YAAY,2BAIf;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,QAAQ,GAAG,SAiBd,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import os from "os";
2
+ import ts from "typescript";
3
+ const loadTsConfig = ({
4
+ cwd,
5
+ path,
6
+ logger
7
+ }) => {
8
+ const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, path);
9
+ if (!configPath) {
10
+ return void 0;
11
+ }
12
+ const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
13
+ const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, cwd);
14
+ logger.debug(`Loaded user TS config:`, os.EOL, parsedConfig);
15
+ return {
16
+ config: parsedConfig,
17
+ path: configPath
18
+ };
19
+ };
20
+ export {
21
+ loadTsConfig
22
+ };
23
+ //# sourceMappingURL=tsconfig.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsconfig.mjs","sources":["../../../src/cli/utils/tsconfig.ts"],"sourcesContent":["import os from 'os';\nimport ts from 'typescript';\nimport type { Logger } from './logger';\n\ninterface TsConfig {\n config: ts.ParsedCommandLine;\n path: string;\n}\n\n/**\n * @description Load a tsconfig.json file and return the parsed config.\n *\n * @internal\n */\nconst loadTsConfig = ({\n cwd,\n path,\n logger,\n}: {\n cwd: string;\n path: string;\n logger: Logger;\n}): TsConfig | undefined => {\n const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, path);\n\n if (!configPath) {\n return undefined;\n }\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile);\n\n const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, cwd);\n\n logger.debug(`Loaded user TS config:`, os.EOL, parsedConfig);\n\n return {\n config: parsedConfig,\n path: configPath,\n };\n};\n\nexport { loadTsConfig };\nexport type { TsConfig };\n"],"names":[],"mappings":";;AAcA,MAAM,eAAe,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,MAI4B;AAC1B,QAAM,aAAa,GAAG,eAAe,KAAK,GAAG,IAAI,YAAY,IAAI;AAEjE,MAAI,CAAC,YAAY;AACR,WAAA;AAAA,EACT;AAEA,QAAM,aAAa,GAAG,eAAe,YAAY,GAAG,IAAI,QAAQ;AAEhE,QAAM,eAAe,GAAG,2BAA2B,WAAW,QAAQ,GAAG,KAAK,GAAG;AAEjF,SAAO,MAAM,0BAA0B,GAAG,KAAK,YAAY;AAEpD,SAAA;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV;"}
@@ -0,0 +1,58 @@
1
+ import * as tsUtils from "@strapi/typescript-utils";
2
+ import { checkRequiredDependencies } from "./core/dependencies.mjs";
3
+ import { prettyTime, getTimer } from "./core/timer.mjs";
4
+ import { createBuildContext } from "./create-build-context.mjs";
5
+ import { writeStaticClientFiles } from "./staticFiles.mjs";
6
+ const build = async ({ logger, cwd, tsconfig, ...options }) => {
7
+ const timer = getTimer();
8
+ const { didInstall } = await checkRequiredDependencies({ cwd, logger }).catch((err) => {
9
+ logger.error(err.message);
10
+ process.exit(1);
11
+ });
12
+ if (didInstall) {
13
+ return;
14
+ }
15
+ if (tsconfig?.config) {
16
+ timer.start("compilingTS");
17
+ const compilingTsSpinner = logger.spinner(`Compiling TS`).start();
18
+ tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });
19
+ const compilingDuration = timer.end("compilingTS");
20
+ compilingTsSpinner.text = `Compiling TS (${prettyTime(compilingDuration)})`;
21
+ compilingTsSpinner.succeed();
22
+ }
23
+ timer.start("createBuildContext");
24
+ const contextSpinner = logger.spinner(`Building build context`).start();
25
+ console.log("");
26
+ const ctx = await createBuildContext({
27
+ cwd,
28
+ logger,
29
+ tsconfig,
30
+ options
31
+ });
32
+ const contextDuration = timer.end("createBuildContext");
33
+ contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;
34
+ contextSpinner.succeed();
35
+ timer.start("buildAdmin");
36
+ const buildingSpinner = logger.spinner(`Building admin panel`).start();
37
+ console.log("");
38
+ try {
39
+ await writeStaticClientFiles(ctx);
40
+ if (ctx.bundler === "webpack") {
41
+ const { build: buildWebpack } = await import("./webpack/build.mjs");
42
+ await buildWebpack(ctx);
43
+ } else if (ctx.bundler === "vite") {
44
+ const { build: buildVite } = await import("./vite/build.mjs");
45
+ await buildVite(ctx);
46
+ }
47
+ const buildDuration = timer.end("buildAdmin");
48
+ buildingSpinner.text = `Building admin panel (${prettyTime(buildDuration)})`;
49
+ buildingSpinner.succeed();
50
+ } catch (err) {
51
+ buildingSpinner.fail();
52
+ throw err;
53
+ }
54
+ };
55
+ export {
56
+ build
57
+ };
58
+ //# sourceMappingURL=build.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.mjs","sources":["../../src/node/build.ts"],"sourcesContent":["import * as tsUtils from '@strapi/typescript-utils';\nimport type { CLIContext } from '../cli/types';\nimport { checkRequiredDependencies } from './core/dependencies';\nimport { getTimer, prettyTime } from './core/timer';\nimport { createBuildContext } from './create-build-context';\nimport { writeStaticClientFiles } from './staticFiles';\n\ninterface BuildOptions extends CLIContext {\n /**\n * Which bundler to use for building.\n *\n * @default webpack\n */\n bundler?: 'webpack' | 'vite';\n /**\n * Minify the output\n *\n * @default true\n */\n minify?: boolean;\n /**\n * Generate sourcemaps – useful for debugging bugs in the admin panel UI.\n */\n sourcemaps?: boolean;\n /**\n * Print stats for build\n */\n stats?: boolean;\n}\n\n/**\n * @example `$ strapi build`\n *\n * @description Builds the admin panel of the strapi application.\n */\nconst build = async ({ logger, cwd, tsconfig, ...options }: BuildOptions) => {\n const timer = getTimer();\n\n const { didInstall } = await checkRequiredDependencies({ cwd, logger }).catch((err) => {\n logger.error(err.message);\n process.exit(1);\n });\n\n if (didInstall) {\n return;\n }\n\n if (tsconfig?.config) {\n timer.start('compilingTS');\n const compilingTsSpinner = logger.spinner(`Compiling TS`).start();\n\n tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });\n\n const compilingDuration = timer.end('compilingTS');\n compilingTsSpinner.text = `Compiling TS (${prettyTime(compilingDuration)})`;\n compilingTsSpinner.succeed();\n }\n\n timer.start('createBuildContext');\n const contextSpinner = logger.spinner(`Building build context`).start();\n console.log('');\n\n const ctx = await createBuildContext({\n cwd,\n logger,\n tsconfig,\n options,\n });\n\n const contextDuration = timer.end('createBuildContext');\n contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;\n contextSpinner.succeed();\n\n timer.start('buildAdmin');\n const buildingSpinner = logger.spinner(`Building admin panel`).start();\n console.log('');\n\n try {\n await writeStaticClientFiles(ctx);\n\n if (ctx.bundler === 'webpack') {\n const { build: buildWebpack } = await import('./webpack/build');\n await buildWebpack(ctx);\n } else if (ctx.bundler === 'vite') {\n const { build: buildVite } = await import('./vite/build');\n await buildVite(ctx);\n }\n\n const buildDuration = timer.end('buildAdmin');\n buildingSpinner.text = `Building admin panel (${prettyTime(buildDuration)})`;\n buildingSpinner.succeed();\n } catch (err) {\n buildingSpinner.fail();\n throw err;\n }\n};\n\nexport { build };\nexport type { BuildOptions };\n"],"names":[],"mappings":";;;;;AAmCM,MAAA,QAAQ,OAAO,EAAE,QAAQ,KAAK,UAAU,GAAG,cAA4B;AAC3E,QAAM,QAAQ;AAEd,QAAM,EAAE,eAAe,MAAM,0BAA0B,EAAE,KAAK,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAC9E,WAAA,MAAM,IAAI,OAAO;AACxB,YAAQ,KAAK,CAAC;AAAA,EAAA,CACf;AAED,MAAI,YAAY;AACd;AAAA,EACF;AAEA,MAAI,UAAU,QAAQ;AACpB,UAAM,MAAM,aAAa;AACzB,UAAM,qBAAqB,OAAO,QAAQ,cAAc,EAAE;AAElD,YAAA,QAAQ,KAAK,EAAE,eAAe,EAAE,mBAAmB,SAAS;AAE9D,UAAA,oBAAoB,MAAM,IAAI,aAAa;AACjD,uBAAmB,OAAO,iBAAiB,WAAW,iBAAiB,CAAC;AACxE,uBAAmB,QAAQ;AAAA,EAC7B;AAEA,QAAM,MAAM,oBAAoB;AAChC,QAAM,iBAAiB,OAAO,QAAQ,wBAAwB,EAAE;AAChE,UAAQ,IAAI,EAAE;AAER,QAAA,MAAM,MAAM,mBAAmB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAEK,QAAA,kBAAkB,MAAM,IAAI,oBAAoB;AACtD,iBAAe,OAAO,2BAA2B,WAAW,eAAe,CAAC;AAC5E,iBAAe,QAAQ;AAEvB,QAAM,MAAM,YAAY;AACxB,QAAM,kBAAkB,OAAO,QAAQ,sBAAsB,EAAE;AAC/D,UAAQ,IAAI,EAAE;AAEV,MAAA;AACF,UAAM,uBAAuB,GAAG;AAE5B,QAAA,IAAI,YAAY,WAAW;AAC7B,YAAM,EAAE,OAAO,aAAiB,IAAA,MAAM,OAAO,qBAAiB;AAC9D,YAAM,aAAa,GAAG;AAAA,IAAA,WACb,IAAI,YAAY,QAAQ;AACjC,YAAM,EAAE,OAAO,UAAc,IAAA,MAAM,OAAO,kBAAc;AACxD,YAAM,UAAU,GAAG;AAAA,IACrB;AAEM,UAAA,gBAAgB,MAAM,IAAI,YAAY;AAC5C,oBAAgB,OAAO,yBAAyB,WAAW,aAAa,CAAC;AACzE,oBAAgB,QAAQ;AAAA,WACjB,KAAK;AACZ,oBAAgB,KAAK;AACf,UAAA;AAAA,EACR;AACF;"}
@@ -0,0 +1,22 @@
1
+ import path from "node:path";
2
+ import { pathExists, convertSystemPathToModulePath } from "./files.mjs";
3
+ const ADMIN_APP_FILES = ["app.js", "app.mjs", "app.ts", "app.jsx", "app.tsx"];
4
+ const loadUserAppFile = async ({
5
+ runtimeDir,
6
+ appDir
7
+ }) => {
8
+ for (const file of ADMIN_APP_FILES) {
9
+ const filePath = path.join(appDir, "src", "admin", file);
10
+ if (await pathExists(filePath)) {
11
+ return {
12
+ path: filePath,
13
+ modulePath: convertSystemPathToModulePath(path.relative(runtimeDir, filePath))
14
+ };
15
+ }
16
+ }
17
+ return void 0;
18
+ };
19
+ export {
20
+ loadUserAppFile
21
+ };
22
+ //# sourceMappingURL=admin-customisations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-customisations.mjs","sources":["../../../src/node/core/admin-customisations.ts"],"sourcesContent":["import path from 'node:path';\nimport { convertSystemPathToModulePath, pathExists } from './files';\nimport type { BaseContext } from '../types';\n\nconst ADMIN_APP_FILES = ['app.js', 'app.mjs', 'app.ts', 'app.jsx', 'app.tsx'];\n\ninterface AdminCustomisations {\n config?: {\n locales?: string[];\n };\n bootstrap?: (...args: any[]) => any;\n}\n\ninterface AppFile {\n /**\n * The system path to the file\n */\n path: string;\n /**\n * The module path to the file i.e. how you would import it\n */\n modulePath: string;\n}\n\nconst loadUserAppFile = async ({\n runtimeDir,\n appDir,\n}: Pick<BaseContext, 'appDir' | 'runtimeDir'>): Promise<AppFile | undefined> => {\n for (const file of ADMIN_APP_FILES) {\n const filePath = path.join(appDir, 'src', 'admin', file);\n\n if (await pathExists(filePath)) {\n return {\n path: filePath,\n modulePath: convertSystemPathToModulePath(path.relative(runtimeDir, filePath)),\n };\n }\n }\n\n return undefined;\n};\n\nexport { loadUserAppFile };\nexport type { AdminCustomisations, AppFile };\n"],"names":[],"mappings":";;AAIA,MAAM,kBAAkB,CAAC,UAAU,WAAW,UAAU,WAAW,SAAS;AAoB5E,MAAM,kBAAkB,OAAO;AAAA,EAC7B;AAAA,EACA;AACF,MAAgF;AAC9E,aAAW,QAAQ,iBAAiB;AAClC,UAAM,WAAW,KAAK,KAAK,QAAQ,OAAO,SAAS,IAAI;AAEnD,QAAA,MAAM,WAAW,QAAQ,GAAG;AACvB,aAAA;AAAA,QACL,MAAM;AAAA,QACN,YAAY,8BAA8B,KAAK,SAAS,YAAY,QAAQ,CAAC;AAAA,MAAA;AAAA,IAEjF;AAAA,EACF;AAEO,SAAA;AACT;"}
@@ -1,6 +1,6 @@
1
1
  import { StrapiMonorepo } from './monorepo';
2
2
  declare const getMonorepoAliases: ({ monorepo }: {
3
- monorepo?: StrapiMonorepo | undefined;
3
+ monorepo?: StrapiMonorepo;
4
4
  }) => {
5
5
  [k: string]: string;
6
6
  };
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../../src/node/core/aliases.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyB5C,QAAA,MAAM,kBAAkB;;;;CAUvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../../src/node/core/aliases.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2B5C,QAAA,MAAM,kBAAkB,iBAAkB;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE;;CAUtE,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -6,15 +6,18 @@ const path__default = /* @__PURE__ */ _interopDefault(path);
6
6
  const devAliases = {
7
7
  "@strapi/admin/strapi-admin": "./packages/core/admin/admin/src",
8
8
  "@strapi/content-releases/strapi-admin": "./packages/core/content-releases/admin/src",
9
- "@strapi/plugin-content-type-builder/strapi-admin": "./packages/core/content-type-builder/admin/src",
10
- "@strapi/plugin-email/strapi-admin": "./packages/core/email/admin/src",
11
- "@strapi/plugin-upload/strapi-admin": "./packages/core/upload/admin/src",
9
+ "@strapi/content-manager/strapi-admin": "./packages/core/content-manager/admin/src",
10
+ "@strapi/content-type-builder/strapi-admin": "./packages/core/content-type-builder/admin/src",
11
+ "@strapi/email/strapi-admin": "./packages/core/email/admin/src",
12
+ "@strapi/upload/strapi-admin": "./packages/core/upload/admin/src",
13
+ "@strapi/plugin-cloud/strapi-admin": "./packages/plugins/cloud/admin/src",
12
14
  "@strapi/plugin-color-picker/strapi-admin": "./packages/plugins/color-picker/admin/src",
13
15
  "@strapi/plugin-documentation/strapi-admin": "./packages/plugins/documentation/admin/src",
14
16
  "@strapi/plugin-graphql/strapi-admin": "./packages/plugins/graphql/admin/src",
15
- "@strapi/plugin-i18n/strapi-admin": "./packages/plugins/i18n/admin/src",
17
+ "@strapi/i18n/strapi-admin": "./packages/plugins/i18n/admin/src",
16
18
  "@strapi/plugin-sentry/strapi-admin": "./packages/plugins/sentry/admin/src",
17
- "@strapi/plugin-users-permissions/strapi-admin": "./packages/plugins/users-permissions/admin/src"
19
+ "@strapi/plugin-users-permissions/strapi-admin": "./packages/plugins/users-permissions/admin/src",
20
+ "@strapi/review-workflows/strapi-admin": "./packages/core/review-workflows/admin/src"
18
21
  };
19
22
  const getMonorepoAliases = ({ monorepo }) => {
20
23
  if (!monorepo?.path) {
@@ -1 +1 @@
1
- {"version":3,"file":"aliases.js","sources":["../../../src/node/core/aliases.ts"],"sourcesContent":["import path from 'node:path';\nimport { StrapiMonorepo } from './monorepo';\n\n/**\n * The path mappings/aliases used by various tools in the monorepo to map imported modules to\n * source files in order to speed up rebuilding and avoid having a separate watcher process to build\n * from `src` to `lib`.\n *\n * This file is currently read by:\n * - Webpack when running the dev server (only when running in this monorepo)\n */\nconst devAliases: Record<string, string> = {\n '@strapi/admin/strapi-admin': './packages/core/admin/admin/src',\n '@strapi/content-releases/strapi-admin': './packages/core/content-releases/admin/src',\n '@strapi/plugin-content-type-builder/strapi-admin':\n './packages/core/content-type-builder/admin/src',\n '@strapi/plugin-email/strapi-admin': './packages/core/email/admin/src',\n '@strapi/plugin-upload/strapi-admin': './packages/core/upload/admin/src',\n '@strapi/plugin-color-picker/strapi-admin': './packages/plugins/color-picker/admin/src',\n '@strapi/plugin-documentation/strapi-admin': './packages/plugins/documentation/admin/src',\n '@strapi/plugin-graphql/strapi-admin': './packages/plugins/graphql/admin/src',\n '@strapi/plugin-i18n/strapi-admin': './packages/plugins/i18n/admin/src',\n '@strapi/plugin-sentry/strapi-admin': './packages/plugins/sentry/admin/src',\n '@strapi/plugin-users-permissions/strapi-admin': './packages/plugins/users-permissions/admin/src',\n};\n\nconst getMonorepoAliases = ({ monorepo }: { monorepo?: StrapiMonorepo }) => {\n if (!monorepo?.path) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(devAliases).map(([key, modulePath]) => {\n return [key, path.join(monorepo.path, modulePath)];\n })\n );\n};\n\nexport { getMonorepoAliases };\n"],"names":["path"],"mappings":";;;;;AAWA,MAAM,aAAqC;AAAA,EACzC,8BAA8B;AAAA,EAC9B,yCAAyC;AAAA,EACzC,oDACE;AAAA,EACF,qCAAqC;AAAA,EACrC,sCAAsC;AAAA,EACtC,4CAA4C;AAAA,EAC5C,6CAA6C;AAAA,EAC7C,uCAAuC;AAAA,EACvC,oCAAoC;AAAA,EACpC,sCAAsC;AAAA,EACtC,iDAAiD;AACnD;AAEA,MAAM,qBAAqB,CAAC,EAAE,eAA8C;AACtE,MAAA,CAAC,UAAU,MAAM;AACnB,WAAO;EACT;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACpD,aAAO,CAAC,KAAKA,sBAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAAA,IAAA,CAClD;AAAA,EAAA;AAEL;;"}
1
+ {"version":3,"file":"aliases.js","sources":["../../../src/node/core/aliases.ts"],"sourcesContent":["import path from 'node:path';\nimport { StrapiMonorepo } from './monorepo';\n\n/**\n * The path mappings/aliases used by various tools in the monorepo to map imported modules to\n * source files in order to speed up rebuilding and avoid having a separate watcher process to build\n * from `src` to `lib`.\n *\n * This file is currently read by:\n * - Webpack when running the dev server (only when running in this monorepo)\n */\nconst devAliases: Record<string, string> = {\n '@strapi/admin/strapi-admin': './packages/core/admin/admin/src',\n '@strapi/content-releases/strapi-admin': './packages/core/content-releases/admin/src',\n '@strapi/content-manager/strapi-admin': './packages/core/content-manager/admin/src',\n '@strapi/content-type-builder/strapi-admin': './packages/core/content-type-builder/admin/src',\n '@strapi/email/strapi-admin': './packages/core/email/admin/src',\n '@strapi/upload/strapi-admin': './packages/core/upload/admin/src',\n '@strapi/plugin-cloud/strapi-admin': './packages/plugins/cloud/admin/src',\n '@strapi/plugin-color-picker/strapi-admin': './packages/plugins/color-picker/admin/src',\n '@strapi/plugin-documentation/strapi-admin': './packages/plugins/documentation/admin/src',\n '@strapi/plugin-graphql/strapi-admin': './packages/plugins/graphql/admin/src',\n '@strapi/i18n/strapi-admin': './packages/plugins/i18n/admin/src',\n '@strapi/plugin-sentry/strapi-admin': './packages/plugins/sentry/admin/src',\n '@strapi/plugin-users-permissions/strapi-admin': './packages/plugins/users-permissions/admin/src',\n '@strapi/review-workflows/strapi-admin': './packages/core/review-workflows/admin/src',\n};\n\nconst getMonorepoAliases = ({ monorepo }: { monorepo?: StrapiMonorepo }) => {\n if (!monorepo?.path) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(devAliases).map(([key, modulePath]) => {\n return [key, path.join(monorepo.path, modulePath)];\n })\n );\n};\n\nexport { getMonorepoAliases };\n"],"names":["path"],"mappings":";;;;;AAWA,MAAM,aAAqC;AAAA,EACzC,8BAA8B;AAAA,EAC9B,yCAAyC;AAAA,EACzC,wCAAwC;AAAA,EACxC,6CAA6C;AAAA,EAC7C,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,qCAAqC;AAAA,EACrC,4CAA4C;AAAA,EAC5C,6CAA6C;AAAA,EAC7C,uCAAuC;AAAA,EACvC,6BAA6B;AAAA,EAC7B,sCAAsC;AAAA,EACtC,iDAAiD;AAAA,EACjD,yCAAyC;AAC3C;AAEA,MAAM,qBAAqB,CAAC,EAAE,eAA8C;AACtE,MAAA,CAAC,UAAU,MAAM;AACnB,WAAO;EACT;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACpD,aAAO,CAAC,KAAKA,sBAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAAA,IAAA,CAClD;AAAA,EAAA;AAEL;;"}
@@ -0,0 +1,31 @@
1
+ import path from "node:path";
2
+ const devAliases = {
3
+ "@strapi/admin/strapi-admin": "./packages/core/admin/admin/src",
4
+ "@strapi/content-releases/strapi-admin": "./packages/core/content-releases/admin/src",
5
+ "@strapi/content-manager/strapi-admin": "./packages/core/content-manager/admin/src",
6
+ "@strapi/content-type-builder/strapi-admin": "./packages/core/content-type-builder/admin/src",
7
+ "@strapi/email/strapi-admin": "./packages/core/email/admin/src",
8
+ "@strapi/upload/strapi-admin": "./packages/core/upload/admin/src",
9
+ "@strapi/plugin-cloud/strapi-admin": "./packages/plugins/cloud/admin/src",
10
+ "@strapi/plugin-color-picker/strapi-admin": "./packages/plugins/color-picker/admin/src",
11
+ "@strapi/plugin-documentation/strapi-admin": "./packages/plugins/documentation/admin/src",
12
+ "@strapi/plugin-graphql/strapi-admin": "./packages/plugins/graphql/admin/src",
13
+ "@strapi/i18n/strapi-admin": "./packages/plugins/i18n/admin/src",
14
+ "@strapi/plugin-sentry/strapi-admin": "./packages/plugins/sentry/admin/src",
15
+ "@strapi/plugin-users-permissions/strapi-admin": "./packages/plugins/users-permissions/admin/src",
16
+ "@strapi/review-workflows/strapi-admin": "./packages/core/review-workflows/admin/src"
17
+ };
18
+ const getMonorepoAliases = ({ monorepo }) => {
19
+ if (!monorepo?.path) {
20
+ return {};
21
+ }
22
+ return Object.fromEntries(
23
+ Object.entries(devAliases).map(([key, modulePath]) => {
24
+ return [key, path.join(monorepo.path, modulePath)];
25
+ })
26
+ );
27
+ };
28
+ export {
29
+ getMonorepoAliases
30
+ };
31
+ //# sourceMappingURL=aliases.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.mjs","sources":["../../../src/node/core/aliases.ts"],"sourcesContent":["import path from 'node:path';\nimport { StrapiMonorepo } from './monorepo';\n\n/**\n * The path mappings/aliases used by various tools in the monorepo to map imported modules to\n * source files in order to speed up rebuilding and avoid having a separate watcher process to build\n * from `src` to `lib`.\n *\n * This file is currently read by:\n * - Webpack when running the dev server (only when running in this monorepo)\n */\nconst devAliases: Record<string, string> = {\n '@strapi/admin/strapi-admin': './packages/core/admin/admin/src',\n '@strapi/content-releases/strapi-admin': './packages/core/content-releases/admin/src',\n '@strapi/content-manager/strapi-admin': './packages/core/content-manager/admin/src',\n '@strapi/content-type-builder/strapi-admin': './packages/core/content-type-builder/admin/src',\n '@strapi/email/strapi-admin': './packages/core/email/admin/src',\n '@strapi/upload/strapi-admin': './packages/core/upload/admin/src',\n '@strapi/plugin-cloud/strapi-admin': './packages/plugins/cloud/admin/src',\n '@strapi/plugin-color-picker/strapi-admin': './packages/plugins/color-picker/admin/src',\n '@strapi/plugin-documentation/strapi-admin': './packages/plugins/documentation/admin/src',\n '@strapi/plugin-graphql/strapi-admin': './packages/plugins/graphql/admin/src',\n '@strapi/i18n/strapi-admin': './packages/plugins/i18n/admin/src',\n '@strapi/plugin-sentry/strapi-admin': './packages/plugins/sentry/admin/src',\n '@strapi/plugin-users-permissions/strapi-admin': './packages/plugins/users-permissions/admin/src',\n '@strapi/review-workflows/strapi-admin': './packages/core/review-workflows/admin/src',\n};\n\nconst getMonorepoAliases = ({ monorepo }: { monorepo?: StrapiMonorepo }) => {\n if (!monorepo?.path) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(devAliases).map(([key, modulePath]) => {\n return [key, path.join(monorepo.path, modulePath)];\n })\n );\n};\n\nexport { getMonorepoAliases };\n"],"names":[],"mappings":";AAWA,MAAM,aAAqC;AAAA,EACzC,8BAA8B;AAAA,EAC9B,yCAAyC;AAAA,EACzC,wCAAwC;AAAA,EACxC,6CAA6C;AAAA,EAC7C,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,qCAAqC;AAAA,EACrC,4CAA4C;AAAA,EAC5C,6CAA6C;AAAA,EAC7C,uCAAuC;AAAA,EACvC,6BAA6B;AAAA,EAC7B,sCAAsC;AAAA,EACtC,iDAAiD;AAAA,EACjD,yCAAyC;AAC3C;AAEA,MAAM,qBAAqB,CAAC,EAAE,eAA8C;AACtE,MAAA,CAAC,UAAU,MAAM;AACnB,WAAO;EACT;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACpD,aAAO,CAAC,KAAK,KAAK,KAAK,SAAS,MAAM,UAAU,CAAC;AAAA,IAAA,CAClD;AAAA,EAAA;AAEL;"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/node/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,QAAA,MAAM,aAAa,uBACN,MAAM,EAAE,OACd,YAAY,iCAYlB,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/node/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,QAAA,MAAM,aAAa,uBACN,MAAM,EAAE,OACd,YAAY,KAChB,QAAQ,OAAO,GAAG,SAAS,CAW7B,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import path from "node:path";
2
+ import { loadFile } from "./files.mjs";
3
+ const getUserConfig = async (fileNames, ctx) => {
4
+ for (const file of fileNames) {
5
+ const filePath = path.join(ctx.appDir, "src", "admin", file);
6
+ const configFile = await loadFile(filePath);
7
+ if (configFile) {
8
+ return configFile;
9
+ }
10
+ }
11
+ return void 0;
12
+ };
13
+ export {
14
+ getUserConfig
15
+ };
16
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","sources":["../../../src/node/core/config.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { BuildContext } from '../create-build-context';\nimport { loadFile } from './files';\n\nconst getUserConfig = async <TConfig>(\n fileNames: string[],\n ctx: BuildContext\n): Promise<TConfig | undefined> => {\n for (const file of fileNames) {\n const filePath = path.join(ctx.appDir, 'src', 'admin', file);\n const configFile = await loadFile(filePath);\n\n if (configFile) {\n return configFile;\n }\n }\n\n return undefined;\n};\n\nexport { getUserConfig };\n"],"names":[],"mappings":";;AAKM,MAAA,gBAAgB,OACpB,WACA,QACiC;AACjC,aAAW,QAAQ,WAAW;AAC5B,UAAM,WAAW,KAAK,KAAK,IAAI,QAAQ,OAAO,SAAS,IAAI;AACrD,UAAA,aAAa,MAAM,SAAS,QAAQ;AAE1C,QAAI,YAAY;AACP,aAAA;AAAA,IACT;AAAA,EACF;AAEO,SAAA;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/node/core/dependencies.ts"],"names":[],"mappings":"AAMA,OAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAa7C,UAAU,+BAA+B;IACvC,UAAU,EAAE,OAAO,CAAC;CACrB;AAQD;;;;;;;;GAQG;AACH,QAAA,MAAM,yBAAyB,qBAG5B,KAAK,YAAY,EAAE,KAAK,GAAG,QAAQ,CAAC,KAAG,QAAQ,+BAA+B,CA+HhF,CAAC;AAEF,QAAA,MAAM,SAAS,SAAgB,MAAM,OAAO,MAAM,KAAG,QAAQ,WAAW,GAAG,IAAI,CAQ9E,CAAC;AAkDF,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,CAAC;AAChD,YAAY,EAAE,+BAA+B,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/node/core/dependencies.ts"],"names":[],"mappings":"AAMA,OAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAa7C,UAAU,+BAA+B;IACvC,UAAU,EAAE,OAAO,CAAC;CACrB;AAQD;;;;;;;;GAQG;AACH,QAAA,MAAM,yBAAyB,qBAG5B,KAAK,YAAY,EAAE,KAAK,GAAG,QAAQ,CAAC,KAAG,QAAQ,+BAA+B,CAwIhF,CAAC;AAEF,QAAA,MAAM,SAAS,SAAgB,MAAM,OAAO,MAAM,KAAG,QAAQ,WAAW,GAAG,IAAI,CAQ9E,CAAC;AAkDF,OAAO,EAAE,yBAAyB,EAAE,SAAS,EAAE,CAAC;AAChD,YAAY,EAAE,+BAA+B,EAAE,WAAW,EAAE,CAAC"}
@@ -20,12 +20,16 @@ const PEER_DEPS = {
20
20
  react: "^18.0.0",
21
21
  "react-dom": "^18.0.0",
22
22
  "react-router-dom": "^6.0.0",
23
- "styled-components": "^5.2.1"
23
+ "styled-components": "^6.0.0"
24
24
  };
25
25
  const checkRequiredDependencies = async ({
26
26
  cwd,
27
27
  logger
28
28
  }) => {
29
+ if (process.env.USE_EXPERIMENTAL_DEPENDENCIES === "true") {
30
+ logger.warn("You are using experimental dependencies that may not be compatible with Strapi.");
31
+ return { didInstall: false };
32
+ }
29
33
  const pkg = await readPkgUp__default.default({ cwd });
30
34
  if (!pkg) {
31
35
  throw new Error(`Could not find package.json at path: ${cwd}`);
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sources":["../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\nimport type { BuildOptions } from '../build';\nimport { getPackageManager } from './managers';\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^5.2.1',\n};\n\ninterface CheckRequiredDependenciesResult {\n didInstall: boolean;\n}\n\ninterface DepToInstall {\n name: string;\n wantedVersion: string;\n declaredVersion?: never;\n}\n\n/**\n * Checks the user's project that it has declared and installed the required dependencies\n * needed by the Strapi admin project. Whilst generally speaking most modules will be\n * declared by the actual packages there are some packages where you only really want one of\n * and thus they are declared as peer dependencies – react / styled-components / etc.\n *\n * If these deps are not installed or declared, then we prompt the user to correct this. In\n * V4 this is not a hard requirement, but in V5 it will be. Might as well get people started now.\n */\nconst checkRequiredDependencies = async ({\n cwd,\n logger,\n}: Pick<BuildOptions, 'cwd' | 'logger'>): Promise<CheckRequiredDependenciesResult> => {\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n interface DepToReview {\n name: string;\n wantedVersion: string;\n declaredVersion: string;\n }\n\n /**\n * Run through each of the peer deps and figure out if they need to be\n * installed or they need their version checked against.\n */\n const { install, review } = Object.entries(PEER_DEPS).reduce<{\n install: DepToInstall[];\n review: DepToReview[];\n }>(\n (acc, [name, version]) => {\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n const declaredVersion = pkg.packageJson.dependencies[name];\n\n if (!declaredVersion) {\n acc.install.push({\n name,\n wantedVersion: version,\n });\n } else {\n acc.review.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return acc;\n },\n {\n install: [],\n review: [],\n }\n );\n\n if (install.length > 0) {\n logger.info(\n 'The Strapi admin needs to install the following dependencies:',\n os.EOL,\n install.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n\n await installDependencies(install, {\n cwd,\n logger,\n });\n\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n return { didInstall: true };\n }\n\n if (review.length) {\n const errors: string[] = [];\n\n for (const dep of review) {\n // The version specified in package.json could be incorrect, eg `foo`\n let minDeclaredVersion: SemVer | null = null;\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n /**\n * The delcared version should be semver compatible with our required version\n * of the dependency. If it's not, we should advise the user to change it.\n */\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n /**\n * TODO: when we know the packageManager we can advise the actual install command.\n */\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n }\n\n return { didInstall: false };\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nconst installDependencies = async (\n install: DepToInstall[],\n { cwd, logger }: Pick<BuildOptions, 'cwd' | 'logger'>\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = install.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nexport { checkRequiredDependencies, getModule };\nexport type { CheckRequiredDependenciesResult, PackageJson };\n"],"names":["readPkgUp","os","execa","semver","resolveFrom","path","fs","getPackageManager"],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.js","sources":["../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\nimport type { BuildOptions } from '../build';\nimport { getPackageManager } from './managers';\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n};\n\ninterface CheckRequiredDependenciesResult {\n didInstall: boolean;\n}\n\ninterface DepToInstall {\n name: string;\n wantedVersion: string;\n declaredVersion?: never;\n}\n\n/**\n * Checks the user's project that it has declared and installed the required dependencies\n * needed by the Strapi admin project. Whilst generally speaking most modules will be\n * declared by the actual packages there are some packages where you only really want one of\n * and thus they are declared as peer dependencies – react / styled-components / etc.\n *\n * If these deps are not installed or declared, then we prompt the user to correct this. In\n * V4 this is not a hard requirement, but in V5 it will be. Might as well get people started now.\n */\nconst checkRequiredDependencies = async ({\n cwd,\n logger,\n}: Pick<BuildOptions, 'cwd' | 'logger'>): Promise<CheckRequiredDependenciesResult> => {\n /**\n * This enables us to use experimental deps for libraries like\n * react or styled-components. This is useful for testing against.\n */\n if (process.env.USE_EXPERIMENTAL_DEPENDENCIES === 'true') {\n logger.warn('You are using experimental dependencies that may not be compatible with Strapi.');\n return { didInstall: false };\n }\n\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n interface DepToReview {\n name: string;\n wantedVersion: string;\n declaredVersion: string;\n }\n\n /**\n * Run through each of the peer deps and figure out if they need to be\n * installed or they need their version checked against.\n */\n const { install, review } = Object.entries(PEER_DEPS).reduce<{\n install: DepToInstall[];\n review: DepToReview[];\n }>(\n (acc, [name, version]) => {\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n const declaredVersion = pkg.packageJson.dependencies[name];\n\n if (!declaredVersion) {\n acc.install.push({\n name,\n wantedVersion: version,\n });\n } else {\n acc.review.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return acc;\n },\n {\n install: [],\n review: [],\n }\n );\n\n if (install.length > 0) {\n logger.info(\n 'The Strapi admin needs to install the following dependencies:',\n os.EOL,\n install.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n\n await installDependencies(install, {\n cwd,\n logger,\n });\n\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n return { didInstall: true };\n }\n\n if (review.length) {\n const errors: string[] = [];\n\n for (const dep of review) {\n // The version specified in package.json could be incorrect, eg `foo`\n let minDeclaredVersion: SemVer | null = null;\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n /**\n * The delcared version should be semver compatible with our required version\n * of the dependency. If it's not, we should advise the user to change it.\n */\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n /**\n * TODO: when we know the packageManager we can advise the actual install command.\n */\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n }\n\n return { didInstall: false };\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nconst installDependencies = async (\n install: DepToInstall[],\n { cwd, logger }: Pick<BuildOptions, 'cwd' | 'logger'>\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = install.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nexport { checkRequiredDependencies, getModule };\nexport type { CheckRequiredDependenciesResult, PackageJson };\n"],"names":["readPkgUp","os","execa","semver","resolveFrom","path","fs","getPackageManager"],"mappings":"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"}