UNPKG

wxt

Version:

⚡ Next-gen Web Extension Framework

55 lines (54 loc) 1.65 kB
import { mkdir } from "node:fs/promises"; import path from "node:path"; import spawn from "nano-spawn"; //#region src/core/package-managers/npm.ts const npm = { overridesKey: "overrides", async downloadDependency(id, downloadDir) { await mkdir(downloadDir, { recursive: true }); const res = await spawn("npm", [ "pack", id, "--json" ], { cwd: downloadDir }); const packed = JSON.parse(res.stdout); return path.resolve(downloadDir, packed[0].filename); }, async listDependencies(options) { const args = ["ls", "--json"]; if (options?.all) args.push("--depth", "Infinity"); const res = await spawn("npm", args, { cwd: options?.cwd }); return flattenNpmListOutput([JSON.parse(res.stdout)]); } }; function flattenNpmListOutput(projects) { const queue = projects.flatMap((project) => { const acc = []; if (project.dependencies) acc.push(project.dependencies); if (project.devDependencies) acc.push(project.devDependencies); return acc; }); const dependencies = []; while (queue.length > 0) Object.entries(queue.pop()).forEach(([name, meta]) => { dependencies.push({ name, version: meta.version }); if (meta.dependencies) queue.push(meta.dependencies); if (meta.devDependencies) queue.push(meta.devDependencies); }); return dedupeDependencies(dependencies); } function dedupeDependencies(dependencies) { const hashes = /* @__PURE__ */ new Set(); return dependencies.filter((dep) => { const hash = `${dep.name}@${dep.version}`; if (hashes.has(hash)) return false; else { hashes.add(hash); return true; } }); } //#endregion export { dedupeDependencies, flattenNpmListOutput, npm };