vite-plugin-react-server 1.1.16 → 1.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +2 -2
  2. package/dist/package.json +5 -3
  3. package/dist/plugin/components/css-collector-elements.d.ts.map +1 -1
  4. package/dist/plugin/components/html.d.ts.map +1 -1
  5. package/dist/plugin/config/autoDiscover/createGlobAutoDiscover.d.ts.map +1 -1
  6. package/dist/plugin/config/autoDiscover/customWorkerFiles.d.ts.map +1 -1
  7. package/dist/plugin/config/autoDiscover/pageAndPropFiles.d.ts.map +1 -1
  8. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
  9. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +7 -12
  10. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js.map +1 -1
  11. package/dist/plugin/config/autoDiscover/resolveBuildPages.js +2 -2
  12. package/dist/plugin/config/autoDiscover/resolveBuildPages.js.map +1 -1
  13. package/dist/plugin/config/createModuleID.d.ts +8 -0
  14. package/dist/plugin/config/createModuleID.d.ts.map +1 -0
  15. package/dist/plugin/config/createModuleID.js +33 -0
  16. package/dist/plugin/config/defaults.d.ts +5 -0
  17. package/dist/plugin/config/defaults.d.ts.map +1 -1
  18. package/dist/plugin/config/defaults.js +22 -3
  19. package/dist/plugin/config/defaults.js.map +1 -1
  20. package/dist/plugin/config/extMap.d.ts +1 -1
  21. package/dist/plugin/config/extMap.d.ts.map +1 -1
  22. package/dist/plugin/config/extMap.js +56 -26
  23. package/dist/plugin/config/extMap.js.map +1 -0
  24. package/dist/plugin/config/getCondition.d.ts.map +1 -1
  25. package/dist/plugin/config/getPaths.d.ts.map +1 -1
  26. package/dist/plugin/config/mimeTypes.d.ts.map +1 -1
  27. package/dist/plugin/config/mimeTypes.js +67 -0
  28. package/dist/plugin/config/mimeTypes.js.map +1 -1
  29. package/dist/plugin/config/resolveAutoDiscoverMatcher.d.ts.map +1 -1
  30. package/dist/plugin/config/resolveEnv.d.ts.map +1 -1
  31. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  32. package/dist/plugin/config/resolveOptions.js +24 -8
  33. package/dist/plugin/config/resolveOptions.js.map +1 -1
  34. package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
  35. package/dist/plugin/config/resolveUserConfig.js +39 -23
  36. package/dist/plugin/config/resolveUserConfig.js.map +1 -1
  37. package/dist/plugin/env/plugin.d.ts.map +1 -1
  38. package/dist/plugin/env/plugin.js +35 -2
  39. package/dist/plugin/env.js +37 -3
  40. package/dist/plugin/env.js.map +1 -1
  41. package/dist/plugin/error/toError.js +4 -4
  42. package/dist/plugin/error/toError.js.map +1 -1
  43. package/dist/plugin/helpers/cleanObject.js +2 -2
  44. package/dist/plugin/helpers/cleanObject.js.map +1 -1
  45. package/dist/plugin/helpers/collectManifestCss.js +2 -2
  46. package/dist/plugin/helpers/collectManifestCss.js.map +1 -1
  47. package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts +1 -1
  48. package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts.map +1 -1
  49. package/dist/plugin/helpers/collectViteModuleGraphCss.js +3 -1
  50. package/dist/plugin/helpers/collectViteModuleGraphCss.js.map +1 -1
  51. package/dist/plugin/helpers/createCssProps.d.ts +1 -1
  52. package/dist/plugin/helpers/createCssProps.d.ts.map +1 -1
  53. package/dist/plugin/helpers/createCssProps.js +12 -1
  54. package/dist/plugin/helpers/createCssProps.js.map +1 -1
  55. package/dist/plugin/helpers/createEventHandler.d.ts.map +1 -1
  56. package/dist/plugin/helpers/createEventHandler.js +1 -1
  57. package/dist/plugin/helpers/getBundleManifest.js +1 -1
  58. package/dist/plugin/helpers/getRouteFiles.d.ts.map +1 -1
  59. package/dist/plugin/helpers/getRouteFiles.js +2 -2
  60. package/dist/plugin/helpers/getRouteFiles.js.map +1 -1
  61. package/dist/plugin/helpers/inputNormalizer.js +1 -1
  62. package/dist/plugin/helpers/inputNormalizer.js.map +1 -1
  63. package/dist/plugin/helpers/requestInfo.d.ts +2 -2
  64. package/dist/plugin/helpers/requestInfo.d.ts.map +1 -1
  65. package/dist/plugin/helpers/requestInfo.js +10 -9
  66. package/dist/plugin/helpers/requestInfo.js.map +1 -1
  67. package/dist/plugin/helpers/resolvePage.d.ts.map +1 -1
  68. package/dist/plugin/helpers/resolveProps.d.ts.map +1 -1
  69. package/dist/plugin/helpers/serializeUserOptions.d.ts.map +1 -1
  70. package/dist/plugin/helpers/sourceMap.d.ts.map +1 -1
  71. package/dist/plugin/helpers/stashReturnValue.d.ts.map +1 -1
  72. package/dist/plugin/helpers/tryManifest.d.ts +3 -1
  73. package/dist/plugin/helpers/tryManifest.d.ts.map +1 -1
  74. package/dist/plugin/helpers/tryManifest.js +14 -8
  75. package/dist/plugin/helpers/tryManifest.js.map +1 -1
  76. package/dist/plugin/loader/transformModuleIfNeeded.d.ts.map +1 -1
  77. package/dist/plugin/loader/transformModuleIfNeeded.js +1 -2
  78. package/dist/plugin/loader/transformModuleIfNeeded.js.map +1 -1
  79. package/dist/plugin/metrics/formatMetrics.d.ts.map +1 -1
  80. package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts.map +1 -1
  81. package/dist/plugin/react-client/configureWorkerRequestHandler.js +14 -18
  82. package/dist/plugin/react-client/configureWorkerRequestHandler.js.map +1 -1
  83. package/dist/plugin/react-client/createMessageHandlers.d.ts.map +1 -1
  84. package/dist/plugin/react-server/configureReactServer.d.ts.map +1 -1
  85. package/dist/plugin/react-server/configureReactServer.js +0 -12
  86. package/dist/plugin/react-server/configureReactServer.js.map +1 -1
  87. package/dist/plugin/react-static/configurePreviewServer.d.ts.map +1 -1
  88. package/dist/plugin/react-static/configurePreviewServer.js +1 -1
  89. package/dist/plugin/react-static/configurePreviewServer.js.map +1 -1
  90. package/dist/plugin/react-static/plugin.d.ts.map +1 -1
  91. package/dist/plugin/react-static/plugin.js +5 -14
  92. package/dist/plugin/react-static/plugin.js.map +1 -1
  93. package/dist/plugin/react-static/renderPages.js +1 -1
  94. package/dist/plugin/react-static/renderPages.js.map +1 -1
  95. package/dist/plugin/source-map/createMappingsSerializer.d.ts.map +1 -1
  96. package/dist/plugin/transformer/plugin.server.d.ts +24 -0
  97. package/dist/plugin/transformer/plugin.server.d.ts.map +1 -1
  98. package/dist/plugin/transformer/plugin.server.js +18 -15
  99. package/dist/plugin/transformer/plugin.server.js.map +1 -1
  100. package/dist/plugin/types.d.ts +4 -2
  101. package/dist/plugin/types.d.ts.map +1 -1
  102. package/dist/plugin/utils/createCallServer.d.ts.map +1 -1
  103. package/dist/plugin/utils/createCallServer.js +1 -2
  104. package/dist/plugin/utils/createCallServer.js.map +1 -1
  105. package/dist/plugin/utils/envUrls.node.d.ts.map +1 -1
  106. package/dist/plugin/utils/urls.d.ts.map +1 -1
  107. package/dist/plugin/vendor/types.d.ts +2 -0
  108. package/dist/plugin/vendor/types.d.ts.map +1 -0
  109. package/dist/plugin/vendor/types.js +1 -0
  110. package/dist/plugin/worker/createWorker.js +1 -1
  111. package/dist/plugin/worker/createWorker.js.map +1 -1
  112. package/dist/plugin/worker/rsc/state.d.ts +1 -10
  113. package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
  114. package/dist/plugin/worker/rsc/state.js +31 -17
  115. package/dist/plugin/worker/rsc/state.js.map +1 -1
  116. package/dist/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +5 -5
  118. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +6 -14
  119. package/plugin/config/createModuleID.ts +51 -0
  120. package/plugin/config/defaults.tsx +5 -0
  121. package/plugin/config/extMap.ts +56 -44
  122. package/plugin/config/mimeTypes.ts +75 -1
  123. package/plugin/config/resolveOptions.ts +44 -24
  124. package/plugin/config/resolveUserConfig.ts +46 -22
  125. package/plugin/env/plugin.ts +39 -3
  126. package/plugin/helpers/collectManifestCss.ts +2 -2
  127. package/plugin/helpers/collectViteModuleGraphCss.ts +3 -0
  128. package/plugin/helpers/createCssProps.tsx +20 -3
  129. package/plugin/helpers/requestInfo.ts +30 -22
  130. package/plugin/helpers/tryManifest.ts +20 -10
  131. package/plugin/loader/transformModuleIfNeeded.ts +1 -4
  132. package/plugin/react-client/configureWorkerRequestHandler.ts +16 -20
  133. package/plugin/react-server/configureReactServer.ts +1 -13
  134. package/plugin/react-static/configurePreviewServer.ts +1 -2
  135. package/plugin/react-static/plugin.ts +20 -27
  136. package/plugin/transformer/plugin.server.ts +22 -15
  137. package/plugin/types.ts +8 -6
  138. package/plugin/utils/createCallServer.ts +1 -2
  139. package/plugin/vendor/types.ts +0 -0
  140. package/plugin/worker/rsc/state.ts +52 -62
@@ -1 +1 @@
1
- {"version":3,"file":"configureReactServer.js","sources":["../../../plugin/react-server/configureReactServer.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport { createEventHandler } from \"../helpers/createEventHandler.js\";\nimport { collectViteModuleGraphCss } from \"../helpers/collectViteModuleGraphCss.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport { createHandler } from \"../helpers/createHandler.js\";\nimport React from \"react\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport { logError } from \"../error/toError.js\";\nimport { handleServerAction } from \"./handleServerAction.js\";\n\nexport async function configureReactServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = {\n ...handlerUserOptions,\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n Html: React.Fragment,\n onEvent: createEventHandler(onEvent),\n css: handlerUserOptions.css\n };\n\n // Set environment-specific configuration\n const define = {\n ...server.config.define,\n \"process.env.NODE_ENV\": JSON.stringify(\n process.env[\"NODE_ENV\"] || \"development\"\n ),\n };\n server.config = {\n ...server.config,\n define,\n };\n\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n server.config.logger.info(\n \"[vite-plugin-react-server] 🔧 Plugin changed, preparing for restart:\",\n path\n );\n\n // Close streams with restart message\n for (const res of activeStreams) {\n res.writeHead(503, {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n \"Retry-After\": \"1\",\n });\n res.end(\n `0:E{\"digest\":\"\",\"name\":\"Error\",\"message\":\"Server restarting...\",\"stack\":\"\",\"env\":\"Server\"}`\n );\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n if (!req.url) {\n return next();\n }\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n // Handle server actions\n if (info.isServerActionRequest) {\n return handleServerAction(req, res, server, handlerOptions);\n }\n\n if (!info.isRscRequest) return next();\n try {\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n // first load the page and props\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route: info.route,\n loader: server.ssrLoadModule,\n pageExportName: handlerOptions.pageExportName ?? \"default\",\n propsExportName: handlerOptions.propsExportName ?? \"default\",\n });\n if (pageAndPropsResult.type === \"error\") {\n throw pageAndPropsResult.error;\n }\n if (pageAndPropsResult.type === \"skip\") {\n return next();\n }\n\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph, // by having loaded the page and props, we can get them from the module graph\n parentUrl: pagePath,\n handlerOptions: {\n pagePath,\n loader: server.ssrLoadModule,\n // explicitly set for development server\n ...handlerOptions,\n },\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly;\n const rscResult = createHandler({\n ...handlerOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n logger: server.config.logger,\n loader: server.ssrLoadModule,\n Html: React.Fragment,\n onEvent: eventHandler,\n manifest: serverManifest,\n server,\n route: info.route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n // set headers\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n logError(error, server.config.logger);\n res.end();\n }\n });\n // Listen for when the server actually starts\n server.httpServer?.once(\"listening\", () => {\n const address = server.httpServer?.address();\n if (address && typeof address !== \"string\") {\n const port = address.port;\n const host = server.config.server.host ?? \"localhost\";\n const protocol = server.config.server.https ? \"https\" : \"http\";\n handlerOptions.publicOrigin = `${protocol}://${host}:${port}`;\n if (handlerOptions.publicOrigin !== process.env.VITE_PUBLIC_ORIGIN) {\n process.env.VITE_PUBLIC_ORIGIN = handlerOptions.publicOrigin;\n }\n }\n });\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"configureReactServer.js","sources":["../../../plugin/react-server/configureReactServer.ts"],"sourcesContent":["import type { Manifest, ViteDevServer } from \"vite\";\nimport type { ServerResponse } from \"http\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n} from \"../types.js\";\nimport { createEventHandler } from \"../helpers/createEventHandler.js\";\nimport { collectViteModuleGraphCss } from \"../helpers/collectViteModuleGraphCss.js\";\nimport { resolvePageAndProps } from \"../helpers/resolvePageAndProps.js\";\nimport { createHandler } from \"../helpers/createHandler.js\";\nimport React from \"react\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport { logError } from \"../error/toError.js\";\nimport { handleServerAction } from \"./handleServerAction.js\";\n\nexport async function configureReactServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n serverManifest,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n serverManifest: Manifest;\n}) {\n const activeStreams = new Set<ServerResponse>();\n const {\n Html: _UserHtmlComponent,\n onEvent,\n // remove these\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = {\n ...handlerUserOptions,\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n Html: React.Fragment,\n onEvent: createEventHandler(onEvent),\n css: handlerUserOptions.css\n };\n\n // Set environment-specific configuration\n const define = {\n ...server.config.define,\n \"process.env.NODE_ENV\": JSON.stringify(\n process.env[\"NODE_ENV\"] || \"development\"\n ),\n };\n server.config = {\n ...server.config,\n define,\n };\n\n // Handle Vite server restarts\n server.ws.on(\"restart\", (path) => {\n server.config.logger.info(\n \"[vite-plugin-react-server] 🔧 Plugin changed, preparing for restart:\",\n path\n );\n\n // Close streams with restart message\n for (const res of activeStreams) {\n res.writeHead(503, {\n \"Content-Type\": \"text/x-component; charset=utf-8\",\n \"Retry-After\": \"1\",\n });\n res.end(\n `0:E{\"digest\":\"\",\"name\":\"Error\",\"message\":\"Server restarting...\",\"stack\":\"\",\"env\":\"Server\"}`\n );\n }\n activeStreams.clear();\n });\n\n server.middlewares.use(async (req, res, next) => {\n if (!req.url) {\n return next();\n }\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n\n // Handle server actions\n if (info.isServerActionRequest) {\n return handleServerAction(req, res, server, handlerOptions);\n }\n if (!info.isRscRequest) return next();\n try {\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n server.config.logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n\n // first load the page and props\n const pageAndPropsResult = await resolvePageAndProps({\n pagePath,\n propsPath,\n route: info.route,\n loader: server.ssrLoadModule,\n pageExportName: handlerOptions.pageExportName ?? \"default\",\n propsExportName: handlerOptions.propsExportName ?? \"default\",\n });\n if (pageAndPropsResult.type === \"error\") {\n throw pageAndPropsResult.error;\n }\n if (pageAndPropsResult.type === \"skip\") {\n return next();\n }\n\n const eventHandler = createEventHandler(onEvent);\n const cssFilesResult = await collectViteModuleGraphCss({\n moduleGraph: server.moduleGraph, // by having loaded the page and props, we can get them from the module graph\n parentUrl: pagePath,\n handlerOptions: {\n pagePath,\n loader: server.ssrLoadModule,\n // explicitly set for development server\n ...handlerOptions,\n },\n });\n if (cssFilesResult.type === \"skip\") {\n return next();\n }\n if (cssFilesResult.type === \"error\") {\n throw cssFilesResult.error;\n }\n const { PageComponent, pageProps } = pageAndPropsResult;\n // Create the headless RSC stream directly;\n const rscResult = createHandler({\n ...handlerOptions,\n PageComponent: PageComponent,\n pageProps: pageProps,\n logger: server.config.logger,\n loader: server.ssrLoadModule,\n Html: React.Fragment,\n onEvent: eventHandler,\n manifest: serverManifest,\n server,\n route: info.route,\n pagePath,\n propsPath,\n cssFiles: cssFilesResult.cssFiles ?? new Map(),\n globalCss: new Map(),\n });\n if (rscResult.type === \"success\") {\n // set headers\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n rscResult.stream!.pipe(res);\n }\n activeStreams.add(res);\n res.on(\"close\", () => {\n activeStreams.delete(res);\n });\n } catch (error) {\n logError(error, server.config.logger);\n res.end();\n }\n });\n // Listen for when the server actually starts\n}\n"],"names":["React"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"configurePreviewServer.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/configurePreviewServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAWrB,wBAAsB,sBAAsB,CAC1C,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,EACA,MAAM,EACN,WAAW,GACZ,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;CAChD,iBAkGA"}
1
+ {"version":3,"file":"configurePreviewServer.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/configurePreviewServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAWrB,wBAAsB,sBAAsB,CAC1C,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,EACA,MAAM,EACN,WAAW,GACZ,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;CAChD,iBAiGA"}
@@ -28,7 +28,7 @@ async function configurePreviewServer({
28
28
  staticHostDir,
29
29
  server.config.logger
30
30
  );
31
- if (filePath) {
31
+ if (filePath && contentType.includes("text/x-component")) {
32
32
  try {
33
33
  const stats = await stat(filePath);
34
34
  if (stats.isFile()) {
@@ -1 +1 @@
1
- {"version":3,"file":"configurePreviewServer.js","sources":["../../../plugin/react-static/configurePreviewServer.ts"],"sourcesContent":["import type { PreviewServer } from \"vite\";\nimport type {\n ResolvedUserOptions,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\nimport { join } from \"node:path\";\nimport { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { pipeline } from \"node:stream/promises\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\n\ninterface StreamError extends Error {\n code?: string;\n}\n\nexport async function configurePreviewServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n userOptions,\n}: {\n server: PreviewServer;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n}) {\n const staticHostDir = join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static\n );\n server.middlewares.use(async (req, res, next) => {\n if (!req.url) {\n return next();\n }\n const { contentType, filePath } = requestInfo(\n req,\n userOptions,\n staticHostDir,\n server.config.logger\n );\n\n // Handle static files including CSS\n if (filePath) {\n try {\n const stats = await stat(filePath);\n if (stats.isFile()) {\n res.setHeader(\"Content-Type\", contentType);\n\n // Create abort controller for the stream\n const controller = new AbortController();\n const { signal } = controller;\n\n // Check if response is still writable before streaming\n if (!res.writable) {\n res.statusCode = 499;\n res.end(\"Client closed request\");\n return;\n }\n\n try {\n const readStream = createReadStream(filePath);\n readStream.on(\"error\", () => {\n if (!res.writable) {\n controller.abort();\n }\n });\n await pipeline(readStream, res, { signal });\n } catch (error) {\n const streamError = error as StreamError;\n // Handle different error cases\n if (\n streamError.code === \"ERR_STREAM_PREMATURE_CLOSE\" ||\n streamError.name === \"AbortError\"\n ) {\n // Client closed the connection\n if (res.writable) {\n res.statusCode = 499;\n res.end(\"Client closed request\");\n }\n } else if (streamError.code === \"ENOENT\") {\n // File not found\n res.statusCode = 404;\n server.config.logger.error(\n `File not found: ${filePath}. ${streamError.message}`,\n {\n error: streamError,\n }\n );\n res.end(\"File not found\");\n } else {\n // Server error\n server.config.logger.error(\n `Error loading file: ${filePath}. ${streamError.message}`,\n {\n error: streamError,\n }\n );\n res.statusCode = 500;\n res.end(\"Internal server error\");\n }\n return;\n }\n return;\n }\n } catch (error) {\n const err = error as Error;\n // Handle file system errors\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n res.statusCode = 404;\n res.end(\"File not found\");\n } else {\n server.config.logger.error(`Error loading file: ${filePath}.`, {\n error: err,\n });\n res.statusCode = 500;\n res.end(\"Internal server error\");\n }\n return;\n }\n }\n next();\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configurePreviewServer.js","sources":["../../../plugin/react-static/configurePreviewServer.ts"],"sourcesContent":["import type { PreviewServer } from \"vite\";\nimport type {\n ResolvedUserOptions,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\nimport { join } from \"node:path\";\nimport { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { pipeline } from \"node:stream/promises\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\n\ninterface StreamError extends Error {\n code?: string;\n}\n\nexport async function configurePreviewServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n userOptions,\n}: {\n server: PreviewServer;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n}) {\n const staticHostDir = join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static\n );\n server.middlewares.use(async (req, res, next) => {\n if (!req.url) {\n return next();\n }\n const { contentType, filePath } = requestInfo(\n req,\n userOptions,\n staticHostDir,\n server.config.logger\n );\n // Handle static files including CSS\n if (filePath && contentType.includes(\"text/x-component\")) {\n try {\n const stats = await stat(filePath);\n if (stats.isFile()) {\n res.setHeader(\"Content-Type\", contentType);\n\n // Create abort controller for the stream\n const controller = new AbortController();\n const { signal } = controller;\n\n // Check if response is still writable before streaming\n if (!res.writable) {\n res.statusCode = 499;\n res.end(\"Client closed request\");\n return;\n }\n\n try {\n const readStream = createReadStream(filePath);\n readStream.on(\"error\", () => {\n if (!res.writable) {\n controller.abort();\n }\n });\n await pipeline(readStream, res, { signal });\n } catch (error) {\n const streamError = error as StreamError;\n // Handle different error cases\n if (\n streamError.code === \"ERR_STREAM_PREMATURE_CLOSE\" ||\n streamError.name === \"AbortError\"\n ) {\n // Client closed the connection\n if (res.writable) {\n res.statusCode = 499;\n res.end(\"Client closed request\");\n }\n } else if (streamError.code === \"ENOENT\") {\n // File not found\n res.statusCode = 404;\n server.config.logger.error(\n `File not found: ${filePath}. ${streamError.message}`,\n {\n error: streamError,\n }\n );\n res.end(\"File not found\");\n } else {\n // Server error\n server.config.logger.error(\n `Error loading file: ${filePath}. ${streamError.message}`,\n {\n error: streamError,\n }\n );\n res.statusCode = 500;\n res.end(\"Internal server error\");\n }\n return;\n }\n return;\n }\n } catch (error) {\n const err = error as Error;\n // Handle file system errors\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n res.statusCode = 404;\n res.end(\"File not found\");\n } else {\n server.config.logger.error(`Error loading file: ${filePath}.`, {\n error: err,\n });\n res.statusCode = 500;\n res.end(\"Internal server error\");\n }\n return;\n }\n }\n next();\n });\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAGL,KAAK,MAAM,IAAI,UAAU,EAE1B,MAAM,MAAM,CAAC;AAId,OAAO,KAAK,EAEV,qBAAqB,EAOrB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAyBvD,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAE7C,OAAO,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GACzC,UAAU,CAAC;IACZ,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC,CA6WD"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../plugin/react-static/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAGL,KAAK,MAAM,IAAI,UAAU,EAE1B,MAAM,MAAM,CAAC;AAId,OAAO,KAAK,EAEV,qBAAqB,EAOrB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAwBvD,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAE7C,OAAO,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GACzC,UAAU,CAAC;IACZ,IAAI,EAAE,qBAAqB,CAAC;CAC7B,CAAC,CAuWD"}
@@ -17,7 +17,6 @@ import { getCondition } from '../config/getCondition.js';
17
17
  import { serializedOptions, serializeResolvedConfig } from '../helpers/serializeUserOptions.js';
18
18
  import { collectManifestCss } from '../helpers/collectManifestCss.js';
19
19
  import { createCssProps } from '../helpers/createCssProps.js';
20
- import { tryManifest } from '../helpers/tryManifest.js';
21
20
  import { performance } from 'node:perf_hooks';
22
21
  import { DEFAULT_CONFIG } from '../config/defaults.js';
23
22
  import { baseURL } from '../utils/envUrls.node.js';
@@ -34,7 +33,7 @@ function reactStaticPlugin(options) {
34
33
  let resolvedConfig;
35
34
  let userOptions;
36
35
  let autoDiscoveredFiles = null;
37
- let serverManifest = undefined;
36
+ let serverManifest = void 0;
38
37
  let buildLoader;
39
38
  const timing = {
40
39
  start: Date.now(),
@@ -117,31 +116,23 @@ function reactStaticPlugin(options) {
117
116
  bundle,
118
117
  normalizer: userOptions.normalizer
119
118
  });
120
- if (!("source" in bundleManifest[".vite/manifest.json"])) {
119
+ const manifestPath = typeof resolvedConfig.build.manifest === "string" ? resolvedConfig.build.manifest : ".vite/manifest.json";
120
+ if (!("source" in bundleManifest[manifestPath])) {
121
121
  throw new Error("Server manifest not found");
122
122
  }
123
123
  serverManifest = JSON.parse(
124
- bundleManifest[".vite/manifest.json"].source
124
+ bundleManifest[manifestPath].source
125
125
  );
126
126
  if (!serverManifest) {
127
127
  throw new Error("Failed to parse server manifest");
128
128
  }
129
- const clientManifestResult = await tryManifest({
130
- root: userOptions.projectRoot,
131
- outDir: join(userOptions.build.outDir, userOptions.build.client),
132
- ssrManifest: false
133
- });
134
- if (clientManifestResult.type === "error") {
135
- throw clientManifestResult.error;
136
- }
137
- const clientManifest = clientManifestResult.manifest;
138
129
  buildLoader = await createBuildLoader(
139
130
  {
140
131
  userConfig,
141
132
  userOptions,
142
133
  serverManifest: serverManifest ?? {},
143
134
  staticManifest: autoDiscoveredFiles?.staticManifest ?? {},
144
- clientManifest: clientManifest ?? {}
135
+ clientManifest: {}
145
136
  },
146
137
  bundle
147
138
  );
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../../../plugin/react-static/plugin.ts"],"sourcesContent":["/**\n * plugin.ts\n *\n * PURPOSE: Main Vite plugin for React Server Components (RSC) static site generation\n *\n * This module:\n * 1. Orchestrates the entire static site generation process\n * 2. Manages the lifecycle of the RSC rendering process\n * 3. Handles file writing for both initial page loads and client-side navigation\n * - Writes .html files for initial page loads (complete HTML document)\n * - Writes .rsc files for client-side navigation (RSC content only)\n * 4. Provides hooks for Vite to integrate with the build process\n * 5. Manages worker threads for parallel rendering\n * 6. Handles error reporting and metrics collection\n */\n\nimport { join } from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport {\n type Manifest,\n type ResolvedConfig,\n type Plugin as VitePlugin,\n createLogger,\n} from \"vite\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { createBuildLoader } from \"./createBuildLoader.js\";\nimport type {\n BuildTiming,\n ReactStreamPluginMeta,\n ResolvedUserConfig,\n ResolvedUserOptions,\n PluginEvent,\n RenderPagesResult,\n AutoDiscoveredFiles,\n CssContent,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport { renderPages } from \"./renderPages.js\";\nimport { getBundleManifest } from \"../helpers/getBundleManifest.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { resolveAutoDiscover } from \"../config/autoDiscover/resolveAutoDiscover.js\";\nimport { getCondition } from \"../config/getCondition.js\";\nimport {\n serializedOptions,\n serializeResolvedConfig,\n} from \"../helpers/serializeUserOptions.js\";\nimport { collectManifestCss } from \"../helpers/collectManifestCss.js\";\nimport { createCssProps } from \"../helpers/createCssProps.js\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { baseURL } from \"../utils/envUrls.node.js\";\nimport { readFile } from \"node:fs/promises\";\n\nif (getCondition() !== \"react-server\") {\n throw new Error(\n \"Condition mismatch, should be react-server but got \" +\n process.env[\"NODE_OPTIONS\"]\n );\n}\n\nexport function reactStaticPlugin<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(\n options: StreamPluginOptions<T, InlineCSS>\n): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n let worker: Worker;\n let userConfig: ResolvedUserConfig;\n let resolvedConfig: ResolvedConfig;\n let userOptions: ResolvedUserOptions<T, InlineCSS>;\n let autoDiscoveredFiles: AutoDiscoveredFiles | null = null;\n let serverManifest: Manifest | undefined = undefined;\n let buildLoader: Awaited<ReturnType<typeof createBuildLoader>> | undefined;\n const timing: BuildTiming = {\n start: Date.now(),\n configResolved: 0,\n buildStart: 0,\n renderStart: 0,\n };\n\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n\n return {\n name: \"vite:plugin-react-server/static\",\n enforce: \"post\",\n api: {\n meta: { timing },\n },\n\n async config(config, configEnv) {\n if (config.root && config.root !== userOptions.projectRoot) {\n userOptions.projectRoot = config.root;\n }\n if(configEnv.command !== \"build\") {\n return;\n }\n // Initialize autoDiscoveredFiles for both server and client builds\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-server\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n const resolvedConfig = resolveUserConfig({\n condition: \"react-server\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n timing.configResolved = Date.now();\n },\n configResolved(config) {\n resolvedConfig = config;\n },\n async buildStart() {\n timing.buildStart = Date.now();\n if (userOptions.onEvent && autoDiscoveredFiles) {\n userOptions.onEvent({\n type: \"build.start\",\n data: {\n pages: Array.from(autoDiscoveredFiles.urlMap.keys()),\n files: autoDiscoveredFiles,\n },\n });\n }\n },\n\n async renderStart() {\n timing.renderStart = Date.now();\n },\n\n async writeBundle(options, bundle) {\n if (userOptions.onEvent) {\n userOptions.onEvent({\n type: \"build.writeBundle.static-server\",\n data: {\n pages: Array.from(autoDiscoveredFiles?.urlMap.keys() ?? []),\n options,\n bundle,\n },\n });\n }\n try {\n const bundleManifest = getBundleManifest<false>({\n bundle,\n normalizer: userOptions.normalizer,\n });\n if (!(\"source\" in bundleManifest[\".vite/manifest.json\"])) {\n throw new Error(\"Server manifest not found\");\n }\n\n serverManifest = JSON.parse(\n bundleManifest[\".vite/manifest.json\"].source as string\n );\n\n if (!serverManifest) {\n throw new Error(\"Failed to parse server manifest\");\n }\n \n const clientManifestResult = await tryManifest({\n root: userOptions.projectRoot,\n outDir: join(userOptions.build.outDir, userOptions.build.client),\n ssrManifest: false,\n });\n if (clientManifestResult.type === \"error\") {\n throw clientManifestResult.error;\n }\n const clientManifest = clientManifestResult.manifest;\n\n buildLoader = await createBuildLoader<T, InlineCSS>(\n {\n userConfig,\n userOptions: userOptions as ResolvedUserOptions<T, InlineCSS>,\n serverManifest: serverManifest ?? {},\n staticManifest: autoDiscoveredFiles?.staticManifest ?? {},\n clientManifest: clientManifest ?? {},\n },\n bundle\n );\n\n // Create CSS props for each CSS file\n const cssFilesByPage = new Map();\n\n // First collect global styles from index.html\n const globalCssInputs = collectManifestCss(\n autoDiscoveredFiles?.staticManifest ?? {},\n \"index.html\"\n );\n\n const globalCss: Map<string, CssContent<InlineCSS>> = new Map();\n // Collect CSS files for each page and its props\n for (const [url, { page, props }] of autoDiscoveredFiles?.urlMap ??\n []) {\n const transformedServerManifest = Object.fromEntries(\n Object.entries(serverManifest).map(([key, value]) => {\n if (!value.css?.length) {\n return [key, value];\n }\n return [\n key,\n {\n ...value,\n css:\n autoDiscoveredFiles?.staticManifest[key]?.css ?? value.css,\n },\n ];\n })\n );\n const cssInputs = collectManifestCss(\n transformedServerManifest,\n props ? [page, props] : page\n );\n\n // Create a map for this page's CSS files\n const pageCssMap: Map<string, CssContent> = new Map();\n // Add global styles if they exist\n if (Object.keys(globalCssInputs).length > 0) {\n for (const [key, value] of Object.entries(globalCssInputs)) {\n let cssContent = await buildLoader(value + \"?inline\").then((r) =>\n String(r.default)\n );\n if (cssContent === \"undefined\" || !cssContent) {\n cssContent = await readFile(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static,\n key\n ),\n \"utf-8\"\n ) ?? \"\"\n }\n if (cssContent) {\n globalCss.set(\n key,\n createCssProps<T, InlineCSS>({\n id: key,\n code: cssContent,\n userOptions: userOptions,\n })\n );\n }\n }\n }\n\n // Add page-specific styles\n for (const [key, value] of Object.entries(cssInputs)) {\n try {\n const { default: cssContent } = await buildLoader(\n value + \"?inline\"\n );\n if (typeof cssContent !== \"string\") {\n continue;\n }\n if (cssContent) {\n // Ensure the CSS file path is properly resolved\n pageCssMap.set(\n key,\n createCssProps({\n id: key,\n code: cssContent,\n userOptions: userOptions,\n })\n );\n }\n } catch (error) {\n console.warn(`Failed to process CSS file ${value}:`, error);\n continue;\n }\n }\n cssFilesByPage.set(url, pageCssMap);\n }\n\n const staticManifest = autoDiscoveredFiles?.staticManifest ?? {};\n const indexHtml = staticManifest?.[\"index.html\"]?.file;\n const pipeableStreamOptions = {\n ...userOptions.pipeableStreamOptions,\n bootstrapModules: [\n ...(indexHtml ? [baseURL(indexHtml)] : []),\n ...(userOptions.pipeableStreamOptions?.bootstrapModules ?? []),\n ],\n };\n userOptions.pipeableStreamOptions = pipeableStreamOptions;\n const serializedUserOptions = serializedOptions(\n userOptions,\n autoDiscoveredFiles!\n );\n // Create worker\n if (!worker) {\n const viteEnvPrefix =\n typeof resolvedConfig.envPrefix === \"string\"\n ? resolvedConfig.envPrefix\n : Array.isArray(resolvedConfig.envPrefix)\n ? resolvedConfig.envPrefix[0]\n : DEFAULT_CONFIG.ENV_PREFIX;\n const routeCount = autoDiscoveredFiles?.urlMap.size ?? 0;\n const maxListeners = routeCount + 1;\n const workerResult = await createWorker({\n projectRoot: userOptions.projectRoot,\n workerPath: userOptions.htmlWorkerPath,\n currentCondition: \"react-server\",\n reverseCondition: \"react-client\",\n maxListeners: maxListeners,\n envPrefix: viteEnvPrefix,\n logger: this.environment.logger,\n workerData: {\n resolvedConfig: serializeResolvedConfig(resolvedConfig),\n userOptions: {\n ...serializedUserOptions,\n },\n },\n });\n if (workerResult.type === \"error\") {\n throw workerResult.error;\n } else if (workerResult.type === \"skip\") {\n this.environment.logger.info(\n \"Worker not created, skipping static build\"\n );\n return;\n } else {\n worker = workerResult.worker;\n }\n }\n // Render pages\n const { onEvent, ...handlerOptions } = userOptions;\n const renderPagesGenerator = renderPages(\n autoDiscoveredFiles!,\n {\n ...handlerOptions,\n loader: buildLoader,\n worker: worker,\n logger: createLogger(),\n onEvent: async (event: PluginEvent) => {\n if (userOptions.onEvent) {\n userOptions.onEvent(event);\n }\n // Add file write completion event\n if (event.type === \"file.write\") {\n await event.data.onComplete();\n }\n },\n pipeableStreamOptions: pipeableStreamOptions,\n manifest: serverManifest ?? {},\n build: {\n htmlOutputPath: userOptions.build.htmlOutputPath,\n rscOutputPath: userOptions.build.rscOutputPath,\n outDir: userOptions.build.outDir,\n pages: userOptions.build.pages,\n server: userOptions.build.server,\n static: userOptions.build.static,\n client: userOptions.build.client,\n },\n globalCss: globalCss,\n css: {\n ...handlerOptions.css,\n inlineCss: handlerOptions.css?.inlineCss ?? true,\n },\n },\n cssFilesByPage\n );\n\n // Process render results\n let finalResult: RenderPagesResult | undefined;\n for await (const result of renderPagesGenerator) {\n if (result.type === \"error\") {\n throw result.error;\n }\n finalResult = result;\n }\n\n if (!finalResult) {\n throw new Error(\"No render result produced\");\n }\n finalResult.streamMetrics.duration = Math.round(\n performance.now() - finalResult.streamMetrics.startTime\n );\n\n this.environment.logger.info(\n `Rendered ${finalResult.completedRoutes.size} unique routes in ${finalResult.streamMetrics.duration}ms`\n );\n if (process.env[\"NODE_ENV\"] !== \"production\") {\n this.environment.logger.warn(\n `THIS IS BUILD IS NOT INTENDED FOR PRODUCTION (${process.env[\"NODE_ENV\"]})`\n );\n }\n\n // Update timing\n timing.render = Date.now() - (timing.renderStart ?? timing.start);\n } catch (error) {\n throw error;\n }\n\n // Cleanup\n try {\n worker.postMessage({ type: \"SHUTDOWN\", id: \"*\" });\n await new Promise<void>((resolve, reject) => {\n const shutdownHandler = (msg: any) => {\n if (msg.type === \"SHUTDOWN_COMPLETE\") {\n worker.removeListener(\"message\", shutdownHandler);\n worker\n .terminate()\n .then((code) =>\n code === 1\n ? resolve()\n : reject(new Error(`Worker terminated with code ${code}`))\n )\n .catch(reject);\n }\n };\n worker.on(\"message\", shutdownHandler);\n });\n } catch (error) {\n throw error;\n }\n },\n } as const;\n}\n"],"names":["resolvedConfig","options"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["../../../plugin/react-static/plugin.ts"],"sourcesContent":["/**\n * plugin.ts\n *\n * PURPOSE: Main Vite plugin for React Server Components (RSC) static site generation\n *\n * This module:\n * 1. Orchestrates the entire static site generation process\n * 2. Manages the lifecycle of the RSC rendering process\n * 3. Handles file writing for both initial page loads and client-side navigation\n * - Writes .html files for initial page loads (complete HTML document)\n * - Writes .rsc files for client-side navigation (RSC content only)\n * 4. Provides hooks for Vite to integrate with the build process\n * 5. Manages worker threads for parallel rendering\n * 6. Handles error reporting and metrics collection\n */\n\nimport { join } from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport {\n type Manifest,\n type ResolvedConfig,\n type Plugin as VitePlugin,\n createLogger,\n} from \"vite\";\nimport { resolveOptions } from \"../config/resolveOptions.js\";\nimport { resolveUserConfig } from \"../config/resolveUserConfig.js\";\nimport { createBuildLoader } from \"./createBuildLoader.js\";\nimport type {\n BuildTiming,\n ReactStreamPluginMeta,\n ResolvedUserConfig,\n ResolvedUserOptions,\n PluginEvent,\n RenderPagesResult,\n AutoDiscoveredFiles,\n CssContent,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\nimport { type StreamPluginOptions } from \"../types.js\";\nimport { renderPages } from \"./renderPages.js\";\nimport { getBundleManifest } from \"../helpers/getBundleManifest.js\";\nimport { createWorker } from \"../worker/createWorker.js\";\nimport { resolveAutoDiscover } from \"../config/autoDiscover/resolveAutoDiscover.js\";\nimport { getCondition } from \"../config/getCondition.js\";\nimport {\n serializedOptions,\n serializeResolvedConfig,\n} from \"../helpers/serializeUserOptions.js\";\nimport { collectManifestCss } from \"../helpers/collectManifestCss.js\";\nimport { createCssProps } from \"../helpers/createCssProps.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { baseURL } from \"../utils/envUrls.node.js\";\nimport { readFile } from \"node:fs/promises\";\n\nif (getCondition() !== \"react-server\") {\n throw new Error(\n \"Condition mismatch, should be react-server but got \" +\n process.env[\"NODE_OPTIONS\"]\n );\n}\n\nexport function reactStaticPlugin<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(\n options: StreamPluginOptions<T, InlineCSS>\n): VitePlugin<{\n meta: ReactStreamPluginMeta;\n}> {\n let worker: Worker;\n let userConfig: ResolvedUserConfig;\n let resolvedConfig: ResolvedConfig;\n let userOptions: ResolvedUserOptions<T, InlineCSS>;\n let autoDiscoveredFiles: AutoDiscoveredFiles | null = null;\n let serverManifest: Manifest | undefined = undefined;\n let buildLoader: Awaited<ReturnType<typeof createBuildLoader>> | undefined;\n const timing: BuildTiming = {\n start: Date.now(),\n configResolved: 0,\n buildStart: 0,\n renderStart: 0,\n };\n\n const resolvedOptions = resolveOptions(options);\n if (resolvedOptions.type === \"error\") {\n throw resolvedOptions.error;\n }\n userOptions = resolvedOptions.userOptions;\n\n return {\n name: \"vite:plugin-react-server/static\",\n enforce: \"post\",\n api: {\n meta: { timing },\n },\n\n async config(config, configEnv) {\n if (config.root && config.root !== userOptions.projectRoot) {\n userOptions.projectRoot = config.root;\n }\n if (configEnv.command !== \"build\") {\n return;\n }\n // Initialize autoDiscoveredFiles for both server and client builds\n const autoDiscoverResult = await resolveAutoDiscover({\n config,\n configEnv,\n userOptions,\n condition: \"react-server\",\n });\n if (autoDiscoverResult.type === \"error\") {\n throw autoDiscoverResult.error;\n }\n autoDiscoveredFiles = autoDiscoverResult.autoDiscoveredFiles;\n const resolvedConfig = resolveUserConfig({\n condition: \"react-server\",\n config,\n configEnv,\n userOptions,\n autoDiscoveredFiles,\n });\n if (resolvedConfig.type === \"error\") {\n throw resolvedConfig.error;\n }\n\n userConfig = resolvedConfig.userConfig;\n timing.configResolved = Date.now();\n },\n configResolved(config) {\n resolvedConfig = config;\n },\n async buildStart() {\n timing.buildStart = Date.now();\n if (userOptions.onEvent && autoDiscoveredFiles) {\n userOptions.onEvent({\n type: \"build.start\",\n data: {\n pages: Array.from(autoDiscoveredFiles.urlMap.keys()),\n files: autoDiscoveredFiles,\n },\n });\n }\n },\n\n async renderStart() {\n timing.renderStart = Date.now();\n },\n\n async writeBundle(options, bundle) {\n if (userOptions.onEvent) {\n userOptions.onEvent({\n type: \"build.writeBundle.static-server\",\n data: {\n pages: Array.from(autoDiscoveredFiles?.urlMap.keys() ?? []),\n options,\n bundle,\n },\n });\n }\n try {\n const bundleManifest = getBundleManifest<false>({\n bundle,\n normalizer: userOptions.normalizer,\n });\n const manifestPath =\n typeof resolvedConfig.build.manifest === \"string\"\n ? resolvedConfig.build.manifest\n : \".vite/manifest.json\";\n if (!(\"source\" in bundleManifest[manifestPath])) {\n throw new Error(\"Server manifest not found\");\n }\n\n serverManifest = JSON.parse(\n bundleManifest[manifestPath].source as string\n );\n\n if (!serverManifest) {\n throw new Error(\"Failed to parse server manifest\");\n }\n\n buildLoader = await createBuildLoader(\n {\n userConfig,\n userOptions: userOptions,\n serverManifest: serverManifest ?? {},\n staticManifest: autoDiscoveredFiles?.staticManifest ?? {},\n clientManifest: {},\n },\n bundle\n );\n\n // Create CSS props for each CSS file\n const cssFilesByPage = new Map();\n\n // First collect global styles from index.html\n const globalCssInputs = collectManifestCss(\n autoDiscoveredFiles?.staticManifest ?? {},\n \"index.html\"\n );\n\n const globalCss: Map<string, CssContent<InlineCSS>> = new Map();\n // Collect CSS files for each page and its props\n for (const [url, { page, props }] of autoDiscoveredFiles?.urlMap ??\n []) {\n const transformedServerManifest = Object.fromEntries(\n Object.entries(serverManifest).map(([key, value]) => {\n if (!value.css?.length) {\n return [key, value];\n }\n return [\n key,\n {\n ...value,\n css:\n autoDiscoveredFiles?.staticManifest[key]?.css ?? value.css,\n },\n ];\n })\n );\n const cssInputs = collectManifestCss(\n transformedServerManifest,\n props ? [page, props] : page\n );\n // Create a map for this page's CSS files\n const pageCssMap: Map<string, CssContent> = new Map();\n // Add global styles if they exist\n if (Object.keys(globalCssInputs).length > 0) {\n for (const [key, value] of Object.entries(globalCssInputs)) {\n let cssContent = await buildLoader(value + \"?inline\").then((r) =>\n String(r.default)\n );\n if (cssContent === \"undefined\" || !cssContent) {\n cssContent =\n (await readFile(\n join(\n userOptions.projectRoot,\n userOptions.build.outDir,\n userOptions.build.static,\n key\n ),\n \"utf-8\"\n )) ?? \"\";\n }\n if (cssContent) {\n globalCss.set(\n key,\n createCssProps<T, InlineCSS>({\n id: key,\n code: cssContent,\n userOptions: userOptions,\n })\n );\n }\n }\n }\n\n // Add page-specific styles\n for (const [key, value] of Object.entries(cssInputs)) {\n try {\n const { default: cssContent } = await buildLoader(\n value + \"?inline\"\n );\n if (typeof cssContent !== \"string\") {\n continue;\n }\n if (cssContent) {\n // Ensure the CSS file path is properly resolved\n pageCssMap.set(\n key,\n createCssProps({\n id: key,\n code: cssContent,\n userOptions: userOptions,\n })\n );\n }\n } catch (error) {\n console.warn(`Failed to process CSS file ${value}:`, error);\n continue;\n }\n }\n cssFilesByPage.set(url, pageCssMap);\n }\n\n const staticManifest = autoDiscoveredFiles?.staticManifest ?? {};\n const indexHtml = staticManifest?.[\"index.html\"]?.file;\n const pipeableStreamOptions = {\n ...userOptions.pipeableStreamOptions,\n bootstrapModules: [\n ...(indexHtml ? [baseURL(indexHtml)] : []),\n ...(userOptions.pipeableStreamOptions?.bootstrapModules ?? []),\n ],\n };\n userOptions.pipeableStreamOptions = pipeableStreamOptions;\n const serializedUserOptions = serializedOptions(\n userOptions,\n autoDiscoveredFiles!\n );\n // Create worker\n if (!worker) {\n const viteEnvPrefix =\n typeof resolvedConfig.envPrefix === \"string\"\n ? resolvedConfig.envPrefix\n : Array.isArray(resolvedConfig.envPrefix)\n ? resolvedConfig.envPrefix[0]\n : DEFAULT_CONFIG.ENV_PREFIX;\n const routeCount = autoDiscoveredFiles?.urlMap.size ?? 0;\n const maxListeners = routeCount + 1;\n const workerResult = await createWorker({\n projectRoot: userOptions.projectRoot,\n workerPath: userOptions.htmlWorkerPath,\n currentCondition: \"react-server\",\n reverseCondition: \"react-client\",\n maxListeners: maxListeners,\n envPrefix: viteEnvPrefix,\n logger: this.environment.logger,\n workerData: {\n resolvedConfig: serializeResolvedConfig(resolvedConfig),\n userOptions: {\n ...serializedUserOptions,\n },\n },\n });\n if (workerResult.type === \"error\") {\n throw workerResult.error;\n } else if (workerResult.type === \"skip\") {\n this.environment.logger.info(\n \"Worker not created, skipping static build\"\n );\n return;\n } else {\n worker = workerResult.worker;\n }\n }\n // Render pages\n const { onEvent, ...handlerOptions } = userOptions;\n const renderPagesGenerator = renderPages(\n autoDiscoveredFiles!,\n {\n ...handlerOptions,\n loader: buildLoader,\n worker: worker,\n logger: createLogger(),\n onEvent: async (event: PluginEvent) => {\n if (userOptions.onEvent) {\n userOptions.onEvent(event);\n }\n // Add file write completion event\n if (event.type === \"file.write\") {\n await event.data.onComplete();\n }\n },\n pipeableStreamOptions: pipeableStreamOptions,\n manifest: serverManifest ?? {},\n build: {\n htmlOutputPath: userOptions.build.htmlOutputPath,\n rscOutputPath: userOptions.build.rscOutputPath,\n outDir: userOptions.build.outDir,\n pages: userOptions.build.pages,\n server: userOptions.build.server,\n static: userOptions.build.static,\n client: userOptions.build.client,\n },\n globalCss: globalCss,\n css: {\n ...handlerOptions.css,\n inlineCss: handlerOptions.css?.inlineCss ?? true,\n },\n },\n cssFilesByPage\n );\n\n // Process render results\n let finalResult: RenderPagesResult | undefined;\n for await (const result of renderPagesGenerator) {\n if (result.type === \"error\") {\n throw result.error;\n }\n finalResult = result;\n }\n\n if (!finalResult) {\n throw new Error(\"No render result produced\");\n }\n finalResult.streamMetrics.duration = Math.round(\n performance.now() - finalResult.streamMetrics.startTime\n );\n\n this.environment.logger.info(\n `Rendered ${finalResult.completedRoutes.size} unique routes in ${finalResult.streamMetrics.duration}ms`\n );\n if (process.env[\"NODE_ENV\"] !== \"production\") {\n this.environment.logger.warn(\n `THIS IS BUILD IS NOT INTENDED FOR PRODUCTION (${process.env[\"NODE_ENV\"]})`\n );\n }\n\n // Update timing\n timing.render = Date.now() - (timing.renderStart ?? timing.start);\n } catch (error) {\n throw error;\n }\n\n // Cleanup\n try {\n worker.postMessage({ type: \"SHUTDOWN\", id: \"*\" });\n await new Promise<void>((resolve, reject) => {\n const shutdownHandler = (msg: any) => {\n if (msg.type === \"SHUTDOWN_COMPLETE\") {\n worker.removeListener(\"message\", shutdownHandler);\n worker\n .terminate()\n .then((code) =>\n code === 1\n ? resolve()\n : reject(new Error(`Worker terminated with code ${code}`))\n )\n .catch(reject);\n }\n };\n worker.on(\"message\", shutdownHandler);\n });\n } catch (error) {\n throw error;\n }\n },\n } as const;\n}\n"],"names":["resolvedConfig","options"],"mappings":"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"}
@@ -113,7 +113,7 @@ async function* renderPages(autoDiscoveredFiles, handlerOptions, cssFilesByPage)
113
113
  return {
114
114
  type: "success",
115
115
  completedRoutes,
116
- failedRoutes: undefined,
116
+ failedRoutes: void 0,
117
117
  htmlSizes: baseMetrics.htmlSizes,
118
118
  rscSizes: baseMetrics.rscSizes,
119
119
  streamMetrics: baseMetrics.streamMetrics,
@@ -1 +1 @@
1
- {"version":3,"file":"renderPages.js","sources":["../../../plugin/react-static/renderPages.ts"],"sourcesContent":["/**\n * renderPages.ts\n *\n * PURPOSE: Processes React Server Components (RSC) streams and writes output files\n *\n * This module:\n * 1. Creates RSC and HTML streams for each route\n * 2. Pipes RSC stream directly to .rsc files\n * 3. Transforms RSC to HTML via worker and pipes to .html files\n * 4. Collects metrics and handles errors\n */\nimport { createRenderMetrics } from \"../helpers/metrics.js\";\nimport { renderPage } from \"./renderPage.js\";\nimport { PassThrough } from \"node:stream\";\nimport type {\n StreamMetrics,\n RenderPagesResult,\n AutoDiscoveredFiles,\n CssContent,\n MultiPageHandlerOptions,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\n\nexport async function* renderPages<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(\n autoDiscoveredFiles: AutoDiscoveredFiles,\n handlerOptions: MultiPageHandlerOptions<T>,\n cssFilesByPage: Map<string, Map<string, CssContent<InlineCSS>>>\n): AsyncGenerator<RenderPagesResult, RenderPagesResult, unknown> {\n const routes = Array.from(autoDiscoveredFiles.urlMap.keys());\n const completedRoutes = new Set<string>();\n const failedRoutes = new Set<string>();\n const baseMetrics = createRenderMetrics(routes[0]);\n const results = new Map<\n string,\n {\n html: PassThrough;\n rsc: PassThrough;\n metrics: {\n rscFull: StreamMetrics;\n rscHeadless: StreamMetrics;\n };\n }\n >();\n const errors: Error[] = [];\n\n if (!autoDiscoveredFiles.urlMap) {\n throw new Error(\"No urlMap provided to renderPages\");\n }\n\n for (const route of routes) {\n const { page, props } = autoDiscoveredFiles.urlMap.get(route) || {};\n if (!page) continue;\n\n try {\n const pageRenderer = renderPage({\n ...handlerOptions,\n route,\n pagePath: page,\n propsPath: props,\n cssFiles: cssFilesByPage.get(route) ?? new Map(),\n });\n\n for await (const result of pageRenderer) {\n if (result.type === \"skip\") continue;\n\n if (result.type === \"error\") {\n failedRoutes.add(route);\n errors.push(result.error);\n yield {\n type: \"error\",\n error: result.error,\n failedRoutes,\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n continue;\n }\n\n if (result.type === \"success\") {\n completedRoutes.add(route);\n results.set(route, {\n html: result.html,\n rsc: result.rsc,\n metrics: result.metrics,\n });\n\n // Update metrics\n baseMetrics.htmlSizes.set(route, result.metrics.rscFull.bytes);\n baseMetrics.rscSizes.set(route, result.metrics.rscHeadless.bytes);\n baseMetrics.streamMetrics = {\n ...baseMetrics.streamMetrics,\n chunks: Math.max(\n baseMetrics.streamMetrics.chunks,\n result.metrics.rscFull.chunks\n ),\n bytes: Math.max(\n baseMetrics.streamMetrics.bytes,\n result.metrics.rscFull.bytes\n ),\n duration: Math.max(\n baseMetrics.streamMetrics.duration,\n result.metrics.rscFull.duration\n ),\n startTime: Math.min(\n baseMetrics.streamMetrics.startTime,\n result.metrics.rscFull.startTime\n ),\n };\n\n yield {\n type: \"success\",\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n }\n }\n } catch (err) {\n failedRoutes.add(route);\n errors.push(err instanceof Error ? err : new Error(String(err)));\n yield {\n type: \"error\",\n error: err instanceof Error ? err : new Error(String(err)),\n failedRoutes,\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n }\n }\n\n if (failedRoutes.size > 0) {\n return {\n type: \"error\",\n error: errors[0],\n failedRoutes,\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n }\n\n return {\n type: \"success\",\n completedRoutes,\n failedRoutes: undefined,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderPages.js","sources":["../../../plugin/react-static/renderPages.ts"],"sourcesContent":["/**\n * renderPages.ts\n *\n * PURPOSE: Processes React Server Components (RSC) streams and writes output files\n *\n * This module:\n * 1. Creates RSC and HTML streams for each route\n * 2. Pipes RSC stream directly to .rsc files\n * 3. Transforms RSC to HTML via worker and pipes to .html files\n * 4. Collects metrics and handles errors\n */\nimport { createRenderMetrics } from \"../helpers/metrics.js\";\nimport { renderPage } from \"./renderPage.js\";\nimport { PassThrough } from \"node:stream\";\nimport type {\n StreamMetrics,\n RenderPagesResult,\n AutoDiscoveredFiles,\n CssContent,\n MultiPageHandlerOptions,\n PagePropOpt,\n InlineCssOpt,\n} from \"../types.js\";\n\nexport async function* renderPages<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(\n autoDiscoveredFiles: AutoDiscoveredFiles,\n handlerOptions: MultiPageHandlerOptions<T>,\n cssFilesByPage: Map<string, Map<string, CssContent<InlineCSS>>>\n): AsyncGenerator<RenderPagesResult, RenderPagesResult, unknown> {\n const routes = Array.from(autoDiscoveredFiles.urlMap.keys());\n const completedRoutes = new Set<string>();\n const failedRoutes = new Set<string>();\n const baseMetrics = createRenderMetrics(routes[0]);\n const results = new Map<\n string,\n {\n html: PassThrough;\n rsc: PassThrough;\n metrics: {\n rscFull: StreamMetrics;\n rscHeadless: StreamMetrics;\n };\n }\n >();\n const errors: Error[] = [];\n\n if (!autoDiscoveredFiles.urlMap) {\n throw new Error(\"No urlMap provided to renderPages\");\n }\n\n for (const route of routes) {\n const { page, props } = autoDiscoveredFiles.urlMap.get(route) || {};\n if (!page) continue;\n\n try {\n const pageRenderer = renderPage({\n ...handlerOptions,\n route,\n pagePath: page,\n propsPath: props,\n cssFiles: cssFilesByPage.get(route) ?? new Map(),\n });\n\n for await (const result of pageRenderer) {\n if (result.type === \"skip\") continue;\n\n if (result.type === \"error\") {\n failedRoutes.add(route);\n errors.push(result.error);\n yield {\n type: \"error\",\n error: result.error,\n failedRoutes,\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n continue;\n }\n\n if (result.type === \"success\") {\n completedRoutes.add(route);\n results.set(route, {\n html: result.html,\n rsc: result.rsc,\n metrics: result.metrics,\n });\n\n // Update metrics\n baseMetrics.htmlSizes.set(route, result.metrics.rscFull.bytes);\n baseMetrics.rscSizes.set(route, result.metrics.rscHeadless.bytes);\n baseMetrics.streamMetrics = {\n ...baseMetrics.streamMetrics,\n chunks: Math.max(\n baseMetrics.streamMetrics.chunks,\n result.metrics.rscFull.chunks\n ),\n bytes: Math.max(\n baseMetrics.streamMetrics.bytes,\n result.metrics.rscFull.bytes\n ),\n duration: Math.max(\n baseMetrics.streamMetrics.duration,\n result.metrics.rscFull.duration\n ),\n startTime: Math.min(\n baseMetrics.streamMetrics.startTime,\n result.metrics.rscFull.startTime\n ),\n };\n\n yield {\n type: \"success\",\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n }\n }\n } catch (err) {\n failedRoutes.add(route);\n errors.push(err instanceof Error ? err : new Error(String(err)));\n yield {\n type: \"error\",\n error: err instanceof Error ? err : new Error(String(err)),\n failedRoutes,\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n }\n }\n\n if (failedRoutes.size > 0) {\n return {\n type: \"error\",\n error: errors[0],\n failedRoutes,\n completedRoutes,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n }\n\n return {\n type: \"success\",\n completedRoutes,\n failedRoutes: undefined,\n htmlSizes: baseMetrics.htmlSizes,\n rscSizes: baseMetrics.rscSizes,\n streamMetrics: baseMetrics.streamMetrics,\n results,\n } as const;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createMappingsSerializer.d.ts","sourceRoot":"","sources":["../../../plugin/source-map/createMappingsSerializer.ts"],"names":[],"mappings":"AACA,wBAAgB,wBAAwB,uBAUhB,MAAM,sBACJ,MAAM,kBACV,MAAM,mBACL,MAAM,qBACJ,MAAM,gBACX,MAAM,YAoKvB"}
1
+ {"version":3,"file":"createMappingsSerializer.d.ts","sourceRoot":"","sources":["../../../plugin/source-map/createMappingsSerializer.ts"],"names":[],"mappings":"AACA,wBAAgB,wBAAwB,KAUlC,kBAAkB,MAAM,EACxB,oBAAoB,MAAM,EAC1B,gBAAgB,MAAM,EACtB,iBAAiB,MAAM,EACvB,mBAAmB,MAAM,EACzB,cAAc,MAAM,YAoKvB"}
@@ -1,4 +1,28 @@
1
1
  import type { InlineCssOpt, PagePropOpt, StreamPluginOptions } from "../types.js";
2
2
  import type { Plugin } from "vite";
3
+ /**
4
+ * Plugin for transforming React Client Components.
5
+ *
6
+ * Core responsibilities:
7
+ * 1. Detects "use client" directives
8
+ * 2. Transforms client components for RSC boundaries
9
+ * 3. Adds client reference metadata for RSC
10
+ *
11
+ * When a component is marked with "use client", it:
12
+ * - Gets transformed into a client reference
13
+ * - Maintains module ID for RSC boundaries
14
+ * - Preserves class/function behavior
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * export default defineConfig({
19
+ * plugins: [
20
+ * viteReactClientTransformPlugin({
21
+ * projectRoot: process.cwd(),
22
+ * })
23
+ * ]
24
+ * });
25
+ * ```
26
+ */
3
27
  export declare function reactTransformPlugin<T extends PagePropOpt = PagePropOpt, InlineCSS extends InlineCssOpt = InlineCssOpt>(options: StreamPluginOptions<T, InlineCSS>): Plugin;
4
28
  //# sourceMappingURL=plugin.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.server.d.ts","sourceRoot":"","sources":["../../../plugin/transformer/plugin.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAY,MAAM,EAAE,MAAM,MAAM,CAAC;AAkC7C,wBAAgB,oBAAoB,CAClC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,OAAO,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,CAoHpD"}
1
+ {"version":3,"file":"plugin.server.d.ts","sourceRoot":"","sources":["../../../plugin/transformer/plugin.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAY,MAAM,EAAE,MAAM,MAAM,CAAC;AAO7C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,wBAAgB,oBAAoB,CAClC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,OAAO,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,CA6HpD"}
@@ -8,14 +8,14 @@ import { tryManifest } from '../helpers/tryManifest.js';
8
8
  import { join } from 'node:path';
9
9
  import { transformModuleIfNeeded } from '../loader/transformModuleIfNeeded.js';
10
10
 
11
- let isBuild = true;
12
- let isSSR = false;
13
11
  function reactTransformPlugin(options) {
14
12
  let userOptions;
15
13
  const resolvedOptionsResult = resolveOptions(options);
16
14
  if (resolvedOptionsResult.type === "error") throw resolvedOptionsResult.error;
17
15
  userOptions = resolvedOptionsResult.userOptions;
18
- let staticManifest;
16
+ let staticManifest = {};
17
+ let isBuild = true;
18
+ let isSSR = false;
19
19
  return {
20
20
  name: "vite:react-server-transform",
21
21
  enforce: "post",
@@ -27,12 +27,15 @@ function reactTransformPlugin(options) {
27
27
  const staticManifestResult = await tryManifest({
28
28
  root: userOptions.projectRoot,
29
29
  ssrManifest: false,
30
- outDir: join(userOptions.build.outDir, userOptions.build.static)
30
+ outDir: join(userOptions.build.outDir, userOptions.build.static),
31
+ manifestPath: config.build.manifest
31
32
  });
32
33
  if (staticManifestResult.type === "error") {
33
34
  throw staticManifestResult.error;
34
35
  }
35
- staticManifest = staticManifestResult.manifest;
36
+ if (staticManifestResult.type === "success") {
37
+ staticManifest = staticManifestResult.manifest;
38
+ }
36
39
  }
37
40
  },
38
41
  async resolveId(_id, importer, options2) {
@@ -45,25 +48,27 @@ function reactTransformPlugin(options) {
45
48
  if (!options2?.ssr || !userOptions.autoDiscover.modulePattern(id)) {
46
49
  return null;
47
50
  }
48
- const [, value] = userOptions.normalizer(id);
49
- let moduleID = value;
51
+ const isServerFunctionCode = userOptions.autoDiscover.isServerFunctionCode(code);
52
+ const isClientComponentCode = userOptions.autoDiscover.isClientComponentCode(code);
53
+ if (!isServerFunctionCode && !isClientComponentCode) {
54
+ return null;
55
+ }
56
+ let [, moduleID] = userOptions.normalizer(id);
50
57
  if (isBuild) {
51
58
  if (staticManifest) {
52
- if (value in staticManifest) {
53
- moduleID = staticManifest[value].file;
59
+ if (moduleID in staticManifest) {
60
+ moduleID = staticManifest[moduleID].file;
54
61
  }
55
62
  } else {
56
63
  throw new Error(`Static manifest not found during dev build.`);
57
64
  }
58
- } else {
59
- moduleID = join(userOptions.moduleBasePath, value);
60
65
  }
61
66
  let finalID = userOptions.moduleID(moduleID);
62
67
  const transformed = transformModuleIfNeeded(
63
68
  code,
64
69
  finalID,
65
- userOptions.autoDiscover.isServerFunctionCode(code),
66
- userOptions.autoDiscover.isClientComponentCode(code),
70
+ isServerFunctionCode,
71
+ isClientComponentCode,
67
72
  true
68
73
  );
69
74
  if (userOptions.verbose) {
@@ -84,13 +89,11 @@ function reactTransformPlugin(options) {
84
89
  }
85
90
  if (!transformed) {
86
91
  return {
87
- id: finalID,
88
92
  code: "",
89
93
  map: null
90
94
  };
91
95
  }
92
96
  return {
93
- id: finalID,
94
97
  code: transformed,
95
98
  map: null
96
99
  };
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.server.js","sources":["../../../plugin/transformer/plugin.server.ts"],"sourcesContent":["import { resolveOptions } from \"../config/resolveOptions.js\";\nimport type {\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n StreamPluginOptions,\n} from \"../types.js\";\nimport type { Manifest, Plugin } from \"vite\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\nimport { join } from \"node:path\";\nimport { setStashedResolve } from \"../helpers/moduleResolver.js\";\nimport { transformModuleIfNeeded } from \"../loader/transformModuleIfNeeded.js\";\nimport { logError } from \"../error/toError.js\";\n\n/**\n * Plugin for transforming React Client Components.\n *\n * Core responsibilities:\n * 1. Detects \"use client\" directives\n * 2. Transforms client components for RSC boundaries\n * 3. Adds client reference metadata for RSC\n *\n * When a component is marked with \"use client\", it:\n * - Gets transformed into a client reference\n * - Maintains module ID for RSC boundaries\n * - Preserves class/function behavior\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * viteReactClientTransformPlugin({\n * projectRoot: process.cwd(),\n * })\n * ]\n * });\n * ```\n */\nlet isBuild = true;\nlet isSSR = false;\n\nexport function reactTransformPlugin<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(options: StreamPluginOptions<T, InlineCSS>): Plugin {\n let userOptions: ResolvedUserOptions<T, InlineCSS>;\n const resolvedOptionsResult = resolveOptions(options);\n if (resolvedOptionsResult.type === \"error\") throw resolvedOptionsResult.error;\n userOptions = resolvedOptionsResult.userOptions;\n\n let staticManifest: Manifest;\n\n return {\n name: \"vite:react-server-transform\",\n enforce: \"post\", // Run after Vite's transforms\n async configResolved(config) {\n isBuild = config.command === \"build\";\n isSSR = config.build?.ssr === true;\n if (isBuild && isSSR) {\n const staticManifestResult = await tryManifest({\n root: userOptions.projectRoot,\n ssrManifest: false,\n outDir: join(userOptions.build.outDir, userOptions.build.static),\n });\n if (staticManifestResult.type === \"error\") {\n throw staticManifestResult.error;\n }\n staticManifest = staticManifestResult.manifest;\n }\n },\n async resolveId(\n _id: string,\n importer: string | undefined,\n options: {\n attributes: Record<string, string>;\n custom?: any;\n ssr?: boolean;\n isEntry: boolean;\n }\n ) {\n if (!options?.ssr) {\n return null;\n }\n // Set stashedResolve before any transform operations\n setStashedResolve(async (specifier: string) => {\n try {\n const resolved = await this.resolve(specifier, importer, {\n custom: { conditions: [\"react-server\"] },\n });\n if (!resolved) return null;\n return { id: resolved.id };\n } catch (error) {\n logError(error, this.environment.logger);\n return null;\n }\n });\n return null; // Let Vite handle the resolution\n },\n async transform(code, id, options) {\n if (!options?.ssr || !userOptions.autoDiscover.modulePattern(id)) {\n return null;\n }\n const [, value] = userOptions.normalizer(id);\n let moduleID = value;\n if (isBuild) {\n if (staticManifest) {\n if (value in staticManifest) {\n moduleID = staticManifest[value].file;\n }\n } else {\n throw new Error(`Static manifest not found during dev build.`);\n }\n } else {\n // For non-SSR builds, just use the normalized path\n moduleID = join(userOptions.moduleBasePath, value);\n }\n let finalID = userOptions.moduleID(moduleID);\n // Always transform in server context\n const transformed = transformModuleIfNeeded(\n code,\n finalID,\n userOptions.autoDiscover.isServerFunctionCode(code),\n userOptions.autoDiscover.isClientComponentCode(code),\n true\n );\n if (userOptions.verbose)\n if (transformed !== code) {\n if (id !== finalID) {\n this.environment.logger.info(\n \"[react-server-transform] \" +\n id.split(\"/\").pop() +\n \" -> \" +\n finalID\n );\n } else {\n this.environment.logger.info(\n \"[react-server-transform] \" +\n id.split(\"/\").pop() +\n (code.startsWith('\"use client\"') ? \" (client)\" : \"\")\n );\n }\n this.environment.logger.info(\n \"[react-server-transform] \" + transformed\n );\n }\n if (!transformed) {\n return {\n id: finalID,\n code: \"\",\n map: null,\n };\n }\n\n return {\n id: finalID,\n code: transformed,\n map: null,\n };\n },\n };\n}\n"],"names":["options"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.server.js","sources":["../../../plugin/transformer/plugin.server.ts"],"sourcesContent":["import { resolveOptions } from \"../config/resolveOptions.js\";\nimport type {\n InlineCssOpt,\n PagePropOpt,\n ResolvedUserOptions,\n StreamPluginOptions,\n} from \"../types.js\";\nimport type { Manifest, Plugin } from \"vite\";\nimport { tryManifest } from \"../helpers/tryManifest.js\";\nimport { join } from \"node:path\";\nimport { setStashedResolve } from \"../helpers/moduleResolver.js\";\nimport { transformModuleIfNeeded } from \"../loader/transformModuleIfNeeded.js\";\nimport { logError } from \"../error/toError.js\";\n\n/**\n * Plugin for transforming React Client Components.\n *\n * Core responsibilities:\n * 1. Detects \"use client\" directives\n * 2. Transforms client components for RSC boundaries\n * 3. Adds client reference metadata for RSC\n *\n * When a component is marked with \"use client\", it:\n * - Gets transformed into a client reference\n * - Maintains module ID for RSC boundaries\n * - Preserves class/function behavior\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * viteReactClientTransformPlugin({\n * projectRoot: process.cwd(),\n * })\n * ]\n * });\n * ```\n */\n\nexport function reactTransformPlugin<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(options: StreamPluginOptions<T, InlineCSS>): Plugin {\n let userOptions: ResolvedUserOptions<T, InlineCSS>;\n\n const resolvedOptionsResult = resolveOptions(options);\n\n if (resolvedOptionsResult.type === \"error\") throw resolvedOptionsResult.error;\n\n userOptions = resolvedOptionsResult.userOptions;\n\n let staticManifest: Manifest = {};\n let isBuild = true;\n let isSSR = false;\n\n return {\n name: \"vite:react-server-transform\",\n enforce: \"post\", // Run after Vite's transforms\n async configResolved(config) {\n isBuild = config.command === \"build\";\n isSSR = config.build?.ssr === true;\n\n if (isBuild && isSSR) {\n const staticManifestResult = await tryManifest({\n root: userOptions.projectRoot,\n ssrManifest: false,\n outDir: join(userOptions.build.outDir, userOptions.build.static),\n manifestPath: config.build.manifest,\n });\n\n if (staticManifestResult.type === \"error\") {\n throw staticManifestResult.error;\n }\n if (staticManifestResult.type === \"success\") {\n staticManifest = staticManifestResult.manifest;\n }\n }\n },\n async resolveId(\n _id: string,\n importer: string | undefined,\n options: {\n attributes: Record<string, string>;\n custom?: any;\n ssr?: boolean;\n isEntry: boolean;\n }\n ) {\n if (!options?.ssr) {\n return null;\n }\n // Set stashedResolve before any transform operations\n setStashedResolve(async (specifier: string) => {\n try {\n const resolved = await this.resolve(specifier, importer, {\n custom: { conditions: [\"react-server\"] },\n });\n if (!resolved) return null;\n return { id: resolved.id };\n } catch (error) {\n logError(error, this.environment.logger);\n return null;\n }\n });\n return null; // Let Vite handle the resolution\n },\n async transform(code, id, options) {\n if (!options?.ssr || !userOptions.autoDiscover.modulePattern(id)) {\n return null;\n }\n const isServerFunctionCode = userOptions.autoDiscover.isServerFunctionCode(code);\n const isClientComponentCode = userOptions.autoDiscover.isClientComponentCode(code);\n if(!isServerFunctionCode && !isClientComponentCode) {\n return null;\n }\n let [, moduleID] = userOptions.normalizer(id);\n if (isBuild) {\n if (staticManifest) {\n if (moduleID in staticManifest) {\n moduleID = staticManifest[moduleID].file;\n }\n } else {\n throw new Error(`Static manifest not found during dev build.`);\n }\n }\n let finalID = userOptions.moduleID(moduleID);\n // Always transform in server context\n const transformed = transformModuleIfNeeded(\n code,\n finalID,\n isServerFunctionCode,\n isClientComponentCode,\n true\n );\n if (userOptions.verbose)\n if (transformed !== code) {\n if (id !== finalID) {\n this.environment.logger.info(\n \"[react-server-transform] \" +\n id.split(\"/\").pop() +\n \" -> \" +\n finalID\n );\n } else {\n this.environment.logger.info(\n \"[react-server-transform] \" +\n id.split(\"/\").pop() +\n (code.startsWith('\"use client\"') ? \" (client)\" : \"\")\n );\n }\n this.environment.logger.info(\n \"[react-server-transform] \" + transformed\n );\n }\n if (!transformed) {\n return {\n code: \"\",\n map: null,\n };\n }\n\n return {\n code: transformed,\n map: null,\n };\n },\n };\n}\n"],"names":["options"],"mappings":"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"}
@@ -5,6 +5,8 @@ import type { NormalizedOutputOptions, OutputBundle, PreRenderedAsset, PreRender
5
5
  import type { PassThrough, Transform } from "stream";
6
6
  import type { AliasOptions, BuildOptions, Connect, Logger, Manifest, ResolveOptions, UserConfig, ViteDevServer } from "vite";
7
7
  import type { ReactServerDomEsmOptions } from "./worker/types.js";
8
+ import type { FragmentProps } from "react";
9
+ import type { ExoticComponent } from "react";
8
10
  export type OnEvent = (event: PluginEvent) => void;
9
11
  export type CreateInputNormalizerProps = {
10
12
  root: string;
@@ -309,7 +311,7 @@ export interface StreamPluginOptions<T extends PagePropOpt = PagePropOpt, Inline
309
311
  verbose?: boolean;
310
312
  }
311
313
  export type MultiPageHandlerOptions<T extends PagePropOpt = PagePropOpt, InlineCSS extends InlineCssOpt = InlineCssOpt> = Omit<CreateHandlerOptions<T, InlineCSS>, "pagePath" | "route" | "cssFiles" | "propsPath" | "pageProps" | "PageComponent">;
312
- export type CreateHandlerOptions<T extends PagePropOpt = PagePropOpt, InlineCSS extends InlineCssOpt = InlineCssOpt> = Pick<ResolvedUserOptions<T, InlineCSS>, "autoDiscover" | "css" | "pageExportName" | "propsExportName" | "Html" | "CssCollector" | "moduleBase" | "moduleRootPath" | "moduleBasePath" | "moduleBaseURL" | "pipeableStreamOptions" | "onEvent" | "onMetrics" | "projectRoot" | "normalizer" | "moduleID"> & {
314
+ export type CreateHandlerOptions<T extends PagePropOpt = PagePropOpt, InlineCSS extends InlineCssOpt = InlineCssOpt> = Pick<ResolvedUserOptions<T, InlineCSS>, "autoDiscover" | "css" | "pageExportName" | "propsExportName" | "Html" | "CssCollector" | "moduleBase" | "moduleRootPath" | "moduleBasePath" | "moduleBaseURL" | "publicOrigin" | "pipeableStreamOptions" | "onEvent" | "onMetrics" | "projectRoot" | "normalizer" | "moduleID"> & {
313
315
  logger: Logger;
314
316
  loader: ModuleLoader;
315
317
  pagePath: string;
@@ -492,7 +494,7 @@ export type PagePath = string & {
492
494
  export type InlineCssOpt = undefined | boolean;
493
495
  export type PagePropOpt = Record<string, unknown> | undefined;
494
496
  export type RegExpOpt = RegExp | string | ((path: string) => boolean);
495
- export type AsOpt = Exclude<keyof React.JSX.IntrinsicElements, "symbol" | "object">;
497
+ export type AsOpt = ExoticComponent<FragmentProps> | Exclude<keyof React.JSX.IntrinsicElements, "symbol" | "object">;
496
498
  export type PageComponentType<T extends PagePropOpt = PagePropOpt> = React.ComponentType<T & React.PropsWithChildren<{}>>;
497
499
  export type HtmlProps<T extends PagePropOpt = PagePropOpt, InlineCSS extends InlineCssOpt = InlineCssOpt, As extends AsOpt = AsOpt> = {
498
500
  pageProps?: T;