mtcute/packages/create-bot/src/package-manager.ts

114 lines
2.9 KiB
TypeScript

import process from 'node:process'
import * as colors from 'colorette'
export function getPackageManagerVersion(): [string, string] | null {
if (typeof Deno !== 'undefined') {
return null
}
const userAgent = process.env.npm_config_user_agent
if (!userAgent) {
return null
}
const software = userAgent.split(' ')[0]
const manager = software.split('/')[0]
const version = software.split('/')[1]
if (!version.match(/^\d+\.\d+\.\d+$/)) {
return null
}
return [manager, version]
}
export enum PackageManager {
Npm = 'npm',
Yarn = 'yarn',
Pnpm = 'pnpm',
Bun = 'bun',
Deno = 'deno',
}
export function getPackageManager(): PackageManager {
const parsed = getPackageManagerVersion()
if (!parsed) {
if (typeof Deno !== 'undefined') return PackageManager.Deno
console.warn(colors.yellow('[warning] could not detect package manager, falling back to pnpm'))
return PackageManager.Pnpm // fall back to the most based one
}
switch (parsed[0]) {
case 'pnpm':
return PackageManager.Pnpm
case 'yarn':
return PackageManager.Yarn
case 'npm':
return PackageManager.Npm
case 'bun':
return PackageManager.Bun
default:
throw new Error(`Unsupported package manager: ${parsed[0]}`)
}
}
export function getInstallCommand(params: { mgr: PackageManager, packages: string[], dev?: boolean }): string[] {
const { mgr, packages, dev } = params
const exec: string[] = [mgr]
switch (mgr) {
case PackageManager.Npm:
exec.push('install', dev ? '--save-dev' : '--save')
break
case PackageManager.Yarn:
exec.push('add')
if (dev) exec.push('-D')
break
case PackageManager.Pnpm:
exec.push('add')
if (dev) exec.push('--save-dev')
break
case PackageManager.Bun:
exec.push('add')
if (dev) exec.push('-D')
break
}
exec.push(...packages)
return exec
}
export function getExecCommand(mgr: PackageManager, ...cmd: string[]): string[] {
switch (mgr) {
case PackageManager.Npm:
return ['npx', ...cmd]
case PackageManager.Yarn:
return ['yarn', ...cmd]
case PackageManager.Pnpm:
return ['pnpm', 'exec', ...cmd]
case PackageManager.Bun:
return ['bun', 'run', ...cmd]
case PackageManager.Deno:
throw new Error('Deno does not support exec commands')
}
}
export function packageManagerToRuntime(mgr: PackageManager): 'node' | 'bun' | 'deno' {
switch (mgr) {
case PackageManager.Npm:
case PackageManager.Yarn:
case PackageManager.Pnpm:
return 'node'
case PackageManager.Bun:
return 'bun'
case PackageManager.Deno:
return 'deno'
}
}