@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.
- package/LICENSE +21 -0
- package/bins/rw-vite-build.mjs +61 -0
- package/bins/rw-vite-dev.mjs +57 -0
- package/bins/vite.mjs +12 -0
- package/dist/build/build.d.ts +21 -0
- package/dist/build/build.d.ts.map +1 -0
- package/dist/build/build.js +78 -0
- package/dist/buildFeServer.d.ts +6 -0
- package/dist/buildFeServer.d.ts.map +1 -0
- package/dist/buildFeServer.js +39 -0
- package/dist/buildRouteHooks.d.ts +3 -0
- package/dist/buildRouteHooks.d.ts.map +1 -0
- package/dist/buildRouteHooks.js +45 -0
- package/dist/buildRouteManifest.d.ts +6 -0
- package/dist/buildRouteManifest.d.ts.map +1 -0
- package/dist/buildRouteManifest.js +58 -0
- package/dist/buildRscClientAndServer.d.ts +4 -0
- package/dist/buildRscClientAndServer.d.ts.map +1 -0
- package/dist/buildRscClientAndServer.js +30 -0
- package/dist/bundled/react-server-dom-webpack.server.d.ts +2 -0
- package/dist/bundled/react-server-dom-webpack.server.d.ts.map +1 -0
- package/dist/bundled/react-server-dom-webpack.server.js +33529 -0
- package/dist/cjs/ClientRouter.d.ts +1 -0
- package/dist/cjs/build/build.d.ts +1 -0
- package/dist/cjs/build/build.js +116 -0
- package/dist/cjs/buildFeServer.d.ts +1 -0
- package/dist/cjs/buildFeServer.js +63 -0
- package/dist/cjs/buildRouteHooks.js +66 -0
- package/dist/cjs/buildRouteManifest.js +92 -0
- package/dist/cjs/buildRscClientAndServer.js +54 -0
- package/dist/cjs/client.d.ts +1 -0
- package/dist/cjs/clientSsr.d.ts +1 -0
- package/dist/cjs/devFeServer.js +153 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +184 -0
- package/dist/cjs/lib/StatusError.js +36 -0
- package/dist/cjs/lib/entries.js +53 -0
- package/dist/cjs/lib/envVarDefinitions.js +87 -0
- package/dist/cjs/lib/getMergedConfig.js +187 -0
- package/dist/cjs/lib/onWarn.js +36 -0
- package/dist/cjs/lib/registerFwGlobalsAndShims.js +117 -0
- package/dist/cjs/middleware/index.js +22 -0
- package/dist/cjs/middleware/invokeMiddleware.js +52 -0
- package/dist/cjs/middleware/register.js +106 -0
- package/dist/cjs/middleware/types.js +16 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/plugins/vite-plugin-jsx-loader.js +42 -0
- package/dist/cjs/plugins/vite-plugin-remove-from-bundle.js +56 -0
- package/dist/cjs/plugins/vite-plugin-rsc-analyze.js +104 -0
- package/dist/cjs/plugins/vite-plugin-rsc-reload.js +75 -0
- package/dist/cjs/plugins/vite-plugin-rsc-routes-auto-loader.js +159 -0
- package/dist/cjs/plugins/vite-plugin-rsc-routes-imports.js +125 -0
- package/dist/cjs/plugins/vite-plugin-rsc-ssr-router-import.js +75 -0
- package/dist/cjs/plugins/vite-plugin-rsc-transform-client.js +229 -0
- package/dist/cjs/plugins/vite-plugin-rsc-transform-server.js +398 -0
- package/dist/cjs/plugins/vite-plugin-swap-apollo-provider.js +41 -0
- package/dist/cjs/rsc/rscBuildAnalyze.js +116 -0
- package/dist/cjs/rsc/rscBuildClient.js +91 -0
- package/dist/cjs/rsc/rscBuildCopyCssAssets.js +56 -0
- package/dist/cjs/rsc/rscBuildEntriesFile.js +115 -0
- package/dist/cjs/rsc/rscBuildForServer.js +157 -0
- package/dist/cjs/rsc/rscBuildForSsr.js +172 -0
- package/dist/cjs/rsc/rscBuildRwEnvVars.js +56 -0
- package/dist/cjs/rsc/rscRenderer.js +165 -0
- package/dist/cjs/rsc/rscRequestHandler.js +162 -0
- package/dist/cjs/rsc/rscStudioHandlers.js +154 -0
- package/dist/cjs/runFeServer.js +166 -0
- package/dist/cjs/streaming/buildForStreamingServer.js +65 -0
- package/dist/cjs/streaming/collectCss.js +52 -0
- package/dist/cjs/streaming/createReactStreamingHandler.js +173 -0
- package/dist/cjs/streaming/streamHelpers.js +228 -0
- package/dist/cjs/streaming/transforms/bufferedTransform.js +61 -0
- package/dist/cjs/streaming/transforms/cancelTimeoutTransform.js +34 -0
- package/dist/cjs/streaming/transforms/encode-decode.js +36 -0
- package/dist/cjs/streaming/transforms/serverInjectionTransform.js +84 -0
- package/dist/cjs/streaming/triggerRouteHooks.js +96 -0
- package/dist/cjs/types.js +16 -0
- package/dist/cjs/utils.js +91 -0
- package/dist/devFeServer.d.ts +2 -0
- package/dist/devFeServer.d.ts.map +1 -0
- package/dist/devFeServer.js +134 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/lib/StatusError.d.ts +8 -0
- package/dist/lib/StatusError.d.ts.map +1 -0
- package/dist/lib/StatusError.js +11 -0
- package/dist/lib/entries.d.ts +3 -0
- package/dist/lib/entries.d.ts.map +1 -0
- package/dist/lib/entries.js +32 -0
- package/dist/lib/envVarDefinitions.d.ts +14 -0
- package/dist/lib/envVarDefinitions.d.ts.map +1 -0
- package/dist/lib/envVarDefinitions.js +53 -0
- package/dist/lib/getMergedConfig.d.ts +11 -0
- package/dist/lib/getMergedConfig.d.ts.map +1 -0
- package/dist/lib/getMergedConfig.js +153 -0
- package/dist/lib/onWarn.d.ts +3 -0
- package/dist/lib/onWarn.d.ts.map +1 -0
- package/dist/lib/onWarn.js +12 -0
- package/dist/lib/registerFwGlobalsAndShims.d.ts +12 -0
- package/dist/lib/registerFwGlobalsAndShims.d.ts.map +1 -0
- package/dist/lib/registerFwGlobalsAndShims.js +83 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/invokeMiddleware.d.ts +14 -0
- package/dist/middleware/invokeMiddleware.d.ts.map +1 -0
- package/dist/middleware/invokeMiddleware.js +32 -0
- package/dist/middleware/register.d.ts +23 -0
- package/dist/middleware/register.d.ts.map +1 -0
- package/dist/middleware/register.js +69 -0
- package/dist/middleware/types.d.ts +3 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +0 -0
- package/dist/package.json +1 -0
- package/dist/plugins/vite-plugin-jsx-loader.d.ts +8 -0
- package/dist/plugins/vite-plugin-jsx-loader.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-jsx-loader.js +18 -0
- package/dist/plugins/vite-plugin-remove-from-bundle.d.ts +17 -0
- package/dist/plugins/vite-plugin-remove-from-bundle.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-remove-from-bundle.js +31 -0
- package/dist/plugins/vite-plugin-rsc-analyze.d.ts +3 -0
- package/dist/plugins/vite-plugin-rsc-analyze.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-analyze.js +70 -0
- package/dist/plugins/vite-plugin-rsc-reload.d.ts +3 -0
- package/dist/plugins/vite-plugin-rsc-reload.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-reload.js +41 -0
- package/dist/plugins/vite-plugin-rsc-routes-auto-loader.d.ts +3 -0
- package/dist/plugins/vite-plugin-rsc-routes-auto-loader.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-routes-auto-loader.js +130 -0
- package/dist/plugins/vite-plugin-rsc-routes-imports.d.ts +3 -0
- package/dist/plugins/vite-plugin-rsc-routes-imports.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-routes-imports.js +96 -0
- package/dist/plugins/vite-plugin-rsc-ssr-router-import.d.ts +7 -0
- package/dist/plugins/vite-plugin-rsc-ssr-router-import.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-ssr-router-import.js +41 -0
- package/dist/plugins/vite-plugin-rsc-transform-client.d.ts +3 -0
- package/dist/plugins/vite-plugin-rsc-transform-client.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-transform-client.js +195 -0
- package/dist/plugins/vite-plugin-rsc-transform-server.d.ts +3 -0
- package/dist/plugins/vite-plugin-rsc-transform-server.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-rsc-transform-server.js +364 -0
- package/dist/plugins/vite-plugin-swap-apollo-provider.d.ts +12 -0
- package/dist/plugins/vite-plugin-swap-apollo-provider.d.ts.map +1 -0
- package/dist/plugins/vite-plugin-swap-apollo-provider.js +17 -0
- package/dist/rsc/rscBuildAnalyze.d.ts +16 -0
- package/dist/rsc/rscBuildAnalyze.d.ts.map +1 -0
- package/dist/rsc/rscBuildAnalyze.js +92 -0
- package/dist/rsc/rscBuildClient.d.ts +7 -0
- package/dist/rsc/rscBuildClient.d.ts.map +1 -0
- package/dist/rsc/rscBuildClient.js +67 -0
- package/dist/rsc/rscBuildCopyCssAssets.d.ts +7 -0
- package/dist/rsc/rscBuildCopyCssAssets.d.ts.map +1 -0
- package/dist/rsc/rscBuildCopyCssAssets.js +22 -0
- package/dist/rsc/rscBuildEntriesFile.d.ts +10 -0
- package/dist/rsc/rscBuildEntriesFile.d.ts.map +1 -0
- package/dist/rsc/rscBuildEntriesFile.js +81 -0
- package/dist/rsc/rscBuildForServer.d.ts +7 -0
- package/dist/rsc/rscBuildForServer.d.ts.map +1 -0
- package/dist/rsc/rscBuildForServer.js +133 -0
- package/dist/rsc/rscBuildForSsr.d.ts +9 -0
- package/dist/rsc/rscBuildForSsr.d.ts.map +1 -0
- package/dist/rsc/rscBuildForSsr.js +138 -0
- package/dist/rsc/rscBuildRwEnvVars.d.ts +10 -0
- package/dist/rsc/rscBuildRwEnvVars.d.ts.map +1 -0
- package/dist/rsc/rscBuildRwEnvVars.js +22 -0
- package/dist/rsc/rscRenderer.d.ts +9 -0
- package/dist/rsc/rscRenderer.d.ts.map +1 -0
- package/dist/rsc/rscRenderer.js +130 -0
- package/dist/rsc/rscRequestHandler.d.ts +10 -0
- package/dist/rsc/rscRequestHandler.d.ts.map +1 -0
- package/dist/rsc/rscRequestHandler.js +131 -0
- package/dist/rsc/rscStudioHandlers.d.ts +10 -0
- package/dist/rsc/rscStudioHandlers.d.ts.map +1 -0
- package/dist/rsc/rscStudioHandlers.js +120 -0
- package/dist/runFeServer.d.ts +2 -0
- package/dist/runFeServer.d.ts.map +1 -0
- package/dist/runFeServer.js +132 -0
- package/dist/streaming/buildForStreamingServer.d.ts +4 -0
- package/dist/streaming/buildForStreamingServer.d.ts.map +1 -0
- package/dist/streaming/buildForStreamingServer.js +41 -0
- package/dist/streaming/collectCss.d.ts +7 -0
- package/dist/streaming/collectCss.d.ts.map +1 -0
- package/dist/streaming/collectCss.js +27 -0
- package/dist/streaming/createReactStreamingHandler.d.ts +12 -0
- package/dist/streaming/createReactStreamingHandler.d.ts.map +1 -0
- package/dist/streaming/createReactStreamingHandler.js +139 -0
- package/dist/streaming/streamHelpers.d.ts +23 -0
- package/dist/streaming/streamHelpers.d.ts.map +1 -0
- package/dist/streaming/streamHelpers.js +192 -0
- package/dist/streaming/transforms/bufferedTransform.d.ts +2 -0
- package/dist/streaming/transforms/bufferedTransform.d.ts.map +1 -0
- package/dist/streaming/transforms/bufferedTransform.js +37 -0
- package/dist/streaming/transforms/cancelTimeoutTransform.d.ts +2 -0
- package/dist/streaming/transforms/cancelTimeoutTransform.d.ts.map +1 -0
- package/dist/streaming/transforms/cancelTimeoutTransform.js +10 -0
- package/dist/streaming/transforms/encode-decode.d.ts +3 -0
- package/dist/streaming/transforms/encode-decode.d.ts.map +1 -0
- package/dist/streaming/transforms/encode-decode.js +11 -0
- package/dist/streaming/transforms/serverInjectionTransform.d.ts +16 -0
- package/dist/streaming/transforms/serverInjectionTransform.d.ts.map +1 -0
- package/dist/streaming/transforms/serverInjectionTransform.js +60 -0
- package/dist/streaming/triggerRouteHooks.d.ts +26 -0
- package/dist/streaming/triggerRouteHooks.d.ts.map +1 -0
- package/dist/streaming/triggerRouteHooks.js +71 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/dist/utils.d.ts +14 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +62 -0
- package/inject/reactRefresh.js +7 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,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
|
+
};
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
package/dist/utils.d.ts
ADDED
|
@@ -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
|
+
};
|