vite-plugin-react-server 1.1.13 → 1.1.14

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 (159) hide show
  1. package/dist/package.json +3 -1
  2. package/dist/plugin/config/defaults.d.ts +2 -2
  3. package/dist/plugin/config/defaults.d.ts.map +1 -1
  4. package/dist/plugin/config/defaults.js +2 -2
  5. package/dist/plugin/config/defaults.js.map +1 -1
  6. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  7. package/dist/plugin/config/resolveOptions.js +98 -61
  8. package/dist/plugin/config/resolveOptions.js.map +1 -1
  9. package/dist/plugin/error/toError.d.ts.map +1 -1
  10. package/dist/plugin/error/toError.js +0 -1
  11. package/dist/plugin/error/toError.js.map +1 -1
  12. package/dist/plugin/helpers/collectManifestCss.d.ts +1 -2
  13. package/dist/plugin/helpers/collectManifestCss.d.ts.map +1 -1
  14. package/dist/plugin/helpers/collectManifestCss.js +3 -5
  15. package/dist/plugin/helpers/collectManifestCss.js.map +1 -1
  16. package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts +1 -1
  17. package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts.map +1 -1
  18. package/dist/plugin/helpers/collectViteModuleGraphCss.js +6 -2
  19. package/dist/plugin/helpers/collectViteModuleGraphCss.js.map +1 -1
  20. package/dist/plugin/helpers/createCssProps.d.ts +1 -1
  21. package/dist/plugin/helpers/createCssProps.d.ts.map +1 -1
  22. package/dist/plugin/helpers/createCssProps.js +11 -32
  23. package/dist/plugin/helpers/createCssProps.js.map +1 -1
  24. package/dist/plugin/helpers/createRscStream.d.ts.map +1 -1
  25. package/dist/plugin/helpers/createRscStream.js +1 -0
  26. package/dist/plugin/helpers/createRscStream.js.map +1 -1
  27. package/dist/plugin/loader/createDefaultLoader.d.ts.map +1 -1
  28. package/dist/plugin/loader/createDefaultLoader.js +68 -4
  29. package/dist/plugin/loader/css-loader.development.d.ts +2 -15
  30. package/dist/plugin/loader/css-loader.development.d.ts.map +1 -1
  31. package/dist/plugin/loader/css-loader.development.js +16 -15
  32. package/dist/plugin/loader/css-loader.development.js.map +1 -1
  33. package/dist/plugin/loader/css-loader.production.d.ts +1 -1
  34. package/dist/plugin/loader/css-loader.production.d.ts.map +1 -1
  35. package/dist/plugin/loader/css-loader.production.js +1 -1
  36. package/dist/plugin/loader/css-loader.production.js.map +1 -1
  37. package/dist/plugin/loader/env-loader.development.d.ts +1 -0
  38. package/dist/plugin/loader/env-loader.development.d.ts.map +1 -1
  39. package/dist/plugin/loader/env-loader.development.js +17 -9
  40. package/dist/plugin/loader/handleExports.d.ts +1 -0
  41. package/dist/plugin/loader/handleExports.d.ts.map +1 -1
  42. package/dist/plugin/loader/handleExports.js +27 -8
  43. package/dist/plugin/loader/handleExports.js.map +1 -1
  44. package/dist/plugin/loader/react-loader.server.d.ts +2 -2
  45. package/dist/plugin/loader/react-loader.server.d.ts.map +1 -1
  46. package/dist/plugin/loader/react-loader.server.js +88 -26
  47. package/dist/plugin/loader/transformModuleIfNeeded.d.ts.map +1 -1
  48. package/dist/plugin/loader/transformModuleIfNeeded.js +1 -1
  49. package/dist/plugin/loader/transformModuleIfNeeded.js.map +1 -1
  50. package/dist/plugin/loader/transformModuleWithPreservedFunctions.d.ts.map +1 -1
  51. package/dist/plugin/loader/transformModuleWithPreservedFunctions.js +86 -13
  52. package/dist/plugin/loader/transformModuleWithPreservedFunctions.js.map +1 -1
  53. package/dist/plugin/plugin.client.d.ts.map +1 -1
  54. package/dist/plugin/plugin.client.js +0 -1
  55. package/dist/plugin/plugin.client.js.map +1 -1
  56. package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts.map +1 -1
  57. package/dist/plugin/react-client/configureWorkerRequestHandler.js +85 -6
  58. package/dist/plugin/react-client/configureWorkerRequestHandler.js.map +1 -1
  59. package/dist/plugin/react-client/createMessageHandlers.d.ts.map +1 -1
  60. package/dist/plugin/react-client/createMessageHandlers.js +3 -0
  61. package/dist/plugin/react-client/createMessageHandlers.js.map +1 -1
  62. package/dist/plugin/react-client/createWorkerStream.d.ts +2 -2
  63. package/dist/plugin/react-client/createWorkerStream.d.ts.map +1 -1
  64. package/dist/plugin/react-client/createWorkerStream.js +13 -2
  65. package/dist/plugin/react-client/createWorkerStream.js.map +1 -1
  66. package/dist/plugin/react-client/handleWorkerRscStream.d.ts.map +1 -1
  67. package/dist/plugin/react-client/handleWorkerRscStream.js +10 -3
  68. package/dist/plugin/react-client/handleWorkerRscStream.js.map +1 -1
  69. package/dist/plugin/react-client/restartWorker.d.ts.map +1 -1
  70. package/dist/plugin/react-client/restartWorker.js +2 -1
  71. package/dist/plugin/react-client/restartWorker.js.map +1 -1
  72. package/dist/plugin/react-server/configureReactServer.d.ts.map +1 -1
  73. package/dist/plugin/react-server/configureReactServer.js +1 -2
  74. package/dist/plugin/react-server/configureReactServer.js.map +1 -1
  75. package/dist/plugin/react-server/handleServerAction.d.ts.map +1 -1
  76. package/dist/plugin/react-server/handleServerAction.js +0 -16
  77. package/dist/plugin/react-server/handleServerAction.js.map +1 -1
  78. package/dist/plugin/react-static/createBuildLoader.d.ts.map +1 -0
  79. package/dist/plugin/react-static/createBuildLoader.js.map +1 -0
  80. package/dist/plugin/react-static/plugin.d.ts.map +1 -1
  81. package/dist/plugin/react-static/plugin.js +9 -12
  82. package/dist/plugin/react-static/plugin.js.map +1 -1
  83. package/dist/plugin/react-static/temporaryReferences.d.ts.map +1 -0
  84. package/dist/plugin/react-static/temporaryReferences.js.map +1 -0
  85. package/dist/plugin/transformer/plugin.server.js +2 -2
  86. package/dist/plugin/transformer/plugin.server.js.map +1 -1
  87. package/dist/plugin/types.d.ts +14 -3
  88. package/dist/plugin/types.d.ts.map +1 -1
  89. package/dist/plugin/worker/rsc/handleRender.d.ts.map +1 -1
  90. package/dist/plugin/worker/rsc/handleRender.js +1 -0
  91. package/dist/plugin/worker/rsc/handleRender.js.map +1 -1
  92. package/dist/plugin/worker/rsc/handlers.d.ts +3 -0
  93. package/dist/plugin/worker/rsc/handlers.d.ts.map +1 -0
  94. package/dist/plugin/worker/rsc/handlers.js +223 -0
  95. package/dist/plugin/worker/rsc/handlers.js.map +1 -0
  96. package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
  97. package/dist/plugin/worker/rsc/messageHandler.js +5 -110
  98. package/dist/plugin/worker/rsc/messageHandler.js.map +1 -1
  99. package/dist/plugin/worker/rsc/rsc-worker.development.js +13 -16
  100. package/dist/plugin/worker/rsc/rsc-worker.development.js.map +1 -1
  101. package/dist/plugin/worker/rsc/state.d.ts +1 -2
  102. package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
  103. package/dist/plugin/worker/rsc/state.js +1 -2
  104. package/dist/plugin/worker/rsc/state.js.map +1 -1
  105. package/dist/plugin/worker/rsc/userOptions.d.ts +2 -0
  106. package/dist/plugin/worker/rsc/userOptions.d.ts.map +1 -0
  107. package/dist/plugin/worker/rsc/userOptions.js +17 -0
  108. package/dist/plugin/worker/rsc/userOptions.js.map +1 -0
  109. package/dist/plugin/worker/types.d.ts +2 -1
  110. package/dist/plugin/worker/types.d.ts.map +1 -1
  111. package/dist/tsconfig.tsbuildinfo +1 -1
  112. package/package.json +5 -1
  113. package/plugin/config/defaults.tsx +5 -2
  114. package/plugin/config/resolveOptions.ts +101 -67
  115. package/plugin/error/toError.ts +0 -2
  116. package/plugin/helpers/collectManifestCss.ts +2 -6
  117. package/plugin/helpers/collectViteModuleGraphCss.ts +6 -0
  118. package/plugin/helpers/createCssProps.tsx +17 -46
  119. package/plugin/helpers/createRscStream.tsx +1 -0
  120. package/plugin/loader/createDefaultLoader.ts +80 -4
  121. package/plugin/loader/css-loader.development.ts +17 -34
  122. package/plugin/loader/css-loader.production.ts +2 -4
  123. package/plugin/loader/env-loader.development.ts +38 -15
  124. package/plugin/loader/handleExports.ts +36 -13
  125. package/plugin/loader/react-loader.server.ts +110 -32
  126. package/plugin/loader/transformModuleIfNeeded.ts +2 -2
  127. package/plugin/loader/transformModuleWithPreservedFunctions.ts +128 -21
  128. package/plugin/plugin.client.ts +0 -2
  129. package/plugin/react-client/configureWorkerRequestHandler.ts +107 -4
  130. package/plugin/react-client/createMessageHandlers.ts +3 -0
  131. package/plugin/react-client/createWorkerStream.ts +15 -1
  132. package/plugin/react-client/handleWorkerRscStream.ts +12 -3
  133. package/plugin/react-client/restartWorker.ts +1 -0
  134. package/plugin/react-server/configureReactServer.ts +1 -2
  135. package/plugin/react-server/handleServerAction.ts +1 -19
  136. package/plugin/react-static/plugin.ts +9 -12
  137. package/plugin/transformer/plugin.server.ts +2 -2
  138. package/plugin/types.ts +25 -2
  139. package/plugin/worker/rsc/handleRender.ts +1 -0
  140. package/plugin/worker/rsc/handlers.ts +243 -0
  141. package/plugin/worker/rsc/messageHandler.tsx +4 -118
  142. package/plugin/worker/rsc/rsc-worker.development.ts +17 -20
  143. package/plugin/worker/rsc/state.ts +2 -6
  144. package/plugin/worker/rsc/userOptions.ts +8 -0
  145. package/plugin/worker/types.ts +2 -0
  146. package/dist/plugin/loader/createBuildLoader.d.ts.map +0 -1
  147. package/dist/plugin/loader/createBuildLoader.js.map +0 -1
  148. package/dist/plugin/loader/plugin.d.ts +0 -22
  149. package/dist/plugin/loader/plugin.d.ts.map +0 -1
  150. package/dist/plugin/loader/plugin.js +0 -27
  151. package/dist/plugin/loader/temporaryReferences.d.ts.map +0 -1
  152. package/dist/plugin/loader/temporaryReferences.js.map +0 -1
  153. package/plugin/loader/plugin.ts +0 -33
  154. /package/dist/plugin/{loader → react-static}/createBuildLoader.d.ts +0 -0
  155. /package/dist/plugin/{loader → react-static}/createBuildLoader.js +0 -0
  156. /package/dist/plugin/{loader → react-static}/temporaryReferences.d.ts +0 -0
  157. /package/dist/plugin/{loader → react-static}/temporaryReferences.js +0 -0
  158. /package/plugin/{loader → react-static}/createBuildLoader.ts +0 -0
  159. /package/plugin/{loader → react-static}/temporaryReferences.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"transformModuleWithPreservedFunctions.js","sources":["../../../plugin/loader/transformModuleWithPreservedFunctions.ts"],"sourcesContent":["/**\n * # RSC Boundary Handling\n *\n * This file provides the core transformation logic for React Server Components (RSC) boundaries.\n *\n * - **Server Loader**: Always strips implementation for client modules, exports error-throwing references.\n * - **Client Loader**: Always strips implementation for server modules, exports error-throwing references.\n * - **Browser**: Only client modules are passed through as-is.\n *\n * All transformations are handled by `transformModuleWithPreservedFunctions` for consistency.\n *\n * ## Error Behavior\n *\n * - If a client component is imported on the server, the export is a function that throws a clear error.\n * - If a server action is imported on the client, the export is a function that throws a clear error.\n *\n * This ensures that implementation details are never leaked across boundaries and errors are easy to debug.\n */\nimport { handleExports } from \"./handleExports.js\";\nimport type { Program } from \"./types.js\";\n\nexport interface TransformOptions {\n id: string;\n exportNames: string[];\n beforeExports: string;\n afterExports: string;\n isServerModule?: boolean;\n isClientModule?: boolean;\n program?: Program;\n}\n\n/**\n * Creates a client reference error message\n */\nfunction createClientReferenceError(name: string): string {\n return `Attempted to call ${name}() from the server but ${name} is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;\n}\n\n/**\n * Transforms a module for RSC boundaries.\n * - Server modules: exports are wrapped with server references while preserving functionality.\n * - Client modules: exports are replaced with client references or errors, depending on environment.\n * - Only the correct references are exported; implementation is never leaked across boundaries.\n *\n * @param source - The original module source code.\n * @param moduleId - The module's unique identifier.\n * @param url - The module's URL.\n * @param program - The parsed AST.\n * @param map - The source map for the source code.\n * @param isServerFunction - Whether the module is a server function.\n * @param isClientComponent - Whether the module is a client component.\n * @returns The transformed source code.\n */\nexport function transformModuleWithPreservedFunctions(\n source: string,\n moduleId: string,\n program: Program,\n isServerFunction: boolean | RegExpMatchArray | null,\n isClientComponent: boolean | RegExpMatchArray | null,\n): string {\n\n // Get export names and create module ID literal\n const { exportNames, exports } = handleExports(source, program, isServerFunction, isClientComponent);\n const moduleIdLiteral = JSON.stringify(moduleId);\n\n // For server modules in server environment, register server references\n if (isServerFunction) {\n const imports = ['import { registerServerReference } from \"react-server-dom-esm/server.node\";'];\n const registrations: string[] = [];\n\n // Register each export\n for (const name of exportNames) {\n const exportInfo = exports.get(name);\n if (exportInfo) {\n // For default exports, use the localName if available\n const exportName = name === \"default\" && exportInfo.localName ? exportInfo.localName : name;\n // Register all exports in server modules\n registrations.push(\n `registerServerReference(${exportName}, ${moduleIdLiteral}, ${JSON.stringify(name)});`\n );\n }\n }\n\n // Create new source with registrations\n // First, add the imports at the top\n const newSource = [...imports, source].join(\"\\n\\n\");\n // Then, add the registrations at the end\n const finalSource = newSource + \"\\n\\n\" + registrations.join(\"\\n\");\n\n return finalSource;\n }\n\n // For client modules in server environment, register client references\n if (isClientComponent) {\n const imports = ['import { registerClientReference } from \"react-server-dom-esm/server.node\";'];\n const declarations: string[] = [];\n\n for (const name of exportNames) {\n const errorMessage = createClientReferenceError(name);\n if (name === \"default\") {\n declarations.push(`export default registerClientReference(function() {\n throw new Error(\"${errorMessage}\");\n}, ${moduleIdLiteral}, \"default\");`);\n } else {\n declarations.push(`export const ${name} = registerClientReference(function() {\n throw new Error(\"${errorMessage}\");\n}, ${moduleIdLiteral}, ${JSON.stringify(name)});`);\n }\n }\n\n // Create new source with declarations\n const newSource = [...imports, ...declarations].join(\"\\n\\n\");\n\n return newSource;\n }\n\n // For other cases, return original source\n return source;\n}\n"],"names":[],"mappings":";;;;;;;AAkCA,SAAS,2BAA2B,IAAsB,EAAA;AACxD,EAAO,OAAA,CAAA,kBAAA,EAAqB,IAAI,CAAA,uBAAA,EAA0B,IAAI,CAAA,kKAAA,CAAA;AAChE;AAiBO,SAAS,qCACd,CAAA,MAAA,EACA,QACA,EAAA,OAAA,EACA,kBACA,iBACQ,EAAA;AAGR,EAAM,MAAA,EAAE,aAAa,OAAQ,EAAA,GAAI,cAAc,MAAQ,EAAA,OAAA,EAAS,kBAAkB,iBAAiB,CAAA;AACnG,EAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA;AAG/C,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAM,MAAA,OAAA,GAAU,CAAC,6EAA6E,CAAA;AAC9F,IAAA,MAAM,gBAA0B,EAAC;AAGjC,IAAA,KAAA,MAAW,QAAQ,WAAa,EAAA;AAC9B,MAAM,MAAA,UAAA,GAAa,OAAQ,CAAA,GAAA,CAAI,IAAI,CAAA;AACnC,MAAA,IAAI,UAAY,EAAA;AAEd,QAAA,MAAM,aAAa,IAAS,KAAA,SAAA,IAAa,UAAW,CAAA,SAAA,GAAY,WAAW,SAAY,GAAA,IAAA;AAEvF,QAAc,aAAA,CAAA,IAAA;AAAA,UACZ,CAAA,wBAAA,EAA2B,UAAU,CAAK,EAAA,EAAA,eAAe,KAAK,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA,EAAA;AAAA,SACpF;AAAA;AACF;AAKF,IAAA,MAAM,YAAY,CAAC,GAAG,SAAS,MAAM,CAAA,CAAE,KAAK,MAAM,CAAA;AAElD,IAAA,MAAM,WAAc,GAAA,SAAA,GAAY,MAAS,GAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAEhE,IAAO,OAAA,WAAA;AAAA;AAIT,EAAA,IAAI,iBAAmB,EAAA;AACrB,IAAM,MAAA,OAAA,GAAU,CAAC,6EAA6E,CAAA;AAC9F,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,WAAa,EAAA;AAC9B,MAAM,MAAA,YAAA,GAAe,2BAA2B,IAAI,CAAA;AACpD,MAAA,IAAI,SAAS,SAAW,EAAA;AACtB,QAAA,YAAA,CAAa,IAAK,CAAA,CAAA;AAAA,mBAAA,EACL,YAAY,CAAA;AAAA,GAAA,EAC5B,eAAe,CAAe,aAAA,CAAA,CAAA;AAAA,OACtB,MAAA;AACL,QAAa,YAAA,CAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,mBAAA,EACzB,YAAY,CAAA;AAAA,GAAA,EAC5B,eAAe,CAAK,EAAA,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAI,EAAA,CAAA,CAAA;AAAA;AAC3C;AAIF,IAAM,MAAA,SAAA,GAAY,CAAC,GAAG,OAAA,EAAS,GAAG,YAAY,CAAA,CAAE,KAAK,MAAM,CAAA;AAE3D,IAAO,OAAA,SAAA;AAAA;AAIT,EAAO,OAAA,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"transformModuleWithPreservedFunctions.js","sources":["../../../plugin/loader/transformModuleWithPreservedFunctions.ts"],"sourcesContent":["/**\n * # RSC Boundary Handling\n *\n * This file provides the core transformation logic for React Server Components (RSC) boundaries.\n *\n * - **Server Loader**: Always strips implementation for client modules, exports error-throwing references.\n * - **Client Loader**: Always strips implementation for server modules, exports error-throwing references.\n * - **Browser**: Only client modules are passed through as-is.\n *\n * All transformations are handled by `transformModuleWithPreservedFunctions` for consistency.\n *\n * ## Error Behavior\n *\n * - If a client component is imported on the server, the export is a function that throws a clear error.\n * - If a server action is imported on the client, the export is a function that throws a clear error.\n *\n * This ensures that implementation details are never leaked across boundaries and errors are easy to debug.\n */\nimport { handleExports } from \"./handleExports.js\";\nimport type { Program } from \"./types.js\";\nimport createMappingsSerializer from \"webpack-sources/lib/helpers/createMappingsSerializer.js\";\n\nexport interface TransformOptions {\n id: string;\n exportNames: string[];\n beforeExports: string;\n afterExports: string;\n isServerModule?: boolean;\n isClientModule?: boolean;\n program?: Program;\n}\n\n/**\n * Creates a client reference error message\n */\nfunction createClientReferenceError(name: string): string {\n return `Attempted to call ${name}() from the server but ${name} is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.`;\n}\n\n/**\n * Transforms a module for RSC boundaries.\n * - Server modules: exports are wrapped with server references while preserving functionality.\n * - Client modules: exports are replaced with client references or errors, depending on environment.\n * - Only the correct references are exported; implementation is never leaked across boundaries.\n *\n * @param source - The original module source code.\n * @param moduleId - The module's unique identifier.\n * @param url - The module's URL.\n * @param program - The parsed AST.\n * @param map - The source map for the source code.\n * @param isServerFunction - Whether the module is a server function.\n * @param isClientComponent - Whether the module is a client component.\n * @returns The transformed source code.\n */\nexport function transformModuleWithPreservedFunctions(\n source: string,\n moduleId: string,\n program: Program,\n isServerFunction: boolean | RegExpMatchArray | null,\n isClientComponent: boolean | RegExpMatchArray | null\n): string {\n // Find and remove directives using AST\n let sourceWithoutDirective = source;\n let directiveEnd = 0;\n \n // Only look at top-level directives\n for (const node of program.body) {\n if (node.type !== \"ExpressionStatement\") {\n break;\n }\n\n let directive: string | null = null;\n if (\"directive\" in node && typeof node.directive === \"string\") {\n directive = node.directive;\n } else if (\n node.expression.type === \"Literal\" &&\n typeof node.expression.value === \"string\" &&\n (node.expression.value === \"use server\" || node.expression.value === \"use client\")\n ) {\n directive = node.expression.value;\n }\n\n if (directive && \"start\" in node && \"end\" in node) {\n directiveEnd = node.end;\n }\n }\n\n // Remove the directive and any whitespace after it\n if (directiveEnd > 0) {\n sourceWithoutDirective = source.slice(directiveEnd).trim();\n }\n\n // Get export names and create module ID literal\n const { exportNames, exports } = handleExports(\n sourceWithoutDirective,\n program,\n isServerFunction,\n isClientComponent\n );\n const moduleIdLiteral = JSON.stringify(moduleId);\n\n // For server modules in server environment, register server references\n if (Boolean(isServerFunction)) {\n const imports = [\n 'import { registerServerReference } from \"react-server-dom-esm/server.node\";',\n ];\n const registrations: string[] = [];\n\n // Register each export\n for (const name of exportNames) {\n const exportInfo = exports.get(name);\n if (exportInfo) {\n // For default exports, use the localName if available\n const exportName =\n name === \"default\" && exportInfo.localName\n ? exportInfo.localName\n : name;\n // Register all exports in server modules\n registrations.push(\n `registerServerReference(${exportName}, ${moduleIdLiteral}, ${JSON.stringify(\n name\n )});`\n );\n }\n }\n\n // Create new source with registrations\n // First, add the imports at the top\n const newSource = [...imports, sourceWithoutDirective, ...registrations].join(\"\\n\\n\");\n\n // Handle source maps\n let mappings = \"\";\n const createMapping = createMappingsSerializer();\n let generatedLine = 1;\n\n // Map the import line to the first line of the original source\n createMapping(generatedLine, 0, 0, 0, 0, -1);\n generatedLine++;\n\n // Map the registration lines to the first line of the original source\n for (let i = 0; i < registrations.length; i++) {\n createMapping(generatedLine, 0, 0, 1, 0, -1);\n generatedLine++;\n }\n\n // Map the original source lines, skipping the directive line\n const sourceLines = source.split(\"\\n\");\n for (let i = 0; i < sourceLines.length; i++) {\n createMapping(generatedLine, 0, 0, i + 1, 0, -1); // +1 because we skip directive line\n generatedLine++;\n }\n\n // Add source map to the output with original source content\n const sourceMap = {\n version: 3,\n file: moduleId,\n sources: [moduleId],\n sourcesContent: [newSource], // Use transformed source content\n mappings,\n sourceRoot: \"\",\n names: [],\n };\n\n return (\n newSource +\n \"\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,\" +\n Buffer.from(JSON.stringify(sourceMap)).toString(\"base64\")\n );\n // end of server module\n }\n if (!!isClientComponent) {\n // For client modules in server environment, register client references\n const imports = [\n 'import { registerClientReference } from \"react-server-dom-esm/server.node\";',\n ];\n const declarations: string[] = [];\n\n for (const name of exportNames) {\n const errorMessage = createClientReferenceError(name);\n if (name === \"default\") {\n declarations.push(`export default registerClientReference(function() {\nthrow new Error(\"${errorMessage}\");\n}, ${moduleIdLiteral}, \"default\");`);\n } else {\n declarations.push(`export const ${name} = registerClientReference(function() {\nthrow new Error(\"${errorMessage}\");\n}, ${moduleIdLiteral}, ${JSON.stringify(name)});`);\n }\n }\n // Create new source with declarations\n const newSource = [...imports, ...declarations].join(\"\\n\\n\");\n\n // Handle source maps for client modules\n let mappings = \"\";\n const createMapping = createMappingsSerializer();\n let generatedLine = 1;\n\n // Map the import line to the first line of the original source\n createMapping(generatedLine, 0, 0, 0, 0, -1);\n generatedLine++;\n\n // Map the declaration lines to the first line of the original source\n for (let i = 0; i < declarations.length; i++) {\n createMapping(generatedLine, 0, 0, 1, 0, -1);\n generatedLine++;\n }\n\n // Add source map to the output with original source content\n const sourceMap = {\n version: 3,\n file: moduleId,\n sources: [moduleId],\n sourcesContent: [newSource], // Use transformed source content\n mappings,\n sourceRoot: \"\",\n names: [],\n };\n\n return (\n newSource +\n \"\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,\" +\n Buffer.from(JSON.stringify(sourceMap)).toString(\"base64\")\n );\n }\n throw new Error(\"Invalid module type\");\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.client.d.ts","sourceRoot":"","sources":["../../plugin/plugin.client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACZ,MAAM,aAAa,CAAC;AAKrB,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,OAAO,GAAS,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,MAAM,EAAE,MAAM,EAAE,CAO5E"}
1
+ {"version":3,"file":"plugin.client.d.ts","sourceRoot":"","sources":["../../plugin/plugin.client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACZ,MAAM,aAAa,CAAC;AAIrB,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,OAAO,GAAS,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,MAAM,EAAE,MAAM,EAAE,CAM5E"}
@@ -10,7 +10,6 @@ import { envPlugin } from './env.js';
10
10
  function vitePluginReactServer(options = {}) {
11
11
  return [
12
12
  envPlugin(),
13
- //reactTransformPlugin(options),
14
13
  reactClientPlugin(options),
15
14
  reactPreservePlugin(options)
16
15
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.client.js","sources":["../../plugin/plugin.client.ts"],"sourcesContent":["import { reactPreservePlugin } from \"./preserver/plugin.js\";\nimport type {\n StreamPluginOptions,\n InlineCssOpt,\n PagePropOpt,\n} from \"../types.js\";\nimport { reactClientPlugin } from \"./react-client/plugin.js\";\nimport { envPlugin } from \"./env/plugin.js\";\n//import { reactTransformPlugin } from \"./transformer/plugin.client.js\";\n\nexport function vitePluginReactServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(options = {} as StreamPluginOptions<T, InlineCSS>): import(\"vite\").Plugin[] {\n return [\n envPlugin(),\n //reactTransformPlugin(options),\n reactClientPlugin(options),\n reactPreservePlugin(options),\n ];\n}\n"],"names":[],"mappings":";;;;;;;;;AAUO,SAAS,qBAAA,CAGd,OAAU,GAAA,EAAkE,EAAA;AAC5E,EAAO,OAAA;AAAA,IACL,SAAU,EAAA;AAAA;AAAA,IAEV,kBAAkB,OAAO,CAAA;AAAA,IACzB,oBAAoB,OAAO;AAAA,GAC7B;AACF;;;;"}
1
+ {"version":3,"file":"plugin.client.js","sources":["../../plugin/plugin.client.ts"],"sourcesContent":["import { reactPreservePlugin } from \"./preserver/plugin.js\";\nimport type {\n StreamPluginOptions,\n InlineCssOpt,\n PagePropOpt,\n} from \"../types.js\";\nimport { reactClientPlugin } from \"./react-client/plugin.js\";\nimport { envPlugin } from \"./env/plugin.js\";\n\nexport function vitePluginReactServer<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>(options = {} as StreamPluginOptions<T, InlineCSS>): import(\"vite\").Plugin[] {\n return [\n envPlugin(),\n reactClientPlugin(options),\n reactPreservePlugin(options),\n ];\n}\n"],"names":[],"mappings":";;;;;;;;;AASO,SAAS,qBAAA,CAGd,OAAU,GAAA,EAAkE,EAAA;AAC5E,EAAO,OAAA;AAAA,IACL,SAAU,EAAA;AAAA,IACV,kBAAkB,OAAO,CAAA;AAAA,IACzB,oBAAoB,OAAO;AAAA,GAC7B;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"configureWorkerRequestHandler.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/configureWorkerRequestHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,aAAa,EAEb,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAWlE;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,EACA,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,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/C,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C,iBAqLA"}
1
+ {"version":3,"file":"configureWorkerRequestHandler.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/configureWorkerRequestHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,aAAa,EAEb,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAe,MAAM,qBAAqB,CAAC;AAYlE;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,EACA,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,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/C,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C,iBA2RA"}
@@ -10,7 +10,7 @@ import { performance } from 'node:perf_hooks';
10
10
  import { restartWorker } from './restartWorker.js';
11
11
  import { handleWorkerRscStream } from './handleWorkerRscStream.js';
12
12
  import { getRouteFiles } from '../helpers/getRouteFiles.js';
13
- import { Readable } from 'node:stream';
13
+ import { PassThrough, Readable } from 'node:stream';
14
14
 
15
15
  async function configureWorkerRequestHandler({
16
16
  server,
@@ -28,7 +28,10 @@ async function configureWorkerRequestHandler({
28
28
  const handlerOptions = Object.assign({}, handlerUserOptions, {
29
29
  moduleBaseURL: server.config.base,
30
30
  moduleBasePath: server.config.base,
31
- projectRoot: server.config.root
31
+ projectRoot: server.config.root,
32
+ moduleID: (id) => {
33
+ return id;
34
+ }
32
35
  });
33
36
  let currentWorker = null;
34
37
  const logger = server.config.logger;
@@ -55,6 +58,86 @@ async function configureWorkerRequestHandler({
55
58
  const handler = async (req, res, next) => {
56
59
  if (!req.url) return next();
57
60
  const info = requestInfo(req, handlerOptions, "", server.config.logger);
61
+ const serializedUserOptions = serializedOptions(
62
+ handlerOptions,
63
+ autoDiscoveredFiles
64
+ );
65
+ if (info.isServerActionRequest) {
66
+ try {
67
+ const chunks = [];
68
+ for await (const chunk of req) {
69
+ chunks.push(chunk);
70
+ }
71
+ const body = Buffer.concat(chunks).toString();
72
+ const parsed = JSON.parse(body);
73
+ let id;
74
+ let args;
75
+ if (Array.isArray(parsed)) {
76
+ args = parsed;
77
+ id = req.url?.split("?")[0] ?? "";
78
+ } else if (parsed && typeof parsed === "object" && "id" in parsed) {
79
+ id = parsed.id;
80
+ args = parsed.args ?? [];
81
+ } else {
82
+ throw new Error("Invalid server action request format");
83
+ }
84
+ res.setHeader("Content-Type", "text/x-component; charset=utf-8");
85
+ res.setHeader("Transfer-Encoding", "chunked");
86
+ res.setHeader("Connection", "keep-alive");
87
+ if (!currentWorker) {
88
+ currentWorker = await restartWorker({
89
+ server,
90
+ autoDiscoveredFiles,
91
+ userOptions: serializedUserOptions,
92
+ hmrChannel
93
+ });
94
+ }
95
+ currentWorker.postMessage({
96
+ type: "SERVER_ACTION",
97
+ id,
98
+ args
99
+ });
100
+ const passThrough = new PassThrough();
101
+ passThrough.pipe(res);
102
+ const messageHandler = (message) => {
103
+ if (message.type === "RSC_CHUNK") {
104
+ passThrough.write(message.chunk);
105
+ } else if (message.type === "RSC_END") {
106
+ passThrough.end();
107
+ currentWorker.removeListener("message", messageHandler);
108
+ } else if (message.type === "ERROR") {
109
+ passThrough.end();
110
+ currentWorker.removeListener("message", messageHandler);
111
+ server.config.logger.error(message.error.message + (message.error.stack ?? ""), {
112
+ error: message.error
113
+ });
114
+ }
115
+ };
116
+ currentWorker.on("message", messageHandler);
117
+ passThrough.on("error", (error) => {
118
+ server.config.logger.error(error.message + (error.stack ?? ""), {
119
+ error
120
+ });
121
+ res.end();
122
+ });
123
+ return;
124
+ } catch (error) {
125
+ if (error instanceof Error) {
126
+ server.config.logger.error(error.message + (error.stack ?? ""), {
127
+ error
128
+ });
129
+ }
130
+ res.statusCode = 500;
131
+ res.end(JSON.stringify({
132
+ type: "server-action-response",
133
+ returnValue: {
134
+ success: false,
135
+ error: error instanceof Error ? error.message : String(error)
136
+ }
137
+ }));
138
+ return;
139
+ }
140
+ }
58
141
  if (!info.isRscRequest) {
59
142
  return next();
60
143
  }
@@ -73,10 +156,6 @@ async function configureWorkerRequestHandler({
73
156
  res.setHeader("Content-Type", info.contentType);
74
157
  res.setHeader("Transfer-Encoding", "chunked");
75
158
  res.setHeader("Connection", "keep-alive");
76
- const serializedUserOptions = serializedOptions(
77
- handlerOptions,
78
- autoDiscoveredFiles
79
- );
80
159
  const userOnMetrics = typeof onMetrics === "function" ? (metrics) => {
81
160
  const elapsedTime = performance.now() - startTime;
82
161
  const formattedMetrics = {
@@ -1 +1 @@
1
- {"version":3,"file":"configureWorkerRequestHandler.js","sources":["../../../plugin/react-client/configureWorkerRequestHandler.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n RenderMetrics,\n RequestHandler,\n ResolvedUserOptions,\n StreamMetrics,\n} from \"../types.js\";\nimport { MessageChannel, type Worker } from \"node:worker_threads\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { restartWorker } from \"./restartWorker.js\";\nimport { handleWorkerRscStream } from \"./handleWorkerRscStream.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport type { RscWorkerInputMessage } from \"../worker/types.js\";\nimport { Readable } from \"node:stream\";\nimport type { ReadableStream } from \"node:stream/web\";\n\n/**\n * Configures the worker request handler.\n * @param server - The Vite dev server\n * @param autoDiscoveredFiles - The auto discovered files\n * @param userOptions - The user options\n */\nexport async function configureWorkerRequestHandler<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n onMetrics,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n hmrChannel: MessageChannel;\n onMetrics?: (metrics: RenderMetrics) => void;\n}) {\n let {\n // remove these\n projectRoot: _projectRoot,\n moduleBaseURL: _moduleBaseURL,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n });\n\n // Start the worker\n let currentWorker: Worker | null = null;\n const logger = server.config.logger;\n\n // Handle server restarts\n server.ws.on(\"restart\", async () => {\n logger.info(\"[react-client] Server restarting, shutting down worker...\");\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Did not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n currentWorker = null;\n }\n });\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url) return next();\n\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n if (!info.isRscRequest) {\n return next();\n }\n\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n try {\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", info.contentType);\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n const serializedUserOptions = serializedOptions<T, InlineCSS>(\n handlerOptions,\n autoDiscoveredFiles\n );\n const userOnMetrics =\n typeof onMetrics === \"function\"\n ? (metrics: StreamMetrics) => {\n const elapsedTime = performance.now() - startTime;\n const formattedMetrics = {\n route: info.route,\n htmlSize: 0,\n rscSize: metrics.bytes,\n processingTime: elapsedTime,\n chunks: metrics.chunks,\n chunkRate: metrics.chunks / (elapsedTime / 1000),\n memoryUsage: process.memoryUsage(),\n streamMetrics: {\n ...metrics,\n duration: elapsedTime,\n },\n htmlSizes: new Map(),\n rscSizes: new Map([[info.route, metrics.bytes]]),\n } satisfies RenderMetrics;\n onMetrics(formattedMetrics);\n }\n : () => {};\n const startTime = performance.now();\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n const stream = handleWorkerRscStream({\n worker: currentWorker!,\n message: {\n ...serializedUserOptions,\n id: info.route,\n type: \"RSC_RENDER\",\n // we make the worker stream aware of the route, pagePath, propsPath\n route: info.route,\n pagePath: pagePath,\n propsPath: propsPath,\n // override these at all times to ensure the settings will work for the dev server\n projectRoot: server.config.root,\n build: serializedUserOptions.build,\n manifest: autoDiscoveredFiles.staticManifest,\n cssFiles: new Map(),\n globalCss: new Map(),\n },\n logger,\n handlers: {\n onMetrics: (id, metrics) => {\n metrics.route = id;\n userOnMetrics(metrics);\n },\n onHmrAccept: () => {\n // TODO: implement\n // console.log(\"onHmrAccept\", routes);\n },\n onHmrUpdate: () => {\n // TODO: implement\n // console.log(\"onHmrUpdate\", routes);\n },\n },\n verbose: handlerOptions.verbose,\n });\n\n // Pipe the stream to the response\n if (res.writable) {\n Readable.fromWeb(stream as unknown as ReadableStream).pipe(res);\n }\n // wait for timeout\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message + (error.stack ?? \"\"), {\n error,\n });\n }\n }\n let timeout: NodeJS.Timeout;\n try {\n await new Promise((reject) => {\n timeout = setTimeout(() => {\n clearTimeout(timeout);\n reject(new Error(\"RSC Render timeout\"));\n }, 5000);\n });\n } catch {\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Dit not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n }\n server.config.logger.error(\"RSC render timeout.\");\n clearTimeout(timeout!);\n res.end();\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // done\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configureWorkerRequestHandler.js","sources":["../../../plugin/react-client/configureWorkerRequestHandler.ts"],"sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type {\n AutoDiscoveredFiles,\n InlineCssOpt,\n PagePropOpt,\n RenderMetrics,\n RequestHandler,\n ResolvedUserOptions,\n StreamMetrics,\n} from \"../types.js\";\nimport { MessageChannel, type Worker } from \"node:worker_threads\";\nimport { serializedOptions } from \"../helpers/serializeUserOptions.js\";\nimport { requestInfo } from \"../helpers/requestInfo.js\";\nimport { performance } from \"node:perf_hooks\";\nimport { restartWorker } from \"./restartWorker.js\";\nimport { handleWorkerRscStream } from \"./handleWorkerRscStream.js\";\nimport { getRouteFiles } from \"../helpers/getRouteFiles.js\";\nimport type { RscWorkerInputMessage } from \"../worker/types.js\";\nimport { Readable } from \"node:stream\";\nimport type { ReadableStream } from \"node:stream/web\";\nimport { PassThrough } from \"node:stream\";\n\n/**\n * Configures the worker request handler.\n * @param server - The Vite dev server\n * @param autoDiscoveredFiles - The auto discovered files\n * @param userOptions - The user options\n */\nexport async function configureWorkerRequestHandler<\n T extends PagePropOpt = PagePropOpt,\n InlineCSS extends InlineCssOpt = InlineCssOpt\n>({\n server,\n autoDiscoveredFiles,\n userOptions: _userOptions,\n hmrChannel,\n onMetrics,\n}: {\n server: ViteDevServer;\n autoDiscoveredFiles: AutoDiscoveredFiles;\n userOptions: ResolvedUserOptions<T, InlineCSS>;\n hmrChannel: MessageChannel;\n onMetrics?: (metrics: RenderMetrics) => void;\n}) {\n let {\n // remove these\n projectRoot: _projectRoot,\n moduleBaseURL: _moduleBaseURL,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = Object.assign({}, handlerUserOptions, {\n moduleBaseURL: server.config.base,\n moduleBasePath: server.config.base,\n projectRoot: server.config.root,\n moduleID: (id: string) => {\n return id\n }\n });\n\n // Start the worker\n let currentWorker: Worker | null = null;\n const logger = server.config.logger;\n\n // Handle server restarts\n server.ws.on(\"restart\", async () => {\n logger.info(\"[react-client] Server restarting, shutting down worker...\");\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Did not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n currentWorker = null;\n }\n });\n\n // Create the request handler\n const handler: RequestHandler = async (req, res, next) => {\n if (!req.url) return next();\n\n const info = requestInfo(req, handlerOptions, \"\", server.config.logger);\n\n // Serialize user options for worker\n const serializedUserOptions = serializedOptions<T, InlineCSS>(\n handlerOptions,\n autoDiscoveredFiles\n );\n\n // Handle server action requests\n if (info.isServerActionRequest) {\n try {\n // Read request body\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk);\n }\n const body = Buffer.concat(chunks).toString();\n const parsed = JSON.parse(body);\n \n // Get action ID and args from the request body\n let id: string;\n let args: unknown[];\n if (Array.isArray(parsed)) {\n // Format 1: Direct args array\n args = parsed;\n id = req.url?.split(\"?\")[0] ?? \"\";\n } else if (parsed && typeof parsed === \"object\" && \"id\" in parsed) {\n // Format 2: Object with id and args\n id = parsed.id;\n args = parsed.args ?? [];\n } else {\n throw new Error(\"Invalid server action request format\");\n }\n\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", \"text/x-component; charset=utf-8\");\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n\n // Send server action request to worker\n currentWorker!.postMessage({\n type: \"SERVER_ACTION\",\n id,\n args,\n } satisfies RscWorkerInputMessage);\n\n // Create a pass-through stream for the response\n const passThrough = new PassThrough();\n passThrough.pipe(res);\n\n // Handle worker messages\n const messageHandler = (message: any) => {\n if (message.type === \"RSC_CHUNK\") {\n passThrough.write(message.chunk);\n } else if (message.type === \"RSC_END\") {\n passThrough.end();\n currentWorker!.removeListener(\"message\", messageHandler);\n } else if (message.type === \"ERROR\") {\n passThrough.end();\n currentWorker!.removeListener(\"message\", messageHandler);\n server.config.logger.error(message.error.message + (message.error.stack ?? \"\"), {\n error: message.error,\n });\n }\n };\n\n currentWorker!.on(\"message\", messageHandler);\n\n // Handle errors\n passThrough.on(\"error\", (error) => {\n server.config.logger.error(error.message + (error.stack ?? \"\"), {\n error,\n });\n res.end();\n });\n\n return;\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message + (error.stack ?? \"\"), {\n error,\n });\n }\n res.statusCode = 500;\n res.end(JSON.stringify({\n type: \"server-action-response\",\n returnValue: {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }));\n return;\n }\n }\n\n // Handle RSC requests\n if (!info.isRscRequest) {\n return next();\n }\n\n const routeFiles = await getRouteFiles(\n info.route,\n autoDiscoveredFiles,\n handlerOptions\n );\n if (routeFiles.type === \"error\") {\n logger.error(routeFiles.error.message);\n return next();\n }\n const pagePath = routeFiles.page;\n const propsPath = routeFiles.props;\n try {\n // Set up response headers for streaming\n res.setHeader(\"Content-Type\", info.contentType);\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n const userOnMetrics =\n typeof onMetrics === \"function\"\n ? (metrics: StreamMetrics) => {\n const elapsedTime = performance.now() - startTime;\n const formattedMetrics = {\n route: info.route,\n htmlSize: 0,\n rscSize: metrics.bytes,\n processingTime: elapsedTime,\n chunks: metrics.chunks,\n chunkRate: metrics.chunks / (elapsedTime / 1000),\n memoryUsage: process.memoryUsage(),\n streamMetrics: {\n ...metrics,\n duration: elapsedTime,\n },\n htmlSizes: new Map(),\n rscSizes: new Map([[info.route, metrics.bytes]]),\n } satisfies RenderMetrics;\n onMetrics(formattedMetrics);\n }\n : () => {};\n const startTime = performance.now();\n if (!currentWorker) {\n currentWorker = await restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions: serializedUserOptions,\n hmrChannel,\n });\n }\n const stream = handleWorkerRscStream({\n worker: currentWorker!,\n message: {\n ...serializedUserOptions,\n id: info.route,\n type: \"RSC_RENDER\",\n // we make the worker stream aware of the route, pagePath, propsPath\n route: info.route,\n pagePath: pagePath,\n propsPath: propsPath,\n // override these at all times to ensure the settings will work for the dev server\n projectRoot: server.config.root,\n build: serializedUserOptions.build,\n manifest: autoDiscoveredFiles.staticManifest,\n cssFiles: new Map(),\n globalCss: new Map(),\n },\n logger,\n handlers: {\n onMetrics: (id, metrics) => {\n metrics.route = id;\n userOnMetrics(metrics);\n },\n onHmrAccept: () => {\n // TODO: implement\n // console.log(\"onHmrAccept\", routes);\n },\n onHmrUpdate: () => {\n // TODO: implement\n // console.log(\"onHmrUpdate\", routes);\n },\n },\n verbose: handlerOptions.verbose,\n });\n\n // Pipe the stream to the response\n if (res.writable) {\n Readable.fromWeb(stream as unknown as ReadableStream).pipe(res);\n }\n // wait for timeout\n } catch (error) {\n if (error instanceof Error) {\n server.config.logger.error(error.message + (error.stack ?? \"\"), {\n error,\n });\n }\n }\n let timeout: NodeJS.Timeout;\n try {\n await new Promise((reject) => {\n timeout = setTimeout(() => {\n clearTimeout(timeout);\n reject(new Error(\"RSC Render timeout\"));\n }, 5000);\n });\n } catch {\n if (currentWorker) {\n currentWorker.postMessage({\n type: \"SHUTDOWN\",\n id: \"*\",\n } satisfies RscWorkerInputMessage);\n await new Promise((resolve, reject) => {\n currentWorker?.on(\"message\", (message) => {\n if (message.type === \"SHUTDOWN_COMPLETE\") {\n resolve(true);\n } else {\n reject(\"Dit not receive SHUTDOWN_COMPLETE\");\n }\n });\n });\n currentWorker.removeAllListeners();\n }\n server.config.logger.error(\"RSC render timeout.\");\n clearTimeout(timeout!);\n res.end();\n }\n };\n // attach handler to the server\n server.middlewares.use(handler);\n // done\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createMessageHandlers.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/createMessageHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,EACN,OAAe,GAChB,EAAE,qBAAqB,aACL,sBAAsB,GAAG,SAAS,UAyCpD"}
1
+ {"version":3,"file":"createMessageHandlers.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/createMessageHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,EACN,OAAe,GAChB,EAAE,qBAAqB,aACL,sBAAsB,GAAG,SAAS,UA4CpD"}
@@ -44,6 +44,9 @@ function createMessageHandler({
44
44
  case "SERVER_MODULE":
45
45
  handlers.onServerModule?.(message.id, message.url, message.source);
46
46
  break;
47
+ case "CSS_FILE":
48
+ handlers.onCssFile?.(message.id, message.content);
49
+ break;
47
50
  default:
48
51
  logger.warn(`Unknown worker output message type: ${message.type}`);
49
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createMessageHandlers.js","sources":["../../../plugin/react-client/createMessageHandlers.ts"],"sourcesContent":["import type { RscWorkerOutputMessage } from \"../worker/types.js\";\nimport type { Logger } from \"vite\";\nimport type { StreamHandlers } from \"../worker/types.js\";\n\ntype MessageHandlerContext = {\n handlers: StreamHandlers;\n logger: Logger;\n verbose?: boolean;\n};\n\nexport function createMessageHandler({\n handlers,\n logger,\n verbose = false,\n}: MessageHandlerContext) {\n return (message: RscWorkerOutputMessage | undefined) => {\n if (!message) {\n logger.warn(\"Received undefined message\");\n return;\n }\n\n switch (message.type) {\n case \"READY\":\n if(verbose) logger.info(\"[react-client] Worker is ready\");\n break;\n case \"ERROR\":\n handlers.onError(message.id, message.error, message.errorInfo);\n break;\n case \"RSC_CHUNK\":\n handlers.onData(message.id, message.chunk);\n break;\n case \"RSC_END\":\n handlers.onEnd(message.id);\n break;\n case \"RSC_METRICS\":\n handlers.onMetrics(message.id, message.metrics);\n break;\n case \"HMR_ACCEPT\":\n handlers.onHmrAccept(message.id, message.routes);\n break;\n case \"HMR_UPDATE\":\n handlers.onHmrUpdate(message.id, message.routes);\n break;\n case \"SERVER_ACTION\":\n handlers.onServerAction?.(message.id, message.args);\n break;\n case \"SERVER_ACTION_RESPONSE\":\n handlers.onServerActionResponse?.(message.id, message.result, message.error);\n break;\n case \"SERVER_MODULE\":\n handlers.onServerModule?.(message.id, message.url, message.source);\n break;\n default:\n logger.warn(`Unknown worker output message type: ${(message as { type: string }).type}`);\n }\n };\n}\n"],"names":[],"mappings":";;;;;AAUO,SAAS,oBAAqB,CAAA;AAAA,EACnC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAU,GAAA;AACZ,CAA0B,EAAA;AACxB,EAAA,OAAO,CAAC,OAAgD,KAAA;AACtD,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,MAAA,CAAO,KAAK,4BAA4B,CAAA;AACxC,MAAA;AAAA;AAGF,IAAA,QAAQ,QAAQ,IAAM;AAAA,MACpB,KAAK,OAAA;AACH,QAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,gCAAgC,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,QAAA,CAAS,QAAQ,OAAQ,CAAA,EAAA,EAAI,OAAQ,CAAA,KAAA,EAAO,QAAQ,SAAS,CAAA;AAC7D,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,QAAA,CAAS,MAAO,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,KAAK,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAS,QAAA,CAAA,KAAA,CAAM,QAAQ,EAAE,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,QAAA,CAAS,SAAU,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,WAAY,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,WAAY,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,QAAA,CAAS,cAAiB,GAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,IAAI,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,wBAAA;AACH,QAAA,QAAA,CAAS,yBAAyB,OAAQ,CAAA,EAAA,EAAI,OAAQ,CAAA,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC3E,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,QAAA,CAAS,iBAAiB,OAAQ,CAAA,EAAA,EAAI,OAAQ,CAAA,GAAA,EAAK,QAAQ,MAAM,CAAA;AACjE,QAAA;AAAA,MACF;AACE,QAAA,MAAA,CAAO,IAAK,CAAA,CAAA,oCAAA,EAAwC,OAA6B,CAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAC3F,GACF;AACF;;;;"}
1
+ {"version":3,"file":"createMessageHandlers.js","sources":["../../../plugin/react-client/createMessageHandlers.ts"],"sourcesContent":["import type { RscWorkerOutputMessage } from \"../worker/types.js\";\nimport type { Logger } from \"vite\";\nimport type { StreamHandlers } from \"../worker/types.js\";\n\ntype MessageHandlerContext = {\n handlers: StreamHandlers;\n logger: Logger;\n verbose?: boolean;\n};\n\nexport function createMessageHandler({\n handlers,\n logger,\n verbose = false,\n}: MessageHandlerContext) {\n return (message: RscWorkerOutputMessage | undefined) => {\n if (!message) {\n logger.warn(\"Received undefined message\");\n return;\n }\n\n switch (message.type) {\n case \"READY\":\n if(verbose) logger.info(\"[react-client] Worker is ready\");\n break;\n case \"ERROR\":\n handlers.onError(message.id, message.error, message.errorInfo);\n break;\n case \"RSC_CHUNK\":\n handlers.onData(message.id, message.chunk);\n break;\n case \"RSC_END\":\n handlers.onEnd(message.id);\n break;\n case \"RSC_METRICS\":\n handlers.onMetrics(message.id, message.metrics);\n break;\n case \"HMR_ACCEPT\":\n handlers.onHmrAccept(message.id, message.routes);\n break;\n case \"HMR_UPDATE\":\n handlers.onHmrUpdate(message.id, message.routes);\n break;\n case \"SERVER_ACTION\":\n handlers.onServerAction?.(message.id, message.args);\n break;\n case \"SERVER_ACTION_RESPONSE\":\n handlers.onServerActionResponse?.(message.id, message.result, message.error);\n break;\n case \"SERVER_MODULE\":\n handlers.onServerModule?.(message.id, message.url, message.source);\n break;\n case \"CSS_FILE\":\n handlers.onCssFile?.(message.id, message.content);\n break;\n default:\n logger.warn(`Unknown worker output message type: ${(message as { type: string }).type}`);\n }\n };\n}\n"],"names":[],"mappings":";;;;;AAUO,SAAS,oBAAqB,CAAA;AAAA,EACnC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAU,GAAA;AACZ,CAA0B,EAAA;AACxB,EAAA,OAAO,CAAC,OAAgD,KAAA;AACtD,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,MAAA,CAAO,KAAK,4BAA4B,CAAA;AACxC,MAAA;AAAA;AAGF,IAAA,QAAQ,QAAQ,IAAM;AAAA,MACpB,KAAK,OAAA;AACH,QAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,gCAAgC,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,QAAA,CAAS,QAAQ,OAAQ,CAAA,EAAA,EAAI,OAAQ,CAAA,KAAA,EAAO,QAAQ,SAAS,CAAA;AAC7D,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,QAAA,CAAS,MAAO,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,KAAK,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAS,QAAA,CAAA,KAAA,CAAM,QAAQ,EAAE,CAAA;AACzB,QAAA;AAAA,MACF,KAAK,aAAA;AACH,QAAA,QAAA,CAAS,SAAU,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,WAAY,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,WAAY,CAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,QAAA,CAAS,cAAiB,GAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,IAAI,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,wBAAA;AACH,QAAA,QAAA,CAAS,yBAAyB,OAAQ,CAAA,EAAA,EAAI,OAAQ,CAAA,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC3E,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,QAAA,CAAS,iBAAiB,OAAQ,CAAA,EAAA,EAAI,OAAQ,CAAA,GAAA,EAAK,QAAQ,MAAM,CAAA;AACjE,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,QAAA,CAAS,SAAY,GAAA,OAAA,CAAQ,EAAI,EAAA,OAAA,CAAQ,OAAO,CAAA;AAChD,QAAA;AAAA,MACF;AACE,QAAA,MAAA,CAAO,IAAK,CAAA,CAAA,oCAAA,EAAwC,OAA6B,CAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAC3F,GACF;AACF;;;;"}
@@ -12,13 +12,13 @@ import type { StreamHandlers } from "../worker/types.js";
12
12
  * @param rscWorkerLoaderPort - Optional loader port for module loading
13
13
  * @returns An async generator that yields RSC chunks
14
14
  */
15
- export declare function createWorkerStream({ worker, message, logger, handlers: { onHmrAccept, onHmrUpdate, onMetrics, onError, onData, onEnd, onServerAction, onServerActionResponse, }, verbose, }: {
15
+ export declare function createWorkerStream({ worker, message, logger, handlers: { onHmrAccept, onHmrUpdate, onMetrics, onError, onData, onEnd, onServerAction, onServerActionResponse, onCssFile, }, verbose, }: {
16
16
  worker: NodeWorker;
17
17
  message: Omit<RscRenderMessage, "type" | "id"> & Partial<Pick<RscRenderMessage, "id">> & {
18
18
  type?: "RSC_RENDER";
19
19
  };
20
20
  logger: Logger;
21
- handlers: Pick<StreamHandlers, "onHmrAccept" | "onHmrUpdate" | "onMetrics"> & Partial<Pick<StreamHandlers, "onError" | "onData" | "onEnd" | "onServerAction" | "onServerActionResponse">>;
21
+ handlers: Pick<StreamHandlers, "onHmrAccept" | "onHmrUpdate" | "onMetrics"> & Partial<Pick<StreamHandlers, "onError" | "onData" | "onEnd" | "onServerAction" | "onServerActionResponse" | "onCssFile">>;
22
22
  verbose?: boolean;
23
23
  }): AsyncGenerator<Uint8Array>;
24
24
  //# sourceMappingURL=createWorkerStream.d.ts.map
@@ -1 +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,EAEV,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD;;;;;;;;;GASG;AACH,wBAAuB,kBAAkB,CAAC,EACxC,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EAAE,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,KAAK,EACL,cAAc,EACd,sBAAsB,GACvB,EACD,OAAe,GAChB,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,aAAa,GAAG,WAAW,CAAC,GACzE,OAAO,CACL,IAAI,CACF,cAAc,EACZ,SAAS,GACT,QAAQ,GACR,OAAO,GACP,gBAAgB,GAChB,wBAAwB,CAC3B,CACF,CAAC;IACJ,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,cAAc,CAAC,UAAU,CAAC,CA0I7B"}
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,EAEV,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD;;;;;;;;;GASG;AACH,wBAAuB,kBAAkB,CAAC,EACxC,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EAAE,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,SAAS,GACV,EACD,OAAe,GAChB,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,aAAa,GAAG,WAAW,CAAC,GACzE,OAAO,CACL,IAAI,CACF,cAAc,EACZ,SAAS,GACT,QAAQ,GACR,OAAO,GACP,gBAAgB,GAChB,wBAAwB,GACxB,WAAW,CACd,CACF,CAAC;IACJ,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,cAAc,CAAC,UAAU,CAAC,CAsJ7B"}
@@ -18,7 +18,8 @@ async function* createWorkerStream({
18
18
  onData,
19
19
  onEnd,
20
20
  onServerAction,
21
- onServerActionResponse
21
+ onServerActionResponse,
22
+ onCssFile
22
23
  },
23
24
  verbose = false
24
25
  }) {
@@ -80,6 +81,12 @@ async function* createWorkerStream({
80
81
  onHmrUpdate(id, routes);
81
82
  }
82
83
  },
84
+ onCssFile: (id, code) => {
85
+ if (verbose) logger.info(`[react-client] received css file ${id}`);
86
+ if (typeof onCssFile === "function") {
87
+ onCssFile(id, code);
88
+ }
89
+ },
83
90
  onServerAction: (id, args) => {
84
91
  if (verbose) logger.info(`[react-client] received server action ${id}`);
85
92
  if (typeof onServerAction === "function") {
@@ -90,7 +97,11 @@ async function* createWorkerStream({
90
97
  if (verbose)
91
98
  logger.info(`[react-client] received server action response ${id}`);
92
99
  if (typeof onServerActionResponse === "function") {
93
- onServerActionResponse(id, result, error);
100
+ const response = {
101
+ type: "server-action-response",
102
+ returnValue: error ? { success: false, error } : result
103
+ };
104
+ onServerActionResponse(id, response);
94
105
  }
95
106
  }
96
107
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createWorkerStream.js","sources":["../../../plugin/react-client/createWorkerStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type {\n RscWorkerOutputMessage,\n RscRenderMessage,\n} from \"../worker/types.js\";\nimport type { StreamMetrics } from \"../types.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport type { StreamHandlers } from \"../worker/types.js\";\nimport { createMessageHandler } from \"./createMessageHandlers.js\";\nimport { logError } from \"../error/toError.js\";\n\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,\n message,\n logger,\n handlers: {\n onHmrAccept,\n onHmrUpdate,\n onMetrics,\n onError,\n onData,\n onEnd,\n onServerAction,\n onServerActionResponse,\n },\n verbose = false,\n}: {\n worker: NodeWorker;\n message: Omit<RscRenderMessage, \"type\" | \"id\"> &\n Partial<Pick<RscRenderMessage, \"id\">> & { type?: \"RSC_RENDER\" };\n logger: Logger;\n handlers: Pick<StreamHandlers, \"onHmrAccept\" | \"onHmrUpdate\" | \"onMetrics\"> &\n Partial<\n Pick<\n StreamHandlers,\n | \"onError\"\n | \"onData\"\n | \"onEnd\"\n | \"onServerAction\"\n | \"onServerActionResponse\"\n >\n >;\n verbose?: boolean;\n}): AsyncGenerator<Uint8Array> {\n if (!worker) {\n throw new Error(\"Worker is not running\");\n }\n let messageHandler:\n | ((message: RscWorkerOutputMessage | undefined) => void)\n | null = null;\n let currentResolve: ((chunk: Uint8Array) => void) | null = null;\n const handlers: StreamHandlers = {\n onError: (id, error, errorInfo) => {\n logError(error, logger);\n if (errorInfo) {\n logError(errorInfo.componentStack, logger);\n }\n if (typeof onError === \"function\") {\n onError(id, error, errorInfo);\n }\n },\n onData: (id: string, chunk: Uint8Array) => {\n currentResolve?.(chunk);\n if (verbose) {\n logger.info(\n `[react-client] received chunk ${id} ${\n Buffer.from(chunk).byteLength\n } bytes`\n );\n }\n if (typeof onData === \"function\") {\n onData(id, chunk);\n }\n },\n onEnd: (id: string) => {\n currentResolve?.(new Uint8Array());\n if (verbose) logger.info(`[react-client] received end`);\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n if (typeof onEnd === \"function\") {\n onEnd(id);\n }\n },\n onMetrics: (id: string, metrics: StreamMetrics) => {\n if (verbose)\n logger.info(`[react-client] received chunks ${metrics.chunks}`);\n if (typeof onMetrics === \"function\") {\n onMetrics(id, metrics);\n }\n },\n onHmrAccept: (id: string, routes?: string[]) => {\n if (verbose)\n logger.info(`[react-client] received hmr accept ${routes?.join(\", \")}`);\n if (typeof onHmrAccept === \"function\") {\n onHmrAccept(id, routes);\n }\n },\n onHmrUpdate: (id: string, routes?: string[]) => {\n if (verbose)\n logger.info(`[react-client] received hmr update ${routes?.join(\", \")}`);\n if (typeof onHmrUpdate === \"function\") {\n onHmrUpdate(id, routes);\n }\n },\n onServerAction: (id: string, args: unknown[]) => {\n if (verbose) logger.info(`[react-client] received server action ${id}`);\n if (typeof onServerAction === \"function\") {\n onServerAction(id, args);\n }\n },\n onServerActionResponse: (id: string, result?: unknown, error?: string) => {\n if (verbose)\n logger.info(`[react-client] received server action response ${id}`);\n if (typeof onServerActionResponse === \"function\") {\n onServerActionResponse(id, result, error);\n }\n },\n };\n\n try {\n // Remove any existing message handler before starting\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n if (verbose) logger.info(`[react-client] sending message RSC_RENDER`);\n worker.postMessage({\n ...message,\n type: \"RSC_RENDER\",\n id: message?.id ?? message.route,\n });\n\n if (verbose) logger.info(`[react-client] waiting for message handler`);\n let workerTimeout: NodeJS.Timeout | null = null;\n yield await new Promise<Uint8Array>((resolve) => {\n workerTimeout = setTimeout(() => {\n if (verbose) logger.info(`worker timeout`);\n worker.terminate();\n }, 5000);\n currentResolve = resolve;\n messageHandler = createMessageHandler({\n handlers,\n logger,\n verbose,\n });\n worker.on(\"message\", messageHandler);\n });\n if (workerTimeout) {\n clearTimeout(workerTimeout);\n }\n if (verbose) logger.info(`[react-client] received message handler`);\n while (true) {\n const chunk = await new Promise<Uint8Array>((resolve) => {\n currentResolve = resolve;\n // Create new message handler for each iteration\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n }\n messageHandler = createMessageHandler({\n handlers,\n logger,\n verbose,\n });\n worker.on(\"message\", messageHandler);\n });\n\n if (chunk.length === 0) {\n break;\n }\n\n yield chunk;\n }\n } finally {\n // Clean up message handler in finally block\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createWorkerStream.js","sources":["../../../plugin/react-client/createWorkerStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type {\n RscWorkerOutputMessage,\n RscRenderMessage,\n} from \"../worker/types.js\";\nimport type { StreamMetrics } from \"../types.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\nimport type { StreamHandlers } from \"../worker/types.js\";\nimport { createMessageHandler } from \"./createMessageHandlers.js\";\nimport { logError } from \"../error/toError.js\";\n\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,\n message,\n logger,\n handlers: {\n onHmrAccept,\n onHmrUpdate,\n onMetrics,\n onError,\n onData,\n onEnd,\n onServerAction,\n onServerActionResponse,\n onCssFile,\n },\n verbose = false,\n}: {\n worker: NodeWorker;\n message: Omit<RscRenderMessage, \"type\" | \"id\"> &\n Partial<Pick<RscRenderMessage, \"id\">> & { type?: \"RSC_RENDER\" };\n logger: Logger;\n handlers: Pick<StreamHandlers, \"onHmrAccept\" | \"onHmrUpdate\" | \"onMetrics\"> &\n Partial<\n Pick<\n StreamHandlers,\n | \"onError\"\n | \"onData\"\n | \"onEnd\"\n | \"onServerAction\"\n | \"onServerActionResponse\"\n | \"onCssFile\"\n >\n >;\n verbose?: boolean;\n}): AsyncGenerator<Uint8Array> {\n if (!worker) {\n throw new Error(\"Worker is not running\");\n }\n let messageHandler:\n | ((message: RscWorkerOutputMessage | undefined) => void)\n | null = null;\n let currentResolve: ((chunk: Uint8Array) => void) | null = null;\n const handlers: StreamHandlers = {\n onError: (id, error, errorInfo) => {\n logError(error, logger);\n if (errorInfo) {\n logError(errorInfo.componentStack, logger);\n }\n if (typeof onError === \"function\") {\n onError(id, error, errorInfo);\n }\n },\n onData: (id: string, chunk: Uint8Array) => {\n currentResolve?.(chunk);\n if (verbose) {\n logger.info(\n `[react-client] received chunk ${id} ${\n Buffer.from(chunk).byteLength\n } bytes`\n );\n }\n if (typeof onData === \"function\") {\n onData(id, chunk);\n }\n },\n onEnd: (id: string) => {\n currentResolve?.(new Uint8Array());\n if (verbose) logger.info(`[react-client] received end`);\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n if (typeof onEnd === \"function\") {\n onEnd(id);\n }\n },\n onMetrics: (id: string, metrics: StreamMetrics) => {\n if (verbose)\n logger.info(`[react-client] received chunks ${metrics.chunks}`);\n if (typeof onMetrics === \"function\") {\n onMetrics(id, metrics);\n }\n },\n onHmrAccept: (id: string, routes?: string[]) => {\n if (verbose)\n logger.info(`[react-client] received hmr accept ${routes?.join(\", \")}`);\n if (typeof onHmrAccept === \"function\") {\n onHmrAccept(id, routes);\n }\n },\n onHmrUpdate: (id: string, routes?: string[]) => {\n if (verbose)\n logger.info(`[react-client] received hmr update ${routes?.join(\", \")}`);\n if (typeof onHmrUpdate === \"function\") {\n onHmrUpdate(id, routes);\n }\n },\n onCssFile: (id: string, code: string) => {\n if (verbose) logger.info(`[react-client] received css file ${id}`);\n if (typeof onCssFile === \"function\") {\n onCssFile(id, code);\n }\n },\n onServerAction: (id: string, args: unknown[]) => {\n if (verbose) logger.info(`[react-client] received server action ${id}`);\n if (typeof onServerAction === \"function\") {\n onServerAction(id, args);\n }\n },\n onServerActionResponse: (id: string, result?: unknown, error?: string) => {\n if (verbose)\n logger.info(`[react-client] received server action response ${id}`);\n if (typeof onServerActionResponse === \"function\") {\n const response = {\n type: \"server-action-response\",\n returnValue: error \n ? { success: false, error }\n : result\n };\n onServerActionResponse(id, response);\n }\n },\n };\n\n try {\n // Remove any existing message handler before starting\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n if (verbose) logger.info(`[react-client] sending message RSC_RENDER`);\n worker.postMessage({\n ...message,\n type: \"RSC_RENDER\",\n id: message?.id ?? message.route,\n });\n\n if (verbose) logger.info(`[react-client] waiting for message handler`);\n let workerTimeout: NodeJS.Timeout | null = null;\n yield await new Promise<Uint8Array>((resolve) => {\n workerTimeout = setTimeout(() => {\n if (verbose) logger.info(`worker timeout`);\n worker.terminate();\n }, 5000);\n currentResolve = resolve;\n messageHandler = createMessageHandler({\n handlers,\n logger,\n verbose,\n });\n worker.on(\"message\", messageHandler);\n });\n if (workerTimeout) {\n clearTimeout(workerTimeout);\n }\n if (verbose) logger.info(`[react-client] received message handler`);\n while (true) {\n const chunk = await new Promise<Uint8Array>((resolve) => {\n currentResolve = resolve;\n // Create new message handler for each iteration\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n }\n messageHandler = createMessageHandler({\n handlers,\n logger,\n verbose,\n });\n worker.on(\"message\", messageHandler);\n });\n\n if (chunk.length === 0) {\n break;\n }\n\n yield chunk;\n }\n } finally {\n // Clean up message handler in finally block\n if (messageHandler) {\n worker.removeListener(\"message\", messageHandler);\n messageHandler = null;\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handleWorkerRscStream.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/handleWorkerRscStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACR,OAAe,EAChB,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,GAAG,wBAAwB,CAAC,CAAC,CAAC;IAC9G,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,cAAc,CAAC,UAAU,CAAC,CAyC7B"}
1
+ {"version":3,"file":"handleWorkerRscStream.d.ts","sourceRoot":"","sources":["../../../plugin/react-client/handleWorkerRscStream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACR,OAAe,EAChB,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,GAAG,wBAAwB,CAAC,CAAC,CAAC;IAC9G,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,cAAc,CAAC,UAAU,CAAC,CAkD7B"}
@@ -24,12 +24,19 @@ function handleWorkerRscStream({
24
24
  handlers: {
25
25
  ...handlers,
26
26
  onServerAction: (id, args) => {
27
- if (verbose) logger.info(`[react-client] Received server action ${id}`);
27
+ if (verbose) logger.info(`[react-client] Forwarding server action ${id} to worker`);
28
28
  handlers.onServerAction?.(id, args);
29
29
  },
30
30
  onServerActionResponse: (id, result, error) => {
31
- if (verbose) logger.info(`[react-client] Received server action response ${id}`);
32
- handlers.onServerActionResponse?.(id, result, error);
31
+ if (verbose) logger.info(`[react-client] Forwarding server action response ${id} from worker`);
32
+ if (typeof handlers.onServerActionResponse === "function") {
33
+ const response = {
34
+ type: "server-action-response",
35
+ returnValue: error ? { success: false, error } : result
36
+ // Direct result, no success/data wrapper
37
+ };
38
+ handlers.onServerActionResponse(id, response);
39
+ }
33
40
  }
34
41
  },
35
42
  verbose
@@ -1 +1 @@
1
- {"version":3,"file":"handleWorkerRscStream.js","sources":["../../../plugin/react-client/handleWorkerRscStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type { RscRenderMessage, StreamHandlers } from \"../worker/types.js\";\nimport { createWorkerStream } from \"./createWorkerStream.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\n/**\n * Handles the RSC stream from the worker.\n * Creates a ReadableStream that pipes RSC chunks to the response.\n *\n * @param worker - The worker thread\n * @param message - The RSC render message\n * @returns A ReadableStream that yields RSC chunks\n */\nexport function handleWorkerRscStream({\n worker,\n message,\n logger,\n handlers,\n verbose = false\n}: {\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">,\n logger: Logger,\n handlers: Pick<StreamHandlers, \"onMetrics\" | \"onHmrAccept\" | \"onHmrUpdate\"> &\n Partial<Pick<StreamHandlers, \"onError\" | \"onData\" | \"onEnd\" | \"onServerAction\" | \"onServerActionResponse\">>,\n verbose?: boolean\n}): ReadableStream<Uint8Array> {\n // Create a ReadableStream from the async generator\n let isFlowing = false;\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n if(verbose) logger.info(\"[react-client] Starting stream\");\n for await (const chunk of createWorkerStream({\n worker,\n message,\n logger,\n handlers: {\n ...handlers,\n onServerAction: (id: string, args: unknown[]) => {\n if (verbose) logger.info(`[react-client] Received server action ${id}`);\n handlers.onServerAction?.(id, args);\n },\n onServerActionResponse: (id: string, result?: unknown, error?: string) => {\n if (verbose) logger.info(`[react-client] Received server action response ${id}`);\n handlers.onServerActionResponse?.(id, result, error);\n }\n },\n verbose\n })) {\n if (!isFlowing) {\n isFlowing = true;\n if(verbose) logger.info(\"[react-client] Stream is flowing\");\n }\n controller.enqueue(chunk);\n }\n } catch (error) {\n controller.error(error);\n } finally {\n if (isFlowing) {\n isFlowing = false;\n if(verbose) logger.info(\"[react-client] Stream closing\");\n }\n controller.close();\n }\n },\n });\n}\n"],"names":[],"mappings":";;;;;;;AAYO,SAAS,qBAAsB,CAAA;AAAA,EACpC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAU,GAAA;AACZ,CAO+B,EAAA;AAE7B,EAAA,IAAI,SAAY,GAAA,KAAA;AAChB,EAAA,OAAO,IAAI,cAA2B,CAAA;AAAA,IACpC,MAAM,MAAM,UAAY,EAAA;AACtB,MAAI,IAAA;AACF,QAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,gCAAgC,CAAA;AACxD,QAAA,WAAA,MAAiB,SAAS,kBAAmB,CAAA;AAAA,UAC3C,MAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAU,EAAA;AAAA,YACR,GAAG,QAAA;AAAA,YACH,cAAA,EAAgB,CAAC,EAAA,EAAY,IAAoB,KAAA;AAC/C,cAAA,IAAI,OAAS,EAAA,MAAA,CAAO,IAAK,CAAA,CAAA,sCAAA,EAAyC,EAAE,CAAE,CAAA,CAAA;AACtE,cAAS,QAAA,CAAA,cAAA,GAAiB,IAAI,IAAI,CAAA;AAAA,aACpC;AAAA,YACA,sBAAwB,EAAA,CAAC,EAAY,EAAA,MAAA,EAAkB,KAAmB,KAAA;AACxE,cAAA,IAAI,OAAS,EAAA,MAAA,CAAO,IAAK,CAAA,CAAA,+CAAA,EAAkD,EAAE,CAAE,CAAA,CAAA;AAC/E,cAAS,QAAA,CAAA,sBAAA,GAAyB,EAAI,EAAA,MAAA,EAAQ,KAAK,CAAA;AAAA;AACrD,WACF;AAAA,UACA;AAAA,SACD,CAAG,EAAA;AACF,UAAA,IAAI,CAAC,SAAW,EAAA;AACd,YAAY,SAAA,GAAA,IAAA;AACZ,YAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,kCAAkC,CAAA;AAAA;AAE5D,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA;AAC1B,eACO,KAAO,EAAA;AACd,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,OACtB,SAAA;AACA,QAAA,IAAI,SAAW,EAAA;AACb,UAAY,SAAA,GAAA,KAAA;AACZ,UAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,+BAA+B,CAAA;AAAA;AAEzD,QAAA,UAAA,CAAW,KAAM,EAAA;AAAA;AACnB;AACF,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"handleWorkerRscStream.js","sources":["../../../plugin/react-client/handleWorkerRscStream.ts"],"sourcesContent":["import type { Logger } from \"vite\";\nimport type { RscRenderMessage, StreamHandlers } from \"../worker/types.js\";\nimport { createWorkerStream } from \"./createWorkerStream.js\";\nimport type { Worker as NodeWorker } from \"node:worker_threads\";\n/**\n * Handles the RSC stream from the worker.\n * Creates a ReadableStream that pipes RSC chunks to the response.\n *\n * @param worker - The worker thread\n * @param message - The RSC render message\n * @returns A ReadableStream that yields RSC chunks\n */\nexport function handleWorkerRscStream({\n worker,\n message,\n logger,\n handlers,\n verbose = false\n}: {\n worker: NodeWorker,\n message: Omit<RscRenderMessage, \"type\" | \"id\">,\n logger: Logger,\n handlers: Pick<StreamHandlers, \"onMetrics\" | \"onHmrAccept\" | \"onHmrUpdate\"> &\n Partial<Pick<StreamHandlers, \"onError\" | \"onData\" | \"onEnd\" | \"onServerAction\" | \"onServerActionResponse\">>,\n verbose?: boolean\n}): ReadableStream<Uint8Array> {\n // Create a ReadableStream from the async generator\n let isFlowing = false;\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n if(verbose) logger.info(\"[react-client] Starting stream\");\n for await (const chunk of createWorkerStream({\n worker,\n message,\n logger,\n handlers: {\n ...handlers,\n onServerAction: (id: string, args: unknown[]) => {\n if (verbose) logger.info(`[react-client] Forwarding server action ${id} to worker`);\n handlers.onServerAction?.(id, args);\n },\n onServerActionResponse: (id: string, result?: unknown, error?: string) => {\n if (verbose) logger.info(`[react-client] Forwarding server action response ${id} from worker`);\n if (typeof handlers.onServerActionResponse === \"function\") {\n // Ensure consistent response format\n const response = {\n type: \"server-action-response\",\n returnValue: error \n ? { success: false, error }\n : result // Direct result, no success/data wrapper\n };\n handlers.onServerActionResponse(id, response);\n }\n }\n },\n verbose\n })) {\n if (!isFlowing) {\n isFlowing = true;\n if(verbose) logger.info(\"[react-client] Stream is flowing\");\n }\n controller.enqueue(chunk);\n }\n } catch (error) {\n controller.error(error);\n } finally {\n if (isFlowing) {\n isFlowing = false;\n if(verbose) logger.info(\"[react-client] Stream closing\");\n }\n controller.close();\n }\n },\n });\n}\n"],"names":[],"mappings":";;;;;;;AAYO,SAAS,qBAAsB,CAAA;AAAA,EACpC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAU,GAAA;AACZ,CAO+B,EAAA;AAE7B,EAAA,IAAI,SAAY,GAAA,KAAA;AAChB,EAAA,OAAO,IAAI,cAA2B,CAAA;AAAA,IACpC,MAAM,MAAM,UAAY,EAAA;AACtB,MAAI,IAAA;AACF,QAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,gCAAgC,CAAA;AACxD,QAAA,WAAA,MAAiB,SAAS,kBAAmB,CAAA;AAAA,UAC3C,MAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAU,EAAA;AAAA,YACR,GAAG,QAAA;AAAA,YACH,cAAA,EAAgB,CAAC,EAAA,EAAY,IAAoB,KAAA;AAC/C,cAAA,IAAI,OAAS,EAAA,MAAA,CAAO,IAAK,CAAA,CAAA,wCAAA,EAA2C,EAAE,CAAY,UAAA,CAAA,CAAA;AAClF,cAAS,QAAA,CAAA,cAAA,GAAiB,IAAI,IAAI,CAAA;AAAA,aACpC;AAAA,YACA,sBAAwB,EAAA,CAAC,EAAY,EAAA,MAAA,EAAkB,KAAmB,KAAA;AACxE,cAAA,IAAI,OAAS,EAAA,MAAA,CAAO,IAAK,CAAA,CAAA,iDAAA,EAAoD,EAAE,CAAc,YAAA,CAAA,CAAA;AAC7F,cAAI,IAAA,OAAO,QAAS,CAAA,sBAAA,KAA2B,UAAY,EAAA;AAEzD,gBAAA,MAAM,QAAW,GAAA;AAAA,kBACf,IAAM,EAAA,wBAAA;AAAA,kBACN,aAAa,KACT,GAAA,EAAE,OAAS,EAAA,KAAA,EAAO,OAClB,GAAA;AAAA;AAAA,iBACN;AACA,gBAAS,QAAA,CAAA,sBAAA,CAAuB,IAAI,QAAQ,CAAA;AAAA;AAC9C;AACF,WACF;AAAA,UACA;AAAA,SACD,CAAG,EAAA;AACF,UAAA,IAAI,CAAC,SAAW,EAAA;AACd,YAAY,SAAA,GAAA,IAAA;AACZ,YAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,kCAAkC,CAAA;AAAA;AAE5D,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA;AAC1B,eACO,KAAO,EAAA;AACd,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,OACtB,SAAA;AACA,QAAA,IAAI,SAAW,EAAA;AACb,UAAY,SAAA,GAAA,KAAA;AACZ,UAAG,IAAA,OAAA,EAAgB,MAAA,CAAA,IAAA,CAAK,+BAA+B,CAAA;AAAA;AAEzD,QAAA,UAAA,CAAW,KAAM,EAAA;AAAA;AACnB;AACF,GACD,CAAA;AACH;;;;"}
@@ -1 +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,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlE,wBAAsB,aAAa,CAAC,EAChC,MAAM,EACN,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,cAAc,CAAC;CAC5B,0BA6DF"}
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,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlE,wBAAsB,aAAa,CAAC,EAChC,MAAM,EACN,mBAAmB,EACnB,WAAW,EACX,UAAU,GACX,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC;IACjC,UAAU,EAAE,cAAc,CAAC;CAC5B,0BA8DF"}
@@ -42,7 +42,8 @@ async function restartWorker({
42
42
  workerData: {
43
43
  hmrPort: workerHmrChannel.port2,
44
44
  resolvedConfig: serializedDevServerConfig(server.config),
45
- userOptions: serializedOptions(userOptions, autoDiscoveredFiles)
45
+ userOptions: serializedOptions(userOptions, autoDiscoveredFiles),
46
+ serverActions: autoDiscoveredFiles.serverActions
46
47
  },
47
48
  transferList: [workerHmrChannel.port2]
48
49
  });
@@ -1 +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 { MessageChannel, type Worker } from \"node:worker_threads\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\n\nlet currentWorker: Worker | null = null;\nlet isRestarting = false;\n\nexport async function restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions,\n hmrChannel,\n } :{\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel,\n }) {\n if (isRestarting) {\n return currentWorker;\n }\n isRestarting = true;\n \n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.removeAllListeners();\n currentWorker = null;\n }\n \n const routeCount = autoDiscoveredFiles.urlMap.size;\n const hmrBuffer = 20; // Buffer for HMR and other operations\n const maxListeners = routeCount + hmrBuffer;\n\n // Create a new MessageChannel for this worker\n const workerHmrChannel = new MessageChannel();\n \n // Forward messages from the plugin's HMR channel to the worker's channel\n hmrChannel.port1.addEventListener('message', (event: Event) => {\n workerHmrChannel.port1.postMessage((event as MessageEvent).data);\n });\n \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 : DEFAULT_CONFIG.ENV_PREFIX,\n workerData: {\n hmrPort: workerHmrChannel.port2,\n resolvedConfig: serializedDevServerConfig(server.config),\n userOptions: serializedOptions(userOptions, autoDiscoveredFiles),\n },\n transferList: [workerHmrChannel.port2],\n });\n \n if (workerResult.type === \"success\") {\n currentWorker = workerResult.worker;\n if(userOptions.verbose) 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 throw workerResult.error;\n }\n } finally {\n isRestarting = false;\n }\n \n return currentWorker;\n}"],"names":[],"mappings":";;;;;;;;;;AAUA,IAAI,aAA+B,GAAA,IAAA;AACnC,IAAI,YAAe,GAAA,KAAA;AAEnB,eAAsB,aAAc,CAAA;AAAA,EAChC,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAKG,EAAA;AACD,EAAA,IAAI,YAAc,EAAA;AAChB,IAAO,OAAA,aAAA;AAAA;AAET,EAAe,YAAA,GAAA,IAAA;AAEf,EAAI,IAAA;AAEF,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,aAAA,CAAc,kBAAmB,EAAA;AACjC,MAAgB,aAAA,GAAA,IAAA;AAAA;AAGlB,IAAM,MAAA,UAAA,GAAa,oBAAoB,MAAO,CAAA,IAAA;AAC9C,IAAA,MAAM,SAAY,GAAA,EAAA;AAClB,IAAA,MAAM,eAAe,UAAa,GAAA,SAAA;AAGlC,IAAM,MAAA,gBAAA,GAAmB,IAAI,cAAe,EAAA;AAG5C,IAAA,UAAA,CAAW,KAAM,CAAA,gBAAA,CAAiB,SAAW,EAAA,CAAC,KAAiB,KAAA;AAC7D,MAAiB,gBAAA,CAAA,KAAA,CAAM,WAAa,CAAA,KAAA,CAAuB,IAAI,CAAA;AAAA,KAChE,CAAA;AAED,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,SAAA,EACE,OAAO,MAAO,CAAA,MAAA,CAAO,cAAc,QAC/B,GAAA,MAAA,CAAO,OAAO,SACd,GAAA,KAAA,CAAM,QAAQ,MAAO,CAAA,MAAA,CAAO,SAAS,CACrC,GAAA,MAAA,CAAO,OAAO,SAAU,CAAA,CAAC,IACzB,cAAe,CAAA,UAAA;AAAA,MACrB,UAAY,EAAA;AAAA,QACV,SAAS,gBAAiB,CAAA,KAAA;AAAA,QAC1B,cAAA,EAAgB,yBAA0B,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,QACvD,WAAA,EAAa,iBAAkB,CAAA,WAAA,EAAa,mBAAmB;AAAA,OACjE;AAAA,MACA,YAAA,EAAc,CAAC,gBAAA,CAAiB,KAAK;AAAA,KACtC,CAAA;AAED,IAAI,IAAA,YAAA,CAAa,SAAS,SAAW,EAAA;AACnC,MAAA,aAAA,GAAgB,YAAa,CAAA,MAAA;AAC7B,MAAA,IAAG,WAAY,CAAA,OAAA,EAAgB,MAAA,CAAA,MAAA,CAAO,MAAO,CAAA,IAAA;AAAA,QAC3C,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;AACD,MAAA,MAAM,YAAa,CAAA,KAAA;AAAA;AACrB,GACA,SAAA;AACA,IAAe,YAAA,GAAA,KAAA;AAAA;AAGjB,EAAO,OAAA,aAAA;AACX;;;;"}
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 { MessageChannel, type Worker } from \"node:worker_threads\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\n\nlet currentWorker: Worker | null = null;\nlet isRestarting = false;\n\nexport async function restartWorker({\n server,\n autoDiscoveredFiles,\n userOptions,\n hmrChannel,\n } :{\n server: ViteDevServer,\n autoDiscoveredFiles: AutoDiscoveredFiles,\n userOptions: ResolvedUserOptions,\n hmrChannel: MessageChannel,\n }) {\n if (isRestarting) {\n return currentWorker;\n }\n isRestarting = true;\n \n try {\n // Terminate the current worker if it exists\n if (currentWorker) {\n currentWorker.removeAllListeners();\n currentWorker = null;\n }\n \n const routeCount = autoDiscoveredFiles.urlMap.size;\n const hmrBuffer = 20; // Buffer for HMR and other operations\n const maxListeners = routeCount + hmrBuffer;\n\n // Create a new MessageChannel for this worker\n const workerHmrChannel = new MessageChannel();\n \n // Forward messages from the plugin's HMR channel to the worker's channel\n hmrChannel.port1.addEventListener('message', (event: Event) => {\n workerHmrChannel.port1.postMessage((event as MessageEvent).data);\n });\n \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 : DEFAULT_CONFIG.ENV_PREFIX,\n workerData: {\n hmrPort: workerHmrChannel.port2,\n resolvedConfig: serializedDevServerConfig(server.config),\n userOptions: serializedOptions(userOptions, autoDiscoveredFiles),\n serverActions: autoDiscoveredFiles.serverActions,\n },\n transferList: [workerHmrChannel.port2],\n });\n \n if (workerResult.type === \"success\") {\n currentWorker = workerResult.worker;\n if(userOptions.verbose) 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 throw workerResult.error;\n }\n } finally {\n isRestarting = false;\n }\n \n return currentWorker;\n}"],"names":[],"mappings":";;;;;;;;;;AAUA,IAAI,aAA+B,GAAA,IAAA;AACnC,IAAI,YAAe,GAAA,KAAA;AAEnB,eAAsB,aAAc,CAAA;AAAA,EAChC,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAKG,EAAA;AACD,EAAA,IAAI,YAAc,EAAA;AAChB,IAAO,OAAA,aAAA;AAAA;AAET,EAAe,YAAA,GAAA,IAAA;AAEf,EAAI,IAAA;AAEF,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,aAAA,CAAc,kBAAmB,EAAA;AACjC,MAAgB,aAAA,GAAA,IAAA;AAAA;AAGlB,IAAM,MAAA,UAAA,GAAa,oBAAoB,MAAO,CAAA,IAAA;AAC9C,IAAA,MAAM,SAAY,GAAA,EAAA;AAClB,IAAA,MAAM,eAAe,UAAa,GAAA,SAAA;AAGlC,IAAM,MAAA,gBAAA,GAAmB,IAAI,cAAe,EAAA;AAG5C,IAAA,UAAA,CAAW,KAAM,CAAA,gBAAA,CAAiB,SAAW,EAAA,CAAC,KAAiB,KAAA;AAC7D,MAAiB,gBAAA,CAAA,KAAA,CAAM,WAAa,CAAA,KAAA,CAAuB,IAAI,CAAA;AAAA,KAChE,CAAA;AAED,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,SAAA,EACE,OAAO,MAAO,CAAA,MAAA,CAAO,cAAc,QAC/B,GAAA,MAAA,CAAO,OAAO,SACd,GAAA,KAAA,CAAM,QAAQ,MAAO,CAAA,MAAA,CAAO,SAAS,CACrC,GAAA,MAAA,CAAO,OAAO,SAAU,CAAA,CAAC,IACzB,cAAe,CAAA,UAAA;AAAA,MACrB,UAAY,EAAA;AAAA,QACV,SAAS,gBAAiB,CAAA,KAAA;AAAA,QAC1B,cAAA,EAAgB,yBAA0B,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,QACvD,WAAA,EAAa,iBAAkB,CAAA,WAAA,EAAa,mBAAmB,CAAA;AAAA,QAC/D,eAAe,mBAAoB,CAAA;AAAA,OACrC;AAAA,MACA,YAAA,EAAc,CAAC,gBAAA,CAAiB,KAAK;AAAA,KACtC,CAAA;AAED,IAAI,IAAA,YAAA,CAAa,SAAS,SAAW,EAAA;AACnC,MAAA,aAAA,GAAgB,YAAa,CAAA,MAAA;AAC7B,MAAA,IAAG,WAAY,CAAA,OAAA,EAAgB,MAAA,CAAA,MAAA,CAAO,MAAO,CAAA,IAAA;AAAA,QAC3C,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;AACD,MAAA,MAAM,YAAa,CAAA,KAAA;AAAA;AACrB,GACA,SAAA;AACA,IAAe,YAAA,GAAA,KAAA;AAAA;AAGjB,EAAO,OAAA,aAAA;AACX;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"configureReactServer.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/configureReactServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAWrB,wBAAsB,oBAAoB,CACxC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,EACA,MAAM,EACN,mBAAmB,EACnB,WAAW,EAAE,YAAY,EACzB,cAAc,GACf,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/C,cAAc,EAAE,QAAQ,CAAC;CAC1B,iBA0JA"}
1
+ {"version":3,"file":"configureReactServer.d.ts","sourceRoot":"","sources":["../../../plugin/react-server/configureReactServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAWrB,wBAAsB,oBAAoB,CACxC,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,SAAS,SAAS,YAAY,GAAG,YAAY,EAC7C,EACA,MAAM,EACN,mBAAmB,EACnB,WAAW,EAAE,YAAY,EACzB,cAAc,GACf,EAAE;IACD,MAAM,EAAE,aAAa,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,WAAW,EAAE,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/C,cAAc,EAAE,QAAQ,CAAC;CAC1B,iBAyJA"}
@@ -24,13 +24,12 @@ async function configureReactServer({
24
24
  Html: _UserHtmlComponent,
25
25
  onEvent,
26
26
  // remove these
27
- moduleBaseURL: _moduleBaseURL,
28
- projectRoot: _projectRoot,
29
27
  ...handlerUserOptions
30
28
  } = _userOptions;
31
29
  const handlerOptions = {
32
30
  ...handlerUserOptions,
33
31
  moduleBaseURL: server.config.base,
32
+ moduleBasePath: server.config.base,
34
33
  projectRoot: server.config.root,
35
34
  Html: React__default.Fragment,
36
35
  onEvent: createEventHandler(onEvent),
@@ -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 moduleBaseURL: _moduleBaseURL,\n projectRoot: _projectRoot,\n ...handlerUserOptions\n } = _userOptions;\n const handlerOptions = {\n ...handlerUserOptions,\n moduleBaseURL: 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 // 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":";;;;;;;;;;;;;;;AAkBA,eAAsB,oBAGpB,CAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAa,EAAA,YAAA;AAAA,EACb;AACF,CAKG,EAAA;AACD,EAAM,MAAA,aAAA,uBAAoB,GAAoB,EAAA;AAC9C,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA,kBAAA;AAAA,IACN,OAAA;AAAA;AAAA,IAEA,GAAG;AAAA,GACD,GAAA,YAAA;AACJ,EAAA,MAAM,cAAiB,GAAA;AAAA,IACrB,GAAG,kBAAA;AAAA,IACH,aAAA,EAAe,OAAO,MAAO,CAAA,IAAA;AAAA,IAC7B,cAAA,EAAgB,OAAO,MAAO,CAAA,IAAA;AAAA,IAC9B,WAAA,EAAa,OAAO,MAAO,CAAA,IAAA;AAAA,IAC3B,MAAMA,cAAM,CAAA,QAAA;AAAA,IACZ,OAAA,EAAS,mBAAmB,OAAO,CAAA;AAAA,IACnC,KAAK,kBAAmB,CAAA;AAAA,GAC1B;AAGA,EAAA,MAAM,MAAS,GAAA;AAAA,IACb,GAAG,OAAO,MAAO,CAAA,MAAA;AAAA,IACjB,wBAAwB,IAAK,CAAA,SAAA;AAAA,MAC3B,OAAA,CAAQ,GAAI,CAAA,UAAU,CAAK,IAAA;AAAA;AAC7B,GACF;AACA,EAAA,MAAA,CAAO,MAAS,GAAA;AAAA,IACd,GAAG,MAAO,CAAA,MAAA;AAAA,IACV;AAAA,GACF;AAGA,EAAA,MAAA,CAAO,EAAG,CAAA,EAAA,CAAG,SAAW,EAAA,CAAC,IAAS,KAAA;AAChC,IAAA,MAAA,CAAO,OAAO,MAAO,CAAA,IAAA;AAAA,MACnB,sEAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,KAAA,MAAW,OAAO,aAAe,EAAA;AAC/B,MAAA,GAAA,CAAI,UAAU,GAAK,EAAA;AAAA,QACjB,cAAgB,EAAA,iCAAA;AAAA,QAChB,aAAe,EAAA;AAAA,OAChB,CAAA;AACD,MAAI,GAAA,CAAA,GAAA;AAAA,QACF,CAAA,0FAAA;AAAA,OACF;AAAA;AAEF,IAAA,aAAA,CAAc,KAAM,EAAA;AAAA,GACrB,CAAA;AAED,EAAA,MAAA,CAAO,WAAY,CAAA,GAAA,CAAI,OAAO,GAAA,EAAK,KAAK,IAAS,KAAA;AAC/C,IAAI,IAAA,CAAC,IAAI,GAAK,EAAA;AACZ,MAAA,OAAO,IAAK,EAAA;AAAA;AAEd,IAAA,MAAM,OAAO,WAAY,CAAA,GAAA,EAAK,gBAAgB,EAAI,EAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAGtE,IAAA,IAAI,KAAK,qBAAuB,EAAA;AAC9B,MAAA,OAAO,kBAAmB,CAAA,GAAA,EAAK,GAAK,EAAA,MAAA,EAAQ,cAAc,CAAA;AAAA;AAG5D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAc,EAAA,OAAO,IAAK,EAAA;AACpC,IAAI,IAAA;AACF,MAAA,MAAM,aAAa,MAAM,aAAA;AAAA,QACvB,IAAK,CAAA,KAAA;AAAA,QACL,mBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAI,IAAA,UAAA,CAAW,SAAS,OAAS,EAAA;AAC/B,QAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,KAAM,CAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AACnD,QAAA,OAAO,IAAK,EAAA;AAAA;AAEd,MAAA,MAAM,WAAW,UAAW,CAAA,IAAA;AAC5B,MAAA,MAAM,YAAY,UAAW,CAAA,KAAA;AAG7B,MAAM,MAAA,kBAAA,GAAqB,MAAM,mBAAoB,CAAA;AAAA,QACnD,QAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAO,IAAK,CAAA,KAAA;AAAA,QACZ,QAAQ,MAAO,CAAA,aAAA;AAAA,QACf,cAAA,EAAgB,eAAe,cAAkB,IAAA,SAAA;AAAA,QACjD,eAAA,EAAiB,eAAe,eAAmB,IAAA;AAAA,OACpD,CAAA;AACD,MAAI,IAAA,kBAAA,CAAmB,SAAS,OAAS,EAAA;AACvC,QAAA,MAAM,kBAAmB,CAAA,KAAA;AAAA;AAE3B,MAAI,IAAA,kBAAA,CAAmB,SAAS,MAAQ,EAAA;AACtC,QAAA,OAAO,IAAK,EAAA;AAAA;AAGd,MAAM,MAAA,YAAA,GAAe,mBAAmB,OAAO,CAAA;AAC/C,MAAM,MAAA,cAAA,GAAiB,MAAM,yBAA0B,CAAA;AAAA,QACrD,aAAa,MAAO,CAAA,WAAA;AAAA;AAAA,QACpB,SAAW,EAAA,QAAA;AAAA,QACX,cAAgB,EAAA;AAAA,UACd,QAAA;AAAA,UACA,QAAQ,MAAO,CAAA,aAAA;AAAA;AAAA,UAEf,GAAG;AAAA;AACL,OACD,CAAA;AACD,MAAI,IAAA,cAAA,CAAe,SAAS,MAAQ,EAAA;AAClC,QAAA,OAAO,IAAK,EAAA;AAAA;AAEd,MAAI,IAAA,cAAA,CAAe,SAAS,OAAS,EAAA;AACnC,QAAA,MAAM,cAAe,CAAA,KAAA;AAAA;AAEvB,MAAM,MAAA,EAAE,aAAe,EAAA,SAAA,EAAc,GAAA,kBAAA;AAErC,MAAA,MAAM,YAAY,aAAc,CAAA;AAAA,QAC9B,GAAG,cAAA;AAAA,QACH,aAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA,EAAQ,OAAO,MAAO,CAAA,MAAA;AAAA,QACtB,QAAQ,MAAO,CAAA,aAAA;AAAA,QACf,MAAMA,cAAM,CAAA,QAAA;AAAA,QACZ,OAAS,EAAA,YAAA;AAAA,QACT,QAAU,EAAA,cAAA;AAAA,QACV,MAAA;AAAA,QACA,OAAO,IAAK,CAAA,KAAA;AAAA,QACZ,QAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAU,EAAA,cAAA,CAAe,QAAY,oBAAA,IAAI,GAAI,EAAA;AAAA,QAC7C,SAAA,sBAAe,GAAI;AAAA,OACpB,CAAA;AACD,MAAI,IAAA,SAAA,CAAU,SAAS,SAAW,EAAA;AAEhC,QAAI,GAAA,CAAA,SAAA,CAAU,gBAAgB,iCAAiC,CAAA;AAC/D,QAAU,SAAA,CAAA,MAAA,CAAQ,KAAK,GAAG,CAAA;AAAA;AAE5B,MAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AACrB,MAAI,GAAA,CAAA,EAAA,CAAG,SAAS,MAAM;AACpB,QAAA,aAAA,CAAc,OAAO,GAAG,CAAA;AAAA,OACzB,CAAA;AAAA,aACM,KAAO,EAAA;AACd,MAAS,QAAA,CAAA,KAAA,EAAO,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA;AACpC,MAAA,GAAA,CAAI,GAAI,EAAA;AAAA;AACV,GACD,CAAA;AAED,EAAO,MAAA,CAAA,UAAA,EAAY,IAAK,CAAA,WAAA,EAAa,MAAM;AACzC,IAAM,MAAA,OAAA,GAAU,MAAO,CAAA,UAAA,EAAY,OAAQ,EAAA;AAC3C,IAAI,IAAA,OAAA,IAAW,OAAO,OAAA,KAAY,QAAU,EAAA;AAC1C,MAAA,MAAM,OAAO,OAAQ,CAAA,IAAA;AACrB,MAAA,MAAM,IAAO,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,IAAQ,IAAA,WAAA;AAC1C,MAAA,MAAM,QAAW,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,QAAQ,OAAU,GAAA,MAAA;AACxD,MAAA,cAAA,CAAe,eAAe,CAAG,EAAA,QAAQ,CAAM,GAAA,EAAA,IAAI,IAAI,IAAI,CAAA,CAAA;AAC3D,MAAA,IAAI,cAAe,CAAA,YAAA,KAAiB,OAAQ,CAAA,GAAA,CAAI,kBAAoB,EAAA;AAClE,QAAQ,OAAA,CAAA,GAAA,CAAI,qBAAqB,cAAe,CAAA,YAAA;AAAA;AAClD;AACF,GACD,CAAA;AACH;;;;"}