import path from 'path' import { packageManager } from '@pnpm/cli-meta' import { getConfig as _getConfig, type CliOptions, type Config } from '@pnpm/config' import { formatWarn } from '@pnpm/default-reporter' import { createOrConnectStoreController } from '@pnpm/store-connection-manager' import { installConfigDeps } from '@pnpm/config.deps-installer' import { requireHooks } from '@pnpm/pnpmfile' import { lexCompare } from '@pnpm/util.lex-comparator' export async function getConfig ( cliOptions: CliOptions, opts: { excludeReporter: boolean globalDirShouldAllowWrite?: boolean rcOptionsTypes: Record workspaceDir: string | undefined checkUnknownSetting?: boolean ignoreNonAuthSettingsFromLocal?: boolean } ): Promise { let { config, warnings } = await _getConfig({ cliOptions, globalDirShouldAllowWrite: opts.globalDirShouldAllowWrite, packageManager, rcOptionsTypes: opts.rcOptionsTypes, workspaceDir: opts.workspaceDir, checkUnknownSetting: opts.checkUnknownSetting, ignoreNonAuthSettingsFromLocal: opts.ignoreNonAuthSettingsFromLocal, }) config.cliOptions = cliOptions if (config.configDependencies) { const store = await createOrConnectStoreController(config) await installConfigDeps(config.configDependencies, { registries: config.registries, rootDir: config.lockfileDir ?? config.rootProjectManifestDir, store: store.ctrl, }) } if (!config.ignorePnpmfile) { config.tryLoadDefaultPnpmfile = config.pnpmfile == null const pnpmfiles = config.pnpmfile == null ? [] : Array.isArray(config.pnpmfile) ? config.pnpmfile : [config.pnpmfile] if (config.configDependencies) { const configModulesDir = path.join(config.lockfileDir ?? config.rootProjectManifestDir, 'node_modules/.pnpm-config') pnpmfiles.unshift(...calcPnpmfilePathsOfPluginDeps(configModulesDir, config.configDependencies)) } const { hooks, resolvedPnpmfilePaths } = requireHooks(config.lockfileDir ?? config.dir, { globalPnpmfile: config.globalPnpmfile, pnpmfiles, tryLoadDefaultPnpmfile: config.tryLoadDefaultPnpmfile, }) config.hooks = hooks config.pnpmfile = resolvedPnpmfilePaths if (config.hooks?.updateConfig) { for (const updateConfig of config.hooks.updateConfig) { const updateConfigResult = updateConfig(config) config = updateConfigResult instanceof Promise ? await updateConfigResult : updateConfigResult // eslint-disable-line no-await-in-loop } } } if (opts.excludeReporter) { delete config.reporter // This is a silly workaround because @pnpm/core expects a function as opts.reporter } if (warnings.length > 0) { console.warn(warnings.map((warning) => formatWarn(warning)).join('\n')) } return config } function * calcPnpmfilePathsOfPluginDeps (configModulesDir: string, configDependencies: Record): Generator { for (const configDepName of Object.keys(configDependencies).sort(lexCompare)) { if (configDepName.startsWith('@pnpm/plugin-') || configDepName.startsWith('pnpm-plugin-')) { yield path.join(configModulesDir, configDepName, 'pnpmfile.cjs') } } }