index.mjs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // src/detect.ts
  2. import fs from "fs";
  3. import path from "path";
  4. import findUp from "find-up";
  5. var AGENTS = ["pnpm", "yarn", "npm", "pnpm@6", "yarn@berry", "bun"];
  6. var LOCKS = {
  7. "bun.lockb": "bun",
  8. "pnpm-lock.yaml": "pnpm",
  9. "yarn.lock": "yarn",
  10. "package-lock.json": "npm",
  11. "npm-shrinkwrap.json": "npm"
  12. };
  13. async function detectPackageManager(cwd = process.cwd()) {
  14. let agent = null;
  15. const lockPath = await findUp(Object.keys(LOCKS), { cwd });
  16. let packageJsonPath;
  17. if (lockPath)
  18. packageJsonPath = path.resolve(lockPath, "../package.json");
  19. else
  20. packageJsonPath = await findUp("package.json", { cwd });
  21. if (packageJsonPath && fs.existsSync(packageJsonPath)) {
  22. try {
  23. const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
  24. if (typeof pkg.packageManager === "string") {
  25. const [name, version] = pkg.packageManager.split("@");
  26. if (name === "yarn" && parseInt(version) > 1)
  27. agent = "yarn@berry";
  28. else if (name === "pnpm" && parseInt(version) < 7)
  29. agent = "pnpm@6";
  30. else if (name in AGENTS)
  31. agent = name;
  32. else
  33. console.warn("[ni] Unknown packageManager:", pkg.packageManager);
  34. }
  35. } catch {
  36. }
  37. }
  38. if (!agent && lockPath)
  39. agent = LOCKS[path.basename(lockPath)];
  40. return agent;
  41. }
  42. // src/install.ts
  43. import execa from "execa";
  44. async function installPackage(names, options = {}) {
  45. const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || "npm";
  46. const [agent] = detectedAgent.split("@");
  47. if (!Array.isArray(names))
  48. names = [names];
  49. const args = options.additionalArgs || [];
  50. if (options.preferOffline) {
  51. if (detectedAgent === "yarn@berry")
  52. args.unshift("--cached");
  53. else
  54. args.unshift("--prefer-offline");
  55. }
  56. return execa(
  57. agent,
  58. [
  59. agent === "yarn" ? "add" : "install",
  60. options.dev ? "-D" : "",
  61. ...args,
  62. ...names
  63. ].filter(Boolean),
  64. {
  65. stdio: options.silent ? "ignore" : "inherit",
  66. cwd: options.cwd
  67. }
  68. );
  69. }
  70. export {
  71. detectPackageManager,
  72. installPackage
  73. };