vite-plugin-react-server 1.1.7 → 1.1.9
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 +10 -5
- package/dist/plugin/config/defaults.d.ts +1 -1
- package/dist/plugin/config/defaults.js +1 -1
- package/dist/plugin/config/defaults.js.map +1 -1
- package/dist/plugin/config/resolveAutoDiscover.d.ts +2 -0
- package/dist/plugin/config/resolveAutoDiscover.d.ts.map +1 -1
- package/dist/plugin/config/resolveAutoDiscover.js +15 -18
- package/dist/plugin/config/resolveAutoDiscover.js.map +1 -1
- package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
- package/dist/plugin/config/resolveOptions.js +4 -1
- 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 +64 -30
- package/dist/plugin/config/resolveUserConfig.js.map +1 -1
- package/dist/plugin/helpers/collectBundleManifestCss.d.ts +0 -6
- package/dist/plugin/helpers/collectBundleManifestCss.d.ts.map +1 -1
- package/dist/plugin/helpers/collectBundleManifestCss.js +2 -110
- package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts +2 -1
- package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts.map +1 -1
- package/dist/plugin/helpers/collectViteModuleGraphCss.js +19 -18
- package/dist/plugin/helpers/collectViteModuleGraphCss.js.map +1 -1
- package/dist/plugin/helpers/createCssProps.d.ts +3 -2
- package/dist/plugin/helpers/createCssProps.d.ts.map +1 -1
- package/dist/plugin/helpers/createCssProps.js +10 -6
- package/dist/plugin/helpers/createCssProps.js.map +1 -1
- package/dist/plugin/helpers/createRscStream.d.ts.map +1 -1
- package/dist/plugin/helpers/createRscStream.js +37 -43
- package/dist/plugin/helpers/createRscStream.js.map +1 -1
- package/dist/plugin/helpers/formatMetrics.d.ts +4 -0
- package/dist/plugin/helpers/formatMetrics.d.ts.map +1 -0
- package/dist/plugin/helpers/formatMetrics.js +24 -0
- package/dist/plugin/helpers/tryManifest.d.ts.map +1 -1
- package/dist/plugin/helpers/tryManifest.js +0 -8
- package/dist/plugin/helpers/tryManifest.js.map +1 -1
- package/dist/plugin/html.js +1 -1
- package/dist/plugin/html.js.map +1 -1
- package/dist/plugin/loader/createBuildLoader.d.ts.map +1 -1
- package/dist/plugin/loader/createBuildLoader.js +2 -0
- package/dist/plugin/loader/createBuildLoader.js.map +1 -1
- package/dist/plugin/metrics/formatMetrics.d.ts +4 -0
- package/dist/plugin/metrics/formatMetrics.d.ts.map +1 -0
- package/dist/plugin/metrics/formatMetrics.js +39 -0
- package/dist/plugin/metrics/formatMetrics.js.map +1 -0
- package/dist/plugin/metrics/index.d.ts +3 -0
- package/dist/plugin/metrics/index.d.ts.map +1 -0
- package/dist/plugin/metrics/index.js +1 -0
- package/dist/plugin/metrics.js +7 -0
- package/dist/plugin/metrics.js.map +1 -0
- package/dist/plugin/react-client/createWorkerStream.d.ts +16 -0
- package/dist/plugin/react-client/createWorkerStream.d.ts.map +1 -0
- package/dist/plugin/react-client/createWorkerStream.js +88 -0
- package/dist/plugin/react-client/createWorkerStream.js.map +1 -0
- package/dist/plugin/react-client/plugin.d.ts.map +1 -1
- package/dist/plugin/react-client/plugin.js +4 -1
- package/dist/plugin/react-client/plugin.js.map +1 -1
- package/dist/plugin/react-client/restartWorker.d.ts +6 -0
- package/dist/plugin/react-client/restartWorker.d.ts.map +1 -0
- package/dist/plugin/react-client/restartWorker.js +53 -0
- package/dist/plugin/react-client/restartWorker.js.map +1 -0
- package/dist/plugin/react-client/server.d.ts +5 -4
- package/dist/plugin/react-client/server.d.ts.map +1 -1
- package/dist/plugin/react-client/server.js +79 -110
- package/dist/plugin/react-client/server.js.map +1 -1
- package/dist/plugin/react-server/server.d.ts.map +1 -1
- package/dist/plugin/react-server/server.js +23 -28
- package/dist/plugin/react-server/server.js.map +1 -1
- package/dist/plugin/react-static/collectHtmlWorkerContent.js +1 -1
- package/dist/plugin/react-static/collectHtmlWorkerContent.js.map +1 -1
- package/dist/plugin/react-static/collectRscContent.js +1 -1
- package/dist/plugin/react-static/collectRscContent.js.map +1 -1
- package/dist/plugin/react-static/configurePreviewServer.d.ts.map +1 -1
- package/dist/plugin/react-static/configurePreviewServer.js +23 -4
- package/dist/plugin/react-static/configurePreviewServer.js.map +1 -1
- package/dist/plugin/react-static/fileWriter.d.ts.map +1 -1
- package/dist/plugin/react-static/fileWriter.js +5 -1
- package/dist/plugin/react-static/fileWriter.js.map +1 -1
- package/dist/plugin/react-static/plugin.d.ts.map +1 -1
- package/dist/plugin/react-static/plugin.js +50 -33
- package/dist/plugin/react-static/plugin.js.map +1 -1
- package/dist/plugin/types.d.ts +6 -7
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/plugin/utils/callServer.d.ts +2 -0
- package/dist/plugin/utils/callServer.d.ts.map +1 -0
- package/dist/plugin/utils/callServer.js +26 -0
- package/dist/plugin/utils/callServer.js.map +1 -0
- package/dist/plugin/utils/createReactFetcher.d.ts +7 -0
- package/dist/plugin/utils/createReactFetcher.d.ts.map +1 -0
- package/dist/plugin/utils/createReactFetcher.js +33 -0
- package/dist/plugin/utils/createReactFetcher.js.map +1 -0
- package/dist/plugin/utils/index.d.ts +4 -0
- package/dist/plugin/utils/index.d.ts.map +1 -0
- package/dist/plugin/utils/index.js +3 -0
- package/dist/plugin/utils/pageURL.d.ts +2 -0
- package/dist/plugin/utils/pageURL.d.ts.map +1 -0
- package/dist/plugin/utils/pageURL.js +21 -0
- package/dist/plugin/utils/pageURL.js.map +1 -0
- package/dist/plugin/utils.js +9 -0
- package/dist/plugin/utils.js.map +1 -0
- package/dist/plugin/worker/rsc/handleRender.d.ts +6 -2
- package/dist/plugin/worker/rsc/handleRender.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/handleRender.js +26 -55
- package/dist/plugin/worker/rsc/handleRender.js.map +1 -1
- package/dist/plugin/worker/rsc/messageHandler.d.ts +1 -2
- package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/messageHandler.js +45 -2
- package/dist/plugin/worker/rsc/messageHandler.js.map +1 -1
- package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
- package/dist/plugin/worker/rsc/state.js +1 -5
- package/dist/plugin/worker/rsc/state.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -5
- package/plugin/config/defaults.tsx +1 -1
- package/plugin/config/resolveAutoDiscover.ts +17 -22
- package/plugin/config/resolveOptions.ts +5 -1
- package/plugin/config/resolveUserConfig.ts +72 -37
- package/plugin/helpers/collectBundleManifestCss.ts +1 -160
- package/plugin/helpers/collectViteModuleGraphCss.ts +31 -29
- package/plugin/helpers/createCssProps.tsx +22 -11
- package/plugin/helpers/createRscStream.tsx +42 -46
- package/plugin/helpers/formatMetrics.ts +37 -0
- package/plugin/helpers/tryManifest.ts +0 -9
- package/plugin/html.tsx +1 -1
- package/plugin/loader/createBuildLoader.ts +2 -0
- package/plugin/metrics/formatMetrics.ts +37 -0
- package/plugin/metrics/index.ts +2 -0
- package/plugin/react-client/createWorkerStream.ts +107 -0
- package/plugin/react-client/plugin.ts +3 -0
- package/plugin/react-client/restartWorker.ts +65 -0
- package/plugin/react-client/server.ts +97 -146
- package/plugin/react-server/server.ts +24 -29
- package/plugin/react-static/collectHtmlWorkerContent.ts +1 -1
- package/plugin/react-static/collectRscContent.ts +2 -2
- package/plugin/react-static/configurePreviewServer.ts +29 -6
- package/plugin/react-static/fileWriter.ts +5 -1
- package/plugin/react-static/plugin.ts +58 -38
- package/plugin/types.ts +11 -11
- package/plugin/utils/callServer.ts +25 -0
- package/plugin/utils/createReactFetcher.ts +31 -0
- package/plugin/utils/index.ts +3 -0
- package/plugin/utils/pageURL.ts +28 -0
- package/plugin/worker/rsc/handleRender.ts +33 -71
- package/plugin/worker/rsc/messageHandler.tsx +48 -6
- package/plugin/worker/rsc/state.ts +1 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tryManifest.js","sources":["../../../plugin/helpers/tryManifest.ts"],"sourcesContent":["import { join, resolve } from \"node:path\";\n\nimport type { Manifest } from \"vite\";\nimport { readFile } from \"node:fs/promises\";\n\ntype TryManifestOptions<SSR extends boolean = false> = {\n root: string;\n outDir: string;\n ssrManifest?: SSR;\n preserveModulesRoot?: string;\n manifestPath?: string | undefined;\n};\n\
|
|
1
|
+
{"version":3,"file":"tryManifest.js","sources":["../../../plugin/helpers/tryManifest.ts"],"sourcesContent":["import { join, resolve } from \"node:path\";\n\nimport type { Manifest } from \"vite\";\nimport { readFile } from \"node:fs/promises\";\n\ntype TryManifestOptions<SSR extends boolean = false> = {\n root: string;\n outDir: string;\n ssrManifest?: SSR;\n preserveModulesRoot?: string;\n manifestPath?: string | undefined;\n};\n\nexport async function tryManifest<SSR extends boolean>(\n options: TryManifestOptions<SSR>\n): Promise<\n | {\n type: \"success\";\n manifest: SSR extends true ? Record<string, string[]> : Manifest;\n error?: never;\n }\n | {\n type: \"error\";\n error: Error;\n manifest?: never;\n }> {\n const localSsrManifestPath = !options.ssrManifest ? undefined : options.manifestPath ? options.manifestPath : join('.vite', 'ssr-manifest.json');\n const localManifestPath = options.ssrManifest ? undefined : options.manifestPath ? options.manifestPath : join('.vite', 'manifest.json');\n const manifestPath = resolve(\n options.root,\n options.outDir,\n options.ssrManifest ? localSsrManifestPath as string : localManifestPath as string\n );\n try {\n const result = JSON.parse(await readFile(manifestPath, \"utf-8\"));\n return {\n type: \"success\",\n manifest: result,\n };\n } catch (e) {\n console.trace(\"No manifest found\", manifestPath);\n return {\n type: \"error\",\n error: e as Error,\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAaA,eAAsB,YACpB,OAWK,EAAA;AACL,EAAM,MAAA,oBAAA,GAAuB,CAAC,OAAA,CAAQ,WAAc,GAAA,SAAA,GAAY,OAAQ,CAAA,YAAA,GAAe,OAAQ,CAAA,YAAA,GAAe,IAAK,CAAA,OAAA,EAAS,mBAAmB,CAAA;AAC/I,EAAM,MAAA,iBAAA,GAAoB,OAAQ,CAAA,WAAA,GAAc,SAAY,GAAA,OAAA,CAAQ,eAAe,OAAQ,CAAA,YAAA,GAAe,IAAK,CAAA,OAAA,EAAS,eAAe,CAAA;AACvI,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,OAAQ,CAAA,IAAA;AAAA,IACR,OAAQ,CAAA,MAAA;AAAA,IACR,OAAA,CAAQ,cAAc,oBAAiC,GAAA;AAAA,GACzD;AACA,EAAI,IAAA;AACF,IAAA,MAAM,SAAS,IAAK,CAAA,KAAA,CAAM,MAAM,QAAS,CAAA,YAAA,EAAc,OAAO,CAAC,CAAA;AAC/D,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,SAAA;AAAA,MACN,QAAU,EAAA;AAAA,KACZ;AAAA,WACO,CAAG,EAAA;AACV,IAAQ,OAAA,CAAA,KAAA,CAAM,qBAAqB,YAAY,CAAA;AAC/C,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,OAAA;AAAA,MACN,KAAO,EAAA;AAAA,KACT;AAAA;AAEJ;;;;"}
|
package/dist/plugin/html.js
CHANGED
|
@@ -12,7 +12,7 @@ const Html = ({
|
|
|
12
12
|
cssFiles,
|
|
13
13
|
globalCss,
|
|
14
14
|
moduleBasePath
|
|
15
|
-
}) => /* @__PURE__ */ React__default.createElement("html", null, /* @__PURE__ */ React__default.createElement("head", null, moduleBasePath !== ""
|
|
15
|
+
}) => /* @__PURE__ */ React__default.createElement("html", null, /* @__PURE__ */ React__default.createElement("head", null, moduleBasePath !== "", /* @__PURE__ */ React__default.createElement(CssCollectorElements, { cssFiles: globalCss })), /* @__PURE__ */ React__default.createElement("body", null, /* @__PURE__ */ React__default.createElement(CssCollector, { as: "div", id: "root", cssFiles }, children)));
|
|
16
16
|
|
|
17
17
|
export { Html };
|
|
18
18
|
//# sourceMappingURL=html.js.map
|
package/dist/plugin/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sources":["../../plugin/html.tsx"],"sourcesContent":["import React from \"react\";\nimport type { HtmlProps } from \"./types.js\";\nimport { CssCollectorElements } from \"./css-collector-elements.js\";\nexport const Html = ({\n children,\n CssCollector,\n cssFiles,\n globalCss,\n moduleBasePath,\n}: React.PropsWithChildren<HtmlProps>) => (\n <html>\n <head>\n {moduleBasePath !== \"\"
|
|
1
|
+
{"version":3,"file":"html.js","sources":["../../plugin/html.tsx"],"sourcesContent":["import React from \"react\";\nimport type { HtmlProps } from \"./types.js\";\nimport { CssCollectorElements } from \"./css-collector-elements.js\";\nexport const Html = ({\n children,\n CssCollector,\n cssFiles,\n globalCss,\n moduleBasePath,\n}: React.PropsWithChildren<HtmlProps>) => (\n <html>\n <head>\n {moduleBasePath !== \"\"}\n <CssCollectorElements cssFiles={globalCss} />\n </head>\n <body>\n <CssCollector as={\"div\"} id=\"root\" cssFiles={cssFiles}>\n {children}\n </CssCollector>\n </body>\n </html>\n);\n"],"names":["React"],"mappings":";;;;;;;;AAGO,MAAM,OAAO,CAAC;AAAA,EACnB,QAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CACE,qBAAAA,cAAA,CAAA,aAAA,CAAC,8BACEA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,EACE,mBAAmB,EACpB,kBAAAA,cAAA,CAAA,aAAA,CAAC,oBAAqB,EAAA,EAAA,QAAA,EAAU,SAAW,EAAA,CAC7C,mBACCA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,kBACEA,cAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,EAAI,EAAA,KAAA,EAAO,IAAG,MAAO,EAAA,QAAA,EAAA,EAChC,QACH,CACF,CACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBuildLoader.d.ts","sourceRoot":"","sources":["../../../plugin/loader/createBuildLoader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAG3C,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,mBAAmB,CAAC;IACjC,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,EACE,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,GACf,EAAE,kBAAkB,EACrB,MAAM,EAAE,YAAY,gBAMkB,MAAM,
|
|
1
|
+
{"version":3,"file":"createBuildLoader.d.ts","sourceRoot":"","sources":["../../../plugin/loader/createBuildLoader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAG3C,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,mBAAmB,CAAC;IACjC,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,EACE,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,GACf,EAAE,kBAAkB,EACrB,MAAM,EAAE,YAAY,gBAMkB,MAAM,mBAyH7C"}
|
|
@@ -36,6 +36,8 @@ async function createBuildLoader({
|
|
|
36
36
|
return { default: serverChunk.source };
|
|
37
37
|
} else if ("code" in serverChunk) {
|
|
38
38
|
return { default: serverChunk.code };
|
|
39
|
+
} else {
|
|
40
|
+
console.warn("Could not find inline module for: " + normalizedValue);
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
const module = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBuildLoader.js","sources":["../../../plugin/loader/createBuildLoader.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport type { ResolvedUserConfig, ResolvedUserOptions } from \"../../server.js\";\nimport type { Manifest } from \"vite\";\nimport { getModuleRef } from \"../moduleRefs.js\";\nimport { readFile } from \"node:fs/promises\";\nimport type { OutputBundle } from \"rollup\";\nimport { temporaryReferences } from \"./temporaryReferences.js\";\n\nexport interface BuildLoaderOptions {\n userConfig: ResolvedUserConfig;\n userOptions: ResolvedUserOptions;\n serverManifest: Manifest;\n clientManifest: Manifest;\n staticManifest: Manifest;\n}\n\n/**\n * Creates a loader function for handling module resolution during build.\n *\n * The loader handles the following strategy:\n * - Just load any file from any manifest we can find in the order of client, server, static\n * - Ideally the buildLoader is only used form loading pages, props and inline css modules\n * -\n *\n * During build:\n * - We use the manifest information to get module exports\n * - The manifest contains the transformed modules with their exports\n * - We store the module in temporaryReferences for later use\n *\n * @param options.root - The project root directory\n * @param options.pluginContext - The Rollup plugin context\n * @param options.userConfig - Resolved user configuration\n * @param options.userOptions - Resolved user options\n * @param options.serverManifest - Vite server manifest\n * @param options.clientManifest - Vite client manifest\n * @param options.options - Additional options including temporaryReferences\n *\n * @returns A loader function that resolves module paths to their exports\n */\nexport async function createBuildLoader(\n {\n userOptions,\n serverManifest,\n clientManifest,\n staticManifest,\n }: BuildLoaderOptions,\n bundle: OutputBundle\n) {\n const manifestKeys = Object.keys(serverManifest);\n if (!manifestKeys.length) {\n throw new Error(\"Server manifest is empty\");\n }\n return async function buildLoader(id: string) {\n const [withoutQuery, query] = id.split(\"?\", 2);\n const [, normalizedValue] = userOptions.normalizer(withoutQuery);\n const moduleRef = getModuleRef(id);\n // Check if we have a temporary reference (cached module)\n if (temporaryReferences?.has(moduleRef)) {\n const mod = temporaryReferences.get(moduleRef);\n if (typeof mod === \"object\" && mod !== null && \"error\" in mod) {\n // ignore it\n } else {\n return mod;\n }\n }\n\n try {\n // For inline modules, handle them directly\n if (query === \"inline\") {\n // Then check server manifest\n const serverChunk =\n bundle[serverManifest[normalizedValue]?.file] ??\n bundle[staticManifest[normalizedValue]?.file] ??\n bundle[clientManifest[normalizedValue]?.file] ??\n bundle[withoutQuery];\n if (serverChunk) {\n if (serverChunk.type === \"asset\") {\n return { default: serverChunk.source };\n } else if (\"code\" in serverChunk) {\n return { default: serverChunk.code };\n }\n }\n\n // If not found in either manifest, try reading the file directly\n const module = {\n default: await readFile(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static,\n normalizedValue\n ),\n \"utf-8\"\n ),\n };\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n const clientEntry = clientManifest[normalizedValue];\n if (clientEntry) {\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.client,\n clientEntry.file\n )\n );\n console.warn(\n \"client module used in buildLoader, consider making this available in the server manifest\",\n module\n );\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n const bundleEntry = bundle[withoutQuery];\n if (bundleEntry) {\n // Load the module\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.server,\n bundleEntry.fileName\n )\n );\n temporaryReferences?.set(moduleRef, module);\n }\n // Try to resolve the module using Vite's resolution\n const serverEntry = serverManifest[normalizedValue];\n if (serverEntry) {\n // Load the module\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.server,\n serverEntry.file\n )\n );\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n // try static manifest\n const staticEntry = staticManifest[normalizedValue];\n if (staticEntry) {\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static,\n staticEntry.file\n )\n );\n console.warn(\n \"static module used in buildLoader, consider making this available in the server manifest\",\n module\n );\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n throw new Error(`Module ${normalizedValue} not found`);\n } catch (error) {\n const emptyExports = {\n error: error instanceof Error ? error : new Error(String(error)),\n id: id,\n };\n temporaryReferences?.set(moduleRef, emptyExports);\n return emptyExports;\n }\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;AAuCA,eAAsB,iBACpB,CAAA;AAAA,EACE,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EACA,MACA,EAAA;AACA,EAAM,MAAA,YAAA,GAAe,MAAO,CAAA,IAAA,CAAK,cAAc,CAAA;AAC/C,EAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AACxB,IAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA;AAAA;AAE5C,EAAO,OAAA,eAAe,YAAY,EAAY,EAAA;AAC5C,IAAA,MAAM,CAAC,YAAc,EAAA,KAAK,IAAI,EAAG,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAC7C,IAAA,MAAM,GAAG,eAAe,CAAI,GAAA,WAAA,CAAY,WAAW,YAAY,CAAA;AAC/D,IAAM,MAAA,SAAA,GAAY,aAAa,EAAE,CAAA;AAEjC,IAAI,IAAA,mBAAA,EAAqB,GAAI,CAAA,SAAS,CAAG,EAAA;AACvC,MAAM,MAAA,GAAA,GAAM,mBAAoB,CAAA,GAAA,CAAI,SAAS,CAAA;AAC7C,MAAA,IAAI,OAAO,GAAQ,KAAA,QAAA,IAAY,GAAQ,KAAA,IAAA,IAAQ,WAAW,GAAK,EAAA,CAExD,MAAA;AACL,QAAO,OAAA,GAAA;AAAA;AACT;AAGF,IAAI,IAAA;AAEF,MAAA,IAAI,UAAU,QAAU,EAAA;AAEtB,QAAM,MAAA,WAAA,GACJ,OAAO,cAAe,CAAA,eAAe,GAAG,IAAI,CAAA,IAC5C,OAAO,cAAe,CAAA,eAAe,GAAG,IAAI,CAAA,IAC5C,OAAO,cAAe,CAAA,eAAe,GAAG,IAAI,CAAA,IAC5C,OAAO,YAAY,CAAA;AACrB,QAAA,IAAI,WAAa,EAAA;AACf,UAAI,IAAA,WAAA,CAAY,SAAS,OAAS,EAAA;AAChC,YAAO,OAAA,EAAE,OAAS,EAAA,WAAA,CAAY,MAAO,EAAA;AAAA,WACvC,MAAA,IAAW,UAAU,WAAa,EAAA;AAChC,YAAO,OAAA,EAAE,OAAS,EAAA,WAAA,CAAY,IAAK,EAAA;AAAA;
|
|
1
|
+
{"version":3,"file":"createBuildLoader.js","sources":["../../../plugin/loader/createBuildLoader.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport type { ResolvedUserConfig, ResolvedUserOptions } from \"../../server.js\";\nimport type { Manifest } from \"vite\";\nimport { getModuleRef } from \"../moduleRefs.js\";\nimport { readFile } from \"node:fs/promises\";\nimport type { OutputBundle } from \"rollup\";\nimport { temporaryReferences } from \"./temporaryReferences.js\";\n\nexport interface BuildLoaderOptions {\n userConfig: ResolvedUserConfig;\n userOptions: ResolvedUserOptions;\n serverManifest: Manifest;\n clientManifest: Manifest;\n staticManifest: Manifest;\n}\n\n/**\n * Creates a loader function for handling module resolution during build.\n *\n * The loader handles the following strategy:\n * - Just load any file from any manifest we can find in the order of client, server, static\n * - Ideally the buildLoader is only used form loading pages, props and inline css modules\n * -\n *\n * During build:\n * - We use the manifest information to get module exports\n * - The manifest contains the transformed modules with their exports\n * - We store the module in temporaryReferences for later use\n *\n * @param options.root - The project root directory\n * @param options.pluginContext - The Rollup plugin context\n * @param options.userConfig - Resolved user configuration\n * @param options.userOptions - Resolved user options\n * @param options.serverManifest - Vite server manifest\n * @param options.clientManifest - Vite client manifest\n * @param options.options - Additional options including temporaryReferences\n *\n * @returns A loader function that resolves module paths to their exports\n */\nexport async function createBuildLoader(\n {\n userOptions,\n serverManifest,\n clientManifest,\n staticManifest,\n }: BuildLoaderOptions,\n bundle: OutputBundle\n) {\n const manifestKeys = Object.keys(serverManifest);\n if (!manifestKeys.length) {\n throw new Error(\"Server manifest is empty\");\n }\n return async function buildLoader(id: string) {\n const [withoutQuery, query] = id.split(\"?\", 2);\n const [, normalizedValue] = userOptions.normalizer(withoutQuery);\n const moduleRef = getModuleRef(id);\n // Check if we have a temporary reference (cached module)\n if (temporaryReferences?.has(moduleRef)) {\n const mod = temporaryReferences.get(moduleRef);\n if (typeof mod === \"object\" && mod !== null && \"error\" in mod) {\n // ignore it\n } else {\n return mod;\n }\n }\n\n try {\n // For inline modules, handle them directly\n if (query === \"inline\") {\n // Then check server manifest\n const serverChunk =\n bundle[serverManifest[normalizedValue]?.file] ??\n bundle[staticManifest[normalizedValue]?.file] ??\n bundle[clientManifest[normalizedValue]?.file] ??\n bundle[withoutQuery];\n if (serverChunk) {\n if (serverChunk.type === \"asset\") {\n return { default: serverChunk.source };\n } else if (\"code\" in serverChunk) {\n return { default: serverChunk.code };\n } else {\n console.warn(\"Could not find inline module for: \" + normalizedValue);\n }\n }\n\n // If not found in either manifest, try reading the file directly\n const module = {\n default: await readFile(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static,\n normalizedValue\n ),\n \"utf-8\"\n ),\n };\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n const clientEntry = clientManifest[normalizedValue];\n if (clientEntry) {\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.client,\n clientEntry.file\n )\n );\n console.warn(\n \"client module used in buildLoader, consider making this available in the server manifest\",\n module\n );\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n const bundleEntry = bundle[withoutQuery];\n if (bundleEntry) {\n // Load the module\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.server,\n bundleEntry.fileName\n )\n );\n temporaryReferences?.set(moduleRef, module);\n }\n // Try to resolve the module using Vite's resolution\n const serverEntry = serverManifest[normalizedValue];\n if (serverEntry) {\n // Load the module\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.server,\n serverEntry.file\n )\n );\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n // try static manifest\n const staticEntry = staticManifest[normalizedValue];\n if (staticEntry) {\n const module = await import(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static,\n staticEntry.file\n )\n );\n console.warn(\n \"static module used in buildLoader, consider making this available in the server manifest\",\n module\n );\n temporaryReferences?.set(moduleRef, module);\n return module;\n }\n throw new Error(`Module ${normalizedValue} not found`);\n } catch (error) {\n const emptyExports = {\n error: error instanceof Error ? error : new Error(String(error)),\n id: id,\n };\n temporaryReferences?.set(moduleRef, emptyExports);\n return emptyExports;\n }\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;AAuCA,eAAsB,iBACpB,CAAA;AAAA,EACE,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EACA,MACA,EAAA;AACA,EAAM,MAAA,YAAA,GAAe,MAAO,CAAA,IAAA,CAAK,cAAc,CAAA;AAC/C,EAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AACxB,IAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA;AAAA;AAE5C,EAAO,OAAA,eAAe,YAAY,EAAY,EAAA;AAC5C,IAAA,MAAM,CAAC,YAAc,EAAA,KAAK,IAAI,EAAG,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAC7C,IAAA,MAAM,GAAG,eAAe,CAAI,GAAA,WAAA,CAAY,WAAW,YAAY,CAAA;AAC/D,IAAM,MAAA,SAAA,GAAY,aAAa,EAAE,CAAA;AAEjC,IAAI,IAAA,mBAAA,EAAqB,GAAI,CAAA,SAAS,CAAG,EAAA;AACvC,MAAM,MAAA,GAAA,GAAM,mBAAoB,CAAA,GAAA,CAAI,SAAS,CAAA;AAC7C,MAAA,IAAI,OAAO,GAAQ,KAAA,QAAA,IAAY,GAAQ,KAAA,IAAA,IAAQ,WAAW,GAAK,EAAA,CAExD,MAAA;AACL,QAAO,OAAA,GAAA;AAAA;AACT;AAGF,IAAI,IAAA;AAEF,MAAA,IAAI,UAAU,QAAU,EAAA;AAEtB,QAAM,MAAA,WAAA,GACJ,OAAO,cAAe,CAAA,eAAe,GAAG,IAAI,CAAA,IAC5C,OAAO,cAAe,CAAA,eAAe,GAAG,IAAI,CAAA,IAC5C,OAAO,cAAe,CAAA,eAAe,GAAG,IAAI,CAAA,IAC5C,OAAO,YAAY,CAAA;AACrB,QAAA,IAAI,WAAa,EAAA;AACf,UAAI,IAAA,WAAA,CAAY,SAAS,OAAS,EAAA;AAChC,YAAO,OAAA,EAAE,OAAS,EAAA,WAAA,CAAY,MAAO,EAAA;AAAA,WACvC,MAAA,IAAW,UAAU,WAAa,EAAA;AAChC,YAAO,OAAA,EAAE,OAAS,EAAA,WAAA,CAAY,IAAK,EAAA;AAAA,WAC9B,MAAA;AACL,YAAQ,OAAA,CAAA,IAAA,CAAK,uCAAuC,eAAe,CAAA;AAAA;AACrE;AAIF,QAAA,MAAM,MAAS,GAAA;AAAA,UACb,SAAS,MAAM,QAAA;AAAA,YACb,IAAA;AAAA,cACE,WAAY,CAAA,WAAA;AAAA,cACZ,YAAY,KAAM,CAAA,MAAA;AAAA,cAClB,YAAY,KAAM,CAAA,MAAA;AAAA,cAClB;AAAA,aACF;AAAA,YACA;AAAA;AACF,SACF;AACA,QAAqB,mBAAA,EAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAC1C,QAAO,OAAA,MAAA;AAAA;AAET,MAAM,MAAA,WAAA,GAAc,eAAe,eAAe,CAAA;AAClD,MAAA,IAAI,WAAa,EAAA;AACf,QAAM,MAAA,MAAA,GAAS,MAAM,OACnB,IAAA;AAAA,UACE,WAAY,CAAA,WAAA;AAAA,UACZ,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,WAAY,CAAA;AAAA,SACd,CAAA;AAEF,QAAQ,OAAA,CAAA,IAAA;AAAA,UACN,0FAAA;AAAA,UACA;AAAA,SACF;AACA,QAAqB,mBAAA,EAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAC1C,QAAO,OAAA,MAAA;AAAA;AAET,MAAM,MAAA,WAAA,GAAc,OAAO,YAAY,CAAA;AACvC,MAAA,IAAI,WAAa,EAAA;AAEf,QAAM,MAAA,MAAA,GAAS,MAAM,OACnB,IAAA;AAAA,UACE,WAAY,CAAA,WAAA;AAAA,UACZ,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,WAAY,CAAA;AAAA,SACd,CAAA;AAEF,QAAqB,mBAAA,EAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA;AAG5C,MAAM,MAAA,WAAA,GAAc,eAAe,eAAe,CAAA;AAClD,MAAA,IAAI,WAAa,EAAA;AAEf,QAAM,MAAA,MAAA,GAAS,MAAM,OACnB,IAAA;AAAA,UACE,WAAY,CAAA,WAAA;AAAA,UACZ,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,WAAY,CAAA;AAAA,SACd,CAAA;AAEF,QAAqB,mBAAA,EAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAC1C,QAAO,OAAA,MAAA;AAAA;AAGT,MAAM,MAAA,WAAA,GAAc,eAAe,eAAe,CAAA;AAClD,MAAA,IAAI,WAAa,EAAA;AACf,QAAM,MAAA,MAAA,GAAS,MAAM,OACnB,IAAA;AAAA,UACE,WAAY,CAAA,WAAA;AAAA,UACZ,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,YAAY,KAAM,CAAA,MAAA;AAAA,UAClB,WAAY,CAAA;AAAA,SACd,CAAA;AAEF,QAAQ,OAAA,CAAA,IAAA;AAAA,UACN,0FAAA;AAAA,UACA;AAAA,SACF;AACA,QAAqB,mBAAA,EAAA,GAAA,CAAI,WAAW,MAAM,CAAA;AAC1C,QAAO,OAAA,MAAA;AAAA;AAET,MAAA,MAAM,IAAI,KAAA,CAAM,CAAU,OAAA,EAAA,eAAe,CAAY,UAAA,CAAA,CAAA;AAAA,aAC9C,KAAO,EAAA;AACd,MAAA,MAAM,YAAe,GAAA;AAAA,QACnB,KAAA,EAAO,iBAAiB,KAAQ,GAAA,KAAA,GAAQ,IAAI,KAAM,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC/D;AAAA,OACF;AACA,MAAqB,mBAAA,EAAA,GAAA,CAAI,WAAW,YAAY,CAAA;AAChD,MAAO,OAAA,YAAA;AAAA;AACT,GACF;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatMetrics.d.ts","sourceRoot":"","sources":["../../../plugin/metrics/formatMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA8B5D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,QAEhD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-react-server
|
|
3
|
+
* Copyright (c) Nico Brinkkemper
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
function formatMetrics(metrics) {
|
|
7
|
+
const {
|
|
8
|
+
route,
|
|
9
|
+
rscSize,
|
|
10
|
+
chunks,
|
|
11
|
+
chunkRate,
|
|
12
|
+
processingTime,
|
|
13
|
+
memoryUsage,
|
|
14
|
+
streamMetrics
|
|
15
|
+
} = metrics;
|
|
16
|
+
const formatMemory = (bytes) => `${(bytes / 1024 / 1024).toFixed(2)}MB`;
|
|
17
|
+
return `
|
|
18
|
+
Route: ${route}
|
|
19
|
+
Size: ${(rscSize / 1024).toFixed(2)}KB
|
|
20
|
+
Chunks: ${chunks} (${chunkRate.toFixed(2)} chunks/s)
|
|
21
|
+
Processing Time: ${processingTime.toFixed(2)}ms
|
|
22
|
+
Memory:
|
|
23
|
+
RSS: ${formatMemory(memoryUsage.rss)}
|
|
24
|
+
Heap Total: ${formatMemory(memoryUsage.heapTotal)}
|
|
25
|
+
Heap Used: ${formatMemory(memoryUsage.heapUsed)}
|
|
26
|
+
External: ${formatMemory(memoryUsage.external)}
|
|
27
|
+
Stream:
|
|
28
|
+
Duration: ${streamMetrics.duration.toFixed(2)}ms
|
|
29
|
+
Backpressure: ${streamMetrics.backpressureCount}
|
|
30
|
+
Drain: ${streamMetrics.drainCount}
|
|
31
|
+
Errors: ${streamMetrics.errorCount}
|
|
32
|
+
`.trim();
|
|
33
|
+
}
|
|
34
|
+
function logMetrics(metrics) {
|
|
35
|
+
console.log(formatMetrics(metrics));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { formatMetrics, logMetrics };
|
|
39
|
+
//# sourceMappingURL=formatMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatMetrics.js","sources":["../../../plugin/metrics/formatMetrics.ts"],"sourcesContent":["import type { RenderMetrics } from \"../types.js\";\n\nexport function formatMetrics(metrics: RenderMetrics): string {\n const {\n route,\n rscSize,\n chunks,\n chunkRate,\n processingTime,\n memoryUsage,\n streamMetrics,\n } = metrics;\n\n // Format memory usage in MB\n const formatMemory = (bytes: number) => `${(bytes / 1024 / 1024).toFixed(2)}MB`;\n\n return `\nRoute: ${route}\nSize: ${(rscSize / 1024).toFixed(2)}KB\nChunks: ${chunks} (${chunkRate.toFixed(2)} chunks/s)\nProcessing Time: ${processingTime.toFixed(2)}ms\nMemory:\n RSS: ${formatMemory(memoryUsage.rss)}\n Heap Total: ${formatMemory(memoryUsage.heapTotal)}\n Heap Used: ${formatMemory(memoryUsage.heapUsed)}\n External: ${formatMemory(memoryUsage.external)}\nStream:\n Duration: ${streamMetrics.duration.toFixed(2)}ms\n Backpressure: ${streamMetrics.backpressureCount}\n Drain: ${streamMetrics.drainCount}\n Errors: ${streamMetrics.errorCount}\n`.trim();\n}\n\nexport function logMetrics(metrics: RenderMetrics) {\n console.log(formatMetrics(metrics));\n} "],"names":[],"mappings":";;;;;AAEO,SAAS,cAAc,OAAgC,EAAA;AAC5D,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACE,GAAA,OAAA;AAGJ,EAAM,MAAA,YAAA,GAAe,CAAC,KAAkB,KAAA,CAAA,EAAA,CAAI,QAAQ,IAAO,GAAA,IAAA,EAAM,OAAQ,CAAA,CAAC,CAAC,CAAA,EAAA,CAAA;AAE3E,EAAO,OAAA;AAAA,OAAA,EACA,KAAK;AAAA,MAAA,EAAA,CACL,OAAU,GAAA,IAAA,EAAM,OAAQ,CAAA,CAAC,CAAC,CAAA;AAAA,QAAA,EACzB,MAAM,CAAA,EAAA,EAAK,SAAU,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,iBACtB,EAAA,cAAA,CAAe,OAAQ,CAAA,CAAC,CAAC,CAAA;AAAA;AAAA,OAEnC,EAAA,YAAA,CAAa,WAAY,CAAA,GAAG,CAAC;AAAA,cACtB,EAAA,YAAA,CAAa,WAAY,CAAA,SAAS,CAAC;AAAA,aACpC,EAAA,YAAA,CAAa,WAAY,CAAA,QAAQ,CAAC;AAAA,YACnC,EAAA,YAAA,CAAa,WAAY,CAAA,QAAQ,CAAC;AAAA;AAAA,YAAA,EAElC,aAAc,CAAA,QAAA,CAAS,OAAQ,CAAA,CAAC,CAAC,CAAA;AAAA,gBAAA,EAC7B,cAAc,iBAAiB;AAAA,SAAA,EACtC,cAAc,UAAU;AAAA,UAAA,EACvB,cAAc,UAAU;AAAA,CAAA,CAClC,IAAK,EAAA;AACP;AAEO,SAAS,WAAW,OAAwB,EAAA;AACjD,EAAQ,OAAA,CAAA,GAAA,CAAI,aAAc,CAAA,OAAO,CAAC,CAAA;AACpC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../plugin/metrics/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./formatMetrics.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Logger } from "vite";
|
|
2
|
+
import type { RscRenderMessage } from "../worker/types.js";
|
|
3
|
+
import type { StreamMetrics } from "../../types.js";
|
|
4
|
+
import { Worker } from "node:worker_threads";
|
|
5
|
+
/**
|
|
6
|
+
* Creates an async generator that yields RSC chunks from the worker.
|
|
7
|
+
* Handles both module requests and RSC streaming.
|
|
8
|
+
*
|
|
9
|
+
* @param worker - The worker thread
|
|
10
|
+
* @param server - The Vite dev server
|
|
11
|
+
* @param message - The RSC render message
|
|
12
|
+
* @param rscWorkerLoaderPort - Optional loader port for module loading
|
|
13
|
+
* @returns An async generator that yields RSC chunks
|
|
14
|
+
*/
|
|
15
|
+
export declare function createWorkerStream(worker: Worker, message: Omit<RscRenderMessage, "type" | "id">, logger: Logger, onMetrics?: (metrics: StreamMetrics) => void): AsyncGenerator<Uint8Array, void, unknown>;
|
|
16
|
+
//# sourceMappingURL=createWorkerStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkerStream.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/createWorkerStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C;;;;;;;;;GASG;AACH,wBAAuB,kBAAkB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAC3C,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAuF3C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-react-server
|
|
3
|
+
* Copyright (c) Nico Brinkkemper
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
import 'node:worker_threads';
|
|
7
|
+
|
|
8
|
+
async function* createWorkerStream(worker, message, logger, onMetrics) {
|
|
9
|
+
let messageHandler;
|
|
10
|
+
let cleanup = () => {
|
|
11
|
+
};
|
|
12
|
+
let onError = (error) => {
|
|
13
|
+
let err;
|
|
14
|
+
if (typeof error === "string") {
|
|
15
|
+
err = new Error(error);
|
|
16
|
+
} else if (typeof error === "object" && error != null) {
|
|
17
|
+
const stackTrace = "stack" in error ? String(error.stack) : "";
|
|
18
|
+
const msg = "message" in error ? String(error.message) : "";
|
|
19
|
+
err = {
|
|
20
|
+
message: msg,
|
|
21
|
+
stack: stackTrace
|
|
22
|
+
};
|
|
23
|
+
} else {
|
|
24
|
+
err = new Error("Failed to load page content");
|
|
25
|
+
}
|
|
26
|
+
return new TextEncoder().encode(`0:E{"digest":"","name":"Error","message":"${err.message}","stack":${JSON.stringify(err.stack)},"env":"Server"}`);
|
|
27
|
+
};
|
|
28
|
+
yield await new Promise((resolve) => {
|
|
29
|
+
messageHandler = (message2) => {
|
|
30
|
+
switch (message2.type) {
|
|
31
|
+
case "RSC_CHUNK":
|
|
32
|
+
resolve(message2.chunk);
|
|
33
|
+
break;
|
|
34
|
+
case "RSC_END":
|
|
35
|
+
resolve(new Uint8Array());
|
|
36
|
+
break;
|
|
37
|
+
case "ERROR":
|
|
38
|
+
const errorResponse = onError(message2.error);
|
|
39
|
+
resolve(errorResponse);
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
logger.warn(`Unknown initial message type: ${message2.type}`);
|
|
43
|
+
resolve(new Uint8Array());
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
cleanup = () => {
|
|
48
|
+
worker.off("message", messageHandler);
|
|
49
|
+
};
|
|
50
|
+
worker.on("message", messageHandler);
|
|
51
|
+
worker.postMessage({
|
|
52
|
+
type: "RSC_RENDER",
|
|
53
|
+
id: message.route,
|
|
54
|
+
...message
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
while (true) {
|
|
58
|
+
const chunk = await new Promise((resolve) => {
|
|
59
|
+
messageHandler = (message2) => {
|
|
60
|
+
switch (message2.type) {
|
|
61
|
+
case "RSC_END":
|
|
62
|
+
cleanup();
|
|
63
|
+
resolve(new Uint8Array());
|
|
64
|
+
return;
|
|
65
|
+
case "RSC_CHUNK":
|
|
66
|
+
resolve(message2.chunk);
|
|
67
|
+
return;
|
|
68
|
+
case "RSC_METRICS":
|
|
69
|
+
onMetrics?.(message2.metrics);
|
|
70
|
+
break;
|
|
71
|
+
case "ERROR":
|
|
72
|
+
cleanup();
|
|
73
|
+
const errorResponse = onError(message2.error);
|
|
74
|
+
resolve(errorResponse);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
worker.once("message", messageHandler);
|
|
79
|
+
});
|
|
80
|
+
if (chunk.length === 0) {
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
yield chunk;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { createWorkerStream };
|
|
88
|
+
//# sourceMappingURL=createWorkerStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkerStream.js","sources":["../../../plugin/react-client/createWorkerStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type { RscRenderMessage, RscWorkerOutputMessage } from \"../worker/types.js\";\nimport type { StreamMetrics } from \"../../types.js\";\nimport { Worker } from \"node:worker_threads\";\n/**\n * Creates an async generator that yields RSC chunks from the worker.\n * Handles both module requests and RSC streaming.\n *\n * @param worker - The worker thread\n * @param server - The Vite dev server\n * @param message - The RSC render message\n * @param rscWorkerLoaderPort - Optional loader port for module loading\n * @returns An async generator that yields RSC chunks\n */\nexport async function* createWorkerStream(\n worker: Worker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">,\n logger: Logger,\n onMetrics?: (metrics: StreamMetrics) => void\n ): AsyncGenerator<Uint8Array, void, unknown> {\n let messageHandler: (message: RscWorkerOutputMessage) => void;\n let cleanup: () => void = () => {};\n let onError = (error: any) => {\n let err;\n if (typeof error === \"string\") {\n err = new Error(error);\n } else if (typeof error === \"object\" && error != null) {\n const stackTrace = \"stack\" in error ? String(error.stack) : \"\";\n const msg = \"message\" in error ? String(error.message) : \"\";\n err = {\n message: msg,\n stack: stackTrace,\n }\n } else {\n err = new Error(\"Failed to load page content\");\n }\n // Format the error using the worker's error details\n return new TextEncoder().encode(`0:E{\"digest\":\"\",\"name\":\"Error\",\"message\":\"${\n err.message\n }\",\"stack\":${JSON.stringify(err.stack)},\"env\":\"Server\"}`);\n };\n // First yield: wait for initial message and handle module requests\n yield await new Promise<Uint8Array>((resolve) => {\n messageHandler = (message: RscWorkerOutputMessage) => {\n switch (message.type) {\n case \"RSC_CHUNK\":\n resolve(message.chunk);\n break;\n case \"RSC_END\":\n resolve(new Uint8Array());\n break;\n case \"ERROR\":\n const errorResponse = onError(message.error);\n resolve(errorResponse);\n break;\n default:\n logger.warn(`Unknown initial message type: ${message.type}`);\n resolve(new Uint8Array());\n break;\n }\n };\n \n cleanup = () => {\n worker.off(\"message\", messageHandler);\n };\n \n worker.on(\"message\", messageHandler);\n \n // Send the render message to start the RSC stream\n worker.postMessage({\n type: \"RSC_RENDER\",\n id: message.route,\n ...message,\n });\n });\n \n // Subsequent yields: handle RSC chunks until stream ends\n while (true) {\n const chunk = await new Promise<Uint8Array>((resolve) => {\n messageHandler = (message: RscWorkerOutputMessage) => {\n switch (message.type) {\n case \"RSC_END\":\n cleanup();\n resolve(new Uint8Array());\n return;\n case \"RSC_CHUNK\":\n resolve(message.chunk);\n return;\n case \"RSC_METRICS\":\n onMetrics?.(message.metrics);\n break;\n case \"ERROR\":\n cleanup();\n const errorResponse = onError(message.error);\n resolve(errorResponse);\n return;\n }\n };\n worker.once(\"message\", messageHandler);\n });\n \n if (chunk.length === 0) {\n break;\n }\n yield chunk;\n }\n }"],"names":["message"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAIV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAcrB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAIV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAcrB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAkHtE"}
|
|
@@ -65,7 +65,10 @@ function reactClientPlugin(options) {
|
|
|
65
65
|
server,
|
|
66
66
|
autoDiscoveredFiles,
|
|
67
67
|
userOptions,
|
|
68
|
-
hmrChannel
|
|
68
|
+
hmrChannel,
|
|
69
|
+
onMetrics: userOptions.onMetrics ? (metrics) => {
|
|
70
|
+
userOptions.onMetrics?.(metrics);
|
|
71
|
+
} : undefined
|
|
69
72
|
});
|
|
70
73
|
},
|
|
71
74
|
async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["../../../plugin/react-client/plugin.ts"],"sourcesContent":["import { type Plugin } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n ResolvedUserConfig,\n ResolvedUserOptions,\n StreamPluginOptions,\n} from \"../types.js\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { resolveAutoDiscover } from \"../config/resolveAutoDiscover.js\";\nimport { configureWorkerRequestHandler } from \"./server.js\";\nimport { configurePreviewServer } from \"../react-static/configurePreviewServer.js\";\nimport { MessageChannel } from \"node:worker_threads\";\n\nlet userOptions: ResolvedUserOptions;\nlet userConfig: ResolvedUserConfig;\nlet root: string;\nlet autoDiscoveredFiles: AutoDiscoveredFiles;\nlet hmrChannel: MessageChannel | null = null;\n\nexport function reactClientPlugin(options: StreamPluginOptions): Plugin {\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n root = userOptions.projectRoot;\n\n return {\n name: \"vite:react-client\",\n\n async config(config, configEnv) {\n if (\n typeof config.root === \"string\" &&\n config.root !== root &&\n config.root !== process.cwd() &&\n config.root !== \"\"\n ) {\n root = config.root;\n }\n\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-client\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n\n const resolvedConfig = resolveUserConfig({\n condition: \"react-client\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n return userConfig;\n },\n\n async configurePreviewServer(server) {\n await configurePreviewServer({\n server,\n userOptions,\n });\n },\n // setup dev server\n async configureServer(server) {\n // Create HMR message channel\n hmrChannel = new MessageChannel();\n\n await configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions,\n hmrChannel,\n });\n },\n\n async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {\n try {\n // Check if the file is a page or props file\n const isPageFile = userOptions.autoDiscover.modulePattern(file);\n if (!isPageFile) return;\n\n // Get the route for this file\n const [, value] = userOptions.normalizer(file);\n \n // Find all routes affected by this file change\n const affectedRoutes = autoDiscoveredFiles.routeMap.get(value) || [];\n\n // Send HMR update directly to worker through MessageChannel\n if (hmrChannel?.port1) {\n hmrChannel.port1.postMessage({\n type: 'HMR_UPDATE',\n path: file,\n timestamp,\n routes: affectedRoutes\n });\n\n // Trigger a full page refresh for affected routes\n for (const route of affectedRoutes) {\n server.ws.send({\n type: 'full-reload',\n path: route\n });\n }\n }\n\n // Let Vite handle the HMR update\n return ctx.modules;\n } catch (error) {\n if (hmrChannel?.port1) {\n hmrChannel.port1.postMessage({\n type: 'HMR_ERROR',\n path: file,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n return ctx.modules;\n }\n },\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAcA,IAAI,WAAA;AACJ,IAAI,UAAA;AACJ,IAAI,IAAA;AACJ,IAAI,mBAAA;AACJ,IAAI,UAAoC,GAAA,IAAA;AAEjC,SAAS,kBAAkB,OAAsC,EAAA;AACtE,EAAM,MAAA,eAAA,GAAkB,eAAe,OAAO,CAAA;AAC9C,EAAI,IAAA,eAAA,CAAgB,SAAS,OAAS,EAAA;AACpC,IAAA,MAAM,eAAgB,CAAA,KAAA;AAAA;AAExB,EAAA,WAAA,GAAc,eAAgB,CAAA,WAAA;AAC9B,EAAA,IAAA,GAAO,WAAY,CAAA,WAAA;AAEnB,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,mBAAA;AAAA,IAEN,MAAM,MAAO,CAAA,MAAA,EAAQ,SAAW,EAAA;AAC9B,MAAA,IACE,OAAO,MAAA,CAAO,IAAS,KAAA,QAAA,IACvB,OAAO,IAAS,KAAA,IAAA,IAChB,MAAO,CAAA,IAAA,KAAS,OAAQ,CAAA,GAAA,EACxB,IAAA,MAAA,CAAO,SAAS,EAChB,EAAA;AACA,QAAA,IAAA,GAAO,MAAO,CAAA,IAAA;AAAA;AAGhB,MAAM,MAAA,kBAAA,GAAqB,MAAM,mBAAoB,CAAA;AAAA,QACnD,MAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAW,EAAA;AAAA,OACZ,CAAA;AACD,MAAI,IAAA,kBAAA,CAAmB,SAAS,OAAS,EAAA;AACvC,QAAA,MAAM,kBAAmB,CAAA,KAAA;AAAA;AAE3B,MAAA,mBAAA,GAAsB,kBAAmB,CAAA,mBAAA;AAEzC,MAAA,MAAM,iBAAiB,iBAAkB,CAAA;AAAA,QACvC,SAAW,EAAA,cAAA;AAAA,QACX,MAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAI,IAAA,cAAA,CAAe,SAAS,OAAS,EAAA;AACnC,QAAA,MAAM,cAAe,CAAA,KAAA;AAAA;AAGvB,MAAA,UAAA,GAAa,cAAe,CAAA,UAAA;AAC5B,MAAO,OAAA,UAAA;AAAA,KACT;AAAA,IAEA,MAAM,uBAAuB,MAAQ,EAAA;AACnC,MAAA,MAAM,sBAAuB,CAAA;AAAA,QAC3B,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,KACH;AAAA;AAAA,IAEA,MAAM,gBAAgB,MAAQ,EAAA;AAE5B,MAAA,UAAA,GAAa,IAAI,cAAe,EAAA;AAEhC,MAAA,MAAM,6BAA8B,CAAA;AAAA,QAClC,MAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["../../../plugin/react-client/plugin.ts"],"sourcesContent":["import { type Plugin } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n ResolvedUserConfig,\n ResolvedUserOptions,\n StreamPluginOptions,\n} from \"../types.js\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { resolveAutoDiscover } from \"../config/resolveAutoDiscover.js\";\nimport { configureWorkerRequestHandler } from \"./server.js\";\nimport { configurePreviewServer } from \"../react-static/configurePreviewServer.js\";\nimport { MessageChannel } from \"node:worker_threads\";\n\nlet userOptions: ResolvedUserOptions;\nlet userConfig: ResolvedUserConfig;\nlet root: string;\nlet autoDiscoveredFiles: AutoDiscoveredFiles;\nlet hmrChannel: MessageChannel | null = null;\n\nexport function reactClientPlugin(options: StreamPluginOptions): Plugin {\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n root = userOptions.projectRoot;\n\n return {\n name: \"vite:react-client\",\n\n async config(config, configEnv) {\n if (\n typeof config.root === \"string\" &&\n config.root !== root &&\n config.root !== process.cwd() &&\n config.root !== \"\"\n ) {\n root = config.root;\n }\n\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-client\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n\n const resolvedConfig = resolveUserConfig({\n condition: \"react-client\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n return userConfig;\n },\n\n async configurePreviewServer(server) {\n await configurePreviewServer({\n server,\n userOptions,\n });\n },\n // setup dev server\n async configureServer(server) {\n // Create HMR message channel\n hmrChannel = new MessageChannel();\n\n await configureWorkerRequestHandler({\n server,\n autoDiscoveredFiles,\n userOptions,\n hmrChannel,\n onMetrics: userOptions.onMetrics ? (metrics) => {\n userOptions.onMetrics?.(metrics);\n } : undefined,\n });\n },\n\n async handleHotUpdate({ file, server, read, timestamp, ...ctx }) {\n try {\n // Check if the file is a page or props file\n const isPageFile = userOptions.autoDiscover.modulePattern(file);\n if (!isPageFile) return;\n\n // Get the route for this file\n const [, value] = userOptions.normalizer(file);\n \n // Find all routes affected by this file change\n const affectedRoutes = autoDiscoveredFiles.routeMap.get(value) || [];\n\n // Send HMR update directly to worker through MessageChannel\n if (hmrChannel?.port1) {\n hmrChannel.port1.postMessage({\n type: 'HMR_UPDATE',\n path: file,\n timestamp,\n routes: affectedRoutes\n });\n\n // Trigger a full page refresh for affected routes\n for (const route of affectedRoutes) {\n server.ws.send({\n type: 'full-reload',\n path: route\n });\n }\n }\n\n // Let Vite handle the HMR update\n return ctx.modules;\n } catch (error) {\n if (hmrChannel?.port1) {\n hmrChannel.port1.postMessage({\n type: 'HMR_ERROR',\n path: file,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n return ctx.modules;\n }\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ResolvedUserOptions } from "../../types.js";
|
|
2
|
+
import type { ViteDevServer } from "vite";
|
|
3
|
+
import type { AutoDiscoveredFiles } from "../../types.js";
|
|
4
|
+
import type { MessageChannel, Worker } from "node:worker_threads";
|
|
5
|
+
export declare function restartWorker(server: ViteDevServer, autoDiscoveredFiles: AutoDiscoveredFiles, userOptions: ResolvedUserOptions, hmrChannel: MessageChannel): Promise<Worker | null | undefined>;
|
|
6
|
+
//# sourceMappingURL=restartWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restartWorker.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/restartWorker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlE,wBAAsB,aAAa,CAC/B,MAAM,EAAE,aAAa,EACrB,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,cAAc,sCAgD3B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vite-plugin-react-server
|
|
3
|
+
* Copyright (c) Nico Brinkkemper
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
import { createWorker } from '../worker/createWorker.js';
|
|
7
|
+
import { serializedOptions, serializedDevServerConfig } from '../helpers/serializeUserOptions.js';
|
|
8
|
+
|
|
9
|
+
let currentWorker = null;
|
|
10
|
+
let isRestarting = false;
|
|
11
|
+
async function restartWorker(server, autoDiscoveredFiles, userOptions, hmrChannel) {
|
|
12
|
+
if (isRestarting) return;
|
|
13
|
+
isRestarting = true;
|
|
14
|
+
try {
|
|
15
|
+
if (currentWorker) {
|
|
16
|
+
currentWorker.terminate();
|
|
17
|
+
currentWorker = null;
|
|
18
|
+
}
|
|
19
|
+
const routeCount = autoDiscoveredFiles.urlMap.size;
|
|
20
|
+
const hmrBuffer = 20;
|
|
21
|
+
const maxListeners = routeCount + hmrBuffer;
|
|
22
|
+
const workerResult = await createWorker({
|
|
23
|
+
projectRoot: server.config.root,
|
|
24
|
+
workerPath: userOptions.rscWorkerPath,
|
|
25
|
+
reverseCondition: "react-server",
|
|
26
|
+
currentCondition: "react-client",
|
|
27
|
+
maxListeners,
|
|
28
|
+
envPrefix: typeof server.config.envPrefix === "string" ? server.config.envPrefix : Array.isArray(server.config.envPrefix) ? server.config.envPrefix[0] : "VITE_",
|
|
29
|
+
workerData: {
|
|
30
|
+
hmrPort: hmrChannel.port2,
|
|
31
|
+
resolvedConfig: serializedDevServerConfig(server.config),
|
|
32
|
+
userOptions: serializedOptions(userOptions, autoDiscoveredFiles)
|
|
33
|
+
},
|
|
34
|
+
transferList: [hmrChannel.port2]
|
|
35
|
+
});
|
|
36
|
+
if (workerResult.type === "success") {
|
|
37
|
+
currentWorker = workerResult.worker;
|
|
38
|
+
server.config.logger.info(
|
|
39
|
+
`[react-client] Set max listeners to ${maxListeners} for ${routeCount} routes`
|
|
40
|
+
);
|
|
41
|
+
} else if (workerResult.type === "error") {
|
|
42
|
+
server.config.logger.error("Failed to start rsc-worker", {
|
|
43
|
+
error: workerResult.error
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
} finally {
|
|
47
|
+
isRestarting = false;
|
|
48
|
+
}
|
|
49
|
+
return currentWorker;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { restartWorker };
|
|
53
|
+
//# sourceMappingURL=restartWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restartWorker.js","sources":["../../../plugin/react-client/restartWorker.ts"],"sourcesContent":["import type { ResolvedUserOptions } from \"../../types.js\";\n\nimport type { ViteDevServer } from \"vite\";\nimport type { AutoDiscoveredFiles } from \"../../types.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { serializedDevServerConfig } from \"../helpers/serializeUserOptions.js\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport type { MessageChannel, Worker } from \"node:worker_threads\";\n\nlet currentWorker: Worker | null = null;\nlet isRestarting = false;\n\nexport async function restartWorker(\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel\n ) {\n if (isRestarting) return;\n isRestarting = true;\n \n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.terminate();\n currentWorker = null;\n }\n const routeCount = autoDiscoveredFiles.urlMap.size;\n const hmrBuffer = 20; // Buffer for HMR and other operations\n const maxListeners = routeCount + hmrBuffer;\n const workerResult = await createWorker({\n projectRoot: server.config.root,\n workerPath: userOptions.rscWorkerPath,\n reverseCondition: \"react-server\",\n currentCondition: \"react-client\",\n maxListeners: maxListeners,\n envPrefix:\n typeof server.config.envPrefix === \"string\"\n ? server.config.envPrefix\n : Array.isArray(server.config.envPrefix)\n ? server.config.envPrefix[0]\n : \"VITE_\",\n workerData: {\n hmrPort: hmrChannel.port2,\n resolvedConfig: serializedDevServerConfig(server.config),\n userOptions: serializedOptions(userOptions, autoDiscoveredFiles),\n },\n transferList: [hmrChannel.port2],\n });\n \n if (workerResult.type === \"success\") {\n currentWorker = workerResult.worker;\n server.config.logger.info(\n `[react-client] Set max listeners to ${maxListeners} for ${routeCount} routes`\n );\n } else if (workerResult.type === \"error\") {\n server.config.logger.error(\"Failed to start rsc-worker\", {\n error: workerResult.error,\n });\n }\n } finally {\n isRestarting = false;\n }\n return currentWorker;\n }"],"names":[],"mappings":";;;;;;;;AASA,IAAI,aAA+B,GAAA,IAAA;AACnC,IAAI,YAAe,GAAA,KAAA;AAEnB,eAAsB,aAClB,CAAA,MAAA,EACA,mBACA,EAAA,WAAA,EACA,UACA,EAAA;AACA,EAAA,IAAI,YAAc,EAAA;AAClB,EAAe,YAAA,GAAA,IAAA;AAEf,EAAI,IAAA;AAEF,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,aAAA,CAAc,SAAU,EAAA;AACxB,MAAgB,aAAA,GAAA,IAAA;AAAA;AAElB,IAAM,MAAA,UAAA,GAAa,oBAAoB,MAAO,CAAA,IAAA;AAC9C,IAAA,MAAM,SAAY,GAAA,EAAA;AAClB,IAAA,MAAM,eAAe,UAAa,GAAA,SAAA;AAClC,IAAM,MAAA,YAAA,GAAe,MAAM,YAAa,CAAA;AAAA,MACtC,WAAA,EAAa,OAAO,MAAO,CAAA,IAAA;AAAA,MAC3B,YAAY,WAAY,CAAA,aAAA;AAAA,MACxB,gBAAkB,EAAA,cAAA;AAAA,MAClB,gBAAkB,EAAA,cAAA;AAAA,MAClB,YAAA;AAAA,MACA,WACE,OAAO,MAAA,CAAO,OAAO,SAAc,KAAA,QAAA,GAC/B,OAAO,MAAO,CAAA,SAAA,GACd,MAAM,OAAQ,CAAA,MAAA,CAAO,OAAO,SAAS,CAAA,GACrC,OAAO,MAAO,CAAA,SAAA,CAAU,CAAC,CACzB,GAAA,OAAA;AAAA,MACN,UAAY,EAAA;AAAA,QACV,SAAS,UAAW,CAAA,KAAA;AAAA,QACpB,cAAA,EAAgB,yBAA0B,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,QACvD,WAAA,EAAa,iBAAkB,CAAA,WAAA,EAAa,mBAAmB;AAAA,OACjE;AAAA,MACA,YAAA,EAAc,CAAC,UAAA,CAAW,KAAK;AAAA,KAChC,CAAA;AAED,IAAI,IAAA,YAAA,CAAa,SAAS,SAAW,EAAA;AACnC,MAAA,aAAA,GAAgB,YAAa,CAAA,MAAA;AAC7B,MAAA,MAAA,CAAO,OAAO,MAAO,CAAA,IAAA;AAAA,QACnB,CAAA,oCAAA,EAAuC,YAAY,CAAA,KAAA,EAAQ,UAAU,CAAA,OAAA;AAAA,OACvE;AAAA,KACF,MAAA,IAAW,YAAa,CAAA,IAAA,KAAS,OAAS,EAAA;AACxC,MAAO,MAAA,CAAA,MAAA,CAAO,MAAO,CAAA,KAAA,CAAM,4BAA8B,EAAA;AAAA,QACvD,OAAO,YAAa,CAAA;AAAA,OACrB,CAAA;AAAA;AACH,GACA,SAAA;AACA,IAAe,YAAA,GAAA,KAAA;AAAA;AAEjB,EAAO,OAAA,aAAA;AACT;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ViteDevServer } from "vite";
|
|
2
|
-
import type { AutoDiscoveredFiles, ResolvedUserOptions } from "../types.js";
|
|
1
|
+
import type { Logger, ViteDevServer } from "vite";
|
|
2
|
+
import type { AutoDiscoveredFiles, RenderMetrics, ResolvedUserOptions, StreamMetrics } from "../types.js";
|
|
3
3
|
import type { RscRenderMessage } from "../worker/types.js";
|
|
4
4
|
import type { Worker as NodeWorker } from "node:worker_threads";
|
|
5
5
|
import { MessageChannel } from "node:worker_threads";
|
|
@@ -11,17 +11,18 @@ import { MessageChannel } from "node:worker_threads";
|
|
|
11
11
|
* @param message - The RSC render message
|
|
12
12
|
* @returns A ReadableStream that yields RSC chunks
|
|
13
13
|
*/
|
|
14
|
-
export declare function handleWorkerRscStream(worker: NodeWorker, message: Omit<RscRenderMessage, "type" | "id"
|
|
14
|
+
export declare function handleWorkerRscStream(worker: NodeWorker, message: Omit<RscRenderMessage, "type" | "id">, logger: Logger, onMetrics?: (metrics: StreamMetrics) => void): ReadableStream<Uint8Array>;
|
|
15
15
|
/**
|
|
16
16
|
* Configures the worker request handler.
|
|
17
17
|
* @param server - The Vite dev server
|
|
18
18
|
* @param autoDiscoveredFiles - The auto discovered files
|
|
19
19
|
* @param userOptions - The user options
|
|
20
20
|
*/
|
|
21
|
-
export declare function configureWorkerRequestHandler({ server, autoDiscoveredFiles, userOptions: _userOptions, hmrChannel, }: {
|
|
21
|
+
export declare function configureWorkerRequestHandler({ server, autoDiscoveredFiles, userOptions: _userOptions, hmrChannel, onMetrics, }: {
|
|
22
22
|
server: ViteDevServer;
|
|
23
23
|
autoDiscoveredFiles: AutoDiscoveredFiles;
|
|
24
24
|
userOptions: ResolvedUserOptions;
|
|
25
25
|
hmrChannel: MessageChannel;
|
|
26
|
+
onMetrics?: (metrics: RenderMetrics) => void;
|
|
26
27
|
}): Promise<void>;
|
|
27
28
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEb,mBAAmB,EACnB,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAWrD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAC3C,cAAc,CAAC,UAAU,CAAC,CAwC5B;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,MAAM,EACN,mBAAmB,EACnB,WAAW,EAAE,YAAY,EACzB,UAAU,EACV,SAAS,GACV,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C,iBAwJA"}
|