vite-plugin-react-server 0.1.0

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 (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/dist/build/createBuildConfig.d.ts +12 -0
  4. package/dist/build/createBuildConfig.d.ts.map +1 -0
  5. package/dist/build/createBuildConfig.js +55 -0
  6. package/dist/build/createBuildConfig.js.map +1 -0
  7. package/dist/checkFilesExist.d.ts +8 -0
  8. package/dist/checkFilesExist.d.ts.map +1 -0
  9. package/dist/checkFilesExist.js +61 -0
  10. package/dist/checkFilesExist.js.map +1 -0
  11. package/dist/collect-css-manifest.d.ts +4 -0
  12. package/dist/collect-css-manifest.d.ts.map +1 -0
  13. package/dist/collect-css-manifest.js +57 -0
  14. package/dist/collect-css-manifest.js.map +1 -0
  15. package/dist/components.d.ts +13 -0
  16. package/dist/components.d.ts.map +1 -0
  17. package/dist/components.js +13 -0
  18. package/dist/components.js.map +1 -0
  19. package/dist/copy-dir.d.ts +4 -0
  20. package/dist/copy-dir.d.ts.map +1 -0
  21. package/dist/getEnv.d.ts +19 -0
  22. package/dist/getEnv.d.ts.map +1 -0
  23. package/dist/getEnv.js +76 -0
  24. package/dist/getEnv.js.map +1 -0
  25. package/dist/helpers/normalizedRelativePath.d.ts +9 -0
  26. package/dist/helpers/normalizedRelativePath.d.ts.map +1 -0
  27. package/dist/helpers/normalizedRelativePath.js +31 -0
  28. package/dist/helpers/normalizedRelativePath.js.map +1 -0
  29. package/dist/helpers/tryManifest.d.ts +8 -0
  30. package/dist/helpers/tryManifest.d.ts.map +1 -0
  31. package/dist/html/createPageLoader.d.ts +26 -0
  32. package/dist/html/createPageLoader.d.ts.map +1 -0
  33. package/dist/html/createPageLoader.js +70 -0
  34. package/dist/html/createPageLoader.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/manifest.d.ts +6 -0
  40. package/dist/manifest.d.ts.map +1 -0
  41. package/dist/module-graph.d.ts +10 -0
  42. package/dist/module-graph.d.ts.map +1 -0
  43. package/dist/options.d.ts +86 -0
  44. package/dist/options.d.ts.map +1 -0
  45. package/dist/options.js +251 -0
  46. package/dist/options.js.map +1 -0
  47. package/dist/plugin.d.ts +8 -0
  48. package/dist/plugin.d.ts.map +1 -0
  49. package/dist/plugin.js +31 -0
  50. package/dist/plugin.js.map +1 -0
  51. package/dist/react-client/plugin.d.ts +4 -0
  52. package/dist/react-client/plugin.d.ts.map +1 -0
  53. package/dist/react-client/plugin.js +28 -0
  54. package/dist/react-client/plugin.js.map +1 -0
  55. package/dist/react-server/createDevMiddleware.d.ts +8 -0
  56. package/dist/react-server/createDevMiddleware.d.ts.map +1 -0
  57. package/dist/react-server/createDevServer.d.ts +4 -0
  58. package/dist/react-server/createDevServer.d.ts.map +1 -0
  59. package/dist/react-server/createHandler.d.ts +23 -0
  60. package/dist/react-server/createHandler.d.ts.map +1 -0
  61. package/dist/react-server/createHandler.js +110 -0
  62. package/dist/react-server/createHandler.js.map +1 -0
  63. package/dist/react-server/createReactNodeStreamer.d.ts +10 -0
  64. package/dist/react-server/createReactNodeStreamer.d.ts.map +1 -0
  65. package/dist/react-server/createRscStream.d.ts +4 -0
  66. package/dist/react-server/createRscStream.d.ts.map +1 -0
  67. package/dist/react-server/createRscStream.js +47 -0
  68. package/dist/react-server/createRscStream.js.map +1 -0
  69. package/dist/react-server/createSsrHandler.d.ts +4 -0
  70. package/dist/react-server/createSsrHandler.d.ts.map +1 -0
  71. package/dist/react-server/plugin.d.ts +8 -0
  72. package/dist/react-server/plugin.d.ts.map +1 -0
  73. package/dist/react-server/plugin.js +298 -0
  74. package/dist/react-server/plugin.js.map +1 -0
  75. package/dist/resolvePage.d.ts +19 -0
  76. package/dist/resolvePage.d.ts.map +1 -0
  77. package/dist/resolvePage.js +44 -0
  78. package/dist/resolvePage.js.map +1 -0
  79. package/dist/resolveProps.d.ts +19 -0
  80. package/dist/resolveProps.d.ts.map +1 -0
  81. package/dist/resolveProps.js +90 -0
  82. package/dist/resolveProps.js.map +1 -0
  83. package/dist/server.d.ts +2 -0
  84. package/dist/server.d.ts.map +1 -0
  85. package/dist/transformer/index.d.ts +28 -0
  86. package/dist/transformer/index.d.ts.map +1 -0
  87. package/dist/transformer/index.js +54 -0
  88. package/dist/transformer/index.js.map +1 -0
  89. package/dist/transformer/preserveDirectives.d.ts +4 -0
  90. package/dist/transformer/preserveDirectives.d.ts.map +1 -0
  91. package/dist/transformer/preserveDirectives.js +72 -0
  92. package/dist/transformer/preserveDirectives.js.map +1 -0
  93. package/dist/transformer/preserver.d.ts +2 -0
  94. package/dist/transformer/preserver.d.ts.map +1 -0
  95. package/dist/transformer/transformer.d.ts +30 -0
  96. package/dist/transformer/transformer.d.ts.map +1 -0
  97. package/dist/transformer/transformer.js +80 -0
  98. package/dist/transformer/transformer.js.map +1 -0
  99. package/dist/transformer/types.d.ts +15 -0
  100. package/dist/transformer/types.d.ts.map +1 -0
  101. package/dist/types.d.ts +197 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/worker/createHtmlStream.d.ts +7 -0
  104. package/dist/worker/createHtmlStream.d.ts.map +1 -0
  105. package/dist/worker/createWorker.d.ts +3 -0
  106. package/dist/worker/createWorker.d.ts.map +1 -0
  107. package/dist/worker/createWorker.js +33 -0
  108. package/dist/worker/createWorker.js.map +1 -0
  109. package/dist/worker/loader.d.ts +15 -0
  110. package/dist/worker/loader.d.ts.map +1 -0
  111. package/dist/worker/renderPages.d.ts +18 -0
  112. package/dist/worker/renderPages.d.ts.map +1 -0
  113. package/dist/worker/renderPages.js +99 -0
  114. package/dist/worker/renderPages.js.map +1 -0
  115. package/dist/worker/types.d.ts +31 -0
  116. package/dist/worker/types.d.ts.map +1 -0
  117. package/dist/worker/worker.d.ts +7 -0
  118. package/dist/worker/worker.d.ts.map +1 -0
  119. package/package.json +116 -0
  120. package/src/build/createBuildConfig.ts +74 -0
  121. package/src/checkFilesExist.ts +67 -0
  122. package/src/collect-css-manifest.ts +76 -0
  123. package/src/components.tsx +14 -0
  124. package/src/copy-dir.ts +27 -0
  125. package/src/getEnv.ts +135 -0
  126. package/src/helpers/normalizedRelativePath.ts +59 -0
  127. package/src/helpers/tryManifest.ts +23 -0
  128. package/src/html/createPageLoader.ts +99 -0
  129. package/src/index.ts +4 -0
  130. package/src/manifest.ts +24 -0
  131. package/src/module-graph.ts +48 -0
  132. package/src/options.ts +351 -0
  133. package/src/plugin.ts +31 -0
  134. package/src/react-client/plugin.ts +34 -0
  135. package/src/react-server/createDevMiddleware.ts +75 -0
  136. package/src/react-server/createDevServer.ts +10 -0
  137. package/src/react-server/createHandler.ts +144 -0
  138. package/src/react-server/createReactNodeStreamer.ts +25 -0
  139. package/src/react-server/createRscStream.ts +52 -0
  140. package/src/react-server/createSsrHandler.ts +147 -0
  141. package/src/react-server/plugin.ts +349 -0
  142. package/src/resolvePage.ts +65 -0
  143. package/src/resolveProps.ts +122 -0
  144. package/src/server.tsx +0 -0
  145. package/src/transformer/README.md +44 -0
  146. package/src/transformer/index.ts +112 -0
  147. package/src/transformer/preserveDirectives.ts +100 -0
  148. package/src/transformer/preserver.ts +47 -0
  149. package/src/transformer/transformer.ts +123 -0
  150. package/src/transformer/types.ts +15 -0
  151. package/src/types.ts +245 -0
  152. package/src/worker/createHtmlStream.ts +76 -0
  153. package/src/worker/createWorker.ts +39 -0
  154. package/src/worker/loader.ts +16 -0
  155. package/src/worker/renderPages.ts +144 -0
  156. package/src/worker/types.ts +38 -0
  157. package/src/worker/worker.tsx +136 -0
  158. package/tsconfig.json +79 -0
@@ -0,0 +1,54 @@
1
+ import { normalizePath } from "vite";
2
+ import { DEFAULT_CONFIG } from "../options.js";
3
+ import { createRscTransformer } from "./transformer.js";
4
+ function viteReactClientTransformPlugin(options) {
5
+ if (process.env["NODE_OPTIONS"]?.match(/--conditions=react-server/)) {
6
+ console.log("react-server");
7
+ } else {
8
+ throw new Error('react-server condition not found, set NODE_OPTIONS="--conditions react-server"');
9
+ }
10
+ const projectRoot = process.cwd();
11
+ const include = DEFAULT_CONFIG.FILE_REGEX;
12
+ const exclude = options?.exclude;
13
+ let transform;
14
+ return {
15
+ name: "vite:react-stream-transformer",
16
+ enforce: "pre",
17
+ configResolved(config) {
18
+ transform = createRscTransformer({
19
+ moduleId: moduleIdDefault({
20
+ projectRoot,
21
+ output: {
22
+ dir: config.build?.outDir ?? DEFAULT_CONFIG.BUILD.server
23
+ },
24
+ isProduction: config.isProduction
25
+ })
26
+ }).transform;
27
+ },
28
+ transform(code, id, opts) {
29
+ if (!matchPattern(id, include) || exclude) {
30
+ return null;
31
+ }
32
+ const directiveMatch = code.startsWith('"use client"') || code.startsWith("'use client'");
33
+ if (!directiveMatch) return null;
34
+ return transform(code, id, opts);
35
+ }
36
+ };
37
+ }
38
+ const moduleIdDefault = ({
39
+ projectRoot,
40
+ output: _,
41
+ isProduction
42
+ }) => (moduleId) => {
43
+ const normalized = normalizePath(moduleId);
44
+ const noRoot = normalized.startsWith(projectRoot) ? normalized.slice(projectRoot.length) : normalized;
45
+ if (!isProduction) {
46
+ return noRoot;
47
+ }
48
+ return noRoot.replace(DEFAULT_CONFIG.FILE_REGEX, ".js");
49
+ };
50
+ const matchPattern = (file, pattern) => Array.isArray(pattern) ? pattern.some((p) => file.match(p)) : file.match(pattern);
51
+ export {
52
+ viteReactClientTransformPlugin
53
+ };
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/transformer/index.ts"],"sourcesContent":["import type { Plugin } from \"vite\";\nimport { normalizePath } from \"vite\";\nimport { DEFAULT_CONFIG } from \"../options.js\";\nimport { createRscTransformer } from \"./transformer.js\";\nimport type { ViteReactClientTransformOptions } from \"./types.js\";\n\n\n/**\n * Plugin for transforming React Client Components.\n *\n * Core responsibilities:\n * 1. Detects \"use client\" directives\n * 2. Transforms client components for RSC boundaries\n * 3. Adds client reference metadata for RSC\n *\n * When a component is marked with \"use client\", it:\n * - Gets transformed into a client reference\n * - Maintains module ID for RSC boundaries\n * - Preserves class/function behavior\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * viteReactClientTransformPlugin({\n * projectRoot: process.cwd(),\n * })\n * ]\n * });\n * ```\n */\n\nexport function viteReactClientTransformPlugin(\n options?: ViteReactClientTransformOptions\n): Plugin {\n if(process.env['NODE_OPTIONS']?.match(/--conditions=react-server/)) {\n console.log('react-server')\n } else {\n throw new Error('react-server condition not found, set NODE_OPTIONS=\"--conditions react-server\"')\n }\n const projectRoot = options?.projectRoot || process.cwd();\n const include = options?.include || DEFAULT_CONFIG.FILE_REGEX;\n const exclude = options?.exclude;\n let transform: any;\n // get the file we are imported from (parent)\n\n return {\n name: \"vite:react-stream-transformer\",\n enforce: \"pre\",\n\n configResolved(config) {\n transform = createRscTransformer({\n moduleId:\n options?.moduleId ||\n moduleIdDefault({\n projectRoot: projectRoot,\n output: {\n dir: config.build?.outDir ?? DEFAULT_CONFIG.BUILD.server,\n },\n isProduction: config.isProduction,\n }),\n }).transform;\n },\n\n transform(code: string, id: string, opts) {\n // Skip if file doesn't match patterns\n if (\n !matchPattern(id, include) ||\n (exclude && matchPattern(id, exclude))\n ) {\n return null;\n }\n\n // Look for use client directive at start of file (no exceptions)\n const directiveMatch =\n code.startsWith('\"use client\"') || code.startsWith(\"'use client'\");\n if (!directiveMatch) return null;\n\n // Transform client components\n return transform(code, id, opts);\n },\n };\n}\n\nconst moduleIdDefault =\n ({\n projectRoot,\n output: _,\n isProduction,\n }: {\n isProduction: boolean;\n projectRoot: string;\n output: { dir: string };\n }) =>\n (moduleId: string) => {\n const normalized = normalizePath(moduleId);\n const noRoot = normalized.startsWith(projectRoot)\n ? normalized.slice(projectRoot.length)\n : normalized;\n if (!isProduction) {\n return noRoot;\n }\n return noRoot.replace(DEFAULT_CONFIG.FILE_REGEX, \".js\");\n };\n\nconst matchPattern = (\n file: string,\n pattern: string | RegExp | (string | RegExp)[]\n) =>\n Array.isArray(pattern)\n ? pattern.some((p) => file.match(p as RegExp))\n : file.match(pattern as RegExp);\n"],"names":[],"mappings":";;;AAgCO,SAAS,+BACd,SACQ;AACR,MAAG,QAAQ,IAAI,cAAc,GAAG,MAAM,2BAA2B,GAAG;AAClE,YAAQ,IAAI,cAAc;AAAA,EAAA,OACrB;AACC,UAAA,IAAI,MAAM,gFAAgF;AAAA,EAAA;AAElG,QAAM,cAAsC,QAAQ,IAAI;AAClD,QAAA,UAA8B,eAAe;AACnD,QAAM,UAAU,SAAS;AACrB,MAAA;AAGG,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,eAAe,QAAQ;AACrB,kBAAY,qBAAqB;AAAA,QAC/B,UAEE,gBAAgB;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,YACN,KAAK,OAAO,OAAO,UAAU,eAAe,MAAM;AAAA,UACpD;AAAA,UACA,cAAc,OAAO;AAAA,QACtB,CAAA;AAAA,MACJ,CAAA,EAAE;AAAA,IACL;AAAA,IAEA,UAAU,MAAc,IAAY,MAAM;AAGtC,UAAA,CAAC,aAAa,IAAI,OAAO,KACxB,SACD;AACO,eAAA;AAAA,MAAA;AAIT,YAAM,iBACJ,KAAK,WAAW,cAAc,KAAK,KAAK,WAAW,cAAc;AAC/D,UAAA,CAAC,eAAuB,QAAA;AAGrB,aAAA,UAAU,MAAM,IAAI,IAAI;AAAA,IAAA;AAAA,EAEnC;AACF;AAEA,MAAM,kBACJ,CAAC;AAAA,EACC;AAAA,EACA,QAAQ;AAAA,EACR;AACF,MAKA,CAAC,aAAqB;AACd,QAAA,aAAa,cAAc,QAAQ;AACnC,QAAA,SAAS,WAAW,WAAW,WAAW,IAC5C,WAAW,MAAM,YAAY,MAAM,IACnC;AACJ,MAAI,CAAC,cAAc;AACV,WAAA;AAAA,EAAA;AAET,SAAO,OAAO,QAAQ,eAAe,YAAY,KAAK;AACxD;AAEF,MAAM,eAAe,CACnB,MACA,YAEA,MAAM,QAAQ,OAAO,IACjB,QAAQ,KAAK,CAAC,MAAM,KAAK,MAAM,CAAW,CAAC,IAC3C,KAAK,MAAM,OAAiB;"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from "rollup";
2
+ import type { Options } from "../types.js";
3
+ export declare function preserveDirectives(options?: Pick<Options, "include">): Plugin;
4
+ //# sourceMappingURL=preserveDirectives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserveDirectives.d.ts","sourceRoot":"","sources":["../../src/transformer/preserveDirectives.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,CAuF7E"}
@@ -0,0 +1,72 @@
1
+ import { SourceMapGenerator } from "source-map";
2
+ import { DEFAULT_CONFIG } from "../options.js";
3
+ const REACT_DIRECTIVES = /* @__PURE__ */ new Set(["use client", "use server", "use no-memo"]);
4
+ function preserveDirectives(options) {
5
+ const meta = {
6
+ directives: {}
7
+ };
8
+ const fileRegex = DEFAULT_CONFIG.FILE_REGEX;
9
+ return {
10
+ name: "react-preserve-directives",
11
+ transform: {
12
+ order: "post",
13
+ handler(code, id) {
14
+ if (!fileRegex.test(id)) {
15
+ return null;
16
+ }
17
+ const ast = this.parse(code);
18
+ if (ast.type !== "Program") {
19
+ return null;
20
+ }
21
+ let hasDirectives = false;
22
+ const directives = /* @__PURE__ */ new Set();
23
+ for (const node of ast.body) {
24
+ if (node.type !== "ExpressionStatement") {
25
+ break;
26
+ }
27
+ if (node.expression.type === "Literal" && typeof node.expression.value === "string" && REACT_DIRECTIVES.has(node.expression.value)) {
28
+ directives.add(node.expression.value);
29
+ hasDirectives = true;
30
+ }
31
+ }
32
+ if (!hasDirectives) return null;
33
+ meta.directives[id] = directives;
34
+ const map = new SourceMapGenerator({
35
+ file: id,
36
+ sourceRoot: ""
37
+ });
38
+ map.setSourceContent(id, code);
39
+ return {
40
+ code,
41
+ map: map.toString(),
42
+ meta: { directives: Array.from(directives) }
43
+ };
44
+ }
45
+ },
46
+ renderChunk(code, chunk) {
47
+ const moduleIds = chunk.moduleIds;
48
+ const chunkDirectives = moduleIds.map((id) => meta.directives[id]).filter((dirs) => !!dirs).reduce((acc, dirs) => {
49
+ dirs.forEach((d) => acc.add(d));
50
+ return acc;
51
+ }, /* @__PURE__ */ new Set());
52
+ if (chunkDirectives.size) {
53
+ const directiveCode = Array.from(chunkDirectives).map((d) => `"${d}";`).join("\n");
54
+ return {
55
+ code: `${directiveCode}
56
+ ${code}`
57
+ };
58
+ }
59
+ return null;
60
+ },
61
+ onLog(level, log) {
62
+ if (log.code === "MODULE_LEVEL_DIRECTIVE" && level === "warn") {
63
+ return false;
64
+ }
65
+ return this.warn(log);
66
+ }
67
+ };
68
+ }
69
+ export {
70
+ preserveDirectives
71
+ };
72
+ //# sourceMappingURL=preserveDirectives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserveDirectives.js","sources":["../../src/transformer/preserveDirectives.ts"],"sourcesContent":["import type { Node } from \"estree\";\nimport type { Plugin } from \"rollup\";\nimport { SourceMapGenerator } from \"source-map\";\nimport { DEFAULT_CONFIG } from \"../options.js\";\nimport type { Options } from \"../types.js\";\n\nconst REACT_DIRECTIVES = new Set([\"use client\", \"use server\", \"use no-memo\"]);\n\ninterface PreserveDirectiveMeta {\n directives: Record<string, Set<string>>;\n}\n\nexport function preserveDirectives(options?: Pick<Options, \"include\">): Plugin {\n const meta: PreserveDirectiveMeta = {\n directives: {},\n };\n const fileRegex = options?.include ?? DEFAULT_CONFIG.FILE_REGEX;\n\n return {\n name: \"react-preserve-directives\",\n transform: {\n order: \"post\",\n handler(code, id) {\n if (!fileRegex.test(id)) {\n return null;\n }\n\n const ast = this.parse(code) as Node;\n if (ast.type !== \"Program\") {\n return null;\n }\n\n let hasDirectives = false;\n const directives = new Set<string>();\n\n // Look for directives at start of file\n for (const node of ast.body) {\n if (node.type !== \"ExpressionStatement\") {\n break;\n }\n\n if (\n node.expression.type === \"Literal\" &&\n typeof node.expression.value === \"string\" &&\n REACT_DIRECTIVES.has(node.expression.value)\n ) {\n directives.add(node.expression.value);\n hasDirectives = true;\n }\n }\n\n if (!hasDirectives) return null;\n\n meta.directives[id] = directives;\n\n // Generate source map\n const map = new SourceMapGenerator({\n file: id,\n sourceRoot: \"\",\n });\n map.setSourceContent(id, code);\n\n return {\n code,\n map: map.toString(),\n meta: { directives: Array.from(directives) },\n };\n },\n },\n\n renderChunk(code, chunk) {\n const moduleIds = chunk.moduleIds;\n const chunkDirectives = moduleIds\n .map((id) => meta.directives[id])\n .filter((dirs): dirs is Set<string> => !!dirs)\n .reduce((acc, dirs) => {\n dirs.forEach((d) => acc.add(d));\n return acc;\n }, new Set<string>());\n\n if (chunkDirectives.size) {\n const directiveCode = Array.from(chunkDirectives)\n .map((d) => `\"${d}\";`)\n .join(\"\\n\");\n return {\n code: `${directiveCode}\\n${code}`,\n };\n }\n\n return null;\n },\n\n onLog(level, log) {\n if (log.code === \"MODULE_LEVEL_DIRECTIVE\" && level === \"warn\") {\n return false;\n }\n return this.warn(log);\n },\n };\n}\n"],"names":[],"mappings":";;AAMA,MAAM,mBAAuB,oBAAA,IAAI,CAAC,cAAc,cAAc,aAAa,CAAC;AAMrE,SAAS,mBAAmB,SAA4C;AAC7E,QAAM,OAA8B;AAAA,IAClC,YAAY,CAAA;AAAA,EACd;AACM,QAAA,YAAgC,eAAe;AAE9C,SAAA;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,MAAM,IAAI;AAChB,YAAI,CAAC,UAAU,KAAK,EAAE,GAAG;AAChB,iBAAA;AAAA,QAAA;AAGH,cAAA,MAAM,KAAK,MAAM,IAAI;AACvB,YAAA,IAAI,SAAS,WAAW;AACnB,iBAAA;AAAA,QAAA;AAGT,YAAI,gBAAgB;AACd,cAAA,iCAAiB,IAAY;AAGxB,mBAAA,QAAQ,IAAI,MAAM;AACvB,cAAA,KAAK,SAAS,uBAAuB;AACvC;AAAA,UAAA;AAGF,cACE,KAAK,WAAW,SAAS,aACzB,OAAO,KAAK,WAAW,UAAU,YACjC,iBAAiB,IAAI,KAAK,WAAW,KAAK,GAC1C;AACW,uBAAA,IAAI,KAAK,WAAW,KAAK;AACpB,4BAAA;AAAA,UAAA;AAAA,QAClB;AAGE,YAAA,CAAC,cAAsB,QAAA;AAEtB,aAAA,WAAW,EAAE,IAAI;AAGhB,cAAA,MAAM,IAAI,mBAAmB;AAAA,UACjC,MAAM;AAAA,UACN,YAAY;AAAA,QAAA,CACb;AACG,YAAA,iBAAiB,IAAI,IAAI;AAEtB,eAAA;AAAA,UACL;AAAA,UACA,KAAK,IAAI,SAAS;AAAA,UAClB,MAAM,EAAE,YAAY,MAAM,KAAK,UAAU,EAAE;AAAA,QAC7C;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEA,YAAY,MAAM,OAAO;AACvB,YAAM,YAAY,MAAM;AAClB,YAAA,kBAAkB,UACrB,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC,EAC/B,OAAO,CAAC,SAA8B,CAAC,CAAC,IAAI,EAC5C,OAAO,CAAC,KAAK,SAAS;AACrB,aAAK,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;AACvB,eAAA;AAAA,MAAA,GACF,oBAAA,IAAA,CAAa;AAEtB,UAAI,gBAAgB,MAAM;AACxB,cAAM,gBAAgB,MAAM,KAAK,eAAe,EAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EACpB,KAAK,IAAI;AACL,eAAA;AAAA,UACL,MAAM,GAAG,aAAa;AAAA,EAAK,IAAI;AAAA,QACjC;AAAA,MAAA;AAGK,aAAA;AAAA,IACT;AAAA,IAEA,MAAM,OAAO,KAAK;AAChB,UAAI,IAAI,SAAS,4BAA4B,UAAU,QAAQ;AACtD,eAAA;AAAA,MAAA;AAEF,aAAA,KAAK,KAAK,GAAG;AAAA,IAAA;AAAA,EAExB;AACF;"}
@@ -0,0 +1,2 @@
1
+ export declare function preserveRSC(chunk: string): string;
2
+ //# sourceMappingURL=preserver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserver.d.ts","sourceRoot":"","sources":["../../src/transformer/preserver.ts"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuCjD"}
@@ -0,0 +1,30 @@
1
+ import type { TransformerOptions } from "./types.js";
2
+ export declare function createRscTransformer(options: TransformerOptions): {
3
+ name: string;
4
+ enforce: "post";
5
+ transform(code: string, path: string, { ssr }: {
6
+ inMap: null | string;
7
+ ssr: boolean;
8
+ }): Promise<{
9
+ code: string;
10
+ map: string;
11
+ } | null>;
12
+ };
13
+ /**
14
+ * transformedCode += `
15
+ const ${exportName}Ref = Object.defineProperties(
16
+ ${
17
+ isClass
18
+ ? `class extends ${exportName} {
19
+ constructor(...args) { super(...args); }
20
+ }`
21
+ : `function(...args) { return ${exportName}.apply(null, args); }`
22
+ },
23
+ {
24
+ $$typeof: { value: Symbol.for("react.client.reference") },
25
+ $$id: { value: ${JSON.stringify(moduleId + "#" + exportName)} }
26
+ }
27
+ );
28
+ export { ${exportName}Ref as ${exportName} };`;
29
+ */
30
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../src/transformer/transformer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB;;;oBAMpD,MAAM,QACN,MAAM,WACH;QAAE,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE;;;;EA6FpD;AAED;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,80 @@
1
+ import { SourceMapGenerator } from "source-map";
2
+ function createRscTransformer(options) {
3
+ return {
4
+ name: "vite:react-stream-transformer",
5
+ enforce: "post",
6
+ async transform(code, path, { ssr }) {
7
+ try {
8
+ let transformedCode = code;
9
+ const directiveMatch = code.match(/^["']use client["'];?/);
10
+ const moduleId = options.moduleId(path, ssr);
11
+ console.log("[RSC Transform] Module path transformation:", {
12
+ original: path,
13
+ transformed: moduleId
14
+ });
15
+ const exportMatches = Array.from(
16
+ code.matchAll(/export\s+(?:const|let|var|function|class)\s+(\w+)/g)
17
+ );
18
+ if (!exportMatches.length) {
19
+ console.warn(`[RSC] No exports found in client component: ${path}`);
20
+ return null;
21
+ }
22
+ for (const [fullMatch, exportName] of exportMatches) {
23
+ if (!exportName) {
24
+ console.warn(`[RSC] Invalid export in client component: ${path}`);
25
+ continue;
26
+ }
27
+ const isClass = fullMatch.includes("class");
28
+ transformedCode = transformedCode.replace(
29
+ fullMatch,
30
+ fullMatch.replace("export ", "")
31
+ );
32
+ if (!directiveMatch || directiveMatch.index !== 0) {
33
+ transformedCode += `
34
+ const ${exportName}Ref = Object.defineProperties(
35
+ ${isClass ? `class extends ${exportName} {
36
+ constructor(...args) { super(...args); }
37
+ }` : `function(...args) { return ${exportName}.apply(null, args); }`},
38
+ {
39
+ $$typeof: { value: Symbol.for("react.server.reference") },
40
+ $$id: { value: ${JSON.stringify(moduleId + "#" + exportName)} },
41
+ $$filepath: { value: ${JSON.stringify(path)} },
42
+ $$async: { value: true }
43
+ }
44
+ );
45
+ export { ${exportName}Ref as ${exportName} };
46
+ `;
47
+ } else {
48
+ transformedCode += `
49
+ const ${exportName}Ref = Object.defineProperties(
50
+ ${isClass ? `class extends ${exportName} {
51
+ constructor(...args) { super(...args); }
52
+ }` : `function(...args) { return ${exportName}.apply(null, args); }`},
53
+ {
54
+ $$typeof: { value: Symbol.for("react.client.reference") },
55
+ $$id: { value: ${JSON.stringify(moduleId + "#" + exportName)} },
56
+ $$filepath: { value: ${JSON.stringify(path)} }
57
+ }
58
+ );
59
+ export { ${exportName}Ref as ${exportName} };
60
+ `;
61
+ }
62
+ }
63
+ return {
64
+ code: transformedCode,
65
+ map: new SourceMapGenerator({ file: path }).toString()
66
+ };
67
+ } catch (error) {
68
+ console.error(
69
+ `[RSC] Error transforming client component: ${path}`,
70
+ error
71
+ );
72
+ throw error;
73
+ }
74
+ }
75
+ };
76
+ }
77
+ export {
78
+ createRscTransformer
79
+ };
80
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../src/transformer/transformer.ts"],"sourcesContent":["import { SourceMapGenerator } from \"source-map\";\nimport type { TransformerOptions } from \"./types.js\";\n\nexport function createRscTransformer(options: TransformerOptions) {\n return {\n name: \"vite:react-stream-transformer\",\n enforce: \"post\" as const,\n\n async transform(\n code: string,\n path: string,\n { ssr }: { inMap: null | string; ssr: boolean }\n ) {\n try {\n let transformedCode = code;\n const directiveMatch = code.match(/^[\"']use client[\"'];?/);\n const moduleId = options.moduleId(path, ssr);\n\n // Log the path transformation\n console.log(\"[RSC Transform] Module path transformation:\", {\n original: path,\n transformed: moduleId,\n });\n\n // Find all named exports\n const exportMatches = Array.from(\n code.matchAll(/export\\s+(?:const|let|var|function|class)\\s+(\\w+)/g)\n );\n\n if (!exportMatches.length) {\n console.warn(`[RSC] No exports found in client component: ${path}`);\n return null;\n }\n\n // Transform each export\n for (const [fullMatch, exportName] of exportMatches) {\n if (!exportName) {\n console.warn(`[RSC] Invalid export in client component: ${path}`);\n continue;\n }\n\n const isClass = fullMatch.includes(\"class\");\n\n // Remove export keyword\n transformedCode = transformedCode.replace(\n fullMatch,\n fullMatch.replace(\"export \", \"\")\n );\n\n if (!directiveMatch || directiveMatch.index !== 0) {\n // Server component\n transformedCode += `\nconst ${exportName}Ref = Object.defineProperties(\n ${\n isClass\n ? `class extends ${exportName} {\n constructor(...args) { super(...args); }\n }`\n : `function(...args) { return ${exportName}.apply(null, args); }`\n },\n {\n $$typeof: { value: Symbol.for(\"react.server.reference\") },\n $$id: { value: ${JSON.stringify(moduleId + \"#\" + exportName)} },\n $$filepath: { value: ${JSON.stringify(path)} },\n $$async: { value: true }\n }\n);\nexport { ${exportName}Ref as ${exportName} };\n`;\n } else {\n // Client component\n transformedCode += `\nconst ${exportName}Ref = Object.defineProperties(\n ${\n isClass\n ? `class extends ${exportName} {\n constructor(...args) { super(...args); }\n }`\n : `function(...args) { return ${exportName}.apply(null, args); }`\n },\n {\n $$typeof: { value: Symbol.for(\"react.client.reference\") },\n $$id: { value: ${JSON.stringify(moduleId + \"#\" + exportName)} },\n $$filepath: { value: ${JSON.stringify(path)} }\n }\n);\nexport { ${exportName}Ref as ${exportName} };\n`;\n }\n }\n\n return {\n code: transformedCode,\n map: new SourceMapGenerator({ file: path }).toString(),\n };\n } catch (error) {\n console.error(\n `[RSC] Error transforming client component: ${path}`,\n error\n );\n throw error;\n }\n },\n };\n}\n\n/**\n * transformedCode += `\nconst ${exportName}Ref = Object.defineProperties(\n ${\n isClass\n ? `class extends ${exportName} {\n constructor(...args) { super(...args); }\n }`\n : `function(...args) { return ${exportName}.apply(null, args); }`\n },\n {\n $$typeof: { value: Symbol.for(\"react.client.reference\") },\n $$id: { value: ${JSON.stringify(moduleId + \"#\" + exportName)} }\n }\n);\nexport { ${exportName}Ref as ${exportName} };`;\n */\n"],"names":[],"mappings":";AAGO,SAAS,qBAAqB,SAA6B;AACzD,SAAA;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,MAAM,UACJ,MACA,MACA,EAAE,OACF;AACI,UAAA;AACF,YAAI,kBAAkB;AAChB,cAAA,iBAAiB,KAAK,MAAM,uBAAuB;AACzD,cAAM,WAAW,QAAQ,SAAS,MAAM,GAAG;AAG3C,gBAAQ,IAAI,+CAA+C;AAAA,UACzD,UAAU;AAAA,UACV,aAAa;AAAA,QAAA,CACd;AAGD,cAAM,gBAAgB,MAAM;AAAA,UAC1B,KAAK,SAAS,oDAAoD;AAAA,QACpE;AAEI,YAAA,CAAC,cAAc,QAAQ;AACjB,kBAAA,KAAK,+CAA+C,IAAI,EAAE;AAC3D,iBAAA;AAAA,QAAA;AAIT,mBAAW,CAAC,WAAW,UAAU,KAAK,eAAe;AACnD,cAAI,CAAC,YAAY;AACP,oBAAA,KAAK,6CAA6C,IAAI,EAAE;AAChE;AAAA,UAAA;AAGI,gBAAA,UAAU,UAAU,SAAS,OAAO;AAG1C,4BAAkB,gBAAgB;AAAA,YAChC;AAAA,YACA,UAAU,QAAQ,WAAW,EAAE;AAAA,UACjC;AAEA,cAAI,CAAC,kBAAkB,eAAe,UAAU,GAAG;AAE9B,+BAAA;AAAA,QACvB,UAAU;AAAA,IAEd,UACI,iBAAiB,UAAU;AAAA;AAAA,aAG3B,8BAA8B,UAAU,uBAC9C;AAAA;AAAA;AAAA,qBAGmB,KAAK,UAAU,WAAW,MAAM,UAAU,CAAC;AAAA,2BACrC,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,WAIpC,UAAU,UAAU,UAAU;AAAA;AAAA,UAAA,OAExB;AAEc,+BAAA;AAAA,QACvB,UAAU;AAAA,IAEd,UACI,iBAAiB,UAAU;AAAA;AAAA,aAG3B,8BAA8B,UAAU,uBAC9C;AAAA;AAAA;AAAA,qBAGmB,KAAK,UAAU,WAAW,MAAM,UAAU,CAAC;AAAA,2BACrC,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA;AAAA,WAGpC,UAAU,UAAU,UAAU;AAAA;AAAA,UAAA;AAAA,QAE/B;AAGK,eAAA;AAAA,UACL,MAAM;AAAA,UACN,KAAK,IAAI,mBAAmB,EAAE,MAAM,KAAK,CAAC,EAAE,SAAS;AAAA,QACvD;AAAA,eACO,OAAO;AACN,gBAAA;AAAA,UACN,8CAA8C,IAAI;AAAA,UAClD;AAAA,QACF;AACM,cAAA;AAAA,MAAA;AAAA,IACR;AAAA,EAEJ;AACF;"}
@@ -0,0 +1,15 @@
1
+ export interface ViteReactClientTransformOptions {
2
+ projectRoot?: string;
3
+ moduleId?: (path: string, ssr: boolean) => string;
4
+ validateModuleId?: (moduleId: string) => boolean;
5
+ include?: string | RegExp | (string | RegExp)[];
6
+ exclude?: string | RegExp | (string | RegExp)[];
7
+ }
8
+ export interface TransformerOptions {
9
+ moduleId: (path: string, ssr: boolean) => string;
10
+ /**
11
+ * Optional validation function for module IDs
12
+ */
13
+ validateModuleId?: (moduleId: string) => boolean;
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transformer/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAClD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IACjD;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD"}
@@ -0,0 +1,197 @@
1
+ import type { AliasOptions, Connect, Logger, Manifest, ModuleGraph, ViteDevServer } from "vite";
2
+ export interface StreamPluginOptionsClient {
3
+ outDir?: string;
4
+ build?: BuildConfig;
5
+ assetsDir?: string;
6
+ projectRoot?: string;
7
+ moduleBase?: string;
8
+ moduleBasePath?: string;
9
+ moduleBaseURL?: string;
10
+ clientComponents?: AliasOptions;
11
+ cssFiles?: AliasOptions;
12
+ }
13
+ export type ResolvedUserOptions = Required<Pick<StreamPluginOptions, "moduleBase" | "moduleBasePath" | "moduleBaseURL" | "projectRoot" | "build" | "Page" | "props" | "Html" | "pageExportName" | "propsExportName" | "collectCss" | "collectAssets" | "assetsDir">> & {
14
+ build: NonNullable<Required<StreamPluginOptions["build"]>>;
15
+ };
16
+ export interface StreamPluginOptions {
17
+ projectRoot?: string;
18
+ assetsDir?: string;
19
+ moduleBase?: string;
20
+ moduleBasePath?: string;
21
+ moduleBaseURL?: string;
22
+ clientEntry?: string;
23
+ serverOutDir?: string;
24
+ clientOutDir?: string;
25
+ autoDiscover?: {
26
+ pagePattern?: string;
27
+ propsPattern?: string;
28
+ };
29
+ Page: string | ((url: string) => string);
30
+ props?: undefined | string | ((url: string) => string);
31
+ workerPath?: string;
32
+ loaderPath?: string;
33
+ pageExportName?: string;
34
+ propsExportName?: string;
35
+ Html?: React.FC<{
36
+ manifest: Manifest;
37
+ pageProps: any;
38
+ route: string;
39
+ url: string;
40
+ children: React.ReactNode;
41
+ }>;
42
+ collectCss?: boolean;
43
+ collectAssets?: boolean;
44
+ build?: BuildConfig;
45
+ }
46
+ export interface CreateHandlerOptions<T = any> {
47
+ loader: (id: string) => Promise<T>;
48
+ manifest?: Manifest;
49
+ moduleGraph?: ModuleGraph;
50
+ cssFiles?: string[];
51
+ onCssFile?: (path: string) => void;
52
+ logger?: Logger;
53
+ pipableStreamOptions?: any;
54
+ }
55
+ export type ModuleLoader = (url: string, context?: any, defaultLoad?: any) => Promise<Record<string, any>>;
56
+ export interface BaseProps {
57
+ manifest: Manifest;
58
+ children?: React.ReactNode;
59
+ assets?: {
60
+ css?: string[];
61
+ };
62
+ }
63
+ export type StreamResult = {
64
+ type: "success";
65
+ stream: any;
66
+ assets?: {
67
+ css?: string[];
68
+ };
69
+ } | {
70
+ type: "error";
71
+ error: unknown;
72
+ } | {
73
+ type: "skip";
74
+ };
75
+ export interface RscStreamOptions {
76
+ Page: React.ComponentType;
77
+ props: any;
78
+ Html: any;
79
+ logger?: Console | Logger;
80
+ cssFiles?: string[];
81
+ route: string;
82
+ url: string;
83
+ pipableStreamOptions?: any;
84
+ moduleBasePath: string;
85
+ }
86
+ export interface RouteConfig {
87
+ path: string;
88
+ pattern?: {
89
+ page?: string;
90
+ props?: string;
91
+ };
92
+ paths?: {
93
+ page: string;
94
+ props: string;
95
+ };
96
+ }
97
+ export interface BuildOutput {
98
+ dir?: string;
99
+ rsc?: string;
100
+ ext?: string;
101
+ }
102
+ export interface BuildConfig {
103
+ pages: string[] | (() => Promise<string[]> | string[]);
104
+ client?: string;
105
+ server?: string;
106
+ }
107
+ export interface RscResolver {
108
+ /**
109
+ * Get RSC data for static generation
110
+ * @param path - Route path (e.g. "/", "/about")
111
+ */
112
+ getRscData: (path: string) => Promise<{
113
+ Page: React.ComponentType;
114
+ props: any;
115
+ }>;
116
+ }
117
+ export interface Options {
118
+ include?: RegExp;
119
+ projectRoot?: string;
120
+ moduleBase: string;
121
+ moduleBasePath?: string;
122
+ Html?: React.ComponentType<React.PropsWithChildren<{
123
+ manifest: Manifest;
124
+ }>>;
125
+ Page: string | ((url: string) => string);
126
+ props?: string | ((url: string) => string);
127
+ pageExportName?: string;
128
+ propsExportName?: string;
129
+ collectCss?: boolean;
130
+ collectAssets?: boolean;
131
+ emitCss?: boolean;
132
+ moduleLoader?: (server: ViteDevServer) => ModuleLoader;
133
+ build?: BuildConfig;
134
+ outDir?: string;
135
+ /**
136
+ * Configure static asset copying
137
+ * - true: Copy all assets
138
+ * - false: Don't copy assets
139
+ * - Function: Custom filter for which files to copy
140
+ */
141
+ copyAssets?: boolean | ((file: string) => boolean);
142
+ }
143
+ export type RequestHandler = Connect.NextHandleFunction;
144
+ export interface SsrStreamOptions {
145
+ url: string;
146
+ controller: AbortController;
147
+ loader: (id: string) => Promise<any>;
148
+ Html: any;
149
+ options: StreamPluginOptions;
150
+ pageExportName: string;
151
+ propsExportName: string;
152
+ moduleGraph: any;
153
+ bootstrapModules?: string[];
154
+ importMap?: Record<string, string[]>;
155
+ clientComponents?: boolean;
156
+ onlyClientComponents?: boolean;
157
+ }
158
+ export type RscServerConfig = {
159
+ /** How to get RSC data (e.g. HTTP, direct import, etc) */
160
+ getRscComponent: (url: string) => React.Usable<React.ReactNode>;
161
+ /** Base URL for client assets */
162
+ clientBase?: string;
163
+ /** SSR stream rendering options */
164
+ ssrOptions?: SsrStreamOptions;
165
+ };
166
+ export interface RscServerModule {
167
+ /**
168
+ * Get RSC data for a route
169
+ * @param path - Route path (e.g. "/", "/about")
170
+ * @returns Page component and props
171
+ */
172
+ getRscData: (path: string) => Promise<{
173
+ /** Page component to render */
174
+ Page: React.ComponentType;
175
+ /** Props to pass to the page */
176
+ props: any;
177
+ }>;
178
+ }
179
+ export interface RegisterComponentMessage {
180
+ type: "REGISTER_COMPONENT";
181
+ id: string;
182
+ code: string;
183
+ }
184
+ export type RscBuildResult = string[];
185
+ export interface ReactStreamPluginMeta {
186
+ timing: BuildTiming;
187
+ }
188
+ export interface BuildTiming {
189
+ start: number;
190
+ configResolved?: number;
191
+ buildStart?: number;
192
+ buildEnd?: number;
193
+ renderStart?: number;
194
+ renderEnd?: number;
195
+ total?: number;
196
+ }
197
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Writable } from "node:stream";
2
+ import type { RenderState } from "./types.js";
3
+ export declare function createHtmlStream(renderState: RenderState, writeStream: Writable): {
4
+ stream: import("react-dom/server").PipeableStream;
5
+ writeStream: Writable;
6
+ };
7
+ //# sourceMappingURL=createHtmlStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHtmlStream.d.ts","sourceRoot":"","sources":["../../src/worker/createHtmlStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAS9C,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,QAAQ;;;EA2DtB"}
@@ -0,0 +1,3 @@
1
+ import { Worker } from "node:worker_threads";
2
+ export declare function createWorker(projectRoot: string, outDir: string, fileName: string, mode: "production" | "development"): Promise<Worker>;
3
+ //# sourceMappingURL=createWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorker.d.ts","sourceRoot":"","sources":["../../src/worker/createWorker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,YAAY,GAAG,aAAa,mBA+BnC"}
@@ -0,0 +1,33 @@
1
+ import { resolve } from "node:path";
2
+ import { Worker } from "node:worker_threads";
3
+ async function createWorker(projectRoot, outDir, fileName, mode) {
4
+ console.log("[Worker] Creating worker...");
5
+ const workerPath = resolve(projectRoot, outDir, fileName);
6
+ console.log("[Worker] Worker path:", workerPath);
7
+ try {
8
+ const worker = new Worker(workerPath, {
9
+ env: {
10
+ NODE_OPTIONS: "",
11
+ NODE_PATH: resolve(projectRoot, "node_modules"),
12
+ NODE_ENV: mode
13
+ }
14
+ });
15
+ worker.setMaxListeners(1e3);
16
+ await new Promise((resolve2, reject) => {
17
+ worker.once("message", (message) => {
18
+ if (message.type === "READY") {
19
+ resolve2();
20
+ }
21
+ });
22
+ worker.once("error", reject);
23
+ });
24
+ return worker;
25
+ } catch (error) {
26
+ console.error("[Worker] Startup error:", error);
27
+ throw error;
28
+ }
29
+ }
30
+ export {
31
+ createWorker
32
+ };
33
+ //# sourceMappingURL=createWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorker.js","sources":["../../src/worker/createWorker.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\n\nexport async function createWorker(\n projectRoot: string,\n outDir: string,\n fileName: string,\n mode: \"production\" | \"development\"\n) {\n console.log(\"[Worker] Creating worker...\");\n const workerPath = resolve(projectRoot, outDir, fileName);\n console.log(\"[Worker] Worker path:\", workerPath);\n\n try {\n const worker = new Worker(workerPath, {\n env: {\n NODE_OPTIONS: \"\",\n NODE_PATH: resolve(projectRoot, \"node_modules\"),\n NODE_ENV: mode,\n },\n });\n worker.setMaxListeners(1000);\n\n // Wait for worker to be ready\n await new Promise<void>((resolve, reject) => {\n worker.once(\"message\", (message) => {\n if (message.type === \"READY\") {\n resolve();\n }\n });\n worker.once(\"error\", reject);\n });\n\n return worker;\n } catch (error) {\n console.error(\"[Worker] Startup error:\", error);\n throw error;\n }\n}\n"],"names":["resolve"],"mappings":";;AAGA,eAAsB,aACpB,aACA,QACA,UACA,MACA;AACA,UAAQ,IAAI,6BAA6B;AACzC,QAAM,aAAa,QAAQ,aAAa,QAAQ,QAAQ;AAChD,UAAA,IAAI,yBAAyB,UAAU;AAE3C,MAAA;AACI,UAAA,SAAS,IAAI,OAAO,YAAY;AAAA,MACpC,KAAK;AAAA,QACH,cAAc;AAAA,QACd,WAAW,QAAQ,aAAa,cAAc;AAAA,QAC9C,UAAU;AAAA,MAAA;AAAA,IACZ,CACD;AACD,WAAO,gBAAgB,GAAI;AAG3B,UAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AACpC,aAAA,KAAK,WAAW,CAAC,YAAY;AAC9B,YAAA,QAAQ,SAAS,SAAS;AAC5BA,mBAAQ;AAAA,QAAA;AAAA,MACV,CACD;AACM,aAAA,KAAK,SAAS,MAAM;AAAA,IAAA,CAC5B;AAEM,WAAA;AAAA,WACA,OAAO;AACN,YAAA,MAAM,2BAA2B,KAAK;AACxC,UAAA;AAAA,EAAA;AAEV;"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Extension point for custom module loading in the worker thread.
3
+ * This file can be overridden via the plugin options:
4
+ *
5
+ * ```ts
6
+ * reactStreamPlugin({
7
+ * loaderPath: './my-custom-loader.ts'
8
+ * })
9
+ * ```
10
+ *
11
+ * The default loader provides basic module loading functionality.
12
+ * Override this if you need custom module resolution or transformation.
13
+ */
14
+ export declare function load(id: string): Promise<any>;
15
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/worker/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,gBAE9B"}
@@ -0,0 +1,18 @@
1
+ import type { Worker } from "node:worker_threads";
2
+ import type { PipeableStreamOptions } from "react-dom/server.node";
3
+ import type { StreamPluginOptions } from "../types.js";
4
+ type RenderPagesOptions = {
5
+ pluginOptions: Required<Pick<StreamPluginOptions, "moduleBase" | "moduleBasePath" | "moduleBaseURL" | "projectRoot">> & Pick<StreamPluginOptions, "Page" | "props" | "build" | "Html" | "pageExportName" | "propsExportName">;
6
+ outDir: string;
7
+ manifest: Record<string, {
8
+ file: string;
9
+ }>;
10
+ worker: Worker;
11
+ pipableStreamOptions?: PipeableStreamOptions;
12
+ loader: (id: string) => Promise<Record<string, any>>;
13
+ onCssFile?: (path: string) => void;
14
+ clientCss?: string[];
15
+ };
16
+ export declare function renderPages(routes: string[], options: RenderPagesOptions): Promise<void>;
17
+ export {};
18
+ //# sourceMappingURL=renderPages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderPages.d.ts","sourceRoot":"","sources":["../../src/worker/renderPages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAMvD,KAAK,kBAAkB,GAAG;IACxB,aAAa,EAAE,QAAQ,CACrB,IAAI,CACF,mBAAmB,EACnB,YAAY,GAAG,gBAAgB,GAAG,eAAe,GAAG,aAAa,CAClE,CACF,GACC,IAAI,CACF,mBAAmB,EACnB,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,gBAAgB,GAAG,iBAAiB,CAC3E,CAAC;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,kBAAkB,iBA8G5B"}