branch:
build.ts
2318 bytesRaw
import { copyFileSync, existsSync, writeFileSync } from "node:fs";
import { execSync } from "node:child_process";
import { join, dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { build } from "tsdown";
import * as esbuild from "esbuild";

const __dirname = dirname(fileURLToPath(import.meta.url));
const packageRoot = join(__dirname, "..");

async function main() {
  // Pre-build: bundle asset-handler + mime into a standalone ESM runtime module.
  // This gets embedded as a string constant so createApp can include it in
  // generated workers, giving them the full handleAssetRequest implementation.
  const runtimeBundle = await esbuild.build({
    entryPoints: [join(packageRoot, "src/asset-handler.ts")],
    bundle: true,
    write: false,
    format: "esm",
    platform: "browser",
    target: "es2022",
    minify: true
  });

  const runtimeCode = runtimeBundle.outputFiles?.[0]?.text ?? "";
  const escaped = JSON.stringify(runtimeCode);
  const generatedFile = join(packageRoot, "src/_asset-runtime-code.ts");
  writeFileSync(
    generatedFile,
    `// AUTO-GENERATED by scripts/build.ts — do not edit\n` +
      `export const ASSET_RUNTIME_CODE = ${escaped};\n`
  );

  await build({
    clean: true,
    dts: true,
    entry: ["src/index.ts"],
    deps: {
      skipNodeModulesBundle: true,
      neverBundle: ["cloudflare:workers", "./esbuild.wasm"]
    },
    format: "esm",
    sourcemap: true,
    fixedExtension: false
  });

  // Copy esbuild.wasm from esbuild-wasm package into dist/
  const possiblePaths = [
    join(packageRoot, "node_modules/esbuild-wasm/esbuild.wasm"),
    join(packageRoot, "../../node_modules/esbuild-wasm/esbuild.wasm")
  ];

  let wasmSource: string | null = null;
  for (const p of possiblePaths) {
    if (existsSync(p)) {
      wasmSource = p;
      break;
    }
  }

  if (!wasmSource) {
    console.error("Error: Could not find esbuild.wasm!");
    process.exit(1);
  }

  const wasmDest = join(packageRoot, "dist/esbuild.wasm");
  copyFileSync(wasmSource, wasmDest);
  console.log("Copied esbuild.wasm to dist/");

  // then run oxfmt on the generated .d.ts files
  execSync("oxfmt --write ./dist/*.d.ts");

  process.exit(0);
}

main().catch((err) => {
  // Build failures should fail
  console.error(err);
  process.exit(1);
});