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"),
})
);