From e9bb5862dc48f1371842b2ed3ecd4ea361a149aa Mon Sep 17 00:00:00 2001 From: Ashton Jurgens Date: Thu, 28 May 2026 16:36:41 -0400 Subject: [PATCH 1/3] fix: resolve /@manifest virtual module IDs in resolveId hook The manifest plugin's resolveId hook did not intercept virtual module URLs starting with /@manifest/. When the dev SSR manifest performed a dynamic import like: import('/@manifest/ssr/1745693440524/assets?id=./src/entry-client.tsx') Vite called resolveId, which returned undefined for these paths. Vite then fell through to its default filesystem resolver, stripped the query string, and attempted to load a non-existent file at: /@manifest/ssr/1745693440524/assets The load hook was correctly implemented to handle /@manifest IDs (it parsed the query string, walked the module graph for CSS dependencies, and returned inline style tags), but it was never reached because resolveId failed first. Fix: add an early return in resolveId for any ID starting with /@manifest/, allowing the virtual URL to pass through to the load hook unchanged. --- packages/start/src/config/manifest.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/start/src/config/manifest.ts b/packages/start/src/config/manifest.ts index d10d9c503..9b0a655c3 100644 --- a/packages/start/src/config/manifest.ts +++ b/packages/start/src/config/manifest.ts @@ -16,6 +16,8 @@ export function manifest(start: SolidStartOptions): PluginOption { devServer = server; }, async resolveId(id) { + if (id.startsWith("/@manifest/")) return id; + if (id === VIRTUAL_MODULES.clientViteManifest) return `\0${VIRTUAL_MODULES.clientViteManifest}`; if (id === VIRTUAL_MODULES.getClientManifest) From d046bf1a2dc1a8160c5038100b270f8c702211da Mon Sep 17 00:00:00 2001 From: Ashton Jurgens Date: Thu, 28 May 2026 16:49:43 -0400 Subject: [PATCH 2/3] Fix https://github.com/solidjs/solid-start/issues/2145 --- packages/start/src/server/handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts index 9b1c9f218..ac24e8bfc 100644 --- a/packages/start/src/server/handler.ts +++ b/packages/start/src/server/handler.ts @@ -114,12 +114,12 @@ export function createBaseHandler( if (mode === "async") return await stream; - delete (stream as any).then; - // using TransformStream in dev can cause solid-start-dev-server to crash // when stream is cancelled if (globalThis.USING_SOLID_START_DEV_SERVER) return stream; + delete (stream as any).then; + // returning stream directly breaks cloudflare workers const { writable, readable } = new TransformStream(); stream.pipeTo(writable); From 3efff0c63a2e42f7810b979752ba27c430a74a14 Mon Sep 17 00:00:00 2001 From: Ashton Jurgens Date: Thu, 28 May 2026 16:56:31 -0400 Subject: [PATCH 3/3] fix: remove Debouncer from server-fn-manifest load hook to fix build hang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The load hook for the "solid-start:server-fn-manifest" virtual module used a Debouncer that delayed resolution by 1 second (setTimeout). During production builds (Rollup), this timer never fires before Rollup exits, causing: Unexpected early exit. This happens when Promises returned by plugins cannot resolve. Unfinished hook action(s) on exit: (solid-start:server-functions/preload) load "solid-start:server-fn-manifest" The Debouncer was designed for dev-mode HMR batching — deferring regeneration of the manifest when multiple files change in quick succession. However, the compiler plugin already handles invalidation via invalidateModules(), which re-triggers the load hook when server function files change. The Debouncer was therefore redundant even in dev mode. Fix: return the generated import statements synchronously from the load hook. The manifest set is already populated by the time load runs (the compiler plugin's transform hook runs first during both dev and build), so there is no need to wait. --- packages/start/src/directives/index.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/start/src/directives/index.ts b/packages/start/src/directives/index.ts index 0219fe346..3995b4bb1 100644 --- a/packages/start/src/directives/index.ts +++ b/packages/start/src/directives/index.ts @@ -181,15 +181,10 @@ export function serverFunctionsPlugin(options: ServerFunctionsOptions): Plugin[] } return null; }, - async load(id, opts) { + load(id, opts) { const mode = opts?.ssr ? "server" : "client"; if (id === options.manifest) { - const current = new Debouncer(() => - [...manifest[mode]].map(entry => `import "${entry}";`).join("\n"), - ); - preload[mode] = current; - const result = await current.promise.reference; - return result; + return [...manifest[mode]].map(entry => `import "${entry}";`).join("\n"); } return null; },