@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.
- package/admin-styles.css +5 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/content-types/rename-field.d.ts +13 -0
- package/dist/cli/commands/content-types/rename-field.d.ts.map +1 -0
- package/dist/cli/commands/develop.d.ts.map +1 -1
- package/dist/cli/commands/enterprise/index.d.ts +7 -0
- package/dist/cli/commands/enterprise/index.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/action.d.ts +36 -0
- package/dist/cli/commands/enterprise/install/action.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts +14 -0
- package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/constants.d.ts +7 -0
- package/dist/cli/commands/enterprise/install/constants.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/directories.d.ts +3 -0
- package/dist/cli/commands/enterprise/install/directories.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/discovery.d.ts +29 -0
- package/dist/cli/commands/enterprise/install/discovery.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/errors.d.ts +11 -0
- package/dist/cli/commands/enterprise/install/errors.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/install-packages.d.ts +11 -0
- package/dist/cli/commands/enterprise/install/install-packages.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/license.d.ts +27 -0
- package/dist/cli/commands/enterprise/install/license.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/package-manager.d.ts +17 -0
- package/dist/cli/commands/enterprise/install/package-manager.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/plugin-status.d.ts +44 -0
- package/dist/cli/commands/enterprise/install/plugin-status.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/registry-access.d.ts +55 -0
- package/dist/cli/commands/enterprise/install/registry-access.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/registry.d.ts +54 -0
- package/dist/cli/commands/enterprise/install/registry.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/selection.d.ts +62 -0
- package/dist/cli/commands/enterprise/install/selection.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/setup-links.d.ts +16 -0
- package/dist/cli/commands/enterprise/install/setup-links.d.ts.map +1 -0
- package/dist/cli/commands/enterprise/install/versions.d.ts +42 -0
- package/dist/cli/commands/enterprise/install/versions.d.ts.map +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/utils/commander.d.ts.map +1 -1
- package/dist/cli/utils/helpers.d.ts +1 -1
- package/dist/cli/utils/helpers.d.ts.map +1 -1
- package/dist/node/core/admin-vite-aliases.d.ts +9 -0
- package/dist/node/core/admin-vite-aliases.d.ts.map +1 -1
- package/dist/node/core/aliases.d.ts +4 -1
- package/dist/node/core/aliases.d.ts.map +1 -1
- package/dist/node/core/scan-roots.d.ts +20 -0
- package/dist/node/core/scan-roots.d.ts.map +1 -0
- package/dist/node/create-build-context.d.ts +10 -1
- package/dist/node/create-build-context.d.ts.map +1 -1
- package/dist/node/develop.d.ts.map +1 -1
- package/dist/node/staticFiles.d.ts +3 -1
- package/dist/node/staticFiles.d.ts.map +1 -1
- package/dist/node/vite/config.d.ts.map +1 -1
- package/dist/node/vite/plugins.d.ts +2 -1
- package/dist/node/vite/plugins.d.ts.map +1 -1
- package/dist/node/vite/plugins.test.d.ts +2 -0
- package/dist/node/vite/plugins.test.d.ts.map +1 -0
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/build.js +4 -2
- package/dist/src/cli/commands/build.js.map +1 -1
- package/dist/src/cli/commands/build.mjs +4 -2
- package/dist/src/cli/commands/build.mjs.map +1 -1
- package/dist/src/cli/commands/content-types/rename-field.js +63 -0
- package/dist/src/cli/commands/content-types/rename-field.js.map +1 -0
- package/dist/src/cli/commands/content-types/rename-field.mjs +54 -0
- package/dist/src/cli/commands/content-types/rename-field.mjs.map +1 -0
- package/dist/src/cli/commands/develop.js +4 -2
- package/dist/src/cli/commands/develop.js.map +1 -1
- package/dist/src/cli/commands/develop.mjs +4 -2
- package/dist/src/cli/commands/develop.mjs.map +1 -1
- package/dist/src/cli/commands/enterprise/index.js +17 -0
- package/dist/src/cli/commands/enterprise/index.js.map +1 -0
- package/dist/src/cli/commands/enterprise/index.mjs +15 -0
- package/dist/src/cli/commands/enterprise/index.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/action.js +253 -0
- package/dist/src/cli/commands/enterprise/install/action.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/action.mjs +244 -0
- package/dist/src/cli/commands/enterprise/install/action.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.js +117 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs +110 -0
- package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/constants.js +16 -0
- package/dist/src/cli/commands/enterprise/install/constants.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/constants.mjs +9 -0
- package/dist/src/cli/commands/enterprise/install/constants.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/directories.js +23 -0
- package/dist/src/cli/commands/enterprise/install/directories.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/directories.mjs +17 -0
- package/dist/src/cli/commands/enterprise/install/directories.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/discovery.js +109 -0
- package/dist/src/cli/commands/enterprise/install/discovery.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/discovery.mjs +104 -0
- package/dist/src/cli/commands/enterprise/install/discovery.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/errors.js +26 -0
- package/dist/src/cli/commands/enterprise/install/errors.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/errors.mjs +22 -0
- package/dist/src/cli/commands/enterprise/install/errors.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.js +39 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.mjs +32 -0
- package/dist/src/cli/commands/enterprise/install/install-packages.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/license.js +144 -0
- package/dist/src/cli/commands/enterprise/install/license.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/license.mjs +132 -0
- package/dist/src/cli/commands/enterprise/install/license.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.js +72 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.mjs +62 -0
- package/dist/src/cli/commands/enterprise/install/package-manager.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.js +47 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.mjs +45 -0
- package/dist/src/cli/commands/enterprise/install/plugin-status.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.js +293 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.mjs +277 -0
- package/dist/src/cli/commands/enterprise/install/registry-access.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry.js +98 -0
- package/dist/src/cli/commands/enterprise/install/registry.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/registry.mjs +95 -0
- package/dist/src/cli/commands/enterprise/install/registry.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/selection.js +148 -0
- package/dist/src/cli/commands/enterprise/install/selection.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/selection.mjs +141 -0
- package/dist/src/cli/commands/enterprise/install/selection.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.js +34 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.mjs +31 -0
- package/dist/src/cli/commands/enterprise/install/setup-links.mjs.map +1 -0
- package/dist/src/cli/commands/enterprise/install/versions.js +127 -0
- package/dist/src/cli/commands/enterprise/install/versions.js.map +1 -0
- package/dist/src/cli/commands/enterprise/install/versions.mjs +107 -0
- package/dist/src/cli/commands/enterprise/install/versions.mjs.map +1 -0
- package/dist/src/cli/commands/export/action.js +4 -4
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +2 -2
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js +2 -2
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +1 -1
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/index.js +4 -0
- package/dist/src/cli/commands/index.js.map +1 -1
- package/dist/src/cli/commands/index.mjs +24 -20
- package/dist/src/cli/commands/index.mjs.map +1 -1
- package/dist/src/cli/commands/routes/list.js +2 -2
- package/dist/src/cli/commands/routes/list.js.map +1 -1
- package/dist/src/cli/commands/routes/list.mjs +1 -1
- package/dist/src/cli/commands/routes/list.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/action.js +2 -2
- package/dist/src/cli/commands/transfer/action.js.map +1 -1
- package/dist/src/cli/commands/transfer/action.mjs +1 -1
- package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
- package/dist/src/cli/utils/commander.js +1 -2
- package/dist/src/cli/utils/commander.js.map +1 -1
- package/dist/src/cli/utils/commander.mjs +1 -2
- package/dist/src/cli/utils/commander.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js +2 -2
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs +2 -2
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/cli/utils/helpers.js +6 -6
- package/dist/src/cli/utils/helpers.js.map +1 -1
- package/dist/src/cli/utils/helpers.mjs +4 -4
- package/dist/src/cli/utils/helpers.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-aliases.js +51 -0
- package/dist/src/node/core/admin-vite-aliases.js.map +1 -1
- package/dist/src/node/core/admin-vite-aliases.mjs +46 -1
- package/dist/src/node/core/admin-vite-aliases.mjs.map +1 -1
- package/dist/src/node/core/aliases.js +6 -0
- package/dist/src/node/core/aliases.js.map +1 -1
- package/dist/src/node/core/aliases.mjs +6 -1
- package/dist/src/node/core/aliases.mjs.map +1 -1
- package/dist/src/node/core/scan-roots.js +87 -0
- package/dist/src/node/core/scan-roots.js.map +1 -0
- package/dist/src/node/core/scan-roots.mjs +79 -0
- package/dist/src/node/core/scan-roots.mjs.map +1 -0
- package/dist/src/node/create-build-context.js +40 -1
- package/dist/src/node/create-build-context.js.map +1 -1
- package/dist/src/node/create-build-context.mjs +40 -1
- package/dist/src/node/create-build-context.mjs.map +1 -1
- package/dist/src/node/develop.js +2 -1
- package/dist/src/node/develop.js.map +1 -1
- package/dist/src/node/develop.mjs +2 -1
- package/dist/src/node/develop.mjs.map +1 -1
- package/dist/src/node/staticFiles.js +43 -0
- package/dist/src/node/staticFiles.js.map +1 -1
- package/dist/src/node/staticFiles.mjs +42 -1
- package/dist/src/node/staticFiles.mjs.map +1 -1
- package/dist/src/node/vite/config.js +12 -2
- package/dist/src/node/vite/config.js.map +1 -1
- package/dist/src/node/vite/config.mjs +8 -2
- package/dist/src/node/vite/config.mjs.map +1 -1
- package/dist/src/node/vite/plugins.js +27 -1
- package/dist/src/node/vite/plugins.js.map +1 -1
- package/dist/src/node/vite/plugins.mjs +23 -1
- package/dist/src/node/vite/plugins.mjs.map +1 -1
- package/package.json +31 -26
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var checklistPrompt = require('./checklist-prompt.js');
|
|
4
|
+
var pluginStatus = require('./plugin-status.js');
|
|
5
|
+
var versions = require('./versions.js');
|
|
6
|
+
|
|
7
|
+
const buildPluginRow = ({ entry, lookup, installedVersion, strapiVersion })=>{
|
|
8
|
+
const status = pluginStatus.resolvePluginStatus({
|
|
9
|
+
lookup,
|
|
10
|
+
installedVersion,
|
|
11
|
+
strapiVersion
|
|
12
|
+
});
|
|
13
|
+
if (status.state === 'not-licensed' || status.state === 'not-found') {
|
|
14
|
+
return status.state === 'not-licensed' && installedVersion ? {
|
|
15
|
+
entry,
|
|
16
|
+
state: 'not-licensed',
|
|
17
|
+
installedVersion
|
|
18
|
+
} : {
|
|
19
|
+
entry,
|
|
20
|
+
state: 'hidden'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (status.state === 'install') {
|
|
24
|
+
return {
|
|
25
|
+
entry,
|
|
26
|
+
...status
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (!installedVersion) {
|
|
30
|
+
// Only an installed plugin can be an upgrade or up to date.
|
|
31
|
+
return status.state === 'no-compatible-version' ? {
|
|
32
|
+
entry,
|
|
33
|
+
state: 'no-compatible-version',
|
|
34
|
+
requiredStrapiRange: status.requiredStrapiRange
|
|
35
|
+
} : {
|
|
36
|
+
entry,
|
|
37
|
+
state: 'no-stable-release'
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
switch(status.state){
|
|
41
|
+
case 'upgrade':
|
|
42
|
+
return {
|
|
43
|
+
entry,
|
|
44
|
+
...status,
|
|
45
|
+
installedVersion
|
|
46
|
+
};
|
|
47
|
+
case 'no-compatible-version':
|
|
48
|
+
// No version for this app. An installed plugin stays listed as installed.
|
|
49
|
+
return {
|
|
50
|
+
entry,
|
|
51
|
+
state: 'installed',
|
|
52
|
+
installedVersion,
|
|
53
|
+
newerVersionNote: status.newerVersionNote
|
|
54
|
+
};
|
|
55
|
+
case 'no-stable-release':
|
|
56
|
+
return {
|
|
57
|
+
entry,
|
|
58
|
+
state: 'installed',
|
|
59
|
+
installedVersion
|
|
60
|
+
};
|
|
61
|
+
default:
|
|
62
|
+
return {
|
|
63
|
+
entry,
|
|
64
|
+
...status,
|
|
65
|
+
installedVersion
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const ROW_ORDER = [
|
|
70
|
+
'upgrade',
|
|
71
|
+
'install',
|
|
72
|
+
'installed',
|
|
73
|
+
'not-licensed',
|
|
74
|
+
'no-compatible-version',
|
|
75
|
+
'no-stable-release'
|
|
76
|
+
];
|
|
77
|
+
const isSelectable = (row)=>row.state === 'upgrade' || row.state === 'install';
|
|
78
|
+
const toInstallSpec = (row)=>`${row.entry.packageName}@${row.targetVersion}`;
|
|
79
|
+
const describeUpgrade = (row)=>{
|
|
80
|
+
if (versions.isPrerelease(row.installedVersion)) {
|
|
81
|
+
return '[stable release]';
|
|
82
|
+
}
|
|
83
|
+
return row.isMajorUpgrade ? '[major upgrade]' : '[upgrade]';
|
|
84
|
+
};
|
|
85
|
+
const toCheckboxChoice = (row)=>{
|
|
86
|
+
const { displayName, packageName, kind } = row.entry;
|
|
87
|
+
const kindTag = kind && kind !== 'plugin' ? ` [${kind}]` : '';
|
|
88
|
+
const label = `${displayName} (${packageName})${kindTag}`;
|
|
89
|
+
// The note is a sentence of its own, such as "1.3.0 is available but requires Strapi ^5.56.0."
|
|
90
|
+
const noteSuffix = (note)=>note ? ` ${note}` : '';
|
|
91
|
+
switch(row.state){
|
|
92
|
+
case 'upgrade':
|
|
93
|
+
{
|
|
94
|
+
const upgradeTag = describeUpgrade(row);
|
|
95
|
+
return {
|
|
96
|
+
name: `${label} ${row.installedVersion} → ${row.targetVersion} ${upgradeTag}${noteSuffix(row.newerVersionNote)}`,
|
|
97
|
+
value: toInstallSpec(row),
|
|
98
|
+
short: displayName,
|
|
99
|
+
checked: upgradeTag === '[upgrade]'
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
case 'install':
|
|
103
|
+
return {
|
|
104
|
+
name: `${label} ${row.targetVersion} ${row.entry.summary}${noteSuffix(row.newerVersionNote)}`,
|
|
105
|
+
value: toInstallSpec(row),
|
|
106
|
+
short: displayName,
|
|
107
|
+
checked: false
|
|
108
|
+
};
|
|
109
|
+
case 'installed':
|
|
110
|
+
return {
|
|
111
|
+
name: `${label} ${row.installedVersion}`,
|
|
112
|
+
disabled: row.newerVersionNote ? `installed, ${row.newerVersionNote}` : 'installed'
|
|
113
|
+
};
|
|
114
|
+
case 'not-licensed':
|
|
115
|
+
return {
|
|
116
|
+
name: `${label} ${row.installedVersion}`,
|
|
117
|
+
disabled: 'not in your license'
|
|
118
|
+
};
|
|
119
|
+
case 'no-compatible-version':
|
|
120
|
+
return {
|
|
121
|
+
name: label,
|
|
122
|
+
disabled: `requires Strapi ${row.requiredStrapiRange}`
|
|
123
|
+
};
|
|
124
|
+
case 'no-stable-release':
|
|
125
|
+
return {
|
|
126
|
+
name: label,
|
|
127
|
+
disabled: 'no stable release yet'
|
|
128
|
+
};
|
|
129
|
+
default:
|
|
130
|
+
return {
|
|
131
|
+
name: label,
|
|
132
|
+
disabled: 'unavailable'
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
/** Visible rows, with upgrades first. Unticking a row never uninstalls anything. */ const orderVisibleRows = (rows)=>rows.filter((row)=>row.state !== 'hidden').sort((left, right)=>ROW_ORDER.indexOf(left.state) - ROW_ORDER.indexOf(right.state));
|
|
137
|
+
const promptForPlugins = (rows)=>checklistPrompt.promptChecklist({
|
|
138
|
+
message: 'Which Enterprise plugins do you want to install or upgrade?',
|
|
139
|
+
choices: orderVisibleRows(rows).map(toCheckboxChoice)
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
exports.buildPluginRow = buildPluginRow;
|
|
143
|
+
exports.isSelectable = isSelectable;
|
|
144
|
+
exports.orderVisibleRows = orderVisibleRows;
|
|
145
|
+
exports.promptForPlugins = promptForPlugins;
|
|
146
|
+
exports.toCheckboxChoice = toCheckboxChoice;
|
|
147
|
+
exports.toInstallSpec = toInstallSpec;
|
|
148
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sources":["../../../../../../src/cli/commands/enterprise/install/selection.ts"],"sourcesContent":["import type { EnterprisePluginEntry } from './discovery';\nimport { promptChecklist, type ChecklistChoice } from './checklist-prompt';\nimport { resolvePluginStatus } from './plugin-status';\nimport type { PackumentLookup } from './registry';\nimport { isPrerelease } from './versions';\n\ntype PluginRowState =\n /** Installed, and a newer compatible version exists. Selected by default. */\n | {\n state: 'upgrade';\n installedVersion: string;\n targetVersion: string;\n isMajorUpgrade: boolean;\n newerVersionNote?: string;\n }\n /** Not installed, and the license includes it. */\n | { state: 'install'; targetVersion: string; newerVersionNote?: string }\n /** Installed and up to date for this Strapi version. */\n | { state: 'installed'; installedVersion: string; newerVersionNote?: string }\n /** Installed, but the license does not include it anymore. */\n | { state: 'not-licensed'; installedVersion: string }\n /** Not installed, and no stable version fits this Strapi version. */\n | { state: 'no-compatible-version'; requiredStrapiRange: string }\n /** Not installed, and only prerelease versions exist. */\n | { state: 'no-stable-release' }\n /** Not installed, and not available to this license: not shown. */\n | { state: 'hidden' };\n\nexport type PluginRow = { entry: EnterprisePluginEntry } & PluginRowState;\n\nexport type SelectableRow = Extract<PluginRow, { state: 'upgrade' | 'install' }>;\n\nexport const buildPluginRow = ({\n entry,\n lookup,\n installedVersion,\n strapiVersion,\n}: {\n entry: EnterprisePluginEntry;\n lookup: PackumentLookup;\n installedVersion?: string;\n strapiVersion?: string;\n}): PluginRow => {\n const status = resolvePluginStatus({ lookup, installedVersion, strapiVersion });\n\n if (status.state === 'not-licensed' || status.state === 'not-found') {\n return status.state === 'not-licensed' && installedVersion\n ? { entry, state: 'not-licensed', installedVersion }\n : { entry, state: 'hidden' };\n }\n\n if (status.state === 'install') {\n return { entry, ...status };\n }\n\n if (!installedVersion) {\n // Only an installed plugin can be an upgrade or up to date.\n return status.state === 'no-compatible-version'\n ? { entry, state: 'no-compatible-version', requiredStrapiRange: status.requiredStrapiRange }\n : { entry, state: 'no-stable-release' };\n }\n\n switch (status.state) {\n case 'upgrade':\n return { entry, ...status, installedVersion };\n case 'no-compatible-version':\n // No version for this app. An installed plugin stays listed as installed.\n return {\n entry,\n state: 'installed',\n installedVersion,\n newerVersionNote: status.newerVersionNote,\n };\n case 'no-stable-release':\n return { entry, state: 'installed', installedVersion };\n default:\n return { entry, ...status, installedVersion };\n }\n};\n\nconst ROW_ORDER: PluginRow['state'][] = [\n 'upgrade',\n 'install',\n 'installed',\n 'not-licensed',\n 'no-compatible-version',\n 'no-stable-release',\n];\n\nexport const isSelectable = (row: PluginRow): row is SelectableRow =>\n row.state === 'upgrade' || row.state === 'install';\n\nexport const toInstallSpec = (row: SelectableRow): string =>\n `${row.entry.packageName}@${row.targetVersion}`;\n\nconst describeUpgrade = (row: Extract<PluginRow, { state: 'upgrade' }>): string => {\n if (isPrerelease(row.installedVersion)) {\n return '[stable release]';\n }\n\n return row.isMajorUpgrade ? '[major upgrade]' : '[upgrade]';\n};\n\nexport const toCheckboxChoice = (row: PluginRow): ChecklistChoice => {\n const { displayName, packageName, kind } = row.entry;\n const kindTag = kind && kind !== 'plugin' ? ` [${kind}]` : '';\n const label = `${displayName} (${packageName})${kindTag}`;\n // The note is a sentence of its own, such as \"1.3.0 is available but requires Strapi ^5.56.0.\"\n const noteSuffix = (note?: string) => (note ? ` ${note}` : '');\n\n switch (row.state) {\n case 'upgrade': {\n const upgradeTag = describeUpgrade(row);\n\n return {\n name: `${label} ${row.installedVersion} → ${row.targetVersion} ${upgradeTag}${noteSuffix(row.newerVersionNote)}`,\n value: toInstallSpec(row),\n short: displayName,\n checked: upgradeTag === '[upgrade]',\n };\n }\n case 'install':\n return {\n name: `${label} ${row.targetVersion} ${row.entry.summary}${noteSuffix(row.newerVersionNote)}`,\n value: toInstallSpec(row),\n short: displayName,\n checked: false,\n };\n case 'installed':\n return {\n name: `${label} ${row.installedVersion}`,\n disabled: row.newerVersionNote ? `installed, ${row.newerVersionNote}` : 'installed',\n };\n case 'not-licensed':\n return { name: `${label} ${row.installedVersion}`, disabled: 'not in your license' };\n case 'no-compatible-version':\n return { name: label, disabled: `requires Strapi ${row.requiredStrapiRange}` };\n case 'no-stable-release':\n return { name: label, disabled: 'no stable release yet' };\n default:\n return { name: label, disabled: 'unavailable' };\n }\n};\n\n/** Visible rows, with upgrades first. Unticking a row never uninstalls anything. */\nexport const orderVisibleRows = (rows: PluginRow[]): PluginRow[] =>\n rows\n .filter((row) => row.state !== 'hidden')\n .sort((left, right) => ROW_ORDER.indexOf(left.state) - ROW_ORDER.indexOf(right.state));\n\nexport const promptForPlugins = (rows: PluginRow[]): Promise<string[]> =>\n promptChecklist({\n message: 'Which Enterprise plugins do you want to install or upgrade?',\n choices: orderVisibleRows(rows).map(toCheckboxChoice),\n });\n"],"names":["buildPluginRow","entry","lookup","installedVersion","strapiVersion","status","resolvePluginStatus","state","requiredStrapiRange","newerVersionNote","ROW_ORDER","isSelectable","row","toInstallSpec","packageName","targetVersion","describeUpgrade","isPrerelease","isMajorUpgrade","toCheckboxChoice","displayName","kind","kindTag","label","noteSuffix","note","upgradeTag","name","value","short","checked","summary","disabled","orderVisibleRows","rows","filter","sort","left","right","indexOf","promptForPlugins","promptChecklist","message","choices","map"],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { promptChecklist } from './checklist-prompt.mjs';
|
|
2
|
+
import { resolvePluginStatus } from './plugin-status.mjs';
|
|
3
|
+
import { isPrerelease } from './versions.mjs';
|
|
4
|
+
|
|
5
|
+
const buildPluginRow = ({ entry, lookup, installedVersion, strapiVersion })=>{
|
|
6
|
+
const status = resolvePluginStatus({
|
|
7
|
+
lookup,
|
|
8
|
+
installedVersion,
|
|
9
|
+
strapiVersion
|
|
10
|
+
});
|
|
11
|
+
if (status.state === 'not-licensed' || status.state === 'not-found') {
|
|
12
|
+
return status.state === 'not-licensed' && installedVersion ? {
|
|
13
|
+
entry,
|
|
14
|
+
state: 'not-licensed',
|
|
15
|
+
installedVersion
|
|
16
|
+
} : {
|
|
17
|
+
entry,
|
|
18
|
+
state: 'hidden'
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (status.state === 'install') {
|
|
22
|
+
return {
|
|
23
|
+
entry,
|
|
24
|
+
...status
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (!installedVersion) {
|
|
28
|
+
// Only an installed plugin can be an upgrade or up to date.
|
|
29
|
+
return status.state === 'no-compatible-version' ? {
|
|
30
|
+
entry,
|
|
31
|
+
state: 'no-compatible-version',
|
|
32
|
+
requiredStrapiRange: status.requiredStrapiRange
|
|
33
|
+
} : {
|
|
34
|
+
entry,
|
|
35
|
+
state: 'no-stable-release'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
switch(status.state){
|
|
39
|
+
case 'upgrade':
|
|
40
|
+
return {
|
|
41
|
+
entry,
|
|
42
|
+
...status,
|
|
43
|
+
installedVersion
|
|
44
|
+
};
|
|
45
|
+
case 'no-compatible-version':
|
|
46
|
+
// No version for this app. An installed plugin stays listed as installed.
|
|
47
|
+
return {
|
|
48
|
+
entry,
|
|
49
|
+
state: 'installed',
|
|
50
|
+
installedVersion,
|
|
51
|
+
newerVersionNote: status.newerVersionNote
|
|
52
|
+
};
|
|
53
|
+
case 'no-stable-release':
|
|
54
|
+
return {
|
|
55
|
+
entry,
|
|
56
|
+
state: 'installed',
|
|
57
|
+
installedVersion
|
|
58
|
+
};
|
|
59
|
+
default:
|
|
60
|
+
return {
|
|
61
|
+
entry,
|
|
62
|
+
...status,
|
|
63
|
+
installedVersion
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const ROW_ORDER = [
|
|
68
|
+
'upgrade',
|
|
69
|
+
'install',
|
|
70
|
+
'installed',
|
|
71
|
+
'not-licensed',
|
|
72
|
+
'no-compatible-version',
|
|
73
|
+
'no-stable-release'
|
|
74
|
+
];
|
|
75
|
+
const isSelectable = (row)=>row.state === 'upgrade' || row.state === 'install';
|
|
76
|
+
const toInstallSpec = (row)=>`${row.entry.packageName}@${row.targetVersion}`;
|
|
77
|
+
const describeUpgrade = (row)=>{
|
|
78
|
+
if (isPrerelease(row.installedVersion)) {
|
|
79
|
+
return '[stable release]';
|
|
80
|
+
}
|
|
81
|
+
return row.isMajorUpgrade ? '[major upgrade]' : '[upgrade]';
|
|
82
|
+
};
|
|
83
|
+
const toCheckboxChoice = (row)=>{
|
|
84
|
+
const { displayName, packageName, kind } = row.entry;
|
|
85
|
+
const kindTag = kind && kind !== 'plugin' ? ` [${kind}]` : '';
|
|
86
|
+
const label = `${displayName} (${packageName})${kindTag}`;
|
|
87
|
+
// The note is a sentence of its own, such as "1.3.0 is available but requires Strapi ^5.56.0."
|
|
88
|
+
const noteSuffix = (note)=>note ? ` ${note}` : '';
|
|
89
|
+
switch(row.state){
|
|
90
|
+
case 'upgrade':
|
|
91
|
+
{
|
|
92
|
+
const upgradeTag = describeUpgrade(row);
|
|
93
|
+
return {
|
|
94
|
+
name: `${label} ${row.installedVersion} → ${row.targetVersion} ${upgradeTag}${noteSuffix(row.newerVersionNote)}`,
|
|
95
|
+
value: toInstallSpec(row),
|
|
96
|
+
short: displayName,
|
|
97
|
+
checked: upgradeTag === '[upgrade]'
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
case 'install':
|
|
101
|
+
return {
|
|
102
|
+
name: `${label} ${row.targetVersion} ${row.entry.summary}${noteSuffix(row.newerVersionNote)}`,
|
|
103
|
+
value: toInstallSpec(row),
|
|
104
|
+
short: displayName,
|
|
105
|
+
checked: false
|
|
106
|
+
};
|
|
107
|
+
case 'installed':
|
|
108
|
+
return {
|
|
109
|
+
name: `${label} ${row.installedVersion}`,
|
|
110
|
+
disabled: row.newerVersionNote ? `installed, ${row.newerVersionNote}` : 'installed'
|
|
111
|
+
};
|
|
112
|
+
case 'not-licensed':
|
|
113
|
+
return {
|
|
114
|
+
name: `${label} ${row.installedVersion}`,
|
|
115
|
+
disabled: 'not in your license'
|
|
116
|
+
};
|
|
117
|
+
case 'no-compatible-version':
|
|
118
|
+
return {
|
|
119
|
+
name: label,
|
|
120
|
+
disabled: `requires Strapi ${row.requiredStrapiRange}`
|
|
121
|
+
};
|
|
122
|
+
case 'no-stable-release':
|
|
123
|
+
return {
|
|
124
|
+
name: label,
|
|
125
|
+
disabled: 'no stable release yet'
|
|
126
|
+
};
|
|
127
|
+
default:
|
|
128
|
+
return {
|
|
129
|
+
name: label,
|
|
130
|
+
disabled: 'unavailable'
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
/** Visible rows, with upgrades first. Unticking a row never uninstalls anything. */ const orderVisibleRows = (rows)=>rows.filter((row)=>row.state !== 'hidden').sort((left, right)=>ROW_ORDER.indexOf(left.state) - ROW_ORDER.indexOf(right.state));
|
|
135
|
+
const promptForPlugins = (rows)=>promptChecklist({
|
|
136
|
+
message: 'Which Enterprise plugins do you want to install or upgrade?',
|
|
137
|
+
choices: orderVisibleRows(rows).map(toCheckboxChoice)
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
export { buildPluginRow, isSelectable, orderVisibleRows, promptForPlugins, toCheckboxChoice, toInstallSpec };
|
|
141
|
+
//# sourceMappingURL=selection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/selection.ts"],"sourcesContent":["import type { EnterprisePluginEntry } from './discovery';\nimport { promptChecklist, type ChecklistChoice } from './checklist-prompt';\nimport { resolvePluginStatus } from './plugin-status';\nimport type { PackumentLookup } from './registry';\nimport { isPrerelease } from './versions';\n\ntype PluginRowState =\n /** Installed, and a newer compatible version exists. Selected by default. */\n | {\n state: 'upgrade';\n installedVersion: string;\n targetVersion: string;\n isMajorUpgrade: boolean;\n newerVersionNote?: string;\n }\n /** Not installed, and the license includes it. */\n | { state: 'install'; targetVersion: string; newerVersionNote?: string }\n /** Installed and up to date for this Strapi version. */\n | { state: 'installed'; installedVersion: string; newerVersionNote?: string }\n /** Installed, but the license does not include it anymore. */\n | { state: 'not-licensed'; installedVersion: string }\n /** Not installed, and no stable version fits this Strapi version. */\n | { state: 'no-compatible-version'; requiredStrapiRange: string }\n /** Not installed, and only prerelease versions exist. */\n | { state: 'no-stable-release' }\n /** Not installed, and not available to this license: not shown. */\n | { state: 'hidden' };\n\nexport type PluginRow = { entry: EnterprisePluginEntry } & PluginRowState;\n\nexport type SelectableRow = Extract<PluginRow, { state: 'upgrade' | 'install' }>;\n\nexport const buildPluginRow = ({\n entry,\n lookup,\n installedVersion,\n strapiVersion,\n}: {\n entry: EnterprisePluginEntry;\n lookup: PackumentLookup;\n installedVersion?: string;\n strapiVersion?: string;\n}): PluginRow => {\n const status = resolvePluginStatus({ lookup, installedVersion, strapiVersion });\n\n if (status.state === 'not-licensed' || status.state === 'not-found') {\n return status.state === 'not-licensed' && installedVersion\n ? { entry, state: 'not-licensed', installedVersion }\n : { entry, state: 'hidden' };\n }\n\n if (status.state === 'install') {\n return { entry, ...status };\n }\n\n if (!installedVersion) {\n // Only an installed plugin can be an upgrade or up to date.\n return status.state === 'no-compatible-version'\n ? { entry, state: 'no-compatible-version', requiredStrapiRange: status.requiredStrapiRange }\n : { entry, state: 'no-stable-release' };\n }\n\n switch (status.state) {\n case 'upgrade':\n return { entry, ...status, installedVersion };\n case 'no-compatible-version':\n // No version for this app. An installed plugin stays listed as installed.\n return {\n entry,\n state: 'installed',\n installedVersion,\n newerVersionNote: status.newerVersionNote,\n };\n case 'no-stable-release':\n return { entry, state: 'installed', installedVersion };\n default:\n return { entry, ...status, installedVersion };\n }\n};\n\nconst ROW_ORDER: PluginRow['state'][] = [\n 'upgrade',\n 'install',\n 'installed',\n 'not-licensed',\n 'no-compatible-version',\n 'no-stable-release',\n];\n\nexport const isSelectable = (row: PluginRow): row is SelectableRow =>\n row.state === 'upgrade' || row.state === 'install';\n\nexport const toInstallSpec = (row: SelectableRow): string =>\n `${row.entry.packageName}@${row.targetVersion}`;\n\nconst describeUpgrade = (row: Extract<PluginRow, { state: 'upgrade' }>): string => {\n if (isPrerelease(row.installedVersion)) {\n return '[stable release]';\n }\n\n return row.isMajorUpgrade ? '[major upgrade]' : '[upgrade]';\n};\n\nexport const toCheckboxChoice = (row: PluginRow): ChecklistChoice => {\n const { displayName, packageName, kind } = row.entry;\n const kindTag = kind && kind !== 'plugin' ? ` [${kind}]` : '';\n const label = `${displayName} (${packageName})${kindTag}`;\n // The note is a sentence of its own, such as \"1.3.0 is available but requires Strapi ^5.56.0.\"\n const noteSuffix = (note?: string) => (note ? ` ${note}` : '');\n\n switch (row.state) {\n case 'upgrade': {\n const upgradeTag = describeUpgrade(row);\n\n return {\n name: `${label} ${row.installedVersion} → ${row.targetVersion} ${upgradeTag}${noteSuffix(row.newerVersionNote)}`,\n value: toInstallSpec(row),\n short: displayName,\n checked: upgradeTag === '[upgrade]',\n };\n }\n case 'install':\n return {\n name: `${label} ${row.targetVersion} ${row.entry.summary}${noteSuffix(row.newerVersionNote)}`,\n value: toInstallSpec(row),\n short: displayName,\n checked: false,\n };\n case 'installed':\n return {\n name: `${label} ${row.installedVersion}`,\n disabled: row.newerVersionNote ? `installed, ${row.newerVersionNote}` : 'installed',\n };\n case 'not-licensed':\n return { name: `${label} ${row.installedVersion}`, disabled: 'not in your license' };\n case 'no-compatible-version':\n return { name: label, disabled: `requires Strapi ${row.requiredStrapiRange}` };\n case 'no-stable-release':\n return { name: label, disabled: 'no stable release yet' };\n default:\n return { name: label, disabled: 'unavailable' };\n }\n};\n\n/** Visible rows, with upgrades first. Unticking a row never uninstalls anything. */\nexport const orderVisibleRows = (rows: PluginRow[]): PluginRow[] =>\n rows\n .filter((row) => row.state !== 'hidden')\n .sort((left, right) => ROW_ORDER.indexOf(left.state) - ROW_ORDER.indexOf(right.state));\n\nexport const promptForPlugins = (rows: PluginRow[]): Promise<string[]> =>\n promptChecklist({\n message: 'Which Enterprise plugins do you want to install or upgrade?',\n choices: orderVisibleRows(rows).map(toCheckboxChoice),\n });\n"],"names":["buildPluginRow","entry","lookup","installedVersion","strapiVersion","status","resolvePluginStatus","state","requiredStrapiRange","newerVersionNote","ROW_ORDER","isSelectable","row","toInstallSpec","packageName","targetVersion","describeUpgrade","isPrerelease","isMajorUpgrade","toCheckboxChoice","displayName","kind","kindTag","label","noteSuffix","note","upgradeTag","name","value","short","checked","summary","disabled","orderVisibleRows","rows","filter","sort","left","right","indexOf","promptForPlugins","promptChecklist","message","choices","map"],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var constants = require('./constants.js');
|
|
4
|
+
var discovery = require('./discovery.js');
|
|
5
|
+
var versions = require('./versions.js');
|
|
6
|
+
|
|
7
|
+
const readSetupLink = async (appDir, packageName)=>{
|
|
8
|
+
const packageJson = await versions.readInstalledPackageJson(appDir, packageName);
|
|
9
|
+
if (!packageJson?.strapi || !discovery.declaresStrapiKind(packageJson.strapi.kind)) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const { homepage } = packageJson;
|
|
13
|
+
return {
|
|
14
|
+
packageName,
|
|
15
|
+
url: typeof homepage === 'string' && homepage.length > 0 ? homepage : constants.ENTERPRISE_PLUGINS_DOCS_URL
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
const printSetupLinks = async ({ appDir, installedPackages, logger })=>{
|
|
19
|
+
for (const { packageName, replacesInstalledVersion } of installedPackages){
|
|
20
|
+
const setupLink = await readSetupLink(appDir, packageName);
|
|
21
|
+
if (!setupLink) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (replacesInstalledVersion) {
|
|
25
|
+
logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);
|
|
26
|
+
} else {
|
|
27
|
+
logger.warn(`Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
exports.printSetupLinks = printSetupLinks;
|
|
33
|
+
exports.readSetupLink = readSetupLink;
|
|
34
|
+
//# sourceMappingURL=setup-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-links.js","sources":["../../../../../../src/cli/commands/enterprise/install/setup-links.ts"],"sourcesContent":["import type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_PLUGINS_DOCS_URL } from './constants';\nimport { declaresStrapiKind } from './discovery';\nimport { readInstalledPackageJson } from './versions';\n\nexport interface SetupLink {\n packageName: string;\n url: string;\n}\n\nexport const readSetupLink = async (\n appDir: string,\n packageName: string\n): Promise<SetupLink | undefined> => {\n const packageJson = await readInstalledPackageJson(appDir, packageName);\n\n if (!packageJson?.strapi || !declaresStrapiKind(packageJson.strapi.kind)) {\n return undefined;\n }\n\n const { homepage } = packageJson;\n\n return {\n packageName,\n url:\n typeof homepage === 'string' && homepage.length > 0 ? homepage : ENTERPRISE_PLUGINS_DOCS_URL,\n };\n};\n\nexport interface InstalledPackage {\n packageName: string;\n replacesInstalledVersion: boolean;\n}\n\nexport const printSetupLinks = async ({\n appDir,\n installedPackages,\n logger,\n}: {\n appDir: string;\n installedPackages: InstalledPackage[];\n logger: Logger;\n}): Promise<void> => {\n for (const { packageName, replacesInstalledVersion } of installedPackages) {\n const setupLink = await readSetupLink(appDir, packageName);\n\n if (!setupLink) {\n continue;\n }\n\n if (replacesInstalledVersion) {\n logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);\n } else {\n logger.warn(\n `Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`\n );\n }\n }\n};\n"],"names":["readSetupLink","appDir","packageName","packageJson","readInstalledPackageJson","strapi","declaresStrapiKind","kind","undefined","homepage","url","length","ENTERPRISE_PLUGINS_DOCS_URL","printSetupLinks","installedPackages","logger","replacesInstalledVersion","setupLink","info","warn"],"mappings":";;;;;;AAUO,MAAMA,aAAAA,GAAgB,OAC3BC,MAAAA,EACAC,WAAAA,GAAAA;IAEA,MAAMC,WAAAA,GAAc,MAAMC,iCAAAA,CAAyBH,MAAAA,EAAQC,WAAAA,CAAAA;IAE3D,IAAI,CAACC,aAAaE,MAAAA,IAAU,CAACC,6BAAmBH,WAAAA,CAAYE,MAAM,CAACE,IAAI,CAAA,EAAG;QACxE,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAM,EAAEC,QAAQ,EAAE,GAAGN,WAAAA;IAErB,OAAO;AACLD,QAAAA,WAAAA;AACAQ,QAAAA,GAAAA,EACE,OAAOD,QAAAA,KAAa,QAAA,IAAYA,SAASE,MAAM,GAAG,IAAIF,QAAAA,GAAWG;AACrE,KAAA;AACF;AAOO,MAAMC,kBAAkB,OAAO,EACpCZ,MAAM,EACNa,iBAAiB,EACjBC,MAAM,EAKP,GAAA;AACC,IAAA,KAAK,MAAM,EAAEb,WAAW,EAAEc,wBAAwB,EAAE,IAAIF,iBAAAA,CAAmB;QACzE,MAAMG,SAAAA,GAAY,MAAMjB,aAAAA,CAAcC,MAAAA,EAAQC,WAAAA,CAAAA;AAE9C,QAAA,IAAI,CAACe,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AAEA,QAAA,IAAID,wBAAAA,EAA0B;AAC5BD,YAAAA,MAAAA,CAAOG,IAAI,CAAC,CAAC,QAAQ,EAAED,SAAAA,CAAUf,WAAW,CAAC,sBAAsB,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;QACtF,CAAA,MAAO;AACLK,YAAAA,MAAAA,CAAOI,IAAI,CACT,CAAC,OAAO,EAAEF,SAAAA,CAAUf,WAAW,CAAC,gDAAgD,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;AAErG,QAAA;AACF,IAAA;AACF;;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ENTERPRISE_PLUGINS_DOCS_URL } from './constants.mjs';
|
|
2
|
+
import { declaresStrapiKind } from './discovery.mjs';
|
|
3
|
+
import { readInstalledPackageJson } from './versions.mjs';
|
|
4
|
+
|
|
5
|
+
const readSetupLink = async (appDir, packageName)=>{
|
|
6
|
+
const packageJson = await readInstalledPackageJson(appDir, packageName);
|
|
7
|
+
if (!packageJson?.strapi || !declaresStrapiKind(packageJson.strapi.kind)) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const { homepage } = packageJson;
|
|
11
|
+
return {
|
|
12
|
+
packageName,
|
|
13
|
+
url: typeof homepage === 'string' && homepage.length > 0 ? homepage : ENTERPRISE_PLUGINS_DOCS_URL
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const printSetupLinks = async ({ appDir, installedPackages, logger })=>{
|
|
17
|
+
for (const { packageName, replacesInstalledVersion } of installedPackages){
|
|
18
|
+
const setupLink = await readSetupLink(appDir, packageName);
|
|
19
|
+
if (!setupLink) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (replacesInstalledVersion) {
|
|
23
|
+
logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);
|
|
24
|
+
} else {
|
|
25
|
+
logger.warn(`Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export { printSetupLinks, readSetupLink };
|
|
31
|
+
//# sourceMappingURL=setup-links.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-links.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/setup-links.ts"],"sourcesContent":["import type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_PLUGINS_DOCS_URL } from './constants';\nimport { declaresStrapiKind } from './discovery';\nimport { readInstalledPackageJson } from './versions';\n\nexport interface SetupLink {\n packageName: string;\n url: string;\n}\n\nexport const readSetupLink = async (\n appDir: string,\n packageName: string\n): Promise<SetupLink | undefined> => {\n const packageJson = await readInstalledPackageJson(appDir, packageName);\n\n if (!packageJson?.strapi || !declaresStrapiKind(packageJson.strapi.kind)) {\n return undefined;\n }\n\n const { homepage } = packageJson;\n\n return {\n packageName,\n url:\n typeof homepage === 'string' && homepage.length > 0 ? homepage : ENTERPRISE_PLUGINS_DOCS_URL,\n };\n};\n\nexport interface InstalledPackage {\n packageName: string;\n replacesInstalledVersion: boolean;\n}\n\nexport const printSetupLinks = async ({\n appDir,\n installedPackages,\n logger,\n}: {\n appDir: string;\n installedPackages: InstalledPackage[];\n logger: Logger;\n}): Promise<void> => {\n for (const { packageName, replacesInstalledVersion } of installedPackages) {\n const setupLink = await readSetupLink(appDir, packageName);\n\n if (!setupLink) {\n continue;\n }\n\n if (replacesInstalledVersion) {\n logger.info(`Updated ${setupLink.packageName}. See what changed at ${setupLink.url}`);\n } else {\n logger.warn(\n `Set up ${setupLink.packageName} before starting Strapi, following the guide at ${setupLink.url}`\n );\n }\n }\n};\n"],"names":["readSetupLink","appDir","packageName","packageJson","readInstalledPackageJson","strapi","declaresStrapiKind","kind","undefined","homepage","url","length","ENTERPRISE_PLUGINS_DOCS_URL","printSetupLinks","installedPackages","logger","replacesInstalledVersion","setupLink","info","warn"],"mappings":";;;;AAUO,MAAMA,aAAAA,GAAgB,OAC3BC,MAAAA,EACAC,WAAAA,GAAAA;IAEA,MAAMC,WAAAA,GAAc,MAAMC,wBAAAA,CAAyBH,MAAAA,EAAQC,WAAAA,CAAAA;IAE3D,IAAI,CAACC,aAAaE,MAAAA,IAAU,CAACC,mBAAmBH,WAAAA,CAAYE,MAAM,CAACE,IAAI,CAAA,EAAG;QACxE,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAM,EAAEC,QAAQ,EAAE,GAAGN,WAAAA;IAErB,OAAO;AACLD,QAAAA,WAAAA;AACAQ,QAAAA,GAAAA,EACE,OAAOD,QAAAA,KAAa,QAAA,IAAYA,SAASE,MAAM,GAAG,IAAIF,QAAAA,GAAWG;AACrE,KAAA;AACF;AAOO,MAAMC,kBAAkB,OAAO,EACpCZ,MAAM,EACNa,iBAAiB,EACjBC,MAAM,EAKP,GAAA;AACC,IAAA,KAAK,MAAM,EAAEb,WAAW,EAAEc,wBAAwB,EAAE,IAAIF,iBAAAA,CAAmB;QACzE,MAAMG,SAAAA,GAAY,MAAMjB,aAAAA,CAAcC,MAAAA,EAAQC,WAAAA,CAAAA;AAE9C,QAAA,IAAI,CAACe,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AAEA,QAAA,IAAID,wBAAAA,EAA0B;AAC5BD,YAAAA,MAAAA,CAAOG,IAAI,CAAC,CAAC,QAAQ,EAAED,SAAAA,CAAUf,WAAW,CAAC,sBAAsB,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;QACtF,CAAA,MAAO;AACLK,YAAAA,MAAAA,CAAOI,IAAI,CACT,CAAC,OAAO,EAAEF,SAAAA,CAAUf,WAAW,CAAC,gDAAgD,EAAEe,SAAAA,CAAUP,GAAG,CAAA,CAAE,CAAA;AAErG,QAAA;AACF,IAAA;AACF;;;;"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var fse = require('fs-extra');
|
|
5
|
+
var semver = require('semver');
|
|
6
|
+
var constants = require('./constants.js');
|
|
7
|
+
var errors = require('./errors.js');
|
|
8
|
+
var directories = require('./directories.js');
|
|
9
|
+
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
13
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
14
|
+
var semver__default = /*#__PURE__*/_interopDefault(semver);
|
|
15
|
+
|
|
16
|
+
const listNodeModulesDirectories = (appDir)=>directories.listAncestorDirectories(appDir).map((directory)=>path__default.default.join(directory, 'node_modules'));
|
|
17
|
+
/** Reads the `package.json` of an installed package, found the way Node resolves packages. */ const readInstalledPackageJson = async (appDir, packageName)=>{
|
|
18
|
+
for (const nodeModulesDirectory of listNodeModulesDirectories(appDir)){
|
|
19
|
+
const packageJsonPath = path__default.default.join(nodeModulesDirectory, packageName, 'package.json');
|
|
20
|
+
if (await fse__default.default.pathExists(packageJsonPath)) {
|
|
21
|
+
return fse__default.default.readJson(packageJsonPath).catch(()=>{
|
|
22
|
+
throw new errors.EnterpriseInstallError(`Could not read ${packageJsonPath}. Reinstall the app's dependencies, then try again.`);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
};
|
|
28
|
+
const readInstalledVersion = async (appDir, packageName)=>{
|
|
29
|
+
const { version } = await readInstalledPackageJson(appDir, packageName) ?? {};
|
|
30
|
+
return typeof version === 'string' ? version : undefined;
|
|
31
|
+
};
|
|
32
|
+
const DEPENDENCY_FIELDS = [
|
|
33
|
+
'dependencies',
|
|
34
|
+
'devDependencies',
|
|
35
|
+
'optionalDependencies'
|
|
36
|
+
];
|
|
37
|
+
/** The packages the app's own `package.json` depends on. */ const readAppDependencyNames = async (appDir)=>{
|
|
38
|
+
const packageJson = await fse__default.default.readJson(path__default.default.join(appDir, 'package.json')).catch(()=>({}));
|
|
39
|
+
return new Set(DEPENDENCY_FIELDS.flatMap((field)=>Object.keys(packageJson?.[field] ?? {})));
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* The installed version of a package the app depends on. Undefined when the app's `package.json`
|
|
43
|
+
* does not list it, even if a parent `node_modules` holds a copy hoisted for another app of the
|
|
44
|
+
* same monorepo: that copy is not the app's, so it is neither up to date nor an upgrade for it.
|
|
45
|
+
*/ const readAppDependencyVersion = async (appDir, packageName)=>(await readAppDependencyNames(appDir)).has(packageName) ? readInstalledVersion(appDir, packageName) : undefined;
|
|
46
|
+
const canCheckStrapiCompatibility = (strapiVersion)=>strapiVersion !== undefined && semver__default.default.valid(strapiVersion) !== null && semver__default.default.prerelease(strapiVersion) === null;
|
|
47
|
+
const getStrapiRange = (packumentVersion)=>packumentVersion?.peerDependencies?.[constants.STRAPI_PACKAGE_NAME];
|
|
48
|
+
const fitsStrapiVersion = (packumentVersion, strapiVersion)=>{
|
|
49
|
+
const strapiRange = getStrapiRange(packumentVersion);
|
|
50
|
+
return !canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined || semver__default.default.satisfies(strapiVersion, strapiRange);
|
|
51
|
+
};
|
|
52
|
+
const pickTargetVersion = (packument, strapiVersion)=>{
|
|
53
|
+
const latestVersion = packument['dist-tags']?.latest;
|
|
54
|
+
const versionCap = latestVersion !== undefined && semver__default.default.valid(latestVersion) && !isPrerelease(latestVersion) ? latestVersion : undefined;
|
|
55
|
+
const stableVersions = Object.values(packument.versions ?? {}).filter((packumentVersion)=>semver__default.default.valid(packumentVersion.version) !== null && semver__default.default.prerelease(packumentVersion.version) === null && !packumentVersion.deprecated && (versionCap === undefined || semver__default.default.lte(packumentVersion.version, versionCap))).sort((left, right)=>semver__default.default.rcompare(left.version, right.version));
|
|
56
|
+
const newest = stableVersions[0];
|
|
57
|
+
return {
|
|
58
|
+
targetVersion: stableVersions.find((packumentVersion)=>fitsStrapiVersion(packumentVersion, strapiVersion))?.version,
|
|
59
|
+
newestVersion: newest?.version,
|
|
60
|
+
newestVersionStrapiRange: getStrapiRange(newest)
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const describeNewerIncompatibleVersion = ({ targetVersion, newestVersion, newestVersionStrapiRange }, installedVersion)=>{
|
|
64
|
+
if (!newestVersion || newestVersion === targetVersion || !newestVersionStrapiRange) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
// Nothing to announce when that version, or a later one, is already installed.
|
|
68
|
+
if (installedVersion && semver__default.default.valid(installedVersion) && semver__default.default.gte(installedVersion, newestVersion)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return `${newestVersion} is available but requires Strapi ${newestVersionStrapiRange}.`;
|
|
72
|
+
};
|
|
73
|
+
const resolveRequestedVersion = (packument, requestedVersion, strapiVersion)=>{
|
|
74
|
+
const publishedVersions = Object.keys(packument.versions ?? {});
|
|
75
|
+
const taggedVersion = packument['dist-tags']?.[requestedVersion];
|
|
76
|
+
if (publishedVersions.includes(requestedVersion)) {
|
|
77
|
+
return requestedVersion;
|
|
78
|
+
}
|
|
79
|
+
if (taggedVersion !== undefined && publishedVersions.includes(taggedVersion)) {
|
|
80
|
+
return taggedVersion;
|
|
81
|
+
}
|
|
82
|
+
if (!semver__default.default.validRange(requestedVersion)) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
// A range asks for "something in it", not for one version: like the automatic choice, prefer a
|
|
86
|
+
// version that is not deprecated and fits the app's Strapi, and like npm, prefer `latest`.
|
|
87
|
+
const inRange = Object.values(packument.versions ?? {}).filter((packumentVersion)=>semver__default.default.valid(packumentVersion.version) !== null && semver__default.default.satisfies(packumentVersion.version, requestedVersion));
|
|
88
|
+
const notDeprecated = inRange.filter((packumentVersion)=>!packumentVersion.deprecated);
|
|
89
|
+
const fitting = notDeprecated.filter((packumentVersion)=>fitsStrapiVersion(packumentVersion, strapiVersion));
|
|
90
|
+
const pick = (candidates)=>{
|
|
91
|
+
const versions = candidates.map((packumentVersion)=>packumentVersion.version);
|
|
92
|
+
const latestVersion = packument['dist-tags']?.latest;
|
|
93
|
+
if (latestVersion !== undefined && versions.includes(latestVersion)) {
|
|
94
|
+
return latestVersion;
|
|
95
|
+
}
|
|
96
|
+
return semver__default.default.maxSatisfying(versions, requestedVersion) ?? undefined;
|
|
97
|
+
};
|
|
98
|
+
return pick(fitting) ?? pick(notDeprecated) ?? pick(inRange);
|
|
99
|
+
};
|
|
100
|
+
/** The Strapi range a version requires, when the app's Strapi version is known not to fit it. */ const findUnsupportedStrapiRange = (packument, version, strapiVersion)=>{
|
|
101
|
+
const strapiRange = getStrapiRange(packument.versions?.[version]);
|
|
102
|
+
if (!canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
return semver__default.default.satisfies(strapiVersion, strapiRange) ? undefined : strapiRange;
|
|
106
|
+
};
|
|
107
|
+
/** A prerelease, such as an experimental build, is usually ahead of the latest stable release. */ const isPrerelease = (version)=>semver__default.default.prerelease(version) !== null;
|
|
108
|
+
/**
|
|
109
|
+
* True when semver lets the target break the installed version: a new major, or a new minor in 0.x,
|
|
110
|
+
* as npm's `^` range reads it.
|
|
111
|
+
*/ const isMajorUpgrade = (installedVersion, targetVersion)=>semver__default.default.valid(installedVersion) !== null && !semver__default.default.satisfies(targetVersion, `^${installedVersion}`);
|
|
112
|
+
/** True when the target is newer than what is installed. A newer install is never downgraded. */ const isUpgrade = (installedVersion, targetVersion)=>semver__default.default.valid(installedVersion) === null || semver__default.default.gt(targetVersion, installedVersion);
|
|
113
|
+
|
|
114
|
+
exports.canCheckStrapiCompatibility = canCheckStrapiCompatibility;
|
|
115
|
+
exports.describeNewerIncompatibleVersion = describeNewerIncompatibleVersion;
|
|
116
|
+
exports.findUnsupportedStrapiRange = findUnsupportedStrapiRange;
|
|
117
|
+
exports.isMajorUpgrade = isMajorUpgrade;
|
|
118
|
+
exports.isPrerelease = isPrerelease;
|
|
119
|
+
exports.isUpgrade = isUpgrade;
|
|
120
|
+
exports.listNodeModulesDirectories = listNodeModulesDirectories;
|
|
121
|
+
exports.pickTargetVersion = pickTargetVersion;
|
|
122
|
+
exports.readAppDependencyNames = readAppDependencyNames;
|
|
123
|
+
exports.readAppDependencyVersion = readAppDependencyVersion;
|
|
124
|
+
exports.readInstalledPackageJson = readInstalledPackageJson;
|
|
125
|
+
exports.readInstalledVersion = readInstalledVersion;
|
|
126
|
+
exports.resolveRequestedVersion = resolveRequestedVersion;
|
|
127
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sources":["../../../../../../src/cli/commands/enterprise/install/versions.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport semver from 'semver';\n\nimport { STRAPI_PACKAGE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\nimport { listAncestorDirectories } from './directories';\nimport type { Packument, PackumentVersion, StrapiPackageMetadata } from './registry';\n\nexport interface InstalledPackageJson {\n version?: string;\n homepage?: string;\n strapi?: StrapiPackageMetadata;\n}\n\nexport const listNodeModulesDirectories = (appDir: string): string[] =>\n listAncestorDirectories(appDir).map((directory) => path.join(directory, 'node_modules'));\n\n/** Reads the `package.json` of an installed package, found the way Node resolves packages. */\nexport const readInstalledPackageJson = async (\n appDir: string,\n packageName: string\n): Promise<InstalledPackageJson | undefined> => {\n for (const nodeModulesDirectory of listNodeModulesDirectories(appDir)) {\n const packageJsonPath = path.join(nodeModulesDirectory, packageName, 'package.json');\n\n if (await fse.pathExists(packageJsonPath)) {\n return fse.readJson(packageJsonPath).catch(() => {\n throw new EnterpriseInstallError(\n `Could not read ${packageJsonPath}. Reinstall the app's dependencies, then try again.`\n );\n });\n }\n }\n\n return undefined;\n};\n\nexport const readInstalledVersion = async (\n appDir: string,\n packageName: string\n): Promise<string | undefined> => {\n const { version } = (await readInstalledPackageJson(appDir, packageName)) ?? {};\n\n return typeof version === 'string' ? version : undefined;\n};\n\nconst DEPENDENCY_FIELDS = ['dependencies', 'devDependencies', 'optionalDependencies'] as const;\n\n/** The packages the app's own `package.json` depends on. */\nexport const readAppDependencyNames = async (appDir: string): Promise<Set<string>> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n\n return new Set(DEPENDENCY_FIELDS.flatMap((field) => Object.keys(packageJson?.[field] ?? {})));\n};\n\n/**\n * The installed version of a package the app depends on. Undefined when the app's `package.json`\n * does not list it, even if a parent `node_modules` holds a copy hoisted for another app of the\n * same monorepo: that copy is not the app's, so it is neither up to date nor an upgrade for it.\n */\nexport const readAppDependencyVersion = async (\n appDir: string,\n packageName: string\n): Promise<string | undefined> =>\n (await readAppDependencyNames(appDir)).has(packageName)\n ? readInstalledVersion(appDir, packageName)\n : undefined;\n\nexport const canCheckStrapiCompatibility = (\n strapiVersion: string | undefined\n): strapiVersion is string =>\n strapiVersion !== undefined &&\n semver.valid(strapiVersion) !== null &&\n semver.prerelease(strapiVersion) === null;\n\nexport interface VersionChoice {\n /** The highest stable version that fits the app's Strapi version. */\n targetVersion?: string;\n /** The highest stable version, whether it fits or not. */\n newestVersion?: string;\n /** The Strapi range the newest version requires, when it declares one. */\n newestVersionStrapiRange?: string;\n}\n\nconst getStrapiRange = (packumentVersion: PackumentVersion | undefined) =>\n packumentVersion?.peerDependencies?.[STRAPI_PACKAGE_NAME];\n\nconst fitsStrapiVersion = (\n packumentVersion: PackumentVersion,\n strapiVersion: string | undefined\n) => {\n const strapiRange = getStrapiRange(packumentVersion);\n\n return (\n !canCheckStrapiCompatibility(strapiVersion) ||\n strapiRange === undefined ||\n semver.satisfies(strapiVersion, strapiRange)\n );\n};\n\nexport const pickTargetVersion = (\n packument: Packument,\n strapiVersion: string | undefined\n): VersionChoice => {\n const latestVersion = packument['dist-tags']?.latest;\n const versionCap =\n latestVersion !== undefined && semver.valid(latestVersion) && !isPrerelease(latestVersion)\n ? latestVersion\n : undefined;\n\n const stableVersions = Object.values(packument.versions ?? {})\n .filter(\n (packumentVersion) =>\n semver.valid(packumentVersion.version) !== null &&\n semver.prerelease(packumentVersion.version) === null &&\n !packumentVersion.deprecated &&\n (versionCap === undefined || semver.lte(packumentVersion.version, versionCap))\n )\n .sort((left, right) => semver.rcompare(left.version, right.version));\n\n const newest = stableVersions[0];\n\n return {\n targetVersion: stableVersions.find((packumentVersion) =>\n fitsStrapiVersion(packumentVersion, strapiVersion)\n )?.version,\n newestVersion: newest?.version,\n newestVersionStrapiRange: getStrapiRange(newest),\n };\n};\n\nexport const describeNewerIncompatibleVersion = (\n { targetVersion, newestVersion, newestVersionStrapiRange }: VersionChoice,\n installedVersion?: string\n): string | undefined => {\n if (!newestVersion || newestVersion === targetVersion || !newestVersionStrapiRange) {\n return undefined;\n }\n\n // Nothing to announce when that version, or a later one, is already installed.\n if (\n installedVersion &&\n semver.valid(installedVersion) &&\n semver.gte(installedVersion, newestVersion)\n ) {\n return undefined;\n }\n\n return `${newestVersion} is available but requires Strapi ${newestVersionStrapiRange}.`;\n};\n\nexport const resolveRequestedVersion = (\n packument: Packument,\n requestedVersion: string,\n strapiVersion: string | undefined\n): string | undefined => {\n const publishedVersions = Object.keys(packument.versions ?? {});\n const taggedVersion = packument['dist-tags']?.[requestedVersion];\n\n if (publishedVersions.includes(requestedVersion)) {\n return requestedVersion;\n }\n\n if (taggedVersion !== undefined && publishedVersions.includes(taggedVersion)) {\n return taggedVersion;\n }\n\n if (!semver.validRange(requestedVersion)) {\n return undefined;\n }\n\n // A range asks for \"something in it\", not for one version: like the automatic choice, prefer a\n // version that is not deprecated and fits the app's Strapi, and like npm, prefer `latest`.\n const inRange = Object.values(packument.versions ?? {}).filter(\n (packumentVersion) =>\n semver.valid(packumentVersion.version) !== null &&\n semver.satisfies(packumentVersion.version, requestedVersion)\n );\n const notDeprecated = inRange.filter((packumentVersion) => !packumentVersion.deprecated);\n const fitting = notDeprecated.filter((packumentVersion) =>\n fitsStrapiVersion(packumentVersion, strapiVersion)\n );\n const pick = (candidates: PackumentVersion[]): string | undefined => {\n const versions = candidates.map((packumentVersion) => packumentVersion.version);\n const latestVersion = packument['dist-tags']?.latest;\n\n if (latestVersion !== undefined && versions.includes(latestVersion)) {\n return latestVersion;\n }\n\n return semver.maxSatisfying(versions, requestedVersion) ?? undefined;\n };\n\n return pick(fitting) ?? pick(notDeprecated) ?? pick(inRange);\n};\n\n/** The Strapi range a version requires, when the app's Strapi version is known not to fit it. */\nexport const findUnsupportedStrapiRange = (\n packument: Packument,\n version: string,\n strapiVersion: string | undefined\n): string | undefined => {\n const strapiRange = getStrapiRange(packument.versions?.[version]);\n\n if (!canCheckStrapiCompatibility(strapiVersion) || strapiRange === undefined) {\n return undefined;\n }\n\n return semver.satisfies(strapiVersion, strapiRange) ? undefined : strapiRange;\n};\n\n/** A prerelease, such as an experimental build, is usually ahead of the latest stable release. */\nexport const isPrerelease = (version: string): boolean => semver.prerelease(version) !== null;\n\n/**\n * True when semver lets the target break the installed version: a new major, or a new minor in 0.x,\n * as npm's `^` range reads it.\n */\nexport const isMajorUpgrade = (installedVersion: string, targetVersion: string): boolean =>\n semver.valid(installedVersion) !== null &&\n !semver.satisfies(targetVersion, `^${installedVersion}`);\n\n/** True when the target is newer than what is installed. A newer install is never downgraded. */\nexport const isUpgrade = (installedVersion: string, targetVersion: string): boolean =>\n semver.valid(installedVersion) === null || semver.gt(targetVersion, installedVersion);\n"],"names":["listNodeModulesDirectories","appDir","listAncestorDirectories","map","directory","path","join","readInstalledPackageJson","packageName","nodeModulesDirectory","packageJsonPath","fse","pathExists","readJson","catch","EnterpriseInstallError","undefined","readInstalledVersion","version","DEPENDENCY_FIELDS","readAppDependencyNames","packageJson","Set","flatMap","field","Object","keys","readAppDependencyVersion","has","canCheckStrapiCompatibility","strapiVersion","semver","valid","prerelease","getStrapiRange","packumentVersion","peerDependencies","STRAPI_PACKAGE_NAME","fitsStrapiVersion","strapiRange","satisfies","pickTargetVersion","packument","latestVersion","latest","versionCap","isPrerelease","stableVersions","values","versions","filter","deprecated","lte","sort","left","right","rcompare","newest","targetVersion","find","newestVersion","newestVersionStrapiRange","describeNewerIncompatibleVersion","installedVersion","gte","resolveRequestedVersion","requestedVersion","publishedVersions","taggedVersion","includes","validRange","inRange","notDeprecated","fitting","pick","candidates","maxSatisfying","findUnsupportedStrapiRange","isMajorUpgrade","isUpgrade","gt"],"mappings":"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"}
|