@strapi/strapi 5.57.0 → 5.59.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/README.md +1 -1
- package/dist/cli/commands/enterprise/install/action.d.ts +0 -1
- package/dist/cli/commands/enterprise/install/action.d.ts.map +1 -1
- package/dist/cli/commands/enterprise/install/license.d.ts +2 -3
- package/dist/cli/commands/enterprise/install/license.d.ts.map +1 -1
- package/dist/cli/commands/enterprise/install/package-manager.d.ts.map +1 -1
- package/dist/cli/commands/enterprise/install/registry-access.d.ts.map +1 -1
- package/dist/node/create-build-context.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/enterprise/install/action.js +0 -2
- package/dist/src/cli/commands/enterprise/install/action.js.map +1 -1
- package/dist/src/cli/commands/enterprise/install/action.mjs +0 -2
- package/dist/src/cli/commands/enterprise/install/action.mjs.map +1 -1
- package/dist/src/cli/commands/enterprise/install/license.js +6 -12
- package/dist/src/cli/commands/enterprise/install/license.js.map +1 -1
- package/dist/src/cli/commands/enterprise/install/license.mjs +6 -12
- package/dist/src/cli/commands/enterprise/install/license.mjs.map +1 -1
- package/dist/src/cli/commands/enterprise/install/package-manager.js.map +1 -1
- package/dist/src/cli/commands/enterprise/install/package-manager.mjs.map +1 -1
- package/dist/src/cli/commands/enterprise/install/registry-access.js.map +1 -1
- package/dist/src/cli/commands/enterprise/install/registry-access.mjs.map +1 -1
- package/dist/src/node/create-build-context.js +5 -1
- package/dist/src/node/create-build-context.js.map +1 -1
- package/dist/src/node/create-build-context.mjs +5 -1
- package/dist/src/node/create-build-context.mjs.map +1 -1
- package/package.json +24 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/license.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport dotenv from 'dotenv';\n\nimport { getInquirer } from '../../../utils/get-inquirer';\nimport type { Logger } from '../../../utils/logger';\nimport { BILLING_URL, LICENSE_FILE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\n\nexport type LicenseSource = 'environment' | 'env-file' | 'license-file';\n\nexport interface FoundLicense {\n license: string;\n source: LicenseSource;\n}\n\nexport interface ResolvedLicense {\n license: string;\n /** `prompt` when the user pasted it, which also saved it to license.txt. */\n source: LicenseSource | 'prompt';\n}\n\nconst LICENSE_SOURCE_LABELS: Record<LicenseSource, string> = {\n environment: 'the STRAPI_LICENSE environment variable',\n 'env-file': 'STRAPI_LICENSE in .env',\n 'license-file': LICENSE_FILE_NAME,\n};\n\nconst cleanLicense = (value: string | undefined): string | undefined => value?.trim() || undefined;\n\nconst readLicenseFile = async (appDir: string): Promise<string | undefined> => {\n try {\n return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n};\n\ninterface LicenseInfo {\n expireAt?: string | number;\n}\n\nconst readLicenseInfo = (license: string): LicenseInfo => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: unknown = JSON.parse(Buffer.from(base64Content, 'base64').toString());\n\n if (typeof licenseInfo !== 'object' || licenseInfo === null) {\n throw new Error('Invalid license.');\n }\n\n return licenseInfo as LicenseInfo;\n};\n\nconst readEnvFileLicense = async (\n appDir: string,\n env: NodeJS.ProcessEnv\n): Promise<string | undefined> => {\n const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');\n\n if (!(await fse.pathExists(envFilePath))) {\n return undefined;\n }\n\n return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);\n};\n\nexport const findLicense = async ({\n appDir,\n env,\n}: {\n appDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<FoundLicense | undefined> => {\n const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);\n if (licenseFromEnvironment) {\n const isFromEnvFile = (await readEnvFileLicense(appDir, env)) === licenseFromEnvironment;\n\n return { license: licenseFromEnvironment, source: isFromEnvFile ? 'env-file' : 'environment' };\n }\n\n let licenseFromLicenseFile: string | undefined;\n\n try {\n licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));\n } catch {\n throw new EnterpriseInstallError(\n `Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`\n );\n }\n\n if (licenseFromLicenseFile) {\n return { license: licenseFromLicenseFile, source: 'license-file' };\n }\n\n return undefined;\n};\n\nexport const validateLicense = (license: string, now: Date): void => {\n let licenseInfo: LicenseInfo;\n\n try {\n licenseInfo = readLicenseInfo(license);\n } catch {\n throw new EnterpriseInstallError(\n `This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`\n );\n }\n\n const expiresAt = licenseInfo.expireAt === undefined ? undefined : new Date(licenseInfo.expireAt);\n\n if (expiresAt && !Number.isNaN(expiresAt.getTime()) && expiresAt.getTime() < now.getTime()) {\n throw new EnterpriseInstallError(\n `This Strapi license expired on ${expiresAt.toISOString().slice(0, 10)}. Renew it at ${BILLING_URL}`\n );\n }\n};\n\nexport const promptForLicense = async (): Promise<string> => {\n const inquirer = await getInquirer();\n const { license } = await inquirer.prompt<{ license: string }>([\n {\n type: 'password',\n name: 'license',\n message: 'Strapi license?',\n validate: (value: string) => value.trim().length > 0 || 'The license cannot be empty.',\n },\n ]);\n\n return license.trim();\n};\n\nconst isLicenseFileIgnored = (gitignoreContent: string): boolean =>\n gitignoreContent\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);\n\nconst ensureLicenseFileIsIgnored = async (appDir: string, logger: Logger): Promise<void> => {\n const gitignorePath = path.join(appDir, '.gitignore');\n const gitignoreContent = (await fse.pathExists(gitignorePath))\n ? await fse.readFile(gitignorePath, 'utf8')\n : '';\n\n if (isLicenseFileIgnored(gitignoreContent)) {\n return;\n }\n\n const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\\n') ? '\\n' : '';\n await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\\n`);\n logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);\n};\n\nexport const saveLicenseFile = async (\n appDir: string,\n license: string,\n logger: Logger\n): Promise<void> => {\n const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);\n\n await fse.writeFile(licenseFilePath, `${license}\\n`);\n // Also restricts a license.txt that already existed, empty, with wider permissions.\n await fse.chmod(licenseFilePath, 0o600);\n await ensureLicenseFileIsIgnored(appDir, logger);\n};\n\nexport const resolveLicense = async ({\n appDir,\n isInteractive,\n logger,\n env,\n now,\n prompt,\n}: {\n appDir: string;\n isInteractive: boolean;\n logger: Logger;\n env: NodeJS.ProcessEnv;\n now: Date;\n prompt: () => Promise<string>;\n}): Promise<ResolvedLicense> => {\n const foundLicense = await findLicense({ appDir, env });\n\n if (foundLicense) {\n validateLicense(foundLicense.license, now);\n logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);\n\n return foundLicense;\n }\n\n if (!isInteractive) {\n throw new EnterpriseInstallError(\n 'No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.'\n );\n }\n\n logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);\n\n const pastedLicense = await prompt();\n validateLicense(pastedLicense, now);\n await saveLicenseFile(appDir, pastedLicense, logger);\n logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);\n\n return { license: pastedLicense, source: 'prompt' };\n};\n"],"names":["LICENSE_SOURCE_LABELS","environment","LICENSE_FILE_NAME","cleanLicense","value","trim","undefined","readLicenseFile","appDir","fse","readFile","path","join","error","code","readLicenseInfo","license","signature","base64Content","Buffer","from","toString","split","Error","licenseInfo","JSON","parse","readEnvFileLicense","env","envFilePath","ENV_PATH","resolve","pathExists","dotenv","STRAPI_LICENSE","findLicense","licenseFromEnvironment","isFromEnvFile","source","licenseFromLicenseFile","EnterpriseInstallError","validateLicense","now","BILLING_URL","expiresAt","expireAt","Date","Number","isNaN","getTime","toISOString","slice","promptForLicense","inquirer","getInquirer","prompt","type","name","message","validate","length","isLicenseFileIgnored","gitignoreContent","map","line","some","ensureLicenseFileIsIgnored","logger","gitignorePath","separator","endsWith","writeFile","info","saveLicenseFile","licenseFilePath","chmod","resolveLicense","isInteractive","foundLicense","pastedLicense","success"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"license.mjs","sources":["../../../../../../src/cli/commands/enterprise/install/license.ts"],"sourcesContent":["import path from 'node:path';\nimport fse from 'fs-extra';\nimport dotenv from 'dotenv';\n\nimport { getInquirer } from '../../../utils/get-inquirer';\nimport type { Logger } from '../../../utils/logger';\nimport { BILLING_URL, LICENSE_FILE_NAME } from './constants';\nimport { EnterpriseInstallError } from './errors';\n\nexport type LicenseSource = 'environment' | 'env-file' | 'license-file';\n\nexport interface FoundLicense {\n license: string;\n source: LicenseSource;\n}\n\nexport interface ResolvedLicense {\n license: string;\n /** `prompt` when the user pasted it, which also saved it to license.txt. */\n source: LicenseSource | 'prompt';\n}\n\nconst LICENSE_SOURCE_LABELS: Record<LicenseSource, string> = {\n environment: 'the STRAPI_LICENSE environment variable',\n 'env-file': 'STRAPI_LICENSE in .env',\n 'license-file': LICENSE_FILE_NAME,\n};\n\nconst cleanLicense = (value: string | undefined): string | undefined => value?.trim() || undefined;\n\nconst readLicenseFile = async (appDir: string): Promise<string | undefined> => {\n try {\n return await fse.readFile(path.join(appDir, LICENSE_FILE_NAME), 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return undefined;\n }\n\n throw error;\n }\n};\n\nconst assertLicenseFormat = (license: string): void => {\n const [signature, base64Content] = Buffer.from(license, 'base64').toString().split('\\n');\n\n if (!signature || !base64Content) {\n throw new Error('Invalid license.');\n }\n\n const licenseInfo: unknown = JSON.parse(Buffer.from(base64Content, 'base64').toString());\n\n if (typeof licenseInfo !== 'object' || licenseInfo === null) {\n throw new Error('Invalid license.');\n }\n};\n\nconst readEnvFileLicense = async (\n appDir: string,\n env: NodeJS.ProcessEnv\n): Promise<string | undefined> => {\n const envFilePath = env.ENV_PATH ? path.resolve(appDir, env.ENV_PATH) : path.join(appDir, '.env');\n\n if (!(await fse.pathExists(envFilePath))) {\n return undefined;\n }\n\n return cleanLicense(dotenv.parse(await fse.readFile(envFilePath)).STRAPI_LICENSE);\n};\n\nexport const findLicense = async ({\n appDir,\n env,\n}: {\n appDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<FoundLicense | undefined> => {\n const licenseFromEnvironment = cleanLicense(env.STRAPI_LICENSE);\n if (licenseFromEnvironment) {\n const isFromEnvFile = (await readEnvFileLicense(appDir, env)) === licenseFromEnvironment;\n\n return { license: licenseFromEnvironment, source: isFromEnvFile ? 'env-file' : 'environment' };\n }\n\n let licenseFromLicenseFile: string | undefined;\n\n try {\n licenseFromLicenseFile = cleanLicense(await readLicenseFile(appDir));\n } catch {\n throw new EnterpriseInstallError(\n `Could not read ${LICENSE_FILE_NAME}. Check its permissions, or set STRAPI_LICENSE instead.`\n );\n }\n\n if (licenseFromLicenseFile) {\n return { license: licenseFromLicenseFile, source: 'license-file' };\n }\n\n return undefined;\n};\n\nexport const validateLicense = (license: string): void => {\n try {\n assertLicenseFormat(license);\n } catch {\n throw new EnterpriseInstallError(\n `This Strapi license is not valid. Check that you copied all of it, or find it at ${BILLING_URL}`\n );\n }\n};\n\nexport const promptForLicense = async (): Promise<string> => {\n const inquirer = await getInquirer();\n const { license } = await inquirer.prompt<{ license: string }>([\n {\n type: 'password',\n name: 'license',\n message: 'Strapi license?',\n validate: (value: string) => value.trim().length > 0 || 'The license cannot be empty.',\n },\n ]);\n\n return license.trim();\n};\n\nconst isLicenseFileIgnored = (gitignoreContent: string): boolean =>\n gitignoreContent\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === LICENSE_FILE_NAME || line === `/${LICENSE_FILE_NAME}`);\n\nconst ensureLicenseFileIsIgnored = async (appDir: string, logger: Logger): Promise<void> => {\n const gitignorePath = path.join(appDir, '.gitignore');\n const gitignoreContent = (await fse.pathExists(gitignorePath))\n ? await fse.readFile(gitignorePath, 'utf8')\n : '';\n\n if (isLicenseFileIgnored(gitignoreContent)) {\n return;\n }\n\n const separator = gitignoreContent.length > 0 && !gitignoreContent.endsWith('\\n') ? '\\n' : '';\n await fse.writeFile(gitignorePath, `${gitignoreContent}${separator}${LICENSE_FILE_NAME}\\n`);\n logger.info(`Added ${LICENSE_FILE_NAME} to .gitignore so the license is not committed.`);\n};\n\nexport const saveLicenseFile = async (\n appDir: string,\n license: string,\n logger: Logger\n): Promise<void> => {\n const licenseFilePath = path.join(appDir, LICENSE_FILE_NAME);\n\n await fse.writeFile(licenseFilePath, `${license}\\n`);\n // Also restricts a license.txt that already existed, empty, with wider permissions.\n await fse.chmod(licenseFilePath, 0o600);\n await ensureLicenseFileIsIgnored(appDir, logger);\n};\n\nexport const resolveLicense = async ({\n appDir,\n isInteractive,\n logger,\n env,\n prompt,\n}: {\n appDir: string;\n isInteractive: boolean;\n logger: Logger;\n env: NodeJS.ProcessEnv;\n prompt: () => Promise<string>;\n}): Promise<ResolvedLicense> => {\n const foundLicense = await findLicense({ appDir, env });\n\n if (foundLicense) {\n validateLicense(foundLicense.license);\n logger.info(`Using the Strapi license from ${LICENSE_SOURCE_LABELS[foundLicense.source]}.`);\n\n return foundLicense;\n }\n\n if (!isInteractive) {\n throw new EnterpriseInstallError(\n 'No Strapi license found. Set STRAPI_LICENSE, or run the command in a terminal to paste it.'\n );\n }\n\n logger.info(`No Strapi license found. You can find yours at ${BILLING_URL}`);\n\n const pastedLicense = await prompt();\n validateLicense(pastedLicense);\n await saveLicenseFile(appDir, pastedLicense, logger);\n logger.success(`Saved the license to ${LICENSE_FILE_NAME}.`);\n\n return { license: pastedLicense, source: 'prompt' };\n};\n"],"names":["LICENSE_SOURCE_LABELS","environment","LICENSE_FILE_NAME","cleanLicense","value","trim","undefined","readLicenseFile","appDir","fse","readFile","path","join","error","code","assertLicenseFormat","license","signature","base64Content","Buffer","from","toString","split","Error","licenseInfo","JSON","parse","readEnvFileLicense","env","envFilePath","ENV_PATH","resolve","pathExists","dotenv","STRAPI_LICENSE","findLicense","licenseFromEnvironment","isFromEnvFile","source","licenseFromLicenseFile","EnterpriseInstallError","validateLicense","BILLING_URL","promptForLicense","inquirer","getInquirer","prompt","type","name","message","validate","length","isLicenseFileIgnored","gitignoreContent","map","line","some","ensureLicenseFileIsIgnored","logger","gitignorePath","separator","endsWith","writeFile","info","saveLicenseFile","licenseFilePath","chmod","resolveLicense","isInteractive","foundLicense","pastedLicense","success"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.js","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
|
|
1
|
+
{"version":3,"file":"package-manager.js","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 } | { 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":";;;;;;;;;;;;;;AAaA,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,uBAAM,MAAA,EAAQ;AAAC,QAAA;KAAY,EAAE;QAAEC,GAAAA,EAAKH;AAAO,KAAA,CAAA,CAAGI,KAAK,CAAC,IAAA;AAC3E,QAAA,MAAM,IAAIC,6BAAAA,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,6BAAAA,CAAuBP,oBAAAA,CAAAA;AACnC,IAAA;IAEA,OAAOF,YAAAA;AACT,CAAA;AAEO,MAAMa,uBAAuB,OAAOT,MAAAA,GAAAA;AACzC,IAAA,MAAMU,WAAAA,GAAc,MAAMC,oBAAAA,CAAIC,QAAQ,CAACC,qBAAAA,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,oBAAAA,CAAoBC,YAAY,CAACnB,MAAAA,CAAAA,CAAQI,KAAK,CAAC,IAAA;AAC9E,QAAA,MAAM,IAAIC,6BAAAA,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;;;;;;"}
|
|
@@ -1 +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
|
|
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 } | { 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":";;;;;;AAaA,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;;;;"}
|
|
@@ -1 +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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"}
|
|
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' | 'uses-environment-variable' | 'different-license' | '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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"}
|
|
@@ -1 +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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"}
|
|
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' | 'uses-environment-variable' | 'different-license' | '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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"}
|
|
@@ -75,8 +75,12 @@ const createBuildContext = async ({ cwd, logger, tsconfig, strapi, options = {},
|
|
|
75
75
|
// NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always
|
|
76
76
|
// assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree
|
|
77
77
|
// with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.
|
|
78
|
+
// The path is only used for the access cookie, which the panel reads from its own pages,
|
|
79
|
+
// so it falls back to the path the browser loads the panel from, matching
|
|
80
|
+
// getAccessCookiePath() in @strapi/admin.
|
|
78
81
|
env$1.STRAPI_ADMIN_AUTH_COOKIE_NAME = strapiInstance.config.get('admin.auth.cookie.name') || '';
|
|
79
|
-
|
|
82
|
+
const configuredCookiePath = strapiInstance.config.get('admin.auth.cookie.path');
|
|
83
|
+
env$1.STRAPI_ADMIN_AUTH_COOKIE_PATH = typeof configuredCookiePath === 'string' && configuredCookiePath.trim() !== '' ? configuredCookiePath : adminPublicPath;
|
|
80
84
|
env$1.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN = strapiInstance.config.get('admin.auth.cookie.domain') || strapiInstance.config.get('admin.auth.domain') || '';
|
|
81
85
|
const envKeys = Object.keys(env$1);
|
|
82
86
|
if (envKeys.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-build-context.js","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport { getScanRoots } from './core/scan-roots';\nimport { getModulePath } from './core/resolve-module';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemap?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n}\n\ninterface BuildContext extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n /**\n * True when the `unstableNextDesignSystem` future flag is on and the bundler is Vite. The single\n * decision point for the Tailwind plugin, the host stylesheet and the scan roots\n */\n nextDesignSystem: boolean;\n /** The directories Tailwind scans. Computed once: the stylesheet, Vite and the watcher share it */\n scanRoots: string[];\n}\n\ninterface CreateBuildContextArgs extends CLIContext {\n strapi?: Core.Strapi;\n options?: BaseOptions;\n /** If true, Tailwind scans source and not `dist`. E.g. for Vite development server, which serves `admin/src` */\n dev?: boolean;\n}\n\nconst NEXT_DESIGN_SYSTEM_FLAG = 'unstableNextDesignSystem';\n\n/** The export the flag-on stylesheet imports. Only a design system release with the `next` entry has it */\nconst NEXT_DESIGN_SYSTEM_ENTRY = '@strapi/design-system/next/source.css';\n\n/** Fails the build when @strapi/admin's closure has no next design system entry, the root the Vite alias resolves from */\nconst assertNextDesignSystemEntry = (): void => {\n try {\n getModulePath(NEXT_DESIGN_SYSTEM_ENTRY);\n } catch {\n throw new Error(\n [\n `The ${NEXT_DESIGN_SYSTEM_FLAG} future flag needs a @strapi/design-system release that ships the \"next\" entry, but ${NEXT_DESIGN_SYSTEM_ENTRY} does not resolve.`,\n 'Point the application package.json at such a release:',\n '',\n '\"resolutions\": { \"@strapi/design-system\": \"<version>\" }',\n '',\n 'npm and pnpm users use \"overrides\" in place of \"resolutions\", with the key at the top level of the object.',\n 'An entry in \"dependencies\" is not enough. The override must be global, so that @strapi/admin gets the same copy.',\n 'The current release is the alpha dist-tag on npm, see `npm view @strapi/design-system dist-tags`.',\n ].join(os.EOL)\n );\n }\n};\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async ({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {},\n dev = false,\n}: CreateBuildContextArgs): Promise<BuildContext> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n // NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always\n // assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree\n // with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.\n env.STRAPI_ADMIN_AUTH_COOKIE_NAME =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.name') || '';\n env.STRAPI_ADMIN_AUTH_COOKIE_PATH =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.path') || '';\n env.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.domain') ||\n strapiInstance.config.get<string | undefined>('admin.auth.domain') ||\n '';\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.debug(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const flagEnabled = strapiInstance.features.future.isEnabled(NEXT_DESIGN_SYSTEM_FLAG);\n\n if (flagEnabled && bundler !== 'vite') {\n logger.warn(\n `The ${NEXT_DESIGN_SYSTEM_FLAG} future flag needs Vite. Tailwind is not available under ${bundler}, so this build has no next design system`\n );\n }\n\n const nextDesignSystem = flagEnabled && bundler === 'vite';\n\n if (nextDesignSystem) {\n assertNextDesignSystemEntry();\n }\n\n const scanRoots = nextDesignSystem\n ? await getScanRoots({ cwd, runtimeDir, plugins: pluginsWithFront, customisations }, dev)\n : [];\n\n if (nextDesignSystem) {\n logger.debug('Tailwind scan roots', os.EOL, scanRoots);\n }\n\n const buildContext: BuildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n nextDesignSystem,\n options: restOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n scanRoots,\n strapi: strapiInstance,\n target,\n tsconfig,\n };\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["NEXT_DESIGN_SYSTEM_FLAG","NEXT_DESIGN_SYSTEM_ENTRY","assertNextDesignSystemEntry","getModulePath","Error","join","os","EOL","DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","dev","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","STRAPI_ADMIN_AUTH_COOKIE_NAME","STRAPI_ADMIN_AUTH_COOKIE_PATH","STRAPI_ADMIN_AUTH_COOKIE_DOMAIN","envKeys","Object","keys","length","debug","map","key","distPath","path","dist","relative","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","flagEnabled","future","isEnabled","warn","nextDesignSystem","scanRoots","getScanRoots","buildContext","basePath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-build-context.js","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport { getScanRoots } from './core/scan-roots';\nimport { getModulePath } from './core/resolve-module';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemap?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n}\n\ninterface BuildContext extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n /**\n * True when the `unstableNextDesignSystem` future flag is on and the bundler is Vite. The single\n * decision point for the Tailwind plugin, the host stylesheet and the scan roots\n */\n nextDesignSystem: boolean;\n /** The directories Tailwind scans. Computed once: the stylesheet, Vite and the watcher share it */\n scanRoots: string[];\n}\n\ninterface CreateBuildContextArgs extends CLIContext {\n strapi?: Core.Strapi;\n options?: BaseOptions;\n /** If true, Tailwind scans source and not `dist`. E.g. for Vite development server, which serves `admin/src` */\n dev?: boolean;\n}\n\nconst NEXT_DESIGN_SYSTEM_FLAG = 'unstableNextDesignSystem';\n\n/** The export the flag-on stylesheet imports. Only a design system release with the `next` entry has it */\nconst NEXT_DESIGN_SYSTEM_ENTRY = '@strapi/design-system/next/source.css';\n\n/** Fails the build when @strapi/admin's closure has no next design system entry, the root the Vite alias resolves from */\nconst assertNextDesignSystemEntry = (): void => {\n try {\n getModulePath(NEXT_DESIGN_SYSTEM_ENTRY);\n } catch {\n throw new Error(\n [\n `The ${NEXT_DESIGN_SYSTEM_FLAG} future flag needs a @strapi/design-system release that ships the \"next\" entry, but ${NEXT_DESIGN_SYSTEM_ENTRY} does not resolve.`,\n 'Point the application package.json at such a release:',\n '',\n '\"resolutions\": { \"@strapi/design-system\": \"<version>\" }',\n '',\n 'npm and pnpm users use \"overrides\" in place of \"resolutions\", with the key at the top level of the object.',\n 'An entry in \"dependencies\" is not enough. The override must be global, so that @strapi/admin gets the same copy.',\n 'The current release is the alpha dist-tag on npm, see `npm view @strapi/design-system dist-tags`.',\n ].join(os.EOL)\n );\n }\n};\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async ({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {},\n dev = false,\n}: CreateBuildContextArgs): Promise<BuildContext> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n // NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always\n // assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree\n // with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.\n // The path is only used for the access cookie, which the panel reads from its own pages,\n // so it falls back to the path the browser loads the panel from, matching\n // getAccessCookiePath() in @strapi/admin.\n env.STRAPI_ADMIN_AUTH_COOKIE_NAME =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.name') || '';\n const configuredCookiePath = strapiInstance.config.get<unknown>('admin.auth.cookie.path');\n env.STRAPI_ADMIN_AUTH_COOKIE_PATH =\n typeof configuredCookiePath === 'string' && configuredCookiePath.trim() !== ''\n ? configuredCookiePath\n : adminPublicPath;\n env.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN =\n strapiInstance.config.get<string | undefined>('admin.auth.cookie.domain') ||\n strapiInstance.config.get<string | undefined>('admin.auth.domain') ||\n '';\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.debug(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const flagEnabled = strapiInstance.features.future.isEnabled(NEXT_DESIGN_SYSTEM_FLAG);\n\n if (flagEnabled && bundler !== 'vite') {\n logger.warn(\n `The ${NEXT_DESIGN_SYSTEM_FLAG} future flag needs Vite. Tailwind is not available under ${bundler}, so this build has no next design system`\n );\n }\n\n const nextDesignSystem = flagEnabled && bundler === 'vite';\n\n if (nextDesignSystem) {\n assertNextDesignSystemEntry();\n }\n\n const scanRoots = nextDesignSystem\n ? await getScanRoots({ cwd, runtimeDir, plugins: pluginsWithFront, customisations }, dev)\n : [];\n\n if (nextDesignSystem) {\n logger.debug('Tailwind scan roots', os.EOL, scanRoots);\n }\n\n const buildContext: BuildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n nextDesignSystem,\n options: restOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n scanRoots,\n strapi: strapiInstance,\n target,\n tsconfig,\n };\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["NEXT_DESIGN_SYSTEM_FLAG","NEXT_DESIGN_SYSTEM_ENTRY","assertNextDesignSystemEntry","getModulePath","Error","join","os","EOL","DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","dev","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","STRAPI_ADMIN_AUTH_COOKIE_NAME","configuredCookiePath","STRAPI_ADMIN_AUTH_COOKIE_PATH","trim","STRAPI_ADMIN_AUTH_COOKIE_DOMAIN","envKeys","Object","keys","length","debug","map","key","distPath","path","dist","relative","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","flagEnabled","future","isEnabled","warn","nextDesignSystem","scanRoots","getScanRoots","buildContext","basePath"],"mappings":"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"}
|
|
@@ -66,8 +66,12 @@ const createBuildContext = async ({ cwd, logger, tsconfig, strapi, options = {},
|
|
|
66
66
|
// NOTE: Transports `admin.auth.cookie.name` / `path` / `domain` into the bundle; always
|
|
67
67
|
// assigned so ambient STRAPI_ADMIN_AUTH_COOKIE_* env vars cannot make the bundle disagree
|
|
68
68
|
// with the server. Domain falls back to `admin.auth.domain`, matching the server resolution.
|
|
69
|
+
// The path is only used for the access cookie, which the panel reads from its own pages,
|
|
70
|
+
// so it falls back to the path the browser loads the panel from, matching
|
|
71
|
+
// getAccessCookiePath() in @strapi/admin.
|
|
69
72
|
env.STRAPI_ADMIN_AUTH_COOKIE_NAME = strapiInstance.config.get('admin.auth.cookie.name') || '';
|
|
70
|
-
|
|
73
|
+
const configuredCookiePath = strapiInstance.config.get('admin.auth.cookie.path');
|
|
74
|
+
env.STRAPI_ADMIN_AUTH_COOKIE_PATH = typeof configuredCookiePath === 'string' && configuredCookiePath.trim() !== '' ? configuredCookiePath : adminPublicPath;
|
|
71
75
|
env.STRAPI_ADMIN_AUTH_COOKIE_DOMAIN = strapiInstance.config.get('admin.auth.cookie.domain') || strapiInstance.config.get('admin.auth.domain') || '';
|
|
72
76
|
const envKeys = Object.keys(env);
|
|
73
77
|
if (envKeys.length > 0) {
|