src / utils / zip.ts
import fs from "node:fs";
import path from "node:path";
import archiver from "archiver";
import { resolveInside } from "./path";
const IGNORE_DIRS = new Set(["node_modules", "dist", ".git", ".lmstudio", "temp", "tmp"]);
function shouldIgnore(rel: string): boolean {
const parts = rel.split(path.sep);
return parts.some((part) => IGNORE_DIRS.has(part)) || rel.endsWith(".zip");
}
export async function zipDirectory(baseDir: string, outputFile: string): Promise<string> {
const outPath = resolveInside(baseDir, outputFile);
await fs.promises.mkdir(path.dirname(outPath), { recursive: true });
return await new Promise<string>((resolve, reject) => {
const output = fs.createWriteStream(outPath);
const archive = archiver("zip", { zlib: { level: 9 } });
output.on("close", () => resolve(outPath));
output.on("error", reject);
archive.on("error", reject);
archive.pipe(output);
archive.glob("**/*", {
cwd: baseDir,
dot: true,
ignore: ["**/node_modules/**", "**/dist/**", "**/.git/**", "**/.lmstudio/**", "**/temp/**", "**/tmp/**", "**/*.zip"]
});
archive.finalize().catch(reject);
});
}