From 5376aebd437ac7f85777a7d926f3e0e60622ec2a Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Sat, 30 Dec 2023 01:48:53 +0100 Subject: [PATCH] feat: allow specify `packageManager` by name --- src/_utils.ts | 16 +++++++++------- src/package-manager.ts | 10 +++++----- src/types.ts | 2 +- test/_utils.test.ts | 11 +++++++++++ 4 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 test/_utils.test.ts diff --git a/src/_utils.ts b/src/_utils.ts index 73173e1..45bb86d 100644 --- a/src/_utils.ts +++ b/src/_utils.ts @@ -1,9 +1,9 @@ import { createRequire } from "node:module"; import { normalize, resolve } from "pathe"; import { withTrailingSlash } from "ufo"; -import type { OperationOptions } from "./types"; +import type { OperationOptions, PackageManager } from "./types"; import type { DetectPackageManagerOptions } from "./package-manager"; -import { detectPackageManager } from "./package-manager"; +import { detectPackageManager, packageManagers } from "./package-manager"; export async function findup( cwd: string, @@ -73,15 +73,17 @@ export const NO_PACKAGE_MANAGER_DETECTED_ERROR_MSG = export async function resolveOperationOptions( options: OperationOptions = {}, ): Promise< - NonPartial< - Pick - > & - Pick + NonPartial> & + Pick & { + packageManager: PackageManager; + } > { const cwd = options.cwd || process.cwd(); const packageManager = - options.packageManager || + (typeof options.packageManager === "string" + ? packageManagers.find((pm) => pm.name === options.packageManager) + : options.packageManager) || (await detectPackageManager(options.cwd || process.cwd())); if (!packageManager) { diff --git a/src/package-manager.ts b/src/package-manager.ts index 374f047..b53796e 100644 --- a/src/package-manager.ts +++ b/src/package-manager.ts @@ -27,7 +27,7 @@ export type DetectPackageManagerOptions = { includeParentDirs?: boolean; }; -const _packageManagers: PackageManager[] = [ +export const packageManagers: PackageManager[] = [ { name: "npm", command: "npm", lockFile: "package-lock.json" }, { name: "pnpm", @@ -53,7 +53,7 @@ const _packageManagers: PackageManager[] = [ lockFile: "yarn.lock", files: [".yarnrc.yml"], }, -]; +] as const; export async function detectPackageManager( cwd: string, @@ -74,9 +74,9 @@ export async function detectPackageManager( packageJSON.packageManager.split("@"); const majorVersion = version.split(".")[0]; const packageManager = - _packageManagers.find( + packageManagers.find( (pm) => pm.name === name && pm.majorVersion === majorVersion, - ) || _packageManagers.find((pm) => pm.name === name); + ) || packageManagers.find((pm) => pm.name === name); return { ...packageManager, name, @@ -90,7 +90,7 @@ export async function detectPackageManager( // 2. Use implicit file detection if (!options.ignoreLockFile) { - for (const packageManager of _packageManagers) { + for (const packageManager of packageManagers) { const detectionsFiles = [ packageManager.lockFile, ...(packageManager.files || []), diff --git a/src/types.ts b/src/types.ts index c88dcd3..05ff9a1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -12,7 +12,7 @@ export type PackageManager = { export type OperationOptions = { cwd?: string; silent?: boolean; - packageManager?: PackageManager; + packageManager?: PackageManager | PackageManagerName; dev?: boolean; workspace?: boolean | string; }; diff --git a/test/_utils.test.ts b/test/_utils.test.ts new file mode 100644 index 0000000..7836cff --- /dev/null +++ b/test/_utils.test.ts @@ -0,0 +1,11 @@ +import { expect, it, describe } from "vitest"; +import { resolveOperationOptions } from "../src/_utils"; + +describe("internal utils", () => { + describe("resolveOperationOptions", () => { + it("resolved package manager by name", async () => { + const r = await resolveOperationOptions({ packageManager: "yarn" }); + expect(r.packageManager.name).toBe("yarn"); + }); + }); +});