import { cp, mkdir, writeFile, readFile, readdir, rm } from "node:fs/promises";
import { resolve } from "node:path";
import { createHash } from "node:crypto";
import { execFileSync } from "node:child_process";
import { build } from "esbuild";
const root = resolve(import.meta.dirname, ".."),
target = resolve(root, "release/netlify-preview");
// This directory is generated only by this packaging script, never the working source.
await rm(target, { recursive: true, force: true });
await mkdir(target, { recursive: true });
await cp(resolve(root, "dist"), resolve(target, "dist"), { recursive: true });
await cp(resolve(root, "netlify"), resolve(target, "netlify"), {
recursive: true,
});
await cp(resolve(root, "netlify.toml"), resolve(target, "netlify.toml"));
await build({
entryPoints: [resolve(root, "server/netlify-handler.ts")],
bundle: true,
platform: "node",
target: "node22",
format: "esm",
outfile: resolve(target, "lib/context-api.mjs"),
});
await writeFile(
resolve(target, "package.json"),
JSON.stringify(
{
name: "marmar-context-netlify",
version: "0.1.0",
private: true,
type: "module",
engines: { node: ">=22.12.0" },
dependencies: { "@netlify/blobs": "11.1.4" },
},
null,
2
) + "\n"
);
await cp(resolve(root, "netlify/package-lock.json"), resolve(target, "package-lock.json"));
await writeFile(
resolve(target, ".gitignore"),
"node_modules/\n.netlify/\n.env*\n"
);
const files = [];
async function walk(directory) {
for (const entry of await readdir(directory, { withFileTypes: true })) {
const path = resolve(directory, entry.name);
if (entry.isDirectory()) await walk(path);
else
files.push({
path: path.slice(target.length + 1),
sha256: createHash("sha256")
.update(await readFile(path))
.digest("hex"),
});
}
}
await walk(target);
await writeFile(
resolve(target, "release-manifest.json"),
JSON.stringify({ builtAt: new Date().toISOString(), files }, null, 2) + "\n"
);
const zip = resolve(root, "release/marmar-context-netlify.zip");
await rm(zip, { force: true });
execFileSync("/usr/bin/zip", ["-qr", zip, "."], { cwd: target });
console.log(
JSON.stringify({
directory: target,
archive: zip,
files: files.length,
sha256: createHash("sha256")
.update(await readFile(zip))
.digest("hex"),
})
);