(rootDir: string)
| 21 | } |
| 22 | |
| 23 | export async function detectPackageManager(rootDir: string): Promise<PackageManager> { |
| 24 | // Check lockfiles in priority order |
| 25 | if ((await exists(resolve(rootDir, 'bun.lock'))) || (await exists(resolve(rootDir, 'bun.lockb')))) { |
| 26 | return 'bun'; |
| 27 | } |
| 28 | if (await exists(resolve(rootDir, 'pnpm-lock.yaml'))) { |
| 29 | return 'pnpm'; |
| 30 | } |
| 31 | if (await exists(resolve(rootDir, 'yarn.lock'))) { |
| 32 | return 'yarn'; |
| 33 | } |
| 34 | // Fallback: check packageManager field in package.json |
| 35 | try { |
| 36 | const pkg = await readJson<Record<string, unknown>>(resolve(rootDir, 'package.json')); |
| 37 | if (typeof pkg.packageManager === 'string') { |
| 38 | const name = pkg.packageManager.split('@')[0]; |
| 39 | if (name === 'pnpm' || name === 'yarn' || name === 'bun') return name; |
| 40 | } |
| 41 | } catch { |
| 42 | // ignore |
| 43 | } |
| 44 | return 'npm'; |
| 45 | } |
| 46 | |
| 47 | async function getWorkspaceGlobs(rootDir: string, pm: PackageManager): Promise<string[]> { |
| 48 | // pnpm uses pnpm-workspace.yaml |
no test coverage detected
searching dependent graphs…