From 751d282dae6ca47be00ec8bbcd927af2529408a0 Mon Sep 17 00:00:00 2001 From: "Matheus P. Silva" Date: Mon, 26 May 2025 17:51:03 -0300 Subject: [PATCH] feat(cli): use corepack to infer package manager --- packages/cli/src/utils/commands.ts | 49 +++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/utils/commands.ts b/packages/cli/src/utils/commands.ts index 35240cd616..9d8435a2c5 100644 --- a/packages/cli/src/utils/commands.ts +++ b/packages/cli/src/utils/commands.ts @@ -1,13 +1,48 @@ -import { spawnSync } from 'node:child_process' +import { existsSync, readFileSync } from 'node:fs' +import path from 'node:path' + +const DEFAULT_PACKAGE_MANAGER = 'yarn' + +const supportedPackageManagers = { + yarn: true, + pnpm: true, + bun: true, + npm: true, +} // Retrieves the package manager based on the developer lockfile, using `ni`. export function getPreferredPackageManager() { - const agent = spawnSync('na', ['?'], { - encoding: 'utf8', - shell: true, - }).stdout.trim() + const packageJsonPath = path.resolve(process.cwd(), 'package.json') + + if (!existsSync(packageJsonPath)) { + console.warn( + `package.json not found! Using default package manager: ${DEFAULT_PACKAGE_MANAGER}.` + ) + return DEFAULT_PACKAGE_MANAGER // TODO threat errors + } + + const fileContent = readFileSync(packageJsonPath) + const { packageManager } = JSON.parse(fileContent.toString()) + + if (!packageManager) { + console.warn( + `Corepack not enabled! Using default package manager: ${DEFAULT_PACKAGE_MANAGER}.` + ) + return DEFAULT_PACKAGE_MANAGER // corepack not enabled + } + + const [packageManagerName] = packageManager.split('@') - if (agent === '') return 'yarn' // Default to Yarn + if ( + !supportedPackageManagers[ + packageManagerName as keyof typeof supportedPackageManagers + ] + ) { + console.warn( + `${packageManagerName} is not supported: Use one of ${Object.keys(supportedPackageManagers).join(',')}.` + ) + return DEFAULT_PACKAGE_MANAGER // TODO threat errors + } - return agent + return packageManagerName }