From f3b087a1f3f2d91820e430334f5ed677e5552bcd Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Thu, 9 Apr 2026 18:01:29 +0100 Subject: [PATCH] Handle errors better --- .../plugins/esbuild-ctx-artifact-tracker.d.ts | 2 +- .../plugins/esbuild-ctx-artifact-tracker.js | 22 +++++++++++++-- dist/functions/bunext-init.d.ts | 1 + dist/functions/server/watcher-esbuild-ctx.js | 8 +++++- .../web-pages/grab-tsx-string-module.js | 18 ++++++++++-- package.json | 2 +- .../plugins/esbuild-ctx-artifact-tracker.ts | 28 +++++++++++++++++-- src/functions/bunext-init.ts | 1 + src/functions/server/watcher-esbuild-ctx.ts | 7 ++++- .../web-pages/grab-tsx-string-module.tsx | 17 +++++++++-- 10 files changed, 91 insertions(+), 15 deletions(-) diff --git a/dist/functions/bundler/plugins/esbuild-ctx-artifact-tracker.d.ts b/dist/functions/bundler/plugins/esbuild-ctx-artifact-tracker.d.ts index 420ef05..7df1291 100644 --- a/dist/functions/bundler/plugins/esbuild-ctx-artifact-tracker.d.ts +++ b/dist/functions/bundler/plugins/esbuild-ctx-artifact-tracker.d.ts @@ -1,4 +1,4 @@ -import type { Plugin } from "esbuild"; +import { type Plugin } from "esbuild"; import type { PageFiles } from "../../../types"; type Params = { entryToPage: Map { + build.onStart(async () => { build_starts++; buildStart = performance.now(); if (build_starts == MAX_BUILD_STARTS) { const error_msg = `Build Failed. Please check all your components and imports.`; log.error(error_msg); + global.BUNDLER_CTX_DISPOSED = true; global.RECOMPILING = false; global.IS_SERVER_COMPONENT = false; + await global.BUNDLER_CTX?.dispose(); + global.BUNDLER_CTX = undefined; } }); build.onEnd((result) => { @@ -28,6 +32,20 @@ export default function esbuildCTXArtifactTracker({ entryToPage, post_build_fn, // } return; } + // if (result.errors.length) { + // console.error( + // esbuild.formatMessagesSync(result.errors, { + // kind: "error", + // }), + // ); + // } + // if (result.warnings.length) { + // console.warn( + // esbuild.formatMessagesSync(result.warnings, { + // kind: "warning", + // }), + // ); + // } const artifacts = grabArtifactsFromBundledResults({ result, entryToPage, diff --git a/dist/functions/bunext-init.d.ts b/dist/functions/bunext-init.d.ts index 87dedd6..9d822e4 100644 --- a/dist/functions/bunext-init.d.ts +++ b/dist/functions/bunext-init.d.ts @@ -34,5 +34,6 @@ declare global { main: any; css: string; }>; + var BUNDLER_CTX_DISPOSED: boolean | undefined; } export default function bunextInit(): Promise; diff --git a/dist/functions/server/watcher-esbuild-ctx.js b/dist/functions/server/watcher-esbuild-ctx.js index 3b8cd63..2fb040f 100644 --- a/dist/functions/server/watcher-esbuild-ctx.js +++ b/dist/functions/server/watcher-esbuild-ctx.js @@ -47,7 +47,13 @@ export default async function watcherEsbuildCTX() { if (filename.match(/.*\.server\.tsx?/)) { global.IS_SERVER_COMPONENT = true; } - await global.BUNDLER_CTX?.rebuild(); + if (global.BUNDLER_CTX && !global.BUNDLER_CTX_DISPOSED) { + await global.BUNDLER_CTX.rebuild(); + } + else { + await fullRebuild({ msg: `Restarting Bundler ...` }); + global.BUNDLER_CTX_DISPOSED = false; + } if (filename.match(/(404|500)\.tsx?/)) { for (let i = global.HMR_CONTROLLERS.length - 1; i >= 0; i--) { const controller = global.HMR_CONTROLLERS[i]; diff --git a/dist/functions/server/web-pages/grab-tsx-string-module.js b/dist/functions/server/web-pages/grab-tsx-string-module.js index 9069a54..b972ba0 100644 --- a/dist/functions/server/web-pages/grab-tsx-string-module.js +++ b/dist/functions/server/web-pages/grab-tsx-string-module.js @@ -4,7 +4,6 @@ import grabDirNames from "../../../utils/grab-dir-names"; import path from "path"; import tailwindEsbuildPlugin from "./tailwind-esbuild-plugin"; import { existsSync, unlinkSync } from "fs"; -import { log } from "../../../utils/log"; const { PAGES_DIR, BUNX_CWD_MODULE_CACHE_DIR } = grabDirNames(); function toModPath(page_file_path) { return path.join(BUNX_CWD_MODULE_CACHE_DIR, page_file_path.replace(PAGES_DIR, "").replace(/\.(t|j)sx?$/, ".js")); @@ -74,6 +73,7 @@ async function buildEntries({ entries, clean_cache }) { jsx: "automatic", outdir: BUNX_CWD_MODULE_CACHE_DIR, plugins: [virtualPlugin, tailwindEsbuildPlugin], + logLevel: "silent", }); } async function loadEntry(page_file_path) { @@ -92,10 +92,22 @@ async function loadEntry(page_file_path) { } export default async function grabTsxStringModule(params) { if (isBatch(params)) { - await buildEntries({ entries: params.tsx_map }); + try { + await buildEntries({ entries: params.tsx_map }); + } + catch (error) { + console.error(`SSR Batch Build Error\n`); + console.log(error); + } return Promise.all(params.tsx_map.map((entry) => loadEntry(entry.page_file_path))); } - await buildEntries({ entries: [params], clean_cache: true }); + try { + await buildEntries({ entries: [params], clean_cache: true }); + } + catch (error) { + console.error(`SSR Single Build Error\n`); + console.log(error); + } return loadEntry(params.page_file_path); } // export default async function grabTsxStringModule({ diff --git a/package.json b/package.json index 4708d39..bc2ee9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/bunext", - "version": "1.0.60", + "version": "1.0.61", "main": "dist/index.js", "module": "index.ts", "dependencies": { diff --git a/src/functions/bundler/plugins/esbuild-ctx-artifact-tracker.ts b/src/functions/bundler/plugins/esbuild-ctx-artifact-tracker.ts index ff8964a..36df0c8 100644 --- a/src/functions/bundler/plugins/esbuild-ctx-artifact-tracker.ts +++ b/src/functions/bundler/plugins/esbuild-ctx-artifact-tracker.ts @@ -1,11 +1,11 @@ -import type { Plugin } from "esbuild"; +import { type Plugin } from "esbuild"; import type { PageFiles } from "../../../types"; import { log } from "../../../utils/log"; import grabArtifactsFromBundledResults from "../grab-artifacts-from-bundled-result"; let buildStart = 0; let build_starts = 0; -const MAX_BUILD_STARTS = 10; +const MAX_BUILD_STARTS = 2; type Params = { entryToPage: Map< @@ -24,15 +24,21 @@ export default function esbuildCTXArtifactTracker({ const artifactTracker: Plugin = { name: "artifact-tracker", setup(build) { - build.onStart(() => { + build.onStart(async () => { build_starts++; buildStart = performance.now(); if (build_starts == MAX_BUILD_STARTS) { const error_msg = `Build Failed. Please check all your components and imports.`; log.error(error_msg); + + global.BUNDLER_CTX_DISPOSED = true; + global.RECOMPILING = false; global.IS_SERVER_COMPONENT = false; + + await global.BUNDLER_CTX?.dispose(); + global.BUNDLER_CTX = undefined; } }); @@ -48,6 +54,22 @@ export default function esbuildCTXArtifactTracker({ return; } + // if (result.errors.length) { + // console.error( + // esbuild.formatMessagesSync(result.errors, { + // kind: "error", + // }), + // ); + // } + + // if (result.warnings.length) { + // console.warn( + // esbuild.formatMessagesSync(result.warnings, { + // kind: "warning", + // }), + // ); + // } + const artifacts = grabArtifactsFromBundledResults({ result, entryToPage, diff --git a/src/functions/bunext-init.ts b/src/functions/bunext-init.ts index 3635d37..0f9ec20 100644 --- a/src/functions/bunext-init.ts +++ b/src/functions/bunext-init.ts @@ -42,6 +42,7 @@ declare global { var REACT_IMPORTS_MAP: { imports: Record }; var REACT_DOM_SERVER: any; var REACT_DOM_MODULE_CACHE: Map; + var BUNDLER_CTX_DISPOSED: boolean | undefined; } const dirNames = grabDirNames(); diff --git a/src/functions/server/watcher-esbuild-ctx.ts b/src/functions/server/watcher-esbuild-ctx.ts index 002a5bd..3f0eb08 100644 --- a/src/functions/server/watcher-esbuild-ctx.ts +++ b/src/functions/server/watcher-esbuild-ctx.ts @@ -60,7 +60,12 @@ export default async function watcherEsbuildCTX() { global.IS_SERVER_COMPONENT = true; } - await global.BUNDLER_CTX?.rebuild(); + if (global.BUNDLER_CTX && !global.BUNDLER_CTX_DISPOSED) { + await global.BUNDLER_CTX.rebuild(); + } else { + await fullRebuild({ msg: `Restarting Bundler ...` }); + global.BUNDLER_CTX_DISPOSED = false; + } if (filename.match(/(404|500)\.tsx?/)) { for ( diff --git a/src/functions/server/web-pages/grab-tsx-string-module.tsx b/src/functions/server/web-pages/grab-tsx-string-module.tsx index c6b50fd..8b95d18 100644 --- a/src/functions/server/web-pages/grab-tsx-string-module.tsx +++ b/src/functions/server/web-pages/grab-tsx-string-module.tsx @@ -8,7 +8,6 @@ import type { GrabTSXModuleSingleParams, } from "../../../types"; import { existsSync, unlinkSync } from "fs"; -import { log } from "../../../utils/log"; const { PAGES_DIR, BUNX_CWD_MODULE_CACHE_DIR } = grabDirNames(); @@ -102,6 +101,7 @@ async function buildEntries({ entries, clean_cache }: BuildEntriesParams) { jsx: "automatic", outdir: BUNX_CWD_MODULE_CACHE_DIR, plugins: [virtualPlugin, tailwindEsbuildPlugin], + logLevel: "silent", }); } @@ -128,13 +128,24 @@ export default async function grabTsxStringModule( params: Params, ): Promise { if (isBatch(params)) { - await buildEntries({ entries: params.tsx_map }); + try { + await buildEntries({ entries: params.tsx_map }); + } catch (error) { + console.error(`SSR Batch Build Error\n`); + console.log(error); + } return Promise.all( params.tsx_map.map((entry) => loadEntry(entry.page_file_path)), ); } - await buildEntries({ entries: [params], clean_cache: true }); + try { + await buildEntries({ entries: [params], clean_cache: true }); + } catch (error) { + console.error(`SSR Single Build Error\n`); + console.log(error); + } + return loadEntry(params.page_file_path); }