vite-plugin-react-server 1.1.18 → 1.1.20

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 (71) hide show
  1. package/README.md +7 -3
  2. package/dist/package.json +1 -1
  3. package/dist/plugin/config/defaults.d.ts +1 -1
  4. package/dist/plugin/config/defaults.d.ts.map +1 -1
  5. package/dist/plugin/config/defaults.js +2 -2
  6. package/dist/plugin/config/defaults.js.map +1 -1
  7. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  8. package/dist/plugin/config/resolveOptions.js +4 -4
  9. package/dist/plugin/config/resolveOptions.js.map +1 -1
  10. package/dist/plugin/helpers/handleServerAction.d.ts +34 -0
  11. package/dist/plugin/helpers/handleServerAction.d.ts.map +1 -0
  12. package/dist/plugin/helpers/handleServerAction.js +48 -0
  13. package/dist/plugin/helpers/handleServerAction.js.map +1 -0
  14. package/dist/plugin/loader/handleExports.d.ts +16 -10
  15. package/dist/plugin/loader/handleExports.d.ts.map +1 -1
  16. package/dist/plugin/loader/handleExports.js +32 -16
  17. package/dist/plugin/loader/handleExports.js.map +1 -1
  18. package/dist/plugin/loader/transformModuleIfNeeded.d.ts.map +1 -1
  19. package/dist/plugin/loader/transformModuleIfNeeded.js +22 -11
  20. package/dist/plugin/loader/transformModuleIfNeeded.js.map +1 -1
  21. package/dist/plugin/loader/transformModuleWithPreservedFunctions.d.ts +21 -0
  22. package/dist/plugin/loader/transformModuleWithPreservedFunctions.d.ts.map +1 -1
  23. package/dist/plugin/loader/transformModuleWithPreservedFunctions.js +395 -73
  24. package/dist/plugin/loader/transformModuleWithPreservedFunctions.js.map +1 -1
  25. package/dist/plugin/loader/types.d.ts +9 -3
  26. package/dist/plugin/loader/types.d.ts.map +1 -1
  27. package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts.map +1 -1
  28. package/dist/plugin/react-client/configureWorkerRequestHandler.js +12 -69
  29. package/dist/plugin/react-client/configureWorkerRequestHandler.js.map +1 -1
  30. package/dist/plugin/react-client/handleWorkerServerAction.d.ts +12 -0
  31. package/dist/plugin/react-client/handleWorkerServerAction.d.ts.map +1 -0
  32. package/dist/plugin/react-client/handleWorkerServerAction.js +47 -0
  33. package/dist/plugin/react-client/handleWorkerServerAction.js.map +1 -0
  34. package/dist/plugin/react-server/configureReactServer.js.map +1 -1
  35. package/dist/plugin/react-server/handleServerAction.d.ts +1 -1
  36. package/dist/plugin/react-server/handleServerAction.d.ts.map +1 -1
  37. package/dist/plugin/react-server/handleServerAction.js +42 -6
  38. package/dist/plugin/react-server/handleServerAction.js.map +1 -1
  39. package/dist/plugin/react-server/plugin.js +2 -2
  40. package/dist/plugin/react-server/plugin.js.map +1 -1
  41. package/dist/plugin/react-static/plugin.d.ts.map +1 -1
  42. package/dist/plugin/react-static/plugin.js +10 -2
  43. package/dist/plugin/react-static/plugin.js.map +1 -1
  44. package/dist/plugin/source-map/createMappingsSerializer.js +128 -157
  45. package/dist/plugin/source-map/createMappingsSerializer.js.map +1 -0
  46. package/dist/plugin/types.d.ts +5 -7
  47. package/dist/plugin/types.d.ts.map +1 -1
  48. package/dist/plugin/vendor/types.js +1 -0
  49. package/dist/plugin/worker/rsc/handleRender.d.ts.map +1 -1
  50. package/dist/plugin/worker/rsc/handleRender.js +0 -1
  51. package/dist/plugin/worker/rsc/handleRender.js.map +1 -1
  52. package/dist/plugin/worker/rsc/handlers.js.map +1 -1
  53. package/dist/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +1 -1
  55. package/plugin/config/defaults.tsx +5 -2
  56. package/plugin/config/resolveOptions.ts +9 -10
  57. package/plugin/helpers/handleServerAction.ts +79 -0
  58. package/plugin/loader/handleExports.ts +50 -40
  59. package/plugin/loader/transformModuleIfNeeded.ts +50 -15
  60. package/plugin/loader/transformModuleWithPreservedFunctions.ts +494 -127
  61. package/plugin/loader/types.ts +12 -4
  62. package/plugin/react-client/configureWorkerRequestHandler.ts +11 -87
  63. package/plugin/react-client/handleWorkerServerAction.ts +74 -0
  64. package/plugin/react-server/configureReactServer.ts +1 -1
  65. package/plugin/react-server/handleServerAction.ts +49 -12
  66. package/plugin/react-server/plugin.ts +2 -2
  67. package/plugin/react-static/plugin.ts +10 -2
  68. package/plugin/types.ts +6 -7
  69. package/plugin/vendor/types.ts +1 -0
  70. package/plugin/worker/rsc/handleRender.ts +0 -2
  71. package/plugin/worker/rsc/handlers.ts +3 -3
@@ -10,8 +10,8 @@ import { performance } from 'node:perf_hooks';
10
10
  import { restartWorker } from './restartWorker.js';
11
11
  import { handleWorkerRscStream } from './handleWorkerRscStream.js';
12
12
  import { getRouteFiles } from '../helpers/getRouteFiles.js';
13
- import { PassThrough, Readable } from 'node:stream';
14
- import { logError, toError } from '../error/toError.js';
13
+ import { Readable } from 'node:stream';
14
+ import { handleWorkerServerAction } from './handleWorkerServerAction.js';
15
15
 
16
16
  async function configureWorkerRequestHandler({
17
17
  server,
@@ -61,75 +61,18 @@ async function configureWorkerRequestHandler({
61
61
  autoDiscoveredFiles
62
62
  );
63
63
  if (info.isServerActionRequest) {
64
- try {
65
- const chunks = [];
66
- for await (const chunk of req) {
67
- chunks.push(chunk);
68
- }
69
- const body = Buffer.concat(chunks).toString();
70
- const parsed = JSON.parse(body);
71
- let id;
72
- let args;
73
- if (Array.isArray(parsed)) {
74
- args = parsed;
75
- id = req.url?.split("?")[0] ?? "";
76
- } else if (parsed && typeof parsed === "object" && "id" in parsed) {
77
- id = parsed.id;
78
- args = parsed.args ?? [];
79
- } else {
80
- throw new Error("Invalid server action request format");
81
- }
82
- res.setHeader("Content-Type", "text/x-component; charset=utf-8");
83
- res.setHeader("Transfer-Encoding", "chunked");
84
- res.setHeader("Connection", "keep-alive");
85
- if (!currentWorker) {
86
- currentWorker = await restartWorker({
87
- server,
88
- autoDiscoveredFiles,
89
- userOptions: serializedUserOptions,
90
- hmrChannel
91
- });
92
- }
93
- currentWorker.postMessage({
94
- type: "SERVER_ACTION",
95
- id,
96
- args
97
- });
98
- const passThrough = new PassThrough();
99
- passThrough.pipe(res);
100
- const messageHandler = (message) => {
101
- if (message.type === "RSC_CHUNK") {
102
- passThrough.write(message.chunk);
103
- } else if (message.type === "RSC_END") {
104
- passThrough.end();
105
- currentWorker.removeListener("message", messageHandler);
106
- } else if (message.type === "ERROR") {
107
- passThrough.end();
108
- currentWorker.removeListener("message", messageHandler);
109
- logError(message.error, server.config.logger);
110
- }
111
- };
112
- currentWorker.on("message", messageHandler);
113
- passThrough.on("error", (error) => {
114
- logError(error, server.config.logger);
115
- res.end();
64
+ if (!currentWorker) {
65
+ currentWorker = await restartWorker({
66
+ server,
67
+ autoDiscoveredFiles,
68
+ userOptions: serializedUserOptions,
69
+ hmrChannel
116
70
  });
117
- return;
118
- } catch (error) {
119
- const err = toError(error);
120
- logError(err, server.config.logger);
121
- res.statusCode = 500;
122
- res.end(
123
- JSON.stringify({
124
- type: "server-action-response",
125
- returnValue: {
126
- success: false,
127
- error: err.message
128
- }
129
- })
130
- );
131
- return;
132
71
  }
72
+ if (!currentWorker) {
73
+ throw new Error("Failed to start worker");
74
+ }
75
+ return handleWorkerServerAction(req, res, currentWorker, server.config.logger);
133
76
  }
134
77
  if (!info.isRscRequest) {
135
78
  return next();
@@ -1 +1 @@
1
- {"version":3,"file":"configureWorkerRequestHandler.js","sources":["../../../plugin/react-client/configureWorkerRequestHandler.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n RenderMetrics,\n RequestHandler,\n ResolvedUserOptions,\n StreamMetrics,\n} from \"../types.js\";\nimport { MessageChannel, type Worker } from \"node:worker_threads\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { restartWorker } from \"./restartWorker.js\";\nimport { handleWorkerRscStream } from \"./handleWorkerRscStream.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport type { RscWorkerInputMessage } from \"../worker/types.js\";\nimport { Readable } from \"node:stream\";\nimport type { ReadableStream } from \"node:stream/web\";\nimport { PassThrough } from \"node:stream\";\nimport { logError, toError } from \"../error/toError.js\";\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 T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n onMetrics,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n hmrChannel: MessageChannel;\n onMetrics?: (metrics: RenderMetrics) => void;\n}) {\n let {\n // remove these\n projectRoot: _projectRoot,\n moduleBaseURL: _moduleBaseURL,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n });\n\n // Start the worker\n let currentWorker: Worker | null = null;\n const logger = server.config.logger;\n\n // Handle server restarts\n server.ws.on(\"restart\", async () => {\n logger.info(\"[react-client] Server restarting, shutting down worker...\");\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Did not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n currentWorker = null;\n }\n });\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url) return next();\n\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n // Serialize user options for worker\n const serializedUserOptions = serializedOptions<T, InlineCSS>(\n handlerOptions,\n autoDiscoveredFiles\n );\n\n // Handle server action requests\n if (info.isServerActionRequest) {\n try {\n // Read request body\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString();\n const parsed = JSON.parse(body);\n\n // Get action ID and args from the request body\n let id: string;\n let args: unknown[];\n if (Array.isArray(parsed)) {\n // Format 1: Direct args array\n args = parsed;\n id = req.url?.split(\"?\")[0] ?? \"\";\n } else if (parsed && typeof parsed === \"object\" && \"id\" in parsed) {\n // Format 2: Object with id and args\n id = parsed.id;\n args = parsed.args ?? [];\n } else {\n throw new Error(\"Invalid server action request format\");\n }\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\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n\n // Send server action request to worker\n currentWorker!.postMessage({\n type: \"SERVER_ACTION\",\n id,\n args,\n } satisfies RscWorkerInputMessage);\n\n // Create a pass-through stream for the response\n const passThrough = new PassThrough();\n passThrough.pipe(res);\n\n // Handle worker messages\n const messageHandler = (message: any) => {\n if (message.type === \"RSC_CHUNK\") {\n passThrough.write(message.chunk);\n } else if (message.type === \"RSC_END\") {\n passThrough.end();\n currentWorker!.removeListener(\"message\", messageHandler);\n } else if (message.type === \"ERROR\") {\n passThrough.end();\n currentWorker!.removeListener(\"message\", messageHandler);\n logError(message.error, server.config.logger);\n }\n };\n\n currentWorker!.on(\"message\", messageHandler);\n\n // Handle errors\n passThrough.on(\"error\", (error) => {\n logError(error, server.config.logger);\n res.end();\n });\n\n return;\n } catch (error) {\n const err = toError(error);\n logError(err, server.config.logger);\n res.statusCode = 500;\n res.end(\n JSON.stringify({\n type: \"server-action-response\",\n returnValue: {\n success: false,\n error: err.message,\n },\n })\n );\n return;\n }\n }\n\n // Handle RSC requests\n if (!info.isRscRequest) {\n return next();\n }\n\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n try {\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", info.contentType);\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n const userOnMetrics =\n typeof onMetrics === \"function\"\n ? (metrics: StreamMetrics) => {\n const elapsedTime = performance.now() - startTime;\n const formattedMetrics = {\n route: info.route,\n htmlSize: 0,\n rscSize: metrics.bytes,\n processingTime: elapsedTime,\n chunks: metrics.chunks,\n chunkRate: metrics.chunks / (elapsedTime / 1000),\n memoryUsage: process.memoryUsage(),\n streamMetrics: {\n ...metrics,\n duration: elapsedTime,\n },\n htmlSizes: new Map(),\n rscSizes: new Map([[info.route, metrics.bytes]]),\n } satisfies RenderMetrics;\n onMetrics(formattedMetrics);\n }\n : () => {};\n const startTime = performance.now();\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n const stream = handleWorkerRscStream({\n worker: currentWorker!,\n message: {\n ...serializedUserOptions,\n id: info.route,\n type: \"RSC_RENDER\",\n // we make the worker stream aware of the route, pagePath, propsPath\n route: info.route,\n pagePath: pagePath,\n propsPath: propsPath,\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 logger,\n handlers: {\n onMetrics: (id, metrics) => {\n metrics.route = id;\n userOnMetrics(metrics);\n },\n onHmrAccept: () => {\n // TODO: implement\n // console.log(\"onHmrAccept\", routes);\n },\n onHmrUpdate: () => {\n // TODO: implement\n // console.log(\"onHmrUpdate\", routes);\n },\n },\n verbose: handlerOptions.verbose,\n });\n\n // Pipe the stream to the response\n if (res.writable) {\n Readable.fromWeb(stream as unknown as ReadableStream).pipe(res);\n }\n // wait for timeout\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message + (error.stack ?? \"\"), {\n error,\n });\n }\n }\n let timeout: NodeJS.Timeout;\n try {\n await new Promise((reject) => {\n timeout = setTimeout(() => {\n clearTimeout(timeout);\n reject(new Error(\"RSC Render timeout\"));\n }, 5000);\n });\n } catch {\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Dit not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n }\n server.config.logger.error(\"RSC render timeout.\");\n clearTimeout(timeout!);\n res.end();\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // port check, should be handled by strictPort\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configureWorkerRequestHandler.js","sources":["../../../plugin/react-client/configureWorkerRequestHandler.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n RenderMetrics,\n RequestHandler,\n ResolvedUserOptions,\n StreamMetrics,\n} from \"../types.js\";\nimport { MessageChannel, type Worker } from \"node:worker_threads\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { restartWorker } from \"./restartWorker.js\";\nimport { handleWorkerRscStream } from \"./handleWorkerRscStream.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport type { RscWorkerInputMessage } from \"../worker/types.js\";\nimport { Readable } from \"node:stream\";\nimport type { ReadableStream } from \"node:stream/web\";\nimport { handleWorkerServerAction } from \"./handleWorkerServerAction.js\";\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 T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n onMetrics,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n hmrChannel: MessageChannel;\n onMetrics?: (metrics: RenderMetrics) => void;\n}) {\n let {\n // remove these\n projectRoot: _projectRoot,\n moduleBaseURL: _moduleBaseURL,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n });\n\n // Start the worker\n let currentWorker: Worker | null = null;\n const logger = server.config.logger;\n\n // Handle server restarts\n server.ws.on(\"restart\", async () => {\n logger.info(\"[react-client] Server restarting, shutting down worker...\");\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Did not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n currentWorker = null;\n }\n });\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url) return next();\n\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n // Serialize user options for worker\n const serializedUserOptions = serializedOptions<T, InlineCSS>(\n handlerOptions,\n autoDiscoveredFiles\n );\n\n // Handle server action requests\n if (info.isServerActionRequest) {\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n if (!currentWorker) {\n throw new Error(\"Failed to start worker\");\n }\n return handleWorkerServerAction(req, res, currentWorker, server.config.logger);\n }\n\n // Handle RSC requests\n if (!info.isRscRequest) {\n return next();\n }\n\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n try {\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", info.contentType);\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n const userOnMetrics =\n typeof onMetrics === \"function\"\n ? (metrics: StreamMetrics) => {\n const elapsedTime = performance.now() - startTime;\n const formattedMetrics = {\n route: info.route,\n htmlSize: 0,\n rscSize: metrics.bytes,\n processingTime: elapsedTime,\n chunks: metrics.chunks,\n chunkRate: metrics.chunks / (elapsedTime / 1000),\n memoryUsage: process.memoryUsage(),\n streamMetrics: {\n ...metrics,\n duration: elapsedTime,\n },\n htmlSizes: new Map(),\n rscSizes: new Map([[info.route, metrics.bytes]]),\n } satisfies RenderMetrics;\n onMetrics(formattedMetrics);\n }\n : () => {};\n const startTime = performance.now();\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n const stream = handleWorkerRscStream({\n worker: currentWorker!,\n message: {\n ...serializedUserOptions,\n id: info.route,\n type: \"RSC_RENDER\",\n // we make the worker stream aware of the route, pagePath, propsPath\n route: info.route,\n pagePath: pagePath,\n propsPath: propsPath,\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 logger,\n handlers: {\n onMetrics: (id, metrics) => {\n metrics.route = id;\n userOnMetrics(metrics);\n },\n onHmrAccept: () => {\n // TODO: implement\n // console.log(\"onHmrAccept\", routes);\n },\n onHmrUpdate: () => {\n // TODO: implement\n // console.log(\"onHmrUpdate\", routes);\n },\n },\n verbose: handlerOptions.verbose,\n });\n\n // Pipe the stream to the response\n if (res.writable) {\n Readable.fromWeb(stream as unknown as ReadableStream).pipe(res);\n }\n // wait for timeout\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message + (error.stack ?? \"\"), {\n error,\n });\n }\n }\n let timeout: NodeJS.Timeout;\n try {\n await new Promise((reject) => {\n timeout = setTimeout(() => {\n clearTimeout(timeout);\n reject(new Error(\"RSC Render timeout\"));\n }, 5000);\n });\n } catch {\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Dit not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n }\n server.config.logger.error(\"RSC render timeout.\");\n clearTimeout(timeout!);\n res.end();\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // port check, should be handled by strictPort\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ViteDevServer } from "vite";
2
+ import type { Worker } from "node:worker_threads";
3
+ /**
4
+ * Handles server action requests in the worker scenario.
5
+ *
6
+ * @param req - The incoming request
7
+ * @param res - The response object
8
+ * @param worker - The worker thread
9
+ * @param logger - The Vite logger
10
+ */
11
+ export declare function handleWorkerServerAction(req: any, res: any, worker: Worker, logger: ViteDevServer["config"]["logger"]): Promise<void>;
12
+ //# sourceMappingURL=handleWorkerServerAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleWorkerServerAction.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/handleWorkerServerAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAUlD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,iBAkD1C"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { logError } from '../error/toError.js';
7
+ import { parseServerActionRequest, setupServerActionHeaders, createServerActionStream, handleServerActionError } from '../helpers/handleServerAction.js';
8
+
9
+ async function handleWorkerServerAction(req, res, worker, logger) {
10
+ try {
11
+ const chunks = [];
12
+ for await (const chunk of req) {
13
+ chunks.push(chunk);
14
+ }
15
+ const body = Buffer.concat(chunks).toString();
16
+ const { id, args } = parseServerActionRequest(body, req.url);
17
+ setupServerActionHeaders(res);
18
+ worker.postMessage({
19
+ type: "SERVER_ACTION",
20
+ id,
21
+ args
22
+ });
23
+ const passThrough = createServerActionStream(res);
24
+ const messageHandler = (message) => {
25
+ if (message.type === "RSC_CHUNK") {
26
+ passThrough.write(message.chunk);
27
+ } else if (message.type === "RSC_END") {
28
+ passThrough.end();
29
+ worker.removeListener("message", messageHandler);
30
+ } else if (message.type === "ERROR") {
31
+ passThrough.end();
32
+ worker.removeListener("message", messageHandler);
33
+ logError(message.error, logger);
34
+ }
35
+ };
36
+ worker.on("message", messageHandler);
37
+ passThrough.on("error", (error) => {
38
+ logError(error, logger);
39
+ res.end();
40
+ });
41
+ } catch (error) {
42
+ handleServerActionError(error, res, logger);
43
+ }
44
+ }
45
+
46
+ export { handleWorkerServerAction };
47
+ //# sourceMappingURL=handleWorkerServerAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleWorkerServerAction.js","sources":["../../../plugin/react-client/handleWorkerServerAction.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type { Worker } from \"node:worker_threads\";\nimport type { RscWorkerInputMessage } from \"../worker/types.js\";\nimport { logError } from \"../error/toError.js\";\nimport {\n parseServerActionRequest,\n setupServerActionHeaders,\n createServerActionStream,\n handleServerActionError\n} from \"../helpers/handleServerAction.js\";\n\n/**\n * Handles server action requests in the worker scenario.\n * \n * @param req - The incoming request\n * @param res - The response object\n * @param worker - The worker thread\n * @param logger - The Vite logger\n */\nexport async function handleWorkerServerAction(\n req: any,\n res: any,\n worker: Worker,\n logger: ViteDevServer[\"config\"][\"logger\"]\n) {\n try {\n // Read request body\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString();\n\n // Parse the server action request\n const { id, args } = parseServerActionRequest(body, req.url);\n\n // Set up response headers\n setupServerActionHeaders(res);\n\n // Send server action request to worker\n worker.postMessage({\n type: \"SERVER_ACTION\",\n id,\n args,\n } satisfies RscWorkerInputMessage);\n\n // Create a pass-through stream for the response\n const passThrough = createServerActionStream(res);\n\n // Handle worker messages\n const messageHandler = (message: any) => {\n if (message.type === \"RSC_CHUNK\") {\n passThrough.write(message.chunk);\n } else if (message.type === \"RSC_END\") {\n passThrough.end();\n worker.removeListener(\"message\", messageHandler);\n } else if (message.type === \"ERROR\") {\n passThrough.end();\n worker.removeListener(\"message\", messageHandler);\n logError(message.error, logger);\n }\n };\n\n worker.on(\"message\", messageHandler);\n\n // Handle errors\n passThrough.on(\"error\", (error) => {\n logError(error, logger);\n res.end();\n });\n } catch (error) {\n handleServerActionError(error, res, logger);\n }\n} "],"names":[],"mappings":";;;;;;;;AAmBA,eAAsB,wBACpB,CAAA,GAAA,EACA,GACA,EAAA,MAAA,EACA,MACA,EAAA;AACA,EAAI,IAAA;AAEF,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,WAAA,MAAiB,SAAS,GAAK,EAAA;AAC7B,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA;AAEnB,IAAA,MAAM,IAAO,GAAA,MAAA,CAAO,MAAO,CAAA,MAAM,EAAE,QAAS,EAAA;AAG5C,IAAA,MAAM,EAAE,EAAI,EAAA,IAAA,KAAS,wBAAyB,CAAA,IAAA,EAAM,IAAI,GAAG,CAAA;AAG3D,IAAA,wBAAA,CAAyB,GAAG,CAAA;AAG5B,IAAA,MAAA,CAAO,WAAY,CAAA;AAAA,MACjB,IAAM,EAAA,eAAA;AAAA,MACN,EAAA;AAAA,MACA;AAAA,KAC+B,CAAA;AAGjC,IAAM,MAAA,WAAA,GAAc,yBAAyB,GAAG,CAAA;AAGhD,IAAM,MAAA,cAAA,GAAiB,CAAC,OAAiB,KAAA;AACvC,MAAI,IAAA,OAAA,CAAQ,SAAS,WAAa,EAAA;AAChC,QAAY,WAAA,CAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,OACjC,MAAA,IAAW,OAAQ,CAAA,IAAA,KAAS,SAAW,EAAA;AACrC,QAAA,WAAA,CAAY,GAAI,EAAA;AAChB,QAAO,MAAA,CAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AAAA,OACjD,MAAA,IAAW,OAAQ,CAAA,IAAA,KAAS,OAAS,EAAA;AACnC,QAAA,WAAA,CAAY,GAAI,EAAA;AAChB,QAAO,MAAA,CAAA,cAAA,CAAe,WAAW,cAAc,CAAA;AAC/C,QAAS,QAAA,CAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA;AAChC,KACF;AAEA,IAAO,MAAA,CAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AAGnC,IAAY,WAAA,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,KAAU,KAAA;AACjC,MAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AACtB,MAAA,GAAA,CAAI,GAAI,EAAA;AAAA,KACT,CAAA;AAAA,WACM,KAAO,EAAA;AACd,IAAwB,uBAAA,CAAA,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA;AAE9C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"configureReactServer.js","sources":["../../../plugin/react-server/configureReactServer.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n} 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\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport { logError } from \"../error/toError.js\";\nimport { handleServerAction } from \"./handleServerAction.js\";\n\nexport async function configureReactServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = {\n ...handlerUserOptions,\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n Html: React.Fragment,\n onEvent: createEventHandler(onEvent),\n css: handlerUserOptions.css\n };\n\n // Set environment-specific configuration\n const define = {\n ...server.config.define,\n \"process.env.NODE_ENV\": JSON.stringify(\n process.env[\"NODE_ENV\"] || \"development\"\n ),\n };\n server.config = {\n ...server.config,\n define,\n };\n\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n server.config.logger.info(\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; charset=utf-8\",\n \"Retry-After\": \"1\",\n });\n res.end(\n `0:E{\"digest\":\"\",\"name\":\"Error\",\"message\":\"Server restarting...\",\"stack\":\"\",\"env\":\"Server\"}`\n );\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n if (!req.url) {\n return next();\n }\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n\n // Handle server actions\n if (info.isServerActionRequest) {\n return handleServerAction(req, res, server, handlerOptions);\n }\n if (!info.isRscRequest) return next();\n try {\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n // first load the page and props\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route: info.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\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph, // by having loaded the page and props, we can get them from the module graph\n parentUrl: pagePath,\n handlerOptions: {\n pagePath,\n loader: server.ssrLoadModule,\n // explicitly set for development server\n ...handlerOptions,\n },\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly;\n const rscResult = 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 server,\n route: info.route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n // set headers\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n logError(error, server.config.logger);\n res.end();\n }\n });\n // Listen for when the server actually starts\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"configureReactServer.js","sources":["../../../plugin/react-server/configureReactServer.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n} 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\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport { logError } from \"../error/toError.js\";\nimport { handleServerAction } from \"./handleServerAction.js\";\n\nexport async function configureReactServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = {\n ...handlerUserOptions,\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n Html: React.Fragment,\n onEvent: createEventHandler(onEvent),\n css: handlerUserOptions.css\n } as ResolvedUserOptions<T, InlineCSS>;\n\n // Set environment-specific configuration\n const define = {\n ...server.config.define,\n \"process.env.NODE_ENV\": JSON.stringify(\n process.env[\"NODE_ENV\"] || \"development\"\n ),\n };\n server.config = {\n ...server.config,\n define,\n };\n\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n server.config.logger.info(\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; charset=utf-8\",\n \"Retry-After\": \"1\",\n });\n res.end(\n `0:E{\"digest\":\"\",\"name\":\"Error\",\"message\":\"Server restarting...\",\"stack\":\"\",\"env\":\"Server\"}`\n );\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n if (!req.url) {\n return next();\n }\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n\n // Handle server actions\n if (info.isServerActionRequest) {\n return handleServerAction(req, res, server, handlerOptions);\n }\n if (!info.isRscRequest) return next();\n try {\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n // first load the page and props\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route: info.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\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph, // by having loaded the page and props, we can get them from the module graph\n parentUrl: pagePath,\n handlerOptions: {\n pagePath,\n loader: server.ssrLoadModule,\n // explicitly set for development server\n ...handlerOptions,\n },\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly;\n const rscResult = 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 server,\n route: info.route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n // set headers\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n logError(error, server.config.logger);\n res.end();\n }\n });\n // Listen for when the server actually starts\n}\n"],"names":["React"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { ViteDevServer } from "vite";
2
2
  import type { InlineCssOpt, PagePropOpt, ResolvedUserOptions } from "../types.js";
3
3
  import type { IncomingMessage, ServerResponse } from "http";
4
- export declare function handleServerAction<T extends PagePropOpt, InlineCss extends InlineCssOpt>(req: IncomingMessage, res: ServerResponse, server: ViteDevServer, handlerOptions: ResolvedUserOptions<T, InlineCss>): Promise<void>;
4
+ export declare function handleServerAction<T extends PagePropOpt = PagePropOpt, InlineCss extends InlineCssOpt = InlineCssOpt>(req: IncomingMessage, res: ServerResponse, server: ViteDevServer, handlerOptions: ResolvedUserOptions<T, InlineCss>): Promise<void>;
5
5
  //# sourceMappingURL=handleServerAction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handleServerAction.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/handleServerAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE5D,wBAAsB,kBAAkB,CACtC,CAAC,SAAS,WAAW,EACrB,SAAS,SAAS,YAAY,EAE9B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,iBA4IlD"}
1
+ {"version":3,"file":"handleServerAction.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/handleServerAction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE5D,wBAAsB,kBAAkB,CACtC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAE7C,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,iBAiLlD"}
@@ -8,13 +8,13 @@ import { join } from 'path';
8
8
  import { ReactDOMServer } from '../vendor/vendor.server.js';
9
9
 
10
10
  async function handleServerAction(req, res, server, handlerOptions) {
11
+ let id = req.url?.split("?")[0] ?? "";
11
12
  try {
12
13
  if (handlerOptions.verbose) {
13
14
  server.config.logger.info(
14
15
  `[react-server] Handling server action request at ${req.url}`
15
16
  );
16
17
  }
17
- let id;
18
18
  let args;
19
19
  try {
20
20
  const chunks = [];
@@ -28,7 +28,6 @@ async function handleServerAction(req, res, server, handlerOptions) {
28
28
  const parsed = JSON.parse(body);
29
29
  if (Array.isArray(parsed)) {
30
30
  args = parsed;
31
- id = req.url?.split("?")[0] ?? "";
32
31
  if (handlerOptions.verbose) {
33
32
  server.config.logger.info(
34
33
  `[react-server] Using action ID from URL: ${id}`
@@ -41,9 +40,8 @@ async function handleServerAction(req, res, server, handlerOptions) {
41
40
  throw new Error("Invalid server action request format");
42
41
  }
43
42
  } catch (error) {
44
- const err = toError(error);
45
43
  throw new Error(`Failed to parse server action request`, {
46
- cause: err
44
+ cause: toError(error)
47
45
  });
48
46
  }
49
47
  if (!id) {
@@ -105,10 +103,12 @@ async function handleServerAction(req, res, server, handlerOptions) {
105
103
  );
106
104
  }
107
105
  res.setHeader("Content-Type", "text/x-component; charset=utf-8");
106
+ res.setHeader("Content-Length", "0");
108
107
  const { pipe } = ReactDOMServer.renderToPipeableStream(
109
108
  {
110
109
  type: "server-action-response",
111
- returnValue: result
110
+ returnValue: result,
111
+ id
112
112
  },
113
113
  handlerOptions.moduleBasePath,
114
114
  {
@@ -116,12 +116,48 @@ async function handleServerAction(req, res, server, handlerOptions) {
116
116
  logError(error, server.config.logger);
117
117
  res.statusCode = 500;
118
118
  res.end();
119
+ },
120
+ onAllReady() {
121
+ const contentLength = res.getHeader("Content-Length");
122
+ if (contentLength) {
123
+ res.setHeader("Content-Length", contentLength);
124
+ }
119
125
  }
120
126
  }
121
127
  );
122
128
  pipe(res);
123
129
  } catch (error) {
124
- logError(error, server.config.logger);
130
+ const err = toError(error);
131
+ logError(err, server.config.logger);
132
+ res.statusCode = 500;
133
+ res.setHeader("Content-Type", "text/x-component; charset=utf-8");
134
+ res.setHeader("Content-Length", "0");
135
+ const { pipe } = ReactDOMServer.renderToPipeableStream(
136
+ {
137
+ type: "server-action-response",
138
+ returnValue: null,
139
+ error: {
140
+ digest: err.message || "",
141
+ name: err.name || "Error"
142
+ },
143
+ id
144
+ },
145
+ handlerOptions.moduleBasePath,
146
+ {
147
+ onError(error2) {
148
+ logError(error2, server.config.logger);
149
+ res.statusCode = 500;
150
+ res.end();
151
+ },
152
+ onAllReady() {
153
+ const contentLength = res.getHeader("Content-Length");
154
+ if (contentLength) {
155
+ res.setHeader("Content-Length", contentLength);
156
+ }
157
+ }
158
+ }
159
+ );
160
+ pipe(res);
125
161
  }
126
162
  }
127
163
 
@@ -1 +1 @@
1
- {"version":3,"file":"handleServerAction.js","sources":["../../../plugin/react-server/handleServerAction.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport { logError, toError } from \"../error/toError.js\";\nimport { join } from \"path\";\nimport { ReactDOMServer } from \"../vendor/vendor.server.js\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\n\nexport async function handleServerAction<\n T extends PagePropOpt,\n InlineCss extends InlineCssOpt\n>(\n req: IncomingMessage,\n res: ServerResponse,\n server: ViteDevServer,\n handlerOptions: ResolvedUserOptions<T, InlineCss>\n) {\n try {\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Handling server action request at ${req.url}`\n );\n }\n\n // Parse the request body - handle both formats:\n // 1. Direct args array: [\"arg1\", \"arg2\"]\n // 2. Object with id and args: { id: \"path/to/action\", args: [\"arg1\", \"arg2\"] }\n let id: string;\n let args: unknown[];\n try {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString();\n if (handlerOptions.verbose) {\n server.config.logger.info(`[react-server] Request body: ${body}`);\n }\n\n const parsed = JSON.parse(body);\n if (Array.isArray(parsed)) {\n // Format 1: Direct args array\n args = parsed;\n // Get the action ID from the request URL\n id = req.url?.split(\"?\")[0] ?? \"\";\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Using action ID from URL: ${id}`\n );\n }\n } else if (parsed && typeof parsed === \"object\" && \"id\" in parsed) {\n // Format 2: Object with id and args\n id = parsed.id;\n args = parsed.args ?? [];\n } else {\n throw new Error(\"Invalid server action request format\");\n }\n } catch (error: unknown) {\n const err = toError(error);\n throw new Error(`Failed to parse server action request`, {\n cause: err,\n });\n }\n\n if (!id) {\n throw new Error(\"Server action ID is required\");\n }\n\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Server action request for ${id} with args: ${JSON.stringify(\n args\n )}`\n );\n }\n\n // Parse the server action ID to get the file path and export name\n const [filePath, exportName] = id.split(\"#\");\n if (!filePath || !exportName) {\n throw new Error(\n `Invalid server action ID format: ${id}. Expected format: \"path/to/file.ts#exportName\"`\n );\n }\n\n // Convert the server action ID to a file path\n const actionPath = filePath.startsWith(\"/\") ? filePath.slice(1) : filePath;\n const fullPath = join(handlerOptions.projectRoot, actionPath);\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Resolved file path: id=${id}, actionPath=${actionPath}, projectRoot=${handlerOptions.projectRoot}, filePath=${fullPath}, exportName=${exportName}`\n );\n }\n\n // Load the server action module\n if (handlerOptions.verbose) {\n server.config.logger.info(`[react-server] Loading module: ${fullPath}`);\n }\n const module = await server.ssrLoadModule(fullPath);\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Looking for action: ${exportName} in module with exports: ${Object.keys(\n module\n ).join(\", \")}`\n );\n }\n const action = module[exportName];\n\n if (typeof action !== \"function\") {\n if (handlerOptions.verbose) {\n server.config.logger.error(\n `[react-server] Action not found: ${exportName} in module with exports: ${Object.keys(\n module\n ).join(\", \")}`\n );\n }\n throw new Error(`Server action not found: ${id}`);\n }\n\n // Execute the server action\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Executing action with args: ${JSON.stringify(args)}`\n );\n }\n const result = await action(...args);\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Action completed successfully with result: ${JSON.stringify(\n result\n )}`\n );\n }\n\n // Send the response\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(\n {\n type: \"server-action-response\",\n returnValue: result\n },\n handlerOptions.moduleBasePath,\n {\n onError(error: Error) {\n logError(error, server.config.logger);\n res.statusCode = 500;\n res.end();\n },\n }\n );\n\n pipe(res);\n } catch (error) {\n logError(error, server.config.logger);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handleServerAction.js","sources":["../../../plugin/react-server/handleServerAction.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport { logError, toError } from \"../error/toError.js\";\nimport { join } from \"path\";\nimport { ReactDOMServer } from \"../vendor/vendor.server.js\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\n\nexport async function handleServerAction<\n T extends PagePropOpt = PagePropOpt,\n InlineCss extends InlineCssOpt = InlineCssOpt\n>(\n req: IncomingMessage,\n res: ServerResponse,\n server: ViteDevServer,\n handlerOptions: ResolvedUserOptions<T, InlineCss>\n) {\n let id = req.url?.split(\"?\")[0] ?? \"\";\n try {\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Handling server action request at ${req.url}`\n );\n }\n\n // Parse the request body\n let args: unknown[];\n try {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString();\n if (handlerOptions.verbose) {\n server.config.logger.info(`[react-server] Request body: ${body}`);\n }\n\n const parsed = JSON.parse(body);\n if (Array.isArray(parsed)) {\n // Format 1: Direct args array\n args = parsed;\n // Get the action ID from the request URL\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Using action ID from URL: ${id}`\n );\n }\n } else if (parsed && typeof parsed === \"object\" && \"id\" in parsed) {\n // Format 2: Object with id and args\n id = parsed.id;\n args = parsed.args ?? [];\n } else {\n throw new Error(\"Invalid server action request format\");\n }\n } catch (error: unknown) {\n throw new Error(`Failed to parse server action request`, {\n cause: toError(error),\n });\n }\n\n if (!id) {\n throw new Error(\"Server action ID is required\");\n }\n\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Server action request for ${id} with args: ${JSON.stringify(\n args\n )}`\n );\n }\n\n // Parse the server action ID to get the file path and export name\n const [filePath, exportName] = id.split(\"#\");\n if (!filePath || !exportName) {\n throw new Error(\n `Invalid server action ID format: ${id}. Expected format: \"path/to/file.ts#exportName\"`\n );\n }\n\n // Convert the server action ID to a file path\n const actionPath = filePath.startsWith(\"/\") ? filePath.slice(1) : filePath;\n const fullPath = join(handlerOptions.projectRoot, actionPath);\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Resolved file path: id=${id}, actionPath=${actionPath}, projectRoot=${handlerOptions.projectRoot}, filePath=${fullPath}, exportName=${exportName}`\n );\n }\n\n // Load the server action module\n if (handlerOptions.verbose) {\n server.config.logger.info(`[react-server] Loading module: ${fullPath}`);\n }\n const module = await server.ssrLoadModule(fullPath);\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Looking for action: ${exportName} in module with exports: ${Object.keys(\n module\n ).join(\", \")}`\n );\n }\n const action = module[exportName];\n\n if (typeof action !== \"function\") {\n if (handlerOptions.verbose) {\n server.config.logger.error(\n `[react-server] Action not found: ${exportName} in module with exports: ${Object.keys(\n module\n ).join(\", \")}`\n );\n }\n throw new Error(`Server action not found: ${id}`);\n }\n\n // Execute the server action\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Executing action with args: ${JSON.stringify(args)}`\n );\n }\n const result = await action(...args);\n if (handlerOptions.verbose) {\n server.config.logger.info(\n `[react-server] Action completed successfully with result: ${JSON.stringify(\n result\n )}`\n );\n }\n\n // Send the response using RSC streaming\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n res.setHeader(\"Content-Length\", \"0\"); // Will be updated after streaming\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(\n {\n type: \"server-action-response\",\n returnValue: result,\n id\n },\n handlerOptions.moduleBasePath,\n {\n onError(error: Error) {\n logError(error, server.config.logger);\n res.statusCode = 500;\n res.end();\n },\n onAllReady() {\n // Update content length after streaming is complete\n const contentLength = res.getHeader(\"Content-Length\");\n if (contentLength) {\n res.setHeader(\"Content-Length\", contentLength);\n }\n }\n }\n );\n\n pipe(res);\n } catch (error) {\n const err = toError(error);\n logError(err, server.config.logger);\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n res.setHeader(\"Content-Length\", \"0\"); // Will be updated after streaming\n\n const { pipe } = ReactDOMServer.renderToPipeableStream(\n {\n type: \"server-action-response\",\n returnValue: null,\n error: {\n digest: err.message || \"\",\n name: err.name || \"Error\",\n },\n id\n },\n handlerOptions.moduleBasePath,\n {\n onError(error: Error) {\n logError(error, server.config.logger);\n res.statusCode = 500;\n res.end();\n },\n onAllReady() {\n // Update content length after streaming is complete\n const contentLength = res.getHeader(\"Content-Length\");\n if (contentLength) {\n res.setHeader(\"Content-Length\", contentLength);\n }\n }\n }\n );\n pipe(res);\n }\n}\n"],"names":["error"],"mappings":"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"}
@@ -132,10 +132,10 @@ function reactServerPlugin(options) {
132
132
  if (server.moduleGraph) {
133
133
  const mod = server.moduleGraph.getModuleById(file);
134
134
  if (mod) {
135
- server.moduleGraph.invalidateModule(mod);
135
+ server.moduleGraph.invalidateModule(mod, void 0, void 0, true);
136
136
  const newMod = await server.moduleGraph.ensureEntryFromUrl(file, false);
137
137
  if (newMod) {
138
- server.moduleGraph.invalidateModule(newMod);
138
+ server.moduleGraph.invalidateModule(newMod, void 0, void 0, true);
139
139
  }
140
140
  }
141
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../plugin/react-server/plugin.ts"],"sourcesContent":["import { performance } from \"node:perf_hooks\";\nimport {\n type ResolvedConfig,\n type UserConfig,\n type ViteDevServer,\n type Manifest,\n type Plugin as VitePlugin,\n} from \"vite\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport type {\n AutoDiscoveredFiles,\n BuildTiming,\n ReactStreamPluginMeta,\n ResolvedUserOptions,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport {\n resolveAutoDiscover\n} from \"../config/autoDiscover/resolveAutoDiscover.js\";\nimport { getCondition } from \"../config/getCondition.js\";\nimport { configureReactServer } from \"./configureReactServer.js\";\nimport { configurePreviewServer } from \"../react-static/configurePreviewServer.js\";\nimport { getBundleManifest } from \"../helpers/getBundleManifest.js\";\n\nlet resolvedConfig: ResolvedConfig | null = null;\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}\nexport function reactServerPlugin<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(options: StreamPluginOptions<T, InlineCSS>): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n const timing: BuildTiming = {\n start: performance.now(),\n };\n\n let autoDiscoveredFiles: AutoDiscoveredFiles;\n let userOptions: ResolvedUserOptions<T, InlineCSS>;\n let serverManifest: Manifest = {};\n\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n \n\n return {\n name: \"vite:react-stream-server\",\n enforce: \"post\",\n api: {\n meta: { timing },\n }, \n configResolved(_resolvedConfig) {\n resolvedConfig = _resolvedConfig;\n if (\n userOptions.projectRoot != resolvedConfig.root &&\n typeof userOptions.projectRoot === \"string\" &&\n userOptions.projectRoot !== \"\"\n ) {\n throw new Error(\n \"[RSC] Project root is not the current working directory, please set projectRoot in your config.\\n\" +\n \" projectRoot: \" + userOptions.projectRoot + \"\\n\" +\n \" resolvedConfig.root: \" + resolvedConfig.root\n );\n }\n timing.configResolved = performance.now();\n\n // Verify transformer runs first, preserver runs last\n const plugins = resolvedConfig.plugins;\n const transformerIndex = plugins.findIndex(\n (p) => p.name === \"vite:react-server-transform\"\n );\n const preserverIndex = plugins.findIndex(\n (p) => p.name === \"vite-plugin-react-server:preserve-directives\"\n );\n\n if (transformerIndex === -1) {\n throw new Error(\"Transformer plugin not installed\");\n }\n if (preserverIndex < transformerIndex) {\n throw new Error(\n \"Transformer plugin isn't installed or isn't running before preserver\"\n );\n }\n },\n\n async configurePreviewServer(server) {\n await configurePreviewServer({\n server,\n userOptions,\n });\n },\n async configureServer(server: ViteDevServer) {\n configureReactServer({\n server,\n autoDiscoveredFiles,\n userOptions,\n serverManifest,\n });\n },\n async config(config, configEnv): Promise<UserConfig> {\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\n if (resolvedConfig.type === \"error\") {\n console.error(\n \"[react-server-plugin] Failed to resolve config:\",\n resolvedConfig.error\n );\n throw resolvedConfig.error;\n }\n\n return resolvedConfig.userConfig;\n },\n async writeBundle(options, bundle) {\n if (userOptions.onEvent) {\n userOptions.onEvent({\n type: \"build.writeBundle.server\",\n data: {\n pages: Array.from(autoDiscoveredFiles?.urlMap.keys() ?? []),\n options,\n bundle,\n },\n });\n }\n },\n async buildStart() {\n if (!timing.buildStart) {\n timing.buildStart = performance.now();\n } else {\n console.log(\"Build already started\");\n }\n },\n async generateBundle(_options, bundle) {\n // Create manifest entries for each chunk\n serverManifest = getBundleManifest<false>({\n bundle,\n normalizer: userOptions.normalizer,\n });\n },\n async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {\n try {\n // Invalidate the module in Vite's cache for both client and SSR\n if (server.moduleGraph) {\n const mod = server.moduleGraph.getModuleById(file);\n if (mod) {\n // Invalidate the parent module which will handle both client and SSR\n server.moduleGraph.invalidateModule(mod);\n \n // Force a reload of the module\n const newMod = await server.moduleGraph.ensureEntryFromUrl(file, false);\n if (newMod) {\n server.moduleGraph.invalidateModule(newMod);\n }\n }\n }\n \n // Let Vite handle the HMR update\n return ctx.modules;\n } catch (error) {\n console.error(\"[react-server] HMR Error:\", error);\n return ctx.modules;\n }\n },\n };\n}\n"],"names":["resolvedConfig","options"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["../../../plugin/react-server/plugin.ts"],"sourcesContent":["import { performance } from \"node:perf_hooks\";\nimport {\n type ResolvedConfig,\n type UserConfig,\n type ViteDevServer,\n type Manifest,\n type Plugin as VitePlugin,\n} from \"vite\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport type {\n AutoDiscoveredFiles,\n BuildTiming,\n ReactStreamPluginMeta,\n ResolvedUserOptions,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport {\n resolveAutoDiscover\n} from \"../config/autoDiscover/resolveAutoDiscover.js\";\nimport { getCondition } from \"../config/getCondition.js\";\nimport { configureReactServer } from \"./configureReactServer.js\";\nimport { configurePreviewServer } from \"../react-static/configurePreviewServer.js\";\nimport { getBundleManifest } from \"../helpers/getBundleManifest.js\";\n\nlet resolvedConfig: ResolvedConfig | null = null;\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}\nexport function reactServerPlugin<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(options: StreamPluginOptions<T, InlineCSS>): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n const timing: BuildTiming = {\n start: performance.now(),\n };\n\n let autoDiscoveredFiles: AutoDiscoveredFiles;\n let userOptions: ResolvedUserOptions<T, InlineCSS>;\n let serverManifest: Manifest = {};\n\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n \n\n return {\n name: \"vite:react-stream-server\",\n enforce: \"post\",\n api: {\n meta: { timing },\n }, \n configResolved(_resolvedConfig) {\n resolvedConfig = _resolvedConfig;\n if (\n userOptions.projectRoot != resolvedConfig.root &&\n typeof userOptions.projectRoot === \"string\" &&\n userOptions.projectRoot !== \"\"\n ) {\n throw new Error(\n \"[RSC] Project root is not the current working directory, please set projectRoot in your config.\\n\" +\n \" projectRoot: \" + userOptions.projectRoot + \"\\n\" +\n \" resolvedConfig.root: \" + resolvedConfig.root\n );\n }\n timing.configResolved = performance.now();\n\n // Verify transformer runs first, preserver runs last\n const plugins = resolvedConfig.plugins;\n const transformerIndex = plugins.findIndex(\n (p) => p.name === \"vite:react-server-transform\"\n );\n const preserverIndex = plugins.findIndex(\n (p) => p.name === \"vite-plugin-react-server:preserve-directives\"\n );\n\n if (transformerIndex === -1) {\n throw new Error(\"Transformer plugin not installed\");\n }\n if (preserverIndex < transformerIndex) {\n throw new Error(\n \"Transformer plugin isn't installed or isn't running before preserver\"\n );\n }\n },\n\n async configurePreviewServer(server) {\n await configurePreviewServer({\n server,\n userOptions,\n });\n },\n async configureServer(server: ViteDevServer) {\n configureReactServer({\n server,\n autoDiscoveredFiles,\n userOptions,\n serverManifest,\n });\n },\n async config(config, configEnv): Promise<UserConfig> {\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\n if (resolvedConfig.type === \"error\") {\n console.error(\n \"[react-server-plugin] Failed to resolve config:\",\n resolvedConfig.error\n );\n throw resolvedConfig.error;\n }\n\n return resolvedConfig.userConfig;\n },\n async writeBundle(options, bundle) {\n if (userOptions.onEvent) {\n userOptions.onEvent({\n type: \"build.writeBundle.server\",\n data: {\n pages: Array.from(autoDiscoveredFiles?.urlMap.keys() ?? []),\n options,\n bundle,\n },\n });\n }\n },\n async buildStart() {\n if (!timing.buildStart) {\n timing.buildStart = performance.now();\n } else {\n console.log(\"Build already started\");\n }\n },\n async generateBundle(_options, bundle) {\n // Create manifest entries for each chunk\n serverManifest = getBundleManifest<false>({\n bundle,\n normalizer: userOptions.normalizer,\n });\n },\n async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {\n try {\n // Invalidate the module in Vite's cache for both client and SSR\n if (server.moduleGraph) {\n const mod = server.moduleGraph.getModuleById(file);\n if (mod) {\n // Invalidate the parent module which will handle both client and SSR\n server.moduleGraph.invalidateModule(mod, undefined, undefined, true);\n \n // Force a reload of the module\n const newMod = await server.moduleGraph.ensureEntryFromUrl(file, false);\n if (newMod) {\n server.moduleGraph.invalidateModule(newMod, undefined, undefined, true);\n }\n }\n }\n \n // Let Vite handle the HMR update\n return ctx.modules;\n } catch (error) {\n console.error(\"[react-server] HMR Error:\", error);\n return ctx.modules;\n }\n },\n };\n}\n"],"names":["resolvedConfig","options"],"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,EAOrB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAwBvD,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAE7C,OAAO,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GACzC,UAAU,CAAC;IACZ,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC,CAuWD"}
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,EAOrB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAwBvD,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAE7C,OAAO,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GACzC,UAAU,CAAC;IACZ,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC,CA+WD"}
@@ -137,10 +137,18 @@ function reactStaticPlugin(options) {
137
137
  bundle
138
138
  );
139
139
  const cssFilesByPage = /* @__PURE__ */ new Map();
140
- const globalCssInputs = collectManifestCss(
140
+ const indexHtmlCssInputs = collectManifestCss(
141
141
  autoDiscoveredFiles?.staticManifest ?? {},
142
- "index.html"
142
+ userOptions.clientEntry ?? "index.html"
143
143
  );
144
+ const clientEntryCssInputs = collectManifestCss(
145
+ autoDiscoveredFiles?.staticManifest ?? {},
146
+ userOptions.clientEntry
147
+ );
148
+ const globalCssInputs = {
149
+ ...indexHtmlCssInputs,
150
+ ...clientEntryCssInputs
151
+ };
144
152
  const globalCss = /* @__PURE__ */ new Map();
145
153
  for (const [url, { page, props }] of autoDiscoveredFiles?.urlMap ?? []) {
146
154
  const transformedServerManifest = Object.fromEntries(