@cedarjs/vite 0.0.4

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 (213) hide show
  1. package/LICENSE +21 -0
  2. package/bins/rw-vite-build.mjs +61 -0
  3. package/bins/rw-vite-dev.mjs +57 -0
  4. package/bins/vite.mjs +12 -0
  5. package/dist/build/build.d.ts +21 -0
  6. package/dist/build/build.d.ts.map +1 -0
  7. package/dist/build/build.js +78 -0
  8. package/dist/buildFeServer.d.ts +6 -0
  9. package/dist/buildFeServer.d.ts.map +1 -0
  10. package/dist/buildFeServer.js +39 -0
  11. package/dist/buildRouteHooks.d.ts +3 -0
  12. package/dist/buildRouteHooks.d.ts.map +1 -0
  13. package/dist/buildRouteHooks.js +45 -0
  14. package/dist/buildRouteManifest.d.ts +6 -0
  15. package/dist/buildRouteManifest.d.ts.map +1 -0
  16. package/dist/buildRouteManifest.js +58 -0
  17. package/dist/buildRscClientAndServer.d.ts +4 -0
  18. package/dist/buildRscClientAndServer.d.ts.map +1 -0
  19. package/dist/buildRscClientAndServer.js +30 -0
  20. package/dist/bundled/react-server-dom-webpack.server.d.ts +2 -0
  21. package/dist/bundled/react-server-dom-webpack.server.d.ts.map +1 -0
  22. package/dist/bundled/react-server-dom-webpack.server.js +33529 -0
  23. package/dist/cjs/ClientRouter.d.ts +1 -0
  24. package/dist/cjs/build/build.d.ts +1 -0
  25. package/dist/cjs/build/build.js +116 -0
  26. package/dist/cjs/buildFeServer.d.ts +1 -0
  27. package/dist/cjs/buildFeServer.js +63 -0
  28. package/dist/cjs/buildRouteHooks.js +66 -0
  29. package/dist/cjs/buildRouteManifest.js +92 -0
  30. package/dist/cjs/buildRscClientAndServer.js +54 -0
  31. package/dist/cjs/client.d.ts +1 -0
  32. package/dist/cjs/clientSsr.d.ts +1 -0
  33. package/dist/cjs/devFeServer.js +153 -0
  34. package/dist/cjs/index.d.ts +1 -0
  35. package/dist/cjs/index.js +184 -0
  36. package/dist/cjs/lib/StatusError.js +36 -0
  37. package/dist/cjs/lib/entries.js +53 -0
  38. package/dist/cjs/lib/envVarDefinitions.js +87 -0
  39. package/dist/cjs/lib/getMergedConfig.js +187 -0
  40. package/dist/cjs/lib/onWarn.js +36 -0
  41. package/dist/cjs/lib/registerFwGlobalsAndShims.js +117 -0
  42. package/dist/cjs/middleware/index.js +22 -0
  43. package/dist/cjs/middleware/invokeMiddleware.js +52 -0
  44. package/dist/cjs/middleware/register.js +106 -0
  45. package/dist/cjs/middleware/types.js +16 -0
  46. package/dist/cjs/package.json +1 -0
  47. package/dist/cjs/plugins/vite-plugin-jsx-loader.js +42 -0
  48. package/dist/cjs/plugins/vite-plugin-remove-from-bundle.js +56 -0
  49. package/dist/cjs/plugins/vite-plugin-rsc-analyze.js +104 -0
  50. package/dist/cjs/plugins/vite-plugin-rsc-reload.js +75 -0
  51. package/dist/cjs/plugins/vite-plugin-rsc-routes-auto-loader.js +159 -0
  52. package/dist/cjs/plugins/vite-plugin-rsc-routes-imports.js +125 -0
  53. package/dist/cjs/plugins/vite-plugin-rsc-ssr-router-import.js +75 -0
  54. package/dist/cjs/plugins/vite-plugin-rsc-transform-client.js +229 -0
  55. package/dist/cjs/plugins/vite-plugin-rsc-transform-server.js +398 -0
  56. package/dist/cjs/plugins/vite-plugin-swap-apollo-provider.js +41 -0
  57. package/dist/cjs/rsc/rscBuildAnalyze.js +116 -0
  58. package/dist/cjs/rsc/rscBuildClient.js +91 -0
  59. package/dist/cjs/rsc/rscBuildCopyCssAssets.js +56 -0
  60. package/dist/cjs/rsc/rscBuildEntriesFile.js +115 -0
  61. package/dist/cjs/rsc/rscBuildForServer.js +157 -0
  62. package/dist/cjs/rsc/rscBuildForSsr.js +172 -0
  63. package/dist/cjs/rsc/rscBuildRwEnvVars.js +56 -0
  64. package/dist/cjs/rsc/rscRenderer.js +165 -0
  65. package/dist/cjs/rsc/rscRequestHandler.js +162 -0
  66. package/dist/cjs/rsc/rscStudioHandlers.js +154 -0
  67. package/dist/cjs/runFeServer.js +166 -0
  68. package/dist/cjs/streaming/buildForStreamingServer.js +65 -0
  69. package/dist/cjs/streaming/collectCss.js +52 -0
  70. package/dist/cjs/streaming/createReactStreamingHandler.js +173 -0
  71. package/dist/cjs/streaming/streamHelpers.js +228 -0
  72. package/dist/cjs/streaming/transforms/bufferedTransform.js +61 -0
  73. package/dist/cjs/streaming/transforms/cancelTimeoutTransform.js +34 -0
  74. package/dist/cjs/streaming/transforms/encode-decode.js +36 -0
  75. package/dist/cjs/streaming/transforms/serverInjectionTransform.js +84 -0
  76. package/dist/cjs/streaming/triggerRouteHooks.js +96 -0
  77. package/dist/cjs/types.js +16 -0
  78. package/dist/cjs/utils.js +91 -0
  79. package/dist/devFeServer.d.ts +2 -0
  80. package/dist/devFeServer.d.ts.map +1 -0
  81. package/dist/devFeServer.js +134 -0
  82. package/dist/index.d.ts +6 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +154 -0
  85. package/dist/lib/StatusError.d.ts +8 -0
  86. package/dist/lib/StatusError.d.ts.map +1 -0
  87. package/dist/lib/StatusError.js +11 -0
  88. package/dist/lib/entries.d.ts +3 -0
  89. package/dist/lib/entries.d.ts.map +1 -0
  90. package/dist/lib/entries.js +32 -0
  91. package/dist/lib/envVarDefinitions.d.ts +14 -0
  92. package/dist/lib/envVarDefinitions.d.ts.map +1 -0
  93. package/dist/lib/envVarDefinitions.js +53 -0
  94. package/dist/lib/getMergedConfig.d.ts +11 -0
  95. package/dist/lib/getMergedConfig.d.ts.map +1 -0
  96. package/dist/lib/getMergedConfig.js +153 -0
  97. package/dist/lib/onWarn.d.ts +3 -0
  98. package/dist/lib/onWarn.d.ts.map +1 -0
  99. package/dist/lib/onWarn.js +12 -0
  100. package/dist/lib/registerFwGlobalsAndShims.d.ts +12 -0
  101. package/dist/lib/registerFwGlobalsAndShims.d.ts.map +1 -0
  102. package/dist/lib/registerFwGlobalsAndShims.js +83 -0
  103. package/dist/middleware/index.d.ts +2 -0
  104. package/dist/middleware/index.d.ts.map +1 -0
  105. package/dist/middleware/index.js +1 -0
  106. package/dist/middleware/invokeMiddleware.d.ts +14 -0
  107. package/dist/middleware/invokeMiddleware.d.ts.map +1 -0
  108. package/dist/middleware/invokeMiddleware.js +32 -0
  109. package/dist/middleware/register.d.ts +23 -0
  110. package/dist/middleware/register.d.ts.map +1 -0
  111. package/dist/middleware/register.js +69 -0
  112. package/dist/middleware/types.d.ts +3 -0
  113. package/dist/middleware/types.d.ts.map +1 -0
  114. package/dist/middleware/types.js +0 -0
  115. package/dist/package.json +1 -0
  116. package/dist/plugins/vite-plugin-jsx-loader.d.ts +8 -0
  117. package/dist/plugins/vite-plugin-jsx-loader.d.ts.map +1 -0
  118. package/dist/plugins/vite-plugin-jsx-loader.js +18 -0
  119. package/dist/plugins/vite-plugin-remove-from-bundle.d.ts +17 -0
  120. package/dist/plugins/vite-plugin-remove-from-bundle.d.ts.map +1 -0
  121. package/dist/plugins/vite-plugin-remove-from-bundle.js +31 -0
  122. package/dist/plugins/vite-plugin-rsc-analyze.d.ts +3 -0
  123. package/dist/plugins/vite-plugin-rsc-analyze.d.ts.map +1 -0
  124. package/dist/plugins/vite-plugin-rsc-analyze.js +70 -0
  125. package/dist/plugins/vite-plugin-rsc-reload.d.ts +3 -0
  126. package/dist/plugins/vite-plugin-rsc-reload.d.ts.map +1 -0
  127. package/dist/plugins/vite-plugin-rsc-reload.js +41 -0
  128. package/dist/plugins/vite-plugin-rsc-routes-auto-loader.d.ts +3 -0
  129. package/dist/plugins/vite-plugin-rsc-routes-auto-loader.d.ts.map +1 -0
  130. package/dist/plugins/vite-plugin-rsc-routes-auto-loader.js +130 -0
  131. package/dist/plugins/vite-plugin-rsc-routes-imports.d.ts +3 -0
  132. package/dist/plugins/vite-plugin-rsc-routes-imports.d.ts.map +1 -0
  133. package/dist/plugins/vite-plugin-rsc-routes-imports.js +96 -0
  134. package/dist/plugins/vite-plugin-rsc-ssr-router-import.d.ts +7 -0
  135. package/dist/plugins/vite-plugin-rsc-ssr-router-import.d.ts.map +1 -0
  136. package/dist/plugins/vite-plugin-rsc-ssr-router-import.js +41 -0
  137. package/dist/plugins/vite-plugin-rsc-transform-client.d.ts +3 -0
  138. package/dist/plugins/vite-plugin-rsc-transform-client.d.ts.map +1 -0
  139. package/dist/plugins/vite-plugin-rsc-transform-client.js +195 -0
  140. package/dist/plugins/vite-plugin-rsc-transform-server.d.ts +3 -0
  141. package/dist/plugins/vite-plugin-rsc-transform-server.d.ts.map +1 -0
  142. package/dist/plugins/vite-plugin-rsc-transform-server.js +364 -0
  143. package/dist/plugins/vite-plugin-swap-apollo-provider.d.ts +12 -0
  144. package/dist/plugins/vite-plugin-swap-apollo-provider.d.ts.map +1 -0
  145. package/dist/plugins/vite-plugin-swap-apollo-provider.js +17 -0
  146. package/dist/rsc/rscBuildAnalyze.d.ts +16 -0
  147. package/dist/rsc/rscBuildAnalyze.d.ts.map +1 -0
  148. package/dist/rsc/rscBuildAnalyze.js +92 -0
  149. package/dist/rsc/rscBuildClient.d.ts +7 -0
  150. package/dist/rsc/rscBuildClient.d.ts.map +1 -0
  151. package/dist/rsc/rscBuildClient.js +67 -0
  152. package/dist/rsc/rscBuildCopyCssAssets.d.ts +7 -0
  153. package/dist/rsc/rscBuildCopyCssAssets.d.ts.map +1 -0
  154. package/dist/rsc/rscBuildCopyCssAssets.js +22 -0
  155. package/dist/rsc/rscBuildEntriesFile.d.ts +10 -0
  156. package/dist/rsc/rscBuildEntriesFile.d.ts.map +1 -0
  157. package/dist/rsc/rscBuildEntriesFile.js +81 -0
  158. package/dist/rsc/rscBuildForServer.d.ts +7 -0
  159. package/dist/rsc/rscBuildForServer.d.ts.map +1 -0
  160. package/dist/rsc/rscBuildForServer.js +133 -0
  161. package/dist/rsc/rscBuildForSsr.d.ts +9 -0
  162. package/dist/rsc/rscBuildForSsr.d.ts.map +1 -0
  163. package/dist/rsc/rscBuildForSsr.js +138 -0
  164. package/dist/rsc/rscBuildRwEnvVars.d.ts +10 -0
  165. package/dist/rsc/rscBuildRwEnvVars.d.ts.map +1 -0
  166. package/dist/rsc/rscBuildRwEnvVars.js +22 -0
  167. package/dist/rsc/rscRenderer.d.ts +9 -0
  168. package/dist/rsc/rscRenderer.d.ts.map +1 -0
  169. package/dist/rsc/rscRenderer.js +130 -0
  170. package/dist/rsc/rscRequestHandler.d.ts +10 -0
  171. package/dist/rsc/rscRequestHandler.d.ts.map +1 -0
  172. package/dist/rsc/rscRequestHandler.js +131 -0
  173. package/dist/rsc/rscStudioHandlers.d.ts +10 -0
  174. package/dist/rsc/rscStudioHandlers.d.ts.map +1 -0
  175. package/dist/rsc/rscStudioHandlers.js +120 -0
  176. package/dist/runFeServer.d.ts +2 -0
  177. package/dist/runFeServer.d.ts.map +1 -0
  178. package/dist/runFeServer.js +132 -0
  179. package/dist/streaming/buildForStreamingServer.d.ts +4 -0
  180. package/dist/streaming/buildForStreamingServer.d.ts.map +1 -0
  181. package/dist/streaming/buildForStreamingServer.js +41 -0
  182. package/dist/streaming/collectCss.d.ts +7 -0
  183. package/dist/streaming/collectCss.d.ts.map +1 -0
  184. package/dist/streaming/collectCss.js +27 -0
  185. package/dist/streaming/createReactStreamingHandler.d.ts +12 -0
  186. package/dist/streaming/createReactStreamingHandler.d.ts.map +1 -0
  187. package/dist/streaming/createReactStreamingHandler.js +139 -0
  188. package/dist/streaming/streamHelpers.d.ts +23 -0
  189. package/dist/streaming/streamHelpers.d.ts.map +1 -0
  190. package/dist/streaming/streamHelpers.js +192 -0
  191. package/dist/streaming/transforms/bufferedTransform.d.ts +2 -0
  192. package/dist/streaming/transforms/bufferedTransform.d.ts.map +1 -0
  193. package/dist/streaming/transforms/bufferedTransform.js +37 -0
  194. package/dist/streaming/transforms/cancelTimeoutTransform.d.ts +2 -0
  195. package/dist/streaming/transforms/cancelTimeoutTransform.d.ts.map +1 -0
  196. package/dist/streaming/transforms/cancelTimeoutTransform.js +10 -0
  197. package/dist/streaming/transforms/encode-decode.d.ts +3 -0
  198. package/dist/streaming/transforms/encode-decode.d.ts.map +1 -0
  199. package/dist/streaming/transforms/encode-decode.js +11 -0
  200. package/dist/streaming/transforms/serverInjectionTransform.d.ts +16 -0
  201. package/dist/streaming/transforms/serverInjectionTransform.d.ts.map +1 -0
  202. package/dist/streaming/transforms/serverInjectionTransform.js +60 -0
  203. package/dist/streaming/triggerRouteHooks.d.ts +26 -0
  204. package/dist/streaming/triggerRouteHooks.d.ts.map +1 -0
  205. package/dist/streaming/triggerRouteHooks.js +71 -0
  206. package/dist/types.d.ts +31 -0
  207. package/dist/types.d.ts.map +1 -0
  208. package/dist/types.js +0 -0
  209. package/dist/utils.d.ts +14 -0
  210. package/dist/utils.d.ts.map +1 -0
  211. package/dist/utils.js +62 -0
  212. package/inject/reactRefresh.js +7 -0
  213. package/package.json +116 -0
@@ -0,0 +1,192 @@
1
+ import path from "node:path";
2
+ import { getConfig, getPaths } from "@cedarjs/project-config";
3
+ import { makeFilePath } from "../utils.js";
4
+ import { createBufferedTransformStream } from "./transforms/bufferedTransform.js";
5
+ import { createTimeoutTransform } from "./transforms/cancelTimeoutTransform.js";
6
+ import { createServerInjectionTransform } from "./transforms/serverInjectionTransform.js";
7
+ const rscWebpackShims = `globalThis.__rw_module_cache__ ||= new Map();
8
+
9
+ globalThis.__webpack_chunk_load__ ||= (id) => {
10
+ console.log('rscWebpackShims chunk load id', id)
11
+ return import(id).then((mod) => {
12
+ console.log('rscWebpackShims chunk load mod', mod)
13
+
14
+ // checking mod.default to better support CJS. If it's an object, it's
15
+ // likely a CJS module. Otherwise it's probably an ES module with a
16
+ // default export
17
+ if (mod.default && typeof mod.default === 'object') {
18
+ return globalThis.__rw_module_cache__.set(id, mod.default)
19
+ }
20
+
21
+ return globalThis.__rw_module_cache__.set(id, mod)
22
+ })
23
+ };
24
+
25
+ globalThis.__webpack_require__ ||= (id) => {
26
+ console.log('rscWebpackShims require id', id)
27
+ return globalThis.__rw_module_cache__.get(id)
28
+ };
29
+ `;
30
+ async function reactRenderToStreamResponse(mwRes, renderOptions, streamOptions) {
31
+ const { waitForAllReady = false } = streamOptions;
32
+ const {
33
+ ServerEntry,
34
+ FallbackDocument,
35
+ currentUrl,
36
+ metaTags,
37
+ cssLinks,
38
+ isProd,
39
+ jsBundles = [],
40
+ authState
41
+ } = renderOptions;
42
+ if (!isProd) {
43
+ jsBundles.push(
44
+ new URL("../../inject/reactRefresh.js", import.meta.url).pathname
45
+ );
46
+ }
47
+ const assetMap = JSON.stringify({
48
+ css: cssLinks,
49
+ meta: metaTags
50
+ });
51
+ const rscEnabled = getConfig().experimental?.rsc?.enabled;
52
+ const { createElement } = rscEnabled ? await importModule("__rwjs__react") : await import("react");
53
+ const {
54
+ createInjector,
55
+ ServerHtmlProvider,
56
+ ServerInjectedHtml
57
+ } = rscEnabled ? await importModule("__rwjs__server_inject") : await import("@cedarjs/web/serverInject");
58
+ const { renderToString } = rscEnabled ? await importModule("rd-server") : await import("react-dom/server");
59
+ const { injectionState, injectToPage } = createInjector();
60
+ const bufferTransform = createBufferedTransformStream();
61
+ const serverInjectionTransform = createServerInjectionTransform({
62
+ injectionState,
63
+ createElement,
64
+ ServerInjectedHtml,
65
+ renderToString,
66
+ onlyOnFlush: waitForAllReady
67
+ });
68
+ const controller = new AbortController();
69
+ const timeoutHandle = setTimeout(() => {
70
+ controller.abort();
71
+ }, 1e4);
72
+ const timeoutTransform = createTimeoutTransform(timeoutHandle);
73
+ const { ServerAuthProvider } = rscEnabled ? await importModule("__rwjs__server_auth_provider") : await import("@cedarjs/auth/dist/AuthProvider/ServerAuthProvider.js");
74
+ const { LocationProvider } = rscEnabled ? await importModule("__rwjs__location") : await import("@cedarjs/router/location");
75
+ const renderRoot = (url) => {
76
+ return createElement(
77
+ ServerAuthProvider,
78
+ {
79
+ value: authState
80
+ },
81
+ createElement(
82
+ LocationProvider,
83
+ {
84
+ location: url
85
+ },
86
+ createElement(
87
+ ServerHtmlProvider,
88
+ {
89
+ value: injectToPage
90
+ },
91
+ createElement(ServerEntry, {
92
+ css: cssLinks,
93
+ meta: metaTags
94
+ })
95
+ )
96
+ )
97
+ );
98
+ };
99
+ const bootstrapOptions = {
100
+ bootstrapScriptContent: (
101
+ // Only insert assetMap if client side JS will be loaded
102
+ jsBundles.length > 0 ? `window.__REDWOOD__ASSET_MAP = ${assetMap}; ${rscWebpackShims}` : void 0
103
+ ),
104
+ bootstrapModules: jsBundles
105
+ };
106
+ const { renderToReadableStream } = rscEnabled ? await importModule("rd-server") : await import("react-dom/server.edge");
107
+ try {
108
+ let didErrorOutsideShell = false;
109
+ const renderToStreamOptions = {
110
+ ...bootstrapOptions,
111
+ signal: controller.signal,
112
+ onError: (err) => {
113
+ didErrorOutsideShell = true;
114
+ console.error("\u{1F53B} Caught error outside shell");
115
+ streamOptions.onError?.(err);
116
+ }
117
+ };
118
+ const root = renderRoot(currentUrl);
119
+ const reactStream = await renderToReadableStream(root, renderToStreamOptions);
120
+ if (waitForAllReady) {
121
+ await reactStream.allReady;
122
+ }
123
+ const transformsToApply = [
124
+ !waitForAllReady && bufferTransform,
125
+ serverInjectionTransform,
126
+ !waitForAllReady && timeoutTransform
127
+ ];
128
+ const outputStream = applyStreamTransforms(
129
+ reactStream,
130
+ transformsToApply
131
+ );
132
+ mwRes.status = didErrorOutsideShell ? 500 : 200;
133
+ mwRes.body = outputStream;
134
+ mwRes.headers.set("content-type", "text/html");
135
+ return mwRes.toResponse();
136
+ } catch (e) {
137
+ console.error("\u{1F53B} Failed to render shell");
138
+ streamOptions.onError?.(e);
139
+ const fallbackShell = await renderToReadableStream(
140
+ FallbackDocument({
141
+ children: null,
142
+ css: cssLinks,
143
+ meta: metaTags
144
+ }),
145
+ bootstrapOptions
146
+ );
147
+ mwRes.status = 500;
148
+ mwRes.body = fallbackShell;
149
+ mwRes.headers.set("content-type", "text/html");
150
+ return mwRes.toResponse();
151
+ } finally {
152
+ clearTimeout(timeoutHandle);
153
+ }
154
+ }
155
+ function applyStreamTransforms(reactStream, transformsToApply) {
156
+ let outputStream = reactStream;
157
+ for (const transform of transformsToApply) {
158
+ if (!transform) {
159
+ continue;
160
+ }
161
+ outputStream = outputStream.pipeThrough(transform);
162
+ }
163
+ return outputStream;
164
+ }
165
+ async function importModule(mod) {
166
+ const distSsr = getPaths().web.distSsr;
167
+ const rdServerPath = makeFilePath(path.join(distSsr, "rd-server.mjs"));
168
+ const reactPath = makeFilePath(path.join(distSsr, "__rwjs__react.mjs"));
169
+ const locationPath = makeFilePath(path.join(distSsr, "__rwjs__location.mjs"));
170
+ const ServerAuthProviderPath = makeFilePath(
171
+ path.join(distSsr, "__rwjs__server_auth_provider.mjs")
172
+ );
173
+ const ServerInjectPath = makeFilePath(
174
+ path.join(distSsr, "__rwjs__server_inject.mjs")
175
+ );
176
+ if (mod === "rd-server") {
177
+ return (await import(rdServerPath)).default;
178
+ } else if (mod === "__rwjs__react") {
179
+ return (await import(reactPath)).default;
180
+ } else if (mod === "__rwjs__location") {
181
+ return await import(locationPath);
182
+ } else if (mod === "__rwjs__server_auth_provider") {
183
+ return await import(ServerAuthProviderPath);
184
+ } else if (mod === "__rwjs__server_inject") {
185
+ return await import(ServerInjectPath);
186
+ }
187
+ throw new Error("Unknown module " + mod);
188
+ }
189
+ export {
190
+ importModule,
191
+ reactRenderToStreamResponse
192
+ };
@@ -0,0 +1,2 @@
1
+ export declare function createBufferedTransformStream(): TransformStream<any, any>;
2
+ //# sourceMappingURL=bufferedTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bufferedTransform.d.ts","sourceRoot":"","sources":["../../../src/streaming/transforms/bufferedTransform.ts"],"names":[],"mappings":"AAGA,wBAAgB,6BAA6B,8BAwC5C"}
@@ -0,0 +1,37 @@
1
+ const queueTask = setImmediate;
2
+ function createBufferedTransformStream() {
3
+ let bufferedBytes = new Uint8Array();
4
+ let pendingFlush = null;
5
+ const flushBuffer = (controller) => {
6
+ if (!pendingFlush) {
7
+ pendingFlush = new Promise((resolve) => {
8
+ queueTask(() => {
9
+ controller.enqueue(bufferedBytes);
10
+ bufferedBytes = new Uint8Array();
11
+ pendingFlush = null;
12
+ resolve();
13
+ });
14
+ });
15
+ }
16
+ };
17
+ return new TransformStream({
18
+ transform(chunk, controller) {
19
+ const newBufferedBytes = new Uint8Array(
20
+ bufferedBytes.length + chunk.length
21
+ );
22
+ newBufferedBytes.set(bufferedBytes);
23
+ newBufferedBytes.set(chunk, bufferedBytes.length);
24
+ bufferedBytes = newBufferedBytes;
25
+ flushBuffer(controller);
26
+ },
27
+ flush() {
28
+ if (pendingFlush) {
29
+ return pendingFlush;
30
+ }
31
+ return;
32
+ }
33
+ });
34
+ }
35
+ export {
36
+ createBufferedTransformStream
37
+ };
@@ -0,0 +1,2 @@
1
+ export declare function createTimeoutTransform(timeoutHandle: NodeJS.Timeout): TransformStream<any, any>;
2
+ //# sourceMappingURL=cancelTimeoutTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancelTimeoutTransform.d.ts","sourceRoot":"","sources":["../../../src/streaming/transforms/cancelTimeoutTransform.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,6BAMnE"}
@@ -0,0 +1,10 @@
1
+ function createTimeoutTransform(timeoutHandle) {
2
+ return new TransformStream({
3
+ flush() {
4
+ clearTimeout(timeoutHandle);
5
+ }
6
+ });
7
+ }
8
+ export {
9
+ createTimeoutTransform
10
+ };
@@ -0,0 +1,3 @@
1
+ export declare function encodeText(input: string): Uint8Array;
2
+ export declare function decodeText(input: Uint8Array | undefined): string;
3
+ //# sourceMappingURL=encode-decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode-decode.d.ts","sourceRoot":"","sources":["../../../src/streaming/transforms/encode-decode.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,cAEvC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,UAEvD"}
@@ -0,0 +1,11 @@
1
+ const textDecoder = new TextDecoder();
2
+ function encodeText(input) {
3
+ return new TextEncoder().encode(input);
4
+ }
5
+ function decodeText(input) {
6
+ return textDecoder.decode(input, { stream: true });
7
+ }
8
+ export {
9
+ decodeText,
10
+ encodeText
11
+ };
@@ -0,0 +1,16 @@
1
+ import type React from 'react';
2
+ import type RDServerModule from 'react-dom/server';
3
+ import type { RenderCallback } from '@cedarjs/web';
4
+ import type * as ServerInjectModule from '@cedarjs/web/dist/components/ServerInject';
5
+ type ServerInjectType = typeof ServerInjectModule;
6
+ type RDServerType = typeof RDServerModule;
7
+ type CreateServerInjectionArgs = {
8
+ injectionState: Set<RenderCallback>;
9
+ createElement: React['createElement'];
10
+ ServerInjectedHtml: ServerInjectType['ServerInjectedHtml'];
11
+ renderToString: RDServerType['renderToString'];
12
+ onlyOnFlush?: boolean;
13
+ };
14
+ export declare function createServerInjectionTransform({ injectionState, createElement, ServerInjectedHtml, renderToString, onlyOnFlush, }: CreateServerInjectionArgs): TransformStream<any, any>;
15
+ export {};
16
+ //# sourceMappingURL=serverInjectionTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverInjectionTransform.d.ts","sourceRoot":"","sources":["../../../src/streaming/transforms/serverInjectionTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,KAAK,KAAK,kBAAkB,MAAM,2CAA2C,CAAA;AAIpF,KAAK,gBAAgB,GAAG,OAAO,kBAAkB,CAAA;AACjD,KAAK,YAAY,GAAG,OAAO,cAAc,CAAA;AAEzC,KAAK,yBAAyB,GAAG;IAC/B,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,CAAA;IACnC,aAAa,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;IACrC,kBAAkB,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAA;IAC1D,cAAc,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,WAAmB,GACpB,EAAE,yBAAyB,6BAkE3B"}
@@ -0,0 +1,60 @@
1
+ import { encodeText } from "./encode-decode.js";
2
+ function createServerInjectionTransform({
3
+ injectionState,
4
+ createElement,
5
+ ServerInjectedHtml,
6
+ renderToString,
7
+ onlyOnFlush = false
8
+ }) {
9
+ const transformStream = new TransformStream({
10
+ transform(chunk, controller) {
11
+ if (onlyOnFlush) {
12
+ controller.enqueue(chunk);
13
+ } else {
14
+ const mergedBytes = insertHtml(chunk);
15
+ controller.enqueue(mergedBytes);
16
+ }
17
+ },
18
+ flush(controller) {
19
+ const mergedBytes = insertHtml();
20
+ controller.enqueue(mergedBytes);
21
+ const moveTagsScript = encodeText(`<script>document.querySelectorAll('body [data-rwjs-head]').forEach((el) => {
22
+ document.querySelectorAll('head ' + el.tagName).forEach((e) => {
23
+ if (
24
+ el.tagName === 'TITLE' ||
25
+ (el.tagName === 'META' &&
26
+ el.getAttribute('name') === e.getAttribute('name') &&
27
+ el.getAttribute('property') === e.getAttribute('property'))
28
+ ) {
29
+ e.remove();
30
+ }
31
+ document.head.appendChild(el);
32
+ });
33
+ });
34
+ </script>`);
35
+ controller.enqueue(moveTagsScript);
36
+ }
37
+ });
38
+ return transformStream;
39
+ function insertHtml(chunk) {
40
+ const serverHtmlOutput = renderToString(
41
+ createElement(ServerInjectedHtml, {
42
+ injectionState
43
+ })
44
+ );
45
+ const injectedBytes = encodeText(serverHtmlOutput);
46
+ if (chunk !== void 0) {
47
+ const mergedBytes = new Uint8Array(chunk.length + injectedBytes.length);
48
+ mergedBytes.set(chunk);
49
+ mergedBytes.set(injectedBytes, chunk.length);
50
+ return mergedBytes;
51
+ } else {
52
+ const injectedHtmlOutput = new Uint8Array(injectedBytes.length);
53
+ injectedHtmlOutput.set(injectedBytes);
54
+ return injectedHtmlOutput;
55
+ }
56
+ }
57
+ }
58
+ export {
59
+ createServerInjectionTransform
60
+ };
@@ -0,0 +1,26 @@
1
+ import type { ViteDevServer } from 'vite';
2
+ import type { MetaHook, RouteHookOutput, TagDescriptor } from '@cedarjs/web';
3
+ interface RouteHooks {
4
+ meta?: MetaHook;
5
+ }
6
+ interface TriggerRouteHooksParam {
7
+ routeHooks: RouteHooks;
8
+ req: Request;
9
+ parsedParams?: Record<string, any>;
10
+ previousOutput?: RouteHookOutput;
11
+ }
12
+ export declare const triggerRouteHooks: ({ routeHooks, req, parsedParams, previousOutput, }: TriggerRouteHooksParam) => Promise<{
13
+ meta: TagDescriptor[];
14
+ }>;
15
+ interface LoadAndRunRouteHooks {
16
+ paths: (string | null | undefined)[];
17
+ reqMeta: {
18
+ req: Request;
19
+ parsedParams?: Record<string, any>;
20
+ };
21
+ viteDevServer?: ViteDevServer;
22
+ previousOutput?: RouteHookOutput;
23
+ }
24
+ export declare const loadAndRunRouteHooks: ({ paths, reqMeta, viteDevServer, previousOutput, }: LoadAndRunRouteHooks) => Promise<RouteHookOutput>;
25
+ export {};
26
+ //# sourceMappingURL=triggerRouteHooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triggerRouteHooks.d.ts","sourceRoot":"","sources":["../../src/streaming/triggerRouteHooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAGzC,OAAO,KAAK,EACV,QAAQ,EAER,eAAe,EACf,aAAa,EACd,MAAM,cAAc,CAAA;AAErB,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,OAAO,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClC,cAAc,CAAC,EAAE,eAAe,CAAA;CACjC;AAED,eAAO,MAAM,iBAAiB,uDAK3B,sBAAsB;;EA4BxB,CAAA;AAED,UAAU,oBAAoB;IAC5B,KAAK,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,CAAA;IACpC,OAAO,EAAE;QACP,GAAG,EAAE,OAAO,CAAA;QACZ,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KACnC,CAAA;IACD,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,cAAc,CAAC,EAAE,eAAe,CAAA;CACjC;AAMD,eAAO,MAAM,oBAAoB,uDAK9B,oBAAoB,KAAG,OAAO,CAAC,eAAe,CAyChD,CAAA"}
@@ -0,0 +1,71 @@
1
+ import { parseSearch } from "@cedarjs/router/util";
2
+ const triggerRouteHooks = async ({
3
+ routeHooks,
4
+ req,
5
+ parsedParams = {},
6
+ previousOutput
7
+ }) => {
8
+ const event = {
9
+ params: parsedParams,
10
+ headers: req.headers || {},
11
+ query: parseSearch(req.url),
12
+ // cookies: req.cookies || {}, // TODO (STREAMING) we probably need some sort of cookie parser
13
+ // TODO (STREAMING) called app routeHook, but its just the previous output
14
+ appRouteHook: previousOutput
15
+ };
16
+ let meta = previousOutput?.meta || [];
17
+ try {
18
+ const metaRouteHookOutput = await routeHooks?.meta?.(event) || [];
19
+ const currentMeta = Array.isArray(metaRouteHookOutput) ? metaRouteHookOutput : [metaRouteHookOutput];
20
+ meta = [...meta, ...currentMeta];
21
+ } catch (e) {
22
+ throw new Error(`Error in meta hook: ${e.message}`);
23
+ }
24
+ return {
25
+ meta
26
+ };
27
+ };
28
+ const defaultRouteHookOutput = {
29
+ meta: []
30
+ };
31
+ const loadAndRunRouteHooks = async ({
32
+ paths = [],
33
+ reqMeta,
34
+ viteDevServer,
35
+ previousOutput = defaultRouteHookOutput
36
+ }) => {
37
+ const loadModule = async (path) => {
38
+ return viteDevServer ? viteDevServer.ssrLoadModule(path) : import(path);
39
+ };
40
+ let currentRouteHooks;
41
+ let rhOutput = defaultRouteHookOutput;
42
+ const routeHookPath = paths.shift();
43
+ try {
44
+ if (routeHookPath) {
45
+ currentRouteHooks = await loadModule(routeHookPath);
46
+ rhOutput = await triggerRouteHooks({
47
+ routeHooks: currentRouteHooks,
48
+ req: reqMeta.req,
49
+ parsedParams: reqMeta.parsedParams,
50
+ previousOutput
51
+ });
52
+ }
53
+ if (paths.length > 0) {
54
+ return loadAndRunRouteHooks({
55
+ paths,
56
+ reqMeta,
57
+ previousOutput: rhOutput,
58
+ viteDevServer
59
+ });
60
+ } else {
61
+ return rhOutput;
62
+ }
63
+ } catch (e) {
64
+ console.error(`Error loading route hooks in ${routeHookPath}}`);
65
+ throw e;
66
+ }
67
+ };
68
+ export {
69
+ loadAndRunRouteHooks,
70
+ triggerRouteHooks
71
+ };
@@ -0,0 +1,31 @@
1
+ /**
2
+ *
3
+ * Sub+Superset of RouteSpec returned by getProjectRoutes()
4
+ * in packages/internal/src/routes.ts
5
+ *
6
+ * Differences:
7
+ * - has path to routeHook (which is not available until after build)
8
+ * - bundle doesn't exist before build, comes from vite build manifest. Used in script injection
9
+ *
10
+ * **All** of these properties are used by the prod FE server
11
+ */
12
+ import type { RWRouteManifestItem } from '@cedarjs/internal';
13
+ import type { TagDescriptor } from '@cedarjs/web';
14
+ import type { MiddlewareReg } from './middleware/types.js';
15
+ export type RWRouteManifest = Record<PathDefinition, RWRouteManifestItem>;
16
+ type PathDefinition = string;
17
+ export type ServerEntryType = React.FunctionComponent<{
18
+ css: string[];
19
+ meta: TagDescriptor[];
20
+ }>;
21
+ export type EntryServer = {
22
+ registerMiddleware?: () => Promise<MiddlewareReg> | MiddlewareReg;
23
+ ServerEntry: ServerEntryType;
24
+ default: never;
25
+ } | {
26
+ registerMiddleware?: () => Promise<MiddlewareReg> | MiddlewareReg;
27
+ ServerEntry: never;
28
+ default: ServerEntryType;
29
+ };
30
+ export {};
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAA;AAEzE,KAAK,cAAc,GAAG,MAAM,CAAA;AAE5B,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACpD,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,IAAI,EAAE,aAAa,EAAE,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,WAAW,GACnB;IACE,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAA;IACjE,WAAW,EAAE,eAAe,CAAA;IAC5B,OAAO,EAAE,KAAK,CAAA;CACf,GACD;IACE,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAA;IACjE,WAAW,EAAE,KAAK,CAAA;IAClB,OAAO,EAAE,eAAe,CAAA;CACzB,CAAA"}
package/dist/types.js ADDED
File without changes
@@ -0,0 +1,14 @@
1
+ import type { Request as ExpressRequest } from 'express';
2
+ import type { ViteDevServer } from 'vite';
3
+ import type { EntryServer } from './types.js';
4
+ export declare function stripQueryStringAndHashFromPath(url: string): string;
5
+ export declare function ensureProcessDirWeb(webDir?: string): void;
6
+ /**
7
+ * Converts a file path to a URL path (file://...)
8
+ * Without this, absolute paths can't be imported on Windows
9
+ */
10
+ export declare function makeFilePath(path: string): string;
11
+ export declare function ssrLoadEntryServer(viteDevServer: ViteDevServer): Promise<EntryServer>;
12
+ export declare function convertExpressHeaders(expressDistinctHeaders: ExpressRequest['headersDistinct']): Headers;
13
+ export declare const getFullUrl: (req: ExpressRequest, rscEnabled: boolean) => string;
14
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAIzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,UAE1D;AAID,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAA4B,QAYvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,UAExC;AAED,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,aAAa,wBAYpE;AAED,wBAAgB,qBAAqB,CACnC,sBAAsB,EAAE,cAAc,CAAC,iBAAiB,CAAC,WAc1D;AAED,eAAO,MAAM,UAAU,QAAS,cAAc,cAAc,OAAO,WAiBlE,CAAA"}
package/dist/utils.js ADDED
@@ -0,0 +1,62 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { getPaths } from "@cedarjs/project-config";
3
+ function stripQueryStringAndHashFromPath(url) {
4
+ return url.split("?")[0].split("#")[0];
5
+ }
6
+ function ensureProcessDirWeb(webDir = getPaths().web.base) {
7
+ if (process.cwd() !== webDir) {
8
+ console.error("\u26A0\uFE0F Warning: CWD is ", process.cwd());
9
+ console.warn("~".repeat(50));
10
+ console.warn(
11
+ "The cwd must be web/. Please use `yarn rw <command>` or run the command from the web/ directory."
12
+ );
13
+ console.log(`Changing cwd to ${webDir}....`);
14
+ console.log();
15
+ process.chdir(webDir);
16
+ }
17
+ }
18
+ function makeFilePath(path) {
19
+ return pathToFileURL(path).href;
20
+ }
21
+ async function ssrLoadEntryServer(viteDevServer) {
22
+ const rwPaths = getPaths();
23
+ if (!rwPaths.web.entryServer) {
24
+ throw new Error("entryServer not defined");
25
+ }
26
+ return viteDevServer.ssrLoadModule(
27
+ rwPaths.web.entryServer
28
+ // Have to type cast here because ssrLoadModule just returns a generic
29
+ // Record<string, any> type
30
+ );
31
+ }
32
+ function convertExpressHeaders(expressDistinctHeaders) {
33
+ const headers = new Headers();
34
+ for (const name in expressDistinctHeaders) {
35
+ const values = expressDistinctHeaders[name];
36
+ if (Array.isArray(values)) {
37
+ for (const value of values) {
38
+ headers.append(name, value);
39
+ }
40
+ }
41
+ }
42
+ return headers;
43
+ }
44
+ const getFullUrl = (req, rscEnabled) => {
45
+ const baseUrl = req.protocol + "://" + req.headers.host;
46
+ const url = new URL(req.originalUrl || "", baseUrl);
47
+ const pathname = url.searchParams.get("__rwjs__pathname");
48
+ const search = url.searchParams.get("__rwjs__search");
49
+ let pathnamePlusSearch = req.originalUrl;
50
+ if (rscEnabled && pathname !== null && search !== null) {
51
+ pathnamePlusSearch = pathname + "?" + search;
52
+ }
53
+ return baseUrl + pathnamePlusSearch;
54
+ };
55
+ export {
56
+ convertExpressHeaders,
57
+ ensureProcessDirWeb,
58
+ getFullUrl,
59
+ makeFilePath,
60
+ ssrLoadEntryServer,
61
+ stripQueryStringAndHashFromPath
62
+ };
@@ -0,0 +1,7 @@
1
+ /* eslint-disable no-undef */
2
+
3
+ import RefreshRuntime from '/@react-refresh'
4
+ RefreshRuntime.injectIntoGlobalHook(window)
5
+ window.$RefreshReg$ = () => {}
6
+ window.$RefreshSig$ = () => (type) => type
7
+ window.__vite_plugin_react_preamble_installed__ = true