From ce87e70d1fce2a1c24d6159ebf8cad58abea5eb7 Mon Sep 17 00:00:00 2001 From: Eli <88557639+lishaduck@users.noreply.github.com> Date: Wed, 19 Nov 2025 20:27:12 -0600 Subject: [PATCH 1/2] refactor: use module runner api --- packages/plugin-vite/src/plugins/deno.ts | 3 +- .../plugin-vite/src/plugins/dev_server.ts | 30 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/plugin-vite/src/plugins/deno.ts b/packages/plugin-vite/src/plugins/deno.ts index 97f6ad7c5e0..4cf0b98f083 100644 --- a/packages/plugin-vite/src/plugins/deno.ts +++ b/packages/plugin-vite/src/plugins/deno.ts @@ -47,8 +47,7 @@ export function deno(): Plugin { platform: "browser", preserveJsx: true, cachedOnly: true, - }) - .createLoader(); + }).createLoader(); }, applyToEnvironment() { return true; diff --git a/packages/plugin-vite/src/plugins/dev_server.ts b/packages/plugin-vite/src/plugins/dev_server.ts index 729594ea73e..3d5ddc1c616 100644 --- a/packages/plugin-vite/src/plugins/dev_server.ts +++ b/packages/plugin-vite/src/plugins/dev_server.ts @@ -1,9 +1,19 @@ -import type { DevEnvironment, Plugin } from "vite"; +import { + type DevEnvironment, + isRunnableDevEnvironment, + type Plugin, +} from "vite"; import * as path from "@std/path"; import { ASSET_CACHE_BUST_KEY } from "fresh/internal"; import { createRequest, sendResponse } from "@remix-run/node-fetch-server"; import { hashCode } from "../shared.ts"; +interface FetchHandler { + default: { + fetch: (req: Request) => Promise; + }; +} + export function devServer(): Plugin[] { let publicDir = ""; return [ @@ -69,16 +79,15 @@ export function devServer(): Plugin[] { // Ignore } + if (!isRunnableDevEnvironment(server.environments.ssr)) return; + try { - const mod = await server.ssrLoadModule("fresh:server_entry"); - const req = createRequest(nodeReq, nodeRes); - mod.setErrorInterceptor((err: unknown) => { - if (err instanceof Error) { - server.ssrFixStacktrace(err); - } - }); + const mod = await server.environments.ssr.runner.import( + "fresh:server_entry", + ) as FetchHandler; - const res = (await mod.default.fetch(req)) as Response; + const req = createRequest(nodeReq, nodeRes); + const res = await mod.default.fetch(req); // Collect css eagerly to avoid FOUC. This is a workaround for // Vite not supporting css natively. It's a bit hacky, but @@ -107,9 +116,6 @@ export function devServer(): Plugin[] { await sendResponse(nodeRes, res); } catch (err) { - if (err instanceof Error) { - server.ssrFixStacktrace(err); - } return next(err); } }); From 1a5f0470f5eec23882c215b02612bb7c8b5e6dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sun, 29 Mar 2026 22:16:18 +0200 Subject: [PATCH 2/2] fix: restore ssrFixStacktrace for source-mapped error traces The switch from ssrLoadModule to ModuleRunner removed stack trace source mapping. Re-add setErrorInterceptor call so errors in route handlers get source-mapped before the error overlay renders them, and ssrFixStacktrace in the outer catch for module loading errors. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/plugin-vite/src/plugins/dev_server.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/plugin-vite/src/plugins/dev_server.ts b/packages/plugin-vite/src/plugins/dev_server.ts index a599293581f..dfa1cf3cb77 100644 --- a/packages/plugin-vite/src/plugins/dev_server.ts +++ b/packages/plugin-vite/src/plugins/dev_server.ts @@ -12,6 +12,7 @@ interface FetchHandler { default: { fetch: (req: Request) => Promise; }; + setErrorInterceptor?: (fn: (err: unknown) => void) => void; } export function devServer(): Plugin[] { @@ -95,6 +96,11 @@ export function devServer(): Plugin[] { const mod = await server.environments.ssr.runner.import( "fresh:server_entry", ) as FetchHandler; + mod.setErrorInterceptor?.((err: unknown) => { + if (err instanceof Error) { + server.ssrFixStacktrace(err); + } + }); const req = createRequest(nodeReq, nodeRes); const res = await mod.default.fetch(req); @@ -126,6 +132,9 @@ export function devServer(): Plugin[] { await sendResponse(nodeRes, res); } catch (err) { + if (err instanceof Error) { + server.ssrFixStacktrace(err); + } return next(err); } });