@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,253 @@
1
+ 'use strict';
2
+
3
+ var os = require('node:os');
4
+ var env = require('../../../../node/core/env.js');
5
+ var constants = require('./constants.js');
6
+ var discovery = require('./discovery.js');
7
+ var errors = require('./errors.js');
8
+ var installPackages = require('./install-packages.js');
9
+ var license = require('./license.js');
10
+ var packageManager = require('./package-manager.js');
11
+ var pluginStatus = require('./plugin-status.js');
12
+ var registryAccess = require('./registry-access.js');
13
+ var registry = require('./registry.js');
14
+ var selection = require('./selection.js');
15
+ var setupLinks = require('./setup-links.js');
16
+ var versions = require('./versions.js');
17
+
18
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
+
20
+ var os__default = /*#__PURE__*/_interopDefault(os);
21
+
22
+ const describeNoStableRelease = (packageName)=>`${packageName} has no stable release yet. To install a prerelease, name its version: ${packageName}@<version>.`;
23
+ const describeStrapiMismatch = (packageName, requiredStrapiRange, strapiVersion)=>`${packageName} requires Strapi ${requiredStrapiRange} and this app uses ${strapiVersion}. Upgrade Strapi first.`;
24
+ const ENTERPRISE_PACKAGE_NAME = new RegExp(`^${constants.ENTERPRISE_SCOPE}/[a-z0-9-][a-z0-9._-]*$`);
25
+ const MAX_PACKAGE_NAME_LENGTH = 214;
26
+ const isValidPackageName = (packageName)=>packageName.length <= MAX_PACKAGE_NAME_LENGTH && ENTERPRISE_PACKAGE_NAME.test(packageName);
27
+ const parsePackageArgument = (packageArgument)=>{
28
+ const scopedArgument = packageArgument.startsWith('@') ? packageArgument : `${constants.ENTERPRISE_SCOPE}/${packageArgument}`;
29
+ const versionSeparatorIndex = scopedArgument.indexOf('@', 1);
30
+ const packageName = versionSeparatorIndex === -1 ? scopedArgument : scopedArgument.slice(0, versionSeparatorIndex);
31
+ const requestedVersion = versionSeparatorIndex === -1 ? undefined : scopedArgument.slice(versionSeparatorIndex + 1);
32
+ if (!packageName.startsWith(`${constants.ENTERPRISE_SCOPE}/`)) {
33
+ throw new errors.EnterpriseInstallError(`${packageArgument} is not an Enterprise package. Enterprise packages start with ${constants.ENTERPRISE_SCOPE}/.`);
34
+ }
35
+ if (!isValidPackageName(packageName)) {
36
+ throw new errors.EnterpriseInstallError(`${packageArgument} is not a valid package name.`);
37
+ }
38
+ return {
39
+ packageName,
40
+ requestedVersion: requestedVersion || undefined
41
+ };
42
+ };
43
+ const resolveNamedPackages = async (requestedPackages, { appDir, license, strapiVersion, logger, dependencies })=>{
44
+ const installSpecs = [];
45
+ for (const { packageName, requestedVersion } of requestedPackages){
46
+ const lookup = await registry.fetchPackument({
47
+ packageName,
48
+ license,
49
+ fetchImplementation: dependencies.fetchImplementation
50
+ });
51
+ const installedVersion = await versions.readAppDependencyVersion(appDir, packageName);
52
+ if (requestedVersion && lookup.status === 'available') {
53
+ const resolvedVersion = versions.resolveRequestedVersion(lookup.packument, requestedVersion, strapiVersion);
54
+ if (!resolvedVersion) {
55
+ throw new errors.EnterpriseInstallError(`${packageName} has no version or tag ${requestedVersion}.`);
56
+ }
57
+ if (resolvedVersion === installedVersion) {
58
+ logger.info(`${packageName} ${resolvedVersion} is already installed.`);
59
+ continue;
60
+ }
61
+ const unsupportedStrapiRange = versions.findUnsupportedStrapiRange(lookup.packument, resolvedVersion, strapiVersion);
62
+ if (unsupportedStrapiRange) {
63
+ logger.warn(`${packageName} ${resolvedVersion} requires Strapi ${unsupportedStrapiRange} and this app uses ${strapiVersion}. Strapi may not start until you upgrade it.`);
64
+ }
65
+ installSpecs.push(`${packageName}@${resolvedVersion}`);
66
+ continue;
67
+ }
68
+ const status = pluginStatus.resolvePluginStatus({
69
+ lookup,
70
+ installedVersion,
71
+ strapiVersion
72
+ });
73
+ switch(status.state){
74
+ case 'not-licensed':
75
+ throw new errors.EnterpriseInstallError(`Your license does not include ${packageName}, or it does not exist. Run strapi enterprise install without a name to see the plugins you can install.`);
76
+ case 'not-found':
77
+ throw new errors.EnterpriseInstallError(`No Enterprise package named ${packageName}. Run strapi enterprise install without a name to see the plugins you can install.`);
78
+ case 'no-stable-release':
79
+ throw new errors.EnterpriseInstallError(describeNoStableRelease(packageName));
80
+ case 'no-compatible-version':
81
+ throw new errors.EnterpriseInstallError(describeStrapiMismatch(packageName, status.requiredStrapiRange, strapiVersion));
82
+ }
83
+ if (status.newerVersionNote) {
84
+ logger.info(`${packageName}: ${status.newerVersionNote}`);
85
+ }
86
+ if (status.state === 'installed') {
87
+ logger.info(`${packageName} ${installedVersion} is already installed and up to date.`);
88
+ continue;
89
+ }
90
+ if (installedVersion && versions.isPrerelease(installedVersion)) {
91
+ logger.info(`${packageName}: replacing the installed prerelease ${installedVersion} with the stable release ${status.targetVersion}.`);
92
+ }
93
+ if (status.state === 'upgrade' && status.isMajorUpgrade) {
94
+ logger.warn(`${packageName}: upgrading from ${installedVersion} to ${status.targetVersion}, a major upgrade that may include breaking changes.`);
95
+ }
96
+ installSpecs.push(`${packageName}@${status.targetVersion}`);
97
+ }
98
+ return installSpecs;
99
+ };
100
+ const selectPlugins = async ({ appDir, license, strapiVersion, logger, dependencies })=>{
101
+ const discoveredPlugins = await discovery.discoverEnterprisePlugins({
102
+ appDir,
103
+ license,
104
+ logger,
105
+ fetchImplementation: dependencies.fetchImplementation
106
+ });
107
+ const rows = discoveredPlugins.map(({ entry, lookup, installedVersion })=>selection.buildPluginRow({
108
+ entry,
109
+ lookup,
110
+ installedVersion,
111
+ strapiVersion
112
+ }));
113
+ const isAnyPluginLicensed = discoveredPlugins.some(({ lookup })=>lookup.status === 'available');
114
+ rows.filter((row)=>row.state === 'not-licensed').forEach((row)=>logger.warn(`${row.entry.packageName} is installed but is not included in your license.`));
115
+ if (!isAnyPluginLicensed && !rows.some((row)=>row.state === 'not-licensed')) {
116
+ throw new errors.EnterpriseInstallError('Your license does not include any Enterprise plugins.');
117
+ }
118
+ if (!rows.some(selection.isSelectable)) {
119
+ const visibleRows = selection.orderVisibleRows(rows);
120
+ // Says why each plugin cannot be installed, rather than calling them all up to date.
121
+ visibleRows.forEach((row)=>{
122
+ const { packageName } = row.entry;
123
+ if (row.state === 'installed' && row.newerVersionNote) {
124
+ logger.info(`${packageName}: ${row.newerVersionNote}`);
125
+ } else if (row.state === 'no-stable-release') {
126
+ logger.info(describeNoStableRelease(packageName));
127
+ } else if (row.state === 'no-compatible-version') {
128
+ logger.info(describeStrapiMismatch(packageName, row.requiredStrapiRange, strapiVersion));
129
+ }
130
+ });
131
+ if (visibleRows.every((row)=>row.state === 'installed' || row.state === 'not-licensed')) {
132
+ logger.info('The Enterprise plugins in your license are installed and up to date.');
133
+ }
134
+ return [];
135
+ }
136
+ return dependencies.promptForPlugins(rows);
137
+ };
138
+ const warnWhenCompatibilityIsUnknown = (strapiVersion, logger)=>{
139
+ if (strapiVersion === undefined) {
140
+ logger.warn(`Could not find ${constants.STRAPI_PACKAGE_NAME} in node_modules, so plugin compatibility is not checked. Install the app's dependencies first.`);
141
+ } else if (!versions.canCheckStrapiCompatibility(strapiVersion)) {
142
+ logger.warn(`This app uses Strapi ${strapiVersion}, a prerelease, so plugin compatibility is not checked.`);
143
+ }
144
+ };
145
+ const runInstall = async ({ appDir, packageArguments, logger, dependencies })=>{
146
+ // The checks that need no license come first, so a mistake there writes nothing, not even the
147
+ // license.txt a pasted license is saved to.
148
+ const requestedPackages = packageArguments.map(parsePackageArgument);
149
+ if (requestedPackages.length === 0 && !dependencies.isInteractive) {
150
+ throw new errors.EnterpriseInstallError('Pass package names, or run the command in an interactive terminal.');
151
+ }
152
+ const packageManager$1 = await packageManager.detectPackageManager(appDir);
153
+ const { license: license$1, source: licenseSource } = await license.resolveLicense({
154
+ appDir,
155
+ isInteractive: dependencies.isInteractive,
156
+ logger,
157
+ env: dependencies.env,
158
+ now: dependencies.now,
159
+ prompt: dependencies.promptForLicense
160
+ });
161
+ const registryAccess$1 = await registryAccess.prepareRegistryAccess({
162
+ appDir,
163
+ packageManager: packageManager$1,
164
+ license: license$1,
165
+ licenseSource,
166
+ logger,
167
+ env: dependencies.env,
168
+ homeDir: dependencies.homeDir
169
+ });
170
+ const strapiVersion = await versions.readInstalledVersion(appDir, constants.STRAPI_PACKAGE_NAME);
171
+ warnWhenCompatibilityIsUnknown(strapiVersion, logger);
172
+ const context = {
173
+ appDir,
174
+ license: license$1,
175
+ strapiVersion,
176
+ logger,
177
+ dependencies
178
+ };
179
+ const installSpecs = requestedPackages.length > 0 ? await resolveNamedPackages(requestedPackages, context) : await selectPlugins(context);
180
+ if (installSpecs.length === 0) {
181
+ logger.info('Nothing to install.');
182
+ return;
183
+ }
184
+ await registryAccess$1.apply();
185
+ const { command, args } = installPackages.buildInstallCommand(packageManager$1, installSpecs);
186
+ logger.info(`Running ${command} ${args.join(' ')}`);
187
+ const installedPackages = await Promise.all(installSpecs.map(async (installSpec)=>{
188
+ const { packageName } = parsePackageArgument(installSpec);
189
+ const previousVersion = await versions.readAppDependencyVersion(appDir, packageName);
190
+ return {
191
+ packageName,
192
+ replacesInstalledVersion: previousVersion !== undefined
193
+ };
194
+ }));
195
+ await dependencies.installPackages({
196
+ appDir,
197
+ packageManager: packageManager$1,
198
+ installSpecs
199
+ });
200
+ await setupLinks.printSetupLinks({
201
+ appDir,
202
+ installedPackages,
203
+ logger
204
+ });
205
+ };
206
+ /**
207
+ * The exit code for an error, after reporting it in one line. The package manager prints its own
208
+ * output when an install fails, so only its exit code is kept then.
209
+ */ const reportInstallError = (error, logger)=>{
210
+ if (error instanceof errors.PackageManagerError) {
211
+ return error.exitCode;
212
+ }
213
+ if (error instanceof errors.PromptCancelledError) {
214
+ return 130;
215
+ }
216
+ if (error instanceof errors.EnterpriseInstallError) {
217
+ logger.error(error.message);
218
+ return 1;
219
+ }
220
+ const message = error instanceof Error ? error.message : String(error);
221
+ logger.error(`strapi enterprise install failed: ${message}`);
222
+ return 1;
223
+ };
224
+ const action = async (packageArguments, { logger })=>{
225
+ const appDir = process.cwd();
226
+ try {
227
+ // Makes STRAPI_LICENSE from the app's `.env` available, as `strapi build` does.
228
+ await env.loadEnv(appDir);
229
+ await runInstall({
230
+ appDir,
231
+ packageArguments,
232
+ logger,
233
+ dependencies: {
234
+ isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),
235
+ env: process.env,
236
+ homeDir: os__default.default.homedir(),
237
+ now: new Date(),
238
+ fetchImplementation: fetch,
239
+ promptForLicense: license.promptForLicense,
240
+ promptForPlugins: selection.promptForPlugins,
241
+ installPackages: installPackages.installPackages
242
+ }
243
+ });
244
+ } catch (error) {
245
+ process.exit(reportInstallError(error, logger));
246
+ }
247
+ };
248
+
249
+ exports.action = action;
250
+ exports.parsePackageArgument = parsePackageArgument;
251
+ exports.reportInstallError = reportInstallError;
252
+ exports.runInstall = runInstall;
253
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sources":["../../../../../../src/cli/commands/enterprise/install/action.ts"],"sourcesContent":["import os from 'node:os';\n\nimport { loadEnv } from '../../../../node/core/env';\nimport type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_SCOPE, STRAPI_PACKAGE_NAME } from './constants';\nimport { discoverEnterprisePlugins } from './discovery';\nimport { EnterpriseInstallError, PackageManagerError, PromptCancelledError } from './errors';\nimport { buildInstallCommand, installPackages } from './install-packages';\nimport { promptForLicense, resolveLicense } from './license';\nimport { detectPackageManager } from './package-manager';\nimport { resolvePluginStatus } from './plugin-status';\nimport { prepareRegistryAccess } from './registry-access';\nimport { fetchPackument } from './registry';\nimport { buildPluginRow, isSelectable, orderVisibleRows, promptForPlugins } from './selection';\nimport { printSetupLinks } from './setup-links';\nimport {\n canCheckStrapiCompatibility,\n findUnsupportedStrapiRange,\n isPrerelease,\n readAppDependencyVersion,\n readInstalledVersion,\n resolveRequestedVersion,\n} from './versions';\n\ninterface InstallDependencies {\n isInteractive: boolean;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n now: Date;\n fetchImplementation: typeof fetch;\n promptForLicense: typeof promptForLicense;\n promptForPlugins: typeof promptForPlugins;\n installPackages: typeof installPackages;\n}\n\nconst describeNoStableRelease = (packageName: string) =>\n `${packageName} has no stable release yet. To install a prerelease, name its version: ${packageName}@<version>.`;\n\nconst describeStrapiMismatch = (\n packageName: string,\n requiredStrapiRange: string,\n strapiVersion: string | undefined\n) =>\n `${packageName} requires Strapi ${requiredStrapiRange} and this app uses ${strapiVersion}. Upgrade Strapi first.`;\n\ninterface InstallContext {\n appDir: string;\n license: string;\n strapiVersion?: string;\n logger: Logger;\n dependencies: InstallDependencies;\n}\n\nconst ENTERPRISE_PACKAGE_NAME = new RegExp(`^${ENTERPRISE_SCOPE}/[a-z0-9-][a-z0-9._-]*$`);\nconst MAX_PACKAGE_NAME_LENGTH = 214;\n\nconst isValidPackageName = (packageName: string) =>\n packageName.length <= MAX_PACKAGE_NAME_LENGTH && ENTERPRISE_PACKAGE_NAME.test(packageName);\n\ninterface RequestedPackage {\n packageName: string;\n /** A version or a tag, when the argument names one. */\n requestedVersion?: string;\n}\n\nexport const parsePackageArgument = (packageArgument: string): RequestedPackage => {\n const scopedArgument = packageArgument.startsWith('@')\n ? packageArgument\n : `${ENTERPRISE_SCOPE}/${packageArgument}`;\n const versionSeparatorIndex = scopedArgument.indexOf('@', 1);\n const packageName =\n versionSeparatorIndex === -1 ? scopedArgument : scopedArgument.slice(0, versionSeparatorIndex);\n const requestedVersion =\n versionSeparatorIndex === -1 ? undefined : scopedArgument.slice(versionSeparatorIndex + 1);\n\n if (!packageName.startsWith(`${ENTERPRISE_SCOPE}/`)) {\n throw new EnterpriseInstallError(\n `${packageArgument} is not an Enterprise package. Enterprise packages start with ${ENTERPRISE_SCOPE}/.`\n );\n }\n\n if (!isValidPackageName(packageName)) {\n throw new EnterpriseInstallError(`${packageArgument} is not a valid package name.`);\n }\n\n return { packageName, requestedVersion: requestedVersion || undefined };\n};\n\nconst resolveNamedPackages = async (\n requestedPackages: RequestedPackage[],\n { appDir, license, strapiVersion, logger, dependencies }: InstallContext\n): Promise<string[]> => {\n const installSpecs: string[] = [];\n\n for (const { packageName, requestedVersion } of requestedPackages) {\n const lookup = await fetchPackument({\n packageName,\n license,\n fetchImplementation: dependencies.fetchImplementation,\n });\n const installedVersion = await readAppDependencyVersion(appDir, packageName);\n\n if (requestedVersion && lookup.status === 'available') {\n const resolvedVersion = resolveRequestedVersion(\n lookup.packument,\n requestedVersion,\n strapiVersion\n );\n\n if (!resolvedVersion) {\n throw new EnterpriseInstallError(\n `${packageName} has no version or tag ${requestedVersion}.`\n );\n }\n\n if (resolvedVersion === installedVersion) {\n logger.info(`${packageName} ${resolvedVersion} is already installed.`);\n continue;\n }\n\n const unsupportedStrapiRange = findUnsupportedStrapiRange(\n lookup.packument,\n resolvedVersion,\n strapiVersion\n );\n\n if (unsupportedStrapiRange) {\n logger.warn(\n `${packageName} ${resolvedVersion} requires Strapi ${unsupportedStrapiRange} and this app uses ${strapiVersion}. Strapi may not start until you upgrade it.`\n );\n }\n\n installSpecs.push(`${packageName}@${resolvedVersion}`);\n continue;\n }\n\n const status = resolvePluginStatus({ lookup, installedVersion, strapiVersion });\n\n switch (status.state) {\n case 'not-licensed':\n throw new EnterpriseInstallError(\n `Your license does not include ${packageName}, or it does not exist. Run strapi enterprise install without a name to see the plugins you can install.`\n );\n case 'not-found':\n throw new EnterpriseInstallError(\n `No Enterprise package named ${packageName}. Run strapi enterprise install without a name to see the plugins you can install.`\n );\n case 'no-stable-release':\n throw new EnterpriseInstallError(describeNoStableRelease(packageName));\n case 'no-compatible-version':\n throw new EnterpriseInstallError(\n describeStrapiMismatch(packageName, status.requiredStrapiRange, strapiVersion)\n );\n default:\n break;\n }\n\n if (status.newerVersionNote) {\n logger.info(`${packageName}: ${status.newerVersionNote}`);\n }\n\n if (status.state === 'installed') {\n logger.info(`${packageName} ${installedVersion} is already installed and up to date.`);\n continue;\n }\n\n if (installedVersion && isPrerelease(installedVersion)) {\n logger.info(\n `${packageName}: replacing the installed prerelease ${installedVersion} with the stable release ${status.targetVersion}.`\n );\n }\n\n if (status.state === 'upgrade' && status.isMajorUpgrade) {\n logger.warn(\n `${packageName}: upgrading from ${installedVersion} to ${status.targetVersion}, a major upgrade that may include breaking changes.`\n );\n }\n\n installSpecs.push(`${packageName}@${status.targetVersion}`);\n }\n\n return installSpecs;\n};\n\nconst selectPlugins = async ({\n appDir,\n license,\n strapiVersion,\n logger,\n dependencies,\n}: InstallContext): Promise<string[]> => {\n const discoveredPlugins = await discoverEnterprisePlugins({\n appDir,\n license,\n logger,\n fetchImplementation: dependencies.fetchImplementation,\n });\n\n const rows = discoveredPlugins.map(({ entry, lookup, installedVersion }) =>\n buildPluginRow({ entry, lookup, installedVersion, strapiVersion })\n );\n const isAnyPluginLicensed = discoveredPlugins.some(({ lookup }) => lookup.status === 'available');\n\n rows\n .filter((row) => row.state === 'not-licensed')\n .forEach((row) =>\n logger.warn(`${row.entry.packageName} is installed but is not included in your license.`)\n );\n\n if (!isAnyPluginLicensed && !rows.some((row) => row.state === 'not-licensed')) {\n throw new EnterpriseInstallError('Your license does not include any Enterprise plugins.');\n }\n\n if (!rows.some(isSelectable)) {\n const visibleRows = orderVisibleRows(rows);\n\n // Says why each plugin cannot be installed, rather than calling them all up to date.\n visibleRows.forEach((row) => {\n const { packageName } = row.entry;\n\n if (row.state === 'installed' && row.newerVersionNote) {\n logger.info(`${packageName}: ${row.newerVersionNote}`);\n } else if (row.state === 'no-stable-release') {\n logger.info(describeNoStableRelease(packageName));\n } else if (row.state === 'no-compatible-version') {\n logger.info(describeStrapiMismatch(packageName, row.requiredStrapiRange, strapiVersion));\n }\n });\n\n if (visibleRows.every((row) => row.state === 'installed' || row.state === 'not-licensed')) {\n logger.info('The Enterprise plugins in your license are installed and up to date.');\n }\n\n return [];\n }\n\n return dependencies.promptForPlugins(rows);\n};\n\nconst warnWhenCompatibilityIsUnknown = (strapiVersion: string | undefined, logger: Logger) => {\n if (strapiVersion === undefined) {\n logger.warn(\n `Could not find ${STRAPI_PACKAGE_NAME} in node_modules, so plugin compatibility is not checked. Install the app's dependencies first.`\n );\n } else if (!canCheckStrapiCompatibility(strapiVersion)) {\n logger.warn(\n `This app uses Strapi ${strapiVersion}, a prerelease, so plugin compatibility is not checked.`\n );\n }\n};\n\nexport const runInstall = async ({\n appDir,\n packageArguments,\n logger,\n dependencies,\n}: {\n appDir: string;\n packageArguments: string[];\n logger: Logger;\n dependencies: InstallDependencies;\n}): Promise<void> => {\n // The checks that need no license come first, so a mistake there writes nothing, not even the\n // license.txt a pasted license is saved to.\n const requestedPackages = packageArguments.map(parsePackageArgument);\n\n if (requestedPackages.length === 0 && !dependencies.isInteractive) {\n throw new EnterpriseInstallError(\n 'Pass package names, or run the command in an interactive terminal.'\n );\n }\n\n const packageManager = await detectPackageManager(appDir);\n\n const { license, source: licenseSource } = await resolveLicense({\n appDir,\n isInteractive: dependencies.isInteractive,\n logger,\n env: dependencies.env,\n now: dependencies.now,\n prompt: dependencies.promptForLicense,\n });\n\n const registryAccess = await prepareRegistryAccess({\n appDir,\n packageManager,\n license,\n licenseSource,\n logger,\n env: dependencies.env,\n homeDir: dependencies.homeDir,\n });\n\n const strapiVersion = await readInstalledVersion(appDir, STRAPI_PACKAGE_NAME);\n warnWhenCompatibilityIsUnknown(strapiVersion, logger);\n\n const context: InstallContext = { appDir, license, strapiVersion, logger, dependencies };\n const installSpecs =\n requestedPackages.length > 0\n ? await resolveNamedPackages(requestedPackages, context)\n : await selectPlugins(context);\n\n if (installSpecs.length === 0) {\n logger.info('Nothing to install.');\n return;\n }\n\n await registryAccess.apply();\n\n const { command, args } = buildInstallCommand(packageManager, installSpecs);\n logger.info(`Running ${command} ${args.join(' ')}`);\n\n const installedPackages = await Promise.all(\n installSpecs.map(async (installSpec) => {\n const { packageName } = parsePackageArgument(installSpec);\n const previousVersion = await readAppDependencyVersion(appDir, packageName);\n\n return { packageName, replacesInstalledVersion: previousVersion !== undefined };\n })\n );\n\n await dependencies.installPackages({ appDir, packageManager, installSpecs });\n\n await printSetupLinks({ appDir, installedPackages, logger });\n};\n\n/**\n * The exit code for an error, after reporting it in one line. The package manager prints its own\n * output when an install fails, so only its exit code is kept then.\n */\nexport const reportInstallError = (error: unknown, logger: Logger): number => {\n if (error instanceof PackageManagerError) {\n return error.exitCode;\n }\n\n if (error instanceof PromptCancelledError) {\n return 130;\n }\n\n if (error instanceof EnterpriseInstallError) {\n logger.error(error.message);\n return 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`strapi enterprise install failed: ${message}`);\n return 1;\n};\n\nexport const action = async (\n packageArguments: string[],\n { logger }: { logger: Logger }\n): Promise<void> => {\n const appDir = process.cwd();\n\n try {\n // Makes STRAPI_LICENSE from the app's `.env` available, as `strapi build` does.\n await loadEnv(appDir);\n\n await runInstall({\n appDir,\n packageArguments,\n logger,\n dependencies: {\n isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n env: process.env,\n homeDir: os.homedir(),\n now: new Date(),\n fetchImplementation: fetch,\n promptForLicense,\n promptForPlugins,\n installPackages,\n },\n });\n } catch (error) {\n process.exit(reportInstallError(error, logger));\n }\n};\n"],"names":["describeNoStableRelease","packageName","describeStrapiMismatch","requiredStrapiRange","strapiVersion","ENTERPRISE_PACKAGE_NAME","RegExp","ENTERPRISE_SCOPE","MAX_PACKAGE_NAME_LENGTH","isValidPackageName","length","test","parsePackageArgument","packageArgument","scopedArgument","startsWith","versionSeparatorIndex","indexOf","slice","requestedVersion","undefined","EnterpriseInstallError","resolveNamedPackages","requestedPackages","appDir","license","logger","dependencies","installSpecs","lookup","fetchPackument","fetchImplementation","installedVersion","readAppDependencyVersion","status","resolvedVersion","resolveRequestedVersion","packument","info","unsupportedStrapiRange","findUnsupportedStrapiRange","warn","push","resolvePluginStatus","state","newerVersionNote","isPrerelease","targetVersion","isMajorUpgrade","selectPlugins","discoveredPlugins","discoverEnterprisePlugins","rows","map","entry","buildPluginRow","isAnyPluginLicensed","some","filter","row","forEach","isSelectable","visibleRows","orderVisibleRows","every","promptForPlugins","warnWhenCompatibilityIsUnknown","STRAPI_PACKAGE_NAME","canCheckStrapiCompatibility","runInstall","packageArguments","isInteractive","packageManager","detectPackageManager","source","licenseSource","resolveLicense","env","now","prompt","promptForLicense","registryAccess","prepareRegistryAccess","homeDir","readInstalledVersion","context","apply","command","args","buildInstallCommand","join","installedPackages","Promise","all","installSpec","previousVersion","replacesInstalledVersion","installPackages","printSetupLinks","reportInstallError","error","PackageManagerError","exitCode","PromptCancelledError","message","Error","String","action","process","cwd","loadEnv","Boolean","stdin","isTTY","stdout","os","homedir","Date","fetch","exit"],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ import os from 'node:os';
2
+ import { loadEnv } from '../../../../node/core/env.mjs';
3
+ import { ENTERPRISE_SCOPE, STRAPI_PACKAGE_NAME } from './constants.mjs';
4
+ import { discoverEnterprisePlugins } from './discovery.mjs';
5
+ import { EnterpriseInstallError, PackageManagerError, PromptCancelledError } from './errors.mjs';
6
+ import { installPackages, buildInstallCommand } from './install-packages.mjs';
7
+ import { promptForLicense, resolveLicense } from './license.mjs';
8
+ import { detectPackageManager } from './package-manager.mjs';
9
+ import { resolvePluginStatus } from './plugin-status.mjs';
10
+ import { prepareRegistryAccess } from './registry-access.mjs';
11
+ import { fetchPackument } from './registry.mjs';
12
+ import { promptForPlugins, buildPluginRow, isSelectable, orderVisibleRows } from './selection.mjs';
13
+ import { printSetupLinks } from './setup-links.mjs';
14
+ import { readInstalledVersion, readAppDependencyVersion, canCheckStrapiCompatibility, resolveRequestedVersion, findUnsupportedStrapiRange, isPrerelease } from './versions.mjs';
15
+
16
+ const describeNoStableRelease = (packageName)=>`${packageName} has no stable release yet. To install a prerelease, name its version: ${packageName}@<version>.`;
17
+ const describeStrapiMismatch = (packageName, requiredStrapiRange, strapiVersion)=>`${packageName} requires Strapi ${requiredStrapiRange} and this app uses ${strapiVersion}. Upgrade Strapi first.`;
18
+ const ENTERPRISE_PACKAGE_NAME = new RegExp(`^${ENTERPRISE_SCOPE}/[a-z0-9-][a-z0-9._-]*$`);
19
+ const MAX_PACKAGE_NAME_LENGTH = 214;
20
+ const isValidPackageName = (packageName)=>packageName.length <= MAX_PACKAGE_NAME_LENGTH && ENTERPRISE_PACKAGE_NAME.test(packageName);
21
+ const parsePackageArgument = (packageArgument)=>{
22
+ const scopedArgument = packageArgument.startsWith('@') ? packageArgument : `${ENTERPRISE_SCOPE}/${packageArgument}`;
23
+ const versionSeparatorIndex = scopedArgument.indexOf('@', 1);
24
+ const packageName = versionSeparatorIndex === -1 ? scopedArgument : scopedArgument.slice(0, versionSeparatorIndex);
25
+ const requestedVersion = versionSeparatorIndex === -1 ? undefined : scopedArgument.slice(versionSeparatorIndex + 1);
26
+ if (!packageName.startsWith(`${ENTERPRISE_SCOPE}/`)) {
27
+ throw new EnterpriseInstallError(`${packageArgument} is not an Enterprise package. Enterprise packages start with ${ENTERPRISE_SCOPE}/.`);
28
+ }
29
+ if (!isValidPackageName(packageName)) {
30
+ throw new EnterpriseInstallError(`${packageArgument} is not a valid package name.`);
31
+ }
32
+ return {
33
+ packageName,
34
+ requestedVersion: requestedVersion || undefined
35
+ };
36
+ };
37
+ const resolveNamedPackages = async (requestedPackages, { appDir, license, strapiVersion, logger, dependencies })=>{
38
+ const installSpecs = [];
39
+ for (const { packageName, requestedVersion } of requestedPackages){
40
+ const lookup = await fetchPackument({
41
+ packageName,
42
+ license,
43
+ fetchImplementation: dependencies.fetchImplementation
44
+ });
45
+ const installedVersion = await readAppDependencyVersion(appDir, packageName);
46
+ if (requestedVersion && lookup.status === 'available') {
47
+ const resolvedVersion = resolveRequestedVersion(lookup.packument, requestedVersion, strapiVersion);
48
+ if (!resolvedVersion) {
49
+ throw new EnterpriseInstallError(`${packageName} has no version or tag ${requestedVersion}.`);
50
+ }
51
+ if (resolvedVersion === installedVersion) {
52
+ logger.info(`${packageName} ${resolvedVersion} is already installed.`);
53
+ continue;
54
+ }
55
+ const unsupportedStrapiRange = findUnsupportedStrapiRange(lookup.packument, resolvedVersion, strapiVersion);
56
+ if (unsupportedStrapiRange) {
57
+ logger.warn(`${packageName} ${resolvedVersion} requires Strapi ${unsupportedStrapiRange} and this app uses ${strapiVersion}. Strapi may not start until you upgrade it.`);
58
+ }
59
+ installSpecs.push(`${packageName}@${resolvedVersion}`);
60
+ continue;
61
+ }
62
+ const status = resolvePluginStatus({
63
+ lookup,
64
+ installedVersion,
65
+ strapiVersion
66
+ });
67
+ switch(status.state){
68
+ case 'not-licensed':
69
+ throw new EnterpriseInstallError(`Your license does not include ${packageName}, or it does not exist. Run strapi enterprise install without a name to see the plugins you can install.`);
70
+ case 'not-found':
71
+ throw new EnterpriseInstallError(`No Enterprise package named ${packageName}. Run strapi enterprise install without a name to see the plugins you can install.`);
72
+ case 'no-stable-release':
73
+ throw new EnterpriseInstallError(describeNoStableRelease(packageName));
74
+ case 'no-compatible-version':
75
+ throw new EnterpriseInstallError(describeStrapiMismatch(packageName, status.requiredStrapiRange, strapiVersion));
76
+ }
77
+ if (status.newerVersionNote) {
78
+ logger.info(`${packageName}: ${status.newerVersionNote}`);
79
+ }
80
+ if (status.state === 'installed') {
81
+ logger.info(`${packageName} ${installedVersion} is already installed and up to date.`);
82
+ continue;
83
+ }
84
+ if (installedVersion && isPrerelease(installedVersion)) {
85
+ logger.info(`${packageName}: replacing the installed prerelease ${installedVersion} with the stable release ${status.targetVersion}.`);
86
+ }
87
+ if (status.state === 'upgrade' && status.isMajorUpgrade) {
88
+ logger.warn(`${packageName}: upgrading from ${installedVersion} to ${status.targetVersion}, a major upgrade that may include breaking changes.`);
89
+ }
90
+ installSpecs.push(`${packageName}@${status.targetVersion}`);
91
+ }
92
+ return installSpecs;
93
+ };
94
+ const selectPlugins = async ({ appDir, license, strapiVersion, logger, dependencies })=>{
95
+ const discoveredPlugins = await discoverEnterprisePlugins({
96
+ appDir,
97
+ license,
98
+ logger,
99
+ fetchImplementation: dependencies.fetchImplementation
100
+ });
101
+ const rows = discoveredPlugins.map(({ entry, lookup, installedVersion })=>buildPluginRow({
102
+ entry,
103
+ lookup,
104
+ installedVersion,
105
+ strapiVersion
106
+ }));
107
+ const isAnyPluginLicensed = discoveredPlugins.some(({ lookup })=>lookup.status === 'available');
108
+ rows.filter((row)=>row.state === 'not-licensed').forEach((row)=>logger.warn(`${row.entry.packageName} is installed but is not included in your license.`));
109
+ if (!isAnyPluginLicensed && !rows.some((row)=>row.state === 'not-licensed')) {
110
+ throw new EnterpriseInstallError('Your license does not include any Enterprise plugins.');
111
+ }
112
+ if (!rows.some(isSelectable)) {
113
+ const visibleRows = orderVisibleRows(rows);
114
+ // Says why each plugin cannot be installed, rather than calling them all up to date.
115
+ visibleRows.forEach((row)=>{
116
+ const { packageName } = row.entry;
117
+ if (row.state === 'installed' && row.newerVersionNote) {
118
+ logger.info(`${packageName}: ${row.newerVersionNote}`);
119
+ } else if (row.state === 'no-stable-release') {
120
+ logger.info(describeNoStableRelease(packageName));
121
+ } else if (row.state === 'no-compatible-version') {
122
+ logger.info(describeStrapiMismatch(packageName, row.requiredStrapiRange, strapiVersion));
123
+ }
124
+ });
125
+ if (visibleRows.every((row)=>row.state === 'installed' || row.state === 'not-licensed')) {
126
+ logger.info('The Enterprise plugins in your license are installed and up to date.');
127
+ }
128
+ return [];
129
+ }
130
+ return dependencies.promptForPlugins(rows);
131
+ };
132
+ const warnWhenCompatibilityIsUnknown = (strapiVersion, logger)=>{
133
+ if (strapiVersion === undefined) {
134
+ logger.warn(`Could not find ${STRAPI_PACKAGE_NAME} in node_modules, so plugin compatibility is not checked. Install the app's dependencies first.`);
135
+ } else if (!canCheckStrapiCompatibility(strapiVersion)) {
136
+ logger.warn(`This app uses Strapi ${strapiVersion}, a prerelease, so plugin compatibility is not checked.`);
137
+ }
138
+ };
139
+ const runInstall = async ({ appDir, packageArguments, logger, dependencies })=>{
140
+ // The checks that need no license come first, so a mistake there writes nothing, not even the
141
+ // license.txt a pasted license is saved to.
142
+ const requestedPackages = packageArguments.map(parsePackageArgument);
143
+ if (requestedPackages.length === 0 && !dependencies.isInteractive) {
144
+ throw new EnterpriseInstallError('Pass package names, or run the command in an interactive terminal.');
145
+ }
146
+ const packageManager = await detectPackageManager(appDir);
147
+ const { license, source: licenseSource } = await resolveLicense({
148
+ appDir,
149
+ isInteractive: dependencies.isInteractive,
150
+ logger,
151
+ env: dependencies.env,
152
+ now: dependencies.now,
153
+ prompt: dependencies.promptForLicense
154
+ });
155
+ const registryAccess = await prepareRegistryAccess({
156
+ appDir,
157
+ packageManager,
158
+ license,
159
+ licenseSource,
160
+ logger,
161
+ env: dependencies.env,
162
+ homeDir: dependencies.homeDir
163
+ });
164
+ const strapiVersion = await readInstalledVersion(appDir, STRAPI_PACKAGE_NAME);
165
+ warnWhenCompatibilityIsUnknown(strapiVersion, logger);
166
+ const context = {
167
+ appDir,
168
+ license,
169
+ strapiVersion,
170
+ logger,
171
+ dependencies
172
+ };
173
+ const installSpecs = requestedPackages.length > 0 ? await resolveNamedPackages(requestedPackages, context) : await selectPlugins(context);
174
+ if (installSpecs.length === 0) {
175
+ logger.info('Nothing to install.');
176
+ return;
177
+ }
178
+ await registryAccess.apply();
179
+ const { command, args } = buildInstallCommand(packageManager, installSpecs);
180
+ logger.info(`Running ${command} ${args.join(' ')}`);
181
+ const installedPackages = await Promise.all(installSpecs.map(async (installSpec)=>{
182
+ const { packageName } = parsePackageArgument(installSpec);
183
+ const previousVersion = await readAppDependencyVersion(appDir, packageName);
184
+ return {
185
+ packageName,
186
+ replacesInstalledVersion: previousVersion !== undefined
187
+ };
188
+ }));
189
+ await dependencies.installPackages({
190
+ appDir,
191
+ packageManager,
192
+ installSpecs
193
+ });
194
+ await printSetupLinks({
195
+ appDir,
196
+ installedPackages,
197
+ logger
198
+ });
199
+ };
200
+ /**
201
+ * The exit code for an error, after reporting it in one line. The package manager prints its own
202
+ * output when an install fails, so only its exit code is kept then.
203
+ */ const reportInstallError = (error, logger)=>{
204
+ if (error instanceof PackageManagerError) {
205
+ return error.exitCode;
206
+ }
207
+ if (error instanceof PromptCancelledError) {
208
+ return 130;
209
+ }
210
+ if (error instanceof EnterpriseInstallError) {
211
+ logger.error(error.message);
212
+ return 1;
213
+ }
214
+ const message = error instanceof Error ? error.message : String(error);
215
+ logger.error(`strapi enterprise install failed: ${message}`);
216
+ return 1;
217
+ };
218
+ const action = async (packageArguments, { logger })=>{
219
+ const appDir = process.cwd();
220
+ try {
221
+ // Makes STRAPI_LICENSE from the app's `.env` available, as `strapi build` does.
222
+ await loadEnv(appDir);
223
+ await runInstall({
224
+ appDir,
225
+ packageArguments,
226
+ logger,
227
+ dependencies: {
228
+ isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),
229
+ env: process.env,
230
+ homeDir: os.homedir(),
231
+ now: new Date(),
232
+ fetchImplementation: fetch,
233
+ promptForLicense,
234
+ promptForPlugins,
235
+ installPackages
236
+ }
237
+ });
238
+ } catch (error) {
239
+ process.exit(reportInstallError(error, logger));
240
+ }
241
+ };
242
+
243
+ export { action, parsePackageArgument, reportInstallError, runInstall };
244
+ //# sourceMappingURL=action.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/action.ts"],"sourcesContent":["import os from 'node:os';\n\nimport { loadEnv } from '../../../../node/core/env';\nimport type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_SCOPE, STRAPI_PACKAGE_NAME } from './constants';\nimport { discoverEnterprisePlugins } from './discovery';\nimport { EnterpriseInstallError, PackageManagerError, PromptCancelledError } from './errors';\nimport { buildInstallCommand, installPackages } from './install-packages';\nimport { promptForLicense, resolveLicense } from './license';\nimport { detectPackageManager } from './package-manager';\nimport { resolvePluginStatus } from './plugin-status';\nimport { prepareRegistryAccess } from './registry-access';\nimport { fetchPackument } from './registry';\nimport { buildPluginRow, isSelectable, orderVisibleRows, promptForPlugins } from './selection';\nimport { printSetupLinks } from './setup-links';\nimport {\n canCheckStrapiCompatibility,\n findUnsupportedStrapiRange,\n isPrerelease,\n readAppDependencyVersion,\n readInstalledVersion,\n resolveRequestedVersion,\n} from './versions';\n\ninterface InstallDependencies {\n isInteractive: boolean;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n now: Date;\n fetchImplementation: typeof fetch;\n promptForLicense: typeof promptForLicense;\n promptForPlugins: typeof promptForPlugins;\n installPackages: typeof installPackages;\n}\n\nconst describeNoStableRelease = (packageName: string) =>\n `${packageName} has no stable release yet. To install a prerelease, name its version: ${packageName}@<version>.`;\n\nconst describeStrapiMismatch = (\n packageName: string,\n requiredStrapiRange: string,\n strapiVersion: string | undefined\n) =>\n `${packageName} requires Strapi ${requiredStrapiRange} and this app uses ${strapiVersion}. Upgrade Strapi first.`;\n\ninterface InstallContext {\n appDir: string;\n license: string;\n strapiVersion?: string;\n logger: Logger;\n dependencies: InstallDependencies;\n}\n\nconst ENTERPRISE_PACKAGE_NAME = new RegExp(`^${ENTERPRISE_SCOPE}/[a-z0-9-][a-z0-9._-]*$`);\nconst MAX_PACKAGE_NAME_LENGTH = 214;\n\nconst isValidPackageName = (packageName: string) =>\n packageName.length <= MAX_PACKAGE_NAME_LENGTH && ENTERPRISE_PACKAGE_NAME.test(packageName);\n\ninterface RequestedPackage {\n packageName: string;\n /** A version or a tag, when the argument names one. */\n requestedVersion?: string;\n}\n\nexport const parsePackageArgument = (packageArgument: string): RequestedPackage => {\n const scopedArgument = packageArgument.startsWith('@')\n ? packageArgument\n : `${ENTERPRISE_SCOPE}/${packageArgument}`;\n const versionSeparatorIndex = scopedArgument.indexOf('@', 1);\n const packageName =\n versionSeparatorIndex === -1 ? scopedArgument : scopedArgument.slice(0, versionSeparatorIndex);\n const requestedVersion =\n versionSeparatorIndex === -1 ? undefined : scopedArgument.slice(versionSeparatorIndex + 1);\n\n if (!packageName.startsWith(`${ENTERPRISE_SCOPE}/`)) {\n throw new EnterpriseInstallError(\n `${packageArgument} is not an Enterprise package. Enterprise packages start with ${ENTERPRISE_SCOPE}/.`\n );\n }\n\n if (!isValidPackageName(packageName)) {\n throw new EnterpriseInstallError(`${packageArgument} is not a valid package name.`);\n }\n\n return { packageName, requestedVersion: requestedVersion || undefined };\n};\n\nconst resolveNamedPackages = async (\n requestedPackages: RequestedPackage[],\n { appDir, license, strapiVersion, logger, dependencies }: InstallContext\n): Promise<string[]> => {\n const installSpecs: string[] = [];\n\n for (const { packageName, requestedVersion } of requestedPackages) {\n const lookup = await fetchPackument({\n packageName,\n license,\n fetchImplementation: dependencies.fetchImplementation,\n });\n const installedVersion = await readAppDependencyVersion(appDir, packageName);\n\n if (requestedVersion && lookup.status === 'available') {\n const resolvedVersion = resolveRequestedVersion(\n lookup.packument,\n requestedVersion,\n strapiVersion\n );\n\n if (!resolvedVersion) {\n throw new EnterpriseInstallError(\n `${packageName} has no version or tag ${requestedVersion}.`\n );\n }\n\n if (resolvedVersion === installedVersion) {\n logger.info(`${packageName} ${resolvedVersion} is already installed.`);\n continue;\n }\n\n const unsupportedStrapiRange = findUnsupportedStrapiRange(\n lookup.packument,\n resolvedVersion,\n strapiVersion\n );\n\n if (unsupportedStrapiRange) {\n logger.warn(\n `${packageName} ${resolvedVersion} requires Strapi ${unsupportedStrapiRange} and this app uses ${strapiVersion}. Strapi may not start until you upgrade it.`\n );\n }\n\n installSpecs.push(`${packageName}@${resolvedVersion}`);\n continue;\n }\n\n const status = resolvePluginStatus({ lookup, installedVersion, strapiVersion });\n\n switch (status.state) {\n case 'not-licensed':\n throw new EnterpriseInstallError(\n `Your license does not include ${packageName}, or it does not exist. Run strapi enterprise install without a name to see the plugins you can install.`\n );\n case 'not-found':\n throw new EnterpriseInstallError(\n `No Enterprise package named ${packageName}. Run strapi enterprise install without a name to see the plugins you can install.`\n );\n case 'no-stable-release':\n throw new EnterpriseInstallError(describeNoStableRelease(packageName));\n case 'no-compatible-version':\n throw new EnterpriseInstallError(\n describeStrapiMismatch(packageName, status.requiredStrapiRange, strapiVersion)\n );\n default:\n break;\n }\n\n if (status.newerVersionNote) {\n logger.info(`${packageName}: ${status.newerVersionNote}`);\n }\n\n if (status.state === 'installed') {\n logger.info(`${packageName} ${installedVersion} is already installed and up to date.`);\n continue;\n }\n\n if (installedVersion && isPrerelease(installedVersion)) {\n logger.info(\n `${packageName}: replacing the installed prerelease ${installedVersion} with the stable release ${status.targetVersion}.`\n );\n }\n\n if (status.state === 'upgrade' && status.isMajorUpgrade) {\n logger.warn(\n `${packageName}: upgrading from ${installedVersion} to ${status.targetVersion}, a major upgrade that may include breaking changes.`\n );\n }\n\n installSpecs.push(`${packageName}@${status.targetVersion}`);\n }\n\n return installSpecs;\n};\n\nconst selectPlugins = async ({\n appDir,\n license,\n strapiVersion,\n logger,\n dependencies,\n}: InstallContext): Promise<string[]> => {\n const discoveredPlugins = await discoverEnterprisePlugins({\n appDir,\n license,\n logger,\n fetchImplementation: dependencies.fetchImplementation,\n });\n\n const rows = discoveredPlugins.map(({ entry, lookup, installedVersion }) =>\n buildPluginRow({ entry, lookup, installedVersion, strapiVersion })\n );\n const isAnyPluginLicensed = discoveredPlugins.some(({ lookup }) => lookup.status === 'available');\n\n rows\n .filter((row) => row.state === 'not-licensed')\n .forEach((row) =>\n logger.warn(`${row.entry.packageName} is installed but is not included in your license.`)\n );\n\n if (!isAnyPluginLicensed && !rows.some((row) => row.state === 'not-licensed')) {\n throw new EnterpriseInstallError('Your license does not include any Enterprise plugins.');\n }\n\n if (!rows.some(isSelectable)) {\n const visibleRows = orderVisibleRows(rows);\n\n // Says why each plugin cannot be installed, rather than calling them all up to date.\n visibleRows.forEach((row) => {\n const { packageName } = row.entry;\n\n if (row.state === 'installed' && row.newerVersionNote) {\n logger.info(`${packageName}: ${row.newerVersionNote}`);\n } else if (row.state === 'no-stable-release') {\n logger.info(describeNoStableRelease(packageName));\n } else if (row.state === 'no-compatible-version') {\n logger.info(describeStrapiMismatch(packageName, row.requiredStrapiRange, strapiVersion));\n }\n });\n\n if (visibleRows.every((row) => row.state === 'installed' || row.state === 'not-licensed')) {\n logger.info('The Enterprise plugins in your license are installed and up to date.');\n }\n\n return [];\n }\n\n return dependencies.promptForPlugins(rows);\n};\n\nconst warnWhenCompatibilityIsUnknown = (strapiVersion: string | undefined, logger: Logger) => {\n if (strapiVersion === undefined) {\n logger.warn(\n `Could not find ${STRAPI_PACKAGE_NAME} in node_modules, so plugin compatibility is not checked. Install the app's dependencies first.`\n );\n } else if (!canCheckStrapiCompatibility(strapiVersion)) {\n logger.warn(\n `This app uses Strapi ${strapiVersion}, a prerelease, so plugin compatibility is not checked.`\n );\n }\n};\n\nexport const runInstall = async ({\n appDir,\n packageArguments,\n logger,\n dependencies,\n}: {\n appDir: string;\n packageArguments: string[];\n logger: Logger;\n dependencies: InstallDependencies;\n}): Promise<void> => {\n // The checks that need no license come first, so a mistake there writes nothing, not even the\n // license.txt a pasted license is saved to.\n const requestedPackages = packageArguments.map(parsePackageArgument);\n\n if (requestedPackages.length === 0 && !dependencies.isInteractive) {\n throw new EnterpriseInstallError(\n 'Pass package names, or run the command in an interactive terminal.'\n );\n }\n\n const packageManager = await detectPackageManager(appDir);\n\n const { license, source: licenseSource } = await resolveLicense({\n appDir,\n isInteractive: dependencies.isInteractive,\n logger,\n env: dependencies.env,\n now: dependencies.now,\n prompt: dependencies.promptForLicense,\n });\n\n const registryAccess = await prepareRegistryAccess({\n appDir,\n packageManager,\n license,\n licenseSource,\n logger,\n env: dependencies.env,\n homeDir: dependencies.homeDir,\n });\n\n const strapiVersion = await readInstalledVersion(appDir, STRAPI_PACKAGE_NAME);\n warnWhenCompatibilityIsUnknown(strapiVersion, logger);\n\n const context: InstallContext = { appDir, license, strapiVersion, logger, dependencies };\n const installSpecs =\n requestedPackages.length > 0\n ? await resolveNamedPackages(requestedPackages, context)\n : await selectPlugins(context);\n\n if (installSpecs.length === 0) {\n logger.info('Nothing to install.');\n return;\n }\n\n await registryAccess.apply();\n\n const { command, args } = buildInstallCommand(packageManager, installSpecs);\n logger.info(`Running ${command} ${args.join(' ')}`);\n\n const installedPackages = await Promise.all(\n installSpecs.map(async (installSpec) => {\n const { packageName } = parsePackageArgument(installSpec);\n const previousVersion = await readAppDependencyVersion(appDir, packageName);\n\n return { packageName, replacesInstalledVersion: previousVersion !== undefined };\n })\n );\n\n await dependencies.installPackages({ appDir, packageManager, installSpecs });\n\n await printSetupLinks({ appDir, installedPackages, logger });\n};\n\n/**\n * The exit code for an error, after reporting it in one line. The package manager prints its own\n * output when an install fails, so only its exit code is kept then.\n */\nexport const reportInstallError = (error: unknown, logger: Logger): number => {\n if (error instanceof PackageManagerError) {\n return error.exitCode;\n }\n\n if (error instanceof PromptCancelledError) {\n return 130;\n }\n\n if (error instanceof EnterpriseInstallError) {\n logger.error(error.message);\n return 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`strapi enterprise install failed: ${message}`);\n return 1;\n};\n\nexport const action = async (\n packageArguments: string[],\n { logger }: { logger: Logger }\n): Promise<void> => {\n const appDir = process.cwd();\n\n try {\n // Makes STRAPI_LICENSE from the app's `.env` available, as `strapi build` does.\n await loadEnv(appDir);\n\n await runInstall({\n appDir,\n packageArguments,\n logger,\n dependencies: {\n isInteractive: Boolean(process.stdin.isTTY && process.stdout.isTTY),\n env: process.env,\n homeDir: os.homedir(),\n now: new Date(),\n fetchImplementation: fetch,\n promptForLicense,\n promptForPlugins,\n installPackages,\n },\n });\n } catch (error) {\n process.exit(reportInstallError(error, logger));\n }\n};\n"],"names":["describeNoStableRelease","packageName","describeStrapiMismatch","requiredStrapiRange","strapiVersion","ENTERPRISE_PACKAGE_NAME","RegExp","ENTERPRISE_SCOPE","MAX_PACKAGE_NAME_LENGTH","isValidPackageName","length","test","parsePackageArgument","packageArgument","scopedArgument","startsWith","versionSeparatorIndex","indexOf","slice","requestedVersion","undefined","EnterpriseInstallError","resolveNamedPackages","requestedPackages","appDir","license","logger","dependencies","installSpecs","lookup","fetchPackument","fetchImplementation","installedVersion","readAppDependencyVersion","status","resolvedVersion","resolveRequestedVersion","packument","info","unsupportedStrapiRange","findUnsupportedStrapiRange","warn","push","resolvePluginStatus","state","newerVersionNote","isPrerelease","targetVersion","isMajorUpgrade","selectPlugins","discoveredPlugins","discoverEnterprisePlugins","rows","map","entry","buildPluginRow","isAnyPluginLicensed","some","filter","row","forEach","isSelectable","visibleRows","orderVisibleRows","every","promptForPlugins","warnWhenCompatibilityIsUnknown","STRAPI_PACKAGE_NAME","canCheckStrapiCompatibility","runInstall","packageArguments","isInteractive","packageManager","detectPackageManager","source","licenseSource","resolveLicense","env","now","prompt","promptForLicense","registryAccess","prepareRegistryAccess","homeDir","readInstalledVersion","context","apply","command","args","buildInstallCommand","join","installedPackages","Promise","all","installSpec","previousVersion","replacesInstalledVersion","installPackages","printSetupLinks","reportInstallError","error","PackageManagerError","exitCode","PromptCancelledError","message","Error","String","action","process","cwd","loadEnv","Boolean","stdin","isTTY","stdout","os","homedir","Date","fetch","exit"],"mappings":"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"}