jmou/cgithub
git clone https://github.com/jmou/cgithub.git
git clone git@github.com:jmou/cgithub.git
Loading…
(top)/scripts/build.ts
language: TypeScript
2.33 KB / 64 lines / 57 loc
History
View raw
// Generates the sources that can't exist at runtime on Workers:
//
//   src/views.generated.ts  - views/*.eta precompiled into plain functions.
//     Workers disallow runtime code generation (`new Function`), so Eta cannot
//     compile templates there at request time.
//   src/build.generated.ts  - the commit this build was made from, for the
//     page footer. Workers can't shell out to git at request time either.
import { execFileSync } from "node:child_process";
import { Eta } from "eta";
import fs from "node:fs";
import path from "node:path";

const root = path.join(import.meta.dirname, "..");
const viewsDir = path.join(root, "views");
const eta = new Eta({ views: viewsDir });

// Names are the templates' paths under views/, e.g. "layouts/base.eta", which
// is how the templates address each other (see src/worker.ts).
function templateNames(dir: string, prefix = ""): string[] {
  const names: string[] = [];
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
    const name = prefix + entry.name;
    if (entry.isDirectory()) {
      names.push(...templateNames(path.join(dir, entry.name), `${name}/`));
    } else if (entry.name.endsWith(".eta")) {
      names.push(name);
    }
  }
  return names.sort();
}

const names = templateNames(viewsDir);

let out = `// @ts-nocheck
// Generated by scripts/build.ts -- do not edit.
export const views = {
`;
for (const name of names) {
  const source = fs.readFileSync(path.join(viewsDir, name), "utf8");
  const body = eta.compileToString(source);
  out += `  ${JSON.stringify(name)}: function (it, options) {\n${body}\n  },\n`;
}
out += "};\n";

fs.writeFileSync(path.join(root, "src", "views.generated.ts"), out);
console.log(`Compiled ${names.length} templates to src/views.generated.ts`);

// Untagged repositories describe as a bare short hash; --dirty marks a build
// made from an unclean working copy.
let buildCommit = "unknown";
try {
  buildCommit = execFileSync("git", ["describe", "--tags", "--always", "--dirty"], {
    cwd: root,
    encoding: "utf8",
  }).trim();
} catch {
  // Building from a source copy without git history.
}

fs.writeFileSync(
  path.join(root, "src", "build.generated.ts"),
  `// Generated by scripts/build.ts -- do not edit.\nexport const buildCommit = ${JSON.stringify(buildCommit)};\n`,
);
console.log(`Wrote commit ${buildCommit} to src/build.generated.ts`);