97 lines
2.7 KiB
JavaScript
97 lines
2.7 KiB
JavaScript
// src/detect.ts
|
|
import process from "node:process";
|
|
import { detect } from "package-manager-detector/detect";
|
|
async function detectPackageManager(cwd = process.cwd()) {
|
|
const result = await detect({
|
|
cwd,
|
|
onUnknown(packageManager) {
|
|
console.warn("[@antfu/install-pkg] Unknown packageManager:", packageManager);
|
|
return void 0;
|
|
}
|
|
});
|
|
return result?.agent || null;
|
|
}
|
|
|
|
// src/install.ts
|
|
import { existsSync } from "node:fs";
|
|
import { resolve } from "node:path";
|
|
import process2 from "node:process";
|
|
import { x } from "tinyexec";
|
|
async function installPackage(names, options = {}) {
|
|
const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || "npm";
|
|
const [agent] = detectedAgent.split("@");
|
|
if (!Array.isArray(names))
|
|
names = [names];
|
|
const args = (typeof options.additionalArgs === "function" ? options.additionalArgs(agent, detectedAgent) : options.additionalArgs) || [];
|
|
if (options.preferOffline) {
|
|
if (detectedAgent === "yarn@berry")
|
|
args.unshift("--cached");
|
|
else
|
|
args.unshift("--prefer-offline");
|
|
}
|
|
if (agent === "pnpm") {
|
|
args.unshift(
|
|
/**
|
|
* Prevent pnpm from removing installed devDeps while `NODE_ENV` is `production`
|
|
* @see https://pnpm.io/cli/install#--prod--p
|
|
*/
|
|
"--prod=false"
|
|
);
|
|
if (existsSync(resolve(options.cwd ?? process2.cwd(), "pnpm-workspace.yaml"))) {
|
|
args.unshift("-w");
|
|
}
|
|
}
|
|
return x(
|
|
agent,
|
|
[
|
|
agent === "yarn" ? "add" : "install",
|
|
options.dev ? "-D" : "",
|
|
...args,
|
|
...names
|
|
].filter(Boolean),
|
|
{
|
|
nodeOptions: {
|
|
stdio: options.silent ? "ignore" : "inherit",
|
|
cwd: options.cwd
|
|
},
|
|
throwOnError: true
|
|
}
|
|
);
|
|
}
|
|
|
|
// src/uninstall.ts
|
|
import { existsSync as existsSync2 } from "node:fs";
|
|
import process3 from "node:process";
|
|
import { resolve as resolve2 } from "node:path";
|
|
import { x as x2 } from "tinyexec";
|
|
async function uninstallPackage(names, options = {}) {
|
|
const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || "npm";
|
|
const [agent] = detectedAgent.split("@");
|
|
if (!Array.isArray(names))
|
|
names = [names];
|
|
const args = options.additionalArgs || [];
|
|
if (agent === "pnpm" && existsSync2(resolve2(options.cwd ?? process3.cwd(), "pnpm-workspace.yaml")))
|
|
args.unshift("-w");
|
|
return x2(
|
|
agent,
|
|
[
|
|
agent === "yarn" ? "remove" : "uninstall",
|
|
options.dev ? "-D" : "",
|
|
...args,
|
|
...names
|
|
].filter(Boolean),
|
|
{
|
|
nodeOptions: {
|
|
stdio: options.silent ? "ignore" : "inherit",
|
|
cwd: options.cwd
|
|
},
|
|
throwOnError: true
|
|
}
|
|
);
|
|
}
|
|
export {
|
|
detectPackageManager,
|
|
installPackage,
|
|
uninstallPackage
|
|
};
|