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