34 lines
1007 B
JavaScript
34 lines
1007 B
JavaScript
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);
|
|
}
|
|
}
|
|
}
|