@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,117 @@
1
+ 'use strict';
2
+
3
+ var readline = require('node:readline');
4
+ var chalk = require('chalk');
5
+ var errors = require('./errors.js');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var readline__default = /*#__PURE__*/_interopDefault(readline);
10
+ var chalk__default = /*#__PURE__*/_interopDefault(chalk);
11
+
12
+ const SUBMIT_LABEL = 'Submit';
13
+ const fitWidth = (text, width)=>text.length <= width ? text : `${text.slice(0, Math.max(width - 1, 0))}…`;
14
+ const promptChecklist = ({ message, choices, input = process.stdin, output = process.stdout })=>new Promise((resolve, reject)=>{
15
+ const checked = choices.map((choice)=>Boolean(choice.checked));
16
+ const submitIndex = choices.length;
17
+ const stops = [
18
+ ...choices.flatMap((choice, index)=>choice.disabled === undefined ? [
19
+ index
20
+ ] : []),
21
+ submitIndex
22
+ ];
23
+ let cursor = 0;
24
+ let renderedLineCount = 0;
25
+ const width = ()=>Math.max((output.columns || 80) - 1, 20);
26
+ const renderChoice = (choice, index)=>{
27
+ if (choice.disabled !== undefined) {
28
+ return chalk__default.default.dim(fitWidth(` - ${choice.name} (${choice.disabled})`, width()));
29
+ }
30
+ const isActive = stops[cursor] === index;
31
+ const box = checked[index] ? chalk__default.default.green('◉') : '◯';
32
+ const name = fitWidth(choice.name, width() - 4);
33
+ return isActive ? `${chalk__default.default.cyan('❯')} ${box} ${chalk__default.default.cyan(name)}` : ` ${box} ${name}`;
34
+ };
35
+ const renderSubmit = ()=>stops[cursor] === submitIndex ? `${chalk__default.default.cyan('❯')} ${chalk__default.default.cyan.bold(SUBMIT_LABEL)}` : ` ${chalk__default.default.bold(SUBMIT_LABEL)}`;
36
+ const draw = (lines)=>{
37
+ if (renderedLineCount > 0) {
38
+ readline__default.default.moveCursor(output, 0, -renderedLineCount);
39
+ readline__default.default.cursorTo(output, 0);
40
+ readline__default.default.clearScreenDown(output);
41
+ }
42
+ output.write(`${lines.join('\n')}\n`);
43
+ renderedLineCount = lines.length;
44
+ };
45
+ const question = chalk__default.default.bold(message);
46
+ const render = ()=>draw([
47
+ question,
48
+ ...choices.map(renderChoice),
49
+ '',
50
+ renderSubmit()
51
+ ]);
52
+ const stop = ()=>{
53
+ input.removeListener('keypress', onKeypress);
54
+ if (input.isTTY) {
55
+ input.setRawMode(false);
56
+ }
57
+ input.pause();
58
+ output.write('\u001B[?25h');
59
+ };
60
+ const submit = ()=>{
61
+ const selected = choices.filter((choice, index)=>choice.disabled === undefined && checked[index]);
62
+ const answer = selected.map((choice)=>choice.short ?? choice.name).join(', ');
63
+ draw([
64
+ `${question} ${chalk__default.default.cyan(answer || 'none')}`
65
+ ]);
66
+ stop();
67
+ resolve(selected.flatMap((choice)=>choice.value === undefined ? [] : [
68
+ choice.value
69
+ ]));
70
+ };
71
+ function onKeypress(_text, key) {
72
+ if (!key) {
73
+ return;
74
+ }
75
+ if (key.ctrl && key.name === 'c') {
76
+ stop();
77
+ reject(new errors.PromptCancelledError());
78
+ return;
79
+ }
80
+ switch(key.name){
81
+ case 'up':
82
+ case 'k':
83
+ cursor = (cursor - 1 + stops.length) % stops.length;
84
+ break;
85
+ case 'down':
86
+ case 'j':
87
+ case 'tab':
88
+ cursor = (cursor + 1) % stops.length;
89
+ break;
90
+ case 'return':
91
+ case 'enter':
92
+ case 'space':
93
+ if (stops[cursor] === submitIndex) {
94
+ if (key.name !== 'space') {
95
+ submit();
96
+ }
97
+ return;
98
+ }
99
+ checked[stops[cursor]] = !checked[stops[cursor]];
100
+ break;
101
+ default:
102
+ return;
103
+ }
104
+ render();
105
+ }
106
+ readline__default.default.emitKeypressEvents(input);
107
+ if (input.isTTY) {
108
+ input.setRawMode(true);
109
+ }
110
+ input.on('keypress', onKeypress);
111
+ input.resume();
112
+ output.write('\n\u001B[?25l');
113
+ render();
114
+ });
115
+
116
+ exports.promptChecklist = promptChecklist;
117
+ //# sourceMappingURL=checklist-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklist-prompt.js","sources":["../../../../../../src/cli/commands/enterprise/install/checklist-prompt.ts"],"sourcesContent":["import readline from 'node:readline';\nimport chalk from 'chalk';\n\nimport { PromptCancelledError } from './errors';\n\nexport interface ChecklistChoice {\n name: string;\n value?: string;\n short?: string;\n checked?: boolean;\n disabled?: string;\n}\n\nconst SUBMIT_LABEL = 'Submit';\n\nconst fitWidth = (text: string, width: number): string =>\n text.length <= width ? text : `${text.slice(0, Math.max(width - 1, 0))}…`;\n\nexport const promptChecklist = ({\n message,\n choices,\n input = process.stdin,\n output = process.stdout,\n}: {\n message: string;\n choices: ChecklistChoice[];\n input?: NodeJS.ReadStream;\n output?: NodeJS.WriteStream;\n}): Promise<string[]> =>\n new Promise((resolve, reject) => {\n const checked = choices.map((choice) => Boolean(choice.checked));\n const submitIndex = choices.length;\n const stops = [\n ...choices.flatMap((choice, index) => (choice.disabled === undefined ? [index] : [])),\n submitIndex,\n ];\n let cursor = 0;\n let renderedLineCount = 0;\n\n const width = () => Math.max((output.columns || 80) - 1, 20);\n\n const renderChoice = (choice: ChecklistChoice, index: number): string => {\n if (choice.disabled !== undefined) {\n return chalk.dim(fitWidth(` - ${choice.name} (${choice.disabled})`, width()));\n }\n\n const isActive = stops[cursor] === index;\n const box = checked[index] ? chalk.green('◉') : '◯';\n const name = fitWidth(choice.name, width() - 4);\n\n return isActive ? `${chalk.cyan('❯')} ${box} ${chalk.cyan(name)}` : ` ${box} ${name}`;\n };\n\n const renderSubmit = () =>\n stops[cursor] === submitIndex\n ? `${chalk.cyan('❯')} ${chalk.cyan.bold(SUBMIT_LABEL)}`\n : ` ${chalk.bold(SUBMIT_LABEL)}`;\n\n const draw = (lines: string[]) => {\n if (renderedLineCount > 0) {\n readline.moveCursor(output, 0, -renderedLineCount);\n readline.cursorTo(output, 0);\n readline.clearScreenDown(output);\n }\n\n output.write(`${lines.join('\\n')}\\n`);\n renderedLineCount = lines.length;\n };\n\n const question = chalk.bold(message);\n const render = () => draw([question, ...choices.map(renderChoice), '', renderSubmit()]);\n\n const stop = () => {\n input.removeListener('keypress', onKeypress);\n if (input.isTTY) {\n input.setRawMode(false);\n }\n input.pause();\n output.write('\\u001B[?25h');\n };\n\n const submit = () => {\n const selected = choices.filter(\n (choice, index) => choice.disabled === undefined && checked[index]\n );\n const answer = selected.map((choice) => choice.short ?? choice.name).join(', ');\n\n draw([`${question} ${chalk.cyan(answer || 'none')}`]);\n stop();\n resolve(selected.flatMap((choice) => (choice.value === undefined ? [] : [choice.value])));\n };\n\n function onKeypress(_text: string, key: readline.Key | undefined) {\n if (!key) {\n return;\n }\n\n if (key.ctrl && key.name === 'c') {\n stop();\n reject(new PromptCancelledError());\n return;\n }\n\n switch (key.name) {\n case 'up':\n case 'k':\n cursor = (cursor - 1 + stops.length) % stops.length;\n break;\n case 'down':\n case 'j':\n case 'tab':\n cursor = (cursor + 1) % stops.length;\n break;\n case 'return':\n case 'enter':\n case 'space':\n if (stops[cursor] === submitIndex) {\n if (key.name !== 'space') {\n submit();\n }\n return;\n }\n checked[stops[cursor]] = !checked[stops[cursor]];\n break;\n default:\n return;\n }\n\n render();\n }\n\n readline.emitKeypressEvents(input);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n input.on('keypress', onKeypress);\n input.resume();\n\n output.write('\\n\\u001B[?25l');\n render();\n });\n"],"names":["SUBMIT_LABEL","fitWidth","text","width","length","slice","Math","max","promptChecklist","message","choices","input","process","stdin","output","stdout","Promise","resolve","reject","checked","map","choice","Boolean","submitIndex","stops","flatMap","index","disabled","undefined","cursor","renderedLineCount","columns","renderChoice","chalk","dim","name","isActive","box","green","cyan","renderSubmit","bold","draw","lines","readline","moveCursor","cursorTo","clearScreenDown","write","join","question","render","stop","removeListener","onKeypress","isTTY","setRawMode","pause","submit","selected","filter","answer","short","value","_text","key","ctrl","PromptCancelledError","emitKeypressEvents","on","resume"],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import readline from 'node:readline';
2
+ import chalk from 'chalk';
3
+ import { PromptCancelledError } from './errors.mjs';
4
+
5
+ const SUBMIT_LABEL = 'Submit';
6
+ const fitWidth = (text, width)=>text.length <= width ? text : `${text.slice(0, Math.max(width - 1, 0))}…`;
7
+ const promptChecklist = ({ message, choices, input = process.stdin, output = process.stdout })=>new Promise((resolve, reject)=>{
8
+ const checked = choices.map((choice)=>Boolean(choice.checked));
9
+ const submitIndex = choices.length;
10
+ const stops = [
11
+ ...choices.flatMap((choice, index)=>choice.disabled === undefined ? [
12
+ index
13
+ ] : []),
14
+ submitIndex
15
+ ];
16
+ let cursor = 0;
17
+ let renderedLineCount = 0;
18
+ const width = ()=>Math.max((output.columns || 80) - 1, 20);
19
+ const renderChoice = (choice, index)=>{
20
+ if (choice.disabled !== undefined) {
21
+ return chalk.dim(fitWidth(` - ${choice.name} (${choice.disabled})`, width()));
22
+ }
23
+ const isActive = stops[cursor] === index;
24
+ const box = checked[index] ? chalk.green('◉') : '◯';
25
+ const name = fitWidth(choice.name, width() - 4);
26
+ return isActive ? `${chalk.cyan('❯')} ${box} ${chalk.cyan(name)}` : ` ${box} ${name}`;
27
+ };
28
+ const renderSubmit = ()=>stops[cursor] === submitIndex ? `${chalk.cyan('❯')} ${chalk.cyan.bold(SUBMIT_LABEL)}` : ` ${chalk.bold(SUBMIT_LABEL)}`;
29
+ const draw = (lines)=>{
30
+ if (renderedLineCount > 0) {
31
+ readline.moveCursor(output, 0, -renderedLineCount);
32
+ readline.cursorTo(output, 0);
33
+ readline.clearScreenDown(output);
34
+ }
35
+ output.write(`${lines.join('\n')}\n`);
36
+ renderedLineCount = lines.length;
37
+ };
38
+ const question = chalk.bold(message);
39
+ const render = ()=>draw([
40
+ question,
41
+ ...choices.map(renderChoice),
42
+ '',
43
+ renderSubmit()
44
+ ]);
45
+ const stop = ()=>{
46
+ input.removeListener('keypress', onKeypress);
47
+ if (input.isTTY) {
48
+ input.setRawMode(false);
49
+ }
50
+ input.pause();
51
+ output.write('\u001B[?25h');
52
+ };
53
+ const submit = ()=>{
54
+ const selected = choices.filter((choice, index)=>choice.disabled === undefined && checked[index]);
55
+ const answer = selected.map((choice)=>choice.short ?? choice.name).join(', ');
56
+ draw([
57
+ `${question} ${chalk.cyan(answer || 'none')}`
58
+ ]);
59
+ stop();
60
+ resolve(selected.flatMap((choice)=>choice.value === undefined ? [] : [
61
+ choice.value
62
+ ]));
63
+ };
64
+ function onKeypress(_text, key) {
65
+ if (!key) {
66
+ return;
67
+ }
68
+ if (key.ctrl && key.name === 'c') {
69
+ stop();
70
+ reject(new PromptCancelledError());
71
+ return;
72
+ }
73
+ switch(key.name){
74
+ case 'up':
75
+ case 'k':
76
+ cursor = (cursor - 1 + stops.length) % stops.length;
77
+ break;
78
+ case 'down':
79
+ case 'j':
80
+ case 'tab':
81
+ cursor = (cursor + 1) % stops.length;
82
+ break;
83
+ case 'return':
84
+ case 'enter':
85
+ case 'space':
86
+ if (stops[cursor] === submitIndex) {
87
+ if (key.name !== 'space') {
88
+ submit();
89
+ }
90
+ return;
91
+ }
92
+ checked[stops[cursor]] = !checked[stops[cursor]];
93
+ break;
94
+ default:
95
+ return;
96
+ }
97
+ render();
98
+ }
99
+ readline.emitKeypressEvents(input);
100
+ if (input.isTTY) {
101
+ input.setRawMode(true);
102
+ }
103
+ input.on('keypress', onKeypress);
104
+ input.resume();
105
+ output.write('\n\u001B[?25l');
106
+ render();
107
+ });
108
+
109
+ export { promptChecklist };
110
+ //# sourceMappingURL=checklist-prompt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklist-prompt.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/checklist-prompt.ts"],"sourcesContent":["import readline from 'node:readline';\nimport chalk from 'chalk';\n\nimport { PromptCancelledError } from './errors';\n\nexport interface ChecklistChoice {\n name: string;\n value?: string;\n short?: string;\n checked?: boolean;\n disabled?: string;\n}\n\nconst SUBMIT_LABEL = 'Submit';\n\nconst fitWidth = (text: string, width: number): string =>\n text.length <= width ? text : `${text.slice(0, Math.max(width - 1, 0))}…`;\n\nexport const promptChecklist = ({\n message,\n choices,\n input = process.stdin,\n output = process.stdout,\n}: {\n message: string;\n choices: ChecklistChoice[];\n input?: NodeJS.ReadStream;\n output?: NodeJS.WriteStream;\n}): Promise<string[]> =>\n new Promise((resolve, reject) => {\n const checked = choices.map((choice) => Boolean(choice.checked));\n const submitIndex = choices.length;\n const stops = [\n ...choices.flatMap((choice, index) => (choice.disabled === undefined ? [index] : [])),\n submitIndex,\n ];\n let cursor = 0;\n let renderedLineCount = 0;\n\n const width = () => Math.max((output.columns || 80) - 1, 20);\n\n const renderChoice = (choice: ChecklistChoice, index: number): string => {\n if (choice.disabled !== undefined) {\n return chalk.dim(fitWidth(` - ${choice.name} (${choice.disabled})`, width()));\n }\n\n const isActive = stops[cursor] === index;\n const box = checked[index] ? chalk.green('◉') : '◯';\n const name = fitWidth(choice.name, width() - 4);\n\n return isActive ? `${chalk.cyan('❯')} ${box} ${chalk.cyan(name)}` : ` ${box} ${name}`;\n };\n\n const renderSubmit = () =>\n stops[cursor] === submitIndex\n ? `${chalk.cyan('❯')} ${chalk.cyan.bold(SUBMIT_LABEL)}`\n : ` ${chalk.bold(SUBMIT_LABEL)}`;\n\n const draw = (lines: string[]) => {\n if (renderedLineCount > 0) {\n readline.moveCursor(output, 0, -renderedLineCount);\n readline.cursorTo(output, 0);\n readline.clearScreenDown(output);\n }\n\n output.write(`${lines.join('\\n')}\\n`);\n renderedLineCount = lines.length;\n };\n\n const question = chalk.bold(message);\n const render = () => draw([question, ...choices.map(renderChoice), '', renderSubmit()]);\n\n const stop = () => {\n input.removeListener('keypress', onKeypress);\n if (input.isTTY) {\n input.setRawMode(false);\n }\n input.pause();\n output.write('\\u001B[?25h');\n };\n\n const submit = () => {\n const selected = choices.filter(\n (choice, index) => choice.disabled === undefined && checked[index]\n );\n const answer = selected.map((choice) => choice.short ?? choice.name).join(', ');\n\n draw([`${question} ${chalk.cyan(answer || 'none')}`]);\n stop();\n resolve(selected.flatMap((choice) => (choice.value === undefined ? [] : [choice.value])));\n };\n\n function onKeypress(_text: string, key: readline.Key | undefined) {\n if (!key) {\n return;\n }\n\n if (key.ctrl && key.name === 'c') {\n stop();\n reject(new PromptCancelledError());\n return;\n }\n\n switch (key.name) {\n case 'up':\n case 'k':\n cursor = (cursor - 1 + stops.length) % stops.length;\n break;\n case 'down':\n case 'j':\n case 'tab':\n cursor = (cursor + 1) % stops.length;\n break;\n case 'return':\n case 'enter':\n case 'space':\n if (stops[cursor] === submitIndex) {\n if (key.name !== 'space') {\n submit();\n }\n return;\n }\n checked[stops[cursor]] = !checked[stops[cursor]];\n break;\n default:\n return;\n }\n\n render();\n }\n\n readline.emitKeypressEvents(input);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n input.on('keypress', onKeypress);\n input.resume();\n\n output.write('\\n\\u001B[?25l');\n render();\n });\n"],"names":["SUBMIT_LABEL","fitWidth","text","width","length","slice","Math","max","promptChecklist","message","choices","input","process","stdin","output","stdout","Promise","resolve","reject","checked","map","choice","Boolean","submitIndex","stops","flatMap","index","disabled","undefined","cursor","renderedLineCount","columns","renderChoice","chalk","dim","name","isActive","box","green","cyan","renderSubmit","bold","draw","lines","readline","moveCursor","cursorTo","clearScreenDown","write","join","question","render","stop","removeListener","onKeypress","isTTY","setRawMode","pause","submit","selected","filter","answer","short","value","_text","key","ctrl","PromptCancelledError","emitKeypressEvents","on","resume"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const ENTERPRISE_SCOPE = '@strapi-enterprise';
4
+ const ENTERPRISE_REGISTRY_URL = 'https://packages.strapi.io/';
5
+ const BILLING_URL = 'https://billing.strapi.io/';
6
+ const ENTERPRISE_PLUGINS_DOCS_URL = 'https://docs.strapi.io/';
7
+ const LICENSE_FILE_NAME = 'license.txt';
8
+ const STRAPI_PACKAGE_NAME = '@strapi/strapi';
9
+
10
+ exports.BILLING_URL = BILLING_URL;
11
+ exports.ENTERPRISE_PLUGINS_DOCS_URL = ENTERPRISE_PLUGINS_DOCS_URL;
12
+ exports.ENTERPRISE_REGISTRY_URL = ENTERPRISE_REGISTRY_URL;
13
+ exports.ENTERPRISE_SCOPE = ENTERPRISE_SCOPE;
14
+ exports.LICENSE_FILE_NAME = LICENSE_FILE_NAME;
15
+ exports.STRAPI_PACKAGE_NAME = STRAPI_PACKAGE_NAME;
16
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../../../../src/cli/commands/enterprise/install/constants.ts"],"sourcesContent":["export const ENTERPRISE_SCOPE = '@strapi-enterprise';\n\nexport const ENTERPRISE_REGISTRY_URL = 'https://packages.strapi.io/';\n\nexport const BILLING_URL = 'https://billing.strapi.io/';\n\nexport const ENTERPRISE_PLUGINS_DOCS_URL = 'https://docs.strapi.io/';\n\nexport const LICENSE_FILE_NAME = 'license.txt';\n\nexport const STRAPI_PACKAGE_NAME = '@strapi/strapi';\n"],"names":["ENTERPRISE_SCOPE","ENTERPRISE_REGISTRY_URL","BILLING_URL","ENTERPRISE_PLUGINS_DOCS_URL","LICENSE_FILE_NAME","STRAPI_PACKAGE_NAME"],"mappings":";;AAAO,MAAMA,mBAAmB;AAEzB,MAAMC,0BAA0B;AAEhC,MAAMC,cAAc;AAEpB,MAAMC,8BAA8B;AAEpC,MAAMC,oBAAoB;AAE1B,MAAMC,sBAAsB;;;;;;;;;"}
@@ -0,0 +1,9 @@
1
+ const ENTERPRISE_SCOPE = '@strapi-enterprise';
2
+ const ENTERPRISE_REGISTRY_URL = 'https://packages.strapi.io/';
3
+ const BILLING_URL = 'https://billing.strapi.io/';
4
+ const ENTERPRISE_PLUGINS_DOCS_URL = 'https://docs.strapi.io/';
5
+ const LICENSE_FILE_NAME = 'license.txt';
6
+ const STRAPI_PACKAGE_NAME = '@strapi/strapi';
7
+
8
+ export { BILLING_URL, ENTERPRISE_PLUGINS_DOCS_URL, ENTERPRISE_REGISTRY_URL, ENTERPRISE_SCOPE, LICENSE_FILE_NAME, STRAPI_PACKAGE_NAME };
9
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/constants.ts"],"sourcesContent":["export const ENTERPRISE_SCOPE = '@strapi-enterprise';\n\nexport const ENTERPRISE_REGISTRY_URL = 'https://packages.strapi.io/';\n\nexport const BILLING_URL = 'https://billing.strapi.io/';\n\nexport const ENTERPRISE_PLUGINS_DOCS_URL = 'https://docs.strapi.io/';\n\nexport const LICENSE_FILE_NAME = 'license.txt';\n\nexport const STRAPI_PACKAGE_NAME = '@strapi/strapi';\n"],"names":["ENTERPRISE_SCOPE","ENTERPRISE_REGISTRY_URL","BILLING_URL","ENTERPRISE_PLUGINS_DOCS_URL","LICENSE_FILE_NAME","STRAPI_PACKAGE_NAME"],"mappings":"AAAO,MAAMA,mBAAmB;AAEzB,MAAMC,0BAA0B;AAEhC,MAAMC,cAAc;AAEpB,MAAMC,8BAA8B;AAEpC,MAAMC,oBAAoB;AAE1B,MAAMC,sBAAsB;;;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var path = require('node:path');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var path__default = /*#__PURE__*/_interopDefault(path);
8
+
9
+ /** The app folder and each of its parents, up to the root of the file system. */ const listAncestorDirectories = (appDir)=>{
10
+ let directory = path__default.default.resolve(appDir);
11
+ const directories = [
12
+ directory
13
+ ];
14
+ // `path.dirname` of the root is the root itself, which ends the walk.
15
+ while(path__default.default.dirname(directory) !== directory){
16
+ directory = path__default.default.dirname(directory);
17
+ directories.push(directory);
18
+ }
19
+ return directories;
20
+ };
21
+
22
+ exports.listAncestorDirectories = listAncestorDirectories;
23
+ //# sourceMappingURL=directories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directories.js","sources":["../../../../../../src/cli/commands/enterprise/install/directories.ts"],"sourcesContent":["import path from 'node:path';\n\n/** The app folder and each of its parents, up to the root of the file system. */\nexport const listAncestorDirectories = (appDir: string): string[] => {\n let directory = path.resolve(appDir);\n const directories = [directory];\n\n // `path.dirname` of the root is the root itself, which ends the walk.\n while (path.dirname(directory) !== directory) {\n directory = path.dirname(directory);\n directories.push(directory);\n }\n\n return directories;\n};\n"],"names":["listAncestorDirectories","appDir","directory","path","resolve","directories","dirname","push"],"mappings":";;;;;;;;AAEA,kFACO,MAAMA,uBAAAA,GAA0B,CAACC,MAAAA,GAAAA;IACtC,IAAIC,SAAAA,GAAYC,qBAAAA,CAAKC,OAAO,CAACH,MAAAA,CAAAA;AAC7B,IAAA,MAAMI,WAAAA,GAAc;AAACH,QAAAA;AAAU,KAAA;;AAG/B,IAAA,MAAOC,qBAAAA,CAAKG,OAAO,CAACJ,SAAAA,CAAAA,KAAeA,SAAAA,CAAW;QAC5CA,SAAAA,GAAYC,qBAAAA,CAAKG,OAAO,CAACJ,SAAAA,CAAAA;AACzBG,QAAAA,WAAAA,CAAYE,IAAI,CAACL,SAAAA,CAAAA;AACnB,IAAA;IAEA,OAAOG,WAAAA;AACT;;;;"}
@@ -0,0 +1,17 @@
1
+ import path from 'node:path';
2
+
3
+ /** The app folder and each of its parents, up to the root of the file system. */ const listAncestorDirectories = (appDir)=>{
4
+ let directory = path.resolve(appDir);
5
+ const directories = [
6
+ directory
7
+ ];
8
+ // `path.dirname` of the root is the root itself, which ends the walk.
9
+ while(path.dirname(directory) !== directory){
10
+ directory = path.dirname(directory);
11
+ directories.push(directory);
12
+ }
13
+ return directories;
14
+ };
15
+
16
+ export { listAncestorDirectories };
17
+ //# sourceMappingURL=directories.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directories.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/directories.ts"],"sourcesContent":["import path from 'node:path';\n\n/** The app folder and each of its parents, up to the root of the file system. */\nexport const listAncestorDirectories = (appDir: string): string[] => {\n let directory = path.resolve(appDir);\n const directories = [directory];\n\n // `path.dirname` of the root is the root itself, which ends the walk.\n while (path.dirname(directory) !== directory) {\n directory = path.dirname(directory);\n directories.push(directory);\n }\n\n return directories;\n};\n"],"names":["listAncestorDirectories","appDir","directory","path","resolve","directories","dirname","push"],"mappings":";;AAEA,kFACO,MAAMA,uBAAAA,GAA0B,CAACC,MAAAA,GAAAA;IACtC,IAAIC,SAAAA,GAAYC,IAAAA,CAAKC,OAAO,CAACH,MAAAA,CAAAA;AAC7B,IAAA,MAAMI,WAAAA,GAAc;AAACH,QAAAA;AAAU,KAAA;;AAG/B,IAAA,MAAOC,IAAAA,CAAKG,OAAO,CAACJ,SAAAA,CAAAA,KAAeA,SAAAA,CAAW;QAC5CA,SAAAA,GAAYC,IAAAA,CAAKG,OAAO,CAACJ,SAAAA,CAAAA;AACzBG,QAAAA,WAAAA,CAAYE,IAAI,CAACL,SAAAA,CAAAA;AACnB,IAAA;IAEA,OAAOG,WAAAA;AACT;;;;"}
@@ -0,0 +1,109 @@
1
+ 'use strict';
2
+
3
+ var constants = require('./constants.js');
4
+ var errors = require('./errors.js');
5
+ var registry = require('./registry.js');
6
+ var versions = require('./versions.js');
7
+
8
+ const isEnterprisePackage = (packageName)=>packageName.startsWith(`${constants.ENTERPRISE_SCOPE}/`);
9
+ const declaresStrapiKind = (strapiKind)=>typeof strapiKind === 'string' && strapiKind.length > 0;
10
+ /**
11
+ * Enterprise plugins the app depends on: listed in its own `package.json`, and installed. Libraries
12
+ * the plugins depend on are left out, as are copies hoisted for another app of the same monorepo.
13
+ */ const listInstalledEnterprisePlugins = async (appDir)=>{
14
+ const installedPluginNames = [];
15
+ for (const packageName of (await versions.readAppDependencyNames(appDir))){
16
+ if (!isEnterprisePackage(packageName)) {
17
+ continue;
18
+ }
19
+ const packageJson = await versions.readInstalledPackageJson(appDir, packageName);
20
+ if (declaresStrapiKind(packageJson?.strapi?.kind)) {
21
+ installedPluginNames.push(packageName);
22
+ }
23
+ }
24
+ return installedPluginNames;
25
+ };
26
+ const findLatestManifest = (packument)=>{
27
+ const latestVersion = packument['dist-tags']?.latest;
28
+ return latestVersion ? packument.versions?.[latestVersion] : undefined;
29
+ };
30
+ const describeEnterprisePlugin = (packageName, lookup)=>{
31
+ if (lookup.status !== 'available') {
32
+ return {
33
+ packageName,
34
+ displayName: packageName,
35
+ summary: ''
36
+ };
37
+ }
38
+ const latestManifest = findLatestManifest(lookup.packument);
39
+ const strapiMetadata = latestManifest?.strapi;
40
+ if (!strapiMetadata || !declaresStrapiKind(strapiMetadata.kind)) {
41
+ return undefined;
42
+ }
43
+ return {
44
+ packageName,
45
+ displayName: strapiMetadata.displayName ?? packageName,
46
+ summary: strapiMetadata.description ?? latestManifest?.description ?? '',
47
+ kind: strapiMetadata.kind
48
+ };
49
+ };
50
+ const discoverEnterprisePlugins = async ({ appDir, license, logger, fetchImplementation })=>{
51
+ const [searchResult, installedPluginNames] = await Promise.all([
52
+ registry.searchPackageNames({
53
+ text: constants.ENTERPRISE_SCOPE,
54
+ license,
55
+ fetchImplementation
56
+ }),
57
+ listInstalledEnterprisePlugins(appDir)
58
+ ]);
59
+ if (searchResult.status === 'license-rejected') {
60
+ throw new errors.EnterpriseInstallError(searchResult.message);
61
+ }
62
+ if (searchResult.status === 'unavailable') {
63
+ const registryHost = new URL(constants.ENTERPRISE_REGISTRY_URL).host;
64
+ if (installedPluginNames.length === 0) {
65
+ throw new errors.EnterpriseInstallError(`Could not search ${registryHost}. Try again later, or name the plugin to install.`);
66
+ }
67
+ logger.warn(`Could not search ${registryHost}, so only the installed Enterprise plugins are listed.`);
68
+ }
69
+ const candidatePackageNames = [
70
+ ...new Set([
71
+ ...searchResult.status === 'available' ? searchResult.packageNames : [],
72
+ ...installedPluginNames
73
+ ])
74
+ ].filter(isEnterprisePackage);
75
+ const lookupFailures = [];
76
+ const discoveredPlugins = await Promise.all(candidatePackageNames.map(async (packageName)=>{
77
+ const [lookup, installedVersion] = await Promise.all([
78
+ registry.fetchPackument({
79
+ packageName,
80
+ license,
81
+ fetchImplementation
82
+ }),
83
+ versions.readAppDependencyVersion(appDir, packageName)
84
+ ]);
85
+ if (lookup.status === 'unavailable') {
86
+ // One package the registry fails to describe should not hide the others.
87
+ lookupFailures.push(lookup.message);
88
+ logger.warn(`${packageName} is left out of the list: ${lookup.message}`);
89
+ return undefined;
90
+ }
91
+ const entry = describeEnterprisePlugin(packageName, lookup);
92
+ return entry ? {
93
+ entry,
94
+ lookup,
95
+ installedVersion
96
+ } : undefined;
97
+ }));
98
+ // When every lookup fails, the registry itself is the problem, not the license.
99
+ if (candidatePackageNames.length > 0 && lookupFailures.length === candidatePackageNames.length) {
100
+ throw new errors.EnterpriseInstallError(lookupFailures[0]);
101
+ }
102
+ return discoveredPlugins.filter((discoveredPlugin)=>discoveredPlugin !== undefined);
103
+ };
104
+
105
+ exports.declaresStrapiKind = declaresStrapiKind;
106
+ exports.describeEnterprisePlugin = describeEnterprisePlugin;
107
+ exports.discoverEnterprisePlugins = discoverEnterprisePlugins;
108
+ exports.listInstalledEnterprisePlugins = listInstalledEnterprisePlugins;
109
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sources":["../../../../../../src/cli/commands/enterprise/install/discovery.ts"],"sourcesContent":["import type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_REGISTRY_URL, ENTERPRISE_SCOPE } from './constants';\nimport { EnterpriseInstallError } from './errors';\nimport {\n fetchPackument,\n searchPackageNames,\n type Packument,\n type PackumentLookup,\n} from './registry';\nimport {\n readAppDependencyNames,\n readAppDependencyVersion,\n readInstalledPackageJson,\n} from './versions';\n\nexport interface EnterprisePluginEntry {\n packageName: string;\n displayName: string;\n summary: string;\n kind?: string;\n}\n\nexport interface DiscoveredPlugin {\n entry: EnterprisePluginEntry;\n lookup: Exclude<PackumentLookup, { status: 'unavailable' }>;\n installedVersion?: string;\n}\n\nconst isEnterprisePackage = (packageName: string) => packageName.startsWith(`${ENTERPRISE_SCOPE}/`);\n\nexport const declaresStrapiKind = (strapiKind: unknown): strapiKind is string =>\n typeof strapiKind === 'string' && strapiKind.length > 0;\n\n/**\n * Enterprise plugins the app depends on: listed in its own `package.json`, and installed. Libraries\n * the plugins depend on are left out, as are copies hoisted for another app of the same monorepo.\n */\nexport const listInstalledEnterprisePlugins = async (appDir: string): Promise<string[]> => {\n const installedPluginNames: string[] = [];\n\n for (const packageName of await readAppDependencyNames(appDir)) {\n if (!isEnterprisePackage(packageName)) {\n continue;\n }\n\n const packageJson = await readInstalledPackageJson(appDir, packageName);\n\n if (declaresStrapiKind(packageJson?.strapi?.kind)) {\n installedPluginNames.push(packageName);\n }\n }\n\n return installedPluginNames;\n};\n\nconst findLatestManifest = (packument: Packument) => {\n const latestVersion = packument['dist-tags']?.latest;\n\n return latestVersion ? packument.versions?.[latestVersion] : undefined;\n};\n\nexport const describeEnterprisePlugin = (\n packageName: string,\n lookup: PackumentLookup\n): EnterprisePluginEntry | undefined => {\n if (lookup.status !== 'available') {\n return {\n packageName,\n displayName: packageName,\n summary: '',\n };\n }\n\n const latestManifest = findLatestManifest(lookup.packument);\n const strapiMetadata = latestManifest?.strapi;\n\n if (!strapiMetadata || !declaresStrapiKind(strapiMetadata.kind)) {\n return undefined;\n }\n\n return {\n packageName,\n displayName: strapiMetadata.displayName ?? packageName,\n summary: strapiMetadata.description ?? latestManifest?.description ?? '',\n kind: strapiMetadata.kind,\n };\n};\n\nexport const discoverEnterprisePlugins = async ({\n appDir,\n license,\n logger,\n fetchImplementation,\n}: {\n appDir: string;\n license: string;\n logger: Logger;\n fetchImplementation: typeof fetch;\n}): Promise<DiscoveredPlugin[]> => {\n const [searchResult, installedPluginNames] = await Promise.all([\n searchPackageNames({ text: ENTERPRISE_SCOPE, license, fetchImplementation }),\n listInstalledEnterprisePlugins(appDir),\n ]);\n\n if (searchResult.status === 'license-rejected') {\n throw new EnterpriseInstallError(searchResult.message);\n }\n\n if (searchResult.status === 'unavailable') {\n const registryHost = new URL(ENTERPRISE_REGISTRY_URL).host;\n\n if (installedPluginNames.length === 0) {\n throw new EnterpriseInstallError(\n `Could not search ${registryHost}. Try again later, or name the plugin to install.`\n );\n }\n\n logger.warn(\n `Could not search ${registryHost}, so only the installed Enterprise plugins are listed.`\n );\n }\n\n const candidatePackageNames = [\n ...new Set([\n ...(searchResult.status === 'available' ? searchResult.packageNames : []),\n ...installedPluginNames,\n ]),\n ].filter(isEnterprisePackage);\n\n const lookupFailures: string[] = [];\n\n const discoveredPlugins = await Promise.all(\n candidatePackageNames.map(async (packageName): Promise<DiscoveredPlugin | undefined> => {\n const [lookup, installedVersion] = await Promise.all([\n fetchPackument({ packageName, license, fetchImplementation }),\n readAppDependencyVersion(appDir, packageName),\n ]);\n\n if (lookup.status === 'unavailable') {\n // One package the registry fails to describe should not hide the others.\n lookupFailures.push(lookup.message);\n logger.warn(`${packageName} is left out of the list: ${lookup.message}`);\n\n return undefined;\n }\n\n const entry = describeEnterprisePlugin(packageName, lookup);\n\n return entry ? { entry, lookup, installedVersion } : undefined;\n })\n );\n\n // When every lookup fails, the registry itself is the problem, not the license.\n if (candidatePackageNames.length > 0 && lookupFailures.length === candidatePackageNames.length) {\n throw new EnterpriseInstallError(lookupFailures[0]);\n }\n\n return discoveredPlugins.filter(\n (discoveredPlugin): discoveredPlugin is DiscoveredPlugin => discoveredPlugin !== undefined\n );\n};\n"],"names":["isEnterprisePackage","packageName","startsWith","ENTERPRISE_SCOPE","declaresStrapiKind","strapiKind","length","listInstalledEnterprisePlugins","appDir","installedPluginNames","readAppDependencyNames","packageJson","readInstalledPackageJson","strapi","kind","push","findLatestManifest","packument","latestVersion","latest","versions","undefined","describeEnterprisePlugin","lookup","status","displayName","summary","latestManifest","strapiMetadata","description","discoverEnterprisePlugins","license","logger","fetchImplementation","searchResult","Promise","all","searchPackageNames","text","EnterpriseInstallError","message","registryHost","URL","ENTERPRISE_REGISTRY_URL","host","warn","candidatePackageNames","Set","packageNames","filter","lookupFailures","discoveredPlugins","map","installedVersion","fetchPackument","readAppDependencyVersion","entry","discoveredPlugin"],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { ENTERPRISE_REGISTRY_URL, ENTERPRISE_SCOPE } from './constants.mjs';
2
+ import { EnterpriseInstallError } from './errors.mjs';
3
+ import { searchPackageNames, fetchPackument } from './registry.mjs';
4
+ import { readAppDependencyVersion, readAppDependencyNames, readInstalledPackageJson } from './versions.mjs';
5
+
6
+ const isEnterprisePackage = (packageName)=>packageName.startsWith(`${ENTERPRISE_SCOPE}/`);
7
+ const declaresStrapiKind = (strapiKind)=>typeof strapiKind === 'string' && strapiKind.length > 0;
8
+ /**
9
+ * Enterprise plugins the app depends on: listed in its own `package.json`, and installed. Libraries
10
+ * the plugins depend on are left out, as are copies hoisted for another app of the same monorepo.
11
+ */ const listInstalledEnterprisePlugins = async (appDir)=>{
12
+ const installedPluginNames = [];
13
+ for (const packageName of (await readAppDependencyNames(appDir))){
14
+ if (!isEnterprisePackage(packageName)) {
15
+ continue;
16
+ }
17
+ const packageJson = await readInstalledPackageJson(appDir, packageName);
18
+ if (declaresStrapiKind(packageJson?.strapi?.kind)) {
19
+ installedPluginNames.push(packageName);
20
+ }
21
+ }
22
+ return installedPluginNames;
23
+ };
24
+ const findLatestManifest = (packument)=>{
25
+ const latestVersion = packument['dist-tags']?.latest;
26
+ return latestVersion ? packument.versions?.[latestVersion] : undefined;
27
+ };
28
+ const describeEnterprisePlugin = (packageName, lookup)=>{
29
+ if (lookup.status !== 'available') {
30
+ return {
31
+ packageName,
32
+ displayName: packageName,
33
+ summary: ''
34
+ };
35
+ }
36
+ const latestManifest = findLatestManifest(lookup.packument);
37
+ const strapiMetadata = latestManifest?.strapi;
38
+ if (!strapiMetadata || !declaresStrapiKind(strapiMetadata.kind)) {
39
+ return undefined;
40
+ }
41
+ return {
42
+ packageName,
43
+ displayName: strapiMetadata.displayName ?? packageName,
44
+ summary: strapiMetadata.description ?? latestManifest?.description ?? '',
45
+ kind: strapiMetadata.kind
46
+ };
47
+ };
48
+ const discoverEnterprisePlugins = async ({ appDir, license, logger, fetchImplementation })=>{
49
+ const [searchResult, installedPluginNames] = await Promise.all([
50
+ searchPackageNames({
51
+ text: ENTERPRISE_SCOPE,
52
+ license,
53
+ fetchImplementation
54
+ }),
55
+ listInstalledEnterprisePlugins(appDir)
56
+ ]);
57
+ if (searchResult.status === 'license-rejected') {
58
+ throw new EnterpriseInstallError(searchResult.message);
59
+ }
60
+ if (searchResult.status === 'unavailable') {
61
+ const registryHost = new URL(ENTERPRISE_REGISTRY_URL).host;
62
+ if (installedPluginNames.length === 0) {
63
+ throw new EnterpriseInstallError(`Could not search ${registryHost}. Try again later, or name the plugin to install.`);
64
+ }
65
+ logger.warn(`Could not search ${registryHost}, so only the installed Enterprise plugins are listed.`);
66
+ }
67
+ const candidatePackageNames = [
68
+ ...new Set([
69
+ ...searchResult.status === 'available' ? searchResult.packageNames : [],
70
+ ...installedPluginNames
71
+ ])
72
+ ].filter(isEnterprisePackage);
73
+ const lookupFailures = [];
74
+ const discoveredPlugins = await Promise.all(candidatePackageNames.map(async (packageName)=>{
75
+ const [lookup, installedVersion] = await Promise.all([
76
+ fetchPackument({
77
+ packageName,
78
+ license,
79
+ fetchImplementation
80
+ }),
81
+ readAppDependencyVersion(appDir, packageName)
82
+ ]);
83
+ if (lookup.status === 'unavailable') {
84
+ // One package the registry fails to describe should not hide the others.
85
+ lookupFailures.push(lookup.message);
86
+ logger.warn(`${packageName} is left out of the list: ${lookup.message}`);
87
+ return undefined;
88
+ }
89
+ const entry = describeEnterprisePlugin(packageName, lookup);
90
+ return entry ? {
91
+ entry,
92
+ lookup,
93
+ installedVersion
94
+ } : undefined;
95
+ }));
96
+ // When every lookup fails, the registry itself is the problem, not the license.
97
+ if (candidatePackageNames.length > 0 && lookupFailures.length === candidatePackageNames.length) {
98
+ throw new EnterpriseInstallError(lookupFailures[0]);
99
+ }
100
+ return discoveredPlugins.filter((discoveredPlugin)=>discoveredPlugin !== undefined);
101
+ };
102
+
103
+ export { declaresStrapiKind, describeEnterprisePlugin, discoverEnterprisePlugins, listInstalledEnterprisePlugins };
104
+ //# sourceMappingURL=discovery.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/discovery.ts"],"sourcesContent":["import type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_REGISTRY_URL, ENTERPRISE_SCOPE } from './constants';\nimport { EnterpriseInstallError } from './errors';\nimport {\n fetchPackument,\n searchPackageNames,\n type Packument,\n type PackumentLookup,\n} from './registry';\nimport {\n readAppDependencyNames,\n readAppDependencyVersion,\n readInstalledPackageJson,\n} from './versions';\n\nexport interface EnterprisePluginEntry {\n packageName: string;\n displayName: string;\n summary: string;\n kind?: string;\n}\n\nexport interface DiscoveredPlugin {\n entry: EnterprisePluginEntry;\n lookup: Exclude<PackumentLookup, { status: 'unavailable' }>;\n installedVersion?: string;\n}\n\nconst isEnterprisePackage = (packageName: string) => packageName.startsWith(`${ENTERPRISE_SCOPE}/`);\n\nexport const declaresStrapiKind = (strapiKind: unknown): strapiKind is string =>\n typeof strapiKind === 'string' && strapiKind.length > 0;\n\n/**\n * Enterprise plugins the app depends on: listed in its own `package.json`, and installed. Libraries\n * the plugins depend on are left out, as are copies hoisted for another app of the same monorepo.\n */\nexport const listInstalledEnterprisePlugins = async (appDir: string): Promise<string[]> => {\n const installedPluginNames: string[] = [];\n\n for (const packageName of await readAppDependencyNames(appDir)) {\n if (!isEnterprisePackage(packageName)) {\n continue;\n }\n\n const packageJson = await readInstalledPackageJson(appDir, packageName);\n\n if (declaresStrapiKind(packageJson?.strapi?.kind)) {\n installedPluginNames.push(packageName);\n }\n }\n\n return installedPluginNames;\n};\n\nconst findLatestManifest = (packument: Packument) => {\n const latestVersion = packument['dist-tags']?.latest;\n\n return latestVersion ? packument.versions?.[latestVersion] : undefined;\n};\n\nexport const describeEnterprisePlugin = (\n packageName: string,\n lookup: PackumentLookup\n): EnterprisePluginEntry | undefined => {\n if (lookup.status !== 'available') {\n return {\n packageName,\n displayName: packageName,\n summary: '',\n };\n }\n\n const latestManifest = findLatestManifest(lookup.packument);\n const strapiMetadata = latestManifest?.strapi;\n\n if (!strapiMetadata || !declaresStrapiKind(strapiMetadata.kind)) {\n return undefined;\n }\n\n return {\n packageName,\n displayName: strapiMetadata.displayName ?? packageName,\n summary: strapiMetadata.description ?? latestManifest?.description ?? '',\n kind: strapiMetadata.kind,\n };\n};\n\nexport const discoverEnterprisePlugins = async ({\n appDir,\n license,\n logger,\n fetchImplementation,\n}: {\n appDir: string;\n license: string;\n logger: Logger;\n fetchImplementation: typeof fetch;\n}): Promise<DiscoveredPlugin[]> => {\n const [searchResult, installedPluginNames] = await Promise.all([\n searchPackageNames({ text: ENTERPRISE_SCOPE, license, fetchImplementation }),\n listInstalledEnterprisePlugins(appDir),\n ]);\n\n if (searchResult.status === 'license-rejected') {\n throw new EnterpriseInstallError(searchResult.message);\n }\n\n if (searchResult.status === 'unavailable') {\n const registryHost = new URL(ENTERPRISE_REGISTRY_URL).host;\n\n if (installedPluginNames.length === 0) {\n throw new EnterpriseInstallError(\n `Could not search ${registryHost}. Try again later, or name the plugin to install.`\n );\n }\n\n logger.warn(\n `Could not search ${registryHost}, so only the installed Enterprise plugins are listed.`\n );\n }\n\n const candidatePackageNames = [\n ...new Set([\n ...(searchResult.status === 'available' ? searchResult.packageNames : []),\n ...installedPluginNames,\n ]),\n ].filter(isEnterprisePackage);\n\n const lookupFailures: string[] = [];\n\n const discoveredPlugins = await Promise.all(\n candidatePackageNames.map(async (packageName): Promise<DiscoveredPlugin | undefined> => {\n const [lookup, installedVersion] = await Promise.all([\n fetchPackument({ packageName, license, fetchImplementation }),\n readAppDependencyVersion(appDir, packageName),\n ]);\n\n if (lookup.status === 'unavailable') {\n // One package the registry fails to describe should not hide the others.\n lookupFailures.push(lookup.message);\n logger.warn(`${packageName} is left out of the list: ${lookup.message}`);\n\n return undefined;\n }\n\n const entry = describeEnterprisePlugin(packageName, lookup);\n\n return entry ? { entry, lookup, installedVersion } : undefined;\n })\n );\n\n // When every lookup fails, the registry itself is the problem, not the license.\n if (candidatePackageNames.length > 0 && lookupFailures.length === candidatePackageNames.length) {\n throw new EnterpriseInstallError(lookupFailures[0]);\n }\n\n return discoveredPlugins.filter(\n (discoveredPlugin): discoveredPlugin is DiscoveredPlugin => discoveredPlugin !== undefined\n );\n};\n"],"names":["isEnterprisePackage","packageName","startsWith","ENTERPRISE_SCOPE","declaresStrapiKind","strapiKind","length","listInstalledEnterprisePlugins","appDir","installedPluginNames","readAppDependencyNames","packageJson","readInstalledPackageJson","strapi","kind","push","findLatestManifest","packument","latestVersion","latest","versions","undefined","describeEnterprisePlugin","lookup","status","displayName","summary","latestManifest","strapiMetadata","description","discoverEnterprisePlugins","license","logger","fetchImplementation","searchResult","Promise","all","searchPackageNames","text","EnterpriseInstallError","message","registryHost","URL","ENTERPRISE_REGISTRY_URL","host","warn","candidatePackageNames","Set","packageNames","filter","lookupFailures","discoveredPlugins","map","installedVersion","fetchPackument","readAppDependencyVersion","entry","discoveredPlugin"],"mappings":"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"}