UNPKG

create-strapi-app

Version:

Generate a new Strapi application.

1 lines 7.78 kB
{"version":3,"file":"get-package-manager-args.mjs","sources":["../../src/utils/get-package-manager-args.ts"],"sourcesContent":["import execa from 'execa';\nimport semver from 'semver';\n\nconst installArguments = ['install'];\n\ntype VersionedArgumentsMap = {\n [key: string]: string[]; // Maps semver ranges to argument arrays\n};\n\ntype VersionedEnvMap = {\n [key: string]: Record<string, string>; // Maps semver ranges to environment variables\n};\n\n// Set command line options for specific package managers, with full semver ranges\nconst installArgumentsMap: {\n [key: string]: VersionedArgumentsMap;\n} = {\n npm: {\n '*': ['--legacy-peer-deps'],\n },\n yarn: {\n '<4': ['--network-timeout', '1000000'],\n '*': [],\n },\n pnpm: {\n '*': [],\n },\n};\n\n// Set environment variables for specific package managers, with full semver ranges\nconst installEnvMap: {\n [key: string]: VersionedEnvMap;\n} = {\n yarn: {\n '>=4': { YARN_HTTP_TIMEOUT: '1000000' },\n '*': {},\n },\n npm: {\n '*': {},\n },\n pnpm: {\n '*': {},\n },\n};\n\n/**\n * Retrieves the version of the specified package manager.\n *\n * Executes the package manager's `--version` command to determine its version.\n *\n * @param packageManager - The name of the package manager (e.g., 'npm', 'yarn', 'pnpm').\n * @param options - Optional execution options to pass to `execa`.\n * @returns A promise that resolves to the trimmed version string of the package manager.\n *\n * @throws Will throw an error if the package manager's version cannot be determined.\n */\nexport const getPackageManagerVersion = async (\n packageManager: string,\n options?: execa.Options\n): Promise<string> => {\n try {\n const { stdout } = await execa(packageManager, ['--version'], options);\n return stdout.trim();\n } catch (err) {\n throw new Error(`Error detecting ${packageManager} version: ${err}`);\n }\n};\n\n/**\n * Merges all matching semver ranges using a custom merge function.\n *\n * Iterates over the `versionMap`, checking if the provided `version` satisfies each semver range.\n * If it does, the corresponding value is merged using the provided `mergeFn`.\n * The merging starts with the value associated with the wildcard '*' key.\n *\n * @param version - The package manager version to check against the ranges.\n * @param versionMap - A map of semver ranges to corresponding values (arguments or environment variables).\n * @param mergeFn - A function that defines how to merge two values (accumulated and current).\n * @returns The merged result of all matching ranges.\n */\nfunction mergeMatchingVersionRanges<T>(\n version: string,\n versionMap: { [key: string]: T },\n mergeFn: (acc: T, curr: T) => T\n): T {\n return Object.keys(versionMap).reduce((acc, range) => {\n if (semver.satisfies(version, range) || range === '*') {\n return mergeFn(acc, versionMap[range]);\n }\n return acc;\n }, versionMap['*']); // Start with the wildcard entry\n}\n\nfunction mergeArguments(acc: string[], curr: string[]): string[] {\n return [...acc, ...curr];\n}\n\nfunction mergeEnvVars(\n acc: Record<string, string>,\n curr: Record<string, string>\n): Record<string, string> {\n return { ...acc, ...curr };\n}\n\n/**\n * Retrieves the install arguments and environment variables for a given package manager.\n *\n * This function determines the correct command line arguments and environment variables\n * based on the package manager's version. It uses predefined semver ranges to match\n * the package manager's version and merges all applicable settings.\n *\n * The arguments and environment variables are sourced from:\n * - `installArgumentsMap` for command line arguments.\n * - `installEnvMap` for environment variables.\n *\n * The function ensures that all matching semver ranges are considered and merged appropriately.\n * It always includes the base `installArguments` (e.g., `['install']`) and applies any additional\n * arguments or environment variables as defined by the matched version ranges.\n *\n * @param packageManager - The name of the package manager (e.g., 'npm', 'yarn', 'pnpm').\n * @param options - Optional execution options to pass to `execa`.\n * @returns An object containing:\n * - `cmdArgs`: The full array of install arguments for the given package manager and version.\n * - `envArgs`: The merged environment variables applicable to the package manager and version.\n *\n * @throws Will throw an error if the package manager version cannot be determined.\n */\nexport const getInstallArgs = async (packageManager: string, options?: execa.Options) => {\n const packageManagerVersion = await getPackageManagerVersion(packageManager, options);\n\n // Get environment variables\n const envMap = installEnvMap[packageManager];\n const envArgs = packageManagerVersion\n ? mergeMatchingVersionRanges(packageManagerVersion, envMap, mergeEnvVars)\n : envMap['*'];\n\n // Get install arguments\n const argsMap = installArgumentsMap[packageManager];\n const cmdArgs = packageManagerVersion\n ? mergeMatchingVersionRanges(packageManagerVersion, argsMap, mergeArguments)\n : argsMap['*'];\n\n return { envArgs, cmdArgs: [...installArguments, ...cmdArgs], version: packageManagerVersion };\n};\n"],"names":["installArguments","installArgumentsMap","npm","yarn","pnpm","installEnvMap","YARN_HTTP_TIMEOUT","getPackageManagerVersion","packageManager","options","stdout","execa","trim","err","Error","mergeMatchingVersionRanges","version","versionMap","mergeFn","Object","keys","reduce","acc","range","semver","satisfies","mergeArguments","curr","mergeEnvVars","getInstallArgs","packageManagerVersion","envMap","envArgs","argsMap","cmdArgs"],"mappings":";;;AAGA,MAAMA,gBAAmB,GAAA;AAAC,IAAA;AAAU,CAAA;AAUpC;AACA,MAAMC,mBAEF,GAAA;IACFC,GAAK,EAAA;QACH,GAAK,EAAA;AAAC,YAAA;AAAqB;AAC7B,KAAA;IACAC,IAAM,EAAA;QACJ,IAAM,EAAA;AAAC,YAAA,mBAAA;AAAqB,YAAA;AAAU,SAAA;AACtC,QAAA,GAAA,EAAK;AACP,KAAA;IACAC,IAAM,EAAA;AACJ,QAAA,GAAA,EAAK;AACP;AACF,CAAA;AAEA;AACA,MAAMC,aAEF,GAAA;IACFF,IAAM,EAAA;QACJ,KAAO,EAAA;YAAEG,iBAAmB,EAAA;AAAU,SAAA;AACtC,QAAA,GAAA,EAAK;AACP,KAAA;IACAJ,GAAK,EAAA;AACH,QAAA,GAAA,EAAK;AACP,KAAA;IACAE,IAAM,EAAA;AACJ,QAAA,GAAA,EAAK;AACP;AACF,CAAA;AAEA;;;;;;;;;;AAUC,IACM,MAAMG,wBAA2B,GAAA,OACtCC,cACAC,EAAAA,OAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,MAAMH,cAAgB,EAAA;AAAC,YAAA;SAAY,EAAEC,OAAAA,CAAAA;AAC9D,QAAA,OAAOC,OAAOE,IAAI,EAAA;AACpB,KAAA,CAAE,OAAOC,GAAK,EAAA;QACZ,MAAM,IAAIC,MAAM,CAAC,gBAAgB,EAAEN,cAAe,CAAA,UAAU,EAAEK,GAAAA,CAAI,CAAC,CAAA;AACrE;AACF;AAEA;;;;;;;;;;;AAWC,IACD,SAASE,0BACPC,CAAAA,OAAe,EACfC,UAAgC,EAChCC,OAA+B,EAAA;AAE/B,IAAA,OAAOC,OAAOC,IAAI,CAACH,YAAYI,MAAM,CAAC,CAACC,GAAKC,EAAAA,KAAAA,GAAAA;AAC1C,QAAA,IAAIC,OAAOC,SAAS,CAACT,OAASO,EAAAA,KAAAA,CAAAA,IAAUA,UAAU,GAAK,EAAA;AACrD,YAAA,OAAOL,OAAQI,CAAAA,GAAAA,EAAKL,UAAU,CAACM,KAAM,CAAA,CAAA;AACvC;QACA,OAAOD,GAAAA;AACT,KAAA,EAAGL,UAAU,CAAC,GAAI,CAAA,CAAA,CAAA;AACpB;AAEA,SAASS,cAAAA,CAAeJ,GAAa,EAAEK,IAAc,EAAA;IACnD,OAAO;AAAIL,QAAAA,GAAAA,GAAAA;AAAQK,QAAAA,GAAAA;AAAK,KAAA;AAC1B;AAEA,SAASC,YAAAA,CACPN,GAA2B,EAC3BK,IAA4B,EAAA;IAE5B,OAAO;AAAE,QAAA,GAAGL,GAAG;AAAE,QAAA,GAAGK;AAAK,KAAA;AAC3B;AAEA;;;;;;;;;;;;;;;;;;;;;;AAsBC,IACM,MAAME,cAAiB,GAAA,OAAOrB,cAAwBC,EAAAA,OAAAA,GAAAA;IAC3D,MAAMqB,qBAAAA,GAAwB,MAAMvB,wBAAAA,CAAyBC,cAAgBC,EAAAA,OAAAA,CAAAA;;IAG7E,MAAMsB,MAAAA,GAAS1B,aAAa,CAACG,cAAe,CAAA;IAC5C,MAAMwB,OAAAA,GAAUF,wBACZf,0BAA2Be,CAAAA,qBAAAA,EAAuBC,QAAQH,YAC1DG,CAAAA,GAAAA,MAAM,CAAC,GAAI,CAAA;;IAGf,MAAME,OAAAA,GAAUhC,mBAAmB,CAACO,cAAe,CAAA;IACnD,MAAM0B,OAAAA,GAAUJ,wBACZf,0BAA2Be,CAAAA,qBAAAA,EAAuBG,SAASP,cAC3DO,CAAAA,GAAAA,OAAO,CAAC,GAAI,CAAA;IAEhB,OAAO;AAAED,QAAAA,OAAAA;QAASE,OAAS,EAAA;AAAIlC,YAAAA,GAAAA,gBAAAA;AAAqBkC,YAAAA,GAAAA;AAAQ,SAAA;QAAElB,OAASc,EAAAA;AAAsB,KAAA;AAC/F;;;;"}