marmar-context / web / context / scripts / package-netlify.mjs
package-netlify.mjs
Raw
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"),
  })
);