vite-plugin-react-server 0.3.11 → 0.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +15 -11
- package/dist/plugin/checkFilesExist.d.ts +2 -2
- package/dist/plugin/checkFilesExist.d.ts.map +1 -1
- package/dist/plugin/checkFilesExist.js +39 -57
- package/dist/plugin/checkFilesExist.js.map +1 -1
- package/dist/plugin/collect-css-manifest.d.ts.map +1 -1
- package/dist/plugin/collect-css-manifest.js +5 -0
- package/dist/plugin/collect-css-manifest.js.map +1 -1
- package/dist/plugin/components.js +10 -15
- package/dist/plugin/config/createModuleIdGenerator.js +1 -1
- package/dist/plugin/config/createModuleIdGenerator.js.map +1 -1
- package/dist/plugin/config/defaults.d.ts +5 -14
- package/dist/plugin/config/defaults.d.ts.map +1 -1
- package/dist/plugin/config/defaults.js +12 -12
- package/dist/plugin/config/defaults.js.map +1 -1
- package/dist/plugin/config/getPaths.js +1 -1
- package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
- package/dist/plugin/config/resolveOptions.js +73 -52
- package/dist/plugin/config/resolveOptions.js.map +1 -1
- package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
- package/dist/plugin/config/resolveUserConfig.js +53 -65
- package/dist/plugin/config/resolveUserConfig.js.map +1 -1
- package/dist/plugin/helpers/getBundleManifest.d.ts +6 -1
- package/dist/plugin/helpers/getBundleManifest.d.ts.map +1 -1
- package/dist/plugin/helpers/getBundleManifest.js +48 -19
- package/dist/plugin/helpers/getBundleManifest.js.map +1 -1
- package/dist/plugin/helpers/inputNormalizer.d.ts +1 -2
- package/dist/plugin/helpers/inputNormalizer.d.ts.map +1 -1
- package/dist/plugin/helpers/inputNormalizer.js +52 -46
- package/dist/plugin/helpers/inputNormalizer.js.map +1 -1
- package/dist/plugin/helpers/tryManifest.d.ts +1 -1
- package/dist/plugin/helpers/tryManifest.d.ts.map +1 -1
- package/dist/plugin/helpers/tryManifest.js.map +1 -1
- package/dist/plugin/loader/createBuildLoader.d.ts +1 -1
- package/dist/plugin/loader/createBuildLoader.d.ts.map +1 -1
- package/dist/plugin/loader/createBuildLoader.js +29 -26
- package/dist/plugin/loader/createBuildLoader.js.map +1 -1
- package/dist/plugin/loader/css-loader.d.ts +16 -0
- package/dist/plugin/loader/css-loader.d.ts.map +1 -0
- package/dist/plugin/loader/css-loader.js +70 -0
- package/dist/plugin/loader/css-loader.js.map +1 -0
- package/dist/plugin/loader/react-loader.d.ts +17 -0
- package/dist/plugin/loader/react-loader.d.ts.map +1 -0
- package/dist/plugin/loader/react-loader.js +647 -0
- package/dist/plugin/loader/react-loader.js.map +1 -0
- package/dist/plugin/loader/rsc/messageHandler.d.ts +2 -0
- package/dist/plugin/loader/rsc/messageHandler.d.ts.map +1 -0
- package/dist/plugin/loader/rsc/messageHandler.js +1 -0
- package/dist/plugin/loader/rsc/rsc-worker.development.d.ts +2 -0
- package/dist/plugin/loader/rsc/rsc-worker.development.d.ts.map +1 -0
- package/dist/plugin/loader/rsc/rsc-worker.development.js +1 -0
- package/dist/plugin/react-client/index.js +2 -2
- package/dist/plugin/react-client/index.js.map +1 -1
- package/dist/plugin/react-client/plugin.d.ts.map +1 -1
- package/dist/plugin/react-client/plugin.js +202 -25
- package/dist/plugin/react-client/plugin.js.map +1 -1
- package/dist/plugin/react-server/createHandler.d.ts.map +1 -1
- package/dist/plugin/react-server/createHandler.js +10 -4
- package/dist/plugin/react-server/createHandler.js.map +1 -1
- package/dist/plugin/react-server/createRscStream.d.ts +15 -3
- package/dist/plugin/react-server/createRscStream.d.ts.map +1 -1
- package/dist/plugin/react-server/createRscStream.js +52 -49
- package/dist/plugin/react-server/createRscStream.js.map +1 -1
- package/dist/plugin/react-server/plugin.d.ts.map +1 -1
- package/dist/plugin/react-server/plugin.js +24 -20
- package/dist/plugin/react-server/plugin.js.map +1 -1
- package/dist/plugin/transformer/plugin.d.ts.map +1 -1
- package/dist/plugin/transformer/plugin.js +65 -52
- package/dist/plugin/transformer/plugin.js.map +1 -1
- package/dist/plugin/types.d.ts +5 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/utils/logger.d.ts +9 -0
- package/dist/plugin/utils/logger.d.ts.map +1 -0
- package/dist/plugin/utils/logger.js +68 -0
- package/dist/plugin/utils/logger.js.map +1 -0
- package/dist/plugin/worker/createWorker.d.ts +1 -0
- package/dist/plugin/worker/createWorker.d.ts.map +1 -1
- package/dist/plugin/worker/createWorker.js +23 -36
- package/dist/plugin/worker/createWorker.js.map +1 -1
- package/dist/plugin/worker/html/html-worker.production.js +5 -1
- package/dist/plugin/worker/html/html-worker.production.js.map +1 -1
- package/dist/plugin/worker/html/messageHandler.d.ts.map +1 -1
- package/dist/plugin/worker/html/messageHandler.js +10 -19
- package/dist/plugin/worker/html/messageHandler.js.map +1 -1
- package/dist/plugin/worker/html/renderPages.d.ts +2 -2
- package/dist/plugin/worker/html/renderPages.d.ts.map +1 -1
- package/dist/plugin/worker/html/renderPages.js +130 -131
- package/dist/plugin/worker/html/renderPages.js.map +1 -1
- package/dist/plugin/worker/rsc/index.d.ts +1 -3
- package/dist/plugin/worker/rsc/index.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/index.js +1 -9
- package/dist/plugin/worker/rsc/index.js.map +1 -1
- package/dist/plugin/worker/rsc/messageHandler.d.ts +3 -0
- package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/messageHandler.js +107 -0
- package/dist/plugin/worker/rsc/messageHandler.js.map +1 -0
- package/dist/plugin/worker/rsc/plugin.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/plugin.js +74 -80
- package/dist/plugin/worker/rsc/rsc-worker.development.d.ts +32 -0
- package/dist/plugin/worker/rsc/rsc-worker.development.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/rsc-worker.development.js +43 -0
- package/dist/plugin/worker/rsc/rsc-worker.development.js.map +1 -0
- package/dist/plugin/worker/rsc/rsc-worker.js +4 -106
- package/dist/plugin/worker/rsc/rsc-worker.production.d.ts +2 -0
- package/dist/plugin/worker/rsc/rsc-worker.production.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/rsc-worker.production.js +14 -0
- package/dist/plugin/worker/rsc/rsc-worker.production.js.map +1 -0
- package/dist/plugin/worker/rsc/state.d.ts +11 -0
- package/dist/plugin/worker/rsc/state.d.ts.map +1 -0
- package/dist/plugin/worker/rsc/state.js +12 -0
- package/dist/plugin/worker/rsc/state.js.map +1 -0
- package/dist/plugin/worker/types.d.ts +60 -46
- package/dist/plugin/worker/types.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -11
- package/plugin/checkFilesExist.ts +42 -62
- package/plugin/collect-css-manifest.ts +5 -1
- package/plugin/config/createModuleIdGenerator.ts +1 -1
- package/plugin/config/defaults.ts +13 -15
- package/plugin/config/resolveOptions.ts +134 -76
- package/plugin/config/resolveUserConfig.ts +75 -76
- package/plugin/helpers/getBundleManifest.ts +69 -31
- package/plugin/helpers/inputNormalizer.ts +82 -70
- package/plugin/helpers/tryManifest.ts +1 -1
- package/plugin/loader/createBuildLoader.ts +38 -41
- package/plugin/loader/css-loader.ts +96 -0
- package/plugin/loader/react-loader.ts +945 -0
- package/plugin/loader/rsc/messageHandler.tsx +1 -0
- package/plugin/loader/rsc/rsc-worker.development.ts +1 -0
- package/plugin/react-client/index.ts +1 -1
- package/plugin/react-client/plugin.ts +266 -41
- package/plugin/react-server/createHandler.ts +9 -5
- package/plugin/react-server/createRscStream.ts +75 -54
- package/plugin/react-server/plugin.ts +26 -21
- package/plugin/transformer/plugin.ts +67 -76
- package/plugin/types/global.d.ts +8 -0
- package/plugin/types.ts +2 -0
- package/plugin/utils/logger.ts +52 -0
- package/plugin/worker/createWorker.ts +43 -44
- package/plugin/worker/html/html-worker.production.tsx +7 -2
- package/plugin/worker/html/messageHandler.ts +13 -21
- package/plugin/worker/html/renderPages.ts +146 -179
- package/plugin/worker/rsc/index.ts +4 -13
- package/plugin/worker/rsc/messageHandler.tsx +143 -0
- package/plugin/worker/rsc/plugin.ts +38 -37
- package/plugin/worker/rsc/rsc-worker.development.ts +107 -0
- package/plugin/worker/rsc/rsc-worker.production.ts +13 -0
- package/plugin/worker/rsc/rsc-worker.tsx +5 -128
- package/plugin/worker/rsc/state.ts +37 -0
- package/plugin/worker/types.ts +79 -55
- package/scripts/check-react-version.mjs +17 -7
- package/scripts/react+0.0.0-experimental-b3a95caf-20250113.patch +143 -4170
- package/scripts/react-dom+0.0.0-experimental-b3a95caf-20250113.patch +14271 -90079
- package/dist/plugin/components.js.map +0 -1
- package/dist/plugin/helpers/createClientInputNormalizer.d.ts +0 -8
- package/dist/plugin/helpers/createClientInputNormalizer.d.ts.map +0 -1
- package/dist/plugin/helpers/createClientInputNormalizer.js +0 -35
- package/dist/plugin/helpers/createServerInputNormalizer.d.ts +0 -9
- package/dist/plugin/helpers/createServerInputNormalizer.d.ts.map +0 -1
- package/dist/plugin/helpers/createServerInputNormalizer.js +0 -37
- package/dist/plugin/helpers/createStaticInputNormalizer.d.ts +0 -7
- package/dist/plugin/helpers/createStaticInputNormalizer.d.ts.map +0 -1
- package/dist/plugin/helpers/createStaticInputNormalizer.js +0 -18
- package/dist/plugin/helpers/getModuleManifest.d.ts +0 -17
- package/dist/plugin/helpers/getModuleManifest.d.ts.map +0 -1
- package/dist/plugin/helpers/getModuleManifest.js +0 -23
- package/dist/plugin/helpers/inputNormalizerWorker.d.ts +0 -12
- package/dist/plugin/helpers/inputNormalizerWorker.d.ts.map +0 -1
- package/dist/plugin/helpers/inputNormalizerWorker.js +0 -33
- package/dist/plugin/helpers/normalizedRelativePath.d.ts +0 -11
- package/dist/plugin/helpers/normalizedRelativePath.d.ts.map +0 -1
- package/dist/plugin/helpers/normalizedRelativePath.js +0 -36
- package/dist/plugin/helpers/resolveFilePath.d.ts +0 -13
- package/dist/plugin/helpers/resolveFilePath.d.ts.map +0 -1
- package/dist/plugin/helpers/resolveFilePath.js +0 -74
- package/dist/plugin/helpers/resolveWorkerModule.d.ts +0 -6
- package/dist/plugin/helpers/resolveWorkerModule.d.ts.map +0 -1
- package/dist/plugin/helpers/resolveWorkerModule.js +0 -24
- package/dist/plugin/helpers/validateModuleBase.d.ts +0 -3
- package/dist/plugin/helpers/validateModuleBase.d.ts.map +0 -1
- package/dist/plugin/helpers/validateModuleBase.js +0 -16
- package/dist/plugin/helpers/validateResolvedConfig.d.ts +0 -3
- package/dist/plugin/helpers/validateResolvedConfig.d.ts.map +0 -1
- package/dist/plugin/helpers/validateResolvedConfig.js +0 -17
- package/dist/plugin/transformer/transformer-client-components.d.ts +0 -30
- package/dist/plugin/transformer/transformer-client-components.d.ts.map +0 -1
- package/dist/plugin/transformer/transformer-client-components.js +0 -122
- package/dist/plugin/transformer/transformer-client-components.js.map +0 -1
- package/dist/plugin/transformer/transformer-server-actions.d.ts +0 -29
- package/dist/plugin/transformer/transformer-server-actions.d.ts.map +0 -1
- package/dist/plugin/transformer/transformer-server-actions.js +0 -90
- package/dist/plugin/worker/rsc/createRscStream.d.ts +0 -5
- package/dist/plugin/worker/rsc/createRscStream.d.ts.map +0 -1
- package/dist/plugin/worker/rsc/createRscStream.js +0 -39
- package/dist/plugin/worker/rsc/createRscStream.js.map +0 -1
- package/dist/plugin/worker/rsc/development.d.ts +0 -5
- package/dist/plugin/worker/rsc/development.d.ts.map +0 -1
- package/dist/plugin/worker/rsc/development.js +0 -13
- package/dist/plugin/worker/rsc/development.js.map +0 -1
- package/dist/plugin/worker/rsc/plugin.js.map +0 -1
- package/dist/plugin/worker/rsc/production.d.ts +0 -5
- package/dist/plugin/worker/rsc/production.d.ts.map +0 -1
- package/dist/plugin/worker/rsc/production.js +0 -13
- package/dist/plugin/worker/rsc/production.js.map +0 -1
- package/plugin/helpers/createClientInputNormalizer.ts +0 -48
- package/plugin/helpers/createServerInputNormalizer.ts +0 -52
- package/plugin/helpers/createStaticInputNormalizer.ts +0 -26
- package/plugin/helpers/getModuleManifest.ts +0 -36
- package/plugin/helpers/inputNormalizerWorker.ts +0 -52
- package/plugin/helpers/normalizedRelativePath.ts +0 -59
- package/plugin/helpers/resolveFilePath.ts +0 -108
- package/plugin/helpers/resolveWorkerModule.ts +0 -41
- package/plugin/helpers/validateModuleBase.ts +0 -30
- package/plugin/helpers/validateResolvedConfig.ts +0 -21
- package/plugin/transformer/transformer-client-components.ts +0 -168
- package/plugin/transformer/transformer-server-actions.ts +0 -125
- package/plugin/worker/rsc/createRscStream.ts +0 -42
- package/plugin/worker/rsc/development.ts +0 -6
- package/plugin/worker/rsc/production.ts +0 -6
- package/scripts/react-server-dom-esm+0.0.1.patch +0 -24775
|
@@ -4,168 +4,167 @@
|
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
6
6
|
import { mkdirSync } from 'node:fs';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { writeFile } from 'node:fs/promises';
|
|
8
|
+
import { dirname, join } from 'node:path';
|
|
9
9
|
import { Transform } from 'node:stream';
|
|
10
10
|
import { createHandler } from '../../react-server/createHandler.js';
|
|
11
|
+
import React__default from 'react';
|
|
12
|
+
import { collectManifestCss } from '../../collect-css-manifest.js';
|
|
11
13
|
|
|
12
|
-
async function renderPages(pluginContext, routes, options) {
|
|
13
|
-
const root = pluginContext.environment.config.root
|
|
14
|
-
|
|
15
|
-
pluginContext.environment.config.build.assetsDir ?? options.userConfig.build.assetsDir ?? options.pluginOptions.build.assetsDir;
|
|
16
|
-
const isServer = outDir.endsWith(options.pluginOptions.build.server);
|
|
17
|
-
const isClient = outDir.endsWith(options.pluginOptions.build.client);
|
|
18
|
-
if (!isServer && !isClient) {
|
|
19
|
-
throw new Error("Invalid outDir directory");
|
|
20
|
-
}
|
|
21
|
-
const destinationRoot = isServer ? resolve(
|
|
22
|
-
root,
|
|
23
|
-
options.pluginOptions.build.outDir,
|
|
24
|
-
options.pluginOptions.build.client
|
|
25
|
-
) : join(root, outDir);
|
|
14
|
+
async function renderPages(pluginContext, routes, files, options) {
|
|
15
|
+
const root = pluginContext.environment.config.root;
|
|
16
|
+
pluginContext.environment.config.build.outDir;
|
|
26
17
|
const failedRoutes = /* @__PURE__ */ new Map();
|
|
27
|
-
const moduleRootPath = join(
|
|
28
|
-
root,
|
|
29
|
-
options.pluginOptions.build.outDir,
|
|
30
|
-
options.pluginOptions.build.client
|
|
31
|
-
) + "/";
|
|
32
|
-
const moduleBaseURL = `file://${root}`;
|
|
33
|
-
const htmlRoot = destinationRoot;
|
|
34
|
-
const rscRoot = destinationRoot;
|
|
35
18
|
const completedRoutes = /* @__PURE__ */ new Set();
|
|
36
|
-
const transforms = /* @__PURE__ */ new Map();
|
|
37
|
-
const writePromises = /* @__PURE__ */ new Map();
|
|
38
|
-
const pipableStreamOptions = options.pipableStreamOptions ?? {};
|
|
39
|
-
pipableStreamOptions.importMap = pipableStreamOptions?.importMap ?? {};
|
|
40
|
-
pipableStreamOptions.importMap.imports = pipableStreamOptions.importMap.imports ?? {};
|
|
41
|
-
if (!("react" in pipableStreamOptions.importMap.imports)) {
|
|
42
|
-
pipableStreamOptions.importMap.imports["react"] = "https://esm.sh/react@experimental?pin=v124&dev";
|
|
43
|
-
}
|
|
44
|
-
if (!("react-dom" in pipableStreamOptions.importMap.imports)) {
|
|
45
|
-
pipableStreamOptions.importMap.imports["react-dom"] = "https://esm.sh/react-dom@experimental?pin=v124&dev";
|
|
46
|
-
}
|
|
47
|
-
if (!("react-dom/" in pipableStreamOptions.importMap.imports)) {
|
|
48
|
-
pipableStreamOptions.importMap.imports["react-dom/"] = "https://esm.sh/react-dom@experimental&pin=v124&dev/";
|
|
49
|
-
}
|
|
50
|
-
if (!("react-server-dom-esm/client.browser" in pipableStreamOptions.importMap.imports)) {
|
|
51
|
-
pipableStreamOptions.importMap.imports["react-server-dom-esm/client.browser"] = `/node_modules/react-server-dom-esm/esm/react-server-dom-esm-client.browser.${options.userConfig.mode}.js`;
|
|
52
|
-
}
|
|
53
|
-
for (const [key, serverEntry] of Object.entries(options.serverManifest)) {
|
|
54
|
-
if (!key.includes(".client.")) continue;
|
|
55
|
-
const clientEntry = Object.entries(options.clientManifest).find(
|
|
56
|
-
([_2, entry2]) => entry2.src === serverEntry.src
|
|
57
|
-
);
|
|
58
|
-
if (!clientEntry) continue;
|
|
59
|
-
const [_, entry] = clientEntry;
|
|
60
|
-
const serverPath = serverEntry.src;
|
|
61
|
-
const clientPath = entry.file;
|
|
62
|
-
pipableStreamOptions.importMap.imports[serverPath] = "/" + clientPath;
|
|
63
|
-
}
|
|
64
|
-
for (const [key, value] of Object.entries(options.clientManifest)) {
|
|
65
|
-
if (value.isEntry) {
|
|
66
|
-
if (Array.isArray(pipableStreamOptions.bootstrapModules)) {
|
|
67
|
-
pipableStreamOptions.bootstrapModules.push("/" + value.file);
|
|
68
|
-
} else {
|
|
69
|
-
pipableStreamOptions.bootstrapModules = ["/" + value.file];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
await mkdir(htmlRoot, { recursive: true });
|
|
74
|
-
await mkdir(rscRoot, { recursive: true });
|
|
75
19
|
try {
|
|
76
|
-
const allRoutesComplete = new Promise((
|
|
20
|
+
const allRoutesComplete = new Promise((resolve, reject) => {
|
|
77
21
|
options.worker.on("message", (msg) => {
|
|
78
22
|
switch (msg.type) {
|
|
79
23
|
case "ALL_READY": {
|
|
80
24
|
const { id, html, outputPath } = msg;
|
|
81
25
|
mkdirSync(dirname(outputPath), { recursive: true });
|
|
82
|
-
|
|
26
|
+
writeFile(outputPath, html).then(() => {
|
|
83
27
|
completedRoutes.add(id);
|
|
84
|
-
writePromises.delete(id);
|
|
85
28
|
if (completedRoutes.size === routes.length) {
|
|
86
|
-
|
|
29
|
+
resolve();
|
|
87
30
|
}
|
|
88
31
|
}).catch((error) => {
|
|
32
|
+
console.error("Write error for route:", id, error);
|
|
89
33
|
failedRoutes.set(id, error);
|
|
34
|
+
reject(error);
|
|
90
35
|
});
|
|
91
|
-
writePromises.set(id, writePromise);
|
|
92
36
|
break;
|
|
93
37
|
}
|
|
94
38
|
case "ERROR": {
|
|
39
|
+
console.error("Worker error for route:", msg.id, msg.error);
|
|
95
40
|
failedRoutes.set(msg.id, new Error(msg.error));
|
|
41
|
+
reject(new Error(msg.error));
|
|
96
42
|
break;
|
|
97
43
|
}
|
|
98
44
|
}
|
|
99
45
|
});
|
|
100
46
|
});
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
47
|
+
for (const route of routes) {
|
|
48
|
+
const routeFiles = files.urlMap.get(route);
|
|
49
|
+
if (!routeFiles) {
|
|
50
|
+
console.error("No files found for route:", route);
|
|
51
|
+
failedRoutes.set(route, new Error(`No files found for ${route}`));
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const cssFiles = collectManifestCss(
|
|
55
|
+
options.serverManifest,
|
|
56
|
+
options.moduleBasePath,
|
|
57
|
+
routeFiles.page,
|
|
58
|
+
options.onCssFile
|
|
59
|
+
);
|
|
60
|
+
const rscResult = await createHandler(route, {
|
|
61
|
+
...options.pluginOptions,
|
|
62
|
+
Html: React__default.Fragment
|
|
63
|
+
// Use Fragment for pure RSC output
|
|
64
|
+
}, {
|
|
65
|
+
loader: options.loader,
|
|
66
|
+
clientManifest: options.clientManifest,
|
|
67
|
+
serverManifest: options.serverManifest,
|
|
68
|
+
pipableStreamOptions: {
|
|
69
|
+
...options.pipableStreamOptions,
|
|
70
|
+
importMap: {
|
|
71
|
+
imports: {
|
|
72
|
+
...options.pipableStreamOptions?.importMap?.imports,
|
|
73
|
+
...Object.fromEntries(Array.from(cssFiles.entries()))
|
|
74
|
+
}
|
|
75
|
+
}
|
|
112
76
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
clientManifest: options.clientManifest,
|
|
126
|
-
serverManifest: options.serverManifest
|
|
127
|
-
});
|
|
128
|
-
const rscOutputPath = route === "/" ? join(rscRoot, "index.rsc") : join(rscRoot, route, "index.rsc");
|
|
129
|
-
mkdirSync(dirname(rscOutputPath), { recursive: true });
|
|
130
|
-
const writePromise = writeFile(rscOutputPath, chunk).catch((error) => {
|
|
131
|
-
failedRoutes.set(route, error);
|
|
132
|
-
});
|
|
133
|
-
writePromises.set(`${route}:rsc`, writePromise);
|
|
134
|
-
callback(null, chunk);
|
|
135
|
-
},
|
|
136
|
-
flush(callback) {
|
|
137
|
-
options.worker.postMessage({
|
|
138
|
-
type: "RSC_END",
|
|
139
|
-
id: route
|
|
140
|
-
});
|
|
141
|
-
callback();
|
|
77
|
+
});
|
|
78
|
+
const htmlResult = await createHandler(route, options.pluginOptions, {
|
|
79
|
+
loader: options.loader,
|
|
80
|
+
clientManifest: options.clientManifest,
|
|
81
|
+
serverManifest: options.serverManifest,
|
|
82
|
+
pipableStreamOptions: {
|
|
83
|
+
...options.pipableStreamOptions,
|
|
84
|
+
importMap: {
|
|
85
|
+
imports: {
|
|
86
|
+
...options.pipableStreamOptions?.importMap?.imports,
|
|
87
|
+
...Object.fromEntries(Array.from(cssFiles.entries()))
|
|
88
|
+
}
|
|
142
89
|
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
failedRoutes.set(route, error);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
if (rscResult.type !== "success" || htmlResult.type !== "success") {
|
|
93
|
+
console.error("Handler failed for route:", route);
|
|
94
|
+
failedRoutes.set(route, new Error(`Handler failed for ${route}`));
|
|
95
|
+
continue;
|
|
150
96
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
97
|
+
await Promise.all([
|
|
98
|
+
// Save RSC stream to .rsc file in client directory
|
|
99
|
+
new Promise((resolve, reject) => {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
const rscTransform = new Transform({
|
|
102
|
+
transform(chunk, _encoding, callback) {
|
|
103
|
+
try {
|
|
104
|
+
chunks.push(Buffer.from(chunk));
|
|
105
|
+
callback(null, chunk);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
callback(error);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
flush(callback) {
|
|
111
|
+
try {
|
|
112
|
+
const rscPath = join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.rsc");
|
|
113
|
+
mkdirSync(dirname(rscPath), { recursive: true });
|
|
114
|
+
writeFile(rscPath, Buffer.concat(chunks)).then(() => {
|
|
115
|
+
callback();
|
|
116
|
+
resolve();
|
|
117
|
+
}).catch((error) => {
|
|
118
|
+
console.error("RSC write error:", error);
|
|
119
|
+
callback(error);
|
|
120
|
+
reject(error);
|
|
121
|
+
});
|
|
122
|
+
} catch (error) {
|
|
123
|
+
callback(error);
|
|
124
|
+
reject(error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
rscResult.stream.pipe(rscTransform);
|
|
129
|
+
}),
|
|
130
|
+
// Send HTML stream to worker
|
|
131
|
+
new Promise((resolve, reject) => {
|
|
132
|
+
const htmlTransform = new Transform({
|
|
133
|
+
transform(chunk, _encoding, callback) {
|
|
134
|
+
try {
|
|
135
|
+
options.worker.postMessage({
|
|
136
|
+
type: "RSC_CHUNK",
|
|
137
|
+
id: route,
|
|
138
|
+
chunk: chunk.toString(),
|
|
139
|
+
moduleRootPath: join(root, options.pluginOptions.build.outDir),
|
|
140
|
+
moduleBaseURL: options.moduleBaseURL,
|
|
141
|
+
htmlOutputPath: join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, "index.html"),
|
|
142
|
+
pipableStreamOptions: options.pipableStreamOptions
|
|
143
|
+
});
|
|
144
|
+
callback(null, chunk);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
callback(error);
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
flush(callback) {
|
|
150
|
+
options.worker.postMessage({
|
|
151
|
+
type: "RSC_END",
|
|
152
|
+
id: route
|
|
153
|
+
});
|
|
154
|
+
callback();
|
|
155
|
+
resolve();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
htmlResult.stream.pipe(htmlTransform);
|
|
159
|
+
})
|
|
160
|
+
]);
|
|
158
161
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
});
|
|
162
|
+
await allRoutesComplete;
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error("Render error:", error);
|
|
165
|
+
throw error;
|
|
164
166
|
}
|
|
165
|
-
return {
|
|
166
|
-
failedRoutes,
|
|
167
|
-
completedRoutes
|
|
168
|
-
};
|
|
167
|
+
return { failedRoutes, completedRoutes };
|
|
169
168
|
}
|
|
170
169
|
|
|
171
170
|
export { renderPages };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderPages.js","sources":["../../../../plugin/worker/html/renderPages.ts"],"sourcesContent":["import { appendFile, mkdirSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve, resolve as resolvePath } from \"node:path\";\nimport { Transform } from \"node:stream\";\nimport type { Worker } from \"node:worker_threads\";\nimport { createHandler } from \"../../react-server/createHandler.js\";\nimport type { ResolvedUserConfig, ResolvedUserOptions } from \"../../types.js\";\nimport type {\n HtmlWorkerMessage,\n HtmlWorkerResponse,\n WorkerRscChunkMessage,\n} from \"../types.js\";\nimport type { Manifest } from \"vite\";\nimport type {\n EmittedFile,\n EmittedPrebuiltChunk,\n PluginContext,\n ResolvedId,\n} from \"rollup\";\nimport { createInputNormalizer } from \"../../helpers/inputNormalizer.js\";\n\ninterface PipeableStreamOptions {\n bootstrapModules?: string[];\n bootstrapScripts?: string[];\n bootstrapScriptContent?: string;\n signal?: AbortSignal;\n identifierPrefix?: string;\n namespaceURI?: string;\n nonce?: string;\n progressiveChunkSize?: number;\n onShellReady?: () => void;\n onAllReady?: () => void;\n onError?: (error: unknown) => void;\n importMap?: {\n imports?: Record<string, string>;\n };\n}\n\ntype RenderPagesOptions = {\n pluginOptions: ResolvedUserOptions;\n userConfig: ResolvedUserConfig;\n clientManifest: Manifest;\n serverManifest: Manifest;\n worker: Worker;\n pipableStreamOptions?: PipeableStreamOptions;\n loader: (id: string) => Promise<Record<string, any>>;\n onCssFile?: (path: string) => void;\n clientCss?: string[];\n moduleBasePath: string;\n moduleBaseURL: string;\n};\n\nexport async function renderPages(\n pluginContext: PluginContext,\n routes: string[],\n options: RenderPagesOptions\n) {\n const root =\n pluginContext.environment.config.root ??\n options.userConfig.root ??\n options.pluginOptions.projectRoot ??\n process.cwd();\n const outDir =\n pluginContext.environment.config.build.outDir ??\n options.userConfig.build.outDir ??\n options.pluginOptions.build.outDir;\n const assetsDir =\n pluginContext.environment.config.build.assetsDir ??\n options.userConfig.build.assetsDir ??\n options.pluginOptions.build.assetsDir;\n\n const isServer = outDir.endsWith(options.pluginOptions.build.server);\n const isClient = outDir.endsWith(options.pluginOptions.build.client);\n if (!isServer && !isClient) {\n throw new Error(\"Invalid outDir directory\");\n }\n\n const destinationRoot = isServer\n ? resolvePath(\n root,\n options.pluginOptions.build.outDir,\n options.pluginOptions.build.client\n )\n : join(root, outDir);\n const failedRoutes = new Map<string, Error>();\n const moduleRootPath =\n join(\n root,\n options.pluginOptions.build.outDir,\n options.pluginOptions.build.client\n ) + \"/\";\n const moduleBaseURL = `file://${root}`;\n const htmlRoot = destinationRoot;\n const rscRoot = destinationRoot;\n const streamStarted = new Set<string>();\n const completedRoutes = new Set<string>();\n const htmlContent = new Map<string, string>();\n const transforms = new Map<string, Transform>();\n const writePromises = new Map<string, Promise<void>>();\n const pipableStreamOptions = options.pipableStreamOptions ?? {};\n pipableStreamOptions.importMap = pipableStreamOptions?.importMap ?? {};\n pipableStreamOptions.importMap.imports =\n pipableStreamOptions.importMap.imports ?? {};\n if (!(\"react\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react\"] = 'https://esm.sh/react@experimental?pin=v124&dev'\n }\n if (!(\"react-dom\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react-dom\"] = 'https://esm.sh/react-dom@experimental?pin=v124&dev'\n }\n if (!(\"react-dom/\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react-dom/\"] = 'https://esm.sh/react-dom@experimental&pin=v124&dev/'\n }\n if (!(\"react-server-dom-esm/client.browser\" in pipableStreamOptions.importMap.imports)) {\n pipableStreamOptions.importMap.imports[\"react-server-dom-esm/client.browser\"] = `/node_modules/react-server-dom-esm/esm/react-server-dom-esm-client.browser.${options.userConfig.mode}.js`\n }\n // Find matching client components by their source paths\n for (const [key, serverEntry] of Object.entries(options.serverManifest)) {\n // Skip non-client components\n if (!key.includes(\".client.\")) continue;\n\n // Find matching client entry by source path\n const clientEntry = Object.entries(options.clientManifest).find(\n ([_, entry]) => entry.src === serverEntry.src\n );\n\n if (!clientEntry) continue;\n\n const [_, entry] = clientEntry;\n const serverPath = serverEntry.src as string;\n const clientPath = entry.file\n\n pipableStreamOptions.importMap.imports[serverPath] = '/' + clientPath;\n\n }\n for(const [key, value] of Object.entries(options.clientManifest)) {\n if(value.isEntry) {\n if(Array.isArray(pipableStreamOptions.bootstrapModules)) {\n pipableStreamOptions.bootstrapModules.push('/'+value.file);\n } else {\n pipableStreamOptions.bootstrapModules = ['/'+value.file];\n }\n }\n }\n\n // Remove the initial empty file writes - we'll create directories as needed\n await mkdir(htmlRoot, { recursive: true });\n await mkdir(rscRoot, { recursive: true });\n\n try {\n const allRoutesComplete = new Promise<void>((resolve) => {\n options.worker.on(\"message\", (msg: HtmlWorkerResponse) => {\n switch (msg.type) {\n case \"ALL_READY\": {\n const { id, html, outputPath } = msg;\n mkdirSync(dirname(outputPath), { recursive: true });\n \n const writePromise = writeFile(outputPath, html)\n .then(() => {\n completedRoutes.add(id);\n writePromises.delete(id);\n \n // Only resolve when all routes are complete\n if (completedRoutes.size === routes.length) {\n resolve();\n }\n })\n .catch((error) => {\n failedRoutes.set(id, error as Error);\n });\n\n writePromises.set(id, writePromise);\n break;\n }\n case \"ERROR\": {\n failedRoutes.set(msg.id, new Error(msg.error));\n break;\n }\n }\n });\n });\n\n const renderPromises = routes.map(async (route) => {\n try {\n const result = await createHandler(route, options.pluginOptions, {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n pipableStreamOptions: options.pipableStreamOptions,\n });\n\n if (result.type !== \"success\") {\n failedRoutes.set(route, new Error(`Handler failed for ${route}`));\n return;\n }\n\n const htmlOutputPath = route === \"/\"\n ? join(htmlRoot, \"index.html\")\n : join(htmlRoot, route, \"index.html\");\n\n transforms.set(route, new Transform({\n transform(chunk, _encoding, callback) {\n options.worker.postMessage({\n type: \"RSC_CHUNK\",\n id: route,\n chunk: chunk,\n moduleRootPath: moduleRootPath,\n moduleBaseURL: moduleBaseURL,\n htmlOutputPath: htmlOutputPath,\n outDir: options.userConfig.build.outDir,\n pipableStreamOptions: pipableStreamOptions,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n } satisfies WorkerRscChunkMessage);\n\n const rscOutputPath = route === \"/\"\n ? join(rscRoot, \"index.rsc\")\n : join(rscRoot, route, \"index.rsc\");\n\n mkdirSync(dirname(rscOutputPath), { recursive: true });\n \n // Track RSC file write\n const writePromise = writeFile(rscOutputPath, chunk)\n .catch((error) => {\n failedRoutes.set(route, error as Error);\n });\n\n writePromises.set(`${route}:rsc`, writePromise);\n callback(null, chunk);\n },\n flush(callback) {\n options.worker.postMessage({\n type: \"RSC_END\",\n id: route,\n });\n callback();\n },\n }));\n\n result.stream.pipe(transforms.get(route) as Transform);\n await new Promise<void>((resolve) => {\n transforms.get(route)?.on(\"finish\", resolve);\n });\n } catch (error) {\n failedRoutes.set(route, error as Error);\n }\n });\n\n // Wait for everything to complete\n await Promise.all(renderPromises);\n await Promise.all(writePromises.values());\n await allRoutesComplete;\n\n } finally {\n for (const transform of transforms.values()) {\n transform.destroy();\n }\n transforms.clear();\n writePromises.clear();\n\n options.worker.postMessage({\n type: \"SHUTDOWN\",\n });\n }\n\n return {\n failedRoutes,\n completedRoutes,\n };\n}\n"],"names":["resolvePath","_","entry","resolve"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderPages.js","sources":["../../../../plugin/worker/html/renderPages.ts"],"sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve as resolvePath } from \"node:path\";\nimport { Transform } from \"node:stream\";\nimport type { Worker } from \"node:worker_threads\";\nimport { createHandler } from \"../../react-server/createHandler.js\";\nimport type { CheckFilesExistReturn, ResolvedUserConfig, ResolvedUserOptions } from \"../../types.js\";\nimport type {\n HtmlWorkerResponse,\n WorkerRscChunkMessage,\n} from \"../types.js\";\nimport type { Manifest } from \"vite\";\nimport type {\n PluginContext,\n} from \"rollup\";\nimport React from \"react\";\nimport { collectManifestCss } from \"../../collect-css-manifest.js\";\n\ninterface PipeableStreamOptions {\n bootstrapModules?: string[];\n bootstrapScripts?: string[];\n bootstrapScriptContent?: string;\n signal?: AbortSignal;\n identifierPrefix?: string;\n namespaceURI?: string;\n nonce?: string;\n progressiveChunkSize?: number;\n onShellReady?: () => void;\n onAllReady?: () => void;\n onError?: (error: unknown) => void;\n importMap?: {\n imports?: Record<string, string>;\n };\n}\n\ntype RenderPagesOptions = {\n pluginOptions: ResolvedUserOptions;\n userConfig: ResolvedUserConfig;\n clientManifest: Manifest;\n serverManifest: Manifest;\n worker: Worker;\n pipableStreamOptions?: PipeableStreamOptions;\n loader: (id: string) => Promise<Record<string, any>>;\n onCssFile?: (path: string) => void;\n clientCss?: string[];\n moduleBasePath: string;\n moduleBaseURL: string;\n};\n\nexport async function renderPages(\n pluginContext: PluginContext,\n routes: string[],\n files: CheckFilesExistReturn,\n options: RenderPagesOptions\n) {\n const root = pluginContext.environment.config.root;\n const outDir = pluginContext.environment.config.build.outDir;\n const failedRoutes = new Map<string, Error>();\n const completedRoutes = new Set<string>();\n const writePromises = new Map<string, Promise<void>>();\n\n try {\n // Set up worker message handling\n const allRoutesComplete = new Promise<void>((resolve, reject) => {\n options.worker.on(\"message\", (msg: HtmlWorkerResponse) => {\n switch (msg.type) {\n case \"ALL_READY\": {\n const { id, html, outputPath } = msg;\n mkdirSync(dirname(outputPath), { recursive: true });\n \n writeFile(outputPath, html)\n .then(() => {\n completedRoutes.add(id);\n if (completedRoutes.size === routes.length) {\n resolve();\n }\n })\n .catch((error) => {\n console.error('Write error for route:', id, error);\n failedRoutes.set(id, error as Error);\n reject(error);\n });\n break;\n }\n case \"ERROR\": {\n console.error('Worker error for route:', msg.id, msg.error);\n failedRoutes.set(msg.id, new Error(msg.error));\n reject(new Error(msg.error));\n break;\n }\n }\n });\n });\n\n // Process routes sequentially\n for (const route of routes) {\n const routeFiles = files.urlMap.get(route);\n if (!routeFiles) {\n console.error('No files found for route:', route);\n failedRoutes.set(route, new Error(`No files found for ${route}`));\n continue;\n }\n\n const cssFiles = collectManifestCss(\n options.serverManifest,\n options.moduleBasePath,\n routeFiles.page,\n options.onCssFile\n );\n\n // Create handler for pure RSC output\n const rscResult = await createHandler(route, {\n ...options.pluginOptions,\n Html: React.Fragment // Use Fragment for pure RSC output\n }, {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n ...Object.fromEntries(Array.from(cssFiles.entries()))\n }\n }\n },\n });\n\n // Create handler for HTML output\n const htmlResult = await createHandler(route, options.pluginOptions, {\n loader: options.loader,\n clientManifest: options.clientManifest,\n serverManifest: options.serverManifest,\n pipableStreamOptions: {\n ...options.pipableStreamOptions,\n importMap: {\n imports: {\n ...options.pipableStreamOptions?.importMap?.imports,\n ...Object.fromEntries(Array.from(cssFiles.entries()))\n }\n }\n },\n });\n\n if (rscResult.type !== \"success\" || htmlResult.type !== \"success\") {\n console.error('Handler failed for route:', route);\n failedRoutes.set(route, new Error(`Handler failed for ${route}`));\n continue;\n }\n\n // Process both streams\n await Promise.all([\n // Save RSC stream to .rsc file in client directory\n new Promise<void>((resolve, reject) => {\n const chunks: Buffer[] = [];\n const rscTransform = new Transform({\n transform(chunk, _encoding, callback) {\n try {\n chunks.push(Buffer.from(chunk));\n callback(null, chunk);\n } catch (error) {\n callback(error as Error);\n }\n },\n flush(callback) {\n try {\n const rscPath = join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, 'index.rsc');\n \n // Ensure directory exists\n mkdirSync(dirname(rscPath), { recursive: true });\n \n // Write complete file\n writeFile(rscPath, Buffer.concat(chunks))\n .then(() => {\n callback();\n resolve();\n })\n .catch(error => {\n console.error('RSC write error:', error);\n callback(error as Error);\n reject(error);\n });\n } catch (error) {\n callback(error as Error);\n reject(error);\n }\n }\n });\n\n rscResult.stream.pipe(rscTransform);\n }),\n\n // Send HTML stream to worker\n new Promise<void>((resolve, reject) => {\n const htmlTransform = new Transform({\n transform(chunk, _encoding, callback) {\n try {\n options.worker.postMessage({\n type: \"RSC_CHUNK\",\n id: route,\n chunk: chunk.toString(),\n moduleRootPath: join(root, options.pluginOptions.build.outDir),\n moduleBaseURL: options.moduleBaseURL,\n htmlOutputPath: join(options.pluginOptions.build.outDir, options.pluginOptions.build.client, route, 'index.html'),\n pipableStreamOptions: options.pipableStreamOptions,\n });\n callback(null, chunk);\n } catch (error) {\n callback(error as Error);\n }\n },\n flush(callback) {\n options.worker.postMessage({\n type: \"RSC_END\",\n id: route,\n });\n callback();\n resolve();\n }\n });\n\n htmlResult.stream.pipe(htmlTransform);\n })\n ]);\n }\n\n await allRoutesComplete;\n\n } catch (error) {\n console.error('Render error:', error);\n throw error;\n }\n\n return { failedRoutes, completedRoutes };\n}\n"],"names":["React"],"mappings":";;;;;;;;;;;;;AAiDA,eAAsB,WACpB,CAAA,aAAA,EACA,MACA,EAAA,KAAA,EACA,OACA,EAAA;AACA,EAAM,MAAA,IAAA,GAAO,aAAc,CAAA,WAAA,CAAY,MAAO,CAAA,IAAA;AAC9C,EAAe,aAAA,CAAc,WAAY,CAAA,MAAA,CAAO,KAAM,CAAA;AACtD,EAAM,MAAA,YAAA,uBAAmB,GAAmB,EAAA;AAC5C,EAAM,MAAA,eAAA,uBAAsB,GAAY,EAAA;AAGxC,EAAI,IAAA;AAEF,IAAA,MAAM,iBAAoB,GAAA,IAAI,OAAc,CAAA,CAAC,SAAS,MAAW,KAAA;AAC/D,MAAA,OAAA,CAAQ,MAAO,CAAA,EAAA,CAAG,SAAW,EAAA,CAAC,GAA4B,KAAA;AACxD,QAAA,QAAQ,IAAI,IAAM;AAAA,UAChB,KAAK,WAAa,EAAA;AAChB,YAAA,MAAM,EAAE,EAAA,EAAI,IAAM,EAAA,UAAA,EAAe,GAAA,GAAA;AACjC,YAAA,SAAA,CAAU,QAAQ,UAAU,CAAA,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAElD,YAAA,SAAA,CAAU,UAAY,EAAA,IAAI,CACvB,CAAA,IAAA,CAAK,MAAM;AACV,cAAA,eAAA,CAAgB,IAAI,EAAE,CAAA;AACtB,cAAI,IAAA,eAAA,CAAgB,IAAS,KAAA,MAAA,CAAO,MAAQ,EAAA;AAC1C,gBAAQ,OAAA,EAAA;AAAA;AACV,aACD,CAAA,CACA,KAAM,CAAA,CAAC,KAAU,KAAA;AAChB,cAAQ,OAAA,CAAA,KAAA,CAAM,wBAA0B,EAAA,EAAA,EAAI,KAAK,CAAA;AACjD,cAAa,YAAA,CAAA,GAAA,CAAI,IAAI,KAAc,CAAA;AACnC,cAAA,MAAA,CAAO,KAAK,CAAA;AAAA,aACb,CAAA;AACH,YAAA;AAAA;AACF,UACA,KAAK,OAAS,EAAA;AACZ,YAAA,OAAA,CAAQ,KAAM,CAAA,yBAAA,EAA2B,GAAI,CAAA,EAAA,EAAI,IAAI,KAAK,CAAA;AAC1D,YAAA,YAAA,CAAa,IAAI,GAAI,CAAA,EAAA,EAAI,IAAI,KAAM,CAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAC7C,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,GAAI,CAAA,KAAK,CAAC,CAAA;AAC3B,YAAA;AAAA;AACF;AACF,OACD,CAAA;AAAA,KACF,CAAA;AAGD,IAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,MAAA,MAAM,UAAa,GAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA;AACzC,MAAA,IAAI,CAAC,UAAY,EAAA;AACf,QAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,QAAA,YAAA,CAAa,IAAI,KAAO,EAAA,IAAI,MAAM,CAAsB,mBAAA,EAAA,KAAK,EAAE,CAAC,CAAA;AAChE,QAAA;AAAA;AAGF,MAAA,MAAM,QAAW,GAAA,kBAAA;AAAA,QACf,OAAQ,CAAA,cAAA;AAAA,QACR,OAAQ,CAAA,cAAA;AAAA,QACR,UAAW,CAAA,IAAA;AAAA,QACX,OAAQ,CAAA;AAAA,OACV;AAGA,MAAM,MAAA,SAAA,GAAY,MAAM,aAAA,CAAc,KAAO,EAAA;AAAA,QAC3C,GAAG,OAAQ,CAAA,aAAA;AAAA,QACX,MAAMA,cAAM,CAAA;AAAA;AAAA,OACX,EAAA;AAAA,QACD,QAAQ,OAAQ,CAAA,MAAA;AAAA,QAChB,gBAAgB,OAAQ,CAAA,cAAA;AAAA,QACxB,gBAAgB,OAAQ,CAAA,cAAA;AAAA,QACxB,oBAAsB,EAAA;AAAA,UACpB,GAAG,OAAQ,CAAA,oBAAA;AAAA,UACX,SAAW,EAAA;AAAA,YACT,OAAS,EAAA;AAAA,cACP,GAAG,OAAQ,CAAA,oBAAA,EAAsB,SAAW,EAAA,OAAA;AAAA,cAC5C,GAAG,OAAO,WAAY,CAAA,KAAA,CAAM,KAAK,QAAS,CAAA,OAAA,EAAS,CAAC;AAAA;AACtD;AACF;AACF,OACD,CAAA;AAGD,MAAA,MAAM,UAAa,GAAA,MAAM,aAAc,CAAA,KAAA,EAAO,QAAQ,aAAe,EAAA;AAAA,QACnE,QAAQ,OAAQ,CAAA,MAAA;AAAA,QAChB,gBAAgB,OAAQ,CAAA,cAAA;AAAA,QACxB,gBAAgB,OAAQ,CAAA,cAAA;AAAA,QACxB,oBAAsB,EAAA;AAAA,UACpB,GAAG,OAAQ,CAAA,oBAAA;AAAA,UACX,SAAW,EAAA;AAAA,YACT,OAAS,EAAA;AAAA,cACP,GAAG,OAAQ,CAAA,oBAAA,EAAsB,SAAW,EAAA,OAAA;AAAA,cAC5C,GAAG,OAAO,WAAY,CAAA,KAAA,CAAM,KAAK,QAAS,CAAA,OAAA,EAAS,CAAC;AAAA;AACtD;AACF;AACF,OACD,CAAA;AAED,MAAA,IAAI,SAAU,CAAA,IAAA,KAAS,SAAa,IAAA,UAAA,CAAW,SAAS,SAAW,EAAA;AACjE,QAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,QAAA,YAAA,CAAa,IAAI,KAAO,EAAA,IAAI,MAAM,CAAsB,mBAAA,EAAA,KAAK,EAAE,CAAC,CAAA;AAChE,QAAA;AAAA;AAIF,MAAA,MAAM,QAAQ,GAAI,CAAA;AAAA;AAAA,QAEhB,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AACrC,UAAA,MAAM,SAAmB,EAAC;AAC1B,UAAM,MAAA,YAAA,GAAe,IAAI,SAAU,CAAA;AAAA,YACjC,SAAA,CAAU,KAAO,EAAA,SAAA,EAAW,QAAU,EAAA;AACpC,cAAI,IAAA;AACF,gBAAA,MAAA,CAAO,IAAK,CAAA,MAAA,CAAO,IAAK,CAAA,KAAK,CAAC,CAAA;AAC9B,gBAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,uBACb,KAAO,EAAA;AACd,gBAAA,QAAA,CAAS,KAAc,CAAA;AAAA;AACzB,aACF;AAAA,YACA,MAAM,QAAU,EAAA;AACd,cAAI,IAAA;AACF,gBAAM,MAAA,OAAA,GAAU,IAAK,CAAA,OAAA,CAAQ,aAAc,CAAA,KAAA,CAAM,MAAQ,EAAA,OAAA,CAAQ,aAAc,CAAA,KAAA,CAAM,MAAQ,EAAA,KAAA,EAAO,WAAW,CAAA;AAG/G,gBAAA,SAAA,CAAU,QAAQ,OAAO,CAAA,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAG/C,gBAAA,SAAA,CAAU,SAAS,MAAO,CAAA,MAAA,CAAO,MAAM,CAAC,CAAA,CACrC,KAAK,MAAM;AACV,kBAAS,QAAA,EAAA;AACT,kBAAQ,OAAA,EAAA;AAAA,iBACT,CACA,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACd,kBAAQ,OAAA,CAAA,KAAA,CAAM,oBAAoB,KAAK,CAAA;AACvC,kBAAA,QAAA,CAAS,KAAc,CAAA;AACvB,kBAAA,MAAA,CAAO,KAAK,CAAA;AAAA,iBACb,CAAA;AAAA,uBACI,KAAO,EAAA;AACd,gBAAA,QAAA,CAAS,KAAc,CAAA;AACvB,gBAAA,MAAA,CAAO,KAAK,CAAA;AAAA;AACd;AACF,WACD,CAAA;AAED,UAAU,SAAA,CAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AAAA,SACnC,CAAA;AAAA;AAAA,QAGD,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAW,KAAA;AACrC,UAAM,MAAA,aAAA,GAAgB,IAAI,SAAU,CAAA;AAAA,YAClC,SAAA,CAAU,KAAO,EAAA,SAAA,EAAW,QAAU,EAAA;AACpC,cAAI,IAAA;AACF,gBAAA,OAAA,CAAQ,OAAO,WAAY,CAAA;AAAA,kBACzB,IAAM,EAAA,WAAA;AAAA,kBACN,EAAI,EAAA,KAAA;AAAA,kBACJ,KAAA,EAAO,MAAM,QAAS,EAAA;AAAA,kBACtB,gBAAgB,IAAK,CAAA,IAAA,EAAM,OAAQ,CAAA,aAAA,CAAc,MAAM,MAAM,CAAA;AAAA,kBAC7D,eAAe,OAAQ,CAAA,aAAA;AAAA,kBACvB,cAAA,EAAgB,IAAK,CAAA,OAAA,CAAQ,aAAc,CAAA,KAAA,CAAM,MAAQ,EAAA,OAAA,CAAQ,aAAc,CAAA,KAAA,CAAM,MAAQ,EAAA,KAAA,EAAO,YAAY,CAAA;AAAA,kBAChH,sBAAsB,OAAQ,CAAA;AAAA,iBAC/B,CAAA;AACD,gBAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,uBACb,KAAO,EAAA;AACd,gBAAA,QAAA,CAAS,KAAc,CAAA;AAAA;AACzB,aACF;AAAA,YACA,MAAM,QAAU,EAAA;AACd,cAAA,OAAA,CAAQ,OAAO,WAAY,CAAA;AAAA,gBACzB,IAAM,EAAA,SAAA;AAAA,gBACN,EAAI,EAAA;AAAA,eACL,CAAA;AACD,cAAS,QAAA,EAAA;AACT,cAAQ,OAAA,EAAA;AAAA;AACV,WACD,CAAA;AAED,UAAW,UAAA,CAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAAA,SACrC;AAAA,OACF,CAAA;AAAA;AAGH,IAAM,MAAA,iBAAA;AAAA,WAEC,KAAO,EAAA;AACd,IAAQ,OAAA,CAAA,KAAA,CAAM,iBAAiB,KAAK,CAAA;AACpC,IAAM,MAAA,KAAA;AAAA;AAGR,EAAO,OAAA,EAAE,cAAc,eAAgB,EAAA;AACzC;;;;"}
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export declare const worker: typeof import("./production.js");
|
|
3
|
-
export declare const createRscStream: typeof import("./createRscStream.js").createRscStream, createWorker: typeof import("../createWorker.js").createWorker;
|
|
1
|
+
export {};
|
|
4
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/index.ts"],"names":[],"mappings":""}
|
|
@@ -3,13 +3,5 @@
|
|
|
3
3
|
* Copyright (c) Nico Brinkkemper
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const worker = await (process.env["NODE_ENV"] === "production" ? import('./production.js') : import('./development.js'));
|
|
9
|
-
const {
|
|
10
|
-
createRscStream,
|
|
11
|
-
createWorker
|
|
12
|
-
} = worker;
|
|
13
|
-
|
|
14
|
-
export { createRscStream, createWorker, worker };
|
|
6
|
+
await (process.env["NODE_ENV"] === "production" ? import('./rsc-worker.production.js') : import('./rsc-worker.development.js'));
|
|
15
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../plugin/worker/rsc/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../plugin/worker/rsc/index.ts"],"sourcesContent":["await(\n process.env[\"NODE_ENV\"] === \"production\"\n ? import(\"./rsc-worker.production.js\")\n : import(\"./rsc-worker.development.js\")\n);\n"],"names":[],"mappings":";;;;;AAAA,OACE,OAAA,CAAQ,IAAI,UAAU,CAAA,KAAM,eACxB,OAAO,4BAA4B,CACnC,GAAA,OAAO,6BAA6B,CAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAoCrB,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,iBA6F7D"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-react-server
|
|
3
|
+
* Copyright (c) Nico Brinkkemper
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
import 'node:fs';
|
|
7
|
+
import 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { parentPort } from 'node:worker_threads';
|
|
10
|
+
import { PassThrough } from 'node:stream';
|
|
11
|
+
import { renderToPipeableStream } from 'react-server-dom-esm/server.node';
|
|
12
|
+
import { createLogger } from '../../utils/logger.js';
|
|
13
|
+
import { cssFiles, addCssFile } from './state.js';
|
|
14
|
+
import React__default from 'react';
|
|
15
|
+
|
|
16
|
+
const log = createLogger("rsc-worker");
|
|
17
|
+
function CssCollector({
|
|
18
|
+
children,
|
|
19
|
+
cssFiles: cssFiles2
|
|
20
|
+
}) {
|
|
21
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, Array.from(cssFiles2.entries()).map(([id, css]) => {
|
|
22
|
+
return /* @__PURE__ */ React__default.createElement("style", { key: id, "data-source": id }, css);
|
|
23
|
+
}), children);
|
|
24
|
+
}
|
|
25
|
+
async function messageHandler(message) {
|
|
26
|
+
if (message.type === "RSC_RENDER") {
|
|
27
|
+
const {
|
|
28
|
+
id,
|
|
29
|
+
pageImport,
|
|
30
|
+
propsImport,
|
|
31
|
+
pageExportName,
|
|
32
|
+
propsExportName,
|
|
33
|
+
url,
|
|
34
|
+
outDir,
|
|
35
|
+
projectRoot,
|
|
36
|
+
moduleBaseURL,
|
|
37
|
+
moduleBasePath,
|
|
38
|
+
pipableStreamOptions
|
|
39
|
+
} = message;
|
|
40
|
+
try {
|
|
41
|
+
const [Component, propsModule] = await Promise.all([
|
|
42
|
+
import(join(projectRoot, pageImport)),
|
|
43
|
+
import(join(projectRoot, propsImport))
|
|
44
|
+
]);
|
|
45
|
+
const propsAtExport = propsModule[propsExportName];
|
|
46
|
+
const props = await Promise.resolve(
|
|
47
|
+
typeof propsAtExport === "function" ? propsAtExport(url) : propsAtExport
|
|
48
|
+
);
|
|
49
|
+
const PageComponent = Component[pageExportName];
|
|
50
|
+
const stream = renderToPipeableStream(
|
|
51
|
+
/* @__PURE__ */ React__default.createElement(CssCollector, { cssFiles }, /* @__PURE__ */ React__default.createElement(PageComponent, { ...props })),
|
|
52
|
+
moduleBaseURL,
|
|
53
|
+
{
|
|
54
|
+
onError: (error) => {
|
|
55
|
+
log.error(`Stream error at ${id}:`, error);
|
|
56
|
+
parentPort?.postMessage({
|
|
57
|
+
type: "ERROR",
|
|
58
|
+
id,
|
|
59
|
+
error: error instanceof Error ? error.message : String(error)
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
onPostpone: log?.info ?? console.info,
|
|
63
|
+
environmentName: "Server",
|
|
64
|
+
importMap: {
|
|
65
|
+
imports: {
|
|
66
|
+
...pipableStreamOptions?.importMap?.imports,
|
|
67
|
+
"/": moduleBasePath
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
...pipableStreamOptions
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
const passThrough = new PassThrough();
|
|
74
|
+
stream.pipe(passThrough);
|
|
75
|
+
passThrough.on("data", (chunk) => {
|
|
76
|
+
parentPort?.postMessage({
|
|
77
|
+
type: "RSC_CHUNK",
|
|
78
|
+
id,
|
|
79
|
+
chunk: chunk.toString(),
|
|
80
|
+
moduleRootPath: moduleBasePath,
|
|
81
|
+
moduleBaseURL,
|
|
82
|
+
outDir,
|
|
83
|
+
rscOutputPath: `${outDir}/${id}.rsc`,
|
|
84
|
+
cssFiles: Array.from(cssFiles.entries())
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
passThrough.on("end", () => {
|
|
88
|
+
parentPort?.postMessage({
|
|
89
|
+
type: "RSC_END",
|
|
90
|
+
id
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.trace(error);
|
|
95
|
+
parentPort?.postMessage({
|
|
96
|
+
type: "ERROR",
|
|
97
|
+
id,
|
|
98
|
+
error: error instanceof Error ? error.message : String(error)
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
} else if (message.type === "CSS_FILE") {
|
|
102
|
+
addCssFile(message.id, message.cssFile);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { messageHandler };
|
|
107
|
+
//# sourceMappingURL=messageHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageHandler.js","sources":["../../../../plugin/worker/rsc/messageHandler.tsx"],"sourcesContent":["import { createWriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { parentPort } from \"node:worker_threads\";\nimport { PassThrough } from \"node:stream\";\nimport {\n renderToPipeableStream,\n // @ts-ignore\n} from \"react-server-dom-esm/server.node\";\nimport type {\n RscChunkMessage,\n RscEndMessage,\n RscWorkerMessage,\n} from \"../types.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport {\n cssFiles,\n clientFiles,\n serverActionFiles,\n addCssFile,\n clearCssFiles,\n} from \"./state.js\";\nimport type { WriteStream } from \"node:fs\";\nimport React from \"react\";\n\nconst log = createLogger(\"rsc-worker\");\n\n// CSS collector component\nfunction CssCollector({\n children,\n cssFiles,\n}: {\n children: React.ReactNode;\n cssFiles: Map<string, string>;\n}) {\n return (\n <>\n {Array.from(cssFiles.entries()).map(([id, css]) => {\n return (\n <style key={id} data-source={id}>\n {css}\n </style>\n );\n })}\n {children}\n </>\n );\n}\n\nexport async function messageHandler(message: RscWorkerMessage) {\n\n if (message.type === \"RSC_RENDER\") {\n const {\n id,\n pageImport,\n propsImport,\n pageExportName,\n propsExportName,\n url,\n outDir,\n projectRoot,\n moduleBaseURL,\n moduleBasePath,\n pipableStreamOptions,\n } = message;\n\n try {\n // Load modules which will trigger CSS loading\n const [Component, propsModule] = await Promise.all([\n import(join(projectRoot, pageImport)),\n import(join(projectRoot, propsImport)),\n ]);\n\n const propsAtExport = propsModule[propsExportName];\n const props = await Promise.resolve(\n typeof propsAtExport === \"function\" ? propsAtExport(url) : propsAtExport\n );\n\n const PageComponent = Component[pageExportName];\n // Now render with collected CSS\n const stream = renderToPipeableStream(\n <CssCollector cssFiles={cssFiles}>\n <PageComponent {...props} />\n </CssCollector>,\n moduleBaseURL,\n {\n onError: (error: Error) => {\n log.error(`Stream error at ${id}:`, error);\n parentPort?.postMessage({\n type: \"ERROR\",\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n },\n onPostpone: log?.info ?? console.info,\n environmentName: \"Server\",\n importMap: {\n imports: {\n ...pipableStreamOptions?.importMap?.imports,\n \"/\": moduleBasePath,\n },\n },\n ...pipableStreamOptions,\n }\n );\n\n // Listen for data and end events\n const passThrough = new PassThrough();\n\n stream.pipe(passThrough);\n\n passThrough.on(\"data\", (chunk) => {\n // Send to parent\n parentPort?.postMessage({\n type: \"RSC_CHUNK\",\n id,\n chunk: chunk.toString(),\n moduleRootPath: moduleBasePath,\n moduleBaseURL,\n outDir,\n rscOutputPath: `${outDir}/${id}.rsc`,\n cssFiles: Array.from(cssFiles.entries()),\n } satisfies RscChunkMessage);\n });\n\n passThrough.on(\"end\", () => {\n parentPort?.postMessage({\n type: \"RSC_END\",\n id,\n } satisfies RscEndMessage);\n });\n } catch (error) {\n console.trace(error);\n parentPort?.postMessage({\n type: \"ERROR\",\n id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n } else if (message.type === \"CSS_FILE\") {\n addCssFile(message.id, message.cssFile);\n }\n}\n"],"names":["cssFiles","React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../plugin/worker/rsc/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA4EzE"}
|