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