From 7b54d55f78980cef0e5901932a3db5100bb5231b Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Mon, 2 Feb 2026 16:26:49 -0800 Subject: [PATCH 1/3] fix: use @remix-run/node-fetch-server in dev server --- package.json | 5 +++-- pnpm-lock.yaml | 7 +++++-- src/dev-server.ts | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b0abc1a..32d8403 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@react-router/node": "^7.13.0", + "@remix-run/node-fetch-server": "^0.13.0", "@rspack/plugin-react-refresh": "^1.6.0", "babel-dead-code-elimination": "^1.0.12", "esbuild": "^0.27.2", @@ -89,6 +90,8 @@ "@rsbuild/core": "1.7.2", "@rslib/core": "^0.19.3", "@rspack/core": "1.7.4", + "@rstest/core": "^0.8.1", + "@rstest/coverage-istanbul": "^0.2.0", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.27.0", "@types/babel__traverse": "^7.28.0", @@ -96,8 +99,6 @@ "@types/jsesc": "^3.0.3", "@types/node": "^25.0.10", "@types/react": "^19.2.10", - "@rstest/core": "^0.8.1", - "@rstest/coverage-istanbul": "^0.2.0", "@types/react-dom": "^19.2.3", "es-module-lexer": "1.7.0", "kill-port": "^2.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0af447..c76bd6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@react-router/node': specifier: ^7.13.0 version: 7.13.0(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + '@remix-run/node-fetch-server': + specifier: ^0.13.0 + version: 0.13.0 '@rspack/plugin-react-refresh': specifier: ^1.6.0 version: 1.6.0(react-refresh@0.18.0) @@ -158,7 +161,7 @@ importers: dependencies: '@react-router/express': specifier: ^7.13.0 - version: 7.13.0(express@5.2.1)(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 7.13.0(express@4.22.1)(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) '@react-router/node': specifier: ^7.13.0 version: 7.13.0(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) @@ -341,7 +344,7 @@ importers: dependencies: '@react-router/express': specifier: ^7.13.0 - version: 7.13.0(express@4.22.1)(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 7.13.0(express@5.2.1)(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) '@react-router/node': specifier: ^7.13.0 version: 7.13.0(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) diff --git a/src/dev-server.ts b/src/dev-server.ts index 50c9855..1558fda 100644 --- a/src/dev-server.ts +++ b/src/dev-server.ts @@ -35,10 +35,20 @@ export const createDevServerMiddleware = (server: any): DevServerMiddleware => { throw new Error('Server bundle not found or invalid'); } - const { createRequestListener } = await import('@react-router/node'); + // Use the modern request listener implementation directly to reduce + // our reliance on the deprecated `@mjackson/node-fetch-server` package. + const [{ createRequestHandler }, { createRequestListener }] = await Promise.all([ + import('react-router'), + import('@remix-run/node-fetch-server'), + ]); const normalizedBuild = normalizeBuildModule(bundle); const build = await resolveBuildExports(normalizedBuild); - const listener = createRequestListener({ build }); + const requestHandler = createRequestHandler(build); + // `createRequestListener` provides `client` info but React Router's + // request handler expects an app-defined `loadContext` object. + // For the built-in dev middleware we don't currently provide a load + // context, so pass `undefined`. + const listener = createRequestListener((request) => requestHandler(request)); await listener(req, res); } catch (error) { console.error('SSR Error:', error); From c37c03b47e16c587203cec1379580d3619016228 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Mon, 2 Feb 2026 16:48:00 -0800 Subject: [PATCH 2/3] chore: add changeset for dev server request listener --- .changeset/use-remix-node-fetch-server.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/use-remix-node-fetch-server.md diff --git a/.changeset/use-remix-node-fetch-server.md b/.changeset/use-remix-node-fetch-server.md new file mode 100644 index 0000000..750e8f6 --- /dev/null +++ b/.changeset/use-remix-node-fetch-server.md @@ -0,0 +1,5 @@ +--- +"rsbuild-plugin-react-router": patch +--- + +Use `@remix-run/node-fetch-server` for the built-in dev server middleware to reduce direct reliance on `@mjackson/node-fetch-server`. From 1fe971f679ffe40cd6abdd63a2aa8f696ea3ad95 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Mon, 2 Feb 2026 17:05:57 -0800 Subject: [PATCH 3/3] fix: harden dev server listener imports --- src/dev-server.ts | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/dev-server.ts b/src/dev-server.ts index 1558fda..90348d9 100644 --- a/src/dev-server.ts +++ b/src/dev-server.ts @@ -37,18 +37,28 @@ export const createDevServerMiddleware = (server: any): DevServerMiddleware => { // Use the modern request listener implementation directly to reduce // our reliance on the deprecated `@mjackson/node-fetch-server` package. - const [{ createRequestHandler }, { createRequestListener }] = await Promise.all([ - import('react-router'), - import('@remix-run/node-fetch-server'), - ]); + const rr = await import('react-router'); + const nfs = await import('@remix-run/node-fetch-server'); + if (typeof rr.createRequestHandler !== 'function') { + throw new Error( + '[rsbuild-plugin-react-router] Missing `createRequestHandler` export from `react-router`' + ); + } + if (typeof nfs.createRequestListener !== 'function') { + throw new Error( + '[rsbuild-plugin-react-router] Missing `createRequestListener` export from `@remix-run/node-fetch-server`' + ); + } const normalizedBuild = normalizeBuildModule(bundle); const build = await resolveBuildExports(normalizedBuild); - const requestHandler = createRequestHandler(build); + const requestHandler = rr.createRequestHandler(build, 'development'); // `createRequestListener` provides `client` info but React Router's // request handler expects an app-defined `loadContext` object. // For the built-in dev middleware we don't currently provide a load // context, so pass `undefined`. - const listener = createRequestListener((request) => requestHandler(request)); + const listener = nfs.createRequestListener((request) => + requestHandler(request) + ); await listener(req, res); } catch (error) { console.error('SSR Error:', error);