diff --git a/src/commands/info.ts b/src/commands/info.ts index 4fed630b0..7a86be0f9 100644 --- a/src/commands/info.ts +++ b/src/commands/info.ts @@ -70,7 +70,7 @@ export default defineCommand({ : 'webpack' let packageManager: keyof typeof packageManagerLocks | 'unknown' | null - = getPackageManager(cwd) + = getPackageManager(cwd)?.name ?? null if (packageManager) { packageManager += '@' + getPackageManagerVersion(packageManager) } diff --git a/src/commands/upgrade.ts b/src/commands/upgrade.ts index 7be09e0ed..6835a50c3 100644 --- a/src/commands/upgrade.ts +++ b/src/commands/upgrade.ts @@ -8,7 +8,7 @@ import { readPackageJSON } from 'pkg-types' import { defineCommand } from 'citty' import { getPackageManager, - packageManagerLocks, + getPackageManagerVersion, } from '../utils/packageManagers' import { rmRecursive, touchFile } from '../utils/fs' import { cleanupNuxtDirs, nuxtVersionToGitIdentifier } from '../utils/nuxt' @@ -99,16 +99,15 @@ export default defineCommand({ const cwd = resolve(ctx.args.cwd || ctx.args.rootDir) // Check package manager - const packageManager = getPackageManager(cwd) - if (!packageManager) { + const packageManagerAndLockFile = getPackageManager(cwd) + if (!packageManagerAndLockFile) { consola.error( `Unable to determine the package manager used by this project.\n\nNo lock files found in \`${cwd}\`, and no \`packageManager\` field specified in \`package.json\`.\n\nPlease either add the \`packageManager\` field to \`package.json\` or execute the installation command for your package manager. For example, you can use \`pnpm i\`, \`npm i\`, \`bun i\`, or \`yarn i\`, and then try again.`, ) process.exit(1) } - const packageManagerVersion = execSync(`${packageManager} --version`) - .toString('utf8') - .trim() + const { name: packageManager, lockFilePath } = packageManagerAndLockFile + const packageManagerVersion = getPackageManagerVersion(packageManager) consola.info('Package manager:', packageManager, packageManagerVersion) // Check currently installed Nuxt version @@ -127,7 +126,7 @@ export default defineCommand({ const { npmPackages, nuxtVersion } = await getRequiredNewVersion(['nuxt', ...packagesToUpdate], ctx.args.channel) // Force install - const pmLockFile = resolve(cwd, packageManagerLocks[packageManager]) + const pmLockFile = resolve(cwd, lockFilePath) const forceRemovals = ['node_modules', relative(process.cwd(), pmLockFile)] .map(p => colors.cyan(p)) .join(' and ') diff --git a/src/utils/packageManagers.ts b/src/utils/packageManagers.ts index 4f39afe3d..9394ace3c 100644 --- a/src/utils/packageManagers.ts +++ b/src/utils/packageManagers.ts @@ -4,23 +4,27 @@ import { resolve } from 'pathe' import { findup } from './fs' export const packageManagerLocks = { - yarn: 'yarn.lock', - npm: 'package-lock.json', - pnpm: 'pnpm-lock.yaml', - bun: 'bun.lockb', + yarn: ['yarn.lock'], + npm: ['package-lock.json'], + pnpm: ['pnpm-lock.yaml'], + bun: ['bun.lockb', 'bun.lock'], } -type PackageManager = keyof typeof packageManagerLocks - export function getPackageManager(rootDir: string) { return findup(rootDir, (dir) => { - for (const name in packageManagerLocks) { - const path = packageManagerLocks[name as PackageManager] - if (path && existsSync(resolve(dir, path))) { - return name + let name: keyof typeof packageManagerLocks + for (name in packageManagerLocks) { + const paths = packageManagerLocks[name] + for (const lockFilePath of paths) { + if (lockFilePath && existsSync(resolve(dir, lockFilePath))) { + return { + name, + lockFilePath, + } + } } } - }) as PackageManager | null + }) } export function getPackageManagerVersion(name: string) {