vite-plugin-react-server 0.3.18 → 1.0.0

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 (246) hide show
  1. package/README.md +220 -141
  2. package/bin/patch.mjs +8 -2
  3. package/dist/package.json +15 -8
  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 +131 -0
  10. package/dist/plugin/collect-manifest-client-files.js.map +1 -0
  11. package/dist/plugin/components.d.ts +3 -13
  12. package/dist/plugin/components.d.ts.map +1 -1
  13. package/dist/plugin/components.js +3 -13
  14. package/dist/plugin/config/defaults.d.ts +14 -6
  15. package/dist/plugin/config/defaults.d.ts.map +1 -1
  16. package/dist/plugin/config/defaults.js +9 -5
  17. package/dist/plugin/config/defaults.js.map +1 -1
  18. package/dist/plugin/config/getPaths.d.ts +0 -1
  19. package/dist/plugin/config/getPaths.d.ts.map +1 -1
  20. package/dist/plugin/config/getPaths.js +2 -7
  21. package/dist/plugin/config/getPaths.js.map +1 -1
  22. package/dist/plugin/config/mimeTypes.d.ts +2 -0
  23. package/dist/plugin/config/mimeTypes.d.ts.map +1 -0
  24. package/dist/plugin/config/mimeTypes.js +24 -0
  25. package/dist/plugin/config/mimeTypes.js.map +1 -0
  26. package/dist/plugin/config/resolveOptions.d.ts +2 -2
  27. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  28. package/dist/plugin/config/resolveOptions.js +47 -28
  29. package/dist/plugin/config/resolveOptions.js.map +1 -1
  30. package/dist/plugin/config/resolvePages.d.ts +1 -0
  31. package/dist/plugin/config/resolvePages.d.ts.map +1 -1
  32. package/dist/plugin/config/resolvePages.js +9 -5
  33. package/dist/plugin/config/resolvePages.js.map +1 -1
  34. package/dist/plugin/config/resolveUserConfig.d.ts +2 -1
  35. package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
  36. package/dist/plugin/config/resolveUserConfig.js +181 -147
  37. package/dist/plugin/config/resolveUserConfig.js.map +1 -1
  38. package/dist/plugin/copy-dir.js +23 -18
  39. package/dist/plugin/copy-dir.js.map +1 -0
  40. package/dist/plugin/css-collector-inline.d.ts +10 -0
  41. package/dist/plugin/css-collector-inline.d.ts.map +1 -0
  42. package/dist/plugin/css-collector-inline.js +55 -0
  43. package/dist/plugin/css-collector-inline.js.map +1 -0
  44. package/dist/plugin/css-collector.d.ts +14 -0
  45. package/dist/plugin/css-collector.d.ts.map +1 -0
  46. package/dist/plugin/css-collector.js +49 -0
  47. package/dist/plugin/css-collector.js.map +1 -0
  48. package/dist/plugin/helpers/createHandler.d.ts +17 -0
  49. package/dist/plugin/helpers/createHandler.d.ts.map +1 -0
  50. package/dist/plugin/helpers/createHandler.js +111 -0
  51. package/dist/plugin/helpers/createHandler.js.map +1 -0
  52. package/dist/plugin/helpers/createRscStream.d.ts +27 -0
  53. package/dist/plugin/helpers/createRscStream.d.ts.map +1 -0
  54. package/dist/plugin/helpers/createRscStream.js +80 -0
  55. package/dist/plugin/helpers/createRscStream.js.map +1 -0
  56. package/dist/plugin/helpers/getBundleManifest.d.ts.map +1 -1
  57. package/dist/plugin/helpers/getBundleManifest.js +12 -4
  58. package/dist/plugin/helpers/getBundleManifest.js.map +1 -1
  59. package/dist/plugin/html.d.ts +5 -0
  60. package/dist/plugin/html.d.ts.map +1 -0
  61. package/dist/plugin/html.js +11 -0
  62. package/dist/plugin/html.js.map +1 -0
  63. package/dist/plugin/loader/createBuildLoader.d.ts +1 -1
  64. package/dist/plugin/loader/createBuildLoader.d.ts.map +1 -1
  65. package/dist/plugin/loader/createBuildLoader.js +8 -5
  66. package/dist/plugin/loader/createBuildLoader.js.map +1 -1
  67. package/dist/plugin/loader/css-loader.d.ts.map +1 -1
  68. package/dist/plugin/loader/css-loader.js.map +1 -1
  69. package/dist/plugin/loader/react-loader.js +2 -2
  70. package/dist/plugin/loader/react-loader.js.map +1 -1
  71. package/dist/plugin/preserver/plugin.d.ts.map +1 -1
  72. package/dist/plugin/preserver/plugin.js +49 -14
  73. package/dist/plugin/preserver/plugin.js.map +1 -1
  74. package/dist/plugin/react-client/plugin.d.ts.map +1 -1
  75. package/dist/plugin/react-client/plugin.js +21 -78
  76. package/dist/plugin/react-client/plugin.js.map +1 -1
  77. package/dist/plugin/react-server/index.d.ts.map +1 -1
  78. package/dist/plugin/react-server/index.js +2 -0
  79. package/dist/plugin/react-server/index.js.map +1 -1
  80. package/dist/plugin/react-server/plugin.d.ts +2 -1
  81. package/dist/plugin/react-server/plugin.d.ts.map +1 -1
  82. package/dist/plugin/react-server/plugin.js +92 -225
  83. package/dist/plugin/react-server/plugin.js.map +1 -1
  84. package/dist/plugin/react-static/index.d.ts +2 -0
  85. package/dist/plugin/react-static/index.d.ts.map +1 -0
  86. package/dist/plugin/react-static/index.js +1 -0
  87. package/dist/plugin/react-static/plugin.d.ts +7 -0
  88. package/dist/plugin/react-static/plugin.d.ts.map +1 -0
  89. package/dist/plugin/react-static/plugin.js +207 -0
  90. package/dist/plugin/react-static/plugin.js.map +1 -0
  91. package/dist/plugin/react-static/types.d.ts +2 -0
  92. package/dist/plugin/react-static/types.d.ts.map +1 -0
  93. package/dist/plugin/resolvePage.d.ts.map +1 -1
  94. package/dist/plugin/resolvePage.js +9 -0
  95. package/dist/plugin/resolvePage.js.map +1 -1
  96. package/dist/plugin/root.d.ts +2 -0
  97. package/dist/plugin/root.d.ts.map +1 -0
  98. package/dist/plugin/root.js +12 -0
  99. package/dist/plugin/root.js.map +1 -0
  100. package/dist/plugin/transformer/plugin.d.ts.map +1 -1
  101. package/dist/plugin/transformer/plugin.js +32 -23
  102. package/dist/plugin/transformer/plugin.js.map +1 -1
  103. package/dist/plugin/transformer/types.d.ts +1 -18
  104. package/dist/plugin/transformer/types.d.ts.map +1 -1
  105. package/dist/plugin/types.d.ts +70 -15
  106. package/dist/plugin/types.d.ts.map +1 -1
  107. package/dist/plugin/worker/createWorker.js +0 -1
  108. package/dist/plugin/worker/createWorker.js.map +1 -1
  109. package/dist/plugin/worker/html/html-worker.development.d.ts +30 -0
  110. package/dist/plugin/worker/html/html-worker.development.d.ts.map +1 -1
  111. package/dist/plugin/worker/html/html-worker.development.js +30 -2
  112. package/dist/plugin/worker/html/html-worker.development.js.map +1 -1
  113. package/dist/plugin/worker/html/html-worker.production.js +3 -5
  114. package/dist/plugin/worker/html/html-worker.production.js.map +1 -1
  115. package/dist/plugin/worker/html/messageHandler.d.ts.map +1 -1
  116. package/dist/plugin/worker/html/messageHandler.js +12 -3
  117. package/dist/plugin/worker/html/messageHandler.js.map +1 -1
  118. package/dist/plugin/worker/html/renderPages.d.ts +13 -26
  119. package/dist/plugin/worker/html/renderPages.d.ts.map +1 -1
  120. package/dist/plugin/worker/html/renderPages.js +138 -86
  121. package/dist/plugin/worker/html/renderPages.js.map +1 -1
  122. package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
  123. package/dist/plugin/worker/rsc/messageHandler.js +104 -84
  124. package/dist/plugin/worker/rsc/messageHandler.js.map +1 -1
  125. package/dist/plugin/worker/rsc/rsc-worker.development.js +13 -18
  126. package/dist/plugin/worker/rsc/rsc-worker.development.js.map +1 -1
  127. package/dist/plugin/worker/rsc/rsc-worker.production.js +4 -1
  128. package/dist/plugin/worker/rsc/rsc-worker.production.js.map +1 -1
  129. package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
  130. package/dist/plugin/worker/rsc/state.js.map +1 -1
  131. package/dist/plugin/worker/types.d.ts +3 -0
  132. package/dist/plugin/worker/types.d.ts.map +1 -1
  133. package/dist/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +14 -6
  135. package/plugin/checkFilesExist.ts +7 -3
  136. package/plugin/collect-manifest-client-files.ts +167 -0
  137. package/plugin/components.ts +3 -0
  138. package/plugin/config/defaults.tsx +70 -0
  139. package/plugin/config/getPaths.ts +1 -7
  140. package/plugin/config/mimeTypes.ts +17 -0
  141. package/plugin/config/resolveOptions.ts +58 -45
  142. package/plugin/config/resolvePages.ts +8 -4
  143. package/plugin/config/resolveUserConfig.ts +220 -176
  144. package/plugin/css-collector-inline.tsx +60 -0
  145. package/plugin/css-collector.tsx +62 -0
  146. package/plugin/helpers/createHandler.ts +135 -0
  147. package/plugin/helpers/createRscStream.ts +109 -0
  148. package/plugin/helpers/getBundleManifest.ts +14 -5
  149. package/plugin/html.tsx +9 -0
  150. package/plugin/loader/createBuildLoader.ts +9 -6
  151. package/plugin/loader/css-loader.ts +0 -2
  152. package/plugin/loader/react-loader.ts +2 -2
  153. package/plugin/preserver/plugin.ts +64 -17
  154. package/plugin/react-client/plugin.ts +23 -93
  155. package/plugin/react-server/index.ts +2 -0
  156. package/plugin/react-server/plugin.ts +111 -302
  157. package/plugin/react-static/index.ts +1 -0
  158. package/plugin/react-static/plugin.ts +256 -0
  159. package/plugin/react-static/types.ts +3 -0
  160. package/plugin/resolvePage.ts +9 -0
  161. package/plugin/root.ts +4 -0
  162. package/plugin/transformer/plugin.ts +40 -31
  163. package/plugin/transformer/types.ts +0 -19
  164. package/plugin/types.ts +77 -16
  165. package/plugin/worker/createWorker.ts +1 -1
  166. package/plugin/worker/html/README.md +63 -0
  167. package/plugin/worker/html/html-worker.development.tsx +89 -2
  168. package/plugin/worker/html/html-worker.production.tsx +8 -10
  169. package/plugin/worker/html/messageHandler.ts +12 -3
  170. package/plugin/worker/html/renderPages.ts +178 -138
  171. package/plugin/worker/rsc/README.md +58 -0
  172. package/plugin/worker/rsc/messageHandler.tsx +112 -113
  173. package/plugin/worker/rsc/rsc-worker.development.ts +12 -22
  174. package/plugin/worker/rsc/rsc-worker.production.ts +5 -1
  175. package/plugin/worker/rsc/state.ts +0 -3
  176. package/plugin/worker/types.ts +3 -0
  177. package/scripts/react+0.0.0-experimental-eda36a1c-20250228.patch +114 -12
  178. package/scripts/react-dom+0.0.0-experimental-eda36a1c-20250228.patch +10571 -121
  179. package/tsconfig.json +2 -2
  180. package/dist/plugin/collect-css-manifest.d.ts +0 -4
  181. package/dist/plugin/collect-css-manifest.d.ts.map +0 -1
  182. package/dist/plugin/collect-css-manifest.js +0 -65
  183. package/dist/plugin/collect-css-manifest.js.map +0 -1
  184. package/dist/plugin/config/createModuleIdGenerator.d.ts +0 -11
  185. package/dist/plugin/config/createModuleIdGenerator.d.ts.map +0 -1
  186. package/dist/plugin/config/createModuleIdGenerator.js +0 -44
  187. package/dist/plugin/config/createModuleIdGenerator.js.map +0 -1
  188. package/dist/plugin/getEnv.d.ts +0 -19
  189. package/dist/plugin/getEnv.d.ts.map +0 -1
  190. package/dist/plugin/getEnv.js +0 -107
  191. package/dist/plugin/loader/createCssLoader.d.ts +0 -30
  192. package/dist/plugin/loader/createCssLoader.d.ts.map +0 -1
  193. package/dist/plugin/loader/createCssLoader.js +0 -35
  194. package/dist/plugin/loader/createPageLoader.d.ts +0 -24
  195. package/dist/plugin/loader/createPageLoader.d.ts.map +0 -1
  196. package/dist/plugin/loader/createPageLoader.js +0 -50
  197. package/dist/plugin/loader/rsc/messageHandler.d.ts +0 -2
  198. package/dist/plugin/loader/rsc/messageHandler.d.ts.map +0 -1
  199. package/dist/plugin/loader/rsc/rsc-worker.development.d.ts +0 -2
  200. package/dist/plugin/loader/rsc/rsc-worker.development.d.ts.map +0 -1
  201. package/dist/plugin/loader/rsc/rsc-worker.development.js +0 -1
  202. package/dist/plugin/module-graph.d.ts +0 -10
  203. package/dist/plugin/module-graph.d.ts.map +0 -1
  204. package/dist/plugin/module-graph.js +0 -35
  205. package/dist/plugin/react-server/createHandler.d.ts +0 -17
  206. package/dist/plugin/react-server/createHandler.d.ts.map +0 -1
  207. package/dist/plugin/react-server/createHandler.js +0 -126
  208. package/dist/plugin/react-server/createHandler.js.map +0 -1
  209. package/dist/plugin/react-server/createRscStream.d.ts +0 -16
  210. package/dist/plugin/react-server/createRscStream.d.ts.map +0 -1
  211. package/dist/plugin/react-server/createRscStream.js +0 -70
  212. package/dist/plugin/react-server/createRscStream.js.map +0 -1
  213. package/dist/plugin/react-server/createSsrHandler.d.ts +0 -4
  214. package/dist/plugin/react-server/createSsrHandler.d.ts.map +0 -1
  215. package/dist/plugin/react-server/createSsrHandler.js +0 -95
  216. package/dist/plugin/utils/logger.d.ts +0 -9
  217. package/dist/plugin/utils/logger.d.ts.map +0 -1
  218. package/dist/plugin/utils/logger.js +0 -68
  219. package/dist/plugin/utils/logger.js.map +0 -1
  220. package/dist/plugin/worker/html/plugin.d.ts +0 -4
  221. package/dist/plugin/worker/html/plugin.d.ts.map +0 -1
  222. package/dist/plugin/worker/html/plugin.js +0 -94
  223. package/dist/plugin/worker/plugin.d.ts +0 -19
  224. package/dist/plugin/worker/plugin.d.ts.map +0 -1
  225. package/dist/plugin/worker/plugin.js +0 -23
  226. package/dist/plugin/worker/rsc/plugin.d.ts +0 -4
  227. package/dist/plugin/worker/rsc/plugin.d.ts.map +0 -1
  228. package/dist/plugin/worker/rsc/plugin.js +0 -76
  229. package/plugin/collect-css-manifest.ts +0 -82
  230. package/plugin/components.tsx +0 -14
  231. package/plugin/config/createModuleIdGenerator.ts +0 -52
  232. package/plugin/config/defaults.ts +0 -51
  233. package/plugin/getEnv.ts +0 -135
  234. package/plugin/loader/createCssLoader.ts +0 -73
  235. package/plugin/loader/createPageLoader.ts +0 -103
  236. package/plugin/loader/rsc/messageHandler.tsx +0 -1
  237. package/plugin/loader/rsc/rsc-worker.development.ts +0 -1
  238. package/plugin/module-graph.ts +0 -48
  239. package/plugin/react-server/createHandler.ts +0 -162
  240. package/plugin/react-server/createRscStream.ts +0 -86
  241. package/plugin/react-server/createSsrHandler.ts +0 -125
  242. package/plugin/utils/logger.ts +0 -52
  243. package/plugin/worker/html/plugin.ts +0 -101
  244. package/plugin/worker/plugin.ts +0 -26
  245. package/plugin/worker/rsc/plugin.ts +0 -84
  246. /package/dist/plugin/{loader/rsc/messageHandler.js → react-static/types.js} +0 -0
@@ -3,37 +3,70 @@
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';
10
+ import { createLogger } from 'vite';
11
11
  import React__default from 'react';
12
- import { collectManifestCss } from '../../collect-css-manifest.js';
12
+ import { collectManifestClientFiles } from '../../collect-manifest-client-files.js';
13
13
 
14
- async function renderPages(pluginContext, routes, files, options) {
15
- const root = pluginContext.environment.config.root;
16
- pluginContext.environment.config.build.outDir;
14
+ async function renderPages(routes, files, options) {
17
15
  const failedRoutes = /* @__PURE__ */ new Map();
18
16
  const completedRoutes = /* @__PURE__ */ new Set();
19
17
  const clientCss = options.clientCss ?? [];
18
+ const partialPageData = /* @__PURE__ */ new Map();
19
+ const moduleRootPath = options.moduleBasePath !== "" && !options.moduleRootPath.endsWith(options.moduleBasePath) ? join(options.moduleRootPath, options.moduleBasePath) : options.moduleRootPath;
20
+ const mergeAndSendPageData = async (route, resolve) => {
21
+ const partial = partialPageData.get(route);
22
+ if (!partial?.html || !partial.rsc) {
23
+ return;
24
+ }
25
+ const pageData = {
26
+ route,
27
+ html: partial.html,
28
+ rsc: partial.rsc
29
+ };
30
+ let routeHtmlPath = route === "/" ? options.htmlOutputPath : options.htmlOutputPath.replace(
31
+ "index.html",
32
+ join(route, "index.html")
33
+ );
34
+ if (routeHtmlPath.startsWith("/")) {
35
+ routeHtmlPath = routeHtmlPath.slice(1);
36
+ }
37
+ const routeRscPath = routeHtmlPath.slice(0, -5) + ".rsc";
38
+ await mkdir(dirname(routeHtmlPath), { recursive: true });
39
+ await writeFile(routeRscPath, partial.rsc.content);
40
+ await writeFile(routeHtmlPath, partial.html.raw);
41
+ await options.onPage?.(pageData);
42
+ completedRoutes.add(route);
43
+ if (completedRoutes.size === routes.length) {
44
+ resolve();
45
+ }
46
+ };
20
47
  try {
21
48
  const allRoutesComplete = new Promise((resolve, reject) => {
22
- options.worker.on("message", (msg) => {
49
+ options.worker.on("message", async (msg) => {
23
50
  switch (msg.type) {
24
51
  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);
52
+ const { id, html } = msg;
53
+ try {
54
+ const partial = partialPageData.get(id) || { route: id };
55
+ partial.html = {
56
+ raw: html,
57
+ transformed: typeof options.transformIndexHtml === "function" ? String(await options.transformIndexHtml(id, {
58
+ path: id,
59
+ filename: join(id, "index.html")
60
+ }) || "") : "",
61
+ // Will be set by main thread transform
62
+ assets: []
63
+ };
64
+ partialPageData.set(id, partial);
65
+ await mergeAndSendPageData(id, resolve);
66
+ } catch (error) {
34
67
  failedRoutes.set(id, error);
35
68
  reject(error);
36
- });
69
+ }
37
70
  break;
38
71
  }
39
72
  case "ERROR": {
@@ -45,18 +78,6 @@ async function renderPages(pluginContext, routes, files, options) {
45
78
  }
46
79
  });
47
80
  });
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
81
  for (const route of routes) {
61
82
  const routeFiles = files.urlMap.get(route);
62
83
  if (!routeFiles) {
@@ -64,79 +85,110 @@ async function renderPages(pluginContext, routes, files, options) {
64
85
  failedRoutes.set(route, new Error(`No files found for ${route}`));
65
86
  continue;
66
87
  }
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
- }
88
+ if (options.pipableStreamOptions?.importMap?.imports) {
89
+ for (let [, value] of Object.entries(
90
+ options.pipableStreamOptions?.importMap?.imports
91
+ )) {
92
+ options.onClientJSFile?.(value, route);
76
93
  }
77
- );
78
- const rscResult = await createHandler(route, {
79
- ...options.pluginOptions,
80
- Html: React__default.Fragment
81
- // Use Fragment for pure RSC output
82
- }, {
94
+ }
95
+ const getCss = async (id) => {
96
+ const cssFiles = collectManifestClientFiles({
97
+ manifest: options.serverManifest,
98
+ root: options.root,
99
+ pagePath: id
100
+ }).cssFiles;
101
+ return cssFiles;
102
+ };
103
+ const pagePath = files.urlMap.get(route)?.page;
104
+ const propsPath = files.urlMap.get(route)?.props;
105
+ if (!pagePath) {
106
+ throw new Error(`No page path found for ${route}`);
107
+ }
108
+ const rscResult = await createHandler({
109
+ root: options.root,
110
+ url: route,
111
+ route,
112
+ getCss,
83
113
  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
92
- }
93
- }
94
- }
114
+ cssFiles: clientCss,
115
+ moduleBase: options.moduleBase,
116
+ moduleBasePath: options.moduleBasePath,
117
+ moduleRootPath,
118
+ moduleBaseURL: options.moduleBaseURL,
119
+ pipableStreamOptions: options.pipableStreamOptions ?? {},
120
+ inlineCss: options.inlineCss,
121
+ Html: React__default.Fragment,
122
+ CssCollector: options.CssCollector,
123
+ pagePath,
124
+ propsPath,
125
+ pageExportName: options.pageExportName,
126
+ propsExportName: options.propsExportName,
127
+ logger: createLogger()
95
128
  });
96
- const htmlResult = await createHandler(route, options.pluginOptions, {
129
+ const htmlResult = await createHandler({
130
+ root: options.root,
131
+ url: route,
132
+ route,
133
+ getCss,
97
134
  loader: options.loader,
98
- clientManifest: options.clientManifest,
99
- serverManifest: options.serverManifest,
100
135
  cssFiles: clientCss,
101
- pipableStreamOptions: {
102
- ...options.pipableStreamOptions,
103
- importMap: {
104
- imports: {
105
- ...options.pipableStreamOptions?.importMap?.imports
106
- }
107
- }
108
- }
136
+ moduleBase: options.moduleBase,
137
+ moduleBasePath: options.moduleBasePath,
138
+ moduleRootPath,
139
+ moduleBaseURL: options.moduleBaseURL,
140
+ pipableStreamOptions: options.pipableStreamOptions,
141
+ inlineCss: options.inlineCss,
142
+ Html: options.Html,
143
+ CssCollector: options.CssCollector,
144
+ pagePath,
145
+ propsPath,
146
+ pageExportName: options.pageExportName,
147
+ propsExportName: options.propsExportName,
148
+ logger: createLogger()
109
149
  });
110
150
  if (rscResult.type !== "success" || htmlResult.type !== "success") {
111
- console.error("Handler failed for route:", route);
151
+ if (rscResult.type !== "success") {
152
+ if (rscResult.type !== "skip") {
153
+ console.error("Handler failed for route:", route, rscResult.error);
154
+ }
155
+ }
156
+ if (htmlResult.type !== "success") {
157
+ if (htmlResult.type !== "skip") {
158
+ console.error("Handler failed for route:", route, htmlResult.error);
159
+ }
160
+ }
112
161
  failedRoutes.set(route, new Error(`Handler failed for ${route}`));
113
162
  continue;
114
163
  }
115
164
  await Promise.all([
116
- // Save RSC stream to .rsc file in client directory
165
+ // Handle RSC stream
117
166
  new Promise((resolve, reject) => {
118
167
  const chunks = [];
119
168
  const rscTransform = new Transform({
120
169
  transform(chunk, _encoding, callback) {
121
170
  try {
122
- chunks.push(Buffer.from(chunk));
123
- callback(null, chunk);
171
+ if (chunk) {
172
+ chunks.push(Buffer.from(chunk));
173
+ callback(null, chunk);
174
+ }
124
175
  } catch (error) {
125
176
  callback(error);
126
177
  }
127
178
  },
128
- flush(callback) {
179
+ async flush(callback) {
129
180
  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
- });
181
+ const rscContent = Buffer.concat(chunks).toString("utf-8");
182
+ const partial = partialPageData.get(route) || { route };
183
+ partial.rsc = {
184
+ modules: [],
185
+ // Will be parsed by the client
186
+ content: rscContent
187
+ };
188
+ partialPageData.set(route, partial);
189
+ await mergeAndSendPageData(route, resolve);
190
+ callback();
191
+ resolve();
140
192
  } catch (error) {
141
193
  callback(error);
142
194
  reject(error);
@@ -146,7 +198,7 @@ async function renderPages(pluginContext, routes, files, options) {
146
198
  rscResult.stream.pipe(rscTransform);
147
199
  }),
148
200
  // Send HTML stream to worker
149
- new Promise((resolve, reject) => {
201
+ new Promise((resolve) => {
150
202
  const htmlTransform = new Transform({
151
203
  transform(chunk, _encoding, callback) {
152
204
  try {
@@ -154,9 +206,9 @@ async function renderPages(pluginContext, routes, files, options) {
154
206
  type: "RSC_CHUNK",
155
207
  id: route,
156
208
  chunk: chunk.toString(),
157
- moduleRootPath: join(root, options.pluginOptions.build.outDir, options.pluginOptions.build.client),
209
+ moduleRootPath,
158
210
  moduleBaseURL: options.moduleBaseURL,
159
- htmlOutputPath: join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.html"),
211
+ htmlOutputPath: options.htmlOutputPath,
160
212
  pipableStreamOptions: options.pipableStreamOptions
161
213
  });
162
214
  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 CreateHandlerOptions,\n PageData,\n} from \"../../types.js\";\nimport type { HtmlWorkerResponse } from \"../types.js\";\nimport { type Manifest, type IndexHtmlTransformHook, createLogger } from \"vite\";\nimport React from \"react\";\nimport { collectManifestClientFiles } from \"../../collect-manifest-client-files.js\";\n\ntype RenderPagesOptions<T = any> = Omit<CreateHandlerOptions<T>, \"url\" | \"route\" | \"getCss\" | \"propsPath\" | \"pagePath\"> & {\n clientManifest: Manifest;\n serverManifest: Manifest;\n worker: Worker;\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 transformIndexHtml: IndexHtmlTransformHook;\n outDir: string;\n htmlOutputPath: string;\n server?: any;\n bundle?: any;\n chunk?: any;\n originalUrl?: string;\n};\n\nexport async function renderPages<T = any>(\n routes: string[],\n files: CheckFilesExistReturn,\n options: RenderPagesOptions<T>\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 const moduleRootPath =\n options.moduleBasePath !== \"\" &&\n !options.moduleRootPath.endsWith(options.moduleBasePath)\n ? join(options.moduleRootPath, options.moduleBasePath)\n : options.moduleRootPath;\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 HTML file\n let routeHtmlPath =\n route === \"/\"\n ? options.htmlOutputPath\n : options.htmlOutputPath.replace(\n \"index.html\",\n join(route, \"index.html\")\n );\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:\n typeof options.transformIndexHtml === \"function\"\n ? String(await options.transformIndexHtml(id, {\n path: id,\n filename: join(id, \"index.html\"),\n }) || \"\")\n : \"\", // 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 const getCss = async (id: string) => {\n const cssFiles = collectManifestClientFiles({\n manifest: options.serverManifest,\n root: options.root,\n pagePath: id,\n }).cssFiles;\n return cssFiles;\n }\n const pagePath = files.urlMap.get(route)?.page;\n const propsPath = files.urlMap.get(route)?.props;\n if(!pagePath){\n throw new Error(`No page path found for ${route}`);\n }\n // Create handler for pure RSC output\n const rscResult = await createHandler({\n root: options.root,\n url: route,\n route: route,\n getCss: getCss,\n loader: options.loader,\n cssFiles: clientCss,\n moduleBase: options.moduleBase,\n moduleBasePath: options.moduleBasePath,\n moduleRootPath: moduleRootPath,\n moduleBaseURL: options.moduleBaseURL,\n pipableStreamOptions: options.pipableStreamOptions ?? {},\n inlineCss: options.inlineCss,\n Html: React.Fragment,\n CssCollector: options.CssCollector,\n pagePath: pagePath,\n propsPath: propsPath,\n pageExportName: options.pageExportName,\n propsExportName: options.propsExportName,\n logger: createLogger(),\n });\n // Create handler for HTML output\n const htmlResult = await createHandler({\n root: options.root,\n url: route,\n route: route,\n getCss: getCss,\n loader: options.loader,\n cssFiles: clientCss,\n moduleBase: options.moduleBase,\n moduleBasePath: options.moduleBasePath,\n moduleRootPath: moduleRootPath,\n moduleBaseURL: options.moduleBaseURL,\n pipableStreamOptions: options.pipableStreamOptions,\n inlineCss: options.inlineCss,\n Html: options.Html,\n CssCollector: options.CssCollector,\n pagePath: pagePath,\n propsPath: propsPath,\n pageExportName: options.pageExportName,\n propsExportName: options.propsExportName,\n logger: createLogger(),\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: moduleRootPath,\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":"AAIA,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAMrB,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,iBA0H7D"}
@@ -7,98 +7,118 @@ import { join } from 'node:path';
7
7
  import { PassThrough } from 'node:stream';
8
8
  import { parentPort } from 'node:worker_threads';
9
9
  import React__default from 'react';
10
- import { renderToPipeableStream } from 'react-server-dom-esm/server.node';
11
- import { createLogger } from '../../utils/logger.js';
12
- import { cssFiles, addCssFile } from './state.js';
10
+ import { addCssFile, cssFiles } from './state.js';
11
+ import { InlineCssCollector } from '../../css-collector-inline.js';
12
+ import { createRscStream } from '../../helpers/createRscStream.js';
13
+ import { createLogger } from 'vite';
13
14
 
14
- const log = createLogger("rsc-worker");
15
- function CssCollector({
16
- children,
17
- cssFiles: cssFiles2
18
- }) {
19
- return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, Array.from(cssFiles2.entries()).map(([id, css]) => {
20
- return /* @__PURE__ */ React__default.createElement("style", { key: id, "data-source": id }, css);
21
- }), children);
22
- }
23
15
  async function messageHandler(message) {
24
- if (message.type === "RSC_RENDER") {
25
- const {
26
- id,
27
- pageImport,
28
- propsImport,
29
- pageExportName,
30
- propsExportName,
31
- url,
32
- outDir,
33
- projectRoot,
34
- moduleBaseURL,
35
- moduleBasePath,
36
- pipableStreamOptions
37
- } = message;
38
- try {
39
- const [Component, propsModule] = await Promise.all([
40
- import(join(projectRoot, pageImport)),
41
- import(join(projectRoot, propsImport))
42
- ]);
43
- const propsAtExport = propsModule[propsExportName];
44
- const props = await Promise.resolve(
45
- typeof propsAtExport === "function" ? propsAtExport(url) : propsAtExport
46
- );
47
- const PageComponent = Component[pageExportName];
48
- const stream = renderToPipeableStream(
49
- /* @__PURE__ */ React__default.createElement(CssCollector, { cssFiles }, /* @__PURE__ */ React__default.createElement(PageComponent, { ...props })),
16
+ switch (message.type) {
17
+ case "RSC_RENDER":
18
+ const {
19
+ id,
20
+ pageImport,
21
+ propsImport,
22
+ pageExportName,
23
+ propsExportName,
24
+ url,
25
+ outDir,
26
+ projectRoot,
27
+ moduleRootPath,
50
28
  moduleBaseURL,
51
- {
52
- onError: (error) => {
53
- console.log("onError", error);
54
- log.error(`Stream error at ${id}:`, error);
55
- parentPort?.postMessage({
56
- type: "ERROR",
57
- id,
58
- error: error instanceof Error ? error.message : String(error)
59
- });
60
- },
61
- onPostpone: log?.info ?? console.info,
62
- environmentName: "Server",
63
- importMap: {
64
- imports: {
65
- ...pipableStreamOptions?.importMap?.imports,
66
- "/": moduleBasePath
29
+ moduleBasePath,
30
+ moduleBase,
31
+ pipableStreamOptions
32
+ } = message;
33
+ try {
34
+ const [Component, propsModule] = await Promise.all([
35
+ import(join(projectRoot, pageImport)),
36
+ import(join(projectRoot, propsImport))
37
+ ]);
38
+ const propsAtExport = propsModule[propsExportName];
39
+ const props = await Promise.resolve(
40
+ typeof propsAtExport === "function" ? propsAtExport(url) : propsAtExport
41
+ );
42
+ const PageComponent = Component[pageExportName];
43
+ const stream = createRscStream({
44
+ Html: React__default.Fragment,
45
+ Page: PageComponent,
46
+ CssCollector: InlineCssCollector,
47
+ loader: (id2) => import(id2).then((m) => m.default),
48
+ props,
49
+ moduleBase,
50
+ moduleRootPath,
51
+ moduleBasePath,
52
+ moduleBaseURL,
53
+ logger: createLogger(),
54
+ inlineCss: true,
55
+ cssFiles: Array.from(cssFiles.values()).map((css) => ({
56
+ type: "text/css",
57
+ content: css,
58
+ path: css
59
+ })),
60
+ route: url,
61
+ url: typeof moduleBaseURL === "string" && moduleBaseURL !== "" ? new URL(url, moduleBaseURL).toString() : url,
62
+ root: projectRoot,
63
+ pipableStreamOptions: {
64
+ ...pipableStreamOptions,
65
+ onError: (error) => {
66
+ if (typeof pipableStreamOptions.onError === "function") {
67
+ pipableStreamOptions.onError(error);
68
+ }
69
+ parentPort?.postMessage({
70
+ type: "ERROR",
71
+ id,
72
+ error: error instanceof Error ? error.message : String(error)
73
+ });
74
+ },
75
+ onPostpone: (reason) => {
76
+ if (typeof pipableStreamOptions.onPostpone === "function") {
77
+ pipableStreamOptions.onPostpone(reason);
78
+ }
79
+ parentPort?.postMessage({
80
+ type: "POSTPONE",
81
+ id,
82
+ reason
83
+ });
67
84
  }
68
- },
69
- ...pipableStreamOptions
85
+ }
86
+ });
87
+ if (!stream) {
88
+ throw new Error("Failed to create stream");
70
89
  }
71
- );
72
- const passThrough = new PassThrough();
73
- stream.pipe(passThrough);
74
- passThrough.on("data", (chunk) => {
75
- parentPort?.postMessage({
76
- type: "RSC_CHUNK",
77
- id,
78
- chunk: chunk.toString(),
79
- moduleRootPath: moduleBasePath,
80
- moduleBaseURL,
81
- outDir,
82
- rscOutputPath: `${outDir}/${id}.rsc`,
83
- cssFiles: Array.from(cssFiles.entries())
90
+ const passThrough = new PassThrough();
91
+ stream.pipe(passThrough);
92
+ passThrough.on("data", (chunk) => {
93
+ parentPort?.postMessage({
94
+ type: "RSC_CHUNK",
95
+ id,
96
+ chunk: chunk.toString(),
97
+ moduleRootPath: moduleBasePath,
98
+ moduleBaseURL,
99
+ outDir,
100
+ rscOutputPath: `${outDir}/${id}.rsc`,
101
+ cssFiles: Array.from(cssFiles.entries())
102
+ });
103
+ });
104
+ passThrough.on("end", () => {
105
+ parentPort?.postMessage({
106
+ type: "RSC_END",
107
+ id
108
+ });
84
109
  });
85
- });
86
- passThrough.on("end", () => {
110
+ } catch (error) {
111
+ console.trace(error);
87
112
  parentPort?.postMessage({
88
- type: "RSC_END",
89
- id
113
+ type: "ERROR",
114
+ id,
115
+ error: error instanceof Error ? error.message : String(error)
90
116
  });
91
- });
92
- } catch (error) {
93
- console.trace(error);
94
- parentPort?.postMessage({
95
- type: "ERROR",
96
- id,
97
- error: error instanceof Error ? error.message : String(error)
98
- });
99
- }
100
- } else if (message.type === "CSS_FILE") {
101
- addCssFile(message.id, message.cssFile);
117
+ }
118
+ break;
119
+ case "CSS_FILE":
120
+ addCssFile(message.id, message.cssFile);
121
+ break;
102
122
  }
103
123
  }
104
124
 
@@ -1 +1 @@
1
- {"version":3,"file":"messageHandler.js","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"sourcesContent":["import { join } from \"node:path\";\nimport { PassThrough } from \"node:stream\";\nimport { parentPort } from \"node:worker_threads\";\nimport React from \"react\";\nimport {\n renderToPipeableStream,\n // @ts-ignore\n} from \"react-server-dom-esm/server.node\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport type {\n RscChunkMessage,\n RscEndMessage,\n RscWorkerMessage,\n} from \"../types.js\";\nimport {\n addCssFile,\n cssFiles\n} from \"./state.js\";\n\nconst log = createLogger(\"rsc-worker\");\n\n// CSS collector component\nfunction CssCollector({\n children,\n cssFiles,\n}: {\n children: React.ReactNode;\n cssFiles: Map<string, string>;\n}) {\n return (\n <>\n {Array.from(cssFiles.entries()).map(([id, css]) => {\n return (\n <style key={id} data-source={id}>\n {css}\n </style>\n );\n })}\n {children}\n </>\n );\n}\n\nexport async function messageHandler(message: RscWorkerMessage) {\n\n if (message.type === \"RSC_RENDER\") {\n const {\n id,\n pageImport,\n propsImport,\n pageExportName,\n propsExportName,\n url,\n outDir,\n projectRoot,\n moduleBaseURL,\n moduleBasePath,\n pipableStreamOptions,\n } = message;\n\n try {\n // Load modules which will trigger CSS loading\n const [Component, propsModule] = await Promise.all([\n import(join(projectRoot, pageImport)),\n import(join(projectRoot, propsImport)),\n ]);\n\n const propsAtExport = propsModule[propsExportName];\n const props = await Promise.resolve(\n typeof propsAtExport === \"function\" ? propsAtExport(url) : propsAtExport\n );\n\n const PageComponent = Component[pageExportName];\n // Now render with collected CSS\n const stream = renderToPipeableStream(\n <CssCollector cssFiles={cssFiles}>\n <PageComponent {...props} />\n </CssCollector>,\n moduleBaseURL,\n {\n onError: (error: Error) => {\n console.log('onError', error);\n log.error(`Stream error at ${id}:`, error);\n parentPort?.postMessage({\n type: \"ERROR\",\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n },\n onPostpone: log?.info ?? console.info,\n environmentName: \"Server\",\n importMap: {\n imports: {\n ...pipableStreamOptions?.importMap?.imports,\n \"/\": moduleBasePath,\n },\n },\n ...pipableStreamOptions,\n }\n );\n\n // Listen for data and end events\n const passThrough = new PassThrough();\n\n stream.pipe(passThrough);\n\n passThrough.on(\"data\", (chunk) => {\n // Send to parent\n parentPort?.postMessage({\n type: \"RSC_CHUNK\",\n id,\n chunk: chunk.toString(),\n moduleRootPath: moduleBasePath,\n moduleBaseURL,\n outDir,\n rscOutputPath: `${outDir}/${id}.rsc`,\n cssFiles: Array.from(cssFiles.entries()),\n } satisfies RscChunkMessage);\n });\n\n passThrough.on(\"end\", () => {\n parentPort?.postMessage({\n type: \"RSC_END\",\n id,\n } satisfies RscEndMessage);\n });\n } catch (error) {\n console.trace(error);\n parentPort?.postMessage({\n type: \"ERROR\",\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n } else if (message.type === \"CSS_FILE\") {\n addCssFile(message.id, message.cssFile);\n }\n}\n"],"names":["cssFiles","React"],"mappings":"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"}
1
+ {"version":3,"file":"messageHandler.js","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"sourcesContent":["import { join } from \"node:path\";\nimport { PassThrough } from \"node:stream\";\nimport { parentPort } from \"node:worker_threads\";\nimport React from \"react\";\nimport type {\n RscChunkMessage,\n RscEndMessage,\n RscWorkerMessage,\n} from \"../types.js\";\nimport { addCssFile, cssFiles } from \"./state.js\";\nimport { InlineCssCollector } from \"../../css-collector-inline.js\";\nimport { createRscStream } from \"../../helpers/createRscStream.js\";\nimport { createLogger } from \"vite\";\n\nexport async function messageHandler(message: RscWorkerMessage) {\n switch (message.type) {\n case \"RSC_RENDER\":\n const {\n id,\n pageImport,\n propsImport,\n pageExportName,\n propsExportName,\n url,\n outDir,\n projectRoot,\n moduleRootPath,\n moduleBaseURL,\n moduleBasePath,\n moduleBase,\n pipableStreamOptions,\n } = message;\n\n try {\n // Load modules which will trigger CSS loading\n const [Component, propsModule] = await Promise.all([\n import(join(projectRoot, pageImport)),\n import(join(projectRoot, propsImport)),\n ]);\n\n const propsAtExport = propsModule[propsExportName];\n const props = await Promise.resolve(\n typeof propsAtExport === \"function\"\n ? propsAtExport(url)\n : propsAtExport\n );\n\n const PageComponent = Component[pageExportName];\n\n // Create stream using the helper\n const stream = createRscStream({\n Html: React.Fragment,\n Page: PageComponent,\n CssCollector: InlineCssCollector,\n loader: (id: string) => import(id).then((m) => m.default),\n props,\n moduleBase,\n moduleRootPath,\n moduleBasePath,\n moduleBaseURL,\n logger: createLogger(),\n inlineCss: true,\n cssFiles: Array.from(cssFiles.values()).map((css) => ({\n type: \"text/css\",\n content: css,\n path: css,\n })),\n route: url,\n url: typeof moduleBaseURL === \"string\" && moduleBaseURL !== \"\" ? new URL(url, moduleBaseURL).toString() : url,\n root: projectRoot,\n pipableStreamOptions: {\n ...pipableStreamOptions,\n onError: (error: unknown) => {\n if (typeof pipableStreamOptions.onError === \"function\") {\n pipableStreamOptions.onError(error);\n }\n parentPort?.postMessage({\n type: \"ERROR\",\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n },\n onPostpone: (reason: string) => {\n if (typeof pipableStreamOptions.onPostpone === \"function\") {\n pipableStreamOptions.onPostpone(reason);\n }\n parentPort?.postMessage({\n type: \"POSTPONE\",\n id,\n reason,\n });\n },\n },\n });\n\n if (!stream) {\n throw new Error(\"Failed to create stream\");\n }\n\n // Listen for data and end events\n const passThrough = new PassThrough();\n stream.pipe(passThrough);\n\n passThrough.on(\"data\", (chunk) => {\n // Send to parent\n parentPort?.postMessage({\n type: \"RSC_CHUNK\",\n id,\n chunk: chunk.toString(),\n moduleRootPath: moduleBasePath,\n moduleBaseURL,\n outDir,\n rscOutputPath: `${outDir}/${id}.rsc`,\n cssFiles: Array.from(cssFiles.entries()),\n } satisfies RscChunkMessage);\n });\n\n passThrough.on(\"end\", () => {\n parentPort?.postMessage({\n type: \"RSC_END\",\n id,\n } satisfies RscEndMessage);\n });\n } catch (error) {\n console.trace(error);\n parentPort?.postMessage({\n type: \"ERROR\",\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n break;\n case \"CSS_FILE\":\n addCssFile(message.id, message.cssFile);\n break;\n }\n}\n"],"names":["React","id"],"mappings":"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"}