From 0e8339c2de579a41f1d30285a339d9509f217b12 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 29 Sep 2026 11:21:39 +0000 Subject: [PATCH] perf: replace `nypm` with `package-manager-detector` --- packages/devtools/package.json | 2 +- packages/devtools/src/server-rpc/npm.ts | 48 +++++++++++++++---------- pnpm-lock.yaml | 21 +++++------ pnpm-workspace.yaml | 2 +- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/packages/devtools/package.json b/packages/devtools/package.json index f33a31cebe..33ce5d1242 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -74,8 +74,8 @@ "launch-editor": "catalog:prod", "local-pkg": "catalog:prod", "magicast": "catalog:prod", - "nypm": "catalog:prod", "ohash": "catalog:frontend", + "package-manager-detector": "catalog:prod", "pathe": "catalog:frontend", "perfect-debounce": "catalog:frontend", "pkg-types": "catalog:prod", diff --git a/packages/devtools/src/server-rpc/npm.ts b/packages/devtools/src/server-rpc/npm.ts index 35a306c914..f86faf3645 100644 --- a/packages/devtools/src/server-rpc/npm.ts +++ b/packages/devtools/src/server-rpc/npm.ts @@ -1,20 +1,22 @@ -import type { PackageManager } from 'nypm' +import type { DetectResult } from 'package-manager-detector' import type { NpmCommandOptions, NpmCommandType, NuxtDevtoolsServerContext, PackageUpdateInfo, ServerFunctions } from '../types' +import { existsSync } from 'node:fs' import fs from 'node:fs/promises' import { startSubprocess } from '@nuxt/devtools-kit' import isInstalledGlobally from 'is-installed-globally' import { parseModule } from 'magicast' import { addNuxtModule, getDefaultExportOptions } from 'magicast/helpers' -import { detectPackageManager } from 'nypm' +import { detect, resolveCommand } from 'package-manager-detector' +import { join } from 'pathe' import { checkForUpdateOf } from '../npm' import { magicastGuard } from '../utils/magicast' export function setupNpmRPC({ nuxt, ensureDevAuthToken }: NuxtDevtoolsServerContext) { - let detectPromise: Promise | undefined + let detectPromise: Promise | undefined const updatesPromise = new Map>() function getPackageManager() { - detectPromise ||= detectPackageManager(nuxt.options.rootDir) + detectPromise ||= detect({ cwd: nuxt.options.rootDir }).catch(() => null) return detectPromise } @@ -23,30 +25,38 @@ export function setupNpmRPC({ nuxt, ensureDevAuthToken }: NuxtDevtoolsServerCont dev = true, global = (packageName === '@nuxt/devtools' && isInstalledGlobally), } = options - const agent = await getPackageManager() - - const name = agent?.name || 'npm' + const detected = await getPackageManager() + const agent = detected?.agent || 'npm' + const name = agent === 'deno' ? `npm:${packageName}` : packageName + const pnpmFlags = agent === 'pnpm' + ? [ + ...!global && existsSync(join(nuxt.options.rootDir, 'pnpm-workspace.yaml')) ? ['--workspace-root'] : [], + '--config.confirm-modules-purge=false', + '--config.strict-dep-builds=false', + ] + : [] // TODO: smartly detect dev/global installs as default if (command === 'install' || command === 'update') { + const resolved = global + ? resolveCommand(agent, 'global', [`${name}@latest`]) + : resolveCommand(agent, 'add', [`${name}@latest`, ...dev ? ['-D'] : []]) + if (!resolved) + return return [ - name, - name === 'npm' ? 'install' : 'add', - `${packageName}@latest`, - dev ? '-D' : '', - global ? '-g' : '', + resolved.command, + ...resolved.args, + ...pnpmFlags, // In yarn berry, `--ignore-scripts` is removed - (name === 'yarn' && !agent?.version?.startsWith('1.')) ? '' : '--ignore-scripts', + agent === 'yarn@berry' ? '' : '--ignore-scripts', ].filter(Boolean) } if (command === 'uninstall') { - return [ - name, - name === 'npm' ? 'uninstall' : 'remove', - packageName, - global ? '-g' : '', - ].filter(Boolean) + const resolved = resolveCommand(agent, global ? 'global_uninstall' : 'uninstall', [name]) + if (!resolved) + return + return [resolved.command, ...resolved.args, ...pnpmFlags] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f515192ba4..2774937fd1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -326,9 +326,9 @@ catalogs: magicast: specifier: ^0.5.4 version: 0.5.4 - nypm: - specifier: ^0.6.9 - version: 0.6.9 + package-manager-detector: + specifier: ^1.8.0 + version: 1.8.0 pkg-types: specifier: ^2.3.1 version: 2.3.1 @@ -561,12 +561,12 @@ importers: magicast: specifier: catalog:prod version: 0.5.4 - nypm: - specifier: catalog:prod - version: 0.6.9 ohash: specifier: catalog:frontend version: 2.0.11 + package-manager-detector: + specifier: catalog:prod + version: 1.8.0 pathe: specifier: catalog:frontend version: 2.0.3 @@ -7018,9 +7018,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -9254,7 +9251,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 1.6.0 + package-manager-detector: 1.8.0 tinyexec: 1.2.4 '@antfu/ni@30.3.0': @@ -17844,7 +17841,7 @@ snapshots: dependencies: citty: 0.2.2 pathe: 2.0.3 - tinyexec: 1.2.4 + tinyexec: 1.3.0 object-assign@4.1.1: {} @@ -18048,8 +18045,6 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@1.6.0: {} - package-manager-detector@1.8.0: {} pako@0.2.9: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5f8823edcb..66a42a4b0b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -153,7 +153,7 @@ catalogs: launch-editor: ^2.14.1 local-pkg: ^1.2.1 magicast: ^0.5.4 - nypm: ^0.6.9 + package-manager-detector: ^1.8.0 pkg-types: ^2.3.1 semver: ^7.8.5 simple-git: ^3.36.0