Translate package manager commands between npm, pnpm, Yarn, and Bun.
import { packmorph } from "packmorph";
// Install commands (default)
const result = packmorph("npm install -D typescript");
if (result.ok) {
console.log(result.npm); // npm install -D typescript
console.log(result.pnpm); // pnpm add -D typescript
console.log(result.yarn); // yarn add --dev typescript
console.log(result.bun); // bun add --dev typescript
}npm install packmorphConverts package manager commands between npm, pnpm, Yarn, and Bun. Supports install, exec, run, and create commands.
packmorph("npm install react");
packmorph("pnpm add -D vitest");
packmorph("yarn global add eslint");
packmorph("bun add --exact lodash");packmorph("npx prettier .", { parseExec: true });
// → npm: npx prettier .
// → pnpm: pnpm dlx prettier .
// → yarn: yarn dlx prettier .
// → bun: bunx prettier .packmorph("npm run dev", { parseRun: true });
// → npm: npm run dev
// → pnpm: pnpm run dev
// → yarn: yarn run dev
// → bun: bun run devpackmorph("npm create vite@latest my-app", { parseCreate: true });
// → npm: npm create vite@latest -- my-app
// → pnpm: pnpm create vite@latest my-app
// → yarn: yarn create vite@latest my-app
// → bun: bun create vite@latest my-appNote: npm create requires -- before additional args. Packmorph handles this automatically.
const result = packmorph(
`# Install dependencies
npm install react
npm install -D typescript
cd my-project
npx prettier --write .`,
{ parseMultiLine: true, parseExec: true },
);
if (result.ok) {
console.log(result.npm);
// # Install dependencies
// npm install react
// npm install -D typescript
// cd my-project
// npx prettier --write .
console.log(result.pnpm);
// # Install dependencies
// pnpm add react
// pnpm add -D typescript
// cd my-project
// pnpm dlx prettier --write .
}Note: Multi-line mode automatically preserves comments (#), empty lines, and non-package-manager commands (like cd, mkdir, echo). Only package manager commands are transformed - everything else passes through unchanged.
Important: Multi-line parsing requires all package manager commands to use the same package manager. Mixing different package managers will return an error:
const result = packmorph(
`npm install react
pnpm add typescript`,
{ parseMultiLine: true },
);
// → { ok: false, reason: "mixed-package-managers" }This ensures consistent command conversion across all package managers.
interface PackmorphOptions {
parseInstall?: boolean; // default: true
parseExec?: boolean; // default: false
parseRun?: boolean; // default: false
parseCreate?: boolean; // default: false
parseMultiLine?: boolean; // default: false
}Enable multiple command types:
const result = packmorph(command, {
parseInstall: true,
parseExec: true,
parseRun: true,
parseCreate: true,
parseMultiLine: true,
});npm install/npm ipnpm add/pnpm installyarn add/yarn install/yarn global addbun add/bun install
npx <package>pnpm dlx <package>yarn dlx <package>bunx <package>
npm run <script>pnpm run <script>yarn run <script>bun run <script>
npm create <template>pnpm create <template>yarn create <template>bun create <template>
Install commands support: -D (dev), -g (global), -E (exact), -O (optional), -P (peer), --frozen-lockfile.
Flags are automatically normalized:
yarn add --dev→npm install -Dbun add -d→npm install -Dyarn add --exact→npm install -E
packmorph(command: string, options?: PackmorphOptions): PackmorphResultSuccess:
{
ok: true,
type: "install" | "exec" | "run" | "create",
npm: string,
pnpm: string,
yarn: string,
bun: string,
meta: { /* command-specific metadata */ }
}Error:
{
ok: false,
reason: "not-install-command" | "parse-error" | "not-supported-command" | "disabled-command-type" | "mixed-package-managers"
}Multi-line Success:
When parseMultiLine: true, the result has the same structure as single-line mode:
{
ok: true,
type: "install" | "exec" | "run" | "create",
npm: string,
pnpm: string,
yarn: string,
bun: string,
meta: { /* command-specific metadata */ }
}The npm, pnpm, yarn, and bun properties contain the full transformed multi-line text with non-package-manager lines preserved.
MIT