@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 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/package-manager.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport execa from 'execa';\nimport { packageManager as packageManagerUtils } from '@strapi/utils';\n\nimport { EnterpriseInstallError } from './errors';\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn';\n\n/** Yarn's major version matters: Yarn 2 and later read another configuration file. */\nexport type DetectedPackageManager =\n | { name: 'npm' | 'pnpm'; majorVersion?: number }\n | { name: 'yarn'; majorVersion: number };\n\n/** Reads a `packageManager` field such as `yarn@4.5.0` or `pnpm@9.1.0+sha512...`. */\nexport const parsePackageManagerField = (\n packageManagerField: unknown\n): DetectedPackageManager | undefined => {\n if (typeof packageManagerField !== 'string') {\n return undefined;\n }\n\n const fieldMatch = packageManagerField.match(/^(npm|pnpm|yarn)@(\\d+)/);\n\n if (!fieldMatch) {\n return undefined;\n }\n\n return { name: fieldMatch[1] as PackageManagerName, majorVersion: Number(fieldMatch[2]) };\n};\n\nconst YARN_VERSION_UNKNOWN =\n 'Could not run yarn --version to tell Yarn 1 from Yarn 2+. Check that Yarn is installed, or set \"packageManager\" in package.json.';\n\nconst readYarnMajorVersion = async (appDir: string): Promise<number> => {\n const { stdout } = await execa('yarn', ['--version'], { cwd: appDir }).catch(() => {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n });\n const majorVersion = Number.parseInt(stdout.trim(), 10);\n\n // Guessing Yarn 1 would set up a file that Yarn 2+ never reads.\n if (Number.isNaN(majorVersion)) {\n throw new EnterpriseInstallError(YARN_VERSION_UNKNOWN);\n }\n\n return majorVersion;\n};\n\nexport const detectPackageManager = async (appDir: string): Promise<DetectedPackageManager> => {\n const packageJson = await fse.readJson(path.join(appDir, 'package.json')).catch(() => ({}));\n const packageManagerFromField = parsePackageManagerField(packageJson.packageManager);\n\n if (packageManagerFromField) {\n return packageManagerFromField;\n }\n\n // Detection reads the lockfile, then `node_modules`, and throws when it finds neither, as in a\n // fresh clone whose dependencies are not installed yet.\n const packageManagerName = await packageManagerUtils.getPreferred(appDir).catch(() => {\n throw new EnterpriseInstallError(\n 'Could not tell which package manager this app uses. Install its dependencies first, or set \"packageManager\" in package.json.'\n );\n });\n\n if (packageManagerName === 'yarn') {\n return { name: 'yarn', majorVersion: await readYarnMajorVersion(appDir) };\n }\n\n return { name: packageManagerName };\n};\n\n/**\n * Yarn 2 and later read `.yarnrc.yml`. npm, pnpm, and Yarn 1 read `.npmrc`.\n */\nexport const readsYarnrcYml = (packageManager: DetectedPackageManager): boolean =>\n packageManager.name === 'yarn' && packageManager.majorVersion >= 2;\n"],"names":["parsePackageManagerField","packageManagerField","undefined","fieldMatch","match","name","majorVersion","Number","YARN_VERSION_UNKNOWN","readYarnMajorVersion","appDir","stdout","execa","cwd","catch","EnterpriseInstallError","parseInt","trim","isNaN","detectPackageManager","packageJson","fse","readJson","path","join","packageManagerFromField","packageManager","packageManagerName","packageManagerUtils","getPreferred","readsYarnrcYml"],"mappings":";;;;;;AAcA,sFACO,MAAMA,wBAAAA,GAA2B,CACtCC,mBAAAA,GAAAA;IAEA,IAAI,OAAOA,wBAAwB,QAAA,EAAU;QAC3C,OAAOC,SAAAA;AACT,IAAA;IAEA,MAAMC,UAAAA,GAAaF,mBAAAA,CAAoBG,KAAK,CAAC,wBAAA,CAAA;AAE7C,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,OAAOD,SAAAA;AACT,IAAA;IAEA,OAAO;QAAEG,IAAAA,EAAMF,UAAU,CAAC,CAAA,CAAE;QAAwBG,YAAAA,EAAcC,MAAAA,CAAOJ,UAAU,CAAC,CAAA,CAAE;AAAE,KAAA;AAC1F;AAEA,MAAMK,oBAAAA,GACJ,kIAAA;AAEF,MAAMC,uBAAuB,OAAOC,MAAAA,GAAAA;AAClC,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,MAAM,MAAA,EAAQ;AAAC,QAAA;KAAY,EAAE;QAAEC,GAAAA,EAAKH;AAAO,KAAA,CAAA,CAAGI,KAAK,CAAC,IAAA;AAC3E,QAAA,MAAM,IAAIC,sBAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA,CAAA,CAAA;AACA,IAAA,MAAMF,eAAeC,MAAAA,CAAOS,QAAQ,CAACL,MAAAA,CAAOM,IAAI,EAAA,EAAI,EAAA,CAAA;;IAGpD,IAAIV,MAAAA,CAAOW,KAAK,CAACZ,YAAAA,CAAAA,EAAe;AAC9B,QAAA,MAAM,IAAIS,sBAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA;IAEA,OAAOF,YAAAA;AACT,CAAA;AAEO,MAAMa,uBAAuB,OAAOT,MAAAA,GAAAA;AACzC,IAAA,MAAMU,WAAAA,GAAc,MAAMC,GAAAA,CAAIC,QAAQ,CAACC,IAAAA,CAAKC,IAAI,CAACd,MAAAA,EAAQ,iBAAiBI,KAAK,CAAC,KAAO,EAAC,CAAA,CAAA;IACxF,MAAMW,uBAAAA,GAA0BzB,wBAAAA,CAAyBoB,WAAAA,CAAYM,cAAc,CAAA;AAEnF,IAAA,IAAID,uBAAAA,EAAyB;QAC3B,OAAOA,uBAAAA;AACT,IAAA;;;AAIA,IAAA,MAAME,qBAAqB,MAAMC,cAAAA,CAAoBC,YAAY,CAACnB,MAAAA,CAAAA,CAAQI,KAAK,CAAC,IAAA;AAC9E,QAAA,MAAM,IAAIC,sBAAAA,CACR,8HAAA,CAAA;AAEJ,IAAA,CAAA,CAAA;AAEA,IAAA,IAAIY,uBAAuB,MAAA,EAAQ;QACjC,OAAO;YAAEtB,IAAAA,EAAM,MAAA;AAAQC,YAAAA,YAAAA,EAAc,MAAMG,oBAAAA,CAAqBC,MAAAA;AAAQ,SAAA;AAC1E,IAAA;IAEA,OAAO;QAAEL,IAAAA,EAAMsB;AAAmB,KAAA;AACpC;AAEA;;AAEC,IACM,MAAMG,cAAAA,GAAiB,CAACJ,cAAAA,GAC7BA,cAAAA,CAAerB,IAAI,KAAK,MAAA,IAAUqB,cAAAA,CAAepB,YAAY,IAAI;;;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('./errors.js');
|
|
4
|
+
var versions = require('./versions.js');
|
|
5
|
+
|
|
6
|
+
const resolvePluginStatus = ({ lookup, installedVersion, strapiVersion })=>{
|
|
7
|
+
if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {
|
|
8
|
+
throw new errors.EnterpriseInstallError(lookup.message);
|
|
9
|
+
}
|
|
10
|
+
if (lookup.status !== 'available') {
|
|
11
|
+
return {
|
|
12
|
+
state: lookup.status
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const versionChoice = versions.pickTargetVersion(lookup.packument, strapiVersion);
|
|
16
|
+
const newerVersionNote = versions.describeNewerIncompatibleVersion(versionChoice, installedVersion);
|
|
17
|
+
const { targetVersion, newestVersionStrapiRange } = versionChoice;
|
|
18
|
+
if (!targetVersion) {
|
|
19
|
+
// A stable version only fails to fit when it declares a Strapi range, so the newest one has one.
|
|
20
|
+
return newestVersionStrapiRange ? {
|
|
21
|
+
state: 'no-compatible-version',
|
|
22
|
+
requiredStrapiRange: newestVersionStrapiRange,
|
|
23
|
+
newerVersionNote
|
|
24
|
+
} : {
|
|
25
|
+
state: 'no-stable-release'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (!installedVersion) {
|
|
29
|
+
return {
|
|
30
|
+
state: 'install',
|
|
31
|
+
targetVersion,
|
|
32
|
+
newerVersionNote
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return versions.isUpgrade(installedVersion, targetVersion) ? {
|
|
36
|
+
state: 'upgrade',
|
|
37
|
+
targetVersion,
|
|
38
|
+
isMajorUpgrade: !versions.isPrerelease(installedVersion) && versions.isMajorUpgrade(installedVersion, targetVersion),
|
|
39
|
+
newerVersionNote
|
|
40
|
+
} : {
|
|
41
|
+
state: 'installed',
|
|
42
|
+
newerVersionNote
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
exports.resolvePluginStatus = resolvePluginStatus;
|
|
47
|
+
//# sourceMappingURL=plugin-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-status.js","sources":["../../../../../../src/cli/commands/enterprise/install/plugin-status.ts"],"sourcesContent":["import { EnterpriseInstallError } from './errors';\nimport type { PackumentLookup } from './registry';\nimport {\n describeNewerIncompatibleVersion,\n isMajorUpgrade,\n isPrerelease,\n isUpgrade,\n pickTargetVersion,\n} from './versions';\n\nexport type PluginStatus =\n /** Not installed, and a stable version fits this Strapi version. */\n | { state: 'install'; targetVersion: string; newerVersionNote?: string }\n /** Installed, and a newer compatible version exists. */\n | { state: 'upgrade'; targetVersion: string; isMajorUpgrade: boolean; newerVersionNote?: string }\n /** Installed and up to date for this Strapi version. */\n | { state: 'installed'; newerVersionNote?: string }\n /** No stable version fits this Strapi version. */\n | { state: 'no-compatible-version'; requiredStrapiRange: string; newerVersionNote?: string }\n /** Only prerelease versions exist. */\n | { state: 'no-stable-release' }\n /** The license does not include it. */\n | { state: 'not-licensed' }\n /** The registry has no such package. */\n | { state: 'not-found' };\n\nexport const resolvePluginStatus = ({\n lookup,\n installedVersion,\n strapiVersion,\n}: {\n lookup: PackumentLookup;\n installedVersion?: string;\n strapiVersion?: string;\n}): PluginStatus => {\n if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {\n throw new EnterpriseInstallError(lookup.message);\n }\n\n if (lookup.status !== 'available') {\n return { state: lookup.status };\n }\n\n const versionChoice = pickTargetVersion(lookup.packument, strapiVersion);\n const newerVersionNote = describeNewerIncompatibleVersion(versionChoice, installedVersion);\n const { targetVersion, newestVersionStrapiRange } = versionChoice;\n\n if (!targetVersion) {\n // A stable version only fails to fit when it declares a Strapi range, so the newest one has one.\n return newestVersionStrapiRange\n ? {\n state: 'no-compatible-version',\n requiredStrapiRange: newestVersionStrapiRange,\n newerVersionNote,\n }\n : { state: 'no-stable-release' };\n }\n\n if (!installedVersion) {\n return { state: 'install', targetVersion, newerVersionNote };\n }\n\n return isUpgrade(installedVersion, targetVersion)\n ? {\n state: 'upgrade',\n targetVersion,\n isMajorUpgrade:\n !isPrerelease(installedVersion) && isMajorUpgrade(installedVersion, targetVersion),\n newerVersionNote,\n }\n : { state: 'installed', newerVersionNote };\n};\n"],"names":["resolvePluginStatus","lookup","installedVersion","strapiVersion","status","EnterpriseInstallError","message","state","versionChoice","pickTargetVersion","packument","newerVersionNote","describeNewerIncompatibleVersion","targetVersion","newestVersionStrapiRange","requiredStrapiRange","isUpgrade","isMajorUpgrade","isPrerelease"],"mappings":";;;;;AA0BO,MAAMA,sBAAsB,CAAC,EAClCC,MAAM,EACNC,gBAAgB,EAChBC,aAAa,EAKd,GAAA;AACC,IAAA,IAAIF,OAAOG,MAAM,KAAK,sBAAsBH,MAAAA,CAAOG,MAAM,KAAK,aAAA,EAAe;QAC3E,MAAM,IAAIC,6BAAAA,CAAuBJ,MAAAA,CAAOK,OAAO,CAAA;AACjD,IAAA;IAEA,IAAIL,MAAAA,CAAOG,MAAM,KAAK,WAAA,EAAa;QACjC,OAAO;AAAEG,YAAAA,KAAAA,EAAON,OAAOG;AAAO,SAAA;AAChC,IAAA;AAEA,IAAA,MAAMI,aAAAA,GAAgBC,0BAAAA,CAAkBR,MAAAA,CAAOS,SAAS,EAAEP,aAAAA,CAAAA;IAC1D,MAAMQ,gBAAAA,GAAmBC,0CAAiCJ,aAAAA,EAAeN,gBAAAA,CAAAA;AACzE,IAAA,MAAM,EAAEW,aAAa,EAAEC,wBAAwB,EAAE,GAAGN,aAAAA;AAEpD,IAAA,IAAI,CAACK,aAAAA,EAAe;;AAElB,QAAA,OAAOC,wBAAAA,GACH;YACEP,KAAAA,EAAO,uBAAA;YACPQ,mBAAAA,EAAqBD,wBAAAA;AACrBH,YAAAA;SACF,GACA;YAAEJ,KAAAA,EAAO;AAAoB,SAAA;AACnC,IAAA;AAEA,IAAA,IAAI,CAACL,gBAAAA,EAAkB;QACrB,OAAO;YAAEK,KAAAA,EAAO,SAAA;AAAWM,YAAAA,aAAAA;AAAeF,YAAAA;AAAiB,SAAA;AAC7D,IAAA;IAEA,OAAOK,kBAAAA,CAAUd,kBAAkBW,aAAAA,CAAAA,GAC/B;QACEN,KAAAA,EAAO,SAAA;AACPM,QAAAA,aAAAA;AACAI,QAAAA,cAAAA,EACE,CAACC,qBAAAA,CAAahB,gBAAAA,CAAAA,IAAqBe,uBAAAA,CAAef,gBAAAA,EAAkBW,aAAAA,CAAAA;AACtEF,QAAAA;KACF,GACA;QAAEJ,KAAAA,EAAO,WAAA;AAAaI,QAAAA;AAAiB,KAAA;AAC7C;;;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { EnterpriseInstallError } from './errors.mjs';
|
|
2
|
+
import { pickTargetVersion, describeNewerIncompatibleVersion, isUpgrade, isPrerelease, isMajorUpgrade } from './versions.mjs';
|
|
3
|
+
|
|
4
|
+
const resolvePluginStatus = ({ lookup, installedVersion, strapiVersion })=>{
|
|
5
|
+
if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {
|
|
6
|
+
throw new EnterpriseInstallError(lookup.message);
|
|
7
|
+
}
|
|
8
|
+
if (lookup.status !== 'available') {
|
|
9
|
+
return {
|
|
10
|
+
state: lookup.status
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const versionChoice = pickTargetVersion(lookup.packument, strapiVersion);
|
|
14
|
+
const newerVersionNote = describeNewerIncompatibleVersion(versionChoice, installedVersion);
|
|
15
|
+
const { targetVersion, newestVersionStrapiRange } = versionChoice;
|
|
16
|
+
if (!targetVersion) {
|
|
17
|
+
// A stable version only fails to fit when it declares a Strapi range, so the newest one has one.
|
|
18
|
+
return newestVersionStrapiRange ? {
|
|
19
|
+
state: 'no-compatible-version',
|
|
20
|
+
requiredStrapiRange: newestVersionStrapiRange,
|
|
21
|
+
newerVersionNote
|
|
22
|
+
} : {
|
|
23
|
+
state: 'no-stable-release'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (!installedVersion) {
|
|
27
|
+
return {
|
|
28
|
+
state: 'install',
|
|
29
|
+
targetVersion,
|
|
30
|
+
newerVersionNote
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return isUpgrade(installedVersion, targetVersion) ? {
|
|
34
|
+
state: 'upgrade',
|
|
35
|
+
targetVersion,
|
|
36
|
+
isMajorUpgrade: !isPrerelease(installedVersion) && isMajorUpgrade(installedVersion, targetVersion),
|
|
37
|
+
newerVersionNote
|
|
38
|
+
} : {
|
|
39
|
+
state: 'installed',
|
|
40
|
+
newerVersionNote
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { resolvePluginStatus };
|
|
45
|
+
//# sourceMappingURL=plugin-status.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-status.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/plugin-status.ts"],"sourcesContent":["import { EnterpriseInstallError } from './errors';\nimport type { PackumentLookup } from './registry';\nimport {\n describeNewerIncompatibleVersion,\n isMajorUpgrade,\n isPrerelease,\n isUpgrade,\n pickTargetVersion,\n} from './versions';\n\nexport type PluginStatus =\n /** Not installed, and a stable version fits this Strapi version. */\n | { state: 'install'; targetVersion: string; newerVersionNote?: string }\n /** Installed, and a newer compatible version exists. */\n | { state: 'upgrade'; targetVersion: string; isMajorUpgrade: boolean; newerVersionNote?: string }\n /** Installed and up to date for this Strapi version. */\n | { state: 'installed'; newerVersionNote?: string }\n /** No stable version fits this Strapi version. */\n | { state: 'no-compatible-version'; requiredStrapiRange: string; newerVersionNote?: string }\n /** Only prerelease versions exist. */\n | { state: 'no-stable-release' }\n /** The license does not include it. */\n | { state: 'not-licensed' }\n /** The registry has no such package. */\n | { state: 'not-found' };\n\nexport const resolvePluginStatus = ({\n lookup,\n installedVersion,\n strapiVersion,\n}: {\n lookup: PackumentLookup;\n installedVersion?: string;\n strapiVersion?: string;\n}): PluginStatus => {\n if (lookup.status === 'license-rejected' || lookup.status === 'unavailable') {\n throw new EnterpriseInstallError(lookup.message);\n }\n\n if (lookup.status !== 'available') {\n return { state: lookup.status };\n }\n\n const versionChoice = pickTargetVersion(lookup.packument, strapiVersion);\n const newerVersionNote = describeNewerIncompatibleVersion(versionChoice, installedVersion);\n const { targetVersion, newestVersionStrapiRange } = versionChoice;\n\n if (!targetVersion) {\n // A stable version only fails to fit when it declares a Strapi range, so the newest one has one.\n return newestVersionStrapiRange\n ? {\n state: 'no-compatible-version',\n requiredStrapiRange: newestVersionStrapiRange,\n newerVersionNote,\n }\n : { state: 'no-stable-release' };\n }\n\n if (!installedVersion) {\n return { state: 'install', targetVersion, newerVersionNote };\n }\n\n return isUpgrade(installedVersion, targetVersion)\n ? {\n state: 'upgrade',\n targetVersion,\n isMajorUpgrade:\n !isPrerelease(installedVersion) && isMajorUpgrade(installedVersion, targetVersion),\n newerVersionNote,\n }\n : { state: 'installed', newerVersionNote };\n};\n"],"names":["resolvePluginStatus","lookup","installedVersion","strapiVersion","status","EnterpriseInstallError","message","state","versionChoice","pickTargetVersion","packument","newerVersionNote","describeNewerIncompatibleVersion","targetVersion","newestVersionStrapiRange","requiredStrapiRange","isUpgrade","isMajorUpgrade","isPrerelease"],"mappings":";;;AA0BO,MAAMA,sBAAsB,CAAC,EAClCC,MAAM,EACNC,gBAAgB,EAChBC,aAAa,EAKd,GAAA;AACC,IAAA,IAAIF,OAAOG,MAAM,KAAK,sBAAsBH,MAAAA,CAAOG,MAAM,KAAK,aAAA,EAAe;QAC3E,MAAM,IAAIC,sBAAAA,CAAuBJ,MAAAA,CAAOK,OAAO,CAAA;AACjD,IAAA;IAEA,IAAIL,MAAAA,CAAOG,MAAM,KAAK,WAAA,EAAa;QACjC,OAAO;AAAEG,YAAAA,KAAAA,EAAON,OAAOG;AAAO,SAAA;AAChC,IAAA;AAEA,IAAA,MAAMI,aAAAA,GAAgBC,iBAAAA,CAAkBR,MAAAA,CAAOS,SAAS,EAAEP,aAAAA,CAAAA;IAC1D,MAAMQ,gBAAAA,GAAmBC,iCAAiCJ,aAAAA,EAAeN,gBAAAA,CAAAA;AACzE,IAAA,MAAM,EAAEW,aAAa,EAAEC,wBAAwB,EAAE,GAAGN,aAAAA;AAEpD,IAAA,IAAI,CAACK,aAAAA,EAAe;;AAElB,QAAA,OAAOC,wBAAAA,GACH;YACEP,KAAAA,EAAO,uBAAA;YACPQ,mBAAAA,EAAqBD,wBAAAA;AACrBH,YAAAA;SACF,GACA;YAAEJ,KAAAA,EAAO;AAAoB,SAAA;AACnC,IAAA;AAEA,IAAA,IAAI,CAACL,gBAAAA,EAAkB;QACrB,OAAO;YAAEK,KAAAA,EAAO,SAAA;AAAWM,YAAAA,aAAAA;AAAeF,YAAAA;AAAiB,SAAA;AAC7D,IAAA;IAEA,OAAOK,SAAAA,CAAUd,kBAAkBW,aAAAA,CAAAA,GAC/B;QACEN,KAAAA,EAAO,SAAA;AACPM,QAAAA,aAAAA;AACAI,QAAAA,cAAAA,EACE,CAACC,YAAAA,CAAahB,gBAAAA,CAAAA,IAAqBe,cAAAA,CAAef,gBAAAA,EAAkBW,aAAAA,CAAAA;AACtEF,QAAAA;KACF,GACA;QAAEJ,KAAAA,EAAO,WAAA;AAAaI,QAAAA;AAAiB,KAAA;AAC7C;;;;"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var fse = require('fs-extra');
|
|
5
|
+
var constants = require('./constants.js');
|
|
6
|
+
var errors = require('./errors.js');
|
|
7
|
+
var directories = require('./directories.js');
|
|
8
|
+
var packageManager = require('./package-manager.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
|
+
|
|
15
|
+
const SCOPE_REGISTRY_KEY = `${constants.ENTERPRISE_SCOPE}:registry`;
|
|
16
|
+
const YARNRC_SCOPE_NAME = constants.ENTERPRISE_SCOPE.slice(1);
|
|
17
|
+
const LICENSE_PLACEHOLDER = '<your license>';
|
|
18
|
+
// References the package manager expands when it reads the file, so the license stays off disk.
|
|
19
|
+
// Yarn 2+ fails every command on the machine when a referenced variable is unset, unless it has a
|
|
20
|
+
// default. `.npmrc` has no form that works everywhere: an unset variable breaks every Yarn 1
|
|
21
|
+
// command and makes pnpm warn on each one, and npm, pnpm and Yarn 1 share `~/.npmrc`.
|
|
22
|
+
/* eslint-disable no-template-curly-in-string */ const NPMRC_LICENSE_REFERENCE = '${STRAPI_LICENSE}';
|
|
23
|
+
const YARNRC_LICENSE_REFERENCE = '${STRAPI_LICENSE:-}';
|
|
24
|
+
/* eslint-enable no-template-curly-in-string */ const shouldReferenceLicense = (licenseSource, env)=>licenseSource === 'environment' && Boolean(env.CI) && env.CI !== 'false';
|
|
25
|
+
const describeRegistry = (registryUrl)=>{
|
|
26
|
+
const url = new URL(`${registryUrl.replace(/\/+$/, '')}/`);
|
|
27
|
+
return {
|
|
28
|
+
url: url.href,
|
|
29
|
+
host: url.host,
|
|
30
|
+
tokenKey: `//${url.host}${url.pathname}:_authToken`
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const buildNpmrcConfiguration = (token, registry)=>[
|
|
34
|
+
`${SCOPE_REGISTRY_KEY}=${registry.url}`,
|
|
35
|
+
`${registry.tokenKey}=${token}`
|
|
36
|
+
].join('\n');
|
|
37
|
+
const buildYarnrcScopeConfiguration = (token, registry)=>[
|
|
38
|
+
` ${YARNRC_SCOPE_NAME}:`,
|
|
39
|
+
` npmRegistryServer: '${registry.url}'`,
|
|
40
|
+
' npmAlwaysAuth: true',
|
|
41
|
+
` npmAuthToken: '${token}'`
|
|
42
|
+
].join('\n');
|
|
43
|
+
const buildYarnrcConfiguration = (token, registry)=>[
|
|
44
|
+
'npmScopes:',
|
|
45
|
+
buildYarnrcScopeConfiguration(token, registry)
|
|
46
|
+
].join('\n');
|
|
47
|
+
const getUserNpmrcPath = (env, homeDir)=>env.NPM_CONFIG_USERCONFIG ?? env.npm_config_userconfig ?? path__default.default.join(homeDir, '.npmrc');
|
|
48
|
+
const getUserYarnrcPath = (homeDir)=>path__default.default.join(homeDir, '.yarnrc.yml');
|
|
49
|
+
const readFileIfExists = async (filePath)=>await fse__default.default.pathExists(filePath) ? fse__default.default.readFile(filePath, 'utf8') : '';
|
|
50
|
+
const appendToFile = async (filePath, text)=>{
|
|
51
|
+
const existingContent = await readFileIfExists(filePath);
|
|
52
|
+
const separator = existingContent.length > 0 && !existingContent.endsWith('\n') ? '\n' : '';
|
|
53
|
+
await fse__default.default.ensureDir(path__default.default.dirname(filePath));
|
|
54
|
+
await fse__default.default.appendFile(filePath, `${separator}${text}\n`);
|
|
55
|
+
// The file may now hold the license. A mode passed when writing only applies to a new file, so
|
|
56
|
+
// an existing one is restricted to its owner explicitly, as npm does when it saves this file.
|
|
57
|
+
await fse__default.default.chmod(filePath, 0o600);
|
|
58
|
+
};
|
|
59
|
+
const unquote = (value)=>value.replace(/^(['"])(.*)\1$/, '$2');
|
|
60
|
+
const parseNpmrc = (content)=>new Map(content.split(/\r?\n/).map((line)=>line.trim()).filter((line)=>line.length > 0 && !line.startsWith('#') && !line.startsWith(';')).map((line)=>{
|
|
61
|
+
const separatorIndex = line.indexOf('=');
|
|
62
|
+
return separatorIndex === -1 ? [
|
|
63
|
+
line,
|
|
64
|
+
''
|
|
65
|
+
] : [
|
|
66
|
+
line.slice(0, separatorIndex).trim(),
|
|
67
|
+
unquote(line.slice(separatorIndex + 1).trim())
|
|
68
|
+
];
|
|
69
|
+
}));
|
|
70
|
+
const withoutTrailingSlash = (url)=>url?.replace(/\/+$/, '');
|
|
71
|
+
const isEnvironmentVariableReference = (value)=>value?.startsWith('${') ?? false;
|
|
72
|
+
const inspectNpmrc = async (filePath, license, registry, writtenToken)=>{
|
|
73
|
+
const content = await readFileIfExists(filePath);
|
|
74
|
+
const entries = parseNpmrc(content);
|
|
75
|
+
const scopeRegistry = entries.get(SCOPE_REGISTRY_KEY);
|
|
76
|
+
const registryToken = entries.get(registry.tokenKey);
|
|
77
|
+
const outcome = (status)=>({
|
|
78
|
+
status,
|
|
79
|
+
filePath,
|
|
80
|
+
expectedConfiguration: buildNpmrcConfiguration(LICENSE_PLACEHOLDER, registry)
|
|
81
|
+
});
|
|
82
|
+
if (scopeRegistry === undefined && registryToken === undefined) {
|
|
83
|
+
return {
|
|
84
|
+
status: 'not-configured',
|
|
85
|
+
filePath,
|
|
86
|
+
expectedConfiguration: buildNpmrcConfiguration(LICENSE_PLACEHOLDER, registry),
|
|
87
|
+
linesToAdd: buildNpmrcConfiguration(writtenToken, registry)
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const isScopeRegistryCorrect = withoutTrailingSlash(scopeRegistry) === withoutTrailingSlash(registry.url);
|
|
91
|
+
if (isEnvironmentVariableReference(registryToken)) {
|
|
92
|
+
return outcome(isScopeRegistryCorrect ? 'uses-environment-variable' : 'manual-edit-needed');
|
|
93
|
+
}
|
|
94
|
+
if (registryToken === license && isScopeRegistryCorrect) {
|
|
95
|
+
return outcome('already-configured');
|
|
96
|
+
}
|
|
97
|
+
if (registryToken !== undefined && registryToken !== license) {
|
|
98
|
+
return outcome('different-license');
|
|
99
|
+
}
|
|
100
|
+
return outcome('manual-edit-needed');
|
|
101
|
+
};
|
|
102
|
+
const indentationOf = (line)=>line.search(/\S/);
|
|
103
|
+
const isYarnrcContentLine = (line)=>line.trim() !== '' && !line.trim().startsWith('#');
|
|
104
|
+
const readYarnrcKey = (line)=>/^\s*(["']?)([^"':]+(?::\/\/[^"']+)?)\1\s*:/.exec(line)?.[2];
|
|
105
|
+
const readYarnrcEntry = (content, topLevelKey, isWantedEntry)=>{
|
|
106
|
+
const lines = content.split(/\r?\n/);
|
|
107
|
+
const topLevelIndex = lines.findIndex((line)=>new RegExp(`^${topLevelKey}\\s*:\\s*(#.*)?$`).test(line));
|
|
108
|
+
if (topLevelIndex === -1) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
let entryIndentation;
|
|
112
|
+
let settings;
|
|
113
|
+
for (const line of lines.slice(topLevelIndex + 1).filter(isYarnrcContentLine)){
|
|
114
|
+
const indentation = indentationOf(line);
|
|
115
|
+
if (indentation === 0) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
entryIndentation ?? (entryIndentation = indentation);
|
|
119
|
+
if (indentation <= entryIndentation) {
|
|
120
|
+
if (settings) {
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
const entryKey = readYarnrcKey(line);
|
|
124
|
+
settings = entryKey !== undefined && isWantedEntry(entryKey) ? new Map() : undefined;
|
|
125
|
+
} else if (settings) {
|
|
126
|
+
const settingMatch = /^\s*([A-Za-z]+)\s*:\s*(.*)$/.exec(line);
|
|
127
|
+
if (settingMatch) {
|
|
128
|
+
settings.set(settingMatch[1], unquote(settingMatch[2].trim()));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return settings;
|
|
133
|
+
};
|
|
134
|
+
const readYarnrcScope = (content)=>readYarnrcEntry(content, 'npmScopes', (entryKey)=>entryKey === YARNRC_SCOPE_NAME);
|
|
135
|
+
const readYarnrcToken = (content, registry)=>{
|
|
136
|
+
const normalize = (url)=>withoutTrailingSlash(url.replace(/^https?:/, ''));
|
|
137
|
+
const registryEntry = readYarnrcEntry(content, 'npmRegistries', (entryKey)=>normalize(entryKey) === normalize(registry.url));
|
|
138
|
+
return readYarnrcScope(content)?.get('npmAuthToken') ?? registryEntry?.get('npmAuthToken');
|
|
139
|
+
};
|
|
140
|
+
const inspectYarnrc = async (filePath, license, registry, writtenToken)=>{
|
|
141
|
+
const content = await readFileIfExists(filePath);
|
|
142
|
+
const scope = readYarnrcScope(content);
|
|
143
|
+
const outcome = (status)=>({
|
|
144
|
+
status,
|
|
145
|
+
filePath,
|
|
146
|
+
expectedConfiguration: buildYarnrcScopeConfiguration(LICENSE_PLACEHOLDER, registry),
|
|
147
|
+
yarnrcScope: scope === undefined ? 'missing' : 'present'
|
|
148
|
+
});
|
|
149
|
+
if (!/^npmScopes\s*:/m.test(content)) {
|
|
150
|
+
return {
|
|
151
|
+
status: 'not-configured',
|
|
152
|
+
filePath,
|
|
153
|
+
expectedConfiguration: buildYarnrcConfiguration(LICENSE_PLACEHOLDER, registry),
|
|
154
|
+
linesToAdd: buildYarnrcConfiguration(writtenToken, registry)
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (scope === undefined) {
|
|
158
|
+
return outcome('manual-edit-needed');
|
|
159
|
+
}
|
|
160
|
+
const token = readYarnrcToken(content, registry);
|
|
161
|
+
const isScopeRegistryCorrect = withoutTrailingSlash(scope.get('npmRegistryServer')) === withoutTrailingSlash(registry.url);
|
|
162
|
+
if (isEnvironmentVariableReference(token)) {
|
|
163
|
+
// A reference only works once the scope points to the registry.
|
|
164
|
+
return outcome(isScopeRegistryCorrect ? 'uses-environment-variable' : 'manual-edit-needed');
|
|
165
|
+
}
|
|
166
|
+
if (token !== undefined && token !== license) {
|
|
167
|
+
return outcome('different-license');
|
|
168
|
+
}
|
|
169
|
+
// The license may be set for another registry, such as a local one used for testing.
|
|
170
|
+
return outcome(token === license && isScopeRegistryCorrect ? 'already-configured' : 'manual-edit-needed');
|
|
171
|
+
};
|
|
172
|
+
const describeManualEdit = (yarnrcScope)=>{
|
|
173
|
+
if (yarnrcScope === 'present') {
|
|
174
|
+
return `Replace its ${YARNRC_SCOPE_NAME} scope with this`;
|
|
175
|
+
}
|
|
176
|
+
return yarnrcScope === 'missing' ? 'Add this under its existing npmScopes key' : 'Add this to it';
|
|
177
|
+
};
|
|
178
|
+
const assertRegistryAccessUsable = ({ outcome: { status, filePath, expectedConfiguration, yarnrcScope }, overridingFiles, registryHost, userConfigPath })=>{
|
|
179
|
+
if (status === 'different-license') {
|
|
180
|
+
const replacedLines = yarnrcScope ? `its ${YARNRC_SCOPE_NAME} scope` : 'those lines';
|
|
181
|
+
throw new errors.EnterpriseInstallError(`${filePath} already sets up ${registryHost} with another license, so installing would fail. Replace ${replacedLines} with:\n\n${expectedConfiguration}\n`);
|
|
182
|
+
}
|
|
183
|
+
if (status === 'manual-edit-needed') {
|
|
184
|
+
throw new errors.EnterpriseInstallError(`${filePath} could not be updated automatically. ${describeManualEdit(yarnrcScope)}, then run the command again:\n\n${expectedConfiguration}\n`);
|
|
185
|
+
}
|
|
186
|
+
if (overridingFiles.length > 0) {
|
|
187
|
+
throw new errors.EnterpriseInstallError([
|
|
188
|
+
...overridingFiles.map((filePath)=>`${filePath} sets another license for ${registryHost} and takes precedence over ${userConfigPath}.`),
|
|
189
|
+
'Update or remove that line, then run the command again.'
|
|
190
|
+
].join('\n'));
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
const isWorkspaceRoot = async (directory)=>{
|
|
194
|
+
if (await fse__default.default.pathExists(path__default.default.join(directory, 'pnpm-workspace.yaml'))) {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
const packageJson = await fse__default.default.readJson(path__default.default.join(directory, 'package.json'));
|
|
199
|
+
return packageJson?.workspaces !== undefined;
|
|
200
|
+
} catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
const listProjectConfigDirectories = async (appDir, packageManager)=>{
|
|
205
|
+
const [appDirectory, ...parentDirectories] = directories.listAncestorDirectories(appDir);
|
|
206
|
+
if (packageManager.name === 'yarn') {
|
|
207
|
+
return [
|
|
208
|
+
appDirectory,
|
|
209
|
+
...parentDirectories
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
for (const directory of parentDirectories){
|
|
213
|
+
if (await isWorkspaceRoot(directory)) {
|
|
214
|
+
return [
|
|
215
|
+
directory
|
|
216
|
+
];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return [
|
|
220
|
+
appDirectory
|
|
221
|
+
];
|
|
222
|
+
};
|
|
223
|
+
const findOverridingConfigFiles = async ({ appDir, packageManager: packageManager$1, userConfigPaths, license, registry })=>{
|
|
224
|
+
const usesYarnrcYml = packageManager.readsYarnrcYml(packageManager$1);
|
|
225
|
+
const fileName = usesYarnrcYml ? '.yarnrc.yml' : '.npmrc';
|
|
226
|
+
const skippedPaths = new Set(userConfigPaths.map((filePath)=>path__default.default.resolve(filePath)));
|
|
227
|
+
const overridingFiles = [];
|
|
228
|
+
for (const directory of (await listProjectConfigDirectories(appDir, packageManager$1))){
|
|
229
|
+
const filePath = path__default.default.join(directory, fileName);
|
|
230
|
+
if (skippedPaths.has(filePath)) {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const content = await readFileIfExists(filePath);
|
|
234
|
+
const token = usesYarnrcYml ? readYarnrcToken(content, registry) : parseNpmrc(content).get(registry.tokenKey);
|
|
235
|
+
if (token !== undefined && token !== license && !isEnvironmentVariableReference(token)) {
|
|
236
|
+
overridingFiles.push(filePath);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return overridingFiles;
|
|
240
|
+
};
|
|
241
|
+
const prepareRegistryAccess = async ({ appDir, packageManager: packageManager$1, license, licenseSource, logger, env, homeDir })=>{
|
|
242
|
+
const registry = describeRegistry(constants.ENTERPRISE_REGISTRY_URL);
|
|
243
|
+
const usesYarnrcYml = packageManager.readsYarnrcYml(packageManager$1);
|
|
244
|
+
const userConfigPath = usesYarnrcYml ? getUserYarnrcPath(homeDir) : getUserNpmrcPath(env, homeDir);
|
|
245
|
+
const referencesLicense = shouldReferenceLicense(licenseSource, env);
|
|
246
|
+
const licenseReference = usesYarnrcYml ? YARNRC_LICENSE_REFERENCE : NPMRC_LICENSE_REFERENCE;
|
|
247
|
+
const writtenToken = referencesLicense ? licenseReference : license;
|
|
248
|
+
const outcome = usesYarnrcYml ? await inspectYarnrc(userConfigPath, license, registry, writtenToken) : await inspectNpmrc(userConfigPath, license, registry, writtenToken);
|
|
249
|
+
const overridingFiles = await findOverridingConfigFiles({
|
|
250
|
+
appDir,
|
|
251
|
+
packageManager: packageManager$1,
|
|
252
|
+
userConfigPaths: [
|
|
253
|
+
userConfigPath,
|
|
254
|
+
path__default.default.join(homeDir, usesYarnrcYml ? '.yarnrc.yml' : '.npmrc')
|
|
255
|
+
],
|
|
256
|
+
license,
|
|
257
|
+
registry
|
|
258
|
+
});
|
|
259
|
+
assertRegistryAccessUsable({
|
|
260
|
+
outcome,
|
|
261
|
+
overridingFiles,
|
|
262
|
+
registryHost: registry.host,
|
|
263
|
+
userConfigPath
|
|
264
|
+
});
|
|
265
|
+
if (outcome.status === 'already-configured') {
|
|
266
|
+
logger.info(`Access to ${registry.host} is already configured in ${userConfigPath}.`);
|
|
267
|
+
}
|
|
268
|
+
if (outcome.status === 'uses-environment-variable') {
|
|
269
|
+
logger.info(`${userConfigPath} reads the ${registry.host} token from an environment variable. Make sure it holds your Strapi license.`);
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
outcome,
|
|
273
|
+
async apply () {
|
|
274
|
+
if (outcome.status !== 'not-configured') {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
await appendToFile(userConfigPath, outcome.linesToAdd);
|
|
278
|
+
logger.success(referencesLicense ? `Configured access to ${registry.host} in ${userConfigPath}, reading the license from STRAPI_LICENSE.` : `Configured access to ${registry.host} in ${userConfigPath}.`);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
exports.buildNpmrcConfiguration = buildNpmrcConfiguration;
|
|
284
|
+
exports.buildYarnrcConfiguration = buildYarnrcConfiguration;
|
|
285
|
+
exports.describeRegistry = describeRegistry;
|
|
286
|
+
exports.findOverridingConfigFiles = findOverridingConfigFiles;
|
|
287
|
+
exports.getUserNpmrcPath = getUserNpmrcPath;
|
|
288
|
+
exports.getUserYarnrcPath = getUserYarnrcPath;
|
|
289
|
+
exports.inspectNpmrc = inspectNpmrc;
|
|
290
|
+
exports.inspectYarnrc = inspectYarnrc;
|
|
291
|
+
exports.listProjectConfigDirectories = listProjectConfigDirectories;
|
|
292
|
+
exports.prepareRegistryAccess = prepareRegistryAccess;
|
|
293
|
+
//# sourceMappingURL=registry-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-access.js","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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"}
|