wxt
Version:
⚡ Next-gen Web Extension Framework
55 lines (54 loc) • 1.65 kB
JavaScript
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 };