import { createWriteStream } from "node:fs"; import { readdir } from "node:fs/promises"; import path from "node:path"; import { pipeline } from "node:stream/promises"; import yazl from "yazl"; export async function createReleaseArchive({ archivePath, sourceDir }) { const zip = new yazl.ZipFile(); const output = createWriteStream(archivePath); await addDirectory(zip, sourceDir, sourceDir); zip.end(); await pipeline(zip.outputStream, output); } async function addDirectory(zip, rootDir, currentDir) { const entries = await readdir(currentDir, { withFileTypes: true }); entries.sort((left, right) => left.name.localeCompare(right.name)); for (const entry of entries) { const absolutePath = path.join(currentDir, entry.name); const relativePath = path.relative(rootDir, absolutePath); if (entry.isDirectory()) { await addDirectory(zip, rootDir, absolutePath); continue; } if (entry.isFile()) { zip.addFile(absolutePath, relativePath); } } }