vite-plugin-react-server 0.3.11 → 0.3.12

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 (220) hide show
  1. package/dist/package.json +15 -11
  2. package/dist/plugin/checkFilesExist.d.ts +2 -2
  3. package/dist/plugin/checkFilesExist.d.ts.map +1 -1
  4. package/dist/plugin/checkFilesExist.js +39 -57
  5. package/dist/plugin/checkFilesExist.js.map +1 -1
  6. package/dist/plugin/collect-css-manifest.d.ts.map +1 -1
  7. package/dist/plugin/collect-css-manifest.js +5 -0
  8. package/dist/plugin/collect-css-manifest.js.map +1 -1
  9. package/dist/plugin/components.js +10 -15
  10. package/dist/plugin/config/createModuleIdGenerator.js +1 -1
  11. package/dist/plugin/config/createModuleIdGenerator.js.map +1 -1
  12. package/dist/plugin/config/defaults.d.ts +5 -14
  13. package/dist/plugin/config/defaults.d.ts.map +1 -1
  14. package/dist/plugin/config/defaults.js +12 -12
  15. package/dist/plugin/config/defaults.js.map +1 -1
  16. package/dist/plugin/config/getPaths.js +1 -1
  17. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  18. package/dist/plugin/config/resolveOptions.js +73 -52
  19. package/dist/plugin/config/resolveOptions.js.map +1 -1
  20. package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
  21. package/dist/plugin/config/resolveUserConfig.js +53 -65
  22. package/dist/plugin/config/resolveUserConfig.js.map +1 -1
  23. package/dist/plugin/helpers/getBundleManifest.d.ts +6 -1
  24. package/dist/plugin/helpers/getBundleManifest.d.ts.map +1 -1
  25. package/dist/plugin/helpers/getBundleManifest.js +48 -19
  26. package/dist/plugin/helpers/getBundleManifest.js.map +1 -1
  27. package/dist/plugin/helpers/inputNormalizer.d.ts +1 -2
  28. package/dist/plugin/helpers/inputNormalizer.d.ts.map +1 -1
  29. package/dist/plugin/helpers/inputNormalizer.js +52 -46
  30. package/dist/plugin/helpers/inputNormalizer.js.map +1 -1
  31. package/dist/plugin/helpers/tryManifest.d.ts +1 -1
  32. package/dist/plugin/helpers/tryManifest.d.ts.map +1 -1
  33. package/dist/plugin/helpers/tryManifest.js.map +1 -1
  34. package/dist/plugin/loader/createBuildLoader.d.ts +1 -1
  35. package/dist/plugin/loader/createBuildLoader.d.ts.map +1 -1
  36. package/dist/plugin/loader/createBuildLoader.js +29 -26
  37. package/dist/plugin/loader/createBuildLoader.js.map +1 -1
  38. package/dist/plugin/loader/css-loader.d.ts +16 -0
  39. package/dist/plugin/loader/css-loader.d.ts.map +1 -0
  40. package/dist/plugin/loader/css-loader.js +70 -0
  41. package/dist/plugin/loader/css-loader.js.map +1 -0
  42. package/dist/plugin/loader/react-loader.d.ts +17 -0
  43. package/dist/plugin/loader/react-loader.d.ts.map +1 -0
  44. package/dist/plugin/loader/react-loader.js +647 -0
  45. package/dist/plugin/loader/react-loader.js.map +1 -0
  46. package/dist/plugin/loader/rsc/messageHandler.d.ts +2 -0
  47. package/dist/plugin/loader/rsc/messageHandler.d.ts.map +1 -0
  48. package/dist/plugin/loader/rsc/messageHandler.js +1 -0
  49. package/dist/plugin/loader/rsc/rsc-worker.development.d.ts +2 -0
  50. package/dist/plugin/loader/rsc/rsc-worker.development.d.ts.map +1 -0
  51. package/dist/plugin/loader/rsc/rsc-worker.development.js +1 -0
  52. package/dist/plugin/react-client/index.js +2 -2
  53. package/dist/plugin/react-client/index.js.map +1 -1
  54. package/dist/plugin/react-client/plugin.d.ts.map +1 -1
  55. package/dist/plugin/react-client/plugin.js +202 -25
  56. package/dist/plugin/react-client/plugin.js.map +1 -1
  57. package/dist/plugin/react-server/createHandler.d.ts.map +1 -1
  58. package/dist/plugin/react-server/createHandler.js +10 -4
  59. package/dist/plugin/react-server/createHandler.js.map +1 -1
  60. package/dist/plugin/react-server/createRscStream.d.ts +15 -3
  61. package/dist/plugin/react-server/createRscStream.d.ts.map +1 -1
  62. package/dist/plugin/react-server/createRscStream.js +52 -49
  63. package/dist/plugin/react-server/createRscStream.js.map +1 -1
  64. package/dist/plugin/react-server/plugin.d.ts.map +1 -1
  65. package/dist/plugin/react-server/plugin.js +24 -20
  66. package/dist/plugin/react-server/plugin.js.map +1 -1
  67. package/dist/plugin/transformer/plugin.d.ts.map +1 -1
  68. package/dist/plugin/transformer/plugin.js +65 -52
  69. package/dist/plugin/transformer/plugin.js.map +1 -1
  70. package/dist/plugin/types.d.ts +5 -0
  71. package/dist/plugin/types.d.ts.map +1 -1
  72. package/dist/plugin/utils/logger.d.ts +9 -0
  73. package/dist/plugin/utils/logger.d.ts.map +1 -0
  74. package/dist/plugin/utils/logger.js +68 -0
  75. package/dist/plugin/utils/logger.js.map +1 -0
  76. package/dist/plugin/worker/createWorker.d.ts +1 -0
  77. package/dist/plugin/worker/createWorker.d.ts.map +1 -1
  78. package/dist/plugin/worker/createWorker.js +23 -36
  79. package/dist/plugin/worker/createWorker.js.map +1 -1
  80. package/dist/plugin/worker/html/html-worker.production.js +5 -1
  81. package/dist/plugin/worker/html/html-worker.production.js.map +1 -1
  82. package/dist/plugin/worker/html/messageHandler.d.ts.map +1 -1
  83. package/dist/plugin/worker/html/messageHandler.js +10 -19
  84. package/dist/plugin/worker/html/messageHandler.js.map +1 -1
  85. package/dist/plugin/worker/html/renderPages.d.ts +2 -2
  86. package/dist/plugin/worker/html/renderPages.d.ts.map +1 -1
  87. package/dist/plugin/worker/html/renderPages.js +130 -131
  88. package/dist/plugin/worker/html/renderPages.js.map +1 -1
  89. package/dist/plugin/worker/rsc/index.d.ts +1 -3
  90. package/dist/plugin/worker/rsc/index.d.ts.map +1 -1
  91. package/dist/plugin/worker/rsc/index.js +1 -9
  92. package/dist/plugin/worker/rsc/index.js.map +1 -1
  93. package/dist/plugin/worker/rsc/messageHandler.d.ts +3 -0
  94. package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -0
  95. package/dist/plugin/worker/rsc/messageHandler.js +107 -0
  96. package/dist/plugin/worker/rsc/messageHandler.js.map +1 -0
  97. package/dist/plugin/worker/rsc/plugin.d.ts.map +1 -1
  98. package/dist/plugin/worker/rsc/plugin.js +74 -80
  99. package/dist/plugin/worker/rsc/rsc-worker.development.d.ts +32 -0
  100. package/dist/plugin/worker/rsc/rsc-worker.development.d.ts.map +1 -0
  101. package/dist/plugin/worker/rsc/rsc-worker.development.js +43 -0
  102. package/dist/plugin/worker/rsc/rsc-worker.development.js.map +1 -0
  103. package/dist/plugin/worker/rsc/rsc-worker.js +4 -106
  104. package/dist/plugin/worker/rsc/rsc-worker.production.d.ts +2 -0
  105. package/dist/plugin/worker/rsc/rsc-worker.production.d.ts.map +1 -0
  106. package/dist/plugin/worker/rsc/rsc-worker.production.js +14 -0
  107. package/dist/plugin/worker/rsc/rsc-worker.production.js.map +1 -0
  108. package/dist/plugin/worker/rsc/state.d.ts +11 -0
  109. package/dist/plugin/worker/rsc/state.d.ts.map +1 -0
  110. package/dist/plugin/worker/rsc/state.js +12 -0
  111. package/dist/plugin/worker/rsc/state.js.map +1 -0
  112. package/dist/plugin/worker/types.d.ts +60 -46
  113. package/dist/plugin/worker/types.d.ts.map +1 -1
  114. package/dist/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +15 -11
  116. package/plugin/checkFilesExist.ts +42 -62
  117. package/plugin/collect-css-manifest.ts +5 -1
  118. package/plugin/config/createModuleIdGenerator.ts +1 -1
  119. package/plugin/config/defaults.ts +13 -15
  120. package/plugin/config/resolveOptions.ts +134 -76
  121. package/plugin/config/resolveUserConfig.ts +75 -76
  122. package/plugin/helpers/getBundleManifest.ts +69 -31
  123. package/plugin/helpers/inputNormalizer.ts +82 -70
  124. package/plugin/helpers/tryManifest.ts +1 -1
  125. package/plugin/loader/createBuildLoader.ts +38 -41
  126. package/plugin/loader/css-loader.ts +96 -0
  127. package/plugin/loader/react-loader.ts +945 -0
  128. package/plugin/loader/rsc/messageHandler.tsx +1 -0
  129. package/plugin/loader/rsc/rsc-worker.development.ts +1 -0
  130. package/plugin/react-client/index.ts +1 -1
  131. package/plugin/react-client/plugin.ts +266 -41
  132. package/plugin/react-server/createHandler.ts +9 -5
  133. package/plugin/react-server/createRscStream.ts +75 -54
  134. package/plugin/react-server/plugin.ts +26 -21
  135. package/plugin/transformer/plugin.ts +67 -76
  136. package/plugin/types/global.d.ts +8 -0
  137. package/plugin/types.ts +2 -0
  138. package/plugin/utils/logger.ts +52 -0
  139. package/plugin/worker/createWorker.ts +43 -44
  140. package/plugin/worker/html/html-worker.production.tsx +7 -2
  141. package/plugin/worker/html/messageHandler.ts +13 -21
  142. package/plugin/worker/html/renderPages.ts +146 -179
  143. package/plugin/worker/rsc/index.ts +4 -13
  144. package/plugin/worker/rsc/messageHandler.tsx +143 -0
  145. package/plugin/worker/rsc/plugin.ts +38 -37
  146. package/plugin/worker/rsc/rsc-worker.development.ts +107 -0
  147. package/plugin/worker/rsc/rsc-worker.production.ts +13 -0
  148. package/plugin/worker/rsc/rsc-worker.tsx +5 -128
  149. package/plugin/worker/rsc/state.ts +37 -0
  150. package/plugin/worker/types.ts +79 -55
  151. package/scripts/check-react-version.mjs +17 -7
  152. package/scripts/react+0.0.0-experimental-b3a95caf-20250113.patch +143 -4170
  153. package/scripts/react-dom+0.0.0-experimental-b3a95caf-20250113.patch +14271 -90079
  154. package/dist/plugin/components.js.map +0 -1
  155. package/dist/plugin/helpers/createClientInputNormalizer.d.ts +0 -8
  156. package/dist/plugin/helpers/createClientInputNormalizer.d.ts.map +0 -1
  157. package/dist/plugin/helpers/createClientInputNormalizer.js +0 -35
  158. package/dist/plugin/helpers/createServerInputNormalizer.d.ts +0 -9
  159. package/dist/plugin/helpers/createServerInputNormalizer.d.ts.map +0 -1
  160. package/dist/plugin/helpers/createServerInputNormalizer.js +0 -37
  161. package/dist/plugin/helpers/createStaticInputNormalizer.d.ts +0 -7
  162. package/dist/plugin/helpers/createStaticInputNormalizer.d.ts.map +0 -1
  163. package/dist/plugin/helpers/createStaticInputNormalizer.js +0 -18
  164. package/dist/plugin/helpers/getModuleManifest.d.ts +0 -17
  165. package/dist/plugin/helpers/getModuleManifest.d.ts.map +0 -1
  166. package/dist/plugin/helpers/getModuleManifest.js +0 -23
  167. package/dist/plugin/helpers/inputNormalizerWorker.d.ts +0 -12
  168. package/dist/plugin/helpers/inputNormalizerWorker.d.ts.map +0 -1
  169. package/dist/plugin/helpers/inputNormalizerWorker.js +0 -33
  170. package/dist/plugin/helpers/normalizedRelativePath.d.ts +0 -11
  171. package/dist/plugin/helpers/normalizedRelativePath.d.ts.map +0 -1
  172. package/dist/plugin/helpers/normalizedRelativePath.js +0 -36
  173. package/dist/plugin/helpers/resolveFilePath.d.ts +0 -13
  174. package/dist/plugin/helpers/resolveFilePath.d.ts.map +0 -1
  175. package/dist/plugin/helpers/resolveFilePath.js +0 -74
  176. package/dist/plugin/helpers/resolveWorkerModule.d.ts +0 -6
  177. package/dist/plugin/helpers/resolveWorkerModule.d.ts.map +0 -1
  178. package/dist/plugin/helpers/resolveWorkerModule.js +0 -24
  179. package/dist/plugin/helpers/validateModuleBase.d.ts +0 -3
  180. package/dist/plugin/helpers/validateModuleBase.d.ts.map +0 -1
  181. package/dist/plugin/helpers/validateModuleBase.js +0 -16
  182. package/dist/plugin/helpers/validateResolvedConfig.d.ts +0 -3
  183. package/dist/plugin/helpers/validateResolvedConfig.d.ts.map +0 -1
  184. package/dist/plugin/helpers/validateResolvedConfig.js +0 -17
  185. package/dist/plugin/transformer/transformer-client-components.d.ts +0 -30
  186. package/dist/plugin/transformer/transformer-client-components.d.ts.map +0 -1
  187. package/dist/plugin/transformer/transformer-client-components.js +0 -122
  188. package/dist/plugin/transformer/transformer-client-components.js.map +0 -1
  189. package/dist/plugin/transformer/transformer-server-actions.d.ts +0 -29
  190. package/dist/plugin/transformer/transformer-server-actions.d.ts.map +0 -1
  191. package/dist/plugin/transformer/transformer-server-actions.js +0 -90
  192. package/dist/plugin/worker/rsc/createRscStream.d.ts +0 -5
  193. package/dist/plugin/worker/rsc/createRscStream.d.ts.map +0 -1
  194. package/dist/plugin/worker/rsc/createRscStream.js +0 -39
  195. package/dist/plugin/worker/rsc/createRscStream.js.map +0 -1
  196. package/dist/plugin/worker/rsc/development.d.ts +0 -5
  197. package/dist/plugin/worker/rsc/development.d.ts.map +0 -1
  198. package/dist/plugin/worker/rsc/development.js +0 -13
  199. package/dist/plugin/worker/rsc/development.js.map +0 -1
  200. package/dist/plugin/worker/rsc/plugin.js.map +0 -1
  201. package/dist/plugin/worker/rsc/production.d.ts +0 -5
  202. package/dist/plugin/worker/rsc/production.d.ts.map +0 -1
  203. package/dist/plugin/worker/rsc/production.js +0 -13
  204. package/dist/plugin/worker/rsc/production.js.map +0 -1
  205. package/plugin/helpers/createClientInputNormalizer.ts +0 -48
  206. package/plugin/helpers/createServerInputNormalizer.ts +0 -52
  207. package/plugin/helpers/createStaticInputNormalizer.ts +0 -26
  208. package/plugin/helpers/getModuleManifest.ts +0 -36
  209. package/plugin/helpers/inputNormalizerWorker.ts +0 -52
  210. package/plugin/helpers/normalizedRelativePath.ts +0 -59
  211. package/plugin/helpers/resolveFilePath.ts +0 -108
  212. package/plugin/helpers/resolveWorkerModule.ts +0 -41
  213. package/plugin/helpers/validateModuleBase.ts +0 -30
  214. package/plugin/helpers/validateResolvedConfig.ts +0 -21
  215. package/plugin/transformer/transformer-client-components.ts +0 -168
  216. package/plugin/transformer/transformer-server-actions.ts +0 -125
  217. package/plugin/worker/rsc/createRscStream.ts +0 -42
  218. package/plugin/worker/rsc/development.ts +0 -6
  219. package/plugin/worker/rsc/production.ts +0 -6
  220. package/scripts/react-server-dom-esm+0.0.1.patch +0 -24775
@@ -4,168 +4,167 @@
4
4
  * MIT License
5
5
  */
6
6
  import { mkdirSync } from 'node:fs';
7
- import { mkdir, writeFile } from 'node:fs/promises';
8
- import { resolve, join, dirname } from 'node:path';
7
+ import { writeFile } from 'node:fs/promises';
8
+ import { dirname, join } from 'node:path';
9
9
  import { Transform } from 'node:stream';
10
10
  import { createHandler } from '../../react-server/createHandler.js';
11
+ import React__default from 'react';
12
+ import { collectManifestCss } from '../../collect-css-manifest.js';
11
13
 
12
- async function renderPages(pluginContext, routes, options) {
13
- const root = pluginContext.environment.config.root ?? options.userConfig.root ?? options.pluginOptions.projectRoot ?? process.cwd();
14
- const outDir = pluginContext.environment.config.build.outDir ?? options.userConfig.build.outDir ?? options.pluginOptions.build.outDir;
15
- pluginContext.environment.config.build.assetsDir ?? options.userConfig.build.assetsDir ?? options.pluginOptions.build.assetsDir;
16
- const isServer = outDir.endsWith(options.pluginOptions.build.server);
17
- const isClient = outDir.endsWith(options.pluginOptions.build.client);
18
- if (!isServer && !isClient) {
19
- throw new Error("Invalid outDir directory");
20
- }
21
- const destinationRoot = isServer ? resolve(
22
- root,
23
- options.pluginOptions.build.outDir,
24
- options.pluginOptions.build.client
25
- ) : join(root, outDir);
14
+ async function renderPages(pluginContext, routes, files, options) {
15
+ const root = pluginContext.environment.config.root;
16
+ pluginContext.environment.config.build.outDir;
26
17
  const failedRoutes = /* @__PURE__ */ new Map();
27
- const moduleRootPath = join(
28
- root,
29
- options.pluginOptions.build.outDir,
30
- options.pluginOptions.build.client
31
- ) + "/";
32
- const moduleBaseURL = `file://${root}`;
33
- const htmlRoot = destinationRoot;
34
- const rscRoot = destinationRoot;
35
18
  const completedRoutes = /* @__PURE__ */ new Set();
36
- const transforms = /* @__PURE__ */ new Map();
37
- const writePromises = /* @__PURE__ */ new Map();
38
- const pipableStreamOptions = options.pipableStreamOptions ?? {};
39
- pipableStreamOptions.importMap = pipableStreamOptions?.importMap ?? {};
40
- pipableStreamOptions.importMap.imports = pipableStreamOptions.importMap.imports ?? {};
41
- if (!("react" in pipableStreamOptions.importMap.imports)) {
42
- pipableStreamOptions.importMap.imports["react"] = "https://esm.sh/react@experimental?pin=v124&dev";
43
- }
44
- if (!("react-dom" in pipableStreamOptions.importMap.imports)) {
45
- pipableStreamOptions.importMap.imports["react-dom"] = "https://esm.sh/react-dom@experimental?pin=v124&dev";
46
- }
47
- if (!("react-dom/" in pipableStreamOptions.importMap.imports)) {
48
- pipableStreamOptions.importMap.imports["react-dom/"] = "https://esm.sh/react-dom@experimental&pin=v124&dev/";
49
- }
50
- if (!("react-server-dom-esm/client.browser" in pipableStreamOptions.importMap.imports)) {
51
- pipableStreamOptions.importMap.imports["react-server-dom-esm/client.browser"] = `/node_modules/react-server-dom-esm/esm/react-server-dom-esm-client.browser.${options.userConfig.mode}.js`;
52
- }
53
- for (const [key, serverEntry] of Object.entries(options.serverManifest)) {
54
- if (!key.includes(".client.")) continue;
55
- const clientEntry = Object.entries(options.clientManifest).find(
56
- ([_2, entry2]) => entry2.src === serverEntry.src
57
- );
58
- if (!clientEntry) continue;
59
- const [_, entry] = clientEntry;
60
- const serverPath = serverEntry.src;
61
- const clientPath = entry.file;
62
- pipableStreamOptions.importMap.imports[serverPath] = "/" + clientPath;
63
- }
64
- for (const [key, value] of Object.entries(options.clientManifest)) {
65
- if (value.isEntry) {
66
- if (Array.isArray(pipableStreamOptions.bootstrapModules)) {
67
- pipableStreamOptions.bootstrapModules.push("/" + value.file);
68
- } else {
69
- pipableStreamOptions.bootstrapModules = ["/" + value.file];
70
- }
71
- }
72
- }
73
- await mkdir(htmlRoot, { recursive: true });
74
- await mkdir(rscRoot, { recursive: true });
75
19
  try {
76
- const allRoutesComplete = new Promise((resolve2) => {
20
+ const allRoutesComplete = new Promise((resolve, reject) => {
77
21
  options.worker.on("message", (msg) => {
78
22
  switch (msg.type) {
79
23
  case "ALL_READY": {
80
24
  const { id, html, outputPath } = msg;
81
25
  mkdirSync(dirname(outputPath), { recursive: true });
82
- const writePromise = writeFile(outputPath, html).then(() => {
26
+ writeFile(outputPath, html).then(() => {
83
27
  completedRoutes.add(id);
84
- writePromises.delete(id);
85
28
  if (completedRoutes.size === routes.length) {
86
- resolve2();
29
+ resolve();
87
30
  }
88
31
  }).catch((error) => {
32
+ console.error("Write error for route:", id, error);
89
33
  failedRoutes.set(id, error);
34
+ reject(error);
90
35
  });
91
- writePromises.set(id, writePromise);
92
36
  break;
93
37
  }
94
38
  case "ERROR": {
39
+ console.error("Worker error for route:", msg.id, msg.error);
95
40
  failedRoutes.set(msg.id, new Error(msg.error));
41
+ reject(new Error(msg.error));
96
42
  break;
97
43
  }
98
44
  }
99
45
  });
100
46
  });
101
- const renderPromises = routes.map(async (route) => {
102
- try {
103
- const result = await createHandler(route, options.pluginOptions, {
104
- loader: options.loader,
105
- clientManifest: options.clientManifest,
106
- serverManifest: options.serverManifest,
107
- pipableStreamOptions: options.pipableStreamOptions
108
- });
109
- if (result.type !== "success") {
110
- failedRoutes.set(route, new Error(`Handler failed for ${route}`));
111
- return;
47
+ for (const route of routes) {
48
+ const routeFiles = files.urlMap.get(route);
49
+ if (!routeFiles) {
50
+ console.error("No files found for route:", route);
51
+ failedRoutes.set(route, new Error(`No files found for ${route}`));
52
+ continue;
53
+ }
54
+ const cssFiles = collectManifestCss(
55
+ options.serverManifest,
56
+ options.moduleBasePath,
57
+ routeFiles.page,
58
+ options.onCssFile
59
+ );
60
+ const rscResult = await createHandler(route, {
61
+ ...options.pluginOptions,
62
+ Html: React__default.Fragment
63
+ // Use Fragment for pure RSC output
64
+ }, {
65
+ loader: options.loader,
66
+ clientManifest: options.clientManifest,
67
+ serverManifest: options.serverManifest,
68
+ pipableStreamOptions: {
69
+ ...options.pipableStreamOptions,
70
+ importMap: {
71
+ imports: {
72
+ ...options.pipableStreamOptions?.importMap?.imports,
73
+ ...Object.fromEntries(Array.from(cssFiles.entries()))
74
+ }
75
+ }
112
76
  }
113
- const htmlOutputPath = route === "/" ? join(htmlRoot, "index.html") : join(htmlRoot, route, "index.html");
114
- transforms.set(route, new Transform({
115
- transform(chunk, _encoding, callback) {
116
- options.worker.postMessage({
117
- type: "RSC_CHUNK",
118
- id: route,
119
- chunk,
120
- moduleRootPath,
121
- moduleBaseURL,
122
- htmlOutputPath,
123
- outDir: options.userConfig.build.outDir,
124
- pipableStreamOptions,
125
- clientManifest: options.clientManifest,
126
- serverManifest: options.serverManifest
127
- });
128
- const rscOutputPath = route === "/" ? join(rscRoot, "index.rsc") : join(rscRoot, route, "index.rsc");
129
- mkdirSync(dirname(rscOutputPath), { recursive: true });
130
- const writePromise = writeFile(rscOutputPath, chunk).catch((error) => {
131
- failedRoutes.set(route, error);
132
- });
133
- writePromises.set(`${route}:rsc`, writePromise);
134
- callback(null, chunk);
135
- },
136
- flush(callback) {
137
- options.worker.postMessage({
138
- type: "RSC_END",
139
- id: route
140
- });
141
- callback();
77
+ });
78
+ const htmlResult = await createHandler(route, options.pluginOptions, {
79
+ loader: options.loader,
80
+ clientManifest: options.clientManifest,
81
+ serverManifest: options.serverManifest,
82
+ pipableStreamOptions: {
83
+ ...options.pipableStreamOptions,
84
+ importMap: {
85
+ imports: {
86
+ ...options.pipableStreamOptions?.importMap?.imports,
87
+ ...Object.fromEntries(Array.from(cssFiles.entries()))
88
+ }
142
89
  }
143
- }));
144
- result.stream.pipe(transforms.get(route));
145
- await new Promise((resolve2) => {
146
- transforms.get(route)?.on("finish", resolve2);
147
- });
148
- } catch (error) {
149
- failedRoutes.set(route, error);
90
+ }
91
+ });
92
+ if (rscResult.type !== "success" || htmlResult.type !== "success") {
93
+ console.error("Handler failed for route:", route);
94
+ failedRoutes.set(route, new Error(`Handler failed for ${route}`));
95
+ continue;
150
96
  }
151
- });
152
- await Promise.all(renderPromises);
153
- await Promise.all(writePromises.values());
154
- await allRoutesComplete;
155
- } finally {
156
- for (const transform of transforms.values()) {
157
- transform.destroy();
97
+ await Promise.all([
98
+ // Save RSC stream to .rsc file in client directory
99
+ new Promise((resolve, reject) => {
100
+ const chunks = [];
101
+ const rscTransform = new Transform({
102
+ transform(chunk, _encoding, callback) {
103
+ try {
104
+ chunks.push(Buffer.from(chunk));
105
+ callback(null, chunk);
106
+ } catch (error) {
107
+ callback(error);
108
+ }
109
+ },
110
+ flush(callback) {
111
+ try {
112
+ const rscPath = join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.rsc");
113
+ mkdirSync(dirname(rscPath), { recursive: true });
114
+ writeFile(rscPath, Buffer.concat(chunks)).then(() => {
115
+ callback();
116
+ resolve();
117
+ }).catch((error) => {
118
+ console.error("RSC write error:", error);
119
+ callback(error);
120
+ reject(error);
121
+ });
122
+ } catch (error) {
123
+ callback(error);
124
+ reject(error);
125
+ }
126
+ }
127
+ });
128
+ rscResult.stream.pipe(rscTransform);
129
+ }),
130
+ // Send HTML stream to worker
131
+ new Promise((resolve, reject) => {
132
+ const htmlTransform = new Transform({
133
+ transform(chunk, _encoding, callback) {
134
+ try {
135
+ options.worker.postMessage({
136
+ type: "RSC_CHUNK",
137
+ id: route,
138
+ chunk: chunk.toString(),
139
+ moduleRootPath: join(root, options.pluginOptions.build.outDir),
140
+ moduleBaseURL: options.moduleBaseURL,
141
+ htmlOutputPath: join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.html"),
142
+ pipableStreamOptions: options.pipableStreamOptions
143
+ });
144
+ callback(null, chunk);
145
+ } catch (error) {
146
+ callback(error);
147
+ }
148
+ },
149
+ flush(callback) {
150
+ options.worker.postMessage({
151
+ type: "RSC_END",
152
+ id: route
153
+ });
154
+ callback();
155
+ resolve();
156
+ }
157
+ });
158
+ htmlResult.stream.pipe(htmlTransform);
159
+ })
160
+ ]);
158
161
  }
159
- transforms.clear();
160
- writePromises.clear();
161
- options.worker.postMessage({
162
- type: "SHUTDOWN"
163
- });
162
+ await allRoutesComplete;
163
+ } catch (error) {
164
+ console.error("Render error:", error);
165
+ throw error;
164
166
  }
165
- return {
166
- failedRoutes,
167
- completedRoutes
168
- };
167
+ return { failedRoutes, completedRoutes };
169
168
  }
170
169
 
171
170
  export { renderPages };
@@ -1 +1 @@
1
- {"version":3,"file":"renderPages.js","sources":["../../../../plugin/worker/html/renderPages.ts"],"sourcesContent":["import { appendFile, mkdirSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, 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 { ResolvedUserConfig, ResolvedUserOptions } from \"../../types.js\";\nimport type {\n HtmlWorkerMessage,\n HtmlWorkerResponse,\n WorkerRscChunkMessage,\n} from \"../types.js\";\nimport type { Manifest } from \"vite\";\nimport type {\n EmittedFile,\n EmittedPrebuiltChunk,\n PluginContext,\n ResolvedId,\n} from \"rollup\";\nimport { createInputNormalizer } from \"../../helpers/inputNormalizer.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?: (path: string) => void;\n clientCss?: string[];\n moduleBasePath: string;\n moduleBaseURL: string;\n};\n\nexport async function renderPages(\n pluginContext: PluginContext,\n routes: string[],\n options: RenderPagesOptions\n) {\n const root =\n pluginContext.environment.config.root ??\n options.userConfig.root ??\n options.pluginOptions.projectRoot ??\n process.cwd();\n const outDir =\n pluginContext.environment.config.build.outDir ??\n options.userConfig.build.outDir ??\n options.pluginOptions.build.outDir;\n const assetsDir =\n pluginContext.environment.config.build.assetsDir ??\n options.userConfig.build.assetsDir ??\n options.pluginOptions.build.assetsDir;\n\n const isServer = outDir.endsWith(options.pluginOptions.build.server);\n const isClient = outDir.endsWith(options.pluginOptions.build.client);\n if (!isServer && !isClient) {\n throw new Error(\"Invalid outDir directory\");\n }\n\n const destinationRoot = isServer\n ? resolvePath(\n root,\n options.pluginOptions.build.outDir,\n options.pluginOptions.build.client\n )\n : join(root, outDir);\n const failedRoutes = new Map<string, Error>();\n const moduleRootPath =\n join(\n root,\n options.pluginOptions.build.outDir,\n options.pluginOptions.build.client\n ) + \"/\";\n const moduleBaseURL = `file://${root}`;\n const htmlRoot = destinationRoot;\n const rscRoot = destinationRoot;\n const streamStarted = new Set<string>();\n const completedRoutes = new Set<string>();\n const htmlContent = new Map<string, string>();\n const transforms = new Map<string, Transform>();\n const writePromises = new Map<string, Promise<void>>();\n const pipableStreamOptions = options.pipableStreamOptions ?? {};\n pipableStreamOptions.importMap = pipableStreamOptions?.importMap ?? {};\n pipableStreamOptions.importMap.imports =\n pipableStreamOptions.importMap.imports ?? {};\n if (!(\"react\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react\"] = 'https://esm.sh/react@experimental?pin=v124&dev'\n }\n if (!(\"react-dom\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react-dom\"] = 'https://esm.sh/react-dom@experimental?pin=v124&dev'\n }\n if (!(\"react-dom/\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react-dom/\"] = 'https://esm.sh/react-dom@experimental&pin=v124&dev/'\n }\n if (!(\"react-server-dom-esm/client.browser\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react-server-dom-esm/client.browser\"] = `/node_modules/react-server-dom-esm/esm/react-server-dom-esm-client.browser.${options.userConfig.mode}.js`\n }\n // Find matching client components by their source paths\n for (const [key, serverEntry] of Object.entries(options.serverManifest)) {\n // Skip non-client components\n if (!key.includes(\".client.\")) continue;\n\n // Find matching client entry by source path\n const clientEntry = Object.entries(options.clientManifest).find(\n ([_, entry]) => entry.src === serverEntry.src\n );\n\n if (!clientEntry) continue;\n\n const [_, entry] = clientEntry;\n const serverPath = serverEntry.src as string;\n const clientPath = entry.file\n\n pipableStreamOptions.importMap.imports[serverPath] = '/' + clientPath;\n\n }\n for(const [key, value] of Object.entries(options.clientManifest)) {\n if(value.isEntry) {\n if(Array.isArray(pipableStreamOptions.bootstrapModules)) {\n pipableStreamOptions.bootstrapModules.push('/'+value.file);\n } else {\n pipableStreamOptions.bootstrapModules = ['/'+value.file];\n }\n }\n }\n\n // Remove the initial empty file writes - we'll create directories as needed\n await mkdir(htmlRoot, { recursive: true });\n await mkdir(rscRoot, { recursive: true });\n\n try {\n const allRoutesComplete = new Promise<void>((resolve) => {\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 const writePromise = writeFile(outputPath, html)\n .then(() => {\n completedRoutes.add(id);\n writePromises.delete(id);\n \n // Only resolve when all routes are complete\n if (completedRoutes.size === routes.length) {\n resolve();\n }\n })\n .catch((error) => {\n failedRoutes.set(id, error as Error);\n });\n\n writePromises.set(id, writePromise);\n break;\n }\n case \"ERROR\": {\n failedRoutes.set(msg.id, new Error(msg.error));\n break;\n }\n }\n });\n });\n\n const renderPromises = routes.map(async (route) => {\n try {\n const result = await createHandler(route, options.pluginOptions, {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n pipableStreamOptions: options.pipableStreamOptions,\n });\n\n if (result.type !== \"success\") {\n failedRoutes.set(route, new Error(`Handler failed for ${route}`));\n return;\n }\n\n const htmlOutputPath = route === \"/\"\n ? join(htmlRoot, \"index.html\")\n : join(htmlRoot, route, \"index.html\");\n\n transforms.set(route, new Transform({\n transform(chunk, _encoding, callback) {\n options.worker.postMessage({\n type: \"RSC_CHUNK\",\n id: route,\n chunk: chunk,\n moduleRootPath: moduleRootPath,\n moduleBaseURL: moduleBaseURL,\n htmlOutputPath: htmlOutputPath,\n outDir: options.userConfig.build.outDir,\n pipableStreamOptions: pipableStreamOptions,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n } satisfies WorkerRscChunkMessage);\n\n const rscOutputPath = route === \"/\"\n ? join(rscRoot, \"index.rsc\")\n : join(rscRoot, route, \"index.rsc\");\n\n mkdirSync(dirname(rscOutputPath), { recursive: true });\n \n // Track RSC file write\n const writePromise = writeFile(rscOutputPath, chunk)\n .catch((error) => {\n failedRoutes.set(route, error as Error);\n });\n\n writePromises.set(`${route}:rsc`, writePromise);\n callback(null, chunk);\n },\n flush(callback) {\n options.worker.postMessage({\n type: \"RSC_END\",\n id: route,\n });\n callback();\n },\n }));\n\n result.stream.pipe(transforms.get(route) as Transform);\n await new Promise<void>((resolve) => {\n transforms.get(route)?.on(\"finish\", resolve);\n });\n } catch (error) {\n failedRoutes.set(route, error as Error);\n }\n });\n\n // Wait for everything to complete\n await Promise.all(renderPromises);\n await Promise.all(writePromises.values());\n await allRoutesComplete;\n\n } finally {\n for (const transform of transforms.values()) {\n transform.destroy();\n }\n transforms.clear();\n writePromises.clear();\n\n options.worker.postMessage({\n type: \"SHUTDOWN\",\n });\n }\n\n return {\n failedRoutes,\n completedRoutes,\n };\n}\n"],"names":["resolvePath","_","entry","resolve"],"mappings":"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"}
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?: (path: 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\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 // 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 const cssFiles = collectManifestCss(\n options.serverManifest,\n options.moduleBasePath,\n routeFiles.page,\n options.onCssFile\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 pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n ...Object.fromEntries(Array.from(cssFiles.entries()))\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 pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n ...Object.fromEntries(Array.from(cssFiles.entries()))\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),\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,4 +1,2 @@
1
- export { reactRscWorkerPlugin } from "./plugin.js";
2
- export declare const worker: typeof import("./production.js");
3
- export declare const createRscStream: typeof import("./createRscStream.js").createRscStream, createWorker: typeof import("../createWorker.js").createWorker;
1
+ export {};
4
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,eAAO,MAAM,MAAM,kCAIlB,CAAC;AAGF,eAAO,MACL,eAAe,yDACf,YAAY,kDACJ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/index.ts"],"names":[],"mappings":""}
@@ -3,13 +3,5 @@
3
3
  * Copyright (c) Nico Brinkkemper
4
4
  * MIT License
5
5
  */
6
- export { reactRscWorkerPlugin } from './plugin.js';
7
-
8
- const worker = await (process.env["NODE_ENV"] === "production" ? import('./production.js') : import('./development.js'));
9
- const {
10
- createRscStream,
11
- createWorker
12
- } = worker;
13
-
14
- export { createRscStream, createWorker, worker };
6
+ await (process.env["NODE_ENV"] === "production" ? import('./rsc-worker.production.js') : import('./rsc-worker.development.js'));
15
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../plugin/worker/rsc/index.ts"],"sourcesContent":["export { reactRscWorkerPlugin } from \"./plugin.js\";\n\n// Dynamic import based on NODE_ENV\nexport const worker = await (\n process.env['NODE_ENV'] === 'production' \n ? import('./production.js') \n : import('./development.js')\n);\n\n// Re-export worker functions\nexport const {\n createRscStream,\n createWorker\n} = worker;\n"],"names":[],"mappings":";;;;;;;AAGa,MAAA,MAAA,GAAS,OACpB,OAAA,CAAQ,GAAI,CAAA,UAAU,CAAM,KAAA,YAAA,GAC1B,OAAO,iBAAiB,CACxB,GAAA,OAAO,kBAAkB,CAAA;AAIhB,MAAA;AAAA,EACX,eAAA;AAAA,EACA;AACF,CAAI,GAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../plugin/worker/rsc/index.ts"],"sourcesContent":["await(\n process.env[\"NODE_ENV\"] === \"production\"\n ? import(\"./rsc-worker.production.js\")\n : import(\"./rsc-worker.development.js\")\n);\n"],"names":[],"mappings":";;;;;AAAA,OACE,OAAA,CAAQ,IAAI,UAAU,CAAA,KAAM,eACxB,OAAO,4BAA4B,CACnC,GAAA,OAAO,6BAA6B,CAAA,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { RscWorkerMessage } from "../types.js";
2
+ export declare function messageHandler(message: RscWorkerMessage): Promise<void>;
3
+ //# sourceMappingURL=messageHandler.d.ts.map
@@ -0,0 +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;AAoCrB,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,iBA6F7D"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import 'node:fs';
7
+ import 'node:fs/promises';
8
+ import { join } from 'node:path';
9
+ import { parentPort } from 'node:worker_threads';
10
+ import { PassThrough } from 'node:stream';
11
+ import { renderToPipeableStream } from 'react-server-dom-esm/server.node';
12
+ import { createLogger } from '../../utils/logger.js';
13
+ import { cssFiles, addCssFile } from './state.js';
14
+ import React__default from 'react';
15
+
16
+ const log = createLogger("rsc-worker");
17
+ function CssCollector({
18
+ children,
19
+ cssFiles: cssFiles2
20
+ }) {
21
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, Array.from(cssFiles2.entries()).map(([id, css]) => {
22
+ return /* @__PURE__ */ React__default.createElement("style", { key: id, "data-source": id }, css);
23
+ }), children);
24
+ }
25
+ async function messageHandler(message) {
26
+ if (message.type === "RSC_RENDER") {
27
+ const {
28
+ id,
29
+ pageImport,
30
+ propsImport,
31
+ pageExportName,
32
+ propsExportName,
33
+ url,
34
+ outDir,
35
+ projectRoot,
36
+ moduleBaseURL,
37
+ moduleBasePath,
38
+ pipableStreamOptions
39
+ } = message;
40
+ try {
41
+ const [Component, propsModule] = await Promise.all([
42
+ import(join(projectRoot, pageImport)),
43
+ import(join(projectRoot, propsImport))
44
+ ]);
45
+ const propsAtExport = propsModule[propsExportName];
46
+ const props = await Promise.resolve(
47
+ typeof propsAtExport === "function" ? propsAtExport(url) : propsAtExport
48
+ );
49
+ const PageComponent = Component[pageExportName];
50
+ const stream = renderToPipeableStream(
51
+ /* @__PURE__ */ React__default.createElement(CssCollector, { cssFiles }, /* @__PURE__ */ React__default.createElement(PageComponent, { ...props })),
52
+ moduleBaseURL,
53
+ {
54
+ onError: (error) => {
55
+ log.error(`Stream error at ${id}:`, error);
56
+ parentPort?.postMessage({
57
+ type: "ERROR",
58
+ id,
59
+ error: error instanceof Error ? error.message : String(error)
60
+ });
61
+ },
62
+ onPostpone: log?.info ?? console.info,
63
+ environmentName: "Server",
64
+ importMap: {
65
+ imports: {
66
+ ...pipableStreamOptions?.importMap?.imports,
67
+ "/": moduleBasePath
68
+ }
69
+ },
70
+ ...pipableStreamOptions
71
+ }
72
+ );
73
+ const passThrough = new PassThrough();
74
+ stream.pipe(passThrough);
75
+ passThrough.on("data", (chunk) => {
76
+ parentPort?.postMessage({
77
+ type: "RSC_CHUNK",
78
+ id,
79
+ chunk: chunk.toString(),
80
+ moduleRootPath: moduleBasePath,
81
+ moduleBaseURL,
82
+ outDir,
83
+ rscOutputPath: `${outDir}/${id}.rsc`,
84
+ cssFiles: Array.from(cssFiles.entries())
85
+ });
86
+ });
87
+ passThrough.on("end", () => {
88
+ parentPort?.postMessage({
89
+ type: "RSC_END",
90
+ id
91
+ });
92
+ });
93
+ } catch (error) {
94
+ console.trace(error);
95
+ parentPort?.postMessage({
96
+ type: "ERROR",
97
+ id,
98
+ error: error instanceof Error ? error.message : String(error)
99
+ });
100
+ }
101
+ } else if (message.type === "CSS_FILE") {
102
+ addCssFile(message.id, message.cssFile);
103
+ }
104
+ }
105
+
106
+ export { messageHandler };
107
+ //# sourceMappingURL=messageHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageHandler.js","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"sourcesContent":["import { createWriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { parentPort } from \"node:worker_threads\";\nimport { PassThrough } from \"node:stream\";\nimport {\n renderToPipeableStream,\n // @ts-ignore\n} from \"react-server-dom-esm/server.node\";\nimport type {\n RscChunkMessage,\n RscEndMessage,\n RscWorkerMessage,\n} from \"../types.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport {\n cssFiles,\n clientFiles,\n serverActionFiles,\n addCssFile,\n clearCssFiles,\n} from \"./state.js\";\nimport type { WriteStream } from \"node:fs\";\nimport React from \"react\";\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 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":";;;;;;;;;;;;;;;AAyBA,MAAM,GAAA,GAAM,aAAa,YAAY,CAAA;AAGrC,SAAS,YAAa,CAAA;AAAA,EACpB,QAAA;AAAA,EACA,QAAAA,EAAAA;AACF,CAGG,EAAA;AACD,EAAA,uBAEKC,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,EAAA,KAAA,CAAM,IAAKD,CAAAA,SAAAA,CAAS,OAAQ,EAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAC,EAAI,EAAA,GAAG,CAAM,KAAA;AACjD,IAAA,oDACG,OAAM,EAAA,EAAA,GAAA,EAAK,EAAI,EAAA,aAAA,EAAa,MAC1B,GACH,CAAA;AAAA,GAEH,GACA,QACH,CAAA;AAEJ;AAEA,eAAsB,eAAe,OAA2B,EAAA;AAE9D,EAAI,IAAA,OAAA,CAAQ,SAAS,YAAc,EAAA;AACjC,IAAM,MAAA;AAAA,MACJ,EAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACE,GAAA,OAAA;AAEJ,IAAI,IAAA;AAEF,MAAA,MAAM,CAAC,SAAW,EAAA,WAAW,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QACjD,OAAO,IAAK,CAAA,WAAA,EAAa,UAAU,CAAA,CAAA;AAAA,QACnC,OAAO,IAAK,CAAA,WAAA,EAAa,WAAW,CAAA;AAAA,OACrC,CAAA;AAED,MAAM,MAAA,aAAA,GAAgB,YAAY,eAAe,CAAA;AACjD,MAAM,MAAA,KAAA,GAAQ,MAAM,OAAQ,CAAA,OAAA;AAAA,QAC1B,OAAO,aAAA,KAAkB,UAAa,GAAA,aAAA,CAAc,GAAG,CAAI,GAAA;AAAA,OAC7D;AAEA,MAAM,MAAA,aAAA,GAAgB,UAAU,cAAc,CAAA;AAE9C,MAAA,MAAM,MAAS,GAAA,sBAAA;AAAA,qDACZ,YAAa,EAAA,EAAA,QAAA,EAAA,+CACX,aAAe,EAAA,EAAA,GAAG,OAAO,CAC5B,CAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS,CAAC,KAAiB,KAAA;AACzB,YAAA,GAAA,CAAI,KAAM,CAAA,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACzC,YAAA,UAAA,EAAY,WAAY,CAAA;AAAA,cACtB,IAAM,EAAA,OAAA;AAAA,cACN,EAAA;AAAA,cACA,OAAO,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,aAC7D,CAAA;AAAA,WACH;AAAA,UACA,UAAA,EAAY,GAAK,EAAA,IAAA,IAAQ,OAAQ,CAAA,IAAA;AAAA,UACjC,eAAiB,EAAA,QAAA;AAAA,UACjB,SAAW,EAAA;AAAA,YACT,OAAS,EAAA;AAAA,cACP,GAAG,sBAAsB,SAAW,EAAA,OAAA;AAAA,cACpC,GAAK,EAAA;AAAA;AACP,WACF;AAAA,UACA,GAAG;AAAA;AACL,OACF;AAGA,MAAM,MAAA,WAAA,GAAc,IAAI,WAAY,EAAA;AAEpC,MAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAEvB,MAAY,WAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,CAAC,KAAU,KAAA;AAEhC,QAAA,UAAA,EAAY,WAAY,CAAA;AAAA,UACtB,IAAM,EAAA,WAAA;AAAA,UACN,EAAA;AAAA,UACA,KAAA,EAAO,MAAM,QAAS,EAAA;AAAA,UACtB,cAAgB,EAAA,cAAA;AAAA,UAChB,aAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAe,EAAA,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,IAAA,CAAA;AAAA,UAC9B,QAAU,EAAA,KAAA,CAAM,IAAK,CAAA,QAAA,CAAS,SAAS;AAAA,SACd,CAAA;AAAA,OAC5B,CAAA;AAED,MAAY,WAAA,CAAA,EAAA,CAAG,OAAO,MAAM;AAC1B,QAAA,UAAA,EAAY,WAAY,CAAA;AAAA,UACtB,IAAM,EAAA,SAAA;AAAA,UACN;AAAA,SACuB,CAAA;AAAA,OAC1B,CAAA;AAAA,aACM,KAAO,EAAA;AACd,MAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,MAAA,UAAA,EAAY,WAAY,CAAA;AAAA,QACtB,IAAM,EAAA,OAAA;AAAA,QACN,EAAA;AAAA,QACA,OAAO,KAAiB,YAAA,KAAA,GAAQ,KAAM,CAAA,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AAAA;AACH,GACF,MAAA,IAAW,OAAQ,CAAA,IAAA,KAAS,UAAY,EAAA;AACtC,IAAW,UAAA,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,OAAO,CAAA;AAAA;AAE1C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA2EzE"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA4EzE"}