@strapi/strapi 5.55.1 → 5.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/admin-styles.css +5 -0
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/content-types/rename-field.d.ts +13 -0
  4. package/dist/cli/commands/content-types/rename-field.d.ts.map +1 -0
  5. package/dist/cli/commands/develop.d.ts.map +1 -1
  6. package/dist/cli/commands/enterprise/index.d.ts +7 -0
  7. package/dist/cli/commands/enterprise/index.d.ts.map +1 -0
  8. package/dist/cli/commands/enterprise/install/action.d.ts +36 -0
  9. package/dist/cli/commands/enterprise/install/action.d.ts.map +1 -0
  10. package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts +14 -0
  11. package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts.map +1 -0
  12. package/dist/cli/commands/enterprise/install/constants.d.ts +7 -0
  13. package/dist/cli/commands/enterprise/install/constants.d.ts.map +1 -0
  14. package/dist/cli/commands/enterprise/install/directories.d.ts +3 -0
  15. package/dist/cli/commands/enterprise/install/directories.d.ts.map +1 -0
  16. package/dist/cli/commands/enterprise/install/discovery.d.ts +29 -0
  17. package/dist/cli/commands/enterprise/install/discovery.d.ts.map +1 -0
  18. package/dist/cli/commands/enterprise/install/errors.d.ts +11 -0
  19. package/dist/cli/commands/enterprise/install/errors.d.ts.map +1 -0
  20. package/dist/cli/commands/enterprise/install/install-packages.d.ts +11 -0
  21. package/dist/cli/commands/enterprise/install/install-packages.d.ts.map +1 -0
  22. package/dist/cli/commands/enterprise/install/license.d.ts +27 -0
  23. package/dist/cli/commands/enterprise/install/license.d.ts.map +1 -0
  24. package/dist/cli/commands/enterprise/install/package-manager.d.ts +17 -0
  25. package/dist/cli/commands/enterprise/install/package-manager.d.ts.map +1 -0
  26. package/dist/cli/commands/enterprise/install/plugin-status.d.ts +44 -0
  27. package/dist/cli/commands/enterprise/install/plugin-status.d.ts.map +1 -0
  28. package/dist/cli/commands/enterprise/install/registry-access.d.ts +55 -0
  29. package/dist/cli/commands/enterprise/install/registry-access.d.ts.map +1 -0
  30. package/dist/cli/commands/enterprise/install/registry.d.ts +54 -0
  31. package/dist/cli/commands/enterprise/install/registry.d.ts.map +1 -0
  32. package/dist/cli/commands/enterprise/install/selection.d.ts +62 -0
  33. package/dist/cli/commands/enterprise/install/selection.d.ts.map +1 -0
  34. package/dist/cli/commands/enterprise/install/setup-links.d.ts +16 -0
  35. package/dist/cli/commands/enterprise/install/setup-links.d.ts.map +1 -0
  36. package/dist/cli/commands/enterprise/install/versions.d.ts +42 -0
  37. package/dist/cli/commands/enterprise/install/versions.d.ts.map +1 -0
  38. package/dist/cli/commands/index.d.ts.map +1 -1
  39. package/dist/cli/utils/commander.d.ts.map +1 -1
  40. package/dist/cli/utils/helpers.d.ts +1 -1
  41. package/dist/cli/utils/helpers.d.ts.map +1 -1
  42. package/dist/node/core/admin-vite-aliases.d.ts +9 -0
  43. package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
  44. package/dist/node/core/aliases.d.ts +4 -1
  45. package/dist/node/core/aliases.d.ts.map +1 -1
  46. package/dist/node/core/scan-roots.d.ts +20 -0
  47. package/dist/node/core/scan-roots.d.ts.map +1 -0
  48. package/dist/node/create-build-context.d.ts +10 -1
  49. package/dist/node/create-build-context.d.ts.map +1 -1
  50. package/dist/node/develop.d.ts.map +1 -1
  51. package/dist/node/staticFiles.d.ts +3 -1
  52. package/dist/node/staticFiles.d.ts.map +1 -1
  53. package/dist/node/vite/config.d.ts.map +1 -1
  54. package/dist/node/vite/plugins.d.ts +2 -1
  55. package/dist/node/vite/plugins.d.ts.map +1 -1
  56. package/dist/node/vite/plugins.test.d.ts +2 -0
  57. package/dist/node/vite/plugins.test.d.ts.map +1 -0
  58. package/dist/package.json.js +1 -1
  59. package/dist/package.json.mjs +1 -1
  60. package/dist/src/cli/commands/build.js +4 -2
  61. package/dist/src/cli/commands/build.js.map +1 -1
  62. package/dist/src/cli/commands/build.mjs +4 -2
  63. package/dist/src/cli/commands/build.mjs.map +1 -1
  64. package/dist/src/cli/commands/content-types/rename-field.js +63 -0
  65. package/dist/src/cli/commands/content-types/rename-field.js.map +1 -0
  66. package/dist/src/cli/commands/content-types/rename-field.mjs +54 -0
  67. package/dist/src/cli/commands/content-types/rename-field.mjs.map +1 -0
  68. package/dist/src/cli/commands/develop.js +4 -2
  69. package/dist/src/cli/commands/develop.js.map +1 -1
  70. package/dist/src/cli/commands/develop.mjs +4 -2
  71. package/dist/src/cli/commands/develop.mjs.map +1 -1
  72. package/dist/src/cli/commands/enterprise/index.js +17 -0
  73. package/dist/src/cli/commands/enterprise/index.js.map +1 -0
  74. package/dist/src/cli/commands/enterprise/index.mjs +15 -0
  75. package/dist/src/cli/commands/enterprise/index.mjs.map +1 -0
  76. package/dist/src/cli/commands/enterprise/install/action.js +253 -0
  77. package/dist/src/cli/commands/enterprise/install/action.js.map +1 -0
  78. package/dist/src/cli/commands/enterprise/install/action.mjs +244 -0
  79. package/dist/src/cli/commands/enterprise/install/action.mjs.map +1 -0
  80. package/dist/src/cli/commands/enterprise/install/checklist-prompt.js +117 -0
  81. package/dist/src/cli/commands/enterprise/install/checklist-prompt.js.map +1 -0
  82. package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs +110 -0
  83. package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs.map +1 -0
  84. package/dist/src/cli/commands/enterprise/install/constants.js +16 -0
  85. package/dist/src/cli/commands/enterprise/install/constants.js.map +1 -0
  86. package/dist/src/cli/commands/enterprise/install/constants.mjs +9 -0
  87. package/dist/src/cli/commands/enterprise/install/constants.mjs.map +1 -0
  88. package/dist/src/cli/commands/enterprise/install/directories.js +23 -0
  89. package/dist/src/cli/commands/enterprise/install/directories.js.map +1 -0
  90. package/dist/src/cli/commands/enterprise/install/directories.mjs +17 -0
  91. package/dist/src/cli/commands/enterprise/install/directories.mjs.map +1 -0
  92. package/dist/src/cli/commands/enterprise/install/discovery.js +109 -0
  93. package/dist/src/cli/commands/enterprise/install/discovery.js.map +1 -0
  94. package/dist/src/cli/commands/enterprise/install/discovery.mjs +104 -0
  95. package/dist/src/cli/commands/enterprise/install/discovery.mjs.map +1 -0
  96. package/dist/src/cli/commands/enterprise/install/errors.js +26 -0
  97. package/dist/src/cli/commands/enterprise/install/errors.js.map +1 -0
  98. package/dist/src/cli/commands/enterprise/install/errors.mjs +22 -0
  99. package/dist/src/cli/commands/enterprise/install/errors.mjs.map +1 -0
  100. package/dist/src/cli/commands/enterprise/install/install-packages.js +39 -0
  101. package/dist/src/cli/commands/enterprise/install/install-packages.js.map +1 -0
  102. package/dist/src/cli/commands/enterprise/install/install-packages.mjs +32 -0
  103. package/dist/src/cli/commands/enterprise/install/install-packages.mjs.map +1 -0
  104. package/dist/src/cli/commands/enterprise/install/license.js +144 -0
  105. package/dist/src/cli/commands/enterprise/install/license.js.map +1 -0
  106. package/dist/src/cli/commands/enterprise/install/license.mjs +132 -0
  107. package/dist/src/cli/commands/enterprise/install/license.mjs.map +1 -0
  108. package/dist/src/cli/commands/enterprise/install/package-manager.js +72 -0
  109. package/dist/src/cli/commands/enterprise/install/package-manager.js.map +1 -0
  110. package/dist/src/cli/commands/enterprise/install/package-manager.mjs +62 -0
  111. package/dist/src/cli/commands/enterprise/install/package-manager.mjs.map +1 -0
  112. package/dist/src/cli/commands/enterprise/install/plugin-status.js +47 -0
  113. package/dist/src/cli/commands/enterprise/install/plugin-status.js.map +1 -0
  114. package/dist/src/cli/commands/enterprise/install/plugin-status.mjs +45 -0
  115. package/dist/src/cli/commands/enterprise/install/plugin-status.mjs.map +1 -0
  116. package/dist/src/cli/commands/enterprise/install/registry-access.js +293 -0
  117. package/dist/src/cli/commands/enterprise/install/registry-access.js.map +1 -0
  118. package/dist/src/cli/commands/enterprise/install/registry-access.mjs +277 -0
  119. package/dist/src/cli/commands/enterprise/install/registry-access.mjs.map +1 -0
  120. package/dist/src/cli/commands/enterprise/install/registry.js +98 -0
  121. package/dist/src/cli/commands/enterprise/install/registry.js.map +1 -0
  122. package/dist/src/cli/commands/enterprise/install/registry.mjs +95 -0
  123. package/dist/src/cli/commands/enterprise/install/registry.mjs.map +1 -0
  124. package/dist/src/cli/commands/enterprise/install/selection.js +148 -0
  125. package/dist/src/cli/commands/enterprise/install/selection.js.map +1 -0
  126. package/dist/src/cli/commands/enterprise/install/selection.mjs +141 -0
  127. package/dist/src/cli/commands/enterprise/install/selection.mjs.map +1 -0
  128. package/dist/src/cli/commands/enterprise/install/setup-links.js +34 -0
  129. package/dist/src/cli/commands/enterprise/install/setup-links.js.map +1 -0
  130. package/dist/src/cli/commands/enterprise/install/setup-links.mjs +31 -0
  131. package/dist/src/cli/commands/enterprise/install/setup-links.mjs.map +1 -0
  132. package/dist/src/cli/commands/enterprise/install/versions.js +127 -0
  133. package/dist/src/cli/commands/enterprise/install/versions.js.map +1 -0
  134. package/dist/src/cli/commands/enterprise/install/versions.mjs +107 -0
  135. package/dist/src/cli/commands/enterprise/install/versions.mjs.map +1 -0
  136. package/dist/src/cli/commands/export/action.js +4 -4
  137. package/dist/src/cli/commands/export/action.js.map +1 -1
  138. package/dist/src/cli/commands/export/action.mjs +2 -2
  139. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  140. package/dist/src/cli/commands/import/action.js +2 -2
  141. package/dist/src/cli/commands/import/action.js.map +1 -1
  142. package/dist/src/cli/commands/import/action.mjs +1 -1
  143. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  144. package/dist/src/cli/commands/index.js +4 -0
  145. package/dist/src/cli/commands/index.js.map +1 -1
  146. package/dist/src/cli/commands/index.mjs +24 -20
  147. package/dist/src/cli/commands/index.mjs.map +1 -1
  148. package/dist/src/cli/commands/routes/list.js +2 -2
  149. package/dist/src/cli/commands/routes/list.js.map +1 -1
  150. package/dist/src/cli/commands/routes/list.mjs +1 -1
  151. package/dist/src/cli/commands/routes/list.mjs.map +1 -1
  152. package/dist/src/cli/commands/transfer/action.js +2 -2
  153. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  154. package/dist/src/cli/commands/transfer/action.mjs +1 -1
  155. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  156. package/dist/src/cli/utils/commander.js +1 -2
  157. package/dist/src/cli/utils/commander.js.map +1 -1
  158. package/dist/src/cli/utils/commander.mjs +1 -2
  159. package/dist/src/cli/utils/commander.mjs.map +1 -1
  160. package/dist/src/cli/utils/data-transfer.js +2 -2
  161. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  162. package/dist/src/cli/utils/data-transfer.mjs +2 -2
  163. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  164. package/dist/src/cli/utils/helpers.js +6 -6
  165. package/dist/src/cli/utils/helpers.js.map +1 -1
  166. package/dist/src/cli/utils/helpers.mjs +4 -4
  167. package/dist/src/cli/utils/helpers.mjs.map +1 -1
  168. package/dist/src/node/core/admin-vite-aliases.js +51 -0
  169. package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
  170. package/dist/src/node/core/admin-vite-aliases.mjs +46 -1
  171. package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
  172. package/dist/src/node/core/aliases.js +6 -0
  173. package/dist/src/node/core/aliases.js.map +1 -1
  174. package/dist/src/node/core/aliases.mjs +6 -1
  175. package/dist/src/node/core/aliases.mjs.map +1 -1
  176. package/dist/src/node/core/scan-roots.js +87 -0
  177. package/dist/src/node/core/scan-roots.js.map +1 -0
  178. package/dist/src/node/core/scan-roots.mjs +79 -0
  179. package/dist/src/node/core/scan-roots.mjs.map +1 -0
  180. package/dist/src/node/create-build-context.js +40 -1
  181. package/dist/src/node/create-build-context.js.map +1 -1
  182. package/dist/src/node/create-build-context.mjs +40 -1
  183. package/dist/src/node/create-build-context.mjs.map +1 -1
  184. package/dist/src/node/develop.js +2 -1
  185. package/dist/src/node/develop.js.map +1 -1
  186. package/dist/src/node/develop.mjs +2 -1
  187. package/dist/src/node/develop.mjs.map +1 -1
  188. package/dist/src/node/staticFiles.js +43 -0
  189. package/dist/src/node/staticFiles.js.map +1 -1
  190. package/dist/src/node/staticFiles.mjs +42 -1
  191. package/dist/src/node/staticFiles.mjs.map +1 -1
  192. package/dist/src/node/vite/config.js +12 -2
  193. package/dist/src/node/vite/config.js.map +1 -1
  194. package/dist/src/node/vite/config.mjs +8 -2
  195. package/dist/src/node/vite/config.mjs.map +1 -1
  196. package/dist/src/node/vite/plugins.js +27 -1
  197. package/dist/src/node/vite/plugins.js.map +1 -1
  198. package/dist/src/node/vite/plugins.mjs +23 -1
  199. package/dist/src/node/vite/plugins.mjs.map +1 -1
  200. package/package.json +31 -26
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ class EnterpriseInstallError extends Error {
4
+ constructor(message){
5
+ super(message);
6
+ this.name = 'EnterpriseInstallError';
7
+ }
8
+ }
9
+ class PromptCancelledError extends Error {
10
+ constructor(){
11
+ super('The prompt was cancelled.');
12
+ this.name = 'PromptCancelledError';
13
+ }
14
+ }
15
+ class PackageManagerError extends Error {
16
+ constructor(exitCode){
17
+ super(`The package manager exited with code ${exitCode}.`);
18
+ this.name = 'PackageManagerError';
19
+ this.exitCode = exitCode;
20
+ }
21
+ }
22
+
23
+ exports.EnterpriseInstallError = EnterpriseInstallError;
24
+ exports.PackageManagerError = PackageManagerError;
25
+ exports.PromptCancelledError = PromptCancelledError;
26
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sources":["../../../../../../src/cli/commands/enterprise/install/errors.ts"],"sourcesContent":["export class EnterpriseInstallError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'EnterpriseInstallError';\n }\n}\n\nexport class PromptCancelledError extends Error {\n constructor() {\n super('The prompt was cancelled.');\n this.name = 'PromptCancelledError';\n }\n}\n\nexport class PackageManagerError extends Error {\n readonly exitCode: number;\n\n constructor(exitCode: number) {\n super(`The package manager exited with code ${exitCode}.`);\n this.name = 'PackageManagerError';\n this.exitCode = exitCode;\n }\n}\n"],"names":["EnterpriseInstallError","Error","message","name","PromptCancelledError","PackageManagerError","exitCode"],"mappings":";;AAAO,MAAMA,sBAAAA,SAA+BC,KAAAA,CAAAA;AAC1C,IAAA,WAAA,CAAYC,OAAe,CAAE;AAC3B,QAAA,KAAK,CAACA,OAAAA,CAAAA;QACN,IAAI,CAACC,IAAI,GAAG,wBAAA;AACd,IAAA;AACF;AAEO,MAAMC,oBAAAA,SAA6BH,KAAAA,CAAAA;IACxC,WAAA,EAAc;AACZ,QAAA,KAAK,CAAC,2BAAA,CAAA;QACN,IAAI,CAACE,IAAI,GAAG,sBAAA;AACd,IAAA;AACF;AAEO,MAAME,mBAAAA,SAA4BJ,KAAAA,CAAAA;AAGvC,IAAA,WAAA,CAAYK,QAAgB,CAAE;AAC5B,QAAA,KAAK,CAAC,CAAC,qCAAqC,EAAEA,QAAAA,CAAS,CAAC,CAAC,CAAA;QACzD,IAAI,CAACH,IAAI,GAAG,qBAAA;QACZ,IAAI,CAACG,QAAQ,GAAGA,QAAAA;AAClB,IAAA;AACF;;;;;;"}
@@ -0,0 +1,22 @@
1
+ class EnterpriseInstallError extends Error {
2
+ constructor(message){
3
+ super(message);
4
+ this.name = 'EnterpriseInstallError';
5
+ }
6
+ }
7
+ class PromptCancelledError extends Error {
8
+ constructor(){
9
+ super('The prompt was cancelled.');
10
+ this.name = 'PromptCancelledError';
11
+ }
12
+ }
13
+ class PackageManagerError extends Error {
14
+ constructor(exitCode){
15
+ super(`The package manager exited with code ${exitCode}.`);
16
+ this.name = 'PackageManagerError';
17
+ this.exitCode = exitCode;
18
+ }
19
+ }
20
+
21
+ export { EnterpriseInstallError, PackageManagerError, PromptCancelledError };
22
+ //# sourceMappingURL=errors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/errors.ts"],"sourcesContent":["export class EnterpriseInstallError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'EnterpriseInstallError';\n }\n}\n\nexport class PromptCancelledError extends Error {\n constructor() {\n super('The prompt was cancelled.');\n this.name = 'PromptCancelledError';\n }\n}\n\nexport class PackageManagerError extends Error {\n readonly exitCode: number;\n\n constructor(exitCode: number) {\n super(`The package manager exited with code ${exitCode}.`);\n this.name = 'PackageManagerError';\n this.exitCode = exitCode;\n }\n}\n"],"names":["EnterpriseInstallError","Error","message","name","PromptCancelledError","PackageManagerError","exitCode"],"mappings":"AAAO,MAAMA,sBAAAA,SAA+BC,KAAAA,CAAAA;AAC1C,IAAA,WAAA,CAAYC,OAAe,CAAE;AAC3B,QAAA,KAAK,CAACA,OAAAA,CAAAA;QACN,IAAI,CAACC,IAAI,GAAG,wBAAA;AACd,IAAA;AACF;AAEO,MAAMC,oBAAAA,SAA6BH,KAAAA,CAAAA;IACxC,WAAA,EAAc;AACZ,QAAA,KAAK,CAAC,2BAAA,CAAA;QACN,IAAI,CAACE,IAAI,GAAG,sBAAA;AACd,IAAA;AACF;AAEO,MAAME,mBAAAA,SAA4BJ,KAAAA,CAAAA;AAGvC,IAAA,WAAA,CAAYK,QAAgB,CAAE;AAC5B,QAAA,KAAK,CAAC,CAAC,qCAAqC,EAAEA,QAAAA,CAAS,CAAC,CAAC,CAAA;QACzD,IAAI,CAACH,IAAI,GAAG,qBAAA;QACZ,IAAI,CAACG,QAAQ,GAAGA,QAAAA;AAClB,IAAA;AACF;;;;"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var execa = require('execa');
4
+ var errors = require('./errors.js');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var execa__default = /*#__PURE__*/_interopDefault(execa);
9
+
10
+ const buildInstallCommand = (packageManager, installSpecs)=>({
11
+ command: packageManager.name,
12
+ args: packageManager.name === 'npm' ? [
13
+ 'install',
14
+ '--save-exact',
15
+ ...installSpecs
16
+ ] : [
17
+ 'add',
18
+ ...installSpecs
19
+ ]
20
+ });
21
+ const installPackages = async ({ appDir, packageManager, installSpecs })=>{
22
+ const { command, args } = buildInstallCommand(packageManager, installSpecs);
23
+ try {
24
+ await execa__default.default(command, args, {
25
+ cwd: appDir,
26
+ stdio: 'inherit'
27
+ });
28
+ } catch (error) {
29
+ const { code, exitCode } = error ?? {};
30
+ if (code === 'ENOENT') {
31
+ throw new errors.EnterpriseInstallError(`Could not run ${command}. Check that it is installed.`);
32
+ }
33
+ throw new errors.PackageManagerError(typeof exitCode === 'number' && exitCode !== 0 ? exitCode : 1);
34
+ }
35
+ };
36
+
37
+ exports.buildInstallCommand = buildInstallCommand;
38
+ exports.installPackages = installPackages;
39
+ //# sourceMappingURL=install-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-packages.js","sources":["../../../../../../src/cli/commands/enterprise/install/install-packages.ts"],"sourcesContent":["import execa from 'execa';\n\nimport { EnterpriseInstallError, PackageManagerError } from './errors';\nimport type { DetectedPackageManager } from './package-manager';\n\nexport const buildInstallCommand = (\n packageManager: DetectedPackageManager,\n installSpecs: string[]\n): { command: string; args: string[] } => ({\n command: packageManager.name,\n args:\n packageManager.name === 'npm'\n ? ['install', '--save-exact', ...installSpecs]\n : ['add', ...installSpecs],\n});\n\nexport const installPackages = async ({\n appDir,\n packageManager,\n installSpecs,\n}: {\n appDir: string;\n packageManager: DetectedPackageManager;\n installSpecs: string[];\n}): Promise<void> => {\n const { command, args } = buildInstallCommand(packageManager, installSpecs);\n\n try {\n await execa(command, args, { cwd: appDir, stdio: 'inherit' });\n } catch (error) {\n const { code, exitCode } = (error ?? {}) as { code?: string; exitCode?: number };\n\n if (code === 'ENOENT') {\n throw new EnterpriseInstallError(`Could not run ${command}. Check that it is installed.`);\n }\n\n throw new PackageManagerError(typeof exitCode === 'number' && exitCode !== 0 ? exitCode : 1);\n }\n};\n"],"names":["buildInstallCommand","packageManager","installSpecs","command","name","args","installPackages","appDir","execa","cwd","stdio","error","code","exitCode","EnterpriseInstallError","PackageManagerError"],"mappings":";;;;;;;;;AAKO,MAAMA,mBAAAA,GAAsB,CACjCC,cAAAA,EACAC,gBACyC;AACzCC,QAAAA,OAAAA,EAASF,eAAeG,IAAI;QAC5BC,IAAAA,EACEJ,cAAAA,CAAeG,IAAI,KAAK,KAAA,GACpB;AAAC,YAAA,SAAA;AAAW,YAAA,cAAA;AAAmBF,YAAAA,GAAAA;SAAa,GAC5C;AAAC,YAAA,KAAA;AAAUA,YAAAA,GAAAA;AAAa;AAChC,KAAA;AAEO,MAAMI,kBAAkB,OAAO,EACpCC,MAAM,EACNN,cAAc,EACdC,YAAY,EAKb,GAAA;AACC,IAAA,MAAM,EAAEC,OAAO,EAAEE,IAAI,EAAE,GAAGL,oBAAoBC,cAAAA,EAAgBC,YAAAA,CAAAA;IAE9D,IAAI;QACF,MAAMM,sBAAAA,CAAML,SAASE,IAAAA,EAAM;YAAEI,GAAAA,EAAKF,MAAAA;YAAQG,KAAAA,EAAO;AAAU,SAAA,CAAA;AAC7D,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,QAAA,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAE,GAAIF,SAAS,EAAC;AAEtC,QAAA,IAAIC,SAAS,QAAA,EAAU;AACrB,YAAA,MAAM,IAAIE,6BAAAA,CAAuB,CAAC,cAAc,EAAEX,OAAAA,CAAQ,6BAA6B,CAAC,CAAA;AAC1F,QAAA;AAEA,QAAA,MAAM,IAAIY,0BAAAA,CAAoB,OAAOF,aAAa,QAAA,IAAYA,QAAAA,KAAa,IAAIA,QAAAA,GAAW,CAAA,CAAA;AAC5F,IAAA;AACF;;;;;"}
@@ -0,0 +1,32 @@
1
+ import execa from 'execa';
2
+ import { EnterpriseInstallError, PackageManagerError } from './errors.mjs';
3
+
4
+ const buildInstallCommand = (packageManager, installSpecs)=>({
5
+ command: packageManager.name,
6
+ args: packageManager.name === 'npm' ? [
7
+ 'install',
8
+ '--save-exact',
9
+ ...installSpecs
10
+ ] : [
11
+ 'add',
12
+ ...installSpecs
13
+ ]
14
+ });
15
+ const installPackages = async ({ appDir, packageManager, installSpecs })=>{
16
+ const { command, args } = buildInstallCommand(packageManager, installSpecs);
17
+ try {
18
+ await execa(command, args, {
19
+ cwd: appDir,
20
+ stdio: 'inherit'
21
+ });
22
+ } catch (error) {
23
+ const { code, exitCode } = error ?? {};
24
+ if (code === 'ENOENT') {
25
+ throw new EnterpriseInstallError(`Could not run ${command}. Check that it is installed.`);
26
+ }
27
+ throw new PackageManagerError(typeof exitCode === 'number' && exitCode !== 0 ? exitCode : 1);
28
+ }
29
+ };
30
+
31
+ export { buildInstallCommand, installPackages };
32
+ //# sourceMappingURL=install-packages.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-packages.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/install-packages.ts"],"sourcesContent":["import execa from 'execa';\n\nimport { EnterpriseInstallError, PackageManagerError } from './errors';\nimport type { DetectedPackageManager } from './package-manager';\n\nexport const buildInstallCommand = (\n packageManager: DetectedPackageManager,\n installSpecs: string[]\n): { command: string; args: string[] } => ({\n command: packageManager.name,\n args:\n packageManager.name === 'npm'\n ? ['install', '--save-exact', ...installSpecs]\n : ['add', ...installSpecs],\n});\n\nexport const installPackages = async ({\n appDir,\n packageManager,\n installSpecs,\n}: {\n appDir: string;\n packageManager: DetectedPackageManager;\n installSpecs: string[];\n}): Promise<void> => {\n const { command, args } = buildInstallCommand(packageManager, installSpecs);\n\n try {\n await execa(command, args, { cwd: appDir, stdio: 'inherit' });\n } catch (error) {\n const { code, exitCode } = (error ?? {}) as { code?: string; exitCode?: number };\n\n if (code === 'ENOENT') {\n throw new EnterpriseInstallError(`Could not run ${command}. Check that it is installed.`);\n }\n\n throw new PackageManagerError(typeof exitCode === 'number' && exitCode !== 0 ? exitCode : 1);\n }\n};\n"],"names":["buildInstallCommand","packageManager","installSpecs","command","name","args","installPackages","appDir","execa","cwd","stdio","error","code","exitCode","EnterpriseInstallError","PackageManagerError"],"mappings":";;;AAKO,MAAMA,mBAAAA,GAAsB,CACjCC,cAAAA,EACAC,gBACyC;AACzCC,QAAAA,OAAAA,EAASF,eAAeG,IAAI;QAC5BC,IAAAA,EACEJ,cAAAA,CAAeG,IAAI,KAAK,KAAA,GACpB;AAAC,YAAA,SAAA;AAAW,YAAA,cAAA;AAAmBF,YAAAA,GAAAA;SAAa,GAC5C;AAAC,YAAA,KAAA;AAAUA,YAAAA,GAAAA;AAAa;AAChC,KAAA;AAEO,MAAMI,kBAAkB,OAAO,EACpCC,MAAM,EACNN,cAAc,EACdC,YAAY,EAKb,GAAA;AACC,IAAA,MAAM,EAAEC,OAAO,EAAEE,IAAI,EAAE,GAAGL,oBAAoBC,cAAAA,EAAgBC,YAAAA,CAAAA;IAE9D,IAAI;QACF,MAAMM,KAAAA,CAAML,SAASE,IAAAA,EAAM;YAAEI,GAAAA,EAAKF,MAAAA;YAAQG,KAAAA,EAAO;AAAU,SAAA,CAAA;AAC7D,IAAA,CAAA,CAAE,OAAOC,KAAAA,EAAO;AACd,QAAA,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAE,GAAIF,SAAS,EAAC;AAEtC,QAAA,IAAIC,SAAS,QAAA,EAAU;AACrB,YAAA,MAAM,IAAIE,sBAAAA,CAAuB,CAAC,cAAc,EAAEX,OAAAA,CAAQ,6BAA6B,CAAC,CAAA;AAC1F,QAAA;AAEA,QAAA,MAAM,IAAIY,mBAAAA,CAAoB,OAAOF,aAAa,QAAA,IAAYA,QAAAA,KAAa,IAAIA,QAAAA,GAAW,CAAA,CAAA;AAC5F,IAAA;AACF;;;;"}
@@ -0,0 +1,144 @@
1
+ 'use strict';
2
+
3
+ var path = require('node:path');
4
+ var fse = require('fs-extra');
5
+ var dotenv = require('dotenv');
6
+ var getInquirer = require('../../../utils/get-inquirer.js');
7
+ var constants = require('./constants.js');
8
+ var errors = require('./errors.js');
9
+
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var path__default = /*#__PURE__*/_interopDefault(path);
13
+ var fse__default = /*#__PURE__*/_interopDefault(fse);
14
+ var dotenv__default = /*#__PURE__*/_interopDefault(dotenv);
15
+
16
+ const LICENSE_SOURCE_LABELS = {
17
+ environment: 'the STRAPI_LICENSE environment variable',
18
+ 'env-file': 'STRAPI_LICENSE in .env',
19
+ 'license-file': constants.LICENSE_FILE_NAME
20
+ };
21
+ const cleanLicense = (value)=>value?.trim() || undefined;
22
+ const readLicenseFile = async (appDir)=>{
23
+ try {
24
+ return await fse__default.default.readFile(path__default.default.join(appDir, constants.LICENSE_FILE_NAME), 'utf8');
25
+ } catch (error) {
26
+ if (error?.code === 'ENOENT') {
27
+ return undefined;
28
+ }
29
+ throw error;
30
+ }
31
+ };
32
+ const readLicenseInfo = (license)=>{
33
+ const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\n');
34
+ if (!signature || !base64Content) {
35
+ throw new Error('Invalid license.');
36
+ }
37
+ const licenseInfo = JSON.parse(Buffer.from(base64Content, 'base64').toString());
38
+ if (typeof licenseInfo !== 'object' || licenseInfo === null) {
39
+ throw new Error('Invalid license.');
40
+ }
41
+ return licenseInfo;
42
+ };
43
+ const readEnvFileLicense = async (appDir, env)=>{
44
+ const envFilePath = env.ENV_PATH ? path__default.default.resolve(appDir, env.ENV_PATH) : path__default.default.join(appDir, '.env');
45
+ if (!await fse__default.default.pathExists(envFilePath)) {
46
+ return undefined;
47
+ }
48
+ return cleanLicense(dotenv__default.default.parse(await fse__default.default.readFile(envFilePath)).STRAPI_LICENSE);
49
+ };
50
+ const findLicense = async ({ appDir, env })=>{
51
+ const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);
52
+ if (licenseFromEnvironment) {
53
+ const isFromEnvFile = await readEnvFileLicense(appDir, env) === licenseFromEnvironment;
54
+ return {
55
+ license: licenseFromEnvironment,
56
+ source: isFromEnvFile ? 'env-file' : 'environment'
57
+ };
58
+ }
59
+ let licenseFromLicenseFile;
60
+ try {
61
+ licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));
62
+ } catch {
63
+ throw new errors.EnterpriseInstallError(`Could not read ${constants.LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`);
64
+ }
65
+ if (licenseFromLicenseFile) {
66
+ return {
67
+ license: licenseFromLicenseFile,
68
+ source: 'license-file'
69
+ };
70
+ }
71
+ return undefined;
72
+ };
73
+ const validateLicense = (license, now)=>{
74
+ let licenseInfo;
75
+ try {
76
+ licenseInfo = readLicenseInfo(license);
77
+ } catch {
78
+ throw new errors.EnterpriseInstallError(`This Strapi license is not valid. Check that you copied all of it, or find it at ${constants.BILLING_URL}`);
79
+ }
80
+ const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);
81
+ if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {
82
+ throw new errors.EnterpriseInstallError(`This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${constants.BILLING_URL}`);
83
+ }
84
+ };
85
+ const promptForLicense = async ()=>{
86
+ const inquirer = await getInquirer.getInquirer();
87
+ const { license } = await inquirer.prompt([
88
+ {
89
+ type: 'password',
90
+ name: 'license',
91
+ message: 'Strapi license?',
92
+ validate: (value)=>value.trim().length > 0 || 'The license cannot be empty.'
93
+ }
94
+ ]);
95
+ return license.trim();
96
+ };
97
+ const isLicenseFileIgnored = (gitignoreContent)=>gitignoreContent.split(/\r?\n/).map((line)=>line.trim()).some((line)=>line === constants.LICENSE_FILE_NAME || line === `/${constants.LICENSE_FILE_NAME}`);
98
+ const ensureLicenseFileIsIgnored = async (appDir, logger)=>{
99
+ const gitignorePath = path__default.default.join(appDir, '.gitignore');
100
+ const gitignoreContent = await fse__default.default.pathExists(gitignorePath) ? await fse__default.default.readFile(gitignorePath, 'utf8') : '';
101
+ if (isLicenseFileIgnored(gitignoreContent)) {
102
+ return;
103
+ }
104
+ const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\n') ? '\n' : '';
105
+ await fse__default.default.writeFile(gitignorePath, `${gitignoreContent}${separator}${constants.LICENSE_FILE_NAME}\n`);
106
+ logger.info(`Added ${constants.LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);
107
+ };
108
+ const saveLicenseFile = async (appDir, license, logger)=>{
109
+ const licenseFilePath = path__default.default.join(appDir, constants.LICENSE_FILE_NAME);
110
+ await fse__default.default.writeFile(licenseFilePath, `${license}\n`);
111
+ // Also restricts a license.txt that already existed, empty, with wider permissions.
112
+ await fse__default.default.chmod(licenseFilePath, 0o600);
113
+ await ensureLicenseFileIsIgnored(appDir, logger);
114
+ };
115
+ const resolveLicense = async ({ appDir, isInteractive, logger, env, now, prompt })=>{
116
+ const foundLicense = await findLicense({
117
+ appDir,
118
+ env
119
+ });
120
+ if (foundLicense) {
121
+ validateLicense(foundLicense.license, now);
122
+ logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);
123
+ return foundLicense;
124
+ }
125
+ if (!isInteractive) {
126
+ throw new errors.EnterpriseInstallError('No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.');
127
+ }
128
+ logger.info(`No Strapi license found. You can find yours at ${constants.BILLING_URL}`);
129
+ const pastedLicense = await prompt();
130
+ validateLicense(pastedLicense, now);
131
+ await saveLicenseFile(appDir, pastedLicense, logger);
132
+ logger.success(`Saved the license to ${constants.LICENSE_FILE_NAME}.`);
133
+ return {
134
+ license: pastedLicense,
135
+ source: 'prompt'
136
+ };
137
+ };
138
+
139
+ exports.findLicense = findLicense;
140
+ exports.promptForLicense = promptForLicense;
141
+ exports.resolveLicense = resolveLicense;
142
+ exports.saveLicenseFile = saveLicenseFile;
143
+ exports.validateLicense = validateLicense;
144
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sources":["../../../../../../src/cli/commands/enterprise/install/license.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport dotenv from 'dotenv';\n\nimport { getInquirer } from '../../../utils/get-inquirer';\nimport type { Logger } from '../../../utils/logger';\nimport { BILLING_URL, LICENSE_FILE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\n\nexport type LicenseSource = 'environment' | 'env-file' | 'license-file';\n\nexport interface FoundLicense {\n license: string;\n source: LicenseSource;\n}\n\nexport interface ResolvedLicense {\n license: string;\n /** `prompt` when the user pasted it, which also saved it to license.txt. */\n source: LicenseSource | 'prompt';\n}\n\nconst LICENSE_SOURCE_LABELS: Record<LicenseSource, string> = {\n environment: 'the STRAPI_LICENSE environment variable',\n 'env-file': 'STRAPI_LICENSE in .env',\n 'license-file': LICENSE_FILE_NAME,\n};\n\nconst cleanLicense = (value: string | undefined): string | undefined => value?.trim() || undefined;\n\nconst readLicenseFile = async (appDir: string): Promise<string | undefined> => {\n try {\n return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n};\n\ninterface LicenseInfo {\n expireAt?: string | number;\n}\n\nconst readLicenseInfo = (license: string): LicenseInfo => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: unknown = JSON.parse(Buffer.from(base64Content, 'base64').toString());\n\n if (typeof licenseInfo !== 'object' || licenseInfo === null) {\n throw new Error('Invalid license.');\n }\n\n return licenseInfo as LicenseInfo;\n};\n\nconst readEnvFileLicense = async (\n appDir: string,\n env: NodeJS.ProcessEnv\n): Promise<string | undefined> => {\n const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');\n\n if (!(await fse.pathExists(envFilePath))) {\n return undefined;\n }\n\n return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);\n};\n\nexport const findLicense = async ({\n appDir,\n env,\n}: {\n appDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<FoundLicense | undefined> => {\n const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);\n if (licenseFromEnvironment) {\n const isFromEnvFile = (await readEnvFileLicense(appDir, env)) === licenseFromEnvironment;\n\n return { license: licenseFromEnvironment, source: isFromEnvFile ? 'env-file' : 'environment' };\n }\n\n let licenseFromLicenseFile: string | undefined;\n\n try {\n licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));\n } catch {\n throw new EnterpriseInstallError(\n `Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`\n );\n }\n\n if (licenseFromLicenseFile) {\n return { license: licenseFromLicenseFile, source: 'license-file' };\n }\n\n return undefined;\n};\n\nexport const validateLicense = (license: string, now: Date): void => {\n let licenseInfo: LicenseInfo;\n\n try {\n licenseInfo = readLicenseInfo(license);\n } catch {\n throw new EnterpriseInstallError(\n `This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`\n );\n }\n\n const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);\n\n if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {\n throw new EnterpriseInstallError(\n `This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`\n );\n }\n};\n\nexport const promptForLicense = async (): Promise<string> => {\n const inquirer = await getInquirer();\n const { license } = await inquirer.prompt<{ license: string }>([\n {\n type: 'password',\n name: 'license',\n message: 'Strapi license?',\n validate: (value: string) => value.trim().length > 0 || 'The license cannot be empty.',\n },\n ]);\n\n return license.trim();\n};\n\nconst isLicenseFileIgnored = (gitignoreContent: string): boolean =>\n gitignoreContent\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);\n\nconst ensureLicenseFileIsIgnored = async (appDir: string, logger: Logger): Promise<void> => {\n const gitignorePath = path.join(appDir, '.gitignore');\n const gitignoreContent = (await fse.pathExists(gitignorePath))\n ? await fse.readFile(gitignorePath, 'utf8')\n : '';\n\n if (isLicenseFileIgnored(gitignoreContent)) {\n return;\n }\n\n const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\\n') ? '\\n' : '';\n await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\\n`);\n logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);\n};\n\nexport const saveLicenseFile = async (\n appDir: string,\n license: string,\n logger: Logger\n): Promise<void> => {\n const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);\n\n await fse.writeFile(licenseFilePath, `${license}\\n`);\n // Also restricts a license.txt that already existed, empty, with wider permissions.\n await fse.chmod(licenseFilePath, 0o600);\n await ensureLicenseFileIsIgnored(appDir, logger);\n};\n\nexport const resolveLicense = async ({\n appDir,\n isInteractive,\n logger,\n env,\n now,\n prompt,\n}: {\n appDir: string;\n isInteractive: boolean;\n logger: Logger;\n env: NodeJS.ProcessEnv;\n now: Date;\n prompt: () => Promise<string>;\n}): Promise<ResolvedLicense> => {\n const foundLicense = await findLicense({ appDir, env });\n\n if (foundLicense) {\n validateLicense(foundLicense.license, now);\n logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);\n\n return foundLicense;\n }\n\n if (!isInteractive) {\n throw new EnterpriseInstallError(\n 'No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.'\n );\n }\n\n logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);\n\n const pastedLicense = await prompt();\n validateLicense(pastedLicense, now);\n await saveLicenseFile(appDir, pastedLicense, logger);\n logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);\n\n return { license: pastedLicense, source: 'prompt' };\n};\n"],"names":["LICENSE_SOURCE_LABELS","environment","LICENSE_FILE_NAME","cleanLicense","value","trim","undefined","readLicenseFile","appDir","fse","readFile","path","join","error","code","readLicenseInfo","license","signature","base64Content","Buffer","from","toString","split","Error","licenseInfo","JSON","parse","readEnvFileLicense","env","envFilePath","ENV_PATH","resolve","pathExists","dotenv","STRAPI_LICENSE","findLicense","licenseFromEnvironment","isFromEnvFile","source","licenseFromLicenseFile","EnterpriseInstallError","validateLicense","now","BILLING_URL","expiresAt","expireAt","Date","Number","isNaN","getTime","toISOString","slice","promptForLicense","inquirer","getInquirer","prompt","type","name","message","validate","length","isLicenseFileIgnored","gitignoreContent","map","line","some","ensureLicenseFileIsIgnored","logger","gitignorePath","separator","endsWith","writeFile","info","saveLicenseFile","licenseFilePath","chmod","resolveLicense","isInteractive","foundLicense","pastedLicense","success"],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ import path from 'node:path';
2
+ import fse from 'fs-extra';
3
+ import dotenv from 'dotenv';
4
+ import { getInquirer } from '../../../utils/get-inquirer.mjs';
5
+ import { LICENSE_FILE_NAME, BILLING_URL } from './constants.mjs';
6
+ import { EnterpriseInstallError } from './errors.mjs';
7
+
8
+ const LICENSE_SOURCE_LABELS = {
9
+ environment: 'the STRAPI_LICENSE environment variable',
10
+ 'env-file': 'STRAPI_LICENSE in .env',
11
+ 'license-file': LICENSE_FILE_NAME
12
+ };
13
+ const cleanLicense = (value)=>value?.trim() || undefined;
14
+ const readLicenseFile = async (appDir)=>{
15
+ try {
16
+ return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');
17
+ } catch (error) {
18
+ if (error?.code === 'ENOENT') {
19
+ return undefined;
20
+ }
21
+ throw error;
22
+ }
23
+ };
24
+ const readLicenseInfo = (license)=>{
25
+ const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\n');
26
+ if (!signature || !base64Content) {
27
+ throw new Error('Invalid license.');
28
+ }
29
+ const licenseInfo = JSON.parse(Buffer.from(base64Content, 'base64').toString());
30
+ if (typeof licenseInfo !== 'object' || licenseInfo === null) {
31
+ throw new Error('Invalid license.');
32
+ }
33
+ return licenseInfo;
34
+ };
35
+ const readEnvFileLicense = async (appDir, env)=>{
36
+ const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');
37
+ if (!await fse.pathExists(envFilePath)) {
38
+ return undefined;
39
+ }
40
+ return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);
41
+ };
42
+ const findLicense = async ({ appDir, env })=>{
43
+ const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);
44
+ if (licenseFromEnvironment) {
45
+ const isFromEnvFile = await readEnvFileLicense(appDir, env) === licenseFromEnvironment;
46
+ return {
47
+ license: licenseFromEnvironment,
48
+ source: isFromEnvFile ? 'env-file' : 'environment'
49
+ };
50
+ }
51
+ let licenseFromLicenseFile;
52
+ try {
53
+ licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));
54
+ } catch {
55
+ throw new EnterpriseInstallError(`Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`);
56
+ }
57
+ if (licenseFromLicenseFile) {
58
+ return {
59
+ license: licenseFromLicenseFile,
60
+ source: 'license-file'
61
+ };
62
+ }
63
+ return undefined;
64
+ };
65
+ const validateLicense = (license, now)=>{
66
+ let licenseInfo;
67
+ try {
68
+ licenseInfo = readLicenseInfo(license);
69
+ } catch {
70
+ throw new EnterpriseInstallError(`This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`);
71
+ }
72
+ const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);
73
+ if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {
74
+ throw new EnterpriseInstallError(`This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`);
75
+ }
76
+ };
77
+ const promptForLicense = async ()=>{
78
+ const inquirer = await getInquirer();
79
+ const { license } = await inquirer.prompt([
80
+ {
81
+ type: 'password',
82
+ name: 'license',
83
+ message: 'Strapi license?',
84
+ validate: (value)=>value.trim().length > 0 || 'The license cannot be empty.'
85
+ }
86
+ ]);
87
+ return license.trim();
88
+ };
89
+ const isLicenseFileIgnored = (gitignoreContent)=>gitignoreContent.split(/\r?\n/).map((line)=>line.trim()).some((line)=>line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);
90
+ const ensureLicenseFileIsIgnored = async (appDir, logger)=>{
91
+ const gitignorePath = path.join(appDir, '.gitignore');
92
+ const gitignoreContent = await fse.pathExists(gitignorePath) ? await fse.readFile(gitignorePath, 'utf8') : '';
93
+ if (isLicenseFileIgnored(gitignoreContent)) {
94
+ return;
95
+ }
96
+ const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\n') ? '\n' : '';
97
+ await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\n`);
98
+ logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);
99
+ };
100
+ const saveLicenseFile = async (appDir, license, logger)=>{
101
+ const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);
102
+ await fse.writeFile(licenseFilePath, `${license}\n`);
103
+ // Also restricts a license.txt that already existed, empty, with wider permissions.
104
+ await fse.chmod(licenseFilePath, 0o600);
105
+ await ensureLicenseFileIsIgnored(appDir, logger);
106
+ };
107
+ const resolveLicense = async ({ appDir, isInteractive, logger, env, now, prompt })=>{
108
+ const foundLicense = await findLicense({
109
+ appDir,
110
+ env
111
+ });
112
+ if (foundLicense) {
113
+ validateLicense(foundLicense.license, now);
114
+ logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);
115
+ return foundLicense;
116
+ }
117
+ if (!isInteractive) {
118
+ throw new EnterpriseInstallError('No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.');
119
+ }
120
+ logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);
121
+ const pastedLicense = await prompt();
122
+ validateLicense(pastedLicense, now);
123
+ await saveLicenseFile(appDir, pastedLicense, logger);
124
+ logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);
125
+ return {
126
+ license: pastedLicense,
127
+ source: 'prompt'
128
+ };
129
+ };
130
+
131
+ export { findLicense, promptForLicense, resolveLicense, saveLicenseFile, validateLicense };
132
+ //# sourceMappingURL=license.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/license.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport dotenv from 'dotenv';\n\nimport { getInquirer } from '../../../utils/get-inquirer';\nimport type { Logger } from '../../../utils/logger';\nimport { BILLING_URL, LICENSE_FILE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\n\nexport type LicenseSource = 'environment' | 'env-file' | 'license-file';\n\nexport interface FoundLicense {\n license: string;\n source: LicenseSource;\n}\n\nexport interface ResolvedLicense {\n license: string;\n /** `prompt` when the user pasted it, which also saved it to license.txt. */\n source: LicenseSource | 'prompt';\n}\n\nconst LICENSE_SOURCE_LABELS: Record<LicenseSource, string> = {\n environment: 'the STRAPI_LICENSE environment variable',\n 'env-file': 'STRAPI_LICENSE in .env',\n 'license-file': LICENSE_FILE_NAME,\n};\n\nconst cleanLicense = (value: string | undefined): string | undefined => value?.trim() || undefined;\n\nconst readLicenseFile = async (appDir: string): Promise<string | undefined> => {\n try {\n return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n};\n\ninterface LicenseInfo {\n expireAt?: string | number;\n}\n\nconst readLicenseInfo = (license: string): LicenseInfo => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: unknown = JSON.parse(Buffer.from(base64Content, 'base64').toString());\n\n if (typeof licenseInfo !== 'object' || licenseInfo === null) {\n throw new Error('Invalid license.');\n }\n\n return licenseInfo as LicenseInfo;\n};\n\nconst readEnvFileLicense = async (\n appDir: string,\n env: NodeJS.ProcessEnv\n): Promise<string | undefined> => {\n const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');\n\n if (!(await fse.pathExists(envFilePath))) {\n return undefined;\n }\n\n return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);\n};\n\nexport const findLicense = async ({\n appDir,\n env,\n}: {\n appDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<FoundLicense | undefined> => {\n const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);\n if (licenseFromEnvironment) {\n const isFromEnvFile = (await readEnvFileLicense(appDir, env)) === licenseFromEnvironment;\n\n return { license: licenseFromEnvironment, source: isFromEnvFile ? 'env-file' : 'environment' };\n }\n\n let licenseFromLicenseFile: string | undefined;\n\n try {\n licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));\n } catch {\n throw new EnterpriseInstallError(\n `Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`\n );\n }\n\n if (licenseFromLicenseFile) {\n return { license: licenseFromLicenseFile, source: 'license-file' };\n }\n\n return undefined;\n};\n\nexport const validateLicense = (license: string, now: Date): void => {\n let licenseInfo: LicenseInfo;\n\n try {\n licenseInfo = readLicenseInfo(license);\n } catch {\n throw new EnterpriseInstallError(\n `This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`\n );\n }\n\n const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);\n\n if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {\n throw new EnterpriseInstallError(\n `This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`\n );\n }\n};\n\nexport const promptForLicense = async (): Promise<string> => {\n const inquirer = await getInquirer();\n const { license } = await inquirer.prompt<{ license: string }>([\n {\n type: 'password',\n name: 'license',\n message: 'Strapi license?',\n validate: (value: string) => value.trim().length > 0 || 'The license cannot be empty.',\n },\n ]);\n\n return license.trim();\n};\n\nconst isLicenseFileIgnored = (gitignoreContent: string): boolean =>\n gitignoreContent\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);\n\nconst ensureLicenseFileIsIgnored = async (appDir: string, logger: Logger): Promise<void> => {\n const gitignorePath = path.join(appDir, '.gitignore');\n const gitignoreContent = (await fse.pathExists(gitignorePath))\n ? await fse.readFile(gitignorePath, 'utf8')\n : '';\n\n if (isLicenseFileIgnored(gitignoreContent)) {\n return;\n }\n\n const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\\n') ? '\\n' : '';\n await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\\n`);\n logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);\n};\n\nexport const saveLicenseFile = async (\n appDir: string,\n license: string,\n logger: Logger\n): Promise<void> => {\n const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);\n\n await fse.writeFile(licenseFilePath, `${license}\\n`);\n // Also restricts a license.txt that already existed, empty, with wider permissions.\n await fse.chmod(licenseFilePath, 0o600);\n await ensureLicenseFileIsIgnored(appDir, logger);\n};\n\nexport const resolveLicense = async ({\n appDir,\n isInteractive,\n logger,\n env,\n now,\n prompt,\n}: {\n appDir: string;\n isInteractive: boolean;\n logger: Logger;\n env: NodeJS.ProcessEnv;\n now: Date;\n prompt: () => Promise<string>;\n}): Promise<ResolvedLicense> => {\n const foundLicense = await findLicense({ appDir, env });\n\n if (foundLicense) {\n validateLicense(foundLicense.license, now);\n logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);\n\n return foundLicense;\n }\n\n if (!isInteractive) {\n throw new EnterpriseInstallError(\n 'No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.'\n );\n }\n\n logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);\n\n const pastedLicense = await prompt();\n validateLicense(pastedLicense, now);\n await saveLicenseFile(appDir, pastedLicense, logger);\n logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);\n\n return { license: pastedLicense, source: 'prompt' };\n};\n"],"names":["LICENSE_SOURCE_LABELS","environment","LICENSE_FILE_NAME","cleanLicense","value","trim","undefined","readLicenseFile","appDir","fse","readFile","path","join","error","code","readLicenseInfo","license","signature","base64Content","Buffer","from","toString","split","Error","licenseInfo","JSON","parse","readEnvFileLicense","env","envFilePath","ENV_PATH","resolve","pathExists","dotenv","STRAPI_LICENSE","findLicense","licenseFromEnvironment","isFromEnvFile","source","licenseFromLicenseFile","EnterpriseInstallError","validateLicense","now","BILLING_URL","expiresAt","expireAt","Date","Number","isNaN","getTime","toISOString","slice","promptForLicense","inquirer","getInquirer","prompt","type","name","message","validate","length","isLicenseFileIgnored","gitignoreContent","map","line","some","ensureLicenseFileIsIgnored","logger","gitignorePath","separator","endsWith","writeFile","info","saveLicenseFile","licenseFilePath","chmod","resolveLicense","isInteractive","foundLicense","pastedLicense","success"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var path = require('node:path');
4
+ var fse = require('fs-extra');
5
+ var execa = require('execa');
6
+ var utils = require('@strapi/utils');
7
+ var errors = require('./errors.js');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var path__default = /*#__PURE__*/_interopDefault(path);
12
+ var fse__default = /*#__PURE__*/_interopDefault(fse);
13
+ var execa__default = /*#__PURE__*/_interopDefault(execa);
14
+
15
+ /** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */ const parsePackageManagerField = (packageManagerField)=>{
16
+ if (typeof packageManagerField !== 'string') {
17
+ return undefined;
18
+ }
19
+ const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\d+)/);
20
+ if (!fieldMatch) {
21
+ return undefined;
22
+ }
23
+ return {
24
+ name: fieldMatch[1],
25
+ majorVersion: Number(fieldMatch[2])
26
+ };
27
+ };
28
+ const YARN_VERSION_UNKNOWN = 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set "packageManager" in package.json.';
29
+ const readYarnMajorVersion = async (appDir)=>{
30
+ const { stdout } = await execa__default.default('yarn', [
31
+ '--version'
32
+ ], {
33
+ cwd: appDir
34
+ }).catch(()=>{
35
+ throw new errors.EnterpriseInstallError(YARN_VERSION_UNKNOWN);
36
+ });
37
+ const majorVersion = Number.parseInt(stdout.trim(), 10);
38
+ // Guessing Yarn 1 would set up a file that Yarn 2+ never reads.
39
+ if (Number.isNaN(majorVersion)) {
40
+ throw new errors.EnterpriseInstallError(YARN_VERSION_UNKNOWN);
41
+ }
42
+ return majorVersion;
43
+ };
44
+ const detectPackageManager = async (appDir)=>{
45
+ const packageJson = await fse__default.default.readJson(path__default.default.join(appDir, 'package.json')).catch(()=>({}));
46
+ const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);
47
+ if (packageManagerFromField) {
48
+ return packageManagerFromField;
49
+ }
50
+ // Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a
51
+ // fresh clone whose dependencies are not installed yet.
52
+ const packageManagerName = await utils.packageManager.getPreferred(appDir).catch(()=>{
53
+ throw new errors.EnterpriseInstallError('Could not tell which package manager this app uses. Install its dependencies first, or set "packageManager" in package.json.');
54
+ });
55
+ if (packageManagerName === 'yarn') {
56
+ return {
57
+ name: 'yarn',
58
+ majorVersion: await readYarnMajorVersion(appDir)
59
+ };
60
+ }
61
+ return {
62
+ name: packageManagerName
63
+ };
64
+ };
65
+ /**
66
+ * Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.
67
+ */ const readsYarnrcYml = (packageManager)=>packageManager.name === 'yarn' && packageManager.majorVersion >= 2;
68
+
69
+ exports.detectPackageManager = detectPackageManager;
70
+ exports.parsePackageManagerField = parsePackageManagerField;
71
+ exports.readsYarnrcYml = readsYarnrcYml;
72
+ //# sourceMappingURL=package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-manager.js","sources":["../../../../../../src/cli/commands/enterprise/install/package-manager.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport execa from 'execa';\nimport { packageManager as packageManagerUtils } from '@strapi/utils';\n\nimport { EnterpriseInstallError } from './errors';\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn';\n\n/** Yarn's major version matters: Yarn 2 and later read another configuration file. */\nexport type DetectedPackageManager =\n | { name: 'npm' | 'pnpm'; majorVersion?: number }\n | { name: 'yarn'; majorVersion: number };\n\n/** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */\nexport const parsePackageManagerField = (\n packageManagerField: unknown\n): DetectedPackageManager | undefined => {\n if (typeof packageManagerField !== 'string') {\n return undefined;\n }\n\n const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\\d+)/);\n\n if (!fieldMatch) {\n return undefined;\n }\n\n return { name: fieldMatch[1] as PackageManagerName, majorVersion: Number(fieldMatch[2]) };\n};\n\nconst YARN_VERSION_UNKNOWN =\n 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set \"packageManager\" in package.json.';\n\nconst readYarnMajorVersion = async (appDir: string): Promise<number> => {\n const { stdout } = await execa('yarn', ['--version'], { cwd: appDir }).catch(() => {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n });\n const majorVersion = Number.parseInt(stdout.trim(), 10);\n\n // Guessing Yarn 1 would set up a file that Yarn 2+ never reads.\n if (Number.isNaN(majorVersion)) {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n }\n\n return majorVersion;\n};\n\nexport const detectPackageManager = async (appDir: string): Promise<DetectedPackageManager> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);\n\n if (packageManagerFromField) {\n return packageManagerFromField;\n }\n\n // Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a\n // fresh clone whose dependencies are not installed yet.\n const packageManagerName = await packageManagerUtils.getPreferred(appDir).catch(() => {\n throw new EnterpriseInstallError(\n 'Could not tell which package manager this app uses. Install its dependencies first, or set \"packageManager\" in package.json.'\n );\n });\n\n if (packageManagerName === 'yarn') {\n return { name: 'yarn', majorVersion: await readYarnMajorVersion(appDir) };\n }\n\n return { name: packageManagerName };\n};\n\n/**\n * Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.\n */\nexport const readsYarnrcYml = (packageManager: DetectedPackageManager): boolean =>\n packageManager.name === 'yarn' && packageManager.majorVersion >= 2;\n"],"names":["parsePackageManagerField","packageManagerField","undefined","fieldMatch","match","name","majorVersion","Number","YARN_VERSION_UNKNOWN","readYarnMajorVersion","appDir","stdout","execa","cwd","catch","EnterpriseInstallError","parseInt","trim","isNaN","detectPackageManager","packageJson","fse","readJson","path","join","packageManagerFromField","packageManager","packageManagerName","packageManagerUtils","getPreferred","readsYarnrcYml"],"mappings":";;;;;;;;;;;;;;AAcA,sFACO,MAAMA,wBAAAA,GAA2B,CACtCC,mBAAAA,GAAAA;IAEA,IAAI,OAAOA,wBAAwB,QAAA,EAAU;QAC3C,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAMC,UAAAA,GAAaF,mBAAAA,CAAoBG,KAAK,CAAC,wBAAA,CAAA;AAE7C,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,OAAOD,SAAAA;AACT,IAAA;IAEA,OAAO;QAAEG,IAAAA,EAAMF,UAAU,CAAC,CAAA,CAAE;QAAwBG,YAAAA,EAAcC,MAAAA,CAAOJ,UAAU,CAAC,CAAA,CAAE;AAAE,KAAA;AAC1F;AAEA,MAAMK,oBAAAA,GACJ,kIAAA;AAEF,MAAMC,uBAAuB,OAAOC,MAAAA,GAAAA;AAClC,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,uBAAM,MAAA,EAAQ;AAAC,QAAA;KAAY,EAAE;QAAEC,GAAAA,EAAKH;AAAO,KAAA,CAAA,CAAGI,KAAK,CAAC,IAAA;AAC3E,QAAA,MAAM,IAAIC,6BAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA,CAAA,CAAA;AACA,IAAA,MAAMF,eAAeC,MAAAA,CAAOS,QAAQ,CAACL,MAAAA,CAAOM,IAAI,EAAA,EAAI,EAAA,CAAA;;IAGpD,IAAIV,MAAAA,CAAOW,KAAK,CAACZ,YAAAA,CAAAA,EAAe;AAC9B,QAAA,MAAM,IAAIS,6BAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA;IAEA,OAAOF,YAAAA;AACT,CAAA;AAEO,MAAMa,uBAAuB,OAAOT,MAAAA,GAAAA;AACzC,IAAA,MAAMU,WAAAA,GAAc,MAAMC,oBAAAA,CAAIC,QAAQ,CAACC,qBAAAA,CAAKC,IAAI,CAACd,MAAAA,EAAQ,iBAAiBI,KAAK,CAAC,KAAO,EAAC,CAAA,CAAA;IACxF,MAAMW,uBAAAA,GAA0BzB,wBAAAA,CAAyBoB,WAAAA,CAAYM,cAAc,CAAA;AAEnF,IAAA,IAAID,uBAAAA,EAAyB;QAC3B,OAAOA,uBAAAA;AACT,IAAA;;;AAIA,IAAA,MAAME,qBAAqB,MAAMC,oBAAAA,CAAoBC,YAAY,CAACnB,MAAAA,CAAAA,CAAQI,KAAK,CAAC,IAAA;AAC9E,QAAA,MAAM,IAAIC,6BAAAA,CACR,8HAAA,CAAA;AAEJ,IAAA,CAAA,CAAA;AAEA,IAAA,IAAIY,uBAAuB,MAAA,EAAQ;QACjC,OAAO;YAAEtB,IAAAA,EAAM,MAAA;AAAQC,YAAAA,YAAAA,EAAc,MAAMG,oBAAAA,CAAqBC,MAAAA;AAAQ,SAAA;AAC1E,IAAA;IAEA,OAAO;QAAEL,IAAAA,EAAMsB;AAAmB,KAAA;AACpC;AAEA;;AAEC,IACM,MAAMG,cAAAA,GAAiB,CAACJ,cAAAA,GAC7BA,cAAAA,CAAerB,IAAI,KAAK,MAAA,IAAUqB,cAAAA,CAAepB,YAAY,IAAI;;;;;;"}
@@ -0,0 +1,62 @@
1
+ import path from 'node:path';
2
+ import fse from 'fs-extra';
3
+ import execa from 'execa';
4
+ import { packageManager } from '@strapi/utils';
5
+ import { EnterpriseInstallError } from './errors.mjs';
6
+
7
+ /** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */ const parsePackageManagerField = (packageManagerField)=>{
8
+ if (typeof packageManagerField !== 'string') {
9
+ return undefined;
10
+ }
11
+ const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\d+)/);
12
+ if (!fieldMatch) {
13
+ return undefined;
14
+ }
15
+ return {
16
+ name: fieldMatch[1],
17
+ majorVersion: Number(fieldMatch[2])
18
+ };
19
+ };
20
+ const YARN_VERSION_UNKNOWN = 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set "packageManager" in package.json.';
21
+ const readYarnMajorVersion = async (appDir)=>{
22
+ const { stdout } = await execa('yarn', [
23
+ '--version'
24
+ ], {
25
+ cwd: appDir
26
+ }).catch(()=>{
27
+ throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);
28
+ });
29
+ const majorVersion = Number.parseInt(stdout.trim(), 10);
30
+ // Guessing Yarn 1 would set up a file that Yarn 2+ never reads.
31
+ if (Number.isNaN(majorVersion)) {
32
+ throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);
33
+ }
34
+ return majorVersion;
35
+ };
36
+ const detectPackageManager = async (appDir)=>{
37
+ const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(()=>({}));
38
+ const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);
39
+ if (packageManagerFromField) {
40
+ return packageManagerFromField;
41
+ }
42
+ // Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a
43
+ // fresh clone whose dependencies are not installed yet.
44
+ const packageManagerName = await packageManager.getPreferred(appDir).catch(()=>{
45
+ throw new EnterpriseInstallError('Could not tell which package manager this app uses. Install its dependencies first, or set "packageManager" in package.json.');
46
+ });
47
+ if (packageManagerName === 'yarn') {
48
+ return {
49
+ name: 'yarn',
50
+ majorVersion: await readYarnMajorVersion(appDir)
51
+ };
52
+ }
53
+ return {
54
+ name: packageManagerName
55
+ };
56
+ };
57
+ /**
58
+ * Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.
59
+ */ const readsYarnrcYml = (packageManager)=>packageManager.name === 'yarn' && packageManager.majorVersion >= 2;
60
+
61
+ export { detectPackageManager, parsePackageManagerField, readsYarnrcYml };
62
+ //# sourceMappingURL=package-manager.mjs.map