import { cp, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises"; import { resolve } from "node:path"; import { createHash } from "node:crypto"; import { execFileSync } from "node:child_process"; const root = resolve(import.meta.dirname, ".."); const target = resolve(root, "release/context-preview"); // Only this script's generated package directory is replaced. await rm(target, { recursive: true, force: true }); await mkdir(target, { recursive: true }); for (const dir of ["dist", "dist-server"]) await cp(resolve(root, dir), resolve(target, dir), { recursive: true }); await writeFile( resolve(target, "package.json"), JSON.stringify( { name: "marmar-context-preview", version: "0.1.0", private: true, type: "module", engines: { node: ">=24" }, scripts: { start: "node dist-server/index.mjs" }, }, null, 2 ) + "\n" ); await writeFile( resolve(target, "package-lock.json"), JSON.stringify( { name: "marmar-context-preview", version: "0.1.0", lockfileVersion: 3, requires: true, packages: { "": { name: "marmar-context-preview", version: "0.1.0", engines: { node: ">=24" }, }, }, }, null, 2 ) + "\n" ); const manifest = []; async function walk(dir) { for (const item of await readdir(dir, { withFileTypes: true })) { const file = resolve(dir, item.name); if (item.isDirectory()) await walk(file); else manifest.push({ path: file.slice(target.length + 1), sha256: createHash("sha256") .update(await readFile(file)) .digest("hex"), }); } } await walk(target); await writeFile( resolve(target, "release-manifest.json"), JSON.stringify( { builtAt: new Date().toISOString(), files: manifest }, null, 2 ) + "\n" ); const zip = resolve(root, "release/marmar-context-preview.zip"); await rm(zip, { force: true }); execFileSync("/usr/bin/zip", ["-qr", zip, "."], { cwd: target }); console.log( JSON.stringify({ directory: target, archive: zip, files: manifest.length, sha256: createHash("sha256") .update(await readFile(zip)) .digest("hex"), }) );