diff --git a/.changeset/fix-windows-preview-path-to-file-url.md b/.changeset/fix-windows-preview-path-to-file-url.md new file mode 100644 index 000000000..a007cc505 --- /dev/null +++ b/.changeset/fix-windows-preview-path-to-file-url.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +Convert absolute path to file:// URL before dynamic import in preview server to fix Windows compatibility diff --git a/packages/start/src/config/dev-server.ts b/packages/start/src/config/dev-server.ts index d88a8cb0d..3b2ad6ae6 100644 --- a/packages/start/src/config/dev-server.ts +++ b/packages/start/src/config/dev-server.ts @@ -1,4 +1,5 @@ import { NodeRequest, sendNodeResponse } from "srvx/node"; +import { pathToFileURL } from "node:url"; import { type Connect, isRunnableDevEnvironment, @@ -18,7 +19,7 @@ export function devServer(): Array { const webReq = new NodeRequest({ req, res }); const def: { default: { fetch: (req: Request) => Promise }; - } = await import(process.cwd() + "/dist/server/entry-server.js"); + } = await import(pathToFileURL(process.cwd() + "/dist/server/entry-server.js").href); sendNodeResponse(res, await def.default.fetch(webReq)); }); }; diff --git a/packages/start/src/config/index.ts b/packages/start/src/config/index.ts index 9cdc6830e..c0ae98d9f 100644 --- a/packages/start/src/config/index.ts +++ b/packages/start/src/config/index.ts @@ -200,6 +200,30 @@ export function solidStart(options?: SolidStartOptions): Array { }, filter: options?.serverFunctions?.filter, }), + { + name: "solid-start:boundary-modules", + resolveId(id, importer, { ssr }) { + if (id === "server-only") { + if (!ssr) { + this.error( + `[server-only] "${importer}" cannot import a server-only module on the client`, + ); + } + return "\0server-only"; + } + if (id === "client-only") { + if (ssr) { + this.error( + `[client-only] "${importer}" cannot import a client-only module on the server`, + ); + } + return "\0client-only"; + } + }, + load(id) { + if (id === "\0server-only" || id === "\0client-only") return "export {}"; + }, + }, { name: "solid-start:virtual-modules", async resolveId(id) { diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts index 9b1c9f218..f08f1f41c 100644 --- a/packages/start/src/server/handler.ts +++ b/packages/start/src/server/handler.ts @@ -114,12 +114,15 @@ 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; + // remove thenable so h3/Cloudflare Workers do not await the stream object; + // must happen after the dev-server branch so the stream remains awaitable + // when returned to solid-start-dev-server above + delete (stream as any).then; + // returning stream directly breaks cloudflare workers const { writable, readable } = new TransformStream(); stream.pipeTo(writable);