aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/packages/turbo-utils/src/managers.ts
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
commitdd84b9d64fb98746a230cd24233ff50a562c39c9 (patch)
treeb583261ef00b3afe72ec4d6dacb31e57779a6faf /packages/turbo-utils/src/managers.ts
parent0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff)
downloadHydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz
HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip
Diffstat (limited to 'packages/turbo-utils/src/managers.ts')
-rw-r--r--packages/turbo-utils/src/managers.ts53
1 files changed, 53 insertions, 0 deletions
diff --git a/packages/turbo-utils/src/managers.ts b/packages/turbo-utils/src/managers.ts
new file mode 100644
index 0000000..ab9c53d
--- /dev/null
+++ b/packages/turbo-utils/src/managers.ts
@@ -0,0 +1,53 @@
+import execa from "execa";
+import os from "os";
+
+export type PackageManager = "npm" | "yarn" | "pnpm";
+export type PackageManagerAvailable = { available: boolean; version?: string };
+
+async function getVersion(
+ packageManager: string
+): Promise<PackageManagerAvailable> {
+ // run the check from tmpdir to avoid corepack conflicting -
+ // this is no longer needed as of https://github.com/nodejs/corepack/pull/167
+ // but we'll keep the behavior for those on older versions)
+ const execOptions = {
+ cwd: os.tmpdir(),
+ env: { COREPACK_ENABLE_STRICT: "0" },
+ };
+
+ let available = false;
+ try {
+ const userAgent = process.env.npm_config_user_agent;
+ if (userAgent && userAgent.startsWith(packageManager)) {
+ available = true;
+ }
+
+ const result = await execa(packageManager, ["--version"], execOptions);
+ return {
+ available: true,
+ version: result.stdout.trim(),
+ };
+ } catch (e) {
+ return {
+ available,
+ };
+ }
+}
+
+async function getAvailablePackageManagers(): Promise<
+ Record<PackageManager, PackageManagerAvailable>
+> {
+ const [yarn, npm, pnpm] = await Promise.all([
+ getVersion("yarnpkg"),
+ getVersion("npm"),
+ getVersion("pnpm"),
+ ]);
+
+ return {
+ yarn,
+ pnpm,
+ npm,
+ };
+}
+
+export { getAvailablePackageManagers };