vite-plugin-react-server 0.3.18 → 0.3.19

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 (208) hide show
  1. package/README.md +119 -118
  2. package/bin/patch.mjs +8 -2
  3. package/dist/package.json +3 -3
  4. package/dist/plugin/checkFilesExist.d.ts.map +1 -1
  5. package/dist/plugin/checkFilesExist.js +6 -2
  6. package/dist/plugin/checkFilesExist.js.map +1 -1
  7. package/dist/plugin/collect-manifest-client-files.d.ts +23 -0
  8. package/dist/plugin/collect-manifest-client-files.d.ts.map +1 -0
  9. package/dist/plugin/collect-manifest-client-files.js +117 -0
  10. package/dist/plugin/collect-manifest-client-files.js.map +1 -0
  11. package/dist/plugin/components.d.ts +9 -9
  12. package/dist/plugin/components.d.ts.map +1 -1
  13. package/dist/plugin/components.js +50 -9
  14. package/dist/plugin/components.js.map +1 -0
  15. package/dist/plugin/config/defaults.d.ts +7 -6
  16. package/dist/plugin/config/defaults.d.ts.map +1 -1
  17. package/dist/plugin/config/defaults.js +8 -5
  18. package/dist/plugin/config/defaults.js.map +1 -1
  19. package/dist/plugin/config/getPaths.d.ts +0 -1
  20. package/dist/plugin/config/getPaths.d.ts.map +1 -1
  21. package/dist/plugin/config/getPaths.js +2 -7
  22. package/dist/plugin/config/getPaths.js.map +1 -1
  23. package/dist/plugin/config/mimeTypes.d.ts +2 -0
  24. package/dist/plugin/config/mimeTypes.d.ts.map +1 -0
  25. package/dist/plugin/config/mimeTypes.js +24 -0
  26. package/dist/plugin/config/mimeTypes.js.map +1 -0
  27. package/dist/plugin/config/resolveOptions.d.ts +1 -1
  28. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  29. package/dist/plugin/config/resolveOptions.js +41 -28
  30. package/dist/plugin/config/resolveOptions.js.map +1 -1
  31. package/dist/plugin/config/resolvePages.d.ts +1 -0
  32. package/dist/plugin/config/resolvePages.d.ts.map +1 -1
  33. package/dist/plugin/config/resolvePages.js +9 -5
  34. package/dist/plugin/config/resolvePages.js.map +1 -1
  35. package/dist/plugin/config/resolveUserConfig.d.ts +2 -1
  36. package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
  37. package/dist/plugin/config/resolveUserConfig.js +10 -5
  38. package/dist/plugin/config/resolveUserConfig.js.map +1 -1
  39. package/dist/plugin/copy-dir.js +23 -18
  40. package/dist/plugin/copy-dir.js.map +1 -0
  41. package/dist/plugin/helpers/createHandler.d.ts +22 -0
  42. package/dist/plugin/helpers/createHandler.d.ts.map +1 -0
  43. package/dist/plugin/{react-server → helpers}/createHandler.js +36 -48
  44. package/dist/plugin/helpers/createHandler.js.map +1 -0
  45. package/dist/plugin/{react-server → helpers}/createRscStream.d.ts +2 -1
  46. package/dist/plugin/helpers/createRscStream.d.ts.map +1 -0
  47. package/dist/plugin/helpers/createRscStream.js +71 -0
  48. package/dist/plugin/helpers/createRscStream.js.map +1 -0
  49. package/dist/plugin/helpers/getBundleManifest.d.ts.map +1 -1
  50. package/dist/plugin/helpers/getBundleManifest.js +12 -4
  51. package/dist/plugin/helpers/getBundleManifest.js.map +1 -1
  52. package/dist/plugin/loader/createBuildLoader.d.ts +1 -1
  53. package/dist/plugin/loader/createBuildLoader.d.ts.map +1 -1
  54. package/dist/plugin/loader/createBuildLoader.js +8 -5
  55. package/dist/plugin/loader/createBuildLoader.js.map +1 -1
  56. package/dist/plugin/loader/css-loader.d.ts.map +1 -1
  57. package/dist/plugin/loader/css-loader.js.map +1 -1
  58. package/dist/plugin/loader/react-loader.js +2 -2
  59. package/dist/plugin/loader/react-loader.js.map +1 -1
  60. package/dist/plugin/preserver/plugin.d.ts.map +1 -1
  61. package/dist/plugin/preserver/plugin.js +49 -14
  62. package/dist/plugin/preserver/plugin.js.map +1 -1
  63. package/dist/plugin/react-client/plugin.d.ts.map +1 -1
  64. package/dist/plugin/react-client/plugin.js +18 -76
  65. package/dist/plugin/react-client/plugin.js.map +1 -1
  66. package/dist/plugin/react-server/index.d.ts.map +1 -1
  67. package/dist/plugin/react-server/index.js +2 -0
  68. package/dist/plugin/react-server/index.js.map +1 -1
  69. package/dist/plugin/react-server/plugin.d.ts +2 -1
  70. package/dist/plugin/react-server/plugin.d.ts.map +1 -1
  71. package/dist/plugin/react-server/plugin.js +53 -217
  72. package/dist/plugin/react-server/plugin.js.map +1 -1
  73. package/dist/plugin/react-static/index.d.ts +2 -0
  74. package/dist/plugin/react-static/index.d.ts.map +1 -0
  75. package/dist/plugin/react-static/index.js +1 -0
  76. package/dist/plugin/react-static/plugin.d.ts +7 -0
  77. package/dist/plugin/react-static/plugin.d.ts.map +1 -0
  78. package/dist/plugin/react-static/plugin.js +199 -0
  79. package/dist/plugin/react-static/plugin.js.map +1 -0
  80. package/dist/plugin/resolvePage.d.ts.map +1 -1
  81. package/dist/plugin/resolvePage.js +9 -0
  82. package/dist/plugin/resolvePage.js.map +1 -1
  83. package/dist/plugin/root.d.ts +2 -0
  84. package/dist/plugin/root.d.ts.map +1 -0
  85. package/dist/plugin/root.js +12 -0
  86. package/dist/plugin/root.js.map +1 -0
  87. package/dist/plugin/transformer/plugin.d.ts.map +1 -1
  88. package/dist/plugin/transformer/plugin.js +32 -23
  89. package/dist/plugin/transformer/plugin.js.map +1 -1
  90. package/dist/plugin/transformer/types.d.ts +1 -18
  91. package/dist/plugin/transformer/types.d.ts.map +1 -1
  92. package/dist/plugin/types.d.ts +24 -6
  93. package/dist/plugin/types.d.ts.map +1 -1
  94. package/dist/plugin/worker/createWorker.js +0 -1
  95. package/dist/plugin/worker/createWorker.js.map +1 -1
  96. package/dist/plugin/worker/html/html-worker.development.d.ts +30 -0
  97. package/dist/plugin/worker/html/html-worker.development.d.ts.map +1 -1
  98. package/dist/plugin/worker/html/html-worker.development.js +30 -2
  99. package/dist/plugin/worker/html/html-worker.development.js.map +1 -1
  100. package/dist/plugin/worker/html/html-worker.production.js +3 -5
  101. package/dist/plugin/worker/html/html-worker.production.js.map +1 -1
  102. package/dist/plugin/worker/html/messageHandler.d.ts.map +1 -1
  103. package/dist/plugin/worker/html/messageHandler.js +8 -2
  104. package/dist/plugin/worker/html/messageHandler.js.map +1 -1
  105. package/dist/plugin/worker/html/plugin.d.ts.map +1 -1
  106. package/dist/plugin/worker/html/plugin.js +2 -3
  107. package/dist/plugin/worker/html/renderPages.d.ts +8 -4
  108. package/dist/plugin/worker/html/renderPages.d.ts.map +1 -1
  109. package/dist/plugin/worker/html/renderPages.js +118 -83
  110. package/dist/plugin/worker/html/renderPages.js.map +1 -1
  111. package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
  112. package/dist/plugin/worker/rsc/messageHandler.js +89 -84
  113. package/dist/plugin/worker/rsc/messageHandler.js.map +1 -1
  114. package/dist/plugin/worker/rsc/plugin.d.ts.map +1 -1
  115. package/dist/plugin/worker/rsc/plugin.js +1 -2
  116. package/dist/plugin/worker/rsc/rsc-worker.development.js +13 -18
  117. package/dist/plugin/worker/rsc/rsc-worker.development.js.map +1 -1
  118. package/dist/plugin/worker/rsc/rsc-worker.production.js +4 -1
  119. package/dist/plugin/worker/rsc/rsc-worker.production.js.map +1 -1
  120. package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
  121. package/dist/plugin/worker/rsc/state.js.map +1 -1
  122. package/dist/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +3 -3
  124. package/plugin/checkFilesExist.ts +7 -3
  125. package/plugin/collect-manifest-client-files.ts +152 -0
  126. package/plugin/components.tsx +55 -10
  127. package/plugin/config/defaults.tsx +69 -0
  128. package/plugin/config/getPaths.ts +1 -7
  129. package/plugin/config/mimeTypes.ts +17 -0
  130. package/plugin/config/resolveOptions.ts +48 -40
  131. package/plugin/config/resolvePages.ts +8 -4
  132. package/plugin/config/resolveUserConfig.ts +12 -9
  133. package/plugin/{react-server → helpers}/createHandler.ts +46 -63
  134. package/plugin/helpers/createRscStream.ts +81 -0
  135. package/plugin/helpers/getBundleManifest.ts +14 -5
  136. package/plugin/loader/createBuildLoader.ts +9 -6
  137. package/plugin/loader/css-loader.ts +0 -2
  138. package/plugin/loader/react-loader.ts +2 -2
  139. package/plugin/preserver/plugin.ts +64 -17
  140. package/plugin/react-client/plugin.ts +20 -91
  141. package/plugin/react-server/index.ts +2 -0
  142. package/plugin/react-server/plugin.ts +66 -293
  143. package/plugin/react-static/index.ts +1 -0
  144. package/plugin/react-static/plugin.ts +247 -0
  145. package/plugin/resolvePage.ts +9 -0
  146. package/plugin/root.ts +4 -0
  147. package/plugin/transformer/plugin.ts +40 -31
  148. package/plugin/transformer/types.ts +0 -19
  149. package/plugin/types.ts +25 -6
  150. package/plugin/worker/createWorker.ts +1 -1
  151. package/plugin/worker/html/README.md +63 -0
  152. package/plugin/worker/html/html-worker.development.tsx +89 -2
  153. package/plugin/worker/html/html-worker.production.tsx +8 -10
  154. package/plugin/worker/html/messageHandler.ts +8 -2
  155. package/plugin/worker/html/plugin.ts +2 -3
  156. package/plugin/worker/html/renderPages.ts +150 -114
  157. package/plugin/worker/rsc/README.md +58 -0
  158. package/plugin/worker/rsc/messageHandler.tsx +95 -111
  159. package/plugin/worker/rsc/plugin.ts +1 -2
  160. package/plugin/worker/rsc/rsc-worker.development.ts +12 -22
  161. package/plugin/worker/rsc/rsc-worker.production.ts +5 -1
  162. package/plugin/worker/rsc/state.ts +0 -3
  163. package/scripts/react+0.0.0-experimental-eda36a1c-20250228.patch +114 -12
  164. package/scripts/react-dom+0.0.0-experimental-eda36a1c-20250228.patch +10571 -121
  165. package/tsconfig.json +2 -2
  166. package/dist/plugin/collect-css-manifest.d.ts +0 -4
  167. package/dist/plugin/collect-css-manifest.d.ts.map +0 -1
  168. package/dist/plugin/collect-css-manifest.js +0 -65
  169. package/dist/plugin/collect-css-manifest.js.map +0 -1
  170. package/dist/plugin/config/createModuleIdGenerator.d.ts +0 -11
  171. package/dist/plugin/config/createModuleIdGenerator.d.ts.map +0 -1
  172. package/dist/plugin/config/createModuleIdGenerator.js +0 -44
  173. package/dist/plugin/config/createModuleIdGenerator.js.map +0 -1
  174. package/dist/plugin/loader/createCssLoader.d.ts +0 -30
  175. package/dist/plugin/loader/createCssLoader.d.ts.map +0 -1
  176. package/dist/plugin/loader/createCssLoader.js +0 -35
  177. package/dist/plugin/loader/createPageLoader.d.ts +0 -24
  178. package/dist/plugin/loader/createPageLoader.d.ts.map +0 -1
  179. package/dist/plugin/loader/createPageLoader.js +0 -50
  180. package/dist/plugin/loader/rsc/messageHandler.d.ts +0 -2
  181. package/dist/plugin/loader/rsc/messageHandler.d.ts.map +0 -1
  182. package/dist/plugin/loader/rsc/messageHandler.js +0 -1
  183. package/dist/plugin/loader/rsc/rsc-worker.development.d.ts +0 -2
  184. package/dist/plugin/loader/rsc/rsc-worker.development.d.ts.map +0 -1
  185. package/dist/plugin/loader/rsc/rsc-worker.development.js +0 -1
  186. package/dist/plugin/react-server/createHandler.d.ts +0 -17
  187. package/dist/plugin/react-server/createHandler.d.ts.map +0 -1
  188. package/dist/plugin/react-server/createHandler.js.map +0 -1
  189. package/dist/plugin/react-server/createRscStream.d.ts.map +0 -1
  190. package/dist/plugin/react-server/createRscStream.js +0 -70
  191. package/dist/plugin/react-server/createRscStream.js.map +0 -1
  192. package/dist/plugin/react-server/createSsrHandler.d.ts +0 -4
  193. package/dist/plugin/react-server/createSsrHandler.d.ts.map +0 -1
  194. package/dist/plugin/react-server/createSsrHandler.js +0 -95
  195. package/dist/plugin/utils/logger.d.ts +0 -9
  196. package/dist/plugin/utils/logger.d.ts.map +0 -1
  197. package/dist/plugin/utils/logger.js +0 -68
  198. package/dist/plugin/utils/logger.js.map +0 -1
  199. package/plugin/collect-css-manifest.ts +0 -82
  200. package/plugin/config/createModuleIdGenerator.ts +0 -52
  201. package/plugin/config/defaults.ts +0 -51
  202. package/plugin/loader/createCssLoader.ts +0 -73
  203. package/plugin/loader/createPageLoader.ts +0 -103
  204. package/plugin/loader/rsc/messageHandler.tsx +0 -1
  205. package/plugin/loader/rsc/rsc-worker.development.ts +0 -1
  206. package/plugin/react-server/createRscStream.ts +0 -86
  207. package/plugin/react-server/createSsrHandler.ts +0 -125
  208. package/plugin/utils/logger.ts +0 -52
@@ -1,2 +1,32 @@
1
+ declare module "node:module" {
2
+ interface ImportAttributes {
3
+ [key: string]: string | undefined;
4
+ }
5
+ interface ResolveHookContext {
6
+ conditions: string[];
7
+ parentURL: string | undefined;
8
+ importAttributes: ImportAttributes;
9
+ }
10
+ interface LoadHookContext {
11
+ conditions: string[];
12
+ format: ModuleFormat | null | undefined;
13
+ importAttributes: ImportAttributes;
14
+ shortCircuit?: boolean;
15
+ }
16
+ interface ResolveResult {
17
+ url: string;
18
+ shortCircuit: boolean;
19
+ }
20
+ interface LoadResult {
21
+ format: string;
22
+ source: string | SharedArrayBuffer | Uint8Array;
23
+ shortCircuit: boolean;
24
+ }
25
+ interface HooksAPI {
26
+ resolve?: (specifier: string, context: ResolveHookContext, nextResolve: (specifier: string, context: ResolveHookContext) => ResolveResult) => ResolveResult;
27
+ load?: (url: string, context: LoadHookContext, nextLoad: (url: string, context: LoadHookContext) => LoadResult) => LoadResult;
28
+ }
29
+ function registerHooks(hooks: HooksAPI): void;
30
+ }
1
31
  export {};
2
32
  //# sourceMappingURL=html-worker.development.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-worker.development.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/html-worker.development.tsx"],"names":[],"mappings":""}
1
+ {"version":3,"file":"html-worker.development.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/html-worker.development.tsx"],"names":[],"mappings":"AACA,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAiB,gBAAgB;QAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC;IAED,UAAiB,kBAAkB;QACjC,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,gBAAgB,EAAE,gBAAgB,CAAC;KACpC;IAED,UAAiB,eAAe;QAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,CAAC;QACxC,gBAAgB,EAAE,gBAAgB,CAAC;QACnC,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB;IAED,UAAiB,aAAa;QAC5B,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,OAAO,CAAC;KACvB;IAED,UAAiB,UAAU;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,UAAU,CAAC;QAChD,YAAY,EAAE,OAAO,CAAC;KACvB;IAED,UAAiB,QAAQ;QACvB,OAAO,CAAC,EAAE,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,KACxB,aAAa,KACf,aAAa,CAAC;QAEnB,IAAI,CAAC,EAAE,CACL,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,KAAK,UAAU,KAC5D,UAAU,CAAC;KACjB;IAED,SAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtD"}
@@ -3,10 +3,38 @@
3
3
  * Copyright (c) Nico Brinkkemper
4
4
  * MIT License
5
5
  */
6
+ import { join } from 'node:path';
7
+ import { pluginRoot } from '../../root.js';
6
8
  import { messageHandler } from './messageHandler.js';
7
- import { parentPort } from 'node:worker_threads';
9
+ import { parentPort, MessageChannel } from 'node:worker_threads';
10
+ import { register } from 'node:module';
11
+ import { register as register$1 } from 'tsx/esm/api';
8
12
 
9
13
  if (!parentPort) throw new Error("This module must be run as a worker");
14
+ const reactLoaderChannel = new MessageChannel();
15
+ const cssLoaderChannel = new MessageChannel();
16
+ reactLoaderChannel.port2.on("message", messageHandler);
17
+ cssLoaderChannel.port2.on("message", messageHandler);
18
+ const loaderPath = "file://" + join(pluginRoot, "loader/react-loader.js");
19
+ const cssLoaderPath = "file://" + join(pluginRoot, "loader/css-loader.js");
20
+ register(loaderPath, {
21
+ parentURL: pluginRoot,
22
+ data: { port: reactLoaderChannel.port1 },
23
+ transferList: [reactLoaderChannel.port1]
24
+ });
25
+ register(cssLoaderPath, {
26
+ parentURL: pluginRoot,
27
+ data: { port: cssLoaderChannel.port1 },
28
+ transferList: [cssLoaderChannel.port1]
29
+ });
30
+ register$1();
10
31
  parentPort?.on("message", messageHandler);
11
- parentPort?.postMessage({ type: "READY", env: process.env["NODE_ENV"] });
32
+ parentPort?.postMessage({
33
+ type: "READY",
34
+ env: process.env["NODE_ENV"],
35
+ pid: process.pid
36
+ });
37
+ if (process.env["NODE_ENV"] !== "development") {
38
+ throw new Error("This module must be run in development mode");
39
+ }
12
40
  //# sourceMappingURL=html-worker.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-worker.development.js","sources":["../../../../plugin/worker/html/html-worker.development.tsx"],"sourcesContent":["import { messageHandler } from \"./messageHandler.js\";\nimport { parentPort } from \"node:worker_threads\";\n\nif (!parentPort) throw new Error(\"This module must be run as a worker\");\nparentPort?.on(\"message\", messageHandler);\n\n// Signal ready with environment\nparentPort?.postMessage({ type: \"READY\", env: process.env[\"NODE_ENV\"] });"],"names":[],"mappings":";;;;;;;;AAGA,IAAI,CAAC,UAAA,EAAkB,MAAA,IAAI,MAAM,qCAAqC,CAAA;AACtE,UAAY,EAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AAGxC,UAAY,EAAA,WAAA,CAAY,EAAE,IAAM,EAAA,OAAA,EAAS,KAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA"}
1
+ {"version":3,"file":"html-worker.development.js","sources":["../../../../plugin/worker/html/html-worker.development.tsx"],"sourcesContent":["// no offical types for node:module available yet (23.7.0)\ndeclare module \"node:module\" {\n export interface ImportAttributes {\n [key: string]: string | undefined;\n }\n\n export interface ResolveHookContext {\n conditions: string[];\n parentURL: string | undefined;\n importAttributes: ImportAttributes;\n }\n\n export interface LoadHookContext {\n conditions: string[];\n format: ModuleFormat | null | undefined;\n importAttributes: ImportAttributes;\n shortCircuit?: boolean;\n }\n\n export interface ResolveResult {\n url: string;\n shortCircuit: boolean;\n }\n\n export interface LoadResult {\n format: string;\n source: string | SharedArrayBuffer | Uint8Array;\n shortCircuit: boolean;\n }\n\n export interface HooksAPI {\n resolve?: (\n specifier: string,\n context: ResolveHookContext,\n nextResolve: (\n specifier: string,\n context: ResolveHookContext\n ) => ResolveResult\n ) => ResolveResult;\n\n load?: (\n url: string,\n context: LoadHookContext,\n nextLoad: (url: string, context: LoadHookContext) => LoadResult\n ) => LoadResult;\n }\n\n export function registerHooks(hooks: HooksAPI): void;\n}\nimport { join } from \"node:path\";\nimport { pluginRoot } from \"../../root.js\";\nimport { messageHandler } from \"./messageHandler.js\";\nimport { parentPort } from \"node:worker_threads\";\nimport { register } from \"node:module\";\nimport { register as registerTsx } from \"tsx/esm/api\";\nimport { MessageChannel } from \"node:worker_threads\";\n\nif (!parentPort) throw new Error(\"This module must be run as a worker\");\n\n// Create channels for each loader\nconst reactLoaderChannel = new MessageChannel();\nconst cssLoaderChannel = new MessageChannel();\n\n// Listen for messages from loaders\nreactLoaderChannel.port2.on(\"message\", messageHandler);\ncssLoaderChannel.port2.on(\"message\", messageHandler);\n\nconst loaderPath = \"file://\" + join(pluginRoot, \"loader/react-loader.js\");\nconst cssLoaderPath = \"file://\" + join(pluginRoot, \"loader/css-loader.js\");\n\n// Register react-loader\nregister(loaderPath, {\n parentURL: pluginRoot,\n data: { port: reactLoaderChannel.port1 },\n transferList: [reactLoaderChannel.port1],\n});\nregister(cssLoaderPath, {\n parentURL: pluginRoot,\n data: { port: cssLoaderChannel.port1 },\n transferList: [cssLoaderChannel.port1],\n});\n\n// Register loaders\nregisterTsx();\n// Signal ready with environment\nparentPort?.on(\"message\", messageHandler);\nparentPort?.postMessage({\n type: \"READY\",\n env: process.env[\"NODE_ENV\"],\n pid: process.pid,\n});\n\nif (process.env[\"NODE_ENV\"] !== \"development\") {\n throw new Error(\"This module must be run in development mode\");\n}\n"],"names":["registerTsx"],"mappings":";;;;;;;;;;;;AAyDA,IAAI,CAAC,UAAA,EAAkB,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAGtE,MAAM,kBAAA,GAAqB,IAAI,cAAe,EAAA;AAC9C,MAAM,gBAAA,GAAmB,IAAI,cAAe,EAAA;AAG5C,kBAAmB,CAAA,KAAA,CAAM,EAAG,CAAA,SAAA,EAAW,cAAc,CAAA;AACrD,gBAAiB,CAAA,KAAA,CAAM,EAAG,CAAA,SAAA,EAAW,cAAc,CAAA;AAEnD,MAAM,UAAa,GAAA,SAAA,GAAY,IAAK,CAAA,UAAA,EAAY,wBAAwB,CAAA;AACxE,MAAM,aAAgB,GAAA,SAAA,GAAY,IAAK,CAAA,UAAA,EAAY,sBAAsB,CAAA;AAGzE,QAAA,CAAS,UAAY,EAAA;AAAA,EACnB,SAAW,EAAA,UAAA;AAAA,EACX,IAAM,EAAA,EAAE,IAAM,EAAA,kBAAA,CAAmB,KAAM,EAAA;AAAA,EACvC,YAAA,EAAc,CAAC,kBAAA,CAAmB,KAAK;AACzC,CAAC,CAAA;AACD,QAAA,CAAS,aAAe,EAAA;AAAA,EACtB,SAAW,EAAA,UAAA;AAAA,EACX,IAAM,EAAA,EAAE,IAAM,EAAA,gBAAA,CAAiB,KAAM,EAAA;AAAA,EACrC,YAAA,EAAc,CAAC,gBAAA,CAAiB,KAAK;AACvC,CAAC,CAAA;AAGDA,UAAY,EAAA;AAEZ,UAAY,EAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AACxC,UAAA,EAAY,WAAY,CAAA;AAAA,EACtB,IAAM,EAAA,OAAA;AAAA,EACN,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAAA,EAC3B,KAAK,OAAQ,CAAA;AACf,CAAC,CAAA;AAED,IAAI,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA,KAAM,aAAe,EAAA;AAC7C,EAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA;AAC/D"}
@@ -5,12 +5,7 @@
5
5
  */
6
6
  import { messageHandler } from './messageHandler.js';
7
7
  import { parentPort } from 'node:worker_threads';
8
- import { Window } from 'happy-dom';
9
8
 
10
- const window = new Window({ url: "https://localhost:8080" });
11
- const document = window.document;
12
- globalThis.window = window;
13
- globalThis.document = document;
14
9
  if (!parentPort) throw new Error("This module must be run as a worker");
15
10
  parentPort?.on("message", messageHandler);
16
11
  parentPort?.postMessage({
@@ -18,4 +13,7 @@ parentPort?.postMessage({
18
13
  env: process.env["NODE_ENV"],
19
14
  pid: process.pid
20
15
  });
16
+ if (process.env["NODE_ENV"] !== "production") {
17
+ throw new Error("This module must be run in development mode");
18
+ }
21
19
  //# sourceMappingURL=html-worker.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-worker.production.js","sources":["../../../../plugin/worker/html/html-worker.production.tsx"],"sourcesContent":["import { messageHandler } from \"./messageHandler.js\";\nimport { parentPort } from \"node:worker_threads\";\nimport { Window } from 'happy-dom';\nconst window = new Window({ url: 'https://localhost:8080' });\nconst document = window.document;\nglobalThis.window = window as any;\nglobalThis.document = document as any;\n\nlet ready = false;\nif (!parentPort) throw new Error(\"This module must be run as a worker\");\n\n// Signal ready with environment\nparentPort?.on(\"message\", messageHandler);\nparentPort?.postMessage({ \n type: \"READY\", \n env: process.env[\"NODE_ENV\"],\n pid: process.pid \n});\n"],"names":[],"mappings":";;;;;;;;;AAGA,MAAM,SAAS,IAAI,MAAA,CAAO,EAAE,GAAA,EAAK,0BAA0B,CAAA;AAC3D,MAAM,WAAW,MAAO,CAAA,QAAA;AACxB,UAAA,CAAW,MAAS,GAAA,MAAA;AACpB,UAAA,CAAW,QAAW,GAAA,QAAA;AAGtB,IAAI,CAAC,UAAA,EAAkB,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAGtE,UAAY,EAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AACxC,UAAA,EAAY,WAAY,CAAA;AAAA,EACpB,IAAM,EAAA,OAAA;AAAA,EACN,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAAA,EAC3B,KAAK,OAAQ,CAAA;AACjB,CAAC,CAAA"}
1
+ {"version":3,"file":"html-worker.production.js","sources":["../../../../plugin/worker/html/html-worker.production.tsx"],"sourcesContent":["import { messageHandler } from \"./messageHandler.js\";\nimport { parentPort } from \"node:worker_threads\";\n\nif (!parentPort) throw new Error(\"This module must be run as a worker\");\n\n// Signal ready with environment\nparentPort?.on(\"message\", messageHandler);\nparentPort?.postMessage({\n type: \"READY\",\n env: process.env[\"NODE_ENV\"],\n pid: process.pid,\n});\n\nif (process.env[\"NODE_ENV\"] !== \"production\") {\n throw new Error(\"This module must be run in development mode\");\n}"],"names":[],"mappings":";;;;;;;;AAGA,IAAI,CAAC,UAAA,EAAkB,MAAA,IAAI,MAAM,qCAAqC,CAAA;AAGtE,UAAY,EAAA,EAAA,CAAG,WAAW,cAAc,CAAA;AACxC,UAAA,EAAY,WAAY,CAAA;AAAA,EACtB,IAAM,EAAA,OAAA;AAAA,EACN,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAAA,EAC3B,KAAK,OAAQ,CAAA;AACf,CAAC,CAAA;AAED,IAAI,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA,KAAM,YAAc,EAAA;AAC5C,EAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA;AAC/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/messageHandler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAatE,eAAO,MAAM,cAAc,YAAmB,iBAAiB,kBAyG9D,CAAC"}
1
+ {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/messageHandler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAYtE,eAAO,MAAM,cAAc,YAAmB,iBAAiB,kBAgH9D,CAAC"}
@@ -8,7 +8,6 @@ import { parentPort } from 'node:worker_threads';
8
8
  import * as ReactDOMServer from 'react-dom/server';
9
9
  import 'react';
10
10
  import { createFromNodeStream } from 'react-server-dom-esm/client.node';
11
- import { join } from 'path';
12
11
 
13
12
  const activeRenders = /* @__PURE__ */ new Map();
14
13
  const htmlContent = /* @__PURE__ */ new Map();
@@ -28,7 +27,7 @@ const messageHandler = async (message) => {
28
27
  moduleRootPath,
29
28
  moduleBaseURL,
30
29
  outDir: "",
31
- htmlOutputPath: htmlOutputPath ?? join(process.cwd(), "index.html"),
30
+ htmlOutputPath,
32
31
  pipableStreamOptions
33
32
  });
34
33
  } else {
@@ -73,6 +72,13 @@ const messageHandler = async (message) => {
73
72
  reactElements,
74
73
  {
75
74
  ...render.pipableStreamOptions,
75
+ // Calculate relative paths based on route depth
76
+ bootstrapModules: render.pipableStreamOptions?.bootstrapModules?.map((path) => {
77
+ if (!path) return path;
78
+ const depth = id.split("/").filter(Boolean).length;
79
+ const prefix = depth > 0 ? "../".repeat(depth) : "/";
80
+ return path.startsWith("/") ? prefix + path.slice(1) : prefix + path;
81
+ }),
76
82
  onShellReady() {
77
83
  parentPort?.postMessage({ type: "SHELL_READY", id });
78
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messageHandler.js","sources":["../../../../plugin/worker/html/messageHandler.ts"],"sourcesContent":["import { PassThrough } from \"node:stream\";\nimport { parentPort } from \"node:worker_threads\";\nimport type { HtmlRenderState, HtmlWorkerMessage } from \"../types.js\";\nimport * as ReactDOMServer from \"react-dom/server\";\nimport React from \"react\";\nimport {\n createFromNodeStream,\n // @ts-ignore\n} from \"react-server-dom-esm/client.node\";\nimport { join } from \"path\";\n\n// Track active renders and streams\nconst activeRenders = new Map<string, HtmlRenderState>();\nconst htmlContent = new Map<string, string>();\nconst htmlPromises = new Map<string, Promise<string>>();\nexport const messageHandler = async (message: HtmlWorkerMessage) => {\n try {\n switch (message.type) {\n case \"RSC_CHUNK\": {\n const { id, chunk, moduleRootPath, moduleBaseURL, htmlOutputPath, pipableStreamOptions } = message;\n \n const render = activeRenders.get(id);\n if (!render) {\n activeRenders.set(id, {\n chunks: [chunk],\n id,\n complete: false,\n rendered: false,\n moduleRootPath,\n moduleBaseURL,\n outDir: '',\n htmlOutputPath: htmlOutputPath ?? join(process.cwd(), 'index.html'),\n pipableStreamOptions: pipableStreamOptions,\n });\n } else {\n render.chunks = [...render.chunks, chunk];\n }\n break;\n }\n\n case \"RSC_END\": {\n const { id } = message;\n const render = activeRenders.get(id);\n if (!render) {\n throw new Error(`No render state found for ${id}`);\n }\n\n // Mark this render as complete\n render.complete = true;\n\n // Create a PassThrough stream to handle the chunks\n const rscStream = new PassThrough();\n\n // Write all chunks to the stream\n for (const chunk of render.chunks) {\n rscStream.write(chunk);\n }\n rscStream.end();\n \n // Create React elements from stream\n const reactElements = await createFromNodeStream(\n rscStream,\n render.moduleRootPath,\n 'localhost'\n );\n\n // Create a promise that resolves when HTML is complete\n const htmlPromise = new Promise<string>((resolve) => {\n const collectStream = new PassThrough();\n let html = '';\n\n collectStream.on(\"data\", (chunk) => {\n html += chunk.toString();\n });\n\n collectStream.on(\"end\", () => {\n resolve(html);\n render.rendered = true;\n parentPort?.postMessage({\n type: \"ALL_READY\",\n id,\n html,\n outputPath: render.htmlOutputPath,\n });\n });\n // Render to pipeable stream\n const stream = ReactDOMServer.renderToPipeableStream(\n reactElements as React.ReactNode,\n {\n ...render.pipableStreamOptions,\n onShellReady() {\n parentPort?.postMessage({ type: \"SHELL_READY\", id });\n }\n }\n );\n\n // Pipe to collection stream\n stream.pipe(collectStream);\n });\n\n htmlPromises.set(id, htmlPromise);\n\n // Clean up resources\n rscStream.destroy();\n activeRenders.delete(id);\n htmlContent.delete(id);\n htmlPromises.delete(id);\n break;\n }\n\n case \"SHUTDOWN\": {\n console.log('Received shutdown signal');\n parentPort?.close();\n break;\n }\n }\n } catch (error) {\n console.error('Error in messageHandler:', error);\n throw error;\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messageHandler.js","sources":["../../../../plugin/worker/html/messageHandler.ts"],"sourcesContent":["import { PassThrough } from \"node:stream\";\nimport { parentPort } from \"node:worker_threads\";\nimport type { HtmlRenderState, HtmlWorkerMessage } from \"../types.js\";\nimport * as ReactDOMServer from \"react-dom/server\";\nimport React from \"react\";\nimport {\n createFromNodeStream,\n // @ts-ignore\n} from \"react-server-dom-esm/client.node\";\n\n// Track active renders and streams\nconst activeRenders = new Map<string, HtmlRenderState>();\nconst htmlContent = new Map<string, string>();\nconst htmlPromises = new Map<string, Promise<string>>();\nexport const messageHandler = async (message: HtmlWorkerMessage) => {\n try {\n switch (message.type) {\n case \"RSC_CHUNK\": {\n const { id, chunk, moduleRootPath, moduleBaseURL, htmlOutputPath, pipableStreamOptions } = message;\n \n const render = activeRenders.get(id);\n if (!render) {\n activeRenders.set(id, {\n chunks: [chunk],\n id,\n complete: false,\n rendered: false,\n moduleRootPath,\n moduleBaseURL,\n outDir: '',\n htmlOutputPath: htmlOutputPath,\n pipableStreamOptions: pipableStreamOptions,\n });\n } else {\n render.chunks = [...render.chunks, chunk];\n }\n break;\n }\n\n case \"RSC_END\": {\n const { id } = message;\n const render = activeRenders.get(id);\n if (!render) {\n throw new Error(`No render state found for ${id}`);\n }\n\n // Mark this render as complete\n render.complete = true;\n\n // Create a PassThrough stream to handle the chunks\n const rscStream = new PassThrough();\n\n // Write all chunks to the stream\n for (const chunk of render.chunks) {\n rscStream.write(chunk);\n }\n rscStream.end();\n \n // Create React elements from stream\n const reactElements = await createFromNodeStream(\n rscStream,\n render.moduleRootPath,\n 'localhost'\n );\n\n // Create a promise that resolves when HTML is complete\n const htmlPromise = new Promise<string>((resolve) => {\n const collectStream = new PassThrough();\n let html = '';\n\n collectStream.on(\"data\", (chunk) => {\n html += chunk.toString();\n });\n\n collectStream.on(\"end\", () => {\n resolve(html);\n render.rendered = true;\n parentPort?.postMessage({\n type: \"ALL_READY\",\n id,\n html,\n outputPath: render.htmlOutputPath,\n });\n });\n // Render to pipeable stream\n const stream = ReactDOMServer.renderToPipeableStream(\n reactElements as React.ReactNode,\n {\n ...render.pipableStreamOptions,\n // Calculate relative paths based on route depth\n bootstrapModules: render.pipableStreamOptions?.bootstrapModules?.map(path => {\n if (!path) return path;\n const depth = id.split('/').filter(Boolean).length ;\n const prefix = depth > 0 ? '../'.repeat(depth) : '/';\n return path.startsWith('/') ? prefix + path.slice(1) : prefix + path;\n }),\n onShellReady() {\n parentPort?.postMessage({ type: \"SHELL_READY\", id });\n }\n }\n );\n\n // Pipe to collection stream\n stream.pipe(collectStream);\n });\n\n htmlPromises.set(id, htmlPromise);\n\n // Clean up resources\n rscStream.destroy();\n activeRenders.delete(id);\n htmlContent.delete(id);\n htmlPromises.delete(id);\n break;\n }\n\n case \"SHUTDOWN\": {\n console.log('Received shutdown signal');\n parentPort?.close();\n break;\n }\n }\n } catch (error) {\n console.error('Error in messageHandler:', error);\n throw error;\n }\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAG/C,OAAO,KAAK,EAAuB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAM/E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA2F1E"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAG/C,OAAO,KAAK,EAAuB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAM/E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA0F1E"}
@@ -1,10 +1,10 @@
1
1
  import { join, resolve } from "path";
2
2
  import { DEFAULT_CONFIG } from "../../config/defaults.js";
3
- import { getPluginRoot } from "../../config/getPaths.js";
3
+ import { pluginRoot } from "../../root.js";
4
4
  import { resolveOptions } from "../../config/resolveOptions.js";
5
5
  let userOptions;
6
6
  export function reactHtmlWorkerPlugin(options) {
7
- const resolvedUserOptions = resolveOptions(options);
7
+ const resolvedUserOptions = resolveOptions(options, false);
8
8
  if (resolvedUserOptions.type === 'error') {
9
9
  throw resolvedUserOptions.error;
10
10
  }
@@ -13,7 +13,6 @@ export function reactHtmlWorkerPlugin(options) {
13
13
  name: "vite:react-html-worker",
14
14
  config(config) {
15
15
  const root = config.root ?? process.cwd();
16
- const pluginRoot = getPluginRoot();
17
16
  const htmlWorkerPath = typeof options.htmlWorkerPath === 'string'
18
17
  ? resolve(root, options.htmlWorkerPath)
19
18
  : resolve(pluginRoot, DEFAULT_CONFIG.HTML_WORKER_PATH);
@@ -1,7 +1,6 @@
1
1
  import type { Worker } from "node:worker_threads";
2
- import type { CheckFilesExistReturn, ResolvedUserConfig, ResolvedUserOptions } from "../../types.js";
3
- import type { Manifest } from "vite";
4
- import type { PluginContext } from "rollup";
2
+ import type { CheckFilesExistReturn, PageData, ResolvedUserConfig, ResolvedUserOptions } from "../../types.js";
3
+ import type { Manifest, IndexHtmlTransformHook } from "vite";
5
4
  interface PipeableStreamOptions {
6
5
  bootstrapModules?: string[];
7
6
  bootstrapScripts?: string[];
@@ -27,11 +26,16 @@ type RenderPagesOptions = {
27
26
  pipableStreamOptions?: PipeableStreamOptions;
28
27
  loader: (id: string) => Promise<Record<string, any>>;
29
28
  onCssFile?: (url: string, parentUrl: string) => void;
29
+ onClientJSFile?: (url: string, parentUrl: string) => void;
30
+ onPage?: (pageData: PageData) => Promise<void>;
30
31
  clientCss?: string[];
31
32
  moduleBasePath: string;
32
33
  moduleBaseURL: string;
34
+ transformIndexHtml: IndexHtmlTransformHook;
35
+ outDir: string;
36
+ htmlOutputPath: string;
33
37
  };
34
- export declare function renderPages(pluginContext: PluginContext, routes: string[], files: CheckFilesExistReturn, options: RenderPagesOptions): Promise<{
38
+ export declare function renderPages(routes: string[], files: CheckFilesExistReturn, options: RenderPagesOptions): Promise<{
35
39
  failedRoutes: Map<string, Error>;
36
40
  completedRoutes: Set<string>;
37
41
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"renderPages.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/renderPages.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAKrG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,KAAK,EACV,aAAa,EACd,MAAM,QAAQ,CAAC;AAIhB,UAAU,qBAAqB;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAsB,WAAW,CAC/B,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,kBAAkB;;;GAuM5B"}
1
+ {"version":3,"file":"renderPages.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/html/renderPages.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EACV,qBAAqB,EACrB,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,MAAM,CAAC;AAG7D,UAAU,qBAAqB;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,sBAAsB,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,qBAAqB,EAC5B,OAAO,EAAE,kBAAkB;;;GA0O5B"}
@@ -3,37 +3,62 @@
3
3
  * Copyright (c) Nico Brinkkemper
4
4
  * MIT License
5
5
  */
6
- import { mkdirSync } from 'node:fs';
7
- import { writeFile } from 'node:fs/promises';
8
- import { dirname, join } from 'node:path';
6
+ import { mkdir, writeFile } from 'node:fs/promises';
7
+ import { join, dirname } from 'node:path';
9
8
  import { Transform } from 'node:stream';
10
- import { createHandler } from '../../react-server/createHandler.js';
9
+ import { createHandler } from '../../helpers/createHandler.js';
11
10
  import React__default from 'react';
12
- import { collectManifestCss } from '../../collect-css-manifest.js';
13
11
 
14
- async function renderPages(pluginContext, routes, files, options) {
15
- const root = pluginContext.environment.config.root;
16
- pluginContext.environment.config.build.outDir;
12
+ async function renderPages(routes, files, options) {
17
13
  const failedRoutes = /* @__PURE__ */ new Map();
18
14
  const completedRoutes = /* @__PURE__ */ new Set();
19
15
  const clientCss = options.clientCss ?? [];
16
+ const partialPageData = /* @__PURE__ */ new Map();
17
+ const mergeAndSendPageData = async (route, resolve) => {
18
+ const partial = partialPageData.get(route);
19
+ if (!partial?.html || !partial.rsc) {
20
+ return;
21
+ }
22
+ const pageData = {
23
+ route,
24
+ html: partial.html,
25
+ rsc: partial.rsc
26
+ };
27
+ console.log("route", route);
28
+ let routeHtmlPath = route === "/" ? options.htmlOutputPath : options.htmlOutputPath.replace("index.html", join(route, "index.html"));
29
+ if (routeHtmlPath.startsWith("/")) {
30
+ routeHtmlPath = routeHtmlPath.slice(1);
31
+ }
32
+ const routeRscPath = routeHtmlPath.slice(0, -5) + ".rsc";
33
+ await mkdir(dirname(routeHtmlPath), { recursive: true });
34
+ await writeFile(routeRscPath, partial.rsc.content);
35
+ await writeFile(routeHtmlPath, partial.html.raw);
36
+ await options.onPage?.(pageData);
37
+ completedRoutes.add(route);
38
+ if (completedRoutes.size === routes.length) {
39
+ resolve();
40
+ }
41
+ };
20
42
  try {
21
43
  const allRoutesComplete = new Promise((resolve, reject) => {
22
- options.worker.on("message", (msg) => {
44
+ options.worker.on("message", async (msg) => {
23
45
  switch (msg.type) {
24
46
  case "ALL_READY": {
25
- const { id, html, outputPath } = msg;
26
- mkdirSync(dirname(outputPath), { recursive: true });
27
- writeFile(outputPath, html).then(() => {
28
- completedRoutes.add(id);
29
- if (completedRoutes.size === routes.length) {
30
- resolve();
31
- }
32
- }).catch((error) => {
33
- console.error("Write error for route:", id, error);
47
+ const { id, html } = msg;
48
+ try {
49
+ const partial = partialPageData.get(id) || { route: id };
50
+ partial.html = {
51
+ raw: html,
52
+ transformed: "",
53
+ // Will be set by main thread transform
54
+ assets: []
55
+ };
56
+ partialPageData.set(id, partial);
57
+ await mergeAndSendPageData(id, resolve);
58
+ } catch (error) {
34
59
  failedRoutes.set(id, error);
35
60
  reject(error);
36
- });
61
+ }
37
62
  break;
38
63
  }
39
64
  case "ERROR": {
@@ -45,18 +70,6 @@ async function renderPages(pluginContext, routes, files, options) {
45
70
  }
46
71
  });
47
72
  });
48
- const newCssFiles = collectManifestCss(
49
- options.clientManifest,
50
- options.moduleBasePath,
51
- "index.html",
52
- (url, parentUrl) => {
53
- options?.onCssFile?.(url, parentUrl);
54
- if (!clientCss.includes(url)) {
55
- clientCss.push(url);
56
- }
57
- },
58
- join(root, options.pluginOptions.build.outDir, options.pluginOptions.build.client)
59
- );
60
73
  for (const route of routes) {
61
74
  const routeFiles = files.urlMap.get(route);
62
75
  if (!routeFiles) {
@@ -64,79 +77,101 @@ async function renderPages(pluginContext, routes, files, options) {
64
77
  failedRoutes.set(route, new Error(`No files found for ${route}`));
65
78
  continue;
66
79
  }
67
- collectManifestCss(
68
- options.serverManifest,
69
- options.moduleBasePath,
70
- routeFiles.page,
71
- (url, parentUrl) => {
72
- options.onCssFile?.(url, parentUrl);
73
- if (!clientCss.includes(url)) {
74
- clientCss.push(url);
75
- }
80
+ if (options.pipableStreamOptions?.importMap?.imports) {
81
+ for (let [, value] of Object.entries(
82
+ options.pipableStreamOptions?.importMap?.imports
83
+ )) {
84
+ options.onClientJSFile?.(value, route);
76
85
  }
77
- );
78
- const rscResult = await createHandler(route, {
79
- ...options.pluginOptions,
80
- Html: React__default.Fragment
81
- // Use Fragment for pure RSC output
82
- }, {
83
- loader: options.loader,
84
- clientManifest: options.clientManifest,
85
- serverManifest: options.serverManifest,
86
- cssFiles: Array.from(newCssFiles.values()).concat(clientCss),
87
- pipableStreamOptions: {
88
- ...options.pipableStreamOptions,
89
- importMap: {
90
- imports: {
91
- ...options.pipableStreamOptions?.importMap?.imports
86
+ }
87
+ const rscResult = await createHandler({
88
+ url: route,
89
+ urlMap: files.urlMap,
90
+ pluginOptions: {
91
+ ...options.pluginOptions,
92
+ Html: React__default.Fragment
93
+ // Use Fragment for pure RSC output
94
+ },
95
+ streamOptions: {
96
+ loader: options.loader,
97
+ clientManifest: options.clientManifest,
98
+ serverManifest: options.serverManifest,
99
+ cssFiles: clientCss,
100
+ moduleBasePath: "",
101
+ moduleBaseURL: "",
102
+ pipableStreamOptions: {
103
+ ...options.pipableStreamOptions,
104
+ importMap: {
105
+ imports: {
106
+ ...options.pipableStreamOptions?.importMap?.imports
107
+ }
92
108
  }
93
109
  }
94
110
  }
95
111
  });
96
- const htmlResult = await createHandler(route, options.pluginOptions, {
97
- loader: options.loader,
98
- clientManifest: options.clientManifest,
99
- serverManifest: options.serverManifest,
100
- cssFiles: clientCss,
101
- pipableStreamOptions: {
102
- ...options.pipableStreamOptions,
103
- importMap: {
104
- imports: {
105
- ...options.pipableStreamOptions?.importMap?.imports
112
+ const htmlResult = await createHandler({
113
+ url: route,
114
+ urlMap: files.urlMap,
115
+ pluginOptions: options.pluginOptions,
116
+ streamOptions: {
117
+ loader: options.loader,
118
+ clientManifest: options.clientManifest,
119
+ serverManifest: options.serverManifest,
120
+ cssFiles: clientCss,
121
+ moduleBasePath: "",
122
+ moduleBaseURL: "",
123
+ pipableStreamOptions: {
124
+ ...options.pipableStreamOptions,
125
+ importMap: {
126
+ imports: {
127
+ ...options.pipableStreamOptions?.importMap?.imports
128
+ }
106
129
  }
107
130
  }
108
131
  }
109
132
  });
110
133
  if (rscResult.type !== "success" || htmlResult.type !== "success") {
111
- console.error("Handler failed for route:", route);
134
+ if (rscResult.type !== "success") {
135
+ if (rscResult.type !== "skip") {
136
+ console.error("Handler failed for route:", route, rscResult.error);
137
+ }
138
+ }
139
+ if (htmlResult.type !== "success") {
140
+ if (htmlResult.type !== "skip") {
141
+ console.error("Handler failed for route:", route, htmlResult.error);
142
+ }
143
+ }
112
144
  failedRoutes.set(route, new Error(`Handler failed for ${route}`));
113
145
  continue;
114
146
  }
115
147
  await Promise.all([
116
- // Save RSC stream to .rsc file in client directory
148
+ // Handle RSC stream
117
149
  new Promise((resolve, reject) => {
118
150
  const chunks = [];
119
151
  const rscTransform = new Transform({
120
152
  transform(chunk, _encoding, callback) {
121
153
  try {
122
- chunks.push(Buffer.from(chunk));
123
- callback(null, chunk);
154
+ if (chunk) {
155
+ chunks.push(Buffer.from(chunk));
156
+ callback(null, chunk);
157
+ }
124
158
  } catch (error) {
125
159
  callback(error);
126
160
  }
127
161
  },
128
- flush(callback) {
162
+ async flush(callback) {
129
163
  try {
130
- const rscPath = join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.rsc");
131
- mkdirSync(dirname(rscPath), { recursive: true });
132
- writeFile(rscPath, Buffer.concat(chunks)).then(() => {
133
- callback();
134
- resolve();
135
- }).catch((error) => {
136
- console.error("RSC write error:", error);
137
- callback(error);
138
- reject(error);
139
- });
164
+ const rscContent = Buffer.concat(chunks).toString("utf-8");
165
+ const partial = partialPageData.get(route) || { route };
166
+ partial.rsc = {
167
+ modules: [],
168
+ // Will be parsed by the client
169
+ content: rscContent
170
+ };
171
+ partialPageData.set(route, partial);
172
+ await mergeAndSendPageData(route, resolve);
173
+ callback();
174
+ resolve();
140
175
  } catch (error) {
141
176
  callback(error);
142
177
  reject(error);
@@ -146,7 +181,7 @@ async function renderPages(pluginContext, routes, files, options) {
146
181
  rscResult.stream.pipe(rscTransform);
147
182
  }),
148
183
  // Send HTML stream to worker
149
- new Promise((resolve, reject) => {
184
+ new Promise((resolve) => {
150
185
  const htmlTransform = new Transform({
151
186
  transform(chunk, _encoding, callback) {
152
187
  try {
@@ -154,9 +189,9 @@ async function renderPages(pluginContext, routes, files, options) {
154
189
  type: "RSC_CHUNK",
155
190
  id: route,
156
191
  chunk: chunk.toString(),
157
- moduleRootPath: join(root, options.pluginOptions.build.outDir, options.pluginOptions.build.client),
192
+ moduleRootPath: options.moduleBasePath,
158
193
  moduleBaseURL: options.moduleBaseURL,
159
- htmlOutputPath: join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.html"),
194
+ htmlOutputPath: options.htmlOutputPath,
160
195
  pipableStreamOptions: options.pipableStreamOptions
161
196
  });
162
197
  callback(null, chunk);
@@ -1 +1 @@
1
- {"version":3,"file":"renderPages.js","sources":["../../../../plugin/worker/html/renderPages.ts"],"sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve as resolvePath } from \"node:path\";\nimport { Transform } from \"node:stream\";\nimport type { Worker } from \"node:worker_threads\";\nimport { createHandler } from \"../../react-server/createHandler.js\";\nimport type { CheckFilesExistReturn, ResolvedUserConfig, ResolvedUserOptions } from \"../../types.js\";\nimport type {\n HtmlWorkerResponse,\n WorkerRscChunkMessage,\n} from \"../types.js\";\nimport type { Manifest } from \"vite\";\nimport type {\n PluginContext,\n} from \"rollup\";\nimport React from \"react\";\nimport { collectManifestCss } from \"../../collect-css-manifest.js\";\n\ninterface PipeableStreamOptions {\n bootstrapModules?: string[];\n bootstrapScripts?: string[];\n bootstrapScriptContent?: string;\n signal?: AbortSignal;\n identifierPrefix?: string;\n namespaceURI?: string;\n nonce?: string;\n progressiveChunkSize?: number;\n onShellReady?: () => void;\n onAllReady?: () => void;\n onError?: (error: unknown) => void;\n importMap?: {\n imports?: Record<string, string>;\n };\n}\n\ntype RenderPagesOptions = {\n pluginOptions: ResolvedUserOptions;\n userConfig: ResolvedUserConfig;\n clientManifest: Manifest;\n serverManifest: Manifest;\n worker: Worker;\n pipableStreamOptions?: PipeableStreamOptions;\n loader: (id: string) => Promise<Record<string, any>>;\n onCssFile?: (url: string, parentUrl: string) => void;\n clientCss?: string[];\n moduleBasePath: string;\n moduleBaseURL: string;\n};\n\nexport async function renderPages(\n pluginContext: PluginContext,\n routes: string[],\n files: CheckFilesExistReturn,\n options: RenderPagesOptions,\n) {\n const root = pluginContext.environment.config.root;\n const outDir = pluginContext.environment.config.build.outDir;\n const failedRoutes = new Map<string, Error>();\n const completedRoutes = new Set<string>();\n const writePromises = new Map<string, Promise<void>>();\n const clientCss = options.clientCss ?? [];\n try {\n // Set up worker message handling\n const allRoutesComplete = new Promise<void>((resolve, reject) => {\n options.worker.on(\"message\", (msg: HtmlWorkerResponse) => {\n switch (msg.type) {\n case \"ALL_READY\": {\n const { id, html, outputPath } = msg;\n mkdirSync(dirname(outputPath), { recursive: true });\n \n writeFile(outputPath, html)\n .then(() => {\n completedRoutes.add(id);\n if (completedRoutes.size === routes.length) {\n resolve();\n }\n })\n .catch((error) => {\n console.error('Write error for route:', id, error);\n failedRoutes.set(id, error as Error);\n reject(error);\n });\n break;\n }\n case \"ERROR\": {\n console.error('Worker error for route:', msg.id, msg.error);\n failedRoutes.set(msg.id, new Error(msg.error));\n reject(new Error(msg.error));\n break;\n }\n }\n });\n });\n\n const newCssFiles = collectManifestCss(\n options.clientManifest,\n options.moduleBasePath,\n 'index.html',\n (url, parentUrl)=>{\n options?.onCssFile?.(url, parentUrl);\n if(!clientCss.includes(url)){\n clientCss.push(url);\n }\n },\n join(root, options.pluginOptions.build.outDir, options.pluginOptions.build.client)\n );\n\n // Process routes sequentially\n for (const route of routes) {\n const routeFiles = files.urlMap.get(route);\n if (!routeFiles) {\n console.error('No files found for route:', route);\n failedRoutes.set(route, new Error(`No files found for ${route}`));\n continue;\n }\n\n collectManifestCss(\n options.serverManifest,\n options.moduleBasePath,\n routeFiles.page,\n (url, parentUrl)=>{\n options.onCssFile?.(url, parentUrl);\n if(!clientCss.includes(url)){\n clientCss.push(url);\n }\n }\n );\n // Create handler for pure RSC output\n const rscResult = await createHandler(route, {\n ...options.pluginOptions,\n Html: React.Fragment // Use Fragment for pure RSC output\n }, {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n cssFiles: Array.from(newCssFiles.values()).concat(clientCss),\n pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n }\n }\n },\n });\n\n // Create handler for HTML output\n const htmlResult = await createHandler(route, options.pluginOptions, {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n cssFiles: clientCss,\n pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports\n }\n }\n },\n });\n\n if (rscResult.type !== \"success\" || htmlResult.type !== \"success\") {\n console.error('Handler failed for route:', route);\n failedRoutes.set(route, new Error(`Handler failed for ${route}`));\n continue;\n }\n\n // Process both streams\n await Promise.all([\n // Save RSC stream to .rsc file in client directory\n new Promise<void>((resolve, reject) => {\n const chunks: Buffer[] = [];\n const rscTransform = new Transform({\n transform(chunk, _encoding, callback) {\n try {\n chunks.push(Buffer.from(chunk));\n callback(null, chunk);\n } catch (error) {\n callback(error as Error);\n }\n },\n flush(callback) {\n try {\n const rscPath = join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, 'index.rsc');\n \n // Ensure directory exists\n mkdirSync(dirname(rscPath), { recursive: true });\n \n // Write complete file\n writeFile(rscPath, Buffer.concat(chunks))\n .then(() => {\n callback();\n resolve();\n })\n .catch(error => {\n console.error('RSC write error:', error);\n callback(error as Error);\n reject(error);\n });\n } catch (error) {\n callback(error as Error);\n reject(error);\n }\n }\n });\n\n rscResult.stream.pipe(rscTransform);\n }),\n\n // Send HTML stream to worker\n new Promise<void>((resolve, reject) => {\n const htmlTransform = new Transform({\n transform(chunk, _encoding, callback) {\n try {\n options.worker.postMessage({\n type: \"RSC_CHUNK\",\n id: route,\n chunk: chunk.toString(),\n moduleRootPath: join(root, options.pluginOptions.build.outDir, options.pluginOptions.build.client),\n moduleBaseURL: options.moduleBaseURL,\n htmlOutputPath: join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, 'index.html'),\n pipableStreamOptions: options.pipableStreamOptions,\n });\n callback(null, chunk);\n } catch (error) {\n callback(error as Error);\n }\n },\n flush(callback) {\n options.worker.postMessage({\n type: \"RSC_END\",\n id: route,\n });\n callback();\n resolve();\n }\n });\n\n htmlResult.stream.pipe(htmlTransform);\n })\n ]);\n }\n\n await allRoutesComplete;\n\n } catch (error) {\n console.error('Render error:', error);\n throw error;\n }\n\n return { failedRoutes, completedRoutes };\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"renderPages.js","sources":["../../../../plugin/worker/html/renderPages.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { Transform } from \"node:stream\";\nimport type { Worker } from \"node:worker_threads\";\nimport { createHandler } from \"../../helpers/createHandler.js\";\nimport type {\n CheckFilesExistReturn,\n PageData,\n ResolvedUserConfig,\n ResolvedUserOptions,\n} from \"../../types.js\";\nimport type { HtmlWorkerResponse } from \"../types.js\";\nimport type { Manifest, IndexHtmlTransformHook } from \"vite\";\nimport React from \"react\";\n\ninterface PipeableStreamOptions {\n bootstrapModules?: string[];\n bootstrapScripts?: string[];\n bootstrapScriptContent?: string;\n signal?: AbortSignal;\n identifierPrefix?: string;\n namespaceURI?: string;\n nonce?: string;\n progressiveChunkSize?: number;\n onShellReady?: () => void;\n onAllReady?: () => void;\n onError?: (error: unknown) => void;\n importMap?: {\n imports?: Record<string, string>;\n };\n}\n\ntype RenderPagesOptions = {\n pluginOptions: ResolvedUserOptions;\n userConfig: ResolvedUserConfig;\n clientManifest: Manifest;\n serverManifest: Manifest;\n worker: Worker;\n pipableStreamOptions?: PipeableStreamOptions;\n loader: (id: string) => Promise<Record<string, any>>;\n onCssFile?: (url: string, parentUrl: string) => void;\n onClientJSFile?: (url: string, parentUrl: string) => void;\n onPage?: (pageData: PageData) => Promise<void>;\n clientCss?: string[];\n moduleBasePath: string;\n moduleBaseURL: string;\n transformIndexHtml: IndexHtmlTransformHook;\n outDir: string;\n htmlOutputPath: string;\n};\n\nexport async function renderPages(\n routes: string[],\n files: CheckFilesExistReturn,\n options: RenderPagesOptions\n) {\n const failedRoutes = new Map<string, Error>();\n const completedRoutes = new Set<string>();\n const clientCss = options.clientCss ?? [];\n const partialPageData = new Map<string, Partial<PageData>>();\n \n const mergeAndSendPageData = async (route: string, resolve: () => void) => {\n const partial = partialPageData.get(route);\n if (!partial?.html || !partial.rsc) {\n return; // Wait for both parts\n }\n\n const pageData: PageData = {\n route,\n html: partial.html,\n rsc: partial.rsc,\n };\n\n // Write RSC file\n console.log('route', route)\n // Write HTML file\n let routeHtmlPath = route === '/' ? options.htmlOutputPath : options.htmlOutputPath.replace('index.html', join(route, 'index.html'));\n if(routeHtmlPath.startsWith('/')) {\n routeHtmlPath = routeHtmlPath.slice(1);\n }\n const routeRscPath = routeHtmlPath.slice(0, -5) + '.rsc';\n await mkdir(dirname(routeHtmlPath), { recursive: true });\n await writeFile(routeRscPath, partial.rsc.content); \n await writeFile(routeHtmlPath, partial.html.raw);\n\n await options.onPage?.(pageData);\n completedRoutes.add(route);\n if (completedRoutes.size === routes.length) {\n resolve();\n }\n };\n\n try {\n // Set up worker message handling\n const allRoutesComplete = new Promise<void>((resolve, reject) => {\n options.worker.on(\"message\", async (msg: HtmlWorkerResponse) => {\n switch (msg.type) {\n case \"ALL_READY\": {\n const { id, html } = msg;\n try {\n const partial = partialPageData.get(id) || { route: id };\n\n partial.html = {\n raw: html,\n transformed: \"\", // Will be set by main thread transform\n assets: [],\n };\n partialPageData.set(id, partial);\n await mergeAndSendPageData(id, resolve);\n } catch (error) {\n failedRoutes.set(id, error as Error);\n reject(error);\n }\n break;\n }\n case \"ERROR\": {\n console.error(\"Worker error for route:\", msg.id, msg.error);\n failedRoutes.set(msg.id, new Error(msg.error));\n reject(new Error(msg.error));\n break;\n }\n }\n });\n });\n\n // Process routes sequentially\n for (const route of routes) {\n const routeFiles = files.urlMap.get(route);\n if (!routeFiles) {\n console.error(\"No files found for route:\", route);\n failedRoutes.set(route, new Error(`No files found for ${route}`));\n continue;\n }\n\n if (options.pipableStreamOptions?.importMap?.imports) {\n for (let [, value] of Object.entries(\n options.pipableStreamOptions?.importMap?.imports\n )) {\n options.onClientJSFile?.(value, route);\n }\n }\n\n // Create handler for pure RSC output\n const rscResult = await createHandler({\n url: route,\n urlMap: files.urlMap,\n pluginOptions: {\n ...options.pluginOptions,\n Html: React.Fragment, // Use Fragment for pure RSC output\n },\n streamOptions: {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n cssFiles: clientCss,\n moduleBasePath: '',\n moduleBaseURL: '',\n pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n },\n },\n },\n },\n });\n\n // Create handler for HTML output\n const htmlResult = await createHandler({\n url: route,\n urlMap: files.urlMap,\n pluginOptions: options.pluginOptions,\n streamOptions: {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n cssFiles: clientCss,\n moduleBasePath: '',\n moduleBaseURL: '',\n pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n },\n },\n },\n },\n });\n\n if (rscResult.type !== \"success\" || htmlResult.type !== \"success\") {\n if (rscResult.type !== \"success\") {\n if (rscResult.type !== \"skip\") {\n console.error(\"Handler failed for route:\", route, rscResult.error);\n }\n }\n if (htmlResult.type !== \"success\") {\n if (htmlResult.type !== \"skip\") {\n console.error(\"Handler failed for route:\", route, htmlResult.error);\n }\n }\n failedRoutes.set(route, new Error(`Handler failed for ${route}`));\n continue;\n }\n\n // Process both streams\n await Promise.all([\n // Handle RSC stream\n new Promise<void>((resolve, reject) => {\n const chunks: Buffer[] = [];\n const rscTransform = new Transform({\n transform(chunk, _encoding, callback) {\n try {\n if (chunk) {\n chunks.push(Buffer.from(chunk));\n callback(null, chunk);\n }\n } catch (error) {\n callback(error as Error);\n }\n },\n async flush(callback) {\n try {\n const rscContent = Buffer.concat(chunks).toString(\"utf-8\");\n\n // Update partial page data with raw RSC content\n const partial = partialPageData.get(route) || { route };\n partial.rsc = {\n modules: [], // Will be parsed by the client\n content: rscContent,\n };\n partialPageData.set(route, partial);\n await mergeAndSendPageData(route, resolve);\n\n callback();\n resolve();\n } catch (error) {\n callback(error as Error);\n reject(error);\n }\n },\n });\n\n rscResult.stream.pipe(rscTransform);\n }),\n\n // Send HTML stream to worker\n new Promise<void>((resolve) => {\n const htmlTransform = new Transform({\n transform(chunk, _encoding, callback) {\n try {\n options.worker.postMessage({\n type: \"RSC_CHUNK\",\n id: route,\n chunk: chunk.toString(),\n moduleRootPath: options.moduleBasePath,\n moduleBaseURL: options.moduleBaseURL,\n htmlOutputPath: options.htmlOutputPath,\n pipableStreamOptions: options.pipableStreamOptions,\n });\n callback(null, chunk);\n } catch (error) {\n callback(error as Error);\n }\n },\n flush(callback) {\n options.worker.postMessage({\n type: \"RSC_END\",\n id: route,\n });\n callback();\n resolve();\n },\n });\n\n htmlResult.stream.pipe(htmlTransform);\n }),\n ]);\n }\n\n await allRoutesComplete;\n } catch (error) {\n console.error(\"Render error:\", error);\n throw error;\n }\n\n return { failedRoutes, completedRoutes };\n}\n"],"names":["React"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,aAAa,CAAC;AA8BrB,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,iBA8F7D"}
1
+ {"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAIrB,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,iBAyG7D"}