build.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { readdir, readFile, writeFile } from "fs/promises";
  2. import { join } from "path";
  3. const outdir = "dist";
  4. // Step 1: Clean output directory
  5. const { rmSync } = await import("fs");
  6. rmSync(outdir, { recursive: true, force: true });
  7. // Step 2: Bundle with splitting
  8. const result = await Bun.build({
  9. entrypoints: ["src/entrypoints/cli.tsx"],
  10. outdir,
  11. target: "bun",
  12. splitting: true,
  13. });
  14. if (!result.success) {
  15. console.error("Build failed:");
  16. for (const log of result.logs) {
  17. console.error(log);
  18. }
  19. process.exit(1);
  20. }
  21. // Step 3: Post-process — replace Bun-only `import.meta.require` with Node.js compatible version
  22. const files = await readdir(outdir);
  23. const IMPORT_META_REQUIRE = "var __require = import.meta.require;";
  24. const COMPAT_REQUIRE = `var __require = typeof import.meta.require === "function" ? import.meta.require : (await import("module")).createRequire(import.meta.url);`;
  25. let patched = 0;
  26. for (const file of files) {
  27. if (!file.endsWith(".js")) continue;
  28. const filePath = join(outdir, file);
  29. const content = await readFile(filePath, "utf-8");
  30. if (content.includes(IMPORT_META_REQUIRE)) {
  31. await writeFile(
  32. filePath,
  33. content.replace(IMPORT_META_REQUIRE, COMPAT_REQUIRE),
  34. );
  35. patched++;
  36. }
  37. }
  38. console.log(
  39. `Bundled ${result.outputs.length} files to ${outdir}/ (patched ${patched} for Node.js compat)`,
  40. );