vite-plugin-react-server 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/config/autoDiscover/resolveBuildPages.d.ts +1 -1
  3. package/dist/plugin/config/autoDiscover/resolveBuildPages.d.ts.map +1 -1
  4. package/dist/plugin/config/autoDiscover/resolveBuildPages.js.map +1 -1
  5. package/dist/plugin/config/defaults.d.ts +1 -1
  6. package/dist/plugin/config/defaults.d.ts.map +1 -1
  7. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  8. package/dist/plugin/config/resolveOptions.js +1 -1
  9. package/dist/plugin/config/resolveOptions.js.map +1 -1
  10. package/dist/plugin/config/resolveUrlOption.d.ts +2 -2
  11. package/dist/plugin/config/resolveUrlOption.d.ts.map +1 -1
  12. package/dist/plugin/config/resolveUrlOption.js +4 -1
  13. package/dist/plugin/config/resolveUrlOption.js.map +1 -1
  14. package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
  15. package/dist/plugin/config/resolveUserConfig.js +11 -1
  16. package/dist/plugin/config/resolveUserConfig.js.map +1 -1
  17. package/dist/plugin/helpers/createRscStream.js +2 -1
  18. package/dist/plugin/helpers/createRscStream.js.map +1 -1
  19. package/dist/plugin/helpers/requestToRoute.d.ts +5 -0
  20. package/dist/plugin/helpers/requestToRoute.d.ts.map +1 -0
  21. package/dist/plugin/helpers/requestToRoute.js +24 -0
  22. package/dist/plugin/helpers/requestToRoute.js.map +1 -0
  23. package/dist/plugin/html.d.ts +1 -1
  24. package/dist/plugin/html.d.ts.map +1 -1
  25. package/dist/plugin/html.js +3 -2
  26. package/dist/plugin/html.js.map +1 -1
  27. package/dist/plugin/react-client/plugin.d.ts.map +1 -1
  28. package/dist/plugin/react-client/plugin.js.map +1 -1
  29. package/dist/plugin/react-client/server.d.ts +1 -1
  30. package/dist/plugin/react-client/server.d.ts.map +1 -1
  31. package/dist/plugin/react-client/server.js +51 -39
  32. package/dist/plugin/react-client/server.js.map +1 -1
  33. package/dist/plugin/react-server/server.d.ts +1 -1
  34. package/dist/plugin/react-server/server.d.ts.map +1 -1
  35. package/dist/plugin/react-server/server.js +36 -20
  36. package/dist/plugin/react-server/server.js.map +1 -1
  37. package/dist/plugin/react-static/plugin.d.ts.map +1 -1
  38. package/dist/plugin/react-static/plugin.js +27 -8
  39. package/dist/plugin/react-static/plugin.js.map +1 -1
  40. package/dist/plugin/react-static/renderPage.d.ts.map +1 -1
  41. package/dist/plugin/react-static/renderPage.js.map +1 -1
  42. package/dist/plugin/transformer/plugin.client.d.ts.map +1 -1
  43. package/dist/plugin/transformer/plugin.client.js +13 -3
  44. package/dist/plugin/transformer/plugin.client.js.map +1 -1
  45. package/dist/plugin/transformer/plugin.server.d.ts.map +1 -1
  46. package/dist/plugin/transformer/plugin.server.js +13 -3
  47. package/dist/plugin/transformer/plugin.server.js.map +1 -1
  48. package/dist/plugin/worker/createWorker.d.ts +1 -0
  49. package/dist/plugin/worker/createWorker.d.ts.map +1 -1
  50. package/dist/plugin/worker/createWorker.js +9 -16
  51. package/dist/plugin/worker/createWorker.js.map +1 -1
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +1 -1
  54. package/plugin/config/autoDiscover/resolveBuildPages.ts +1 -1
  55. package/plugin/config/resolveOptions.ts +1 -3
  56. package/plugin/config/resolveUrlOption.ts +19 -10
  57. package/plugin/config/resolveUserConfig.ts +19 -1
  58. package/plugin/helpers/createRscStream.tsx +2 -2
  59. package/plugin/helpers/requestToRoute.ts +23 -0
  60. package/plugin/html.tsx +2 -0
  61. package/plugin/react-client/plugin.ts +1 -0
  62. package/plugin/react-client/server.ts +62 -40
  63. package/plugin/react-server/server.ts +50 -23
  64. package/plugin/react-static/plugin.ts +34 -12
  65. package/plugin/react-static/renderPage.ts +0 -1
  66. package/plugin/transformer/plugin.client.ts +13 -3
  67. package/plugin/transformer/plugin.server.ts +14 -4
  68. package/plugin/worker/createWorker.ts +19 -21
@@ -3,11 +3,11 @@
3
3
  * Copyright (c) Nico Brinkkemper
4
4
  * MIT License
5
5
  */
6
- import { join } from 'node:path';
7
6
  import 'node:worker_threads';
8
7
  import { serializedOptions, serializedDevServerConfig } from '../helpers/serializeUserOptions.js';
9
8
  import { createWorker } from '../worker/createWorker.js';
10
9
  import { getRouteFiles } from '../helpers/getRouteFiles.js';
10
+ import { requestToRoute } from '../helpers/requestToRoute.js';
11
11
 
12
12
  let currentWorker = null;
13
13
  let isRestarting = false;
@@ -108,16 +108,21 @@ function handleWorkerRscStream(worker, message) {
108
108
  async function configureWorkerRequestHandler({
109
109
  server,
110
110
  autoDiscoveredFiles,
111
- userOptions,
111
+ userOptions: _userOptions,
112
112
  hmrChannel
113
113
  }) {
114
- if (server.config.root !== userOptions.projectRoot) {
115
- server.config.logger.error("[react-client] Project root mismatch", {
116
- error: new Error(`Server root ${server.config.root} does not match user options root ${userOptions.projectRoot}`)
117
- });
118
- return;
119
- }
120
- await restartWorker(server, autoDiscoveredFiles, userOptions, hmrChannel);
114
+ let {
115
+ // remove these
116
+ moduleBaseURL: _moduleBaseURL,
117
+ projectRoot: _projectRoot,
118
+ ...handlerUserOptions
119
+ } = _userOptions;
120
+ const handlerOptions = Object.assign({}, handlerUserOptions, {
121
+ moduleBaseURL: typeof server.config.server.host === "string" ? `${server.config.server.https ? "https" : "http"}://${server.config.server.host}:${server.config.server.port}` : "",
122
+ moduleBasePath: server.config.base === "/" ? "" : server.config.base.endsWith("/") ? server.config.base.slice(0, -1) : server.config.base,
123
+ projectRoot: server.config.root
124
+ });
125
+ await restartWorker(server, autoDiscoveredFiles, handlerOptions, hmrChannel);
121
126
  const handler = async (req, res, next) => {
122
127
  if (!req.url || req.headers.accept !== "text/x-component") return next();
123
128
  try {
@@ -125,16 +130,22 @@ async function configureWorkerRequestHandler({
125
130
  server.config.logger.error("[react-client] No worker available");
126
131
  return next();
127
132
  }
128
- let route = req.url;
129
- if (!route || route === "") route = "/";
133
+ let route = requestToRoute(req, {
134
+ moduleBasePath: handlerOptions.moduleBasePath,
135
+ build: handlerOptions.build
136
+ });
137
+ if (!route) {
138
+ return next();
139
+ }
130
140
  const routeFiles = await getRouteFiles(
131
141
  route,
132
142
  autoDiscoveredFiles,
133
- userOptions
143
+ handlerOptions
134
144
  );
135
145
  if (routeFiles.type === "error") {
136
- server.config.logger.error("[react-client] Error getting route files", {
137
- error: routeFiles.error
146
+ server.config.logger.error(routeFiles.error.message, {
147
+ error: routeFiles.error,
148
+ timestamp: true
138
149
  });
139
150
  return next();
140
151
  }
@@ -142,12 +153,8 @@ async function configureWorkerRequestHandler({
142
153
  res.setHeader("Content-Type", "text/x-component; charset=utf-8");
143
154
  res.setHeader("Transfer-Encoding", "chunked");
144
155
  res.setHeader("Connection", "keep-alive");
145
- let timeout = setTimeout(() => {
146
- server.config.logger.error("[react-client] RSC render timeout");
147
- res.end();
148
- }, 5e3);
149
156
  const serializedUserOptions = serializedOptions(
150
- userOptions,
157
+ handlerOptions,
151
158
  autoDiscoveredFiles
152
159
  );
153
160
  const stream = handleWorkerRscStream(currentWorker, {
@@ -158,33 +165,38 @@ async function configureWorkerRequestHandler({
158
165
  propsPath: props,
159
166
  // override these at all times to ensure the settings will work for the dev server
160
167
  projectRoot: server.config.root,
161
- moduleRootPath: join(server.config.root, userOptions.moduleBase),
162
- moduleBaseURL: "",
163
- moduleBasePath: "",
164
168
  build: serializedUserOptions.build,
165
169
  manifest: autoDiscoveredFiles.staticManifest,
166
170
  cssFiles: /* @__PURE__ */ new Map(),
167
171
  globalCss: /* @__PURE__ */ new Map()
168
172
  });
169
- stream.pipeTo(
170
- new WritableStream({
171
- write(chunk) {
172
- res.write(chunk);
173
- },
174
- close() {
175
- clearTimeout(timeout);
176
- res.end();
177
- },
178
- abort() {
179
- clearTimeout(timeout);
180
- restartWorker(server, autoDiscoveredFiles, userOptions, hmrChannel);
181
- res.end();
182
- }
183
- })
184
- );
173
+ const writeStream = new WritableStream({
174
+ write(chunk) {
175
+ res.write(chunk);
176
+ },
177
+ close() {
178
+ clearTimeout(timeout);
179
+ res.end();
180
+ },
181
+ abort() {
182
+ clearTimeout(timeout);
183
+ restartWorker(
184
+ server,
185
+ autoDiscoveredFiles,
186
+ handlerOptions,
187
+ hmrChannel
188
+ );
189
+ res.end();
190
+ }
191
+ });
192
+ let timeout = setTimeout(() => {
193
+ server.config.logger.error("[react-client] RSC render timeout");
194
+ res.end();
195
+ }, 5e3);
196
+ stream.pipeTo(writeStream);
185
197
  } catch (error) {
186
198
  if (error instanceof Error) {
187
- server.config.logger.error("[react-client] Error handling request", {
199
+ server.config.logger.error(error.message, {
188
200
  error
189
201
  });
190
202
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../../plugin/react-client/server.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n RequestHandler,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport type {\n RscWorkerOutputMessage,\n RscRenderMessage,\n} from \"../worker/types.js\";\nimport { join } from \"node:path\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport { MessageChannel } from \"node:worker_threads\";\nimport {\n serializedDevServerConfig,\n serializedOptions,\n} from \"../helpers/serializeUserOptions.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\n\nlet currentWorker: NodeWorker | null = null;\nlet isRestarting = false;\n\nasync function restartWorker(\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel\n) {\n if (isRestarting) return;\n isRestarting = true;\n\n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.terminate();\n currentWorker = null;\n }\n\n const workerResult = await createWorker({\n projectRoot: server.config.root,\n workerPath: userOptions.rscWorkerPath,\n reverseCondition: \"react-server\",\n currentCondition: \"react-client\",\n workerData: {\n hmrPort: hmrChannel.port2,\n resolvedConfig: serializedDevServerConfig(server.config),\n userOptions: serializedOptions(userOptions, autoDiscoveredFiles),\n },\n transferList: [hmrChannel.port2],\n });\n\n if (workerResult.type === \"success\") {\n currentWorker = workerResult.worker;\n } else if (workerResult.type === \"error\") {\n server.config.logger.error(\"Failed to start rsc-worker\", {\n error: workerResult.error,\n });\n }\n } finally {\n isRestarting = false;\n }\n}\n\n/**\n * Creates an async generator that yields RSC chunks from the worker.\n * Handles both module requests and RSC streaming.\n *\n * @param worker - The worker thread\n * @param server - The Vite dev server\n * @param message - The RSC render message\n * @param rscWorkerLoaderPort - Optional loader port for module loading\n * @returns An async generator that yields RSC chunks\n */\nasync function* createWorkerStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">\n): AsyncGenerator<Uint8Array, void, unknown> {\n let messageHandler: (message: RscWorkerOutputMessage) => void;\n let cleanup: () => void = () => {};\n\n // First yield: wait for initial message and handle module requests\n yield await new Promise<Uint8Array>((resolve) => {\n messageHandler = (message: RscWorkerOutputMessage) => {\n if (message.type === \"RSC_CHUNK\") {\n resolve(message.chunk);\n }\n if (message.type === \"ERROR\") {\n resolve(new Uint8Array());\n }\n };\n\n cleanup = () => {\n worker.off(\"message\", messageHandler);\n };\n\n worker.on(\"message\", messageHandler);\n\n // Send the render message to start the RSC stream\n worker.postMessage({\n type: \"RSC_RENDER\",\n id: message.route,\n ...message,\n });\n });\n\n // Subsequent yields: handle RSC chunks until stream ends\n while (true) {\n const chunk = await new Promise<Uint8Array>((resolve) => {\n messageHandler = (message: RscWorkerOutputMessage) => {\n if (message.type === \"RSC_END\") {\n cleanup();\n resolve(new Uint8Array());\n return;\n }\n if (message.type === \"RSC_CHUNK\") {\n resolve(message.chunk);\n }\n if (message.type === \"ERROR\") {\n cleanup();\n resolve(new Uint8Array());\n return;\n }\n };\n worker.once(\"message\", messageHandler);\n });\n\n if (chunk.length === 0) {\n break;\n }\n yield chunk;\n }\n}\n\n/**\n * Handles the RSC stream from the worker.\n * Creates a ReadableStream that pipes RSC chunks to the response.\n *\n * @param worker - The worker thread\n * @param message - The RSC render message\n * @returns A ReadableStream that yields RSC chunks\n */\nexport function handleWorkerRscStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">\n): ReadableStream<Uint8Array> {\n // Create a ReadableStream from the async generator\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const chunk of createWorkerStream(worker, message)) {\n controller.enqueue(chunk);\n }\n } catch (error) {\n controller.error(error);\n } finally {\n controller.close();\n }\n },\n });\n}\n\n/**\n * Configures the worker request handler.\n * @param server - The Vite dev server\n * @param autoDiscoveredFiles - The auto discovered files\n * @param userOptions - The user options\n */\nexport async function configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions,\n hmrChannel,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n hmrChannel: MessageChannel;\n}) {\n if(server.config.root !== userOptions.projectRoot) {\n server.config.logger.error(\"[react-client] Project root mismatch\", {\n error: new Error(`Server root ${server.config.root} does not match user options root ${userOptions.projectRoot}`)\n });\n return;\n }\n\n // Start the worker\n await restartWorker(server, autoDiscoveredFiles, userOptions, hmrChannel);\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url || req.headers.accept !== \"text/x-component\") return next();\n try {\n if (!currentWorker) {\n server.config.logger.error(\"[react-client] No worker available\");\n return next();\n }\n\n // Get the route from the request\n let route = req.url;\n if (!route || route === \"\") route = \"/\";\n // in the case of the no build.pages and a async Page and or props userOption, we need to await those\n // if they are already autoDiscovered then the promise will resolve immediately\n const routeFiles = await getRouteFiles(\n route,\n autoDiscoveredFiles,\n userOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(\"[react-client] Error getting route files\", {\n error: routeFiles.error,\n });\n return next();\n }\n const { page, props } = routeFiles;\n\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n let timeout = setTimeout(() => {\n server.config.logger.error(\"[react-client] RSC render timeout\");\n res.end();\n }, 5000);\n const serializedUserOptions = serializedOptions(\n userOptions,\n autoDiscoveredFiles\n );\n const stream = handleWorkerRscStream(currentWorker, {\n ...serializedUserOptions,\n // we make the worker stream aware of the route, pagePath, propsPath\n route,\n pagePath: page,\n propsPath: props,\n // override these at all times to ensure the settings will work for the dev server\n projectRoot: server.config.root,\n moduleRootPath: join(server.config.root, userOptions.moduleBase),\n moduleBaseURL: \"\",\n moduleBasePath: \"\",\n build: serializedUserOptions.build,\n manifest: autoDiscoveredFiles.staticManifest,\n cssFiles: new Map(),\n globalCss: new Map(),\n });\n\n // Pipe the stream to the response\n stream.pipeTo(\n new WritableStream({\n write(chunk) {\n res.write(chunk);\n },\n\n close() {\n clearTimeout(timeout);\n res.end();\n },\n abort() {\n clearTimeout(timeout);\n // Restart worker on error\n restartWorker(server, autoDiscoveredFiles, userOptions, hmrChannel);\n res.end();\n },\n })\n );\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(\"[react-client] Error handling request\", {\n error,\n });\n }\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // done\n}\n"],"names":["message"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sources":["../../../plugin/react-client/server.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n RequestHandler,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport type {\n RscWorkerOutputMessage,\n RscRenderMessage,\n} from \"../worker/types.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport { MessageChannel } from \"node:worker_threads\";\nimport {\n serializedDevServerConfig,\n serializedOptions,\n} from \"../helpers/serializeUserOptions.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport { requestToRoute } from \"../helpers/requestToRoute.js\";\n\nlet currentWorker: NodeWorker | null = null;\nlet isRestarting = false;\n\nasync function restartWorker(\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel\n) {\n if (isRestarting) return;\n isRestarting = true;\n\n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.terminate();\n currentWorker = null;\n }\n\n const workerResult = await createWorker({\n projectRoot: server.config.root,\n workerPath: userOptions.rscWorkerPath,\n reverseCondition: \"react-server\",\n currentCondition: \"react-client\",\n workerData: {\n hmrPort: hmrChannel.port2,\n resolvedConfig: serializedDevServerConfig(server.config),\n userOptions: serializedOptions(userOptions, autoDiscoveredFiles),\n },\n transferList: [hmrChannel.port2],\n });\n\n if (workerResult.type === \"success\") {\n currentWorker = workerResult.worker;\n } else if (workerResult.type === \"error\") {\n server.config.logger.error(\"Failed to start rsc-worker\", {\n error: workerResult.error,\n });\n }\n } finally {\n isRestarting = false;\n }\n}\n\n/**\n * Creates an async generator that yields RSC chunks from the worker.\n * Handles both module requests and RSC streaming.\n *\n * @param worker - The worker thread\n * @param server - The Vite dev server\n * @param message - The RSC render message\n * @param rscWorkerLoaderPort - Optional loader port for module loading\n * @returns An async generator that yields RSC chunks\n */\nasync function* createWorkerStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">\n): AsyncGenerator<Uint8Array, void, unknown> {\n let messageHandler: (message: RscWorkerOutputMessage) => void;\n let cleanup: () => void = () => {};\n\n // First yield: wait for initial message and handle module requests\n yield await new Promise<Uint8Array>((resolve) => {\n messageHandler = (message: RscWorkerOutputMessage) => {\n if (message.type === \"RSC_CHUNK\") {\n resolve(message.chunk);\n }\n if (message.type === \"ERROR\") {\n resolve(new Uint8Array());\n }\n };\n\n cleanup = () => {\n worker.off(\"message\", messageHandler);\n };\n\n worker.on(\"message\", messageHandler);\n\n // Send the render message to start the RSC stream\n worker.postMessage({\n type: \"RSC_RENDER\",\n id: message.route,\n ...message,\n });\n });\n\n // Subsequent yields: handle RSC chunks until stream ends\n while (true) {\n const chunk = await new Promise<Uint8Array>((resolve) => {\n messageHandler = (message: RscWorkerOutputMessage) => {\n if (message.type === \"RSC_END\") {\n cleanup();\n resolve(new Uint8Array());\n return;\n }\n if (message.type === \"RSC_CHUNK\") {\n resolve(message.chunk);\n }\n if (message.type === \"ERROR\") {\n cleanup();\n resolve(new Uint8Array());\n return;\n }\n };\n worker.once(\"message\", messageHandler);\n });\n\n if (chunk.length === 0) {\n break;\n }\n yield chunk;\n }\n}\n\n/**\n * Handles the RSC stream from the worker.\n * Creates a ReadableStream that pipes RSC chunks to the response.\n *\n * @param worker - The worker thread\n * @param message - The RSC render message\n * @returns A ReadableStream that yields RSC chunks\n */\nexport function handleWorkerRscStream(\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">\n): ReadableStream<Uint8Array> {\n // Create a ReadableStream from the async generator\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const chunk of createWorkerStream(worker, message)) {\n controller.enqueue(chunk);\n }\n } catch (error) {\n controller.error(error);\n } finally {\n controller.close();\n }\n },\n });\n}\n\n/**\n * Configures the worker request handler.\n * @param server - The Vite dev server\n * @param autoDiscoveredFiles - The auto discovered files\n * @param userOptions - The user options\n */\nexport async function configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n hmrChannel: MessageChannel;\n}) {\n let {\n // remove these\n moduleBaseURL: _moduleBaseURL,\n projectRoot: _projectRoot,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL:\n typeof server.config.server.host === \"string\"\n ? `${server.config.server.https ? \"https\" : \"http\"}://${\n server.config.server.host\n }:${server.config.server.port}`\n : \"\",\n moduleBasePath:\n server.config.base === \"/\"\n ? \"\"\n : server.config.base.endsWith(\"/\")\n ? server.config.base.slice(0, -1)\n : server.config.base,\n projectRoot: server.config.root,\n });\n\n // Start the worker\n await restartWorker(server, autoDiscoveredFiles, handlerOptions, hmrChannel);\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url || req.headers.accept !== \"text/x-component\") return next();\n try {\n if (!currentWorker) {\n server.config.logger.error(\"[react-client] No worker available\");\n return next();\n }\n\n // Get the route from the request\n let route = requestToRoute(req, {\n moduleBasePath: handlerOptions.moduleBasePath,\n build: handlerOptions.build\n });\n if (!route) {\n return next();\n }\n // in the case of the no build.pages and a async Page and or props userOption, we need to await those\n // if they are already autoDiscovered then the promise will resolve immediately\n const routeFiles = await getRouteFiles(\n route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(routeFiles.error.message, {\n error: routeFiles.error,\n timestamp: true,\n });\n return next();\n }\n const { page, props } = routeFiles;\n\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n const serializedUserOptions = serializedOptions(\n handlerOptions,\n autoDiscoveredFiles\n );\n const stream = handleWorkerRscStream(currentWorker, {\n ...serializedUserOptions,\n // we make the worker stream aware of the route, pagePath, propsPath\n route,\n pagePath: page,\n propsPath: props,\n // override these at all times to ensure the settings will work for the dev server\n projectRoot: server.config.root,\n build: serializedUserOptions.build,\n manifest: autoDiscoveredFiles.staticManifest,\n cssFiles: new Map(),\n globalCss: new Map(),\n });\n const writeStream = new WritableStream({\n write(chunk) {\n res.write(chunk);\n },\n\n close() {\n clearTimeout(timeout);\n res.end();\n },\n abort() {\n clearTimeout(timeout);\n // Restart worker on error\n restartWorker(\n server,\n autoDiscoveredFiles,\n handlerOptions,\n hmrChannel\n );\n res.end();\n },\n })\n let timeout = setTimeout(() => {\n server.config.logger.error(\"[react-client] RSC render timeout\");\n res.end();\n }, 5000);\n\n // Pipe the stream to the response\n stream.pipeTo(writeStream);\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message, {\n error,\n });\n }\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // done\n}\n"],"names":["message"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Manifest, ViteDevServer } from "vite";
2
2
  import type { AutoDiscoveredFiles, ResolvedUserOptions } from "../types.js";
3
- export declare function configureReactServer({ server, autoDiscoveredFiles, userOptions, serverManifest, }: {
3
+ export declare function configureReactServer({ server, autoDiscoveredFiles, userOptions: _userOptions, serverManifest, }: {
4
4
  server: ViteDevServer;
5
5
  autoDiscoveredFiles: AutoDiscoveredFiles;
6
6
  userOptions: ResolvedUserOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAG,QAAQ,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAO5E,wBAAsB,oBAAoB,CAAC,EACzC,MAAM,EACN,mBAAmB,EACnB,WAAW,EACX,cAAc,GACf,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,cAAc,EAAE,QAAQ,CAAC;CAC1B,iBA4GA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAO5E,wBAAsB,oBAAoB,CAAC,EACzC,MAAM,EACN,mBAAmB,EACnB,WAAW,EAAE,YAAY,EACzB,cAAc,GACf,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,cAAc,EAAE,QAAQ,CAAC;CAC1B,iBAuIA"}
@@ -12,10 +12,24 @@ import React__default from 'react';
12
12
  async function configureReactServer({
13
13
  server,
14
14
  autoDiscoveredFiles,
15
- userOptions,
15
+ userOptions: _userOptions,
16
16
  serverManifest
17
17
  }) {
18
18
  const activeStreams = /* @__PURE__ */ new Set();
19
+ const {
20
+ Html: _UserHtmlComponent,
21
+ onEvent,
22
+ // remove these
23
+ moduleBaseURL: _moduleBaseURL,
24
+ moduleBasePath: _moduleBasePath,
25
+ projectRoot: _projectRoot,
26
+ ...handlerUserOptions
27
+ } = _userOptions;
28
+ const handlerOptions = Object.assign({}, handlerUserOptions, {
29
+ moduleBaseURL: typeof server.config.server.host === "string" ? `${server.config.server.https ? "https" : "http"}://${server.config.server.host}:${server.config.server.port}` : "",
30
+ moduleBasePath: server.config.base === "/" ? "" : server.config.base.endsWith("/") ? server.config.base.slice(0, -1) : server.config.base,
31
+ projectRoot: server.config.root
32
+ });
19
33
  server.ws.on("restart", (path) => {
20
34
  console.log(
21
35
  "[vite-plugin-react-server] 🔧 Plugin changed, preparing for restart:",
@@ -33,35 +47,39 @@ async function configureReactServer({
33
47
  server.middlewares.use(async (req, res, next) => {
34
48
  try {
35
49
  if (req.headers.accept !== "text/x-component") return next();
36
- let route = req.url?.replace("/" + userOptions.build.rscOutputPath, "");
50
+ let route = req.url?.replace("/" + handlerOptions.build.rscOutputPath, "");
51
+ if (!route?.startsWith(handlerOptions.moduleBasePath)) {
52
+ next();
53
+ } else {
54
+ route = route.slice(handlerOptions.moduleBasePath.length);
55
+ }
56
+ if (typeof route !== "string") {
57
+ throw new Error("req.url is not a string");
58
+ }
37
59
  if (!route || route === "") {
38
60
  route = "/";
39
61
  }
62
+ if (!route.startsWith("/")) {
63
+ route = "/" + route;
64
+ }
40
65
  if (!autoDiscoveredFiles.urlMap.has(route)) {
41
66
  return next();
42
67
  }
43
68
  const routeFiles = autoDiscoveredFiles.urlMap.get(route);
44
69
  const pagePath = routeFiles.page;
45
70
  const propsPath = routeFiles.props;
46
- const {
47
- Html: _UserHtmlComponent,
48
- onEvent,
49
- // remove these
50
- moduleBaseURL,
51
- ...handlerUserOptions
52
- } = userOptions;
53
71
  await server.warmupRequest(pagePath);
54
72
  const eventHandler = createEventHandler(onEvent);
55
73
  const cssFilesResult = await collectViteModuleGraphCss({
56
74
  moduleGraph: server.moduleGraph,
57
75
  pagePath,
58
76
  loader: (i) => server.ssrLoadModule(i, { fixStacktrace: true }),
59
- // explicitly set to empty string, because we let vite handle the resolving during development
60
- moduleBaseURL: "",
61
- moduleBasePath: userOptions.moduleBasePath,
62
- moduleRootPath: userOptions.moduleRootPath,
63
- projectRoot: userOptions.projectRoot,
64
- css: userOptions.css,
77
+ // explicitly set for development server
78
+ moduleBaseURL: handlerOptions.moduleBaseURL,
79
+ moduleBasePath: handlerOptions.moduleBasePath,
80
+ moduleRootPath: handlerOptions.moduleRootPath,
81
+ projectRoot: handlerOptions.projectRoot,
82
+ css: handlerOptions.css,
65
83
  parentUrl: pagePath
66
84
  });
67
85
  if (cssFilesResult.type === "skip") {
@@ -75,8 +93,8 @@ async function configureReactServer({
75
93
  propsPath,
76
94
  route,
77
95
  loader: server.ssrLoadModule,
78
- pageExportName: userOptions.pageExportName ?? "default",
79
- propsExportName: userOptions.propsExportName ?? "default"
96
+ pageExportName: handlerOptions.pageExportName ?? "default",
97
+ propsExportName: handlerOptions.propsExportName ?? "default"
80
98
  });
81
99
  if (pageAndPropsResult.type === "error") {
82
100
  throw pageAndPropsResult.error;
@@ -86,7 +104,7 @@ async function configureReactServer({
86
104
  }
87
105
  const { PageComponent, pageProps } = pageAndPropsResult;
88
106
  const rscResult = await createHandler({
89
- ...handlerUserOptions,
107
+ ...handlerOptions,
90
108
  PageComponent,
91
109
  pageProps,
92
110
  logger: server.config.logger,
@@ -99,8 +117,6 @@ async function configureReactServer({
99
117
  pagePath,
100
118
  propsPath,
101
119
  cssFiles: cssFilesResult.cssFiles ?? /* @__PURE__ */ new Map(),
102
- // explicitly set to empty string, because we let vite handle the resolving during development
103
- moduleBaseURL: "",
104
120
  globalCss: /* @__PURE__ */ new Map()
105
121
  });
106
122
  if (rscResult.type === "success") {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../../plugin/react-server/server.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type { AutoDiscoveredFiles, ResolvedUserOptions } from \"../types.js\";\nimport { createEventHandler } from \"../helpers/createEventHandler.js\";\nimport { collectViteModuleGraphCss } from \"../helpers/collectViteModuleGraphCss.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport { createHandler } from \"../helpers/createHandler.js\";\nimport React from \"react\";\n\nexport async function configureReactServer({\n server,\n autoDiscoveredFiles,\n userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n console.log(\n \"[vite-plugin-react-server] 🔧 Plugin changed, preparing for restart:\",\n path\n );\n\n // Close streams with restart message\n for (const res of activeStreams) {\n res.writeHead(503, {\n \"Content-Type\": \"text/x-component\",\n \"Retry-After\": \"1\",\n });\n res.end('{\"error\":\"Server restarting...\"}');\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n try {\n if (req.headers.accept !== \"text/x-component\") return next();\n let route = req.url?.replace('/'+userOptions.build.rscOutputPath, \"\");\n if (!route || route === \"\") {\n route = \"/\";\n }\n if (!autoDiscoveredFiles.urlMap.has(route)) {\n return next();\n }\n const routeFiles = autoDiscoveredFiles.urlMap.get(route)!;\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n moduleBaseURL,\n ...handlerUserOptions\n } = userOptions;\n // Create a unified event handler\n await server.warmupRequest(pagePath);\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph,\n pagePath,\n loader: (i)=>server.ssrLoadModule(i, {fixStacktrace: true}),\n // explicitly set to empty string, because we let vite handle the resolving during development\n moduleBaseURL: \"\",\n moduleBasePath: userOptions.moduleBasePath,\n moduleRootPath: userOptions.moduleRootPath,\n projectRoot: userOptions.projectRoot,\n css: userOptions.css,\n parentUrl: pagePath,\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route,\n loader: server.ssrLoadModule,\n pageExportName: userOptions.pageExportName ?? \"default\",\n propsExportName: userOptions.propsExportName ?? \"default\",\n });\n if (pageAndPropsResult.type === \"error\") {\n throw pageAndPropsResult.error;\n }\n if (pageAndPropsResult.type === \"skip\") {\n return next();\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly\n const rscResult = await createHandler({\n ...handlerUserOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n logger: server.config.logger,\n loader: server.ssrLoadModule,\n Html: React.Fragment,\n onEvent: eventHandler,\n manifest: serverManifest,\n worker: server as any,\n route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n // explicitly set to empty string, because we let vite handle the resolving during development\n moduleBaseURL: \"\",\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n res.end();\n }\n });\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sources":["../../../plugin/react-server/server.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type { AutoDiscoveredFiles, ResolvedUserOptions } from \"../types.js\";\nimport { createEventHandler } from \"../helpers/createEventHandler.js\";\nimport { collectViteModuleGraphCss } from \"../helpers/collectViteModuleGraphCss.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport { createHandler } from \"../helpers/createHandler.js\";\nimport React from \"react\";\n\nexport async function configureReactServer({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n moduleBaseURL: _moduleBaseURL,\n moduleBasePath: _moduleBasePath,\n projectRoot: _projectRoot,\n ...handlerUserOptions\n } = _userOptions;\n\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL:\n typeof server.config.server.host === \"string\"\n ? `${server.config.server.https ? \"https\" : \"http\"}://${\n server.config.server.host\n }:${server.config.server.port}`\n : \"\",\n moduleBasePath:\n server.config.base === \"/\"\n ? \"\"\n : server.config.base.endsWith(\"/\")\n ? server.config.base.slice(0, -1)\n : server.config.base,\n projectRoot: server.config.root,\n });\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n console.log(\n \"[vite-plugin-react-server] 🔧 Plugin changed, preparing for restart:\",\n path\n );\n\n // Close streams with restart message\n for (const res of activeStreams) {\n res.writeHead(503, {\n \"Content-Type\": \"text/x-component\",\n \"Retry-After\": \"1\",\n });\n res.end('{\"error\":\"Server restarting...\"}');\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n try {\n if (req.headers.accept !== \"text/x-component\") return next();\n let route = req.url?.replace(\"/\" + handlerOptions.build.rscOutputPath, \"\");\n if(!route?.startsWith(handlerOptions.moduleBasePath)) {\n next();\n } else {\n route = route.slice(handlerOptions.moduleBasePath.length);\n }\n if(typeof route !== \"string\" ) {\n throw new Error(\"req.url is not a string\");\n }\n if (!route || route === \"\") {\n route = \"/\";\n }\n if(!route.startsWith(\"/\")) {\n route = \"/\" + route;\n }\n if (!autoDiscoveredFiles.urlMap.has(route)) {\n return next();\n }\n const routeFiles = autoDiscoveredFiles.urlMap.get(route)!;\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n // Create a unified event handler\n await server.warmupRequest(pagePath);\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph,\n pagePath,\n loader: (i) => server.ssrLoadModule(i, { fixStacktrace: true }),\n // explicitly set for development server\n moduleBaseURL: handlerOptions.moduleBaseURL,\n moduleBasePath: handlerOptions.moduleBasePath,\n moduleRootPath: handlerOptions.moduleRootPath,\n projectRoot: handlerOptions.projectRoot,\n css: handlerOptions.css,\n parentUrl: pagePath,\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route,\n loader: server.ssrLoadModule,\n pageExportName: handlerOptions.pageExportName ?? \"default\",\n propsExportName: handlerOptions.propsExportName ?? \"default\",\n });\n if (pageAndPropsResult.type === \"error\") {\n throw pageAndPropsResult.error;\n }\n if (pageAndPropsResult.type === \"skip\") {\n return next();\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly;\n const rscResult = await createHandler({\n ...handlerOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n logger: server.config.logger,\n loader: server.ssrLoadModule,\n Html: React.Fragment,\n onEvent: eventHandler,\n manifest: serverManifest,\n worker: server as any,\n route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n res.end();\n }\n });\n}\n"],"names":["React"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAGL,KAAK,MAAM,IAAI,UAAU,EAE1B,MAAM,MAAM,CAAC;AAId,OAAO,KAAK,EAEV,qBAAqB,EAOtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA6BvD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAAC;IAC1E,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC,CA0TD"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAGL,KAAK,MAAM,IAAI,UAAU,EAE1B,MAAM,MAAM,CAAC;AAId,OAAO,KAAK,EAEV,qBAAqB,EAOtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA6BvD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,UAAU,CAAC;IAC1E,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC,CAgVD"}
@@ -111,7 +111,11 @@ function reactStaticPlugin(options) {
111
111
  }
112
112
  const clientManifestResult = await tryManifest({
113
113
  root: userOptions.projectRoot,
114
- outDir: join(userOptions.build.outDir, userOptions.build.client),
114
+ outDir: join(
115
+ userOptions.build.outDir,
116
+ userOptions.build.client,
117
+ userOptions.moduleBasePath
118
+ ),
115
119
  ssrManifest: false
116
120
  });
117
121
  if (clientManifestResult.type === "error") {
@@ -206,7 +210,12 @@ function reactStaticPlugin(options) {
206
210
  const pipeableStreamOptions = {
207
211
  ...userOptions.pipeableStreamOptions,
208
212
  bootstrapModules: [
209
- ...indexHtml ? [new URL(indexHtml, userOptions.moduleBaseURL).href] : [],
213
+ ...indexHtml ? [
214
+ userOptions.moduleBaseURL !== "" ? new URL(
215
+ join(userOptions.moduleBasePath, indexHtml),
216
+ userOptions.moduleBaseURL
217
+ ).href : join(userOptions.moduleBasePath, indexHtml)
218
+ ] : [],
210
219
  ...userOptions.pipeableStreamOptions?.bootstrapModules ?? []
211
220
  ]
212
221
  };
@@ -216,30 +225,36 @@ function reactStaticPlugin(options) {
216
225
  autoDiscoveredFiles
217
226
  );
218
227
  if (!worker) {
228
+ const viteEnvPrefix = typeof resolvedConfig.envPrefix === "string" ? resolvedConfig.envPrefix : Array.isArray(resolvedConfig.envPrefix) ? resolvedConfig.envPrefix[0] : "VITE_";
219
229
  const workerResult = await createWorker({
220
230
  projectRoot: userOptions.projectRoot,
221
231
  workerPath: userOptions.htmlWorkerPath,
222
232
  currentCondition: "react-server",
223
233
  reverseCondition: "react-client",
234
+ envPrefix: viteEnvPrefix,
224
235
  workerData: {
225
236
  resolvedConfig: serializeResolvedConfig(resolvedConfig),
226
- userOptions: serializedUserOptions
237
+ userOptions: {
238
+ ...serializedUserOptions
239
+ }
227
240
  }
228
241
  });
229
242
  if (workerResult.type === "error") {
230
243
  throw workerResult.error;
231
244
  } else if (workerResult.type === "skip") {
232
- this.environment.logger.info("Worker not created, skipping static build");
245
+ this.environment.logger.info(
246
+ "Worker not created, skipping static build"
247
+ );
233
248
  return;
234
249
  } else {
235
250
  worker = workerResult.worker;
236
251
  }
237
252
  }
238
- const { onEvent, ...rest } = userOptions;
253
+ const { onEvent, ...handlerOptions } = userOptions;
239
254
  const renderPagesGenerator = renderPages(
240
255
  autoDiscoveredFiles,
241
256
  {
242
- ...rest,
257
+ ...handlerOptions,
243
258
  loader: buildLoader,
244
259
  worker,
245
260
  logger: createLogger(),
@@ -276,8 +291,12 @@ function reactStaticPlugin(options) {
276
291
  if (!finalResult) {
277
292
  throw new Error("No render result produced");
278
293
  }
279
- finalResult.streamMetrics.duration = Math.round(performance.now() - finalResult.streamMetrics.startTime);
280
- this.environment.logger.info(`Rendered ${finalResult.completedRoutes.size} unique routes in ${finalResult.streamMetrics.duration}ms`);
294
+ finalResult.streamMetrics.duration = Math.round(
295
+ performance.now() - finalResult.streamMetrics.startTime
296
+ );
297
+ this.environment.logger.info(
298
+ `Rendered ${finalResult.completedRoutes.size} unique routes in ${finalResult.streamMetrics.duration}ms`
299
+ );
281
300
  timing.render = Date.now() - (timing.renderStart ?? timing.start);
282
301
  } catch (error) {
283
302
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../plugin/react-static/plugin.ts"],"sourcesContent":["/**\n * plugin.ts\n *\n * PURPOSE: Main Vite plugin for React Server Components (RSC) static site generation\n *\n * This module:\n * 1. Orchestrates the entire static site generation process\n * 2. Manages the lifecycle of the RSC rendering process\n * 3. Handles file writing for both initial page loads and client-side navigation\n * - Writes .html files for initial page loads (complete HTML document)\n * - Writes .rsc files for client-side navigation (RSC content only)\n * 4. Provides hooks for Vite to integrate with the build process\n * 5. Manages worker threads for parallel rendering\n * 6. Handles error reporting and metrics collection\n */\n\nimport { join } from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport {\n type Manifest,\n type ResolvedConfig,\n type Plugin as VitePlugin,\n createLogger,\n} from \"vite\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { createBuildLoader } from \"../loader/createBuildLoader.js\";\nimport type {\n BuildTiming,\n ReactStreamPluginMeta,\n ResolvedUserConfig,\n ResolvedUserOptions,\n PluginEvent,\n RenderPagesResult,\n AutoDiscoveredFiles,\n CssContent,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport { renderPages } from \"./renderPages.js\";\nimport { getBundleManifest } from \"../helpers/getBundleManifest.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { resolveAutoDiscover } from \"../config/resolveAutoDiscover.js\";\nimport { getCondition } from \"../config/getCondition.js\";\nimport {\n serializedOptions,\n serializeResolvedConfig,\n} from \"../helpers/serializeUserOptions.js\";\nimport { collectManifestCss } from \"../helpers/collectManifestCss.js\";\nimport { createCssProps } from \"../helpers/createCssProps.js\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\n\nif (getCondition() !== \"react-server\") {\n throw new Error(\n \"Condition mismatch, should be react-server but got \" +\n process.env[\"NODE_OPTIONS\"]\n );\n}\n\nlet worker: Worker;\nlet userConfig: ResolvedUserConfig;\nlet resolvedConfig: ResolvedConfig;\nlet userOptions: ResolvedUserOptions;\nlet autoDiscoveredFiles: AutoDiscoveredFiles | null = null;\nlet serverManifest: Manifest | undefined = undefined;\nlet buildLoader: Awaited<ReturnType<typeof createBuildLoader>> | undefined;\n\nexport function reactStaticPlugin(options: StreamPluginOptions): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n const timing: BuildTiming = {\n start: Date.now(),\n configResolved: 0,\n buildStart: 0,\n renderStart: 0,\n };\n\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n\n return {\n name: \"vite:plugin-react-server/static\",\n enforce: \"post\",\n api: {\n meta: { timing },\n },\n\n async config(config, configEnv) {\n if (config.root && config.root !== userOptions.projectRoot) {\n userOptions.projectRoot = config.root;\n }\n\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-server\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n\n const resolvedConfig = resolveUserConfig({\n condition: \"react-server\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n timing.configResolved = Date.now();\n },\n configResolved(config) {\n resolvedConfig = config;\n },\n\n async buildStart() {\n timing.buildStart = Date.now();\n if (userOptions.onEvent && autoDiscoveredFiles) {\n userOptions.onEvent({\n type: \"build.start\",\n data: {\n pages: Array.from(autoDiscoveredFiles.urlMap.keys()),\n files: autoDiscoveredFiles,\n },\n });\n }\n },\n\n async renderStart() {\n timing.renderStart = Date.now();\n },\n\n async writeBundle(options, bundle) {\n try {\n const bundleManifest = getBundleManifest<false>({\n bundle,\n normalizer: userOptions.normalizer,\n });\n if (!(\"source\" in bundleManifest[\".vite/manifest.json\"])) {\n throw new Error(\"Server manifest not found\");\n }\n\n serverManifest = JSON.parse(\n bundleManifest[\".vite/manifest.json\"].source as string\n );\n\n if (!serverManifest) {\n throw new Error(\"Failed to parse server manifest\");\n }\n\n const clientManifestResult = await tryManifest({\n root: userOptions.projectRoot,\n outDir: join(userOptions.build.outDir, userOptions.build.client),\n ssrManifest: false,\n });\n if (clientManifestResult.type === \"error\") {\n throw clientManifestResult.error;\n }\n const clientManifest = clientManifestResult.manifest;\n\n buildLoader = await createBuildLoader(\n {\n userConfig,\n userOptions,\n serverManifest: serverManifest ?? {},\n staticManifest: autoDiscoveredFiles?.staticManifest ?? {},\n clientManifest: clientManifest ?? {},\n },\n bundle\n );\n\n // Create CSS props for each CSS file\n const cssFilesByPage = new Map();\n\n // First collect global styles from index.html\n const globalCssInputs = collectManifestCss(\n autoDiscoveredFiles?.staticManifest ?? {},\n \"index.html\",\n userOptions\n );\n\n const globalCss: Map<string, CssContent> = new Map();\n // Collect CSS files for each page and its props\n for (const [url, { page, props }] of autoDiscoveredFiles?.urlMap ??\n []) {\n const cssInputs = collectManifestCss(\n serverManifest,\n props ? [page, props] : page,\n userOptions\n );\n\n // Create a map for this page's CSS files\n const pageCssMap: Map<string, CssContent> = new Map();\n\n // Add global styles if they exist\n if (Object.keys(globalCssInputs).length > 0) {\n for (const [, value] of Object.entries(globalCssInputs)) {\n const cssContent = await buildLoader(value + \"?inline\").then(\n (r) => String(r.default)\n );\n if (cssContent === \"undefined\") {\n throw new Error(`CSS content is undefined for ${value}`);\n }\n if (cssContent) {\n globalCss.set(\n value,\n createCssProps({\n id: value,\n code: cssContent,\n css: userOptions.css,\n moduleBaseURL: userOptions.moduleBaseURL,\n moduleBasePath: userOptions.moduleBasePath,\n moduleRootPath: userOptions.moduleRootPath,\n projectRoot: userOptions.projectRoot,\n })\n );\n }\n }\n }\n\n // Add page-specific styles\n for (const [, value] of Object.entries(cssInputs)) {\n const { default: cssContent } = await buildLoader(\n value + \"?inline\"\n );\n if (typeof cssContent !== \"string\") {\n continue;\n }\n if (cssContent) {\n pageCssMap.set(\n value,\n createCssProps({\n id: value,\n code: cssContent,\n css: userOptions.css,\n moduleBaseURL: userOptions.moduleBaseURL,\n moduleBasePath: userOptions.moduleBasePath,\n moduleRootPath: userOptions.moduleRootPath,\n projectRoot: userOptions.projectRoot,\n })\n );\n }\n }\n cssFilesByPage.set(url, pageCssMap);\n }\n\n if (userOptions.onEvent) {\n userOptions.onEvent({\n type: \"build.writeBundle\",\n data: {\n pages: Array.from(autoDiscoveredFiles?.urlMap.keys() ?? []),\n options,\n bundle,\n manifest: serverManifest,\n },\n });\n }\n const staticManifest = autoDiscoveredFiles?.staticManifest ?? {};\n const indexHtml = staticManifest?.[\"index.html\"]?.file;\n const pipeableStreamOptions = {\n ...userOptions.pipeableStreamOptions,\n bootstrapModules: [\n ...(indexHtml ? [new URL(indexHtml, userOptions.moduleBaseURL).href] : []),\n ...(userOptions.pipeableStreamOptions?.bootstrapModules ?? []),\n ],\n };\n userOptions.pipeableStreamOptions = pipeableStreamOptions;\n const serializedUserOptions = serializedOptions(\n userOptions,\n autoDiscoveredFiles!\n );\n // Create worker\n if (!worker) {\n const workerResult = await createWorker({\n projectRoot: userOptions.projectRoot,\n workerPath: userOptions.htmlWorkerPath,\n currentCondition: \"react-server\",\n reverseCondition: \"react-client\",\n workerData: {\n resolvedConfig: serializeResolvedConfig(resolvedConfig),\n userOptions: serializedUserOptions,\n },\n });\n if (workerResult.type === \"error\") {\n throw workerResult.error;\n } else if (workerResult.type === \"skip\") {\n this.environment.logger.info(\"Worker not created, skipping static build\");\n return;\n } else {\n worker = workerResult.worker;\n }\n }\n // Render pages\n const { onEvent, ...rest } = userOptions;\n const renderPagesGenerator = renderPages(\n autoDiscoveredFiles!,\n {\n ...rest,\n loader: buildLoader,\n worker: worker,\n logger: createLogger(),\n onEvent: async (event: PluginEvent) => {\n if (userOptions.onEvent) {\n userOptions.onEvent(event);\n }\n // Add file write completion event\n if (event.type === \"file.write\") {\n await event.data.onComplete();\n }\n },\n pipeableStreamOptions: pipeableStreamOptions,\n manifest: serverManifest ?? {},\n build: {\n htmlOutputPath: userOptions.build.htmlOutputPath,\n rscOutputPath: userOptions.build.rscOutputPath,\n outDir: userOptions.build.outDir,\n pages: userOptions.build.pages,\n server: userOptions.build.server,\n static: userOptions.build.static,\n client: userOptions.build.client,\n },\n globalCss: globalCss,\n },\n cssFilesByPage,\n );\n\n // Process render results\n let finalResult: RenderPagesResult | undefined;\n for await (const result of renderPagesGenerator) {\n if (result.type === \"error\") {\n throw result.error;\n }\n finalResult = result;\n }\n\n if (!finalResult) {\n throw new Error(\"No render result produced\");\n }\n finalResult.streamMetrics.duration = Math.round(performance.now() - finalResult.streamMetrics.startTime);\n \n this.environment.logger.info(`Rendered ${finalResult.completedRoutes.size} unique routes in ${\n finalResult.streamMetrics.duration\n }ms`);\n\n // Update timing\n timing.render = Date.now() - (timing.renderStart ?? timing.start);\n } catch (error) {\n throw error;\n }\n\n // Cleanup\n try {\n worker.postMessage({ type: \"SHUTDOWN\", id: \"*\" });\n await new Promise<void>((resolve, reject) => {\n const shutdownHandler = (msg: any) => {\n if (msg.type === \"SHUTDOWN_COMPLETE\") {\n worker.removeListener(\"message\", shutdownHandler);\n worker\n .terminate()\n .then((code) =>\n code === 1\n ? resolve()\n : reject(new Error(`Worker terminated with code ${code}`))\n )\n .catch(reject);\n }\n };\n worker.on(\"message\", shutdownHandler);\n });\n } catch (error) {\n throw error;\n }\n },\n } as const;\n}\n"],"names":["resolvedConfig","options"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["../../../plugin/react-static/plugin.ts"],"sourcesContent":["/**\n * plugin.ts\n *\n * PURPOSE: Main Vite plugin for React Server Components (RSC) static site generation\n *\n * This module:\n * 1. Orchestrates the entire static site generation process\n * 2. Manages the lifecycle of the RSC rendering process\n * 3. Handles file writing for both initial page loads and client-side navigation\n * - Writes .html files for initial page loads (complete HTML document)\n * - Writes .rsc files for client-side navigation (RSC content only)\n * 4. Provides hooks for Vite to integrate with the build process\n * 5. Manages worker threads for parallel rendering\n * 6. Handles error reporting and metrics collection\n */\n\nimport { join } from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport {\n type Manifest,\n type ResolvedConfig,\n type Plugin as VitePlugin,\n createLogger,\n} from \"vite\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { createBuildLoader } from \"../loader/createBuildLoader.js\";\nimport type {\n BuildTiming,\n ReactStreamPluginMeta,\n ResolvedUserConfig,\n ResolvedUserOptions,\n PluginEvent,\n RenderPagesResult,\n AutoDiscoveredFiles,\n CssContent,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport { renderPages } from \"./renderPages.js\";\nimport { getBundleManifest } from \"../helpers/getBundleManifest.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { resolveAutoDiscover } from \"../config/resolveAutoDiscover.js\";\nimport { getCondition } from \"../config/getCondition.js\";\nimport {\n serializedOptions,\n serializeResolvedConfig,\n} from \"../helpers/serializeUserOptions.js\";\nimport { collectManifestCss } from \"../helpers/collectManifestCss.js\";\nimport { createCssProps } from \"../helpers/createCssProps.js\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\n\nif (getCondition() !== \"react-server\") {\n throw new Error(\n \"Condition mismatch, should be react-server but got \" +\n process.env[\"NODE_OPTIONS\"]\n );\n}\n\nlet worker: Worker;\nlet userConfig: ResolvedUserConfig;\nlet resolvedConfig: ResolvedConfig;\nlet userOptions: ResolvedUserOptions;\nlet autoDiscoveredFiles: AutoDiscoveredFiles | null = null;\nlet serverManifest: Manifest | undefined = undefined;\nlet buildLoader: Awaited<ReturnType<typeof createBuildLoader>> | undefined;\n\nexport function reactStaticPlugin(options: StreamPluginOptions): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n const timing: BuildTiming = {\n start: Date.now(),\n configResolved: 0,\n buildStart: 0,\n renderStart: 0,\n };\n\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n\n return {\n name: \"vite:plugin-react-server/static\",\n enforce: \"post\",\n api: {\n meta: { timing },\n },\n\n async config(config, configEnv) {\n if (config.root && config.root !== userOptions.projectRoot) {\n userOptions.projectRoot = config.root;\n }\n\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-server\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n\n const resolvedConfig = resolveUserConfig({\n condition: \"react-server\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n timing.configResolved = Date.now();\n },\n configResolved(config) {\n resolvedConfig = config;\n },\n\n async buildStart() {\n timing.buildStart = Date.now();\n if (userOptions.onEvent && autoDiscoveredFiles) {\n userOptions.onEvent({\n type: \"build.start\",\n data: {\n pages: Array.from(autoDiscoveredFiles.urlMap.keys()),\n files: autoDiscoveredFiles,\n },\n });\n }\n },\n\n async renderStart() {\n timing.renderStart = Date.now();\n },\n\n\n async writeBundle(options, bundle) {\n try {\n const bundleManifest = getBundleManifest<false>({\n bundle,\n normalizer: userOptions.normalizer,\n });\n if (!(\"source\" in bundleManifest[\".vite/manifest.json\"])) {\n throw new Error(\"Server manifest not found\");\n }\n\n serverManifest = JSON.parse(\n bundleManifest[\".vite/manifest.json\"].source as string\n );\n\n if (!serverManifest) {\n throw new Error(\"Failed to parse server manifest\");\n }\n\n const clientManifestResult = await tryManifest({\n root: userOptions.projectRoot,\n outDir: join(\n userOptions.build.outDir,\n userOptions.build.client,\n userOptions.moduleBasePath\n ),\n ssrManifest: false,\n });\n if (clientManifestResult.type === \"error\") {\n throw clientManifestResult.error;\n }\n const clientManifest = clientManifestResult.manifest;\n\n buildLoader = await createBuildLoader(\n {\n userConfig,\n userOptions,\n serverManifest: serverManifest ?? {},\n staticManifest: autoDiscoveredFiles?.staticManifest ?? {},\n clientManifest: clientManifest ?? {},\n },\n bundle\n );\n\n // Create CSS props for each CSS file\n const cssFilesByPage = new Map();\n\n // First collect global styles from index.html\n const globalCssInputs = collectManifestCss(\n autoDiscoveredFiles?.staticManifest ?? {},\n \"index.html\",\n userOptions\n );\n\n const globalCss: Map<string, CssContent> = new Map();\n // Collect CSS files for each page and its props\n for (const [url, { page, props }] of autoDiscoveredFiles?.urlMap ??\n []) {\n const cssInputs = collectManifestCss(\n serverManifest,\n props ? [page, props] : page,\n userOptions\n );\n\n // Create a map for this page's CSS files\n const pageCssMap: Map<string, CssContent> = new Map();\n\n // Add global styles if they exist\n if (Object.keys(globalCssInputs).length > 0) {\n for (const [, value] of Object.entries(globalCssInputs)) {\n const cssContent = await buildLoader(value + \"?inline\").then(\n (r) => String(r.default)\n );\n if (cssContent === \"undefined\") {\n throw new Error(`CSS content is undefined for ${value}`);\n }\n if (cssContent) {\n globalCss.set(\n value,\n createCssProps({\n id: value,\n code: cssContent,\n css: userOptions.css,\n moduleBaseURL: userOptions.moduleBaseURL,\n moduleBasePath: userOptions.moduleBasePath,\n moduleRootPath: userOptions.moduleRootPath,\n projectRoot: userOptions.projectRoot,\n })\n );\n }\n }\n }\n\n // Add page-specific styles\n for (const [, value] of Object.entries(cssInputs)) {\n const { default: cssContent } = await buildLoader(\n value + \"?inline\"\n );\n if (typeof cssContent !== \"string\") {\n continue;\n }\n if (cssContent) {\n pageCssMap.set(\n value,\n createCssProps({\n id: value,\n code: cssContent,\n css: userOptions.css,\n moduleBaseURL: userOptions.moduleBaseURL,\n moduleBasePath: userOptions.moduleBasePath,\n moduleRootPath: userOptions.moduleRootPath,\n projectRoot: userOptions.projectRoot,\n })\n );\n }\n }\n cssFilesByPage.set(url, pageCssMap);\n }\n\n if (userOptions.onEvent) {\n userOptions.onEvent({\n type: \"build.writeBundle\",\n data: {\n pages: Array.from(autoDiscoveredFiles?.urlMap.keys() ?? []),\n options,\n bundle,\n manifest: serverManifest,\n },\n });\n }\n const staticManifest = autoDiscoveredFiles?.staticManifest ?? {};\n const indexHtml = staticManifest?.[\"index.html\"]?.file;\n const pipeableStreamOptions = {\n ...userOptions.pipeableStreamOptions,\n bootstrapModules: [\n ...(indexHtml\n ? [\n userOptions.moduleBaseURL !== \"\"\n ? new URL(\n join(userOptions.moduleBasePath, indexHtml),\n userOptions.moduleBaseURL\n ).href\n : join(userOptions.moduleBasePath, indexHtml),\n ]\n : []),\n ...(userOptions.pipeableStreamOptions?.bootstrapModules ?? []),\n ],\n };\n userOptions.pipeableStreamOptions = pipeableStreamOptions;\n const serializedUserOptions = serializedOptions(\n userOptions,\n autoDiscoveredFiles!\n );\n // Create worker\n if (!worker) {\n const viteEnvPrefix = typeof resolvedConfig.envPrefix === 'string' ? resolvedConfig.envPrefix : Array.isArray(resolvedConfig.envPrefix) ? resolvedConfig.envPrefix[0] : 'VITE_'\n const workerResult = await createWorker({\n projectRoot: userOptions.projectRoot,\n workerPath: userOptions.htmlWorkerPath,\n currentCondition: \"react-server\",\n reverseCondition: \"react-client\",\n envPrefix: viteEnvPrefix,\n workerData: {\n resolvedConfig: serializeResolvedConfig(resolvedConfig),\n userOptions: {\n ...serializedUserOptions,\n },\n },\n });\n if (workerResult.type === \"error\") {\n throw workerResult.error;\n } else if (workerResult.type === \"skip\") {\n this.environment.logger.info(\n \"Worker not created, skipping static build\"\n );\n return;\n } else {\n worker = workerResult.worker;\n }\n }\n // Render pages\n const { onEvent, ...handlerOptions } = userOptions;\n const renderPagesGenerator = renderPages(\n autoDiscoveredFiles!,\n {\n ...handlerOptions,\n loader: buildLoader,\n worker: worker,\n logger: createLogger(),\n onEvent: async (event: PluginEvent) => {\n if (userOptions.onEvent) {\n userOptions.onEvent(event);\n }\n // Add file write completion event\n if (event.type === \"file.write\") {\n await event.data.onComplete();\n }\n },\n pipeableStreamOptions: pipeableStreamOptions,\n manifest: serverManifest ?? {},\n build: {\n htmlOutputPath: userOptions.build.htmlOutputPath,\n rscOutputPath: userOptions.build.rscOutputPath,\n outDir: userOptions.build.outDir,\n pages: userOptions.build.pages,\n server: userOptions.build.server,\n static: userOptions.build.static,\n client: userOptions.build.client,\n },\n globalCss: globalCss,\n },\n cssFilesByPage\n );\n\n // Process render results\n let finalResult: RenderPagesResult | undefined;\n for await (const result of renderPagesGenerator) {\n if (result.type === \"error\") {\n throw result.error;\n }\n finalResult = result;\n }\n\n if (!finalResult) {\n throw new Error(\"No render result produced\");\n }\n finalResult.streamMetrics.duration = Math.round(\n performance.now() - finalResult.streamMetrics.startTime\n );\n\n this.environment.logger.info(\n `Rendered ${finalResult.completedRoutes.size} unique routes in ${finalResult.streamMetrics.duration}ms`\n );\n\n // Update timing\n timing.render = Date.now() - (timing.renderStart ?? timing.start);\n } catch (error) {\n throw error;\n }\n\n // Cleanup\n try {\n worker.postMessage({ type: \"SHUTDOWN\", id: \"*\" });\n await new Promise<void>((resolve, reject) => {\n const shutdownHandler = (msg: any) => {\n if (msg.type === \"SHUTDOWN_COMPLETE\") {\n worker.removeListener(\"message\", shutdownHandler);\n worker\n .terminate()\n .then((code) =>\n code === 1\n ? resolve()\n : reject(new Error(`Worker terminated with code ${code}`))\n )\n .catch(reject);\n }\n };\n worker.on(\"message\", shutdownHandler);\n });\n } catch (error) {\n throw error;\n }\n },\n } as const;\n}\n"],"names":["resolvedConfig","options"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmDA,IAAI,YAAA,OAAmB,cAAgB,EAAA;AACrC,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,qDAAA,GACE,OAAQ,CAAA,GAAA,CAAI,cAAc;AAAA,GAC9B;AACF;AAEA,IAAI,MAAA;AACJ,IAAI,UAAA;AACJ,IAAI,cAAA;AACJ,IAAI,WAAA;AACJ,IAAI,mBAAkD,GAAA,IAAA;AACtD,IAAI,cAAuC,GAAA,SAAA;AAC3C,IAAI,WAAA;AAEG,SAAS,kBAAkB,OAE/B,EAAA;AACD,EAAA,MAAM,MAAsB,GAAA;AAAA,IAC1B,KAAA,EAAO,KAAK,GAAI,EAAA;AAAA,IAChB,cAAgB,EAAA,CAAA;AAAA,IAChB,UAAY,EAAA,CAAA;AAAA,IACZ,WAAa,EAAA;AAAA,GACf;AAEA,EAAM,MAAA,eAAA,GAAkB,eAAe,OAAO,CAAA;AAC9C,EAAI,IAAA,eAAA,CAAgB,SAAS,OAAS,EAAA;AACpC,IAAA,MAAM,eAAgB,CAAA,KAAA;AAAA;AAExB,EAAA,WAAA,GAAc,eAAgB,CAAA,WAAA;AAE9B,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,iCAAA;AAAA,IACN,OAAS,EAAA,MAAA;AAAA,IACT,GAAK,EAAA;AAAA,MACH,IAAA,EAAM,EAAE,MAAO;AAAA,KACjB;AAAA,IAEA,MAAM,MAAO,CAAA,MAAA,EAAQ,SAAW,EAAA;AAC9B,MAAA,IAAI,MAAO,CAAA,IAAA,IAAQ,MAAO,CAAA,IAAA,KAAS,YAAY,WAAa,EAAA;AAC1D,QAAA,WAAA,CAAY,cAAc,MAAO,CAAA,IAAA;AAAA;AAGnC,MAAM,MAAA,kBAAA,GAAqB,MAAM,mBAAoB,CAAA;AAAA,QACnD,MAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAW,EAAA;AAAA,OACZ,CAAA;AACD,MAAI,IAAA,kBAAA,CAAmB,SAAS,OAAS,EAAA;AACvC,QAAA,MAAM,kBAAmB,CAAA,KAAA;AAAA;AAE3B,MAAA,mBAAA,GAAsB,kBAAmB,CAAA,mBAAA;AAEzC,MAAA,MAAMA,kBAAiB,iBAAkB,CAAA;AAAA,QACvC,SAAW,EAAA,cAAA;AAAA,QACX,MAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAIA,IAAAA,eAAAA,CAAe,SAAS,OAAS,EAAA;AACnC,QAAA,MAAMA,eAAe,CAAA,KAAA;AAAA;AAGvB,MAAA,UAAA,GAAaA,eAAe,CAAA,UAAA;AAC5B,MAAO,MAAA,CAAA,cAAA,GAAiB,KAAK,GAAI,EAAA;AAAA,KACnC;AAAA,IACA,eAAe,MAAQ,EAAA;AACrB,MAAiB,cAAA,GAAA,MAAA;AAAA,KACnB;AAAA,IAEA,MAAM,UAAa,GAAA;AACjB,MAAO,MAAA,CAAA,UAAA,GAAa,KAAK,GAAI,EAAA;AAC7B,MAAI,IAAA,WAAA,CAAY,WAAW,mBAAqB,EAAA;AAC9C,QAAA,WAAA,CAAY,OAAQ,CAAA;AAAA,UAClB,IAAM,EAAA,aAAA;AAAA,UACN,IAAM,EAAA;AAAA,YACJ,OAAO,KAAM,CAAA,IAAA,CAAK,mBAAoB,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,YACnD,KAAO,EAAA;AAAA;AACT,SACD,CAAA;AAAA;AACH,KACF;AAAA,IAEA,MAAM,WAAc,GAAA;AAClB,MAAO,MAAA,CAAA,WAAA,GAAc,KAAK,GAAI,EAAA;AAAA,KAChC;AAAA,IAGA,MAAM,WAAYC,CAAAA,QAAAA,EAAS,MAAQ,EAAA;AACjC,MAAI,IAAA;AACF,QAAA,MAAM,iBAAiB,iBAAyB,CAAA;AAAA,UAC9C,MAAA;AAAA,UACA,YAAY,WAAY,CAAA;AAAA,SACzB,CAAA;AACD,QAAA,IAAI,EAAE,QAAA,IAAY,cAAe,CAAA,qBAAqB,CAAI,CAAA,EAAA;AACxD,UAAM,MAAA,IAAI,MAAM,2BAA2B,CAAA;AAAA;AAG7C,QAAA,cAAA,GAAiB,IAAK,CAAA,KAAA;AAAA,UACpB,cAAA,CAAe,qBAAqB,CAAE,CAAA;AAAA,SACxC;AAEA,QAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,UAAM,MAAA,IAAI,MAAM,iCAAiC,CAAA;AAAA;AAGnD,QAAM,MAAA,oBAAA,GAAuB,MAAM,WAAY,CAAA;AAAA,UAC7C,MAAM,WAAY,CAAA,WAAA;AAAA,UAClB,MAAQ,EAAA,IAAA;AAAA,YACN,YAAY,KAAM,CAAA,MAAA;AAAA,YAClB,YAAY,KAAM,CAAA,MAAA;AAAA,YAClB,WAAY,CAAA;AAAA,WACd;AAAA,UACA,WAAa,EAAA;AAAA,SACd,CAAA;AACD,QAAI,IAAA,oBAAA,CAAqB,SAAS,OAAS,EAAA;AACzC,UAAA,MAAM,oBAAqB,CAAA,KAAA;AAAA;AAE7B,QAAA,MAAM,iBAAiB,oBAAqB,CAAA,QAAA;AAE5C,QAAA,WAAA,GAAc,MAAM,iBAAA;AAAA,UAClB;AAAA,YACE,UAAA;AAAA,YACA,WAAA;AAAA,YACA,cAAA,EAAgB,kBAAkB,EAAC;AAAA,YACnC,cAAA,EAAgB,mBAAqB,EAAA,cAAA,IAAkB,EAAC;AAAA,YACxD,cAAA,EAAgB,kBAAkB;AAAC,WACrC;AAAA,UACA;AAAA,SACF;AAGA,QAAM,MAAA,cAAA,uBAAqB,GAAI,EAAA;AAG/B,QAAA,MAAM,eAAkB,GAAA,kBAAA;AAAA,UACtB,mBAAA,EAAqB,kBAAkB,EAAC;AAAA,UACxC,YAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAM,MAAA,SAAA,uBAAyC,GAAI,EAAA;AAEnD,QAAW,KAAA,MAAA,CAAC,GAAK,EAAA,EAAE,IAAM,EAAA,KAAA,EAAO,CAAK,IAAA,mBAAA,EAAqB,MACxD,IAAA,EAAI,EAAA;AACJ,UAAA,MAAM,SAAY,GAAA,kBAAA;AAAA,YAChB,cAAA;AAAA,YACA,KAAQ,GAAA,CAAC,IAAM,EAAA,KAAK,CAAI,GAAA,IAAA;AAAA,YACxB;AAAA,WACF;AAGA,UAAM,MAAA,UAAA,uBAA0C,GAAI,EAAA;AAGpD,UAAA,IAAI,MAAO,CAAA,IAAA,CAAK,eAAe,CAAA,CAAE,SAAS,CAAG,EAAA;AAC3C,YAAA,KAAA,MAAW,GAAG,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,eAAe,CAAG,EAAA;AACvD,cAAA,MAAM,UAAa,GAAA,MAAM,WAAY,CAAA,KAAA,GAAQ,SAAS,CAAE,CAAA,IAAA;AAAA,gBACtD,CAAC,CAAA,KAAM,MAAO,CAAA,CAAA,CAAE,OAAO;AAAA,eACzB;AACA,cAAA,IAAI,eAAe,WAAa,EAAA;AAC9B,gBAAA,MAAM,IAAI,KAAA,CAAM,CAAgC,6BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAEzD,cAAA,IAAI,UAAY,EAAA;AACd,gBAAU,SAAA,CAAA,GAAA;AAAA,kBACR,KAAA;AAAA,kBACA,cAAe,CAAA;AAAA,oBACb,EAAI,EAAA,KAAA;AAAA,oBACJ,IAAM,EAAA,UAAA;AAAA,oBACN,KAAK,WAAY,CAAA,GAAA;AAAA,oBACjB,eAAe,WAAY,CAAA,aAAA;AAAA,oBAC3B,gBAAgB,WAAY,CAAA,cAAA;AAAA,oBAC5B,gBAAgB,WAAY,CAAA,cAAA;AAAA,oBAC5B,aAAa,WAAY,CAAA;AAAA,mBAC1B;AAAA,iBACH;AAAA;AACF;AACF;AAIF,UAAA,KAAA,MAAW,GAAG,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACjD,YAAA,MAAM,EAAE,OAAA,EAAS,UAAW,EAAA,GAAI,MAAM,WAAA;AAAA,cACpC,KAAQ,GAAA;AAAA,aACV;AACA,YAAI,IAAA,OAAO,eAAe,QAAU,EAAA;AAClC,cAAA;AAAA;AAEF,YAAA,IAAI,UAAY,EAAA;AACd,cAAW,UAAA,CAAA,GAAA;AAAA,gBACT,KAAA;AAAA,gBACA,cAAe,CAAA;AAAA,kBACb,EAAI,EAAA,KAAA;AAAA,kBACJ,IAAM,EAAA,UAAA;AAAA,kBACN,KAAK,WAAY,CAAA,GAAA;AAAA,kBACjB,eAAe,WAAY,CAAA,aAAA;AAAA,kBAC3B,gBAAgB,WAAY,CAAA,cAAA;AAAA,kBAC5B,gBAAgB,WAAY,CAAA,cAAA;AAAA,kBAC5B,aAAa,WAAY,CAAA;AAAA,iBAC1B;AAAA,eACH;AAAA;AACF;AAEF,UAAe,cAAA,CAAA,GAAA,CAAI,KAAK,UAAU,CAAA;AAAA;AAGpC,QAAA,IAAI,YAAY,OAAS,EAAA;AACvB,UAAA,WAAA,CAAY,OAAQ,CAAA;AAAA,YAClB,IAAM,EAAA,mBAAA;AAAA,YACN,IAAM,EAAA;AAAA,cACJ,KAAA,EAAO,MAAM,IAAK,CAAA,mBAAA,EAAqB,OAAO,IAAK,EAAA,IAAK,EAAE,CAAA;AAAA,cAC1D,OAAAA,EAAAA,QAAAA;AAAA,cACA,MAAA;AAAA,cACA,QAAU,EAAA;AAAA;AACZ,WACD,CAAA;AAAA;AAEH,QAAM,MAAA,cAAA,GAAiB,mBAAqB,EAAA,cAAA,IAAkB,EAAC;AAC/D,QAAM,MAAA,SAAA,GAAY,cAAiB,GAAA,YAAY,CAAG,EAAA,IAAA;AAClD,QAAA,MAAM,qBAAwB,GAAA;AAAA,UAC5B,GAAG,WAAY,CAAA,qBAAA;AAAA,UACf,gBAAkB,EAAA;AAAA,YAChB,GAAI,SACA,GAAA;AAAA,cACE,WAAA,CAAY,aAAkB,KAAA,EAAA,GAC1B,IAAI,GAAA;AAAA,gBACF,IAAA,CAAK,WAAY,CAAA,cAAA,EAAgB,SAAS,CAAA;AAAA,gBAC1C,WAAY,CAAA;AAAA,eACZ,CAAA,IAAA,GACF,IAAK,CAAA,WAAA,CAAY,gBAAgB,SAAS;AAAA,gBAEhD,EAAC;AAAA,YACL,GAAI,WAAA,CAAY,qBAAuB,EAAA,gBAAA,IAAoB;AAAC;AAC9D,SACF;AACA,QAAA,WAAA,CAAY,qBAAwB,GAAA,qBAAA;AACpC,QAAA,MAAM,qBAAwB,GAAA,iBAAA;AAAA,UAC5B,WAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,CAAC,MAAQ,EAAA;AACX,UAAA,MAAM,aAAgB,GAAA,OAAO,cAAe,CAAA,SAAA,KAAc,WAAW,cAAe,CAAA,SAAA,GAAY,KAAM,CAAA,OAAA,CAAQ,eAAe,SAAS,CAAA,GAAI,cAAe,CAAA,SAAA,CAAU,CAAC,CAAI,GAAA,OAAA;AACxK,UAAM,MAAA,YAAA,GAAe,MAAM,YAAa,CAAA;AAAA,YACtC,aAAa,WAAY,CAAA,WAAA;AAAA,YACzB,YAAY,WAAY,CAAA,cAAA;AAAA,YACxB,gBAAkB,EAAA,cAAA;AAAA,YAClB,gBAAkB,EAAA,cAAA;AAAA,YAClB,SAAW,EAAA,aAAA;AAAA,YACX,UAAY,EAAA;AAAA,cACV,cAAA,EAAgB,wBAAwB,cAAc,CAAA;AAAA,cACtD,WAAa,EAAA;AAAA,gBACX,GAAG;AAAA;AACL;AACF,WACD,CAAA;AACD,UAAI,IAAA,YAAA,CAAa,SAAS,OAAS,EAAA;AACjC,YAAA,MAAM,YAAa,CAAA,KAAA;AAAA,WACrB,MAAA,IAAW,YAAa,CAAA,IAAA,KAAS,MAAQ,EAAA;AACvC,YAAA,IAAA,CAAK,YAAY,MAAO,CAAA,IAAA;AAAA,cACtB;AAAA,aACF;AACA,YAAA;AAAA,WACK,MAAA;AACL,YAAA,MAAA,GAAS,YAAa,CAAA,MAAA;AAAA;AACxB;AAGF,QAAA,MAAM,EAAE,OAAA,EAAS,GAAG,cAAA,EAAmB,GAAA,WAAA;AACvC,QAAA,MAAM,oBAAuB,GAAA,WAAA;AAAA,UAC3B,mBAAA;AAAA,UACA;AAAA,YACE,GAAG,cAAA;AAAA,YACH,MAAQ,EAAA,WAAA;AAAA,YACR,MAAA;AAAA,YACA,QAAQ,YAAa,EAAA;AAAA,YACrB,OAAA,EAAS,OAAO,KAAuB,KAAA;AACrC,cAAA,IAAI,YAAY,OAAS,EAAA;AACvB,gBAAA,WAAA,CAAY,QAAQ,KAAK,CAAA;AAAA;AAG3B,cAAI,IAAA,KAAA,CAAM,SAAS,YAAc,EAAA;AAC/B,gBAAM,MAAA,KAAA,CAAM,KAAK,UAAW,EAAA;AAAA;AAC9B,aACF;AAAA,YACA,qBAAA;AAAA,YACA,QAAA,EAAU,kBAAkB,EAAC;AAAA,YAC7B,KAAO,EAAA;AAAA,cACL,cAAA,EAAgB,YAAY,KAAM,CAAA,cAAA;AAAA,cAClC,aAAA,EAAe,YAAY,KAAM,CAAA,aAAA;AAAA,cACjC,MAAA,EAAQ,YAAY,KAAM,CAAA,MAAA;AAAA,cAC1B,KAAA,EAAO,YAAY,KAAM,CAAA,KAAA;AAAA,cACzB,MAAA,EAAQ,YAAY,KAAM,CAAA,MAAA;AAAA,cAC1B,MAAA,EAAQ,YAAY,KAAM,CAAA,MAAA;AAAA,cAC1B,MAAA,EAAQ,YAAY,KAAM,CAAA;AAAA,aAC5B;AAAA,YACA;AAAA,WACF;AAAA,UACA;AAAA,SACF;AAGA,QAAI,IAAA,WAAA;AACJ,QAAA,WAAA,MAAiB,UAAU,oBAAsB,EAAA;AAC/C,UAAI,IAAA,MAAA,CAAO,SAAS,OAAS,EAAA;AAC3B,YAAA,MAAM,MAAO,CAAA,KAAA;AAAA;AAEf,UAAc,WAAA,GAAA,MAAA;AAAA;AAGhB,QAAA,IAAI,CAAC,WAAa,EAAA;AAChB,UAAM,MAAA,IAAI,MAAM,2BAA2B,CAAA;AAAA;AAE7C,QAAY,WAAA,CAAA,aAAA,CAAc,WAAW,IAAK,CAAA,KAAA;AAAA,UACxC,WAAY,CAAA,GAAA,EAAQ,GAAA,WAAA,CAAY,aAAc,CAAA;AAAA,SAChD;AAEA,QAAA,IAAA,CAAK,YAAY,MAAO,CAAA,IAAA;AAAA,UACtB,YAAY,WAAY,CAAA,eAAA,CAAgB,IAAI,CAAqB,kBAAA,EAAA,WAAA,CAAY,cAAc,QAAQ,CAAA,EAAA;AAAA,SACrG;AAGA,QAAA,MAAA,CAAO,SAAS,IAAK,CAAA,GAAA,EAAS,IAAA,MAAA,CAAO,eAAe,MAAO,CAAA,KAAA,CAAA;AAAA,eACpD,KAAO,EAAA;AACd,QAAM,MAAA,KAAA;AAAA;AAIR,MAAI,IAAA;AACF,QAAA,MAAA,CAAO,YAAY,EAAE,IAAA,EAAM,UAAY,EAAA,EAAA,EAAI,KAAK,CAAA;AAChD,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AAC3C,UAAM,MAAA,eAAA,GAAkB,CAAC,GAAa,KAAA;AACpC,YAAI,IAAA,GAAA,CAAI,SAAS,mBAAqB,EAAA;AACpC,cAAO,MAAA,CAAA,cAAA,CAAe,WAAW,eAAe,CAAA;AAChD,cAAA,MAAA,CACG,WACA,CAAA,IAAA;AAAA,gBAAK,CAAC,IAAA,KACL,IAAS,KAAA,CAAA,GACL,OAAQ,EAAA,GACR,MAAO,CAAA,IAAI,KAAM,CAAA,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAE,CAAC;AAAA,eAC7D,CACC,MAAM,MAAM,CAAA;AAAA;AACjB,WACF;AACA,UAAO,MAAA,CAAA,EAAA,CAAG,WAAW,eAAe,CAAA;AAAA,SACrC,CAAA;AAAA,eACM,KAAO,EAAA;AACd,QAAM,MAAA,KAAA;AAAA;AACR;AACF,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderPage.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/renderPage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK1E,wBAAuB,UAAU,CAC/B,cAAc,EAAE,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAC1E,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,CA6IjD"}
1
+ {"version":3,"file":"renderPage.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/renderPage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK1E,wBAAuB,UAAU,CAC/B,cAAc,EAAE,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAC1E,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,CA4IjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"renderPage.js","sources":["../../../plugin/react-static/renderPage.ts"],"sourcesContent":["import { createRenderMetrics } from \"../helpers/metrics.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport type { CreateHandlerOptions, RenderPageResult } from \"../types.js\";\nimport { renderStreams } from \"./renderStreams.js\";\nimport { collectHtmlWorkerContent } from \"./collectHtmlWorkerContent.js\";\nimport { collectRscContent } from \"./collectRscContent.js\";\n\nexport async function* renderPage(\n handlerOptions: CreateHandlerOptions<unknown, React.ComponentType<unknown>>\n): AsyncGenerator<RenderPageResult, void, unknown> {\n if (!handlerOptions.pagePath) {\n yield {\n type: \"skip\",\n };\n return;\n }\n\n try {\n const metrics = createRenderMetrics(handlerOptions.route);\n\n const pageAndPropsResult = await resolvePageAndProps(handlerOptions);\n\n if (pageAndPropsResult.type === \"error\") {\n yield {\n type: \"error\",\n error: pageAndPropsResult.error,\n };\n return;\n }\n\n if (pageAndPropsResult.type === \"skip\") {\n yield {\n type: \"skip\",\n };\n return;\n }\n\n const { PageComponent, pageProps } = pageAndPropsResult;\n\n const newHandlerOptions = {\n ...handlerOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n } satisfies CreateHandlerOptions;\n // Create streams with CSS files\n const [rscFull, rscHeadless] = await renderStreams(newHandlerOptions);\n\n // Handle stream creation errors\n if (rscFull.type !== \"success\") {\n yield {\n type: \"error\",\n error: new Error(\n rscFull.type === \"error\"\n ? `Failed to create RSC full stream: ${\n rscFull.error instanceof Error\n ? rscFull.error.message\n : String(rscFull.error)\n }`\n : \"RSC full stream creation was skipped\"\n ),\n };\n return;\n }\n\n if (!rscFull.stream) {\n yield {\n type: \"error\",\n error: new Error(\"RSC full stream is undefined\"),\n };\n return;\n }\n\n if (rscHeadless.type !== \"success\") {\n yield {\n type: \"error\",\n error: new Error(\n rscHeadless.type === \"error\"\n ? `Failed to create RSC headless stream: ${\n rscHeadless.error instanceof Error\n ? rscHeadless.error.message\n : String(rscHeadless.error)\n }`\n : \"RSC headless stream creation was skipped\"\n ),\n };\n return;\n }\n\n if (!rscHeadless.stream) {\n yield {\n type: \"error\",\n error: new Error(\"RSC headless stream is undefined\"),\n };\n return;\n }\n\n // Collect HTML and RSC content\n const [\n { stream: rscStream, metrics: rscMetrics },\n { stream: htmlStream, metrics: htmlMetrics },\n ] = await Promise.all([\n collectRscContent(rscHeadless.stream, handlerOptions),\n collectHtmlWorkerContent(rscFull.stream, handlerOptions),\n ]);\n\n // Update metrics\n metrics.htmlSizes.set(handlerOptions.route, htmlMetrics.bytes);\n metrics.rscSizes.set(handlerOptions.route, rscMetrics.bytes);\n metrics.htmlSize = htmlMetrics.bytes;\n metrics.rscSize = rscMetrics.bytes;\n\n // Combine metrics from both streams\n metrics.streamMetrics = {\n ...htmlMetrics,\n chunks: Math.max(htmlMetrics.chunks, rscMetrics.chunks),\n bytes: Math.max(htmlMetrics.bytes, rscMetrics.bytes),\n duration: Math.max(htmlMetrics.duration, rscMetrics.duration),\n startTime: Math.min(htmlMetrics.startTime, rscMetrics.startTime),\n };\n\n metrics.processingTime = metrics.streamMetrics.duration;\n metrics.chunks = metrics.streamMetrics.chunks;\n metrics.chunkRate =\n metrics.streamMetrics.chunks / (metrics.processingTime / 1000);\n\n // Emit metrics via callback\n if (handlerOptions.onMetrics) {\n handlerOptions.onMetrics(metrics);\n }\n\n yield {\n type: \"success\",\n html: htmlStream,\n rsc: rscStream,\n metrics: {\n rscFull: htmlMetrics,\n rscHeadless: rscMetrics,\n },\n } as const;\n } catch (err) {\n yield {\n type: \"error\",\n error:\n err instanceof Error\n ? err\n : typeof err === \"string\"\n ? new Error(err)\n : (err as Error),\n };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderPage.js","sources":["../../../plugin/react-static/renderPage.ts"],"sourcesContent":["import { createRenderMetrics } from \"../helpers/metrics.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport type { CreateHandlerOptions, RenderPageResult } from \"../types.js\";\nimport { renderStreams } from \"./renderStreams.js\";\nimport { collectHtmlWorkerContent } from \"./collectHtmlWorkerContent.js\";\nimport { collectRscContent } from \"./collectRscContent.js\";\n\nexport async function* renderPage(\n handlerOptions: CreateHandlerOptions<unknown, React.ComponentType<unknown>>\n): AsyncGenerator<RenderPageResult, void, unknown> {\n if (!handlerOptions.pagePath) {\n yield {\n type: \"skip\",\n };\n return;\n }\n\n try {\n const metrics = createRenderMetrics(handlerOptions.route);\n\n const pageAndPropsResult = await resolvePageAndProps(handlerOptions);\n\n if (pageAndPropsResult.type === \"error\") {\n yield {\n type: \"error\",\n error: pageAndPropsResult.error,\n };\n return;\n }\n\n if (pageAndPropsResult.type === \"skip\") {\n yield {\n type: \"skip\",\n };\n return;\n }\n\n const { PageComponent, pageProps } = pageAndPropsResult;\n\n const newHandlerOptions = {\n ...handlerOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n } satisfies CreateHandlerOptions;\n // Create streams with CSS files\n const [rscFull, rscHeadless] = await renderStreams(newHandlerOptions);\n // Handle stream creation errors\n if (rscFull.type !== \"success\") {\n yield {\n type: \"error\",\n error: new Error(\n rscFull.type === \"error\"\n ? `Failed to create RSC full stream: ${\n rscFull.error instanceof Error\n ? rscFull.error.message\n : String(rscFull.error)\n }`\n : \"RSC full stream creation was skipped\"\n ),\n };\n return;\n }\n\n if (!rscFull.stream) {\n yield {\n type: \"error\",\n error: new Error(\"RSC full stream is undefined\"),\n };\n return;\n }\n\n if (rscHeadless.type !== \"success\") {\n yield {\n type: \"error\",\n error: new Error(\n rscHeadless.type === \"error\"\n ? `Failed to create RSC headless stream: ${\n rscHeadless.error instanceof Error\n ? rscHeadless.error.message\n : String(rscHeadless.error)\n }`\n : \"RSC headless stream creation was skipped\"\n ),\n };\n return;\n }\n\n if (!rscHeadless.stream) {\n yield {\n type: \"error\",\n error: new Error(\"RSC headless stream is undefined\"),\n };\n return;\n }\n\n // Collect HTML and RSC content\n const [\n { stream: rscStream, metrics: rscMetrics },\n { stream: htmlStream, metrics: htmlMetrics },\n ] = await Promise.all([\n collectRscContent(rscHeadless.stream, handlerOptions),\n collectHtmlWorkerContent(rscFull.stream, handlerOptions),\n ]);\n\n // Update metrics\n metrics.htmlSizes.set(handlerOptions.route, htmlMetrics.bytes);\n metrics.rscSizes.set(handlerOptions.route, rscMetrics.bytes);\n metrics.htmlSize = htmlMetrics.bytes;\n metrics.rscSize = rscMetrics.bytes;\n\n // Combine metrics from both streams\n metrics.streamMetrics = {\n ...htmlMetrics,\n chunks: Math.max(htmlMetrics.chunks, rscMetrics.chunks),\n bytes: Math.max(htmlMetrics.bytes, rscMetrics.bytes),\n duration: Math.max(htmlMetrics.duration, rscMetrics.duration),\n startTime: Math.min(htmlMetrics.startTime, rscMetrics.startTime),\n };\n\n metrics.processingTime = metrics.streamMetrics.duration;\n metrics.chunks = metrics.streamMetrics.chunks;\n metrics.chunkRate =\n metrics.streamMetrics.chunks / (metrics.processingTime / 1000);\n\n // Emit metrics via callback\n if (handlerOptions.onMetrics) {\n handlerOptions.onMetrics(metrics);\n }\n\n yield {\n type: \"success\",\n html: htmlStream,\n rsc: rscStream,\n metrics: {\n rscFull: htmlMetrics,\n rscHeadless: rscMetrics,\n },\n } as const;\n } catch (err) {\n yield {\n type: \"error\",\n error:\n err instanceof Error\n ? err\n : typeof err === \"string\"\n ? new Error(err)\n : (err as Error),\n };\n }\n}\n"],"names":[],"mappings":"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"}