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
@@ -0,0 +1,207 @@
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { join, dirname } from 'node:path';
7
+ import 'node:worker_threads';
8
+ import { createLogger } from 'vite';
9
+ import { checkFilesExist } from '../checkFilesExist.js';
10
+ import { resolveOptions } from '../config/resolveOptions.js';
11
+ import { resolvePages } from '../config/resolvePages.js';
12
+ import { resolveUserConfig } from '../config/resolveUserConfig.js';
13
+ import { tryManifest } from '../helpers/tryManifest.js';
14
+ import { createBuildLoader } from '../loader/createBuildLoader.js';
15
+ import { createWorker } from '../worker/createWorker.js';
16
+ import { renderPages } from '../worker/html/renderPages.js';
17
+ import { mkdir } from 'node:fs/promises';
18
+ import { collectManifestClientFiles } from '../collect-manifest-client-files.js';
19
+ import { mkdirSync, copyFileSync } from 'node:fs';
20
+ import { copyDir } from '../copy-dir.js';
21
+
22
+ let loader = null;
23
+ let worker;
24
+ let htmlTransform = null;
25
+ let clientAssets = /* @__PURE__ */ new Set();
26
+ function reactStaticPlugin(options) {
27
+ const timing = {
28
+ start: Date.now()
29
+ };
30
+ let files;
31
+ let root = process.cwd();
32
+ let userConfig;
33
+ let userOptions;
34
+ let pages;
35
+ let serverManifest = {};
36
+ let clientManifest = {};
37
+ const resolvedOptions = resolveOptions(options, false);
38
+ if (resolvedOptions.type === "error") {
39
+ throw resolvedOptions.error;
40
+ }
41
+ userOptions = resolvedOptions.userOptions;
42
+ if (userOptions.projectRoot != root && typeof userOptions.projectRoot === "string" && userOptions.projectRoot !== process.cwd() && userOptions.projectRoot !== "") {
43
+ root = userOptions.projectRoot;
44
+ console.log(
45
+ "[vite:plugin-react-server] Root dir changed in plugin",
46
+ userOptions.projectRoot,
47
+ root
48
+ );
49
+ }
50
+ return {
51
+ name: "vite:plugin-react-server/static",
52
+ enforce: "post",
53
+ api: {
54
+ meta: { timing }
55
+ },
56
+ async config(config, configEnv) {
57
+ if (typeof config.root === "string" && config.root !== root && config.root !== process.cwd() && config.root !== "") {
58
+ root = config.root;
59
+ }
60
+ const resolvePagesResult = await resolvePages(userOptions.build.pages);
61
+ if (resolvePagesResult.type === "error") {
62
+ throw resolvePagesResult.error;
63
+ }
64
+ pages = resolvePagesResult.pages;
65
+ files = await checkFilesExist(pages, userOptions, root);
66
+ const resolvedConfig2 = resolveUserConfig({
67
+ isStatic: true,
68
+ config,
69
+ configEnv,
70
+ userOptions,
71
+ files
72
+ });
73
+ if (resolvedConfig2.type === "error") {
74
+ throw resolvedConfig2.error;
75
+ }
76
+ userConfig = resolvedConfig2.userConfig;
77
+ timing.configResolved = Date.now();
78
+ return {};
79
+ },
80
+ async buildStart() {
81
+ timing.buildStart = Date.now();
82
+ },
83
+ async closeBundle() {
84
+ timing.renderStart = Date.now();
85
+ const serverManifestResult = tryManifest({
86
+ root,
87
+ outDir: join(userOptions.build.outDir, userOptions.build.server),
88
+ ssrManifest: false
89
+ });
90
+ if (serverManifestResult.type === "error") {
91
+ throw serverManifestResult.error;
92
+ }
93
+ serverManifest = serverManifestResult.manifest;
94
+ const clientManifestResult = tryManifest({
95
+ root,
96
+ outDir: join(userOptions.build.outDir, userOptions.build.client),
97
+ ssrManifest: false
98
+ });
99
+ if (clientManifestResult.type === "error") {
100
+ throw clientManifestResult.error;
101
+ }
102
+ clientManifest = clientManifestResult.manifest;
103
+ const staticDir = join(root, userOptions.build.outDir, userOptions.build.static);
104
+ await mkdir(staticDir, { recursive: true });
105
+ worker = await createWorker({
106
+ projectRoot: root,
107
+ workerPath: userOptions.htmlWorkerPath,
108
+ condition: "react-server",
109
+ reverseCondition: true,
110
+ mode: "production"
111
+ });
112
+ if (typeof loader !== "function") {
113
+ loader = createBuildLoader({
114
+ root,
115
+ userConfig,
116
+ userOptions,
117
+ pluginContext: this,
118
+ serverManifest,
119
+ clientManifest
120
+ });
121
+ }
122
+ const routeCssMap = /* @__PURE__ */ new Map();
123
+ const globalCss = /* @__PURE__ */ new Set();
124
+ await mkdir(staticDir, { recursive: true });
125
+ await copyDir(join(root, userOptions.build.outDir, userOptions.build.client), join(root, userOptions.build.outDir, userOptions.build.static));
126
+ const { cssFiles: indexCss } = collectManifestClientFiles({
127
+ manifest: clientManifest,
128
+ root,
129
+ pagePath: "index.html",
130
+ moduleBase: userOptions.moduleBase,
131
+ preserveModulesRoot: userOptions.build.preserveModulesRoot,
132
+ testClient: () => true
133
+ });
134
+ indexCss.forEach((css) => globalCss.add(css));
135
+ for (const route of pages) {
136
+ const routeFiles = files.urlMap.get(route);
137
+ if (routeFiles) {
138
+ const pageCss = collectManifestClientFiles({
139
+ manifest: serverManifest,
140
+ root,
141
+ pagePath: routeFiles.page,
142
+ moduleBase: userOptions.moduleBase,
143
+ preserveModulesRoot: userOptions.build.preserveModulesRoot,
144
+ onClientModule(path) {
145
+ const targetPath = join(root, userOptions.build.outDir, userOptions.build.server, path);
146
+ const destinationPath = join(root, userOptions.build.outDir, userOptions.build.static, path);
147
+ mkdirSync(dirname(destinationPath), { recursive: true });
148
+ copyFileSync(targetPath, destinationPath);
149
+ },
150
+ testClient: userOptions.autoDiscover.cssPattern,
151
+ testJson: userOptions.autoDiscover.jsonPattern
152
+ });
153
+ routeCssMap.set(route, /* @__PURE__ */ new Set([...globalCss, ...pageCss.cssFiles.keys()]));
154
+ }
155
+ }
156
+ const bootstrapModules = clientManifest["index.html"]?.file ? [clientManifest["index.html"].file.startsWith("/") ? clientManifest["index.html"].file.slice(1) : clientManifest["index.html"].file] : [];
157
+ const { failedRoutes, completedRoutes } = await renderPages(
158
+ pages,
159
+ files,
160
+ {
161
+ root,
162
+ outDir: userOptions.build.outDir,
163
+ htmlOutputPath: join(userOptions.build.outDir, userOptions.build.static, "index.html"),
164
+ pipableStreamOptions: {
165
+ bootstrapModules
166
+ },
167
+ moduleRootPath: join(root, userOptions.build.outDir, userOptions.build.static, userOptions.moduleBasePath),
168
+ moduleBasePath: userOptions.moduleBasePath,
169
+ moduleBaseURL: userOptions.moduleBaseURL,
170
+ inlineCss: userOptions.inlineCss,
171
+ pageExportName: userOptions.pageExportName,
172
+ propsExportName: userOptions.propsExportName,
173
+ Html: userOptions.Html,
174
+ CssCollector: userOptions.CssCollector,
175
+ cssFiles: [],
176
+ logger: createLogger(),
177
+ moduleBase: userOptions.moduleBase,
178
+ worker,
179
+ clientManifest,
180
+ serverManifest,
181
+ loader,
182
+ transformIndexHtml: htmlTransform,
183
+ onClientJSFile: (url) => {
184
+ if (!clientAssets.has(url)) {
185
+ const clientPath = join(root, userOptions.build.outDir, userOptions.build.client, url);
186
+ const targetPath = join(root, userOptions.build.outDir, userOptions.build.static, url);
187
+ mkdirSync(dirname(targetPath), { recursive: true });
188
+ copyFileSync(clientPath, targetPath);
189
+ clientAssets.add(url);
190
+ }
191
+ }
192
+ }
193
+ );
194
+ if (failedRoutes.size > 0) {
195
+ console.error(
196
+ "[vite-plugin-react-server] Failed to render routes:",
197
+ failedRoutes
198
+ );
199
+ }
200
+ console.log(`Rendered ${completedRoutes.size} unique routes to ${join(userOptions.build.outDir, userOptions.build.static)}`);
201
+ await worker.terminate();
202
+ }
203
+ };
204
+ }
205
+
206
+ export { reactStaticPlugin };
207
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["../../../plugin/react-static/plugin.ts"],"sourcesContent":["import { join, dirname } from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport {\n type ResolvedConfig,\n type UserConfig,\n type Manifest,\n type IndexHtmlTransformHook,\n type Plugin as VitePlugin,\n createLogger,\n} from \"vite\";\nimport { checkFilesExist } from \"../checkFilesExist.js\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolvePages } from \"../config/resolvePages.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\nimport { createBuildLoader } from \"../loader/createBuildLoader.js\";\nimport type {\n BuildTiming,\n CheckFilesExistReturn,\n ReactStreamPluginMeta,\n ResolvedUserConfig,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { renderPages } from \"../worker/html/renderPages.js\";\nimport { mkdir } from \"node:fs/promises\";\nimport { collectManifestClientFiles } from \"../collect-manifest-client-files.js\";\nimport { mkdirSync, copyFileSync } from \"node:fs\";\nimport { copyDir } from \"../copy-dir.js\";\n\nlet resolvedConfig: ResolvedConfig | null = null;\nlet loader: ((id: string) => Promise<Record<string, any>>) | null = null;\nlet worker: Worker;\nlet htmlTransform: IndexHtmlTransformHook | null = null;\nlet clientAssets = new Set<string>();\n\nexport function reactStaticPlugin(options: StreamPluginOptions): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n const timing: BuildTiming = {\n start: Date.now(),\n };\n\n let files: CheckFilesExistReturn;\n let root: string = process.cwd();\n let userConfig: ResolvedUserConfig;\n let userOptions: ResolvedUserOptions;\n let pages: string[];\n let serverManifest: Manifest = {};\n let clientManifest: Manifest = {};\n\n const resolvedOptions = resolveOptions(options, false);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n if (\n userOptions.projectRoot != root &&\n typeof userOptions.projectRoot === \"string\" &&\n userOptions.projectRoot !== process.cwd() &&\n userOptions.projectRoot !== \"\"\n ) {\n root = userOptions.projectRoot;\n console.log(\n \"[vite:plugin-react-server] Root dir changed in plugin\",\n userOptions.projectRoot,\n root\n );\n }\n\n return {\n name: \"vite:plugin-react-server/static\",\n enforce: \"post\",\n api: {\n meta: { timing },\n },\n async config(config, configEnv): Promise<UserConfig> {\n if (\n typeof config.root === \"string\" &&\n config.root !== root &&\n config.root !== process.cwd() &&\n config.root !== \"\"\n ) {\n root = config.root;\n }\n const resolvePagesResult = await resolvePages(userOptions.build.pages);\n if (resolvePagesResult.type === \"error\") {\n throw resolvePagesResult.error;\n }\n pages = resolvePagesResult.pages;\n files = await checkFilesExist(pages, userOptions, root);\n\n const resolvedConfig = resolveUserConfig({\n isStatic: true,\n config,\n configEnv,\n userOptions,\n files,\n });\n\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n timing.configResolved = Date.now();\n return {};\n },\n async buildStart() {\n timing.buildStart = Date.now();\n },\n async closeBundle() {\n timing.renderStart = Date.now();\n\n // Create the loader\n const serverManifestResult = tryManifest({\n root: root,\n outDir: join(userOptions.build.outDir, userOptions.build.server),\n ssrManifest: false,\n });\n if (serverManifestResult.type === \"error\") {\n throw serverManifestResult.error;\n }\n serverManifest = serverManifestResult.manifest;\n\n // Get the client manifest\n const clientManifestResult = tryManifest({\n root: root,\n outDir: join(userOptions.build.outDir, userOptions.build.client),\n ssrManifest: false,\n });\n\n if (clientManifestResult.type === \"error\") {\n throw clientManifestResult.error;\n }\n clientManifest = clientManifestResult.manifest;\n\n // Ensure static directory exists\n const staticDir = join(root, userOptions.build.outDir, userOptions.build.static);\n await mkdir(staticDir, { recursive: true });\n\n worker = await createWorker({\n projectRoot: root,\n workerPath: userOptions.htmlWorkerPath,\n condition: \"react-server\",\n reverseCondition: true,\n mode: (resolvedConfig?.mode ?? \"production\") as \"production\" | \"development\",\n });\n\n if (typeof loader !== \"function\") {\n loader = createBuildLoader({\n root: root,\n userConfig,\n userOptions,\n pluginContext: this,\n serverManifest,\n clientManifest,\n });\n }\n\n // Collect CSS files per route\n const routeCssMap = new Map<string, Set<string>>();\n const globalCss = new Set<string>();\n // copy whole client directory to static directory\n await mkdir(staticDir, { recursive: true });\n await copyDir(join(root, userOptions.build.outDir, userOptions.build.client), join(root, userOptions.build.outDir, userOptions.build.static));\n // Add global CSS from index.html - use client manifest\n const {cssFiles: indexCss} = collectManifestClientFiles({\n manifest: clientManifest,\n root: root,\n pagePath: 'index.html',\n moduleBase: userOptions.moduleBase,\n preserveModulesRoot: userOptions.build.preserveModulesRoot,\n testClient: ()=>true,\n });\n indexCss.forEach((css) => globalCss.add(css));\n\n // Add CSS for each route's page component - use server manifest\n for (const route of pages) {\n const routeFiles = files.urlMap.get(route);\n if (routeFiles) {\n const pageCss = collectManifestClientFiles({\n manifest: serverManifest,\n root: root,\n pagePath: routeFiles.page,\n moduleBase: userOptions.moduleBase,\n preserveModulesRoot: userOptions.build.preserveModulesRoot,\n onClientModule(path) {\n // copy the css file to the static directory\n const targetPath = join(root, userOptions.build.outDir, userOptions.build.server, path);\n const destinationPath = join(root, userOptions.build.outDir, userOptions.build.static, path);\n mkdirSync(dirname(destinationPath), { recursive: true });\n copyFileSync(targetPath, destinationPath);\n },\n testClient: userOptions.autoDiscover.cssPattern,\n testJson: userOptions.autoDiscover.jsonPattern,\n });\n routeCssMap.set(route, new Set([...globalCss, ...pageCss.cssFiles.keys()]));\n }\n }\n const bootstrapModules = clientManifest[\"index.html\"]?.file\n ? [clientManifest[\"index.html\"].file.startsWith(\"/\")\n ? clientManifest[\"index.html\"].file.slice(1)\n : clientManifest[\"index.html\"].file]\n : [];\n \n const { failedRoutes, completedRoutes} = await renderPages(\n pages,\n files,\n {\n root: root,\n outDir: userOptions.build.outDir,\n htmlOutputPath: join( userOptions.build.outDir, userOptions.build.static, \"index.html\"),\n pipableStreamOptions: {\n bootstrapModules: bootstrapModules,\n },\n moduleRootPath: join(root, userOptions.build.outDir, userOptions.build.static, userOptions.moduleBasePath),\n moduleBasePath: userOptions.moduleBasePath,\n moduleBaseURL: userOptions.moduleBaseURL,\n inlineCss: userOptions.inlineCss,\n pageExportName: userOptions.pageExportName,\n propsExportName: userOptions.propsExportName,\n Html: userOptions.Html,\n CssCollector: userOptions.CssCollector,\n cssFiles: [],\n logger: createLogger(),\n moduleBase: userOptions.moduleBase,\n worker,\n clientManifest,\n serverManifest,\n loader,\n transformIndexHtml: htmlTransform!,\n onClientJSFile: (url) => {\n if (!clientAssets.has(url)) {\n const clientPath = join(root, userOptions.build.outDir, userOptions.build.client, url);\n const targetPath = join(root, userOptions.build.outDir, userOptions.build.static, url);\n mkdirSync(dirname(targetPath), { recursive: true });\n copyFileSync(clientPath, targetPath);\n clientAssets.add(url);\n }\n }\n }\n );\n\n if (failedRoutes.size > 0) {\n console.error(\n \"[vite-plugin-react-server] Failed to render routes:\",\n failedRoutes\n );\n }\n console.log(`Rendered ${completedRoutes.size} unique routes to ${join(userOptions.build.outDir, userOptions.build.static)}`);\n await worker.terminate();\n },\n };\n}\n"],"names":["resolvedConfig"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type ReactStaticPluginOptions = {};
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG,EAEtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolvePage.d.ts","sourceRoot":"","sources":["../../plugin/resolvePage.ts"],"names":[],"mappings":"AAAA,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,iBAAiB,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,wBAAsB,WAAW,CAAC,EAChC,UAAU,EACV,IAAI,EACJ,GAAG,EACH,UAAU,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+CjD"}
1
+ {"version":3,"file":"resolvePage.d.ts","sourceRoot":"","sources":["../../plugin/resolvePage.ts"],"names":[],"mappings":"AAEA,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,iBAAiB,GAClB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,wBAAsB,WAAW,CAAC,EAChC,UAAU,EACV,IAAI,EACJ,GAAG,EACH,UAAU,GACX,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsDjD"}
@@ -3,12 +3,21 @@
3
3
  * Copyright (c) Nico Brinkkemper
4
4
  * MIT License
5
5
  */
6
+ import { stashedPages } from './config/resolvePages.js';
7
+
6
8
  async function resolvePage({
7
9
  pageModule,
8
10
  path,
9
11
  url,
10
12
  exportName
11
13
  }) {
14
+ if (stashedPages.length > 0 && stashedPages.includes(path)) {
15
+ return {
16
+ type: "success",
17
+ key: path,
18
+ Page: pageModule
19
+ };
20
+ }
12
21
  if (!pageModule) {
13
22
  return {
14
23
  type: "error",
@@ -1 +1 @@
1
- {"version":3,"file":"resolvePage.js","sources":["../../plugin/resolvePage.ts"],"sourcesContent":["type ResolvePageOptions = {\n pageModule: Record<string, any>;\n path: string;\n url: string;\n exportName: string;\n};\n\ntype ResolvePageResult =\n | { type: \"success\"; key: string; Page: any }\n | { type: \"error\"; error: Error }\n | { type: \"skip\" };\n\nexport async function resolvePage({\n pageModule,\n path,\n url,\n exportName,\n}: ResolvePageOptions): Promise<ResolvePageResult> {\n if (!pageModule) {\n return {\n type: \"error\",\n error: new Error(`pageModule is ${typeof pageModule}`),\n };\n }\n const keys =\n typeof pageModule === \"object\" && pageModule != null\n ? Object.keys(pageModule)\n : [];\n const found = keys.find((v) => v === exportName || v === url || v === path);\n if (found) {\n if (typeof pageModule[found] === \"function\") {\n return {\n type: \"success\",\n key: found,\n Page: pageModule[found],\n };\n } else {\n if (\n typeof pageModule === \"object\" &&\n pageModule != null &&\n Object.keys(pageModule).includes(\"type\")\n )\n return pageModule as ResolvePageResult;\n return {\n type: \"error\",\n [exportName]: () => found,\n error: pageModule[found][\"error\"],\n };\n }\n }\n if (keys.includes(\"type\")) return pageModule as ResolvePageResult;\n return {\n type: \"error\",\n error: new Error(\n `Could not find Page export \"${exportName}\" in \"${path}\". ${\n typeof pageModule === \"object\" && pageModule != null\n ? keys.length\n ? \"Available exports: \" + keys.join(\", \")\n : \"The object was defined but has no properties. \\\"\" + JSON.stringify(pageModule) + \"\\\"\"\n : \"typeof pageModule =\" + typeof pageModule\n }`,\n { cause: pageModule }\n ),\n };\n}\n"],"names":[],"mappings":";;;;;AAYA,eAAsB,WAAY,CAAA;AAAA,EAChC,UAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAmD,EAAA;AACjD,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,OAAA;AAAA,MACN,OAAO,IAAI,KAAA,CAAM,CAAiB,cAAA,EAAA,OAAO,UAAU,CAAE,CAAA;AAAA,KACvD;AAAA;AAEF,EAAM,MAAA,IAAA,GACJ,OAAO,UAAA,KAAe,QAAY,IAAA,UAAA,IAAc,OAC5C,MAAO,CAAA,IAAA,CAAK,UAAU,CAAA,GACtB,EAAC;AACP,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,MAAM,UAAc,IAAA,CAAA,KAAM,GAAO,IAAA,CAAA,KAAM,IAAI,CAAA;AAC1E,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,IAAI,OAAO,UAAA,CAAW,KAAK,CAAA,KAAM,UAAY,EAAA;AAC3C,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,SAAA;AAAA,QACN,GAAK,EAAA,KAAA;AAAA,QACL,IAAA,EAAM,WAAW,KAAK;AAAA,OACxB;AAAA,KACK,MAAA;AACL,MACE,IAAA,OAAO,UAAe,KAAA,QAAA,IACtB,UAAc,IAAA,IAAA,IACd,OAAO,IAAK,CAAA,UAAU,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA;AAEvC,QAAO,OAAA,UAAA;AACT,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,CAAC,UAAU,GAAG,MAAM,KAAA;AAAA,QACpB,KAAO,EAAA,UAAA,CAAW,KAAK,CAAA,CAAE,OAAO;AAAA,OAClC;AAAA;AACF;AAEF,EAAA,IAAI,IAAK,CAAA,QAAA,CAAS,MAAM,CAAA,EAAU,OAAA,UAAA;AAClC,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,OAAO,IAAI,KAAA;AAAA,MACT,CAAA,4BAAA,EAA+B,UAAU,CAAA,MAAA,EAAS,IAAI,CAAA,GAAA,EACpD,OAAO,UAAe,KAAA,QAAA,IAAY,UAAc,IAAA,IAAA,GAC5C,IAAK,CAAA,MAAA,GACH,wBAAwB,IAAK,CAAA,IAAA,CAAK,IAAI,CAAA,GACtC,iDAAqD,GAAA,IAAA,CAAK,SAAU,CAAA,UAAU,CAAI,GAAA,GAAA,GACpF,qBAAwB,GAAA,OAAO,UACrC,CAAA,CAAA;AAAA,MACA,EAAE,OAAO,UAAW;AAAA;AACtB,GACF;AACF;;;;"}
1
+ {"version":3,"file":"resolvePage.js","sources":["../../plugin/resolvePage.ts"],"sourcesContent":["import { stashedPages } from \"./config/resolvePages.js\";\n\ntype ResolvePageOptions = {\n pageModule: Record<string, any>;\n path: string;\n url: string;\n exportName: string;\n};\n\ntype ResolvePageResult =\n | { type: \"success\"; key: string; Page: any }\n | { type: \"error\"; error: Error }\n | { type: \"skip\" };\n\nexport async function resolvePage({\n pageModule,\n path,\n url,\n exportName,\n}: ResolvePageOptions): Promise<ResolvePageResult> {\n if(stashedPages.length > 0 && stashedPages.includes(path)){\n return {\n type: \"success\",\n key: path,\n Page: pageModule,\n }\n }\n if (!pageModule) {\n return {\n type: \"error\",\n error: new Error(`pageModule is ${typeof pageModule}`),\n };\n }\n const keys =\n typeof pageModule === \"object\" && pageModule != null\n ? Object.keys(pageModule)\n : [];\n const found = keys.find((v) => v === exportName || v === url || v === path);\n if (found) {\n if (typeof pageModule[found] === \"function\") {\n return {\n type: \"success\",\n key: found,\n Page: pageModule[found],\n };\n } else {\n if (\n typeof pageModule === \"object\" &&\n pageModule != null &&\n Object.keys(pageModule).includes(\"type\")\n )\n return pageModule as ResolvePageResult;\n return {\n type: \"error\",\n [exportName]: () => found,\n error: pageModule[found][\"error\"],\n };\n }\n }\n if (keys.includes(\"type\")) return pageModule as ResolvePageResult;\n return {\n type: \"error\",\n error: new Error(\n `Could not find Page export \"${exportName}\" in \"${path}\". ${\n typeof pageModule === \"object\" && pageModule != null\n ? keys.length\n ? \"Available exports: \" + keys.join(\", \")\n : \"The object was defined but has no properties. \\\"\" + JSON.stringify(pageModule) + \"\\\"\"\n : \"typeof pageModule =\" + typeof pageModule\n }`,\n { cause: pageModule }\n ),\n };\n}\n"],"names":[],"mappings":";;;;;;;AAcA,eAAsB,WAAY,CAAA;AAAA,EAChC,UAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAmD,EAAA;AACjD,EAAA,IAAG,aAAa,MAAS,GAAA,CAAA,IAAK,YAAa,CAAA,QAAA,CAAS,IAAI,CAAE,EAAA;AACxD,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,SAAA;AAAA,MACN,GAAK,EAAA,IAAA;AAAA,MACL,IAAM,EAAA;AAAA,KACR;AAAA;AAEF,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,OAAA;AAAA,MACN,OAAO,IAAI,KAAA,CAAM,CAAiB,cAAA,EAAA,OAAO,UAAU,CAAE,CAAA;AAAA,KACvD;AAAA;AAEF,EAAM,MAAA,IAAA,GACJ,OAAO,UAAA,KAAe,QAAY,IAAA,UAAA,IAAc,OAC5C,MAAO,CAAA,IAAA,CAAK,UAAU,CAAA,GACtB,EAAC;AACP,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,MAAM,UAAc,IAAA,CAAA,KAAM,GAAO,IAAA,CAAA,KAAM,IAAI,CAAA;AAC1E,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,IAAI,OAAO,UAAA,CAAW,KAAK,CAAA,KAAM,UAAY,EAAA;AAC3C,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,SAAA;AAAA,QACN,GAAK,EAAA,KAAA;AAAA,QACL,IAAA,EAAM,WAAW,KAAK;AAAA,OACxB;AAAA,KACK,MAAA;AACL,MACE,IAAA,OAAO,UAAe,KAAA,QAAA,IACtB,UAAc,IAAA,IAAA,IACd,OAAO,IAAK,CAAA,UAAU,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA;AAEvC,QAAO,OAAA,UAAA;AACT,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,OAAA;AAAA,QACN,CAAC,UAAU,GAAG,MAAM,KAAA;AAAA,QACpB,KAAO,EAAA,UAAA,CAAW,KAAK,CAAA,CAAE,OAAO;AAAA,OAClC;AAAA;AACF;AAEF,EAAA,IAAI,IAAK,CAAA,QAAA,CAAS,MAAM,CAAA,EAAU,OAAA,UAAA;AAClC,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,OAAA;AAAA,IACN,OAAO,IAAI,KAAA;AAAA,MACT,CAAA,4BAAA,EAA+B,UAAU,CAAA,MAAA,EAAS,IAAI,CAAA,GAAA,EACpD,OAAO,UAAe,KAAA,QAAA,IAAY,UAAc,IAAA,IAAA,GAC5C,IAAK,CAAA,MAAA,GACH,wBAAwB,IAAK,CAAA,IAAA,CAAK,IAAI,CAAA,GACtC,iDAAqD,GAAA,IAAA,CAAK,SAAU,CAAA,UAAU,CAAI,GAAA,GAAA,GACpF,qBAAwB,GAAA,OAAO,UACrC,CAAA,CAAA;AAAA,MACA,EAAE,OAAO,UAAW;AAAA;AACtB,GACF;AACF;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare const pluginRoot: string;
2
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../plugin/root.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,QAA0C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * vite-plugin-react-server
3
+ * Copyright (c) Nico Brinkkemper
4
+ * MIT License
5
+ */
6
+ import { dirname } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const pluginRoot = dirname(fileURLToPath(import.meta.url));
10
+
11
+ export { pluginRoot };
12
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sources":["../../plugin/root.ts"],"sourcesContent":["import { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nexport const pluginRoot = dirname(fileURLToPath(import.meta.url));\n\n"],"names":[],"mappings":";;;;;;;;AAEO,MAAM,UAAa,GAAA,OAAA,CAAQ,aAAc,CAAA,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/transformer/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAyEzE"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/transformer/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAwC,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAMlD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAkFzE"}
@@ -12,35 +12,45 @@ import { tryManifest } from '../helpers/tryManifest.js';
12
12
  import { join } from 'node:path';
13
13
 
14
14
  function reactTransformPlugin(options) {
15
- const resolvedOptions = resolveOptions(options);
16
- let isDev = false;
17
- if (resolvedOptions.type === "error") throw resolvedOptions.error;
18
- const normalizer = createInputNormalizer({
19
- root: resolvedOptions.userOptions.projectRoot,
20
- preserveModulesRoot: undefined,
21
- removeExtension: false
22
- });
23
- const clientManifestResult = tryManifest({
24
- root: resolvedOptions.userOptions.projectRoot,
25
- outDir: join(
26
- resolvedOptions.userOptions.build.outDir,
27
- resolvedOptions.userOptions.build.client
28
- ),
29
- ssrManifest: false
30
- });
15
+ let normalizer;
16
+ let clientManifest;
17
+ let isDev;
18
+ let userOptions;
31
19
  return {
32
20
  name: "vite:react-transform",
33
21
  enforce: "pre",
34
22
  // Run before Vite's transforms
35
23
  config(config, configEnv) {
24
+ const resolvedOptionsResult = resolveOptions(
25
+ options,
26
+ config.build?.outDir?.startsWith(
27
+ join(options.build?.outDir ?? DEFAULT_CONFIG.BUILD.outDir, options.build?.client ?? DEFAULT_CONFIG.BUILD.client)
28
+ ) ?? false
29
+ );
36
30
  isDev = configEnv.mode === "development" && configEnv.command === "serve";
31
+ if (resolvedOptionsResult.type === "error") throw resolvedOptionsResult.error;
32
+ userOptions = resolvedOptionsResult.userOptions;
33
+ normalizer = createInputNormalizer({
34
+ root: resolvedOptionsResult.userOptions.projectRoot,
35
+ preserveModulesRoot: undefined,
36
+ removeExtension: false
37
+ });
37
38
  },
38
39
  async transform(code, id, options2) {
39
40
  const ssr = options2?.ssr ?? false;
40
41
  if (!ssr) return null;
41
42
  if (!id.match(DEFAULT_CONFIG.FILE_REGEX)) return null;
42
- if (!code.match('"use client"'))
43
- return null;
43
+ if (!code.match('"use client"')) return null;
44
+ const clientManifestResult = tryManifest({
45
+ root: userOptions.projectRoot,
46
+ outDir: join(
47
+ userOptions.build.outDir,
48
+ userOptions.build.client
49
+ ),
50
+ ssrManifest: false
51
+ });
52
+ if (clientManifestResult.type === "error") throw clientManifestResult.error;
53
+ clientManifest = clientManifestResult.manifest;
44
54
  const [key, value] = normalizer(id);
45
55
  const transformed = await transformModuleIfNeeded(
46
56
  code,
@@ -67,12 +77,11 @@ function reactTransformPlugin(options) {
67
77
  );
68
78
  return null;
69
79
  }
70
- if (clientManifestResult.type === "error") {
71
- throw clientManifestResult.error;
72
- }
73
- const clientPath = clientManifestResult.manifest[key]?.file;
80
+ const clientPath = clientManifest[key]?.file;
74
81
  if (!clientPath) {
75
- console.warn(`[vite-plugin-react-server] Could not find client path for ${value}. Ignoring.`);
82
+ console.warn(
83
+ `[vite-plugin-react-server] Could not find client path for ${value}. Ignoring.`
84
+ );
76
85
  return null;
77
86
  }
78
87
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../plugin/transformer/plugin.ts"],"sourcesContent":["import { resolveOptions } from \"../config/resolveOptions.js\";\nimport type { StreamPluginOptions } from \"../types.js\";\nimport { type Plugin } from \"vite\";\nimport { transformModuleIfNeeded } from \"../loader/react-loader.js\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { createInputNormalizer } from \"../helpers/inputNormalizer.js\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\nimport { join } from \"node:path\";\n/**\n * Plugin for transforming React Client Components.\n *\n * Core responsibilities:\n * 1. Detects \"use client\" directives\n * 2. Transforms client components for RSC boundaries\n * 3. Adds client reference metadata for RSC\n *\n * When a component is marked with \"use client\", it:\n * - Gets transformed into a client reference\n * - Maintains module ID for RSC boundaries\n * - Preserves class/function behavior\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * viteReactClientTransformPlugin({\n * projectRoot: process.cwd(),\n * })\n * ]\n * });\n * ```\n */\n\nexport function reactTransformPlugin(options: StreamPluginOptions): Plugin {\n const resolvedOptions = resolveOptions(options);\n let isDev = false;\n if (resolvedOptions.type === \"error\") throw resolvedOptions.error;\n const normalizer = createInputNormalizer({\n root: resolvedOptions.userOptions.projectRoot,\n preserveModulesRoot: undefined,\n removeExtension: false,\n });\n\n // Get the client manifest\n const clientManifestResult = tryManifest({\n root: resolvedOptions.userOptions.projectRoot,\n outDir: join(\n resolvedOptions.userOptions.build.outDir,\n resolvedOptions.userOptions.build.client\n ),\n ssrManifest: false,\n });\n\n return {\n name: \"vite:react-transform\",\n enforce: \"pre\", // Run before Vite's transforms\n config(config, configEnv) {\n isDev = configEnv.mode === \"development\" && configEnv.command === \"serve\";\n },\n async transform(code, id, options) {\n const ssr = options?.ssr ?? false;\n if (!ssr) return null;\n if (!id.match(DEFAULT_CONFIG.FILE_REGEX)) return null;\n if (!code.match('\"use client\"'))\n return null;\n const [key, value] = normalizer(id);\n const transformed = await transformModuleIfNeeded(\n code,\n id,\n // Pass null for nextLoad since we don't need module loading in the plugin\n null\n );\n if (!transformed) return null;\n if (isDev) {\n return {\n code: transformed,\n map: null,\n };\n }\n const moduleIdIndex = transformed.indexOf(value);\n if (moduleIdIndex === -1) {\n console.warn(\n `[vite-plugin-react-server] Could not find module id in transformed code. Ignoring.`,\n {\n code,\n id,\n transformed,\n }\n );\n return null\n }\n if (clientManifestResult.type === \"error\") {\n throw clientManifestResult.error;\n }\n const clientPath = clientManifestResult.manifest[key]?.file;\n\n if (!clientPath) {\n console.warn(`[vite-plugin-react-server] Could not find client path for ${value}. Ignoring.`)\n return null\n }\n return {\n code: transformed.replace(key, clientPath),\n map: null,\n };\n },\n };\n}\n"],"names":["options"],"mappings":";;;;;;;;;;;;;AAiCO,SAAS,qBAAqB,OAAsC,EAAA;AACzE,EAAM,MAAA,eAAA,GAAkB,eAAe,OAAO,CAAA;AAC9C,EAAA,IAAI,KAAQ,GAAA,KAAA;AACZ,EAAA,IAAI,eAAgB,CAAA,IAAA,KAAS,OAAS,EAAA,MAAM,eAAgB,CAAA,KAAA;AAC5D,EAAA,MAAM,aAAa,qBAAsB,CAAA;AAAA,IACvC,IAAA,EAAM,gBAAgB,WAAY,CAAA,WAAA;AAAA,IAClC,mBAAqB,EAAA,SAAA;AAAA,IACrB,eAAiB,EAAA;AAAA,GAClB,CAAA;AAGD,EAAA,MAAM,uBAAuB,WAAY,CAAA;AAAA,IACvC,IAAA,EAAM,gBAAgB,WAAY,CAAA,WAAA;AAAA,IAClC,MAAQ,EAAA,IAAA;AAAA,MACN,eAAA,CAAgB,YAAY,KAAM,CAAA,MAAA;AAAA,MAClC,eAAA,CAAgB,YAAY,KAAM,CAAA;AAAA,KACpC;AAAA,IACA,WAAa,EAAA;AAAA,GACd,CAAA;AAED,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,sBAAA;AAAA,IACN,OAAS,EAAA,KAAA;AAAA;AAAA,IACT,MAAA,CAAO,QAAQ,SAAW,EAAA;AACxB,MAAA,KAAA,GAAQ,SAAU,CAAA,IAAA,KAAS,aAAiB,IAAA,SAAA,CAAU,OAAY,KAAA,OAAA;AAAA,KACpE;AAAA,IACA,MAAM,SAAA,CAAU,IAAM,EAAA,EAAA,EAAIA,QAAS,EAAA;AACjC,MAAM,MAAA,GAAA,GAAMA,UAAS,GAAO,IAAA,KAAA;AAC5B,MAAI,IAAA,CAAC,KAAY,OAAA,IAAA;AACjB,MAAA,IAAI,CAAC,EAAG,CAAA,KAAA,CAAM,cAAe,CAAA,UAAU,GAAU,OAAA,IAAA;AACjD,MAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,cAAc,CAAA;AAC5B,QAAO,OAAA,IAAA;AACT,MAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,WAAW,EAAE,CAAA;AAClC,MAAA,MAAM,cAAc,MAAM,uBAAA;AAAA,QACxB,IAAA;AAAA,QACA,EAAA;AAAA;AAAA,QAEA;AAAA,OACF;AACA,MAAI,IAAA,CAAC,aAAoB,OAAA,IAAA;AACzB,MAAA,IAAI,KAAO,EAAA;AACT,QAAO,OAAA;AAAA,UACL,IAAM,EAAA,WAAA;AAAA,UACN,GAAK,EAAA;AAAA,SACP;AAAA;AAEF,MAAM,MAAA,aAAA,GAAgB,WAAY,CAAA,OAAA,CAAQ,KAAK,CAAA;AAC/C,MAAA,IAAI,kBAAkB,EAAI,EAAA;AACxB,QAAQ,OAAA,CAAA,IAAA;AAAA,UACN,CAAA,kFAAA,CAAA;AAAA,UACA;AAAA,YACE,IAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA;AACF,SACF;AACA,QAAO,OAAA,IAAA;AAAA;AAET,MAAI,IAAA,oBAAA,CAAqB,SAAS,OAAS,EAAA;AACzC,QAAA,MAAM,oBAAqB,CAAA,KAAA;AAAA;AAE7B,MAAA,MAAM,UAAa,GAAA,oBAAA,CAAqB,QAAS,CAAA,GAAG,CAAG,EAAA,IAAA;AAEvD,MAAA,IAAI,CAAC,UAAY,EAAA;AACf,QAAQ,OAAA,CAAA,IAAA,CAAK,CAA6D,0DAAA,EAAA,KAAK,CAAa,WAAA,CAAA,CAAA;AAC5F,QAAO,OAAA,IAAA;AAAA;AAET,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,EAAK,UAAU,CAAA;AAAA,QACzC,GAAK,EAAA;AAAA,OACP;AAAA;AACF,GACF;AACF;;;;"}
1
+ {"version":3,"file":"plugin.js","sources":["../../../plugin/transformer/plugin.ts"],"sourcesContent":["import { resolveOptions } from \"../config/resolveOptions.js\";\nimport type { InputNormalizer, ResolvedUserOptions, StreamPluginOptions } from \"../types.js\";\nimport { type Manifest, type Plugin } from \"vite\";\nimport { transformModuleIfNeeded } from \"../loader/react-loader.js\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { createInputNormalizer } from \"../helpers/inputNormalizer.js\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\nimport { join } from \"node:path\";\n/**\n * Plugin for transforming React Client Components.\n *\n * Core responsibilities:\n * 1. Detects \"use client\" directives\n * 2. Transforms client components for RSC boundaries\n * 3. Adds client reference metadata for RSC\n *\n * When a component is marked with \"use client\", it:\n * - Gets transformed into a client reference\n * - Maintains module ID for RSC boundaries\n * - Preserves class/function behavior\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * viteReactClientTransformPlugin({\n * projectRoot: process.cwd(),\n * })\n * ]\n * });\n * ```\n */\n\nexport function reactTransformPlugin(options: StreamPluginOptions): Plugin {\n let normalizer: InputNormalizer;\n let clientManifest: Manifest;\n let isDev:boolean;\n let userOptions: ResolvedUserOptions\n return {\n name: \"vite:react-transform\",\n enforce: \"pre\", // Run before Vite's transforms\n config(config, configEnv) {\n const resolvedOptionsResult = resolveOptions(\n options,\n config.build?.outDir?.startsWith(\n join(options.build?.outDir ?? DEFAULT_CONFIG.BUILD.outDir, options.build?.client ?? DEFAULT_CONFIG.BUILD.client)\n ) ?? false\n );\n isDev = configEnv.mode === \"development\" && configEnv.command === \"serve\"\n if (resolvedOptionsResult.type === \"error\") throw resolvedOptionsResult.error;\n userOptions = resolvedOptionsResult.userOptions;\n normalizer = createInputNormalizer({\n root: resolvedOptionsResult.userOptions.projectRoot,\n preserveModulesRoot: undefined,\n removeExtension: false,\n });\n\n },\n async transform(code, id, options) {\n const ssr = options?.ssr ?? false;\n if (!ssr) return null;\n if (!id.match(DEFAULT_CONFIG.FILE_REGEX)) return null;\n if (!code.match('\"use client\"')) return null;\n \n // Get the client manifest\n const clientManifestResult = tryManifest({\n root: userOptions.projectRoot,\n outDir: join(\n userOptions.build.outDir,\n userOptions.build.client\n ),\n ssrManifest: false,\n });\n if (clientManifestResult.type === \"error\") throw clientManifestResult.error;\n clientManifest = clientManifestResult.manifest;\n const [key, value] = normalizer(id);\n const transformed = await transformModuleIfNeeded(\n code,\n id,\n // Pass null for nextLoad since we don't need module loading in the plugin\n null\n );\n if (!transformed) return null;\n if (isDev) {\n return {\n code: transformed,\n map: null,\n };\n }\n const moduleIdIndex = transformed.indexOf(value);\n if (moduleIdIndex === -1) {\n console.warn(\n `[vite-plugin-react-server] Could not find module id in transformed code. Ignoring.`,\n {\n code,\n id,\n transformed,\n }\n );\n return null;\n }\n const clientPath = clientManifest[key]?.file;\n\n if (!clientPath) {\n console.warn(\n `[vite-plugin-react-server] Could not find client path for ${value}. Ignoring.`\n );\n return null;\n }\n return {\n code: transformed.replace(key, clientPath),\n map: null,\n };\n },\n };\n}\n"],"names":["options"],"mappings":"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"}
@@ -1,19 +1,2 @@
1
- export interface ViteReactClientTransformOptions {
2
- projectRoot?: string;
3
- moduleId?: (path: string, ssr: boolean) => string;
4
- validateModuleId?: (moduleId: string) => boolean;
5
- include?: string | RegExp | (string | RegExp)[];
6
- exclude?: string | RegExp | (string | RegExp)[];
7
- }
8
- export interface TransformerOptions {
9
- moduleId: (path: string, ssr: boolean) => string;
10
- /**
11
- * Optional validation function for module IDs
12
- */
13
- validateModuleId?: (moduleId: string) => boolean;
14
- /**
15
- * The directory to use for the module IDs
16
- */
17
- moduleBase: string;
18
- }
1
+ export {};
19
2
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../plugin/transformer/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAClD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IACjD;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACjD;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../plugin/transformer/types.ts"],"names":[],"mappings":""}
@@ -6,9 +6,7 @@ export type NormalizerInput = unknown;
6
6
  export type InputNormalizer = (input: NormalizerInput) => [string, string];
7
7
  export type InputNormalizerWorker = (input: NormalizerInput) => Promise<[string, string]>;
8
8
  export type ResolvedUserConfig = Required<Pick<UserConfig, "root" | "mode" | "build" | "resolve">> & Omit<UserConfig, "root" | "mode" | "build" | "resolve"> & {
9
- resolve: {
10
- alias: AliasOptions;
11
- } & ResolveOptions;
9
+ resolve: ResolveOptions;
12
10
  } & {
13
11
  build: NonNullable<Required<Pick<BuildOptions, "target" | "outDir" | "assetsDir" | "ssr" | "ssrEmitAssets" | "ssrManifest" | "manifest" | "rollupOptions">>> & Omit<BuildOptions, "target" | "outDir" | "assetsDir" | "ssr" | "ssrEmitAssets" | "ssrManifest" | "manifest">;
14
12
  };
@@ -23,8 +21,8 @@ export interface StreamPluginOptionsClient {
23
21
  clientComponents?: AliasOptions;
24
22
  cssFiles?: AliasOptions;
25
23
  }
26
- export type ResolvedUserOptions = Required<Pick<StreamPluginOptions, "moduleBase" | "moduleBasePath" | "moduleBaseURL" | "projectRoot" | "build" | "Page" | "props" | "Html" | "pageExportName" | "propsExportName" | "collectCss" | "collectAssets" | "htmlWorkerPath" | "rscWorkerPath" | "loaderPath" | "clientEntry" | "serverEntry" | "moduleBaseExceptions" | "pipableStreamOptions" | "moduleId">> & {
27
- build: NonNullable<Required<StreamPluginOptions["build"]>>;
24
+ export type ResolvedUserOptions<InlineCSS extends boolean = boolean> = Required<Pick<StreamPluginOptions, "moduleBase" | "moduleBasePath" | "moduleBaseURL" | "projectRoot" | "build" | "Page" | "props" | "Html" | "CssCollector" | "pageExportName" | "propsExportName" | "collectCss" | "collectAssets" | "inlineCss" | "htmlWorkerPath" | "rscWorkerPath" | "loaderPath" | "clientEntry" | "serverEntry" | "moduleBaseExceptions" | "pipableStreamOptions">> & {
25
+ build: NonNullable<Required<StreamPluginOptions<InlineCSS>["build"]>>;
28
26
  autoDiscover: {
29
27
  modulePattern: (path: string) => boolean;
30
28
  cssPattern: (path: string) => boolean;
@@ -44,7 +42,7 @@ export type createBuildConfigFn<C extends "react-client" | "react-server"> = (in
44
42
  mode: "production" | "development" | "test";
45
43
  inputNormalizer: C extends "react-server" ? InputNormalizerWorker : InputNormalizerWorker;
46
44
  }) => C extends "react-server" ? Promise<InlineConfig> : Promise<InlineConfig>;
47
- export interface StreamPluginOptions {
45
+ export interface StreamPluginOptions<InlineCSS extends boolean = boolean> {
48
46
  projectRoot?: string;
49
47
  moduleBase: string;
50
48
  moduleBasePath?: string;
@@ -77,22 +75,37 @@ export interface StreamPluginOptions {
77
75
  url: string;
78
76
  children: React.ReactNode;
79
77
  }>;
78
+ CssCollector?: InlineCSS extends true ? React.FC<React.PropsWithChildren<InlineCssCollectorProps>> : React.FC<React.PropsWithChildren<CssCollectorProps>>;
80
79
  collectCss?: boolean;
81
80
  collectAssets?: boolean;
81
+ inlineCss?: InlineCSS;
82
82
  build?: BuildConfig;
83
83
  moduleBaseExceptions?: string[];
84
84
  pipableStreamOptions?: PipeableStreamOptions;
85
- moduleId?: (id: string, ssr: boolean) => string;
86
85
  }
87
- export interface CreateHandlerOptions<T = any> {
86
+ export interface CreateHandlerOptions<T = any, InlineCSS extends boolean = boolean> {
87
+ root: string;
88
+ url: string;
89
+ route: string;
90
+ getCss: (id: string) => Promise<Map<string, string | CssContent>> | Map<string, string | CssContent>;
88
91
  loader: (id: string) => Promise<T>;
89
- clientManifest?: import("vite").Manifest;
90
- serverManifest?: import("vite").Manifest;
91
- moduleGraph?: import("vite").ModuleGraph;
92
- cssFiles?: string[];
92
+ Html: NonNullable<StreamPluginOptions['Html']>;
93
+ CssCollector: InlineCSS extends true ? React.FC<React.PropsWithChildren<InlineCssCollectorProps>> : React.FC<React.PropsWithChildren<CssCollectorProps>>;
94
+ inlineCss: InlineCSS;
95
+ propsPath?: string;
96
+ pagePath?: string;
97
+ pageExportName: string;
98
+ propsExportName: string;
99
+ moduleBase: string;
100
+ preserveModulesRoot?: boolean | undefined;
101
+ moduleBasePath: string;
102
+ moduleRootPath: string;
103
+ moduleBaseURL: string;
104
+ cssFiles: (string | CssContent)[];
105
+ cssModules?: Map<string, string | CssContent> | undefined;
93
106
  onCssFile?: (path: string, parentUrl: string) => void;
94
- logger?: import("vite").Logger;
95
- pipableStreamOptions?: PipeableStreamOptions;
107
+ logger: import("vite").Logger;
108
+ pipableStreamOptions: PipeableStreamOptions;
96
109
  }
97
110
  export type ModuleLoader = (url: string, context?: any, defaultLoad?: any) => Promise<Record<string, any>>;
98
111
  export interface BaseProps {
@@ -143,7 +156,7 @@ export interface BuildOutput {
143
156
  ext?: string;
144
157
  }
145
158
  export interface BuildConfig {
146
- pages: string[] | (() => Promise<string[]> | string[]);
159
+ pages: string[] | (() => Promise<string[]> | string[]) | Promise<string[]>;
147
160
  assetsDir?: string;
148
161
  client?: string;
149
162
  server?: string;
@@ -258,4 +271,46 @@ export type HtmlProps = {
258
271
  url: string;
259
272
  cssFiles: string[];
260
273
  };
274
+ export interface PageAsset {
275
+ type: 'css' | 'js';
276
+ path: string;
277
+ parentUrl: string;
278
+ }
279
+ export interface PageData {
280
+ route: string;
281
+ clientComponents?: string[];
282
+ html?: {
283
+ raw: string;
284
+ transformed?: string;
285
+ assets: PageAsset[];
286
+ };
287
+ rsc?: {
288
+ content: string;
289
+ modules: Array<[string, string]>;
290
+ };
291
+ }
292
+ export interface CssContent {
293
+ type?: string;
294
+ content: string;
295
+ key?: string;
296
+ path: string;
297
+ }
298
+ export interface InlineCssCollectorProps {
299
+ cssFiles: CssContent[];
300
+ root: string;
301
+ moduleBaseURL: string;
302
+ moduleBasePath: string;
303
+ moduleRootPath: string;
304
+ route: string;
305
+ children?: React.ReactNode;
306
+ }
307
+ export interface CssCollectorProps {
308
+ cssFiles: CssContent[];
309
+ root: string;
310
+ moduleBaseURL: string;
311
+ moduleBasePath: string;
312
+ moduleRootPath: string;
313
+ route: string;
314
+ children?: React.ReactNode;
315
+ }
261
316
  //# sourceMappingURL=types.d.ts.map