import path from "path"; import { existsSync, mkdirSync, writeFileSync } from "fs"; import grabDirNames from "../utils/grab-dir-names"; const { BUNX_BUNDLER_ERROR_EXIT_FILE } = grabDirNames(); /** * Writes the `BUNDLER_EXIT.txt` flag that the bundler pipeline watches to * detect that the dev/prod child process previously crashed. * * Guardrails: * - Never writes for clean exits (exitCode === 0) or signal deaths where no * error is available (Ctrl+C must not leave a stale error file behind). * - The supervisor writes only when the file does not already exist, so the * crash handler's richer error/stack payload is not clobbered. */ export default function writeErrorFile({ force, error, exitCode, }) { const has_error = error != null; const abnormal_exit = exitCode != null && exitCode !== 0; if (!has_error && !abnormal_exit) return; if (!force && existsSync(BUNX_BUNDLER_ERROR_EXIT_FILE)) return; const err = error instanceof Error ? error : typeof error === "string" ? new Error(error) : undefined; const message = err?.message || "Unknown error"; const stack = err?.stack || "N/A"; let txt = ``; txt += `Bunext Error\n`; txt += `============================================\n`; txt += `ERROR: ${message}\n`; txt += `EXIT_CODE: ${exitCode ?? "N/A"}\n`; txt += `CALL_STACK:\n${stack}\n`; try { mkdirSync(path.dirname(BUNX_BUNDLER_ERROR_EXIT_FILE), { recursive: true, }); writeFileSync(BUNX_BUNDLER_ERROR_EXIT_FILE, txt); } catch { } }