Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/commands/info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
13 changes: 6 additions & 7 deletions src/commands/upgrade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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
Expand All @@ -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 ')
Expand Down
26 changes: 15 additions & 11 deletions src/utils/packageManagers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Loading