@strapi/strapi 5.56.0 → 5.58.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 (156) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/content-types/rename-field.d.ts +13 -0
  3. package/dist/cli/commands/content-types/rename-field.d.ts.map +1 -0
  4. package/dist/cli/commands/develop.d.ts.map +1 -1
  5. package/dist/cli/commands/enterprise/index.d.ts +7 -0
  6. package/dist/cli/commands/enterprise/index.d.ts.map +1 -0
  7. package/dist/cli/commands/enterprise/install/action.d.ts +36 -0
  8. package/dist/cli/commands/enterprise/install/action.d.ts.map +1 -0
  9. package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts +14 -0
  10. package/dist/cli/commands/enterprise/install/checklist-prompt.d.ts.map +1 -0
  11. package/dist/cli/commands/enterprise/install/constants.d.ts +7 -0
  12. package/dist/cli/commands/enterprise/install/constants.d.ts.map +1 -0
  13. package/dist/cli/commands/enterprise/install/directories.d.ts +3 -0
  14. package/dist/cli/commands/enterprise/install/directories.d.ts.map +1 -0
  15. package/dist/cli/commands/enterprise/install/discovery.d.ts +29 -0
  16. package/dist/cli/commands/enterprise/install/discovery.d.ts.map +1 -0
  17. package/dist/cli/commands/enterprise/install/errors.d.ts +11 -0
  18. package/dist/cli/commands/enterprise/install/errors.d.ts.map +1 -0
  19. package/dist/cli/commands/enterprise/install/install-packages.d.ts +11 -0
  20. package/dist/cli/commands/enterprise/install/install-packages.d.ts.map +1 -0
  21. package/dist/cli/commands/enterprise/install/license.d.ts +27 -0
  22. package/dist/cli/commands/enterprise/install/license.d.ts.map +1 -0
  23. package/dist/cli/commands/enterprise/install/package-manager.d.ts +17 -0
  24. package/dist/cli/commands/enterprise/install/package-manager.d.ts.map +1 -0
  25. package/dist/cli/commands/enterprise/install/plugin-status.d.ts +44 -0
  26. package/dist/cli/commands/enterprise/install/plugin-status.d.ts.map +1 -0
  27. package/dist/cli/commands/enterprise/install/registry-access.d.ts +55 -0
  28. package/dist/cli/commands/enterprise/install/registry-access.d.ts.map +1 -0
  29. package/dist/cli/commands/enterprise/install/registry.d.ts +54 -0
  30. package/dist/cli/commands/enterprise/install/registry.d.ts.map +1 -0
  31. package/dist/cli/commands/enterprise/install/selection.d.ts +62 -0
  32. package/dist/cli/commands/enterprise/install/selection.d.ts.map +1 -0
  33. package/dist/cli/commands/enterprise/install/setup-links.d.ts +16 -0
  34. package/dist/cli/commands/enterprise/install/setup-links.d.ts.map +1 -0
  35. package/dist/cli/commands/enterprise/install/versions.d.ts +42 -0
  36. package/dist/cli/commands/enterprise/install/versions.d.ts.map +1 -0
  37. package/dist/cli/commands/index.d.ts.map +1 -1
  38. package/dist/cli/utils/commander.d.ts.map +1 -1
  39. package/dist/cli/utils/helpers.d.ts +1 -1
  40. package/dist/cli/utils/helpers.d.ts.map +1 -1
  41. package/dist/node/vite/config.d.ts.map +1 -1
  42. package/dist/package.json.js +1 -1
  43. package/dist/package.json.mjs +1 -1
  44. package/dist/src/cli/commands/build.js +4 -2
  45. package/dist/src/cli/commands/build.js.map +1 -1
  46. package/dist/src/cli/commands/build.mjs +4 -2
  47. package/dist/src/cli/commands/build.mjs.map +1 -1
  48. package/dist/src/cli/commands/content-types/rename-field.js +63 -0
  49. package/dist/src/cli/commands/content-types/rename-field.js.map +1 -0
  50. package/dist/src/cli/commands/content-types/rename-field.mjs +54 -0
  51. package/dist/src/cli/commands/content-types/rename-field.mjs.map +1 -0
  52. package/dist/src/cli/commands/develop.js +4 -2
  53. package/dist/src/cli/commands/develop.js.map +1 -1
  54. package/dist/src/cli/commands/develop.mjs +4 -2
  55. package/dist/src/cli/commands/develop.mjs.map +1 -1
  56. package/dist/src/cli/commands/enterprise/index.js +17 -0
  57. package/dist/src/cli/commands/enterprise/index.js.map +1 -0
  58. package/dist/src/cli/commands/enterprise/index.mjs +15 -0
  59. package/dist/src/cli/commands/enterprise/index.mjs.map +1 -0
  60. package/dist/src/cli/commands/enterprise/install/action.js +253 -0
  61. package/dist/src/cli/commands/enterprise/install/action.js.map +1 -0
  62. package/dist/src/cli/commands/enterprise/install/action.mjs +244 -0
  63. package/dist/src/cli/commands/enterprise/install/action.mjs.map +1 -0
  64. package/dist/src/cli/commands/enterprise/install/checklist-prompt.js +117 -0
  65. package/dist/src/cli/commands/enterprise/install/checklist-prompt.js.map +1 -0
  66. package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs +110 -0
  67. package/dist/src/cli/commands/enterprise/install/checklist-prompt.mjs.map +1 -0
  68. package/dist/src/cli/commands/enterprise/install/constants.js +16 -0
  69. package/dist/src/cli/commands/enterprise/install/constants.js.map +1 -0
  70. package/dist/src/cli/commands/enterprise/install/constants.mjs +9 -0
  71. package/dist/src/cli/commands/enterprise/install/constants.mjs.map +1 -0
  72. package/dist/src/cli/commands/enterprise/install/directories.js +23 -0
  73. package/dist/src/cli/commands/enterprise/install/directories.js.map +1 -0
  74. package/dist/src/cli/commands/enterprise/install/directories.mjs +17 -0
  75. package/dist/src/cli/commands/enterprise/install/directories.mjs.map +1 -0
  76. package/dist/src/cli/commands/enterprise/install/discovery.js +109 -0
  77. package/dist/src/cli/commands/enterprise/install/discovery.js.map +1 -0
  78. package/dist/src/cli/commands/enterprise/install/discovery.mjs +104 -0
  79. package/dist/src/cli/commands/enterprise/install/discovery.mjs.map +1 -0
  80. package/dist/src/cli/commands/enterprise/install/errors.js +26 -0
  81. package/dist/src/cli/commands/enterprise/install/errors.js.map +1 -0
  82. package/dist/src/cli/commands/enterprise/install/errors.mjs +22 -0
  83. package/dist/src/cli/commands/enterprise/install/errors.mjs.map +1 -0
  84. package/dist/src/cli/commands/enterprise/install/install-packages.js +39 -0
  85. package/dist/src/cli/commands/enterprise/install/install-packages.js.map +1 -0
  86. package/dist/src/cli/commands/enterprise/install/install-packages.mjs +32 -0
  87. package/dist/src/cli/commands/enterprise/install/install-packages.mjs.map +1 -0
  88. package/dist/src/cli/commands/enterprise/install/license.js +144 -0
  89. package/dist/src/cli/commands/enterprise/install/license.js.map +1 -0
  90. package/dist/src/cli/commands/enterprise/install/license.mjs +132 -0
  91. package/dist/src/cli/commands/enterprise/install/license.mjs.map +1 -0
  92. package/dist/src/cli/commands/enterprise/install/package-manager.js +72 -0
  93. package/dist/src/cli/commands/enterprise/install/package-manager.js.map +1 -0
  94. package/dist/src/cli/commands/enterprise/install/package-manager.mjs +62 -0
  95. package/dist/src/cli/commands/enterprise/install/package-manager.mjs.map +1 -0
  96. package/dist/src/cli/commands/enterprise/install/plugin-status.js +47 -0
  97. package/dist/src/cli/commands/enterprise/install/plugin-status.js.map +1 -0
  98. package/dist/src/cli/commands/enterprise/install/plugin-status.mjs +45 -0
  99. package/dist/src/cli/commands/enterprise/install/plugin-status.mjs.map +1 -0
  100. package/dist/src/cli/commands/enterprise/install/registry-access.js +293 -0
  101. package/dist/src/cli/commands/enterprise/install/registry-access.js.map +1 -0
  102. package/dist/src/cli/commands/enterprise/install/registry-access.mjs +277 -0
  103. package/dist/src/cli/commands/enterprise/install/registry-access.mjs.map +1 -0
  104. package/dist/src/cli/commands/enterprise/install/registry.js +98 -0
  105. package/dist/src/cli/commands/enterprise/install/registry.js.map +1 -0
  106. package/dist/src/cli/commands/enterprise/install/registry.mjs +95 -0
  107. package/dist/src/cli/commands/enterprise/install/registry.mjs.map +1 -0
  108. package/dist/src/cli/commands/enterprise/install/selection.js +148 -0
  109. package/dist/src/cli/commands/enterprise/install/selection.js.map +1 -0
  110. package/dist/src/cli/commands/enterprise/install/selection.mjs +141 -0
  111. package/dist/src/cli/commands/enterprise/install/selection.mjs.map +1 -0
  112. package/dist/src/cli/commands/enterprise/install/setup-links.js +34 -0
  113. package/dist/src/cli/commands/enterprise/install/setup-links.js.map +1 -0
  114. package/dist/src/cli/commands/enterprise/install/setup-links.mjs +31 -0
  115. package/dist/src/cli/commands/enterprise/install/setup-links.mjs.map +1 -0
  116. package/dist/src/cli/commands/enterprise/install/versions.js +127 -0
  117. package/dist/src/cli/commands/enterprise/install/versions.js.map +1 -0
  118. package/dist/src/cli/commands/enterprise/install/versions.mjs +107 -0
  119. package/dist/src/cli/commands/enterprise/install/versions.mjs.map +1 -0
  120. package/dist/src/cli/commands/export/action.js +4 -4
  121. package/dist/src/cli/commands/export/action.js.map +1 -1
  122. package/dist/src/cli/commands/export/action.mjs +2 -2
  123. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  124. package/dist/src/cli/commands/import/action.js +2 -2
  125. package/dist/src/cli/commands/import/action.js.map +1 -1
  126. package/dist/src/cli/commands/import/action.mjs +1 -1
  127. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  128. package/dist/src/cli/commands/index.js +4 -0
  129. package/dist/src/cli/commands/index.js.map +1 -1
  130. package/dist/src/cli/commands/index.mjs +24 -20
  131. package/dist/src/cli/commands/index.mjs.map +1 -1
  132. package/dist/src/cli/commands/routes/list.js +2 -2
  133. package/dist/src/cli/commands/routes/list.js.map +1 -1
  134. package/dist/src/cli/commands/routes/list.mjs +1 -1
  135. package/dist/src/cli/commands/routes/list.mjs.map +1 -1
  136. package/dist/src/cli/commands/transfer/action.js +2 -2
  137. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  138. package/dist/src/cli/commands/transfer/action.mjs +1 -1
  139. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  140. package/dist/src/cli/utils/commander.js +1 -2
  141. package/dist/src/cli/utils/commander.js.map +1 -1
  142. package/dist/src/cli/utils/commander.mjs +1 -2
  143. package/dist/src/cli/utils/commander.mjs.map +1 -1
  144. package/dist/src/cli/utils/data-transfer.js +2 -2
  145. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  146. package/dist/src/cli/utils/data-transfer.mjs +2 -2
  147. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  148. package/dist/src/cli/utils/helpers.js +6 -6
  149. package/dist/src/cli/utils/helpers.js.map +1 -1
  150. package/dist/src/cli/utils/helpers.mjs +4 -4
  151. package/dist/src/cli/utils/helpers.mjs.map +1 -1
  152. package/dist/src/node/vite/config.js +0 -1
  153. package/dist/src/node/vite/config.js.map +1 -1
  154. package/dist/src/node/vite/config.mjs +0 -1
  155. package/dist/src/node/vite/config.mjs.map +1 -1
  156. package/package.json +23 -23
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-access.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/registry-access.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\n\nimport type { Logger } from '../../../utils/logger';\nimport { ENTERPRISE_REGISTRY_URL, ENTERPRISE_SCOPE } from './constants';\nimport { EnterpriseInstallError } from './errors';\nimport { listAncestorDirectories } from './directories';\nimport type { ResolvedLicense } from './license';\nimport { readsYarnrcYml, type DetectedPackageManager } from './package-manager';\n\nconst SCOPE_REGISTRY_KEY = `${ENTERPRISE_SCOPE}:registry`;\nconst YARNRC_SCOPE_NAME = ENTERPRISE_SCOPE.slice(1);\nconst LICENSE_PLACEHOLDER = '<your license>';\n\n// References the package manager expands when it reads the file, so the license stays off disk.\n// Yarn 2+ fails every command on the machine when a referenced variable is unset, unless it has a\n// default. `.npmrc` has no form that works everywhere: an unset variable breaks every Yarn 1\n// command and makes pnpm warn on each one, and npm, pnpm and Yarn 1 share `~/.npmrc`.\n/* eslint-disable no-template-curly-in-string */\nconst NPMRC_LICENSE_REFERENCE = '${STRAPI_LICENSE}';\nconst YARNRC_LICENSE_REFERENCE = '${STRAPI_LICENSE:-}';\n/* eslint-enable no-template-curly-in-string */\n\nconst shouldReferenceLicense = (\n licenseSource: ResolvedLicense['source'],\n env: NodeJS.ProcessEnv\n): boolean => licenseSource === 'environment' && Boolean(env.CI) && env.CI !== 'false';\n\ntype ConfiguredStatus =\n | 'already-configured'\n | 'uses-environment-variable'\n | 'different-license'\n | 'manual-edit-needed';\n\nexport type RegistryAccessOutcome = {\n filePath: string;\n /** The configuration the file should contain, with a placeholder instead of the license. */\n expectedConfiguration: string;\n yarnrcScope?: 'missing' | 'present';\n} & (\n | { status: ConfiguredStatus }\n /** `linesToAdd` holds the license, or a reference to it. */\n | { status: 'not-configured'; linesToAdd: string }\n);\n\nexport interface ConfiguredRegistry {\n /** Always ends with a slash, as npm expects for a scope registry. */\n url: string;\n host: string;\n /** The npm key holding the token for this registry, such as `//packages.strapi.io/:_authToken`. */\n tokenKey: string;\n}\n\nexport const describeRegistry = (registryUrl: string): ConfiguredRegistry => {\n const url = new URL(`${registryUrl.replace(/\\/+$/, '')}/`);\n\n return { url: url.href, host: url.host, tokenKey: `//${url.host}${url.pathname}:_authToken` };\n};\n\nexport const buildNpmrcConfiguration = (token: string, registry: ConfiguredRegistry): string =>\n [`${SCOPE_REGISTRY_KEY}=${registry.url}`, `${registry.tokenKey}=${token}`].join('\\n');\n\nconst buildYarnrcScopeConfiguration = (token: string, registry: ConfiguredRegistry): string =>\n [\n ` ${YARNRC_SCOPE_NAME}:`,\n ` npmRegistryServer: '${registry.url}'`,\n ' npmAlwaysAuth: true',\n ` npmAuthToken: '${token}'`,\n ].join('\\n');\n\nexport const buildYarnrcConfiguration = (token: string, registry: ConfiguredRegistry): string =>\n ['npmScopes:', buildYarnrcScopeConfiguration(token, registry)].join('\\n');\n\nexport const getUserNpmrcPath = (env: NodeJS.ProcessEnv, homeDir: string): string =>\n env.NPM_CONFIG_USERCONFIG ?? env.npm_config_userconfig ?? path.join(homeDir, '.npmrc');\n\nexport const getUserYarnrcPath = (homeDir: string): string => path.join(homeDir, '.yarnrc.yml');\n\nconst readFileIfExists = async (filePath: string): Promise<string> =>\n (await fse.pathExists(filePath)) ? fse.readFile(filePath, 'utf8') : '';\n\nconst appendToFile = async (filePath: string, text: string) => {\n const existingContent = await readFileIfExists(filePath);\n const separator = existingContent.length > 0 && !existingContent.endsWith('\\n') ? '\\n' : '';\n\n await fse.ensureDir(path.dirname(filePath));\n await fse.appendFile(filePath, `${separator}${text}\\n`);\n // The file may now hold the license. A mode passed when writing only applies to a new file, so\n // an existing one is restricted to its owner explicitly, as npm does when it saves this file.\n await fse.chmod(filePath, 0o600);\n};\n\nconst unquote = (value: string): string => value.replace(/^(['\"])(.*)\\1$/, '$2');\n\nconst parseNpmrc = (content: string): Map<string, string> =>\n new Map(\n content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith('#') && !line.startsWith(';'))\n .map((line): [string, string] => {\n const separatorIndex = line.indexOf('=');\n\n return separatorIndex === -1\n ? [line, '']\n : [line.slice(0, separatorIndex).trim(), unquote(line.slice(separatorIndex + 1).trim())];\n })\n );\n\nconst withoutTrailingSlash = (url: string | undefined) => url?.replace(/\\/+$/, '');\n\nconst isEnvironmentVariableReference = (value: string | undefined): boolean =>\n value?.startsWith('${') ?? false;\n\nexport const inspectNpmrc = async (\n filePath: string,\n license: string,\n registry: ConfiguredRegistry,\n writtenToken: string\n): Promise<RegistryAccessOutcome> => {\n const content = await readFileIfExists(filePath);\n const entries = parseNpmrc(content);\n const scopeRegistry = entries.get(SCOPE_REGISTRY_KEY);\n const registryToken = entries.get(registry.tokenKey);\n const outcome = (status: ConfiguredStatus): RegistryAccessOutcome => ({\n status,\n filePath,\n expectedConfiguration: buildNpmrcConfiguration(LICENSE_PLACEHOLDER, registry),\n });\n\n if (scopeRegistry === undefined && registryToken === undefined) {\n return {\n status: 'not-configured',\n filePath,\n expectedConfiguration: buildNpmrcConfiguration(LICENSE_PLACEHOLDER, registry),\n linesToAdd: buildNpmrcConfiguration(writtenToken, registry),\n };\n }\n\n const isScopeRegistryCorrect =\n withoutTrailingSlash(scopeRegistry) === withoutTrailingSlash(registry.url);\n\n if (isEnvironmentVariableReference(registryToken)) {\n return outcome(isScopeRegistryCorrect ? 'uses-environment-variable' : 'manual-edit-needed');\n }\n\n if (registryToken === license && isScopeRegistryCorrect) {\n return outcome('already-configured');\n }\n\n if (registryToken !== undefined && registryToken !== license) {\n return outcome('different-license');\n }\n\n return outcome('manual-edit-needed');\n};\n\nconst indentationOf = (line: string) => line.search(/\\S/);\n\nconst isYarnrcContentLine = (line: string) => line.trim() !== '' && !line.trim().startsWith('#');\n\nconst readYarnrcKey = (line: string): string | undefined =>\n /^\\s*([\"']?)([^\"':]+(?::\\/\\/[^\"']+)?)\\1\\s*:/.exec(line)?.[2];\n\nconst readYarnrcEntry = (\n content: string,\n topLevelKey: string,\n isWantedEntry: (entryKey: string) => boolean\n): Map<string, string> | undefined => {\n const lines = content.split(/\\r?\\n/);\n const topLevelIndex = lines.findIndex((line) =>\n new RegExp(`^${topLevelKey}\\\\s*:\\\\s*(#.*)?$`).test(line)\n );\n\n if (topLevelIndex === -1) {\n return undefined;\n }\n\n let entryIndentation: number | undefined;\n let settings: Map<string, string> | undefined;\n\n for (const line of lines.slice(topLevelIndex + 1).filter(isYarnrcContentLine)) {\n const indentation = indentationOf(line);\n\n if (indentation === 0) {\n break;\n }\n\n entryIndentation ??= indentation;\n\n if (indentation <= entryIndentation) {\n if (settings) {\n break;\n }\n\n const entryKey = readYarnrcKey(line);\n settings = entryKey !== undefined && isWantedEntry(entryKey) ? new Map() : undefined;\n } else if (settings) {\n const settingMatch = /^\\s*([A-Za-z]+)\\s*:\\s*(.*)$/.exec(line);\n\n if (settingMatch) {\n settings.set(settingMatch[1], unquote(settingMatch[2].trim()));\n }\n }\n }\n\n return settings;\n};\n\nconst readYarnrcScope = (content: string) =>\n readYarnrcEntry(content, 'npmScopes', (entryKey) => entryKey === YARNRC_SCOPE_NAME);\n\nconst readYarnrcToken = (content: string, registry: ConfiguredRegistry): string | undefined => {\n const normalize = (url: string) => withoutTrailingSlash(url.replace(/^https?:/, ''));\n const registryEntry = readYarnrcEntry(\n content,\n 'npmRegistries',\n (entryKey) => normalize(entryKey) === normalize(registry.url)\n );\n\n return readYarnrcScope(content)?.get('npmAuthToken') ?? registryEntry?.get('npmAuthToken');\n};\n\nexport const inspectYarnrc = async (\n filePath: string,\n license: string,\n registry: ConfiguredRegistry,\n writtenToken: string\n): Promise<RegistryAccessOutcome> => {\n const content = await readFileIfExists(filePath);\n const scope = readYarnrcScope(content);\n const outcome = (status: ConfiguredStatus): RegistryAccessOutcome => ({\n status,\n filePath,\n expectedConfiguration: buildYarnrcScopeConfiguration(LICENSE_PLACEHOLDER, registry),\n yarnrcScope: scope === undefined ? 'missing' : 'present',\n });\n\n if (!/^npmScopes\\s*:/m.test(content)) {\n return {\n status: 'not-configured',\n filePath,\n expectedConfiguration: buildYarnrcConfiguration(LICENSE_PLACEHOLDER, registry),\n linesToAdd: buildYarnrcConfiguration(writtenToken, registry),\n };\n }\n\n if (scope === undefined) {\n return outcome('manual-edit-needed');\n }\n\n const token = readYarnrcToken(content, registry);\n const isScopeRegistryCorrect =\n withoutTrailingSlash(scope.get('npmRegistryServer')) === withoutTrailingSlash(registry.url);\n\n if (isEnvironmentVariableReference(token)) {\n // A reference only works once the scope points to the registry.\n return outcome(isScopeRegistryCorrect ? 'uses-environment-variable' : 'manual-edit-needed');\n }\n\n if (token !== undefined && token !== license) {\n return outcome('different-license');\n }\n\n // The license may be set for another registry, such as a local one used for testing.\n return outcome(\n token === license && isScopeRegistryCorrect ? 'already-configured' : 'manual-edit-needed'\n );\n};\n\nconst describeManualEdit = (yarnrcScope: RegistryAccessOutcome['yarnrcScope']): string => {\n if (yarnrcScope === 'present') {\n return `Replace its ${YARNRC_SCOPE_NAME} scope with this`;\n }\n\n return yarnrcScope === 'missing' ? 'Add this under its existing npmScopes key' : 'Add this to it';\n};\n\nconst assertRegistryAccessUsable = ({\n outcome: { status, filePath, expectedConfiguration, yarnrcScope },\n overridingFiles,\n registryHost,\n userConfigPath,\n}: {\n outcome: RegistryAccessOutcome;\n overridingFiles: string[];\n registryHost: string;\n userConfigPath: string;\n}): void => {\n if (status === 'different-license') {\n const replacedLines = yarnrcScope ? `its ${YARNRC_SCOPE_NAME} scope` : 'those lines';\n\n throw new EnterpriseInstallError(\n `${filePath} already sets up ${registryHost} with another license, so installing would fail. Replace ${replacedLines} with:\\n\\n${expectedConfiguration}\\n`\n );\n }\n\n if (status === 'manual-edit-needed') {\n throw new EnterpriseInstallError(\n `${filePath} could not be updated automatically. ${describeManualEdit(yarnrcScope)}, then run the command again:\\n\\n${expectedConfiguration}\\n`\n );\n }\n\n if (overridingFiles.length > 0) {\n throw new EnterpriseInstallError(\n [\n ...overridingFiles.map(\n (filePath) =>\n `${filePath} sets another license for ${registryHost} and takes precedence over ${userConfigPath}.`\n ),\n 'Update or remove that line, then run the command again.',\n ].join('\\n')\n );\n }\n};\n\nconst isWorkspaceRoot = async (directory: string): Promise<boolean> => {\n if (await fse.pathExists(path.join(directory, 'pnpm-workspace.yaml'))) {\n return true;\n }\n\n try {\n const packageJson = await fse.readJson(path.join(directory, 'package.json'));\n return packageJson?.workspaces !== undefined;\n } catch {\n return false;\n }\n};\n\nexport const listProjectConfigDirectories = async (\n appDir: string,\n packageManager: DetectedPackageManager\n): Promise<string[]> => {\n const [appDirectory, ...parentDirectories] = listAncestorDirectories(appDir);\n\n if (packageManager.name === 'yarn') {\n return [appDirectory, ...parentDirectories];\n }\n\n for (const directory of parentDirectories) {\n if (await isWorkspaceRoot(directory)) {\n return [directory];\n }\n }\n\n return [appDirectory];\n};\n\nexport const findOverridingConfigFiles = async ({\n appDir,\n packageManager,\n userConfigPaths,\n license,\n registry,\n}: {\n appDir: string;\n packageManager: DetectedPackageManager;\n userConfigPaths: string[];\n license: string;\n registry: ConfiguredRegistry;\n}): Promise<string[]> => {\n const usesYarnrcYml = readsYarnrcYml(packageManager);\n const fileName = usesYarnrcYml ? '.yarnrc.yml' : '.npmrc';\n const skippedPaths = new Set(userConfigPaths.map((filePath) => path.resolve(filePath)));\n const overridingFiles: string[] = [];\n\n for (const directory of await listProjectConfigDirectories(appDir, packageManager)) {\n const filePath = path.join(directory, fileName);\n\n if (skippedPaths.has(filePath)) {\n continue;\n }\n\n const content = await readFileIfExists(filePath);\n const token = usesYarnrcYml\n ? readYarnrcToken(content, registry)\n : parseNpmrc(content).get(registry.tokenKey);\n\n if (token !== undefined && token !== license && !isEnvironmentVariableReference(token)) {\n overridingFiles.push(filePath);\n }\n }\n\n return overridingFiles;\n};\n\nexport interface RegistryAccess {\n outcome: RegistryAccessOutcome;\n /** Adds the setup when it is missing. Called once the registry has accepted the license. */\n apply: () => Promise<void>;\n}\n\nexport const prepareRegistryAccess = async ({\n appDir,\n packageManager,\n license,\n licenseSource,\n logger,\n env,\n homeDir,\n}: {\n appDir: string;\n packageManager: DetectedPackageManager;\n license: string;\n licenseSource: ResolvedLicense['source'];\n logger: Logger;\n env: NodeJS.ProcessEnv;\n homeDir: string;\n}): Promise<RegistryAccess> => {\n const registry = describeRegistry(ENTERPRISE_REGISTRY_URL);\n const usesYarnrcYml = readsYarnrcYml(packageManager);\n const userConfigPath = usesYarnrcYml\n ? getUserYarnrcPath(homeDir)\n : getUserNpmrcPath(env, homeDir);\n const referencesLicense = shouldReferenceLicense(licenseSource, env);\n const licenseReference = usesYarnrcYml ? YARNRC_LICENSE_REFERENCE : NPMRC_LICENSE_REFERENCE;\n const writtenToken = referencesLicense ? licenseReference : license;\n const outcome = usesYarnrcYml\n ? await inspectYarnrc(userConfigPath, license, registry, writtenToken)\n : await inspectNpmrc(userConfigPath, license, registry, writtenToken);\n const overridingFiles = await findOverridingConfigFiles({\n appDir,\n packageManager,\n userConfigPaths: [userConfigPath, path.join(homeDir, usesYarnrcYml ? '.yarnrc.yml' : '.npmrc')],\n license,\n registry,\n });\n\n assertRegistryAccessUsable({\n outcome,\n overridingFiles,\n registryHost: registry.host,\n userConfigPath,\n });\n\n if (outcome.status === 'already-configured') {\n logger.info(`Access to ${registry.host} is already configured in ${userConfigPath}.`);\n }\n\n if (outcome.status === 'uses-environment-variable') {\n logger.info(\n `${userConfigPath} reads the ${registry.host} token from an environment variable. Make sure it holds your Strapi license.`\n );\n }\n\n return {\n outcome,\n async apply() {\n if (outcome.status !== 'not-configured') {\n return;\n }\n\n await appendToFile(userConfigPath, outcome.linesToAdd);\n logger.success(\n referencesLicense\n ? `Configured access to ${registry.host} in ${userConfigPath}, reading the license from STRAPI_LICENSE.`\n : `Configured access to ${registry.host} in ${userConfigPath}.`\n );\n },\n };\n};\n"],"names":["SCOPE_REGISTRY_KEY","ENTERPRISE_SCOPE","YARNRC_SCOPE_NAME","slice","LICENSE_PLACEHOLDER","NPMRC_LICENSE_REFERENCE","YARNRC_LICENSE_REFERENCE","shouldReferenceLicense","licenseSource","env","Boolean","CI","describeRegistry","registryUrl","url","URL","replace","href","host","tokenKey","pathname","buildNpmrcConfiguration","token","registry","join","buildYarnrcScopeConfiguration","buildYarnrcConfiguration","getUserNpmrcPath","homeDir","NPM_CONFIG_USERCONFIG","npm_config_userconfig","path","getUserYarnrcPath","readFileIfExists","filePath","fse","pathExists","readFile","appendToFile","text","existingContent","separator","length","endsWith","ensureDir","dirname","appendFile","chmod","unquote","value","parseNpmrc","content","Map","split","map","line","trim","filter","startsWith","separatorIndex","indexOf","withoutTrailingSlash","isEnvironmentVariableReference","inspectNpmrc","license","writtenToken","entries","scopeRegistry","get","registryToken","outcome","status","expectedConfiguration","undefined","linesToAdd","isScopeRegistryCorrect","indentationOf","search","isYarnrcContentLine","readYarnrcKey","exec","readYarnrcEntry","topLevelKey","isWantedEntry","lines","topLevelIndex","findIndex","RegExp","test","entryIndentation","settings","indentation","entryKey","settingMatch","set","readYarnrcScope","readYarnrcToken","normalize","registryEntry","inspectYarnrc","scope","yarnrcScope","describeManualEdit","assertRegistryAccessUsable","overridingFiles","registryHost","userConfigPath","replacedLines","EnterpriseInstallError","isWorkspaceRoot","directory","packageJson","readJson","workspaces","listProjectConfigDirectories","appDir","packageManager","appDirectory","parentDirectories","listAncestorDirectories","name","findOverridingConfigFiles","userConfigPaths","usesYarnrcYml","readsYarnrcYml","fileName","skippedPaths","Set","resolve","has","push","prepareRegistryAccess","logger","ENTERPRISE_REGISTRY_URL","referencesLicense","licenseReference","info","apply","success"],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ var constants = require('./constants.js');
4
+
5
+ const REQUEST_TIMEOUT_MS = 15 * 1000;
6
+ const SEARCH_PAGE_SIZE = 250;
7
+ const REGISTRY_URL = constants.ENTERPRISE_REGISTRY_URL.replace(/\/+$/, '');
8
+ const authorizationHeader = (license)=>({
9
+ Authorization: `Bearer ${license}`
10
+ });
11
+ const describeRejectedLicense = (registryUrl)=>`${registryUrl} rejected this Strapi license. Check it at ${constants.BILLING_URL}`;
12
+ const searchPackageNames = async ({ text, license, fetchImplementation })=>{
13
+ const registryUrl = REGISTRY_URL;
14
+ const searchUrl = `${registryUrl}/-/v1/search?text=${encodeURIComponent(text)}&size=${SEARCH_PAGE_SIZE}`;
15
+ try {
16
+ const response = await fetchImplementation(searchUrl, {
17
+ headers: authorizationHeader(license),
18
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
19
+ });
20
+ if (response.status === 401) {
21
+ return {
22
+ status: 'license-rejected',
23
+ message: describeRejectedLicense(registryUrl)
24
+ };
25
+ }
26
+ if (!response.ok) {
27
+ return {
28
+ status: 'unavailable'
29
+ };
30
+ }
31
+ const { objects } = await response.json();
32
+ const packageNames = (objects ?? []).map((searchResult)=>searchResult.package?.name).filter((packageName)=>typeof packageName === 'string');
33
+ return {
34
+ status: 'available',
35
+ packageNames
36
+ };
37
+ } catch {
38
+ return {
39
+ status: 'unavailable'
40
+ };
41
+ }
42
+ };
43
+ const fetchPackument = async ({ packageName, license, fetchImplementation })=>{
44
+ const registryUrl = REGISTRY_URL;
45
+ let response;
46
+ try {
47
+ // `@scope/name` as is: the Strapi registry redirects `@scope%2fname` to it.
48
+ response = await fetchImplementation(`${registryUrl}/${packageName}`, {
49
+ headers: {
50
+ ...authorizationHeader(license),
51
+ Accept: 'application/json'
52
+ },
53
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
54
+ });
55
+ } catch {
56
+ return {
57
+ status: 'unavailable',
58
+ message: `Could not reach ${registryUrl}. Check your network connection and try again.`
59
+ };
60
+ }
61
+ if (response.status === 401) {
62
+ return {
63
+ status: 'license-rejected',
64
+ message: describeRejectedLicense(registryUrl)
65
+ };
66
+ }
67
+ if (response.status === 403) {
68
+ return {
69
+ status: 'not-licensed'
70
+ };
71
+ }
72
+ if (response.status === 404) {
73
+ return {
74
+ status: 'not-found'
75
+ };
76
+ }
77
+ if (!response.ok) {
78
+ return {
79
+ status: 'unavailable',
80
+ message: `${registryUrl} answered HTTP ${response.status} for ${packageName}. Try again later.`
81
+ };
82
+ }
83
+ const packument = await response.json().catch(()=>undefined);
84
+ if (typeof packument !== 'object' || packument === null) {
85
+ return {
86
+ status: 'unavailable',
87
+ message: `${registryUrl} answered with invalid data for ${packageName}. Try again later.`
88
+ };
89
+ }
90
+ return {
91
+ status: 'available',
92
+ packument: packument
93
+ };
94
+ };
95
+
96
+ exports.fetchPackument = fetchPackument;
97
+ exports.searchPackageNames = searchPackageNames;
98
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sources":["../../../../../../src/cli/commands/enterprise/install/registry.ts"],"sourcesContent":["import { BILLING_URL, ENTERPRISE_REGISTRY_URL } from './constants';\n\nconst REQUEST_TIMEOUT_MS = 15 * 1000;\nconst SEARCH_PAGE_SIZE = 250;\n\nexport interface StrapiPackageMetadata {\n name?: string;\n displayName?: string;\n description?: string;\n kind?: string;\n}\n\nexport interface PackumentVersion {\n version: string;\n description?: string;\n deprecated?: string;\n peerDependencies?: Record<string, string>;\n strapi?: StrapiPackageMetadata;\n}\n\nexport interface Packument {\n name: string;\n 'dist-tags'?: Record<string, string>;\n versions?: Record<string, PackumentVersion>;\n}\n\nexport type PackumentLookup =\n | { status: 'available'; packument: Packument }\n | { status: 'license-rejected'; message: string }\n | { status: 'not-licensed' }\n | { status: 'not-found' }\n | { status: 'unavailable'; message: string };\n\nconst REGISTRY_URL = ENTERPRISE_REGISTRY_URL.replace(/\\/+$/, '');\n\nconst authorizationHeader = (license: string) => ({ Authorization: `Bearer ${license}` });\n\nconst describeRejectedLicense = (registryUrl: string) =>\n `${registryUrl} rejected this Strapi license. Check it at ${BILLING_URL}`;\n\nexport type SearchResult =\n | { status: 'available'; packageNames: string[] }\n | { status: 'license-rejected'; message: string }\n /** The search could not be reached, failed, or answered with invalid data. */\n | { status: 'unavailable' };\n\nexport const searchPackageNames = async ({\n text,\n license,\n fetchImplementation,\n}: {\n text: string;\n license: string;\n fetchImplementation: typeof fetch;\n}): Promise<SearchResult> => {\n const registryUrl = REGISTRY_URL;\n const searchUrl = `${registryUrl}/-/v1/search?text=${encodeURIComponent(text)}&size=${SEARCH_PAGE_SIZE}`;\n\n try {\n const response = await fetchImplementation(searchUrl, {\n headers: authorizationHeader(license),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n\n if (response.status === 401) {\n return { status: 'license-rejected', message: describeRejectedLicense(registryUrl) };\n }\n\n if (!response.ok) {\n return { status: 'unavailable' };\n }\n\n const { objects } = (await response.json()) as {\n objects?: Array<{ package?: { name?: unknown } }>;\n };\n\n const packageNames = (objects ?? [])\n .map((searchResult) => searchResult.package?.name)\n .filter((packageName): packageName is string => typeof packageName === 'string');\n\n return { status: 'available', packageNames };\n } catch {\n return { status: 'unavailable' };\n }\n};\n\nexport const fetchPackument = async ({\n packageName,\n license,\n fetchImplementation,\n}: {\n packageName: string;\n license: string;\n fetchImplementation: typeof fetch;\n}): Promise<PackumentLookup> => {\n const registryUrl = REGISTRY_URL;\n let response: Response;\n\n try {\n // `@scope/name` as is: the Strapi registry redirects `@scope%2fname` to it.\n response = await fetchImplementation(`${registryUrl}/${packageName}`, {\n headers: { ...authorizationHeader(license), Accept: 'application/json' },\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n } catch {\n return {\n status: 'unavailable',\n message: `Could not reach ${registryUrl}. Check your network connection and try again.`,\n };\n }\n\n if (response.status === 401) {\n return {\n status: 'license-rejected',\n message: describeRejectedLicense(registryUrl),\n };\n }\n\n if (response.status === 403) {\n return { status: 'not-licensed' };\n }\n\n if (response.status === 404) {\n return { status: 'not-found' };\n }\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n message: `${registryUrl} answered HTTP ${response.status} for ${packageName}. Try again later.`,\n };\n }\n\n const packument: unknown = await response.json().catch(() => undefined);\n\n if (typeof packument !== 'object' || packument === null) {\n return {\n status: 'unavailable',\n message: `${registryUrl} answered with invalid data for ${packageName}. Try again later.`,\n };\n }\n\n return { status: 'available', packument: packument as Packument };\n};\n"],"names":["REQUEST_TIMEOUT_MS","SEARCH_PAGE_SIZE","REGISTRY_URL","ENTERPRISE_REGISTRY_URL","replace","authorizationHeader","license","Authorization","describeRejectedLicense","registryUrl","BILLING_URL","searchPackageNames","text","fetchImplementation","searchUrl","encodeURIComponent","response","headers","signal","AbortSignal","timeout","status","message","ok","objects","json","packageNames","map","searchResult","package","name","filter","packageName","fetchPackument","Accept","packument","catch","undefined"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { ENTERPRISE_REGISTRY_URL, BILLING_URL } from './constants.mjs';
2
+
3
+ const REQUEST_TIMEOUT_MS = 15 * 1000;
4
+ const SEARCH_PAGE_SIZE = 250;
5
+ const REGISTRY_URL = ENTERPRISE_REGISTRY_URL.replace(/\/+$/, '');
6
+ const authorizationHeader = (license)=>({
7
+ Authorization: `Bearer ${license}`
8
+ });
9
+ const describeRejectedLicense = (registryUrl)=>`${registryUrl} rejected this Strapi license. Check it at ${BILLING_URL}`;
10
+ const searchPackageNames = async ({ text, license, fetchImplementation })=>{
11
+ const registryUrl = REGISTRY_URL;
12
+ const searchUrl = `${registryUrl}/-/v1/search?text=${encodeURIComponent(text)}&size=${SEARCH_PAGE_SIZE}`;
13
+ try {
14
+ const response = await fetchImplementation(searchUrl, {
15
+ headers: authorizationHeader(license),
16
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
17
+ });
18
+ if (response.status === 401) {
19
+ return {
20
+ status: 'license-rejected',
21
+ message: describeRejectedLicense(registryUrl)
22
+ };
23
+ }
24
+ if (!response.ok) {
25
+ return {
26
+ status: 'unavailable'
27
+ };
28
+ }
29
+ const { objects } = await response.json();
30
+ const packageNames = (objects ?? []).map((searchResult)=>searchResult.package?.name).filter((packageName)=>typeof packageName === 'string');
31
+ return {
32
+ status: 'available',
33
+ packageNames
34
+ };
35
+ } catch {
36
+ return {
37
+ status: 'unavailable'
38
+ };
39
+ }
40
+ };
41
+ const fetchPackument = async ({ packageName, license, fetchImplementation })=>{
42
+ const registryUrl = REGISTRY_URL;
43
+ let response;
44
+ try {
45
+ // `@scope/name` as is: the Strapi registry redirects `@scope%2fname` to it.
46
+ response = await fetchImplementation(`${registryUrl}/${packageName}`, {
47
+ headers: {
48
+ ...authorizationHeader(license),
49
+ Accept: 'application/json'
50
+ },
51
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
52
+ });
53
+ } catch {
54
+ return {
55
+ status: 'unavailable',
56
+ message: `Could not reach ${registryUrl}. Check your network connection and try again.`
57
+ };
58
+ }
59
+ if (response.status === 401) {
60
+ return {
61
+ status: 'license-rejected',
62
+ message: describeRejectedLicense(registryUrl)
63
+ };
64
+ }
65
+ if (response.status === 403) {
66
+ return {
67
+ status: 'not-licensed'
68
+ };
69
+ }
70
+ if (response.status === 404) {
71
+ return {
72
+ status: 'not-found'
73
+ };
74
+ }
75
+ if (!response.ok) {
76
+ return {
77
+ status: 'unavailable',
78
+ message: `${registryUrl} answered HTTP ${response.status} for ${packageName}. Try again later.`
79
+ };
80
+ }
81
+ const packument = await response.json().catch(()=>undefined);
82
+ if (typeof packument !== 'object' || packument === null) {
83
+ return {
84
+ status: 'unavailable',
85
+ message: `${registryUrl} answered with invalid data for ${packageName}. Try again later.`
86
+ };
87
+ }
88
+ return {
89
+ status: 'available',
90
+ packument: packument
91
+ };
92
+ };
93
+
94
+ export { fetchPackument, searchPackageNames };
95
+ //# sourceMappingURL=registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/registry.ts"],"sourcesContent":["import { BILLING_URL, ENTERPRISE_REGISTRY_URL } from './constants';\n\nconst REQUEST_TIMEOUT_MS = 15 * 1000;\nconst SEARCH_PAGE_SIZE = 250;\n\nexport interface StrapiPackageMetadata {\n name?: string;\n displayName?: string;\n description?: string;\n kind?: string;\n}\n\nexport interface PackumentVersion {\n version: string;\n description?: string;\n deprecated?: string;\n peerDependencies?: Record<string, string>;\n strapi?: StrapiPackageMetadata;\n}\n\nexport interface Packument {\n name: string;\n 'dist-tags'?: Record<string, string>;\n versions?: Record<string, PackumentVersion>;\n}\n\nexport type PackumentLookup =\n | { status: 'available'; packument: Packument }\n | { status: 'license-rejected'; message: string }\n | { status: 'not-licensed' }\n | { status: 'not-found' }\n | { status: 'unavailable'; message: string };\n\nconst REGISTRY_URL = ENTERPRISE_REGISTRY_URL.replace(/\\/+$/, '');\n\nconst authorizationHeader = (license: string) => ({ Authorization: `Bearer ${license}` });\n\nconst describeRejectedLicense = (registryUrl: string) =>\n `${registryUrl} rejected this Strapi license. Check it at ${BILLING_URL}`;\n\nexport type SearchResult =\n | { status: 'available'; packageNames: string[] }\n | { status: 'license-rejected'; message: string }\n /** The search could not be reached, failed, or answered with invalid data. */\n | { status: 'unavailable' };\n\nexport const searchPackageNames = async ({\n text,\n license,\n fetchImplementation,\n}: {\n text: string;\n license: string;\n fetchImplementation: typeof fetch;\n}): Promise<SearchResult> => {\n const registryUrl = REGISTRY_URL;\n const searchUrl = `${registryUrl}/-/v1/search?text=${encodeURIComponent(text)}&size=${SEARCH_PAGE_SIZE}`;\n\n try {\n const response = await fetchImplementation(searchUrl, {\n headers: authorizationHeader(license),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n\n if (response.status === 401) {\n return { status: 'license-rejected', message: describeRejectedLicense(registryUrl) };\n }\n\n if (!response.ok) {\n return { status: 'unavailable' };\n }\n\n const { objects } = (await response.json()) as {\n objects?: Array<{ package?: { name?: unknown } }>;\n };\n\n const packageNames = (objects ?? [])\n .map((searchResult) => searchResult.package?.name)\n .filter((packageName): packageName is string => typeof packageName === 'string');\n\n return { status: 'available', packageNames };\n } catch {\n return { status: 'unavailable' };\n }\n};\n\nexport const fetchPackument = async ({\n packageName,\n license,\n fetchImplementation,\n}: {\n packageName: string;\n license: string;\n fetchImplementation: typeof fetch;\n}): Promise<PackumentLookup> => {\n const registryUrl = REGISTRY_URL;\n let response: Response;\n\n try {\n // `@scope/name` as is: the Strapi registry redirects `@scope%2fname` to it.\n response = await fetchImplementation(`${registryUrl}/${packageName}`, {\n headers: { ...authorizationHeader(license), Accept: 'application/json' },\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n } catch {\n return {\n status: 'unavailable',\n message: `Could not reach ${registryUrl}. Check your network connection and try again.`,\n };\n }\n\n if (response.status === 401) {\n return {\n status: 'license-rejected',\n message: describeRejectedLicense(registryUrl),\n };\n }\n\n if (response.status === 403) {\n return { status: 'not-licensed' };\n }\n\n if (response.status === 404) {\n return { status: 'not-found' };\n }\n\n if (!response.ok) {\n return {\n status: 'unavailable',\n message: `${registryUrl} answered HTTP ${response.status} for ${packageName}. Try again later.`,\n };\n }\n\n const packument: unknown = await response.json().catch(() => undefined);\n\n if (typeof packument !== 'object' || packument === null) {\n return {\n status: 'unavailable',\n message: `${registryUrl} answered with invalid data for ${packageName}. Try again later.`,\n };\n }\n\n return { status: 'available', packument: packument as Packument };\n};\n"],"names":["REQUEST_TIMEOUT_MS","SEARCH_PAGE_SIZE","REGISTRY_URL","ENTERPRISE_REGISTRY_URL","replace","authorizationHeader","license","Authorization","describeRejectedLicense","registryUrl","BILLING_URL","searchPackageNames","text","fetchImplementation","searchUrl","encodeURIComponent","response","headers","signal","AbortSignal","timeout","status","message","ok","objects","json","packageNames","map","searchResult","package","name","filter","packageName","fetchPackument","Accept","packument","catch","undefined"],"mappings":";;AAEA,MAAMA,qBAAqB,EAAA,GAAK,IAAA;AAChC,MAAMC,gBAAAA,GAAmB,GAAA;AA8BzB,MAAMC,YAAAA,GAAeC,uBAAAA,CAAwBC,OAAO,CAAC,MAAA,EAAQ,EAAA,CAAA;AAE7D,MAAMC,mBAAAA,GAAsB,CAACC,OAAAA,IAAqB;QAAEC,aAAAA,EAAe,CAAC,OAAO,EAAED,OAAAA,CAAAA;KAAU,CAAA;AAEvF,MAAME,0BAA0B,CAACC,WAAAA,GAC/B,GAAGA,WAAAA,CAAY,2CAA2C,EAAEC,WAAAA,CAAAA,CAAa;AAQpE,MAAMC,qBAAqB,OAAO,EACvCC,IAAI,EACJN,OAAO,EACPO,mBAAmB,EAKpB,GAAA;AACC,IAAA,MAAMJ,WAAAA,GAAcP,YAAAA;IACpB,MAAMY,SAAAA,GAAY,GAAGL,WAAAA,CAAY,kBAAkB,EAAEM,kBAAAA,CAAmBH,IAAAA,CAAAA,CAAM,MAAM,EAAEX,gBAAAA,CAAAA,CAAkB;IAExG,IAAI;QACF,MAAMe,QAAAA,GAAW,MAAMH,mBAAAA,CAAoBC,SAAAA,EAAW;AACpDG,YAAAA,OAAAA,EAASZ,mBAAAA,CAAoBC,OAAAA,CAAAA;YAC7BY,MAAAA,EAAQC,WAAAA,CAAYC,OAAO,CAACpB,kBAAAA;AAC9B,SAAA,CAAA;QAEA,IAAIgB,QAAAA,CAASK,MAAM,KAAK,GAAA,EAAK;YAC3B,OAAO;gBAAEA,MAAAA,EAAQ,kBAAA;AAAoBC,gBAAAA,OAAAA,EAASd,uBAAAA,CAAwBC,WAAAA;AAAa,aAAA;AACrF,QAAA;QAEA,IAAI,CAACO,QAAAA,CAASO,EAAE,EAAE;YAChB,OAAO;gBAAEF,MAAAA,EAAQ;AAAc,aAAA;AACjC,QAAA;AAEA,QAAA,MAAM,EAAEG,OAAO,EAAE,GAAI,MAAMR,SAASS,IAAI,EAAA;QAIxC,MAAMC,YAAAA,GAAe,CAACF,OAAAA,IAAW,EAAE,EAChCG,GAAG,CAAC,CAACC,eAAiBA,YAAAA,CAAaC,OAAO,EAAEC,IAAAA,CAAAA,CAC5CC,MAAM,CAAC,CAACC,WAAAA,GAAuC,OAAOA,WAAAA,KAAgB,QAAA,CAAA;QAEzE,OAAO;YAAEX,MAAAA,EAAQ,WAAA;AAAaK,YAAAA;AAAa,SAAA;AAC7C,IAAA,CAAA,CAAE,OAAM;QACN,OAAO;YAAEL,MAAAA,EAAQ;AAAc,SAAA;AACjC,IAAA;AACF;AAEO,MAAMY,iBAAiB,OAAO,EACnCD,WAAW,EACX1B,OAAO,EACPO,mBAAmB,EAKpB,GAAA;AACC,IAAA,MAAMJ,WAAAA,GAAcP,YAAAA;IACpB,IAAIc,QAAAA;IAEJ,IAAI;;AAEFA,QAAAA,QAAAA,GAAW,MAAMH,mBAAAA,CAAoB,CAAA,EAAGJ,YAAY,CAAC,EAAEuB,aAAa,EAAE;YACpEf,OAAAA,EAAS;AAAE,gBAAA,GAAGZ,oBAAoBC,OAAAA,CAAQ;gBAAE4B,MAAAA,EAAQ;AAAmB,aAAA;YACvEhB,MAAAA,EAAQC,WAAAA,CAAYC,OAAO,CAACpB,kBAAAA;AAC9B,SAAA,CAAA;AACF,IAAA,CAAA,CAAE,OAAM;QACN,OAAO;YACLqB,MAAAA,EAAQ,aAAA;AACRC,YAAAA,OAAAA,EAAS,CAAC,gBAAgB,EAAEb,WAAAA,CAAY,8CAA8C;AACxF,SAAA;AACF,IAAA;IAEA,IAAIO,QAAAA,CAASK,MAAM,KAAK,GAAA,EAAK;QAC3B,OAAO;YACLA,MAAAA,EAAQ,kBAAA;AACRC,YAAAA,OAAAA,EAASd,uBAAAA,CAAwBC,WAAAA;AACnC,SAAA;AACF,IAAA;IAEA,IAAIO,QAAAA,CAASK,MAAM,KAAK,GAAA,EAAK;QAC3B,OAAO;YAAEA,MAAAA,EAAQ;AAAe,SAAA;AAClC,IAAA;IAEA,IAAIL,QAAAA,CAASK,MAAM,KAAK,GAAA,EAAK;QAC3B,OAAO;YAAEA,MAAAA,EAAQ;AAAY,SAAA;AAC/B,IAAA;IAEA,IAAI,CAACL,QAAAA,CAASO,EAAE,EAAE;QAChB,OAAO;YACLF,MAAAA,EAAQ,aAAA;YACRC,OAAAA,EAAS,CAAA,EAAGb,WAAAA,CAAY,eAAe,EAAEO,QAAAA,CAASK,MAAM,CAAC,KAAK,EAAEW,WAAAA,CAAY,kBAAkB;AAChG,SAAA;AACF,IAAA;AAEA,IAAA,MAAMG,YAAqB,MAAMnB,QAAAA,CAASS,IAAI,EAAA,CAAGW,KAAK,CAAC,IAAMC,SAAAA,CAAAA;AAE7D,IAAA,IAAI,OAAOF,SAAAA,KAAc,QAAA,IAAYA,SAAAA,KAAc,IAAA,EAAM;QACvD,OAAO;YACLd,MAAAA,EAAQ,aAAA;AACRC,YAAAA,OAAAA,EAAS,GAAGb,WAAAA,CAAY,gCAAgC,EAAEuB,WAAAA,CAAY,kBAAkB;AAC1F,SAAA;AACF,IAAA;IAEA,OAAO;QAAEX,MAAAA,EAAQ,WAAA;QAAac,SAAAA,EAAWA;AAAuB,KAAA;AAClE;;;;"}
@@ -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":";;;;;;AAgCO,MAAMA,cAAAA,GAAiB,CAAC,EAC7BC,KAAK,EACLC,MAAM,EACNC,gBAAgB,EAChBC,aAAa,EAMd,GAAA;AACC,IAAA,MAAMC,SAASC,gCAAAA,CAAoB;AAAEJ,QAAAA,MAAAA;AAAQC,QAAAA,gBAAAA;AAAkBC,QAAAA;AAAc,KAAA,CAAA;AAE7E,IAAA,IAAIC,OAAOE,KAAK,KAAK,kBAAkBF,MAAAA,CAAOE,KAAK,KAAK,WAAA,EAAa;AACnE,QAAA,OAAOF,MAAAA,CAAOE,KAAK,KAAK,cAAA,IAAkBJ,gBAAAA,GACtC;AAAEF,YAAAA,KAAAA;YAAOM,KAAAA,EAAO,cAAA;AAAgBJ,YAAAA;SAAiB,GACjD;AAAEF,YAAAA,KAAAA;YAAOM,KAAAA,EAAO;AAAS,SAAA;AAC/B,IAAA;IAEA,IAAIF,MAAAA,CAAOE,KAAK,KAAK,SAAA,EAAW;QAC9B,OAAO;AAAEN,YAAAA,KAAAA;AAAO,YAAA,GAAGI;AAAO,SAAA;AAC5B,IAAA;AAEA,IAAA,IAAI,CAACF,gBAAAA,EAAkB;;QAErB,OAAOE,MAAAA,CAAOE,KAAK,KAAK,uBAAA,GACpB;AAAEN,YAAAA,KAAAA;YAAOM,KAAAA,EAAO,uBAAA;AAAyBC,YAAAA,mBAAAA,EAAqBH,OAAOG;SAAoB,GACzF;AAAEP,YAAAA,KAAAA;YAAOM,KAAAA,EAAO;AAAoB,SAAA;AAC1C,IAAA;AAEA,IAAA,OAAQF,OAAOE,KAAK;QAClB,KAAK,SAAA;YACH,OAAO;AAAEN,gBAAAA,KAAAA;AAAO,gBAAA,GAAGI,MAAM;AAAEF,gBAAAA;AAAiB,aAAA;QAC9C,KAAK,uBAAA;;YAEH,OAAO;AACLF,gBAAAA,KAAAA;gBACAM,KAAAA,EAAO,WAAA;AACPJ,gBAAAA,gBAAAA;AACAM,gBAAAA,gBAAAA,EAAkBJ,OAAOI;AAC3B,aAAA;QACF,KAAK,mBAAA;YACH,OAAO;AAAER,gBAAAA,KAAAA;gBAAOM,KAAAA,EAAO,WAAA;AAAaJ,gBAAAA;AAAiB,aAAA;AACvD,QAAA;YACE,OAAO;AAAEF,gBAAAA,KAAAA;AAAO,gBAAA,GAAGI,MAAM;AAAEF,gBAAAA;AAAiB,aAAA;AAChD;AACF;AAEA,MAAMO,SAAAA,GAAkC;AACtC,IAAA,SAAA;AACA,IAAA,SAAA;AACA,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,uBAAA;AACA,IAAA;AACD,CAAA;AAEM,MAAMC,YAAAA,GAAe,CAACC,GAAAA,GAC3BA,GAAAA,CAAIL,KAAK,KAAK,SAAA,IAAaK,GAAAA,CAAIL,KAAK,KAAK;AAEpC,MAAMM,aAAAA,GAAgB,CAACD,GAAAA,GAC5B,GAAGA,GAAAA,CAAIX,KAAK,CAACa,WAAW,CAAC,CAAC,EAAEF,GAAAA,CAAIG,aAAa;AAE/C,MAAMC,kBAAkB,CAACJ,GAAAA,GAAAA;IACvB,IAAIK,qBAAAA,CAAaL,GAAAA,CAAIT,gBAAgB,CAAA,EAAG;QACtC,OAAO,kBAAA;AACT,IAAA;IAEA,OAAOS,GAAAA,CAAIM,cAAc,GAAG,iBAAA,GAAoB,WAAA;AAClD,CAAA;AAEO,MAAMC,mBAAmB,CAACP,GAAAA,GAAAA;IAC/B,MAAM,EAAEQ,WAAW,EAAEN,WAAW,EAAEO,IAAI,EAAE,GAAGT,GAAAA,CAAIX,KAAK;IACpD,MAAMqB,OAAAA,GAAUD,IAAAA,IAAQA,IAAAA,KAAS,QAAA,GAAW,CAAC,EAAE,EAAEA,IAAAA,CAAK,CAAC,CAAC,GAAG,EAAA;IAC3D,MAAME,KAAAA,GAAQ,GAAGH,WAAAA,CAAY,EAAE,EAAEN,WAAAA,CAAY,CAAC,EAAEQ,OAAAA,CAAAA,CAAS;;IAEzD,MAAME,UAAAA,GAAa,CAACC,IAAAA,GAAmBA,IAAAA,GAAO,CAAC,EAAE,EAAEA,MAAM,GAAG,EAAA;AAE5D,IAAA,OAAQb,IAAIL,KAAK;QACf,KAAK,SAAA;AAAW,YAAA;AACd,gBAAA,MAAMmB,aAAaV,eAAAA,CAAgBJ,GAAAA,CAAAA;gBAEnC,OAAO;AACLe,oBAAAA,IAAAA,EAAM,GAAGJ,KAAAA,CAAM,EAAE,EAAEX,GAAAA,CAAIT,gBAAgB,CAAC,GAAG,EAAES,GAAAA,CAAIG,aAAa,CAAC,CAAC,EAAEW,aAAaF,UAAAA,CAAWZ,GAAAA,CAAIH,gBAAgB,CAAA,CAAA,CAAG;AACjHmB,oBAAAA,KAAAA,EAAOf,aAAAA,CAAcD,GAAAA,CAAAA;oBACrBiB,KAAAA,EAAOT,WAAAA;AACPU,oBAAAA,OAAAA,EAASJ,UAAAA,KAAe;AAC1B,iBAAA;AACF,YAAA;QACA,KAAK,SAAA;YACH,OAAO;AACLC,gBAAAA,IAAAA,EAAM,GAAGJ,KAAAA,CAAM,EAAE,EAAEX,GAAAA,CAAIG,aAAa,CAAC,EAAE,EAAEH,GAAAA,CAAIX,KAAK,CAAC8B,OAAO,GAAGP,UAAAA,CAAWZ,GAAAA,CAAIH,gBAAgB,CAAA,CAAA,CAAG;AAC/FmB,gBAAAA,KAAAA,EAAOf,aAAAA,CAAcD,GAAAA,CAAAA;gBACrBiB,KAAAA,EAAOT,WAAAA;gBACPU,OAAAA,EAAS;AACX,aAAA;QACF,KAAK,WAAA;YACH,OAAO;AACLH,gBAAAA,IAAAA,EAAM,GAAGJ,KAAAA,CAAM,EAAE,EAAEX,GAAAA,CAAIT,gBAAgB,CAAA,CAAE;gBACzC6B,QAAAA,EAAUpB,GAAAA,CAAIH,gBAAgB,GAAG,CAAC,WAAW,EAAEG,GAAAA,CAAIH,gBAAgB,CAAA,CAAE,GAAG;AAC1E,aAAA;QACF,KAAK,cAAA;YACH,OAAO;AAAEkB,gBAAAA,IAAAA,EAAM,GAAGJ,KAAAA,CAAM,EAAE,EAAEX,GAAAA,CAAIT,gBAAgB,CAAA,CAAE;gBAAE6B,QAAAA,EAAU;AAAsB,aAAA;QACtF,KAAK,uBAAA;YACH,OAAO;gBAAEL,IAAAA,EAAMJ,KAAAA;AAAOS,gBAAAA,QAAAA,EAAU,CAAC,gBAAgB,EAAEpB,GAAAA,CAAIJ,mBAAmB,CAAA;AAAG,aAAA;QAC/E,KAAK,mBAAA;YACH,OAAO;gBAAEmB,IAAAA,EAAMJ,KAAAA;gBAAOS,QAAAA,EAAU;AAAwB,aAAA;AAC1D,QAAA;YACE,OAAO;gBAAEL,IAAAA,EAAMJ,KAAAA;gBAAOS,QAAAA,EAAU;AAAc,aAAA;AAClD;AACF;AAEA,qFACO,MAAMC,gBAAAA,GAAmB,CAACC,IAAAA,GAC/BA,IAAAA,CACGC,MAAM,CAAC,CAACvB,GAAAA,GAAQA,GAAAA,CAAIL,KAAK,KAAK,QAAA,CAAA,CAC9B6B,IAAI,CAAC,CAACC,IAAAA,EAAMC,KAAAA,GAAU5B,SAAAA,CAAU6B,OAAO,CAACF,IAAAA,CAAK9B,KAAK,CAAA,GAAIG,SAAAA,CAAU6B,OAAO,CAACD,KAAAA,CAAM/B,KAAK,CAAA;AAEjF,MAAMiC,gBAAAA,GAAmB,CAACN,IAAAA,GAC/BO,+BAAAA,CAAgB;QACdC,OAAAA,EAAS,6DAAA;QACTC,OAAAA,EAASV,gBAAAA,CAAiBC,IAAAA,CAAAA,CAAMU,GAAG,CAACzB,gBAAAA;KACtC;;;;;;;;;"}
@@ -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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"}