@tanstack/start-plugin-core 1.167.35 → 1.169.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 (187) hide show
  1. package/dist/esm/import-protection/adapterUtils.d.ts +27 -0
  2. package/dist/esm/import-protection/adapterUtils.js +31 -0
  3. package/dist/esm/import-protection/adapterUtils.js.map +1 -0
  4. package/dist/esm/import-protection/analysis.d.ts +36 -0
  5. package/dist/esm/import-protection/analysis.js +407 -0
  6. package/dist/esm/import-protection/analysis.js.map +1 -0
  7. package/dist/esm/{import-protection-plugin → import-protection}/ast.js +1 -1
  8. package/dist/esm/import-protection/ast.js.map +1 -0
  9. package/dist/esm/import-protection/constants.d.ts +11 -0
  10. package/dist/esm/{import-protection-plugin → import-protection}/constants.js +7 -2
  11. package/dist/esm/import-protection/constants.js.map +1 -0
  12. package/dist/esm/{import-protection-plugin → import-protection}/defaults.js +1 -1
  13. package/dist/esm/import-protection/defaults.js.map +1 -0
  14. package/dist/esm/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.js +2 -2
  15. package/dist/esm/import-protection/extensionlessAbsoluteIdResolver.js.map +1 -0
  16. package/dist/esm/{import-protection-plugin → import-protection}/matchers.js +1 -1
  17. package/dist/esm/import-protection/matchers.js.map +1 -0
  18. package/dist/esm/{import-protection-plugin/rewriteDeniedImports.d.ts → import-protection/rewrite.d.ts} +0 -4
  19. package/dist/esm/import-protection/rewrite.js +121 -0
  20. package/dist/esm/import-protection/rewrite.js.map +1 -0
  21. package/dist/esm/{import-protection-plugin → import-protection}/sourceLocation.d.ts +32 -3
  22. package/dist/esm/{import-protection-plugin → import-protection}/sourceLocation.js +65 -10
  23. package/dist/esm/import-protection/sourceLocation.js.map +1 -0
  24. package/dist/esm/{import-protection-plugin → import-protection}/trace.d.ts +0 -1
  25. package/dist/esm/{import-protection-plugin → import-protection}/trace.js +1 -1
  26. package/dist/esm/import-protection/trace.js.map +1 -0
  27. package/dist/esm/{import-protection-plugin → import-protection}/utils.d.ts +18 -1
  28. package/dist/esm/{import-protection-plugin → import-protection}/utils.js +13 -20
  29. package/dist/esm/import-protection/utils.js.map +1 -0
  30. package/dist/esm/import-protection/virtualModules.d.ts +25 -0
  31. package/dist/esm/{import-protection-plugin → import-protection}/virtualModules.js +5 -117
  32. package/dist/esm/import-protection/virtualModules.js.map +1 -0
  33. package/dist/esm/index.d.ts +1 -5
  34. package/dist/esm/index.js +2 -4
  35. package/dist/esm/post-build.d.ts +9 -0
  36. package/dist/esm/post-build.js +37 -0
  37. package/dist/esm/post-build.js.map +1 -0
  38. package/dist/esm/prerender.d.ts +11 -0
  39. package/dist/esm/prerender.js +159 -0
  40. package/dist/esm/prerender.js.map +1 -0
  41. package/dist/esm/rsbuild/dev-server.d.ts +21 -0
  42. package/dist/esm/rsbuild/dev-server.js +76 -0
  43. package/dist/esm/rsbuild/dev-server.js.map +1 -0
  44. package/dist/esm/rsbuild/import-protection.d.ts +10 -0
  45. package/dist/esm/rsbuild/import-protection.js +775 -0
  46. package/dist/esm/rsbuild/import-protection.js.map +1 -0
  47. package/dist/esm/rsbuild/index.d.ts +4 -0
  48. package/dist/esm/rsbuild/index.js +3 -0
  49. package/dist/esm/rsbuild/normalized-client-build.d.ts +18 -0
  50. package/dist/esm/rsbuild/normalized-client-build.js +207 -0
  51. package/dist/esm/rsbuild/normalized-client-build.js.map +1 -0
  52. package/dist/esm/rsbuild/planning.d.ts +52 -0
  53. package/dist/esm/rsbuild/planning.js +108 -0
  54. package/dist/esm/rsbuild/planning.js.map +1 -0
  55. package/dist/esm/rsbuild/plugin.d.ts +4 -0
  56. package/dist/esm/rsbuild/plugin.js +344 -0
  57. package/dist/esm/rsbuild/plugin.js.map +1 -0
  58. package/dist/esm/rsbuild/post-build.d.ts +6 -0
  59. package/dist/esm/rsbuild/post-build.js +57 -0
  60. package/dist/esm/rsbuild/post-build.js.map +1 -0
  61. package/dist/esm/rsbuild/schema.d.ts +3372 -0
  62. package/dist/esm/rsbuild/schema.js +12 -0
  63. package/dist/esm/rsbuild/schema.js.map +1 -0
  64. package/dist/esm/rsbuild/start-compiler-host.d.ts +20 -0
  65. package/dist/esm/rsbuild/start-compiler-host.js +150 -0
  66. package/dist/esm/rsbuild/start-compiler-host.js.map +1 -0
  67. package/dist/esm/rsbuild/start-router-plugin.d.ts +18 -0
  68. package/dist/esm/rsbuild/start-router-plugin.js +63 -0
  69. package/dist/esm/rsbuild/start-router-plugin.js.map +1 -0
  70. package/dist/esm/rsbuild/swc-rsc.d.ts +14 -0
  71. package/dist/esm/rsbuild/swc-rsc.js +93 -0
  72. package/dist/esm/rsbuild/swc-rsc.js.map +1 -0
  73. package/dist/esm/rsbuild/types.d.ts +17 -0
  74. package/dist/esm/rsbuild/types.js +0 -0
  75. package/dist/esm/rsbuild/virtual-modules.d.ts +53 -0
  76. package/dist/esm/rsbuild/virtual-modules.js +287 -0
  77. package/dist/esm/rsbuild/virtual-modules.js.map +1 -0
  78. package/dist/esm/schema.d.ts +43 -43
  79. package/dist/esm/start-compiler/compiler.d.ts +1 -1
  80. package/dist/esm/start-compiler/compiler.js +80 -9
  81. package/dist/esm/start-compiler/compiler.js.map +1 -1
  82. package/dist/esm/start-compiler/handleCreateServerFn.js +9 -0
  83. package/dist/esm/start-compiler/handleCreateServerFn.js.map +1 -1
  84. package/dist/esm/start-compiler/host.js +5 -1
  85. package/dist/esm/start-compiler/host.js.map +1 -1
  86. package/dist/esm/start-compiler/types.d.ts +1 -0
  87. package/dist/esm/utils.d.ts +1 -0
  88. package/dist/esm/utils.js +10 -1
  89. package/dist/esm/utils.js.map +1 -1
  90. package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/plugin.js +41 -92
  91. package/dist/esm/vite/import-protection-plugin/plugin.js.map +1 -0
  92. package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/types.d.ts +5 -5
  93. package/dist/esm/vite/import-protection-plugin/virtualModules.d.ts +8 -0
  94. package/dist/esm/vite/import-protection-plugin/virtualModules.js +49 -0
  95. package/dist/esm/vite/import-protection-plugin/virtualModules.js.map +1 -0
  96. package/dist/esm/vite/index.d.ts +5 -0
  97. package/dist/esm/vite/index.js +4 -0
  98. package/dist/esm/vite/plugin.js +1 -1
  99. package/dist/esm/vite/plugin.js.map +1 -1
  100. package/dist/esm/vite/post-server-build.js +14 -32
  101. package/dist/esm/vite/post-server-build.js.map +1 -1
  102. package/dist/esm/vite/prerender.d.ts +2 -2
  103. package/dist/esm/vite/prerender.js +17 -147
  104. package/dist/esm/vite/prerender.js.map +1 -1
  105. package/dist/esm/vite/schema.d.ts +23 -23
  106. package/dist/esm/vite/start-compiler-plugin/hot-update.d.ts +2 -0
  107. package/dist/esm/vite/start-compiler-plugin/hot-update.js +16 -0
  108. package/dist/esm/vite/start-compiler-plugin/hot-update.js.map +1 -0
  109. package/dist/esm/vite/start-compiler-plugin/module-specifier.js +9 -4
  110. package/dist/esm/vite/start-compiler-plugin/module-specifier.js.map +1 -1
  111. package/dist/esm/vite/start-compiler-plugin/plugin.js +86 -13
  112. package/dist/esm/vite/start-compiler-plugin/plugin.js.map +1 -1
  113. package/package.json +32 -4
  114. package/src/import-protection/INTERNALS.md +266 -0
  115. package/src/import-protection/adapterUtils.ts +94 -0
  116. package/src/import-protection/analysis.ts +853 -0
  117. package/src/{import-protection-plugin → import-protection}/constants.ts +7 -0
  118. package/src/import-protection/rewrite.ts +229 -0
  119. package/src/{import-protection-plugin → import-protection}/sourceLocation.ts +125 -9
  120. package/src/{import-protection-plugin → import-protection}/trace.ts +0 -1
  121. package/src/{import-protection-plugin → import-protection}/utils.ts +36 -21
  122. package/src/{import-protection-plugin → import-protection}/virtualModules.ts +30 -177
  123. package/src/index.ts +1 -8
  124. package/src/post-build.ts +64 -0
  125. package/src/prerender.ts +292 -0
  126. package/src/rsbuild/INTERNALS-import-protection.md +169 -0
  127. package/src/rsbuild/dev-server.ts +129 -0
  128. package/src/rsbuild/import-protection.ts +1599 -0
  129. package/src/rsbuild/index.ts +4 -0
  130. package/src/rsbuild/normalized-client-build.ts +346 -0
  131. package/src/rsbuild/planning.ts +234 -0
  132. package/src/rsbuild/plugin.ts +754 -0
  133. package/src/rsbuild/post-build.ts +96 -0
  134. package/src/rsbuild/schema.ts +31 -0
  135. package/src/rsbuild/start-compiler-host.ts +250 -0
  136. package/src/rsbuild/start-router-plugin.ts +86 -0
  137. package/src/rsbuild/swc-rsc.ts +166 -0
  138. package/src/rsbuild/types.ts +20 -0
  139. package/src/rsbuild/virtual-modules.ts +565 -0
  140. package/src/start-compiler/compiler.ts +153 -19
  141. package/src/start-compiler/handleCreateServerFn.ts +18 -0
  142. package/src/start-compiler/types.ts +1 -0
  143. package/src/utils.ts +14 -0
  144. package/src/vite/import-protection-plugin/INTERNALS.md +187 -0
  145. package/src/{import-protection-plugin → vite/import-protection-plugin}/plugin.ts +73 -158
  146. package/src/{import-protection-plugin → vite/import-protection-plugin}/types.ts +5 -5
  147. package/src/vite/import-protection-plugin/virtualModules.ts +122 -0
  148. package/src/vite/index.ts +8 -0
  149. package/src/vite/plugin.ts +1 -1
  150. package/src/vite/post-server-build.ts +14 -57
  151. package/src/vite/prerender.ts +19 -260
  152. package/src/vite/start-compiler-plugin/hot-update.ts +24 -0
  153. package/src/vite/start-compiler-plugin/module-specifier.ts +15 -5
  154. package/src/vite/start-compiler-plugin/plugin.ts +193 -18
  155. package/dist/esm/import-protection-plugin/ast.js.map +0 -1
  156. package/dist/esm/import-protection-plugin/constants.d.ts +0 -6
  157. package/dist/esm/import-protection-plugin/constants.js.map +0 -1
  158. package/dist/esm/import-protection-plugin/defaults.js.map +0 -1
  159. package/dist/esm/import-protection-plugin/extensionlessAbsoluteIdResolver.js.map +0 -1
  160. package/dist/esm/import-protection-plugin/matchers.js.map +0 -1
  161. package/dist/esm/import-protection-plugin/plugin.js.map +0 -1
  162. package/dist/esm/import-protection-plugin/postCompileUsage.d.ts +0 -13
  163. package/dist/esm/import-protection-plugin/postCompileUsage.js +0 -63
  164. package/dist/esm/import-protection-plugin/postCompileUsage.js.map +0 -1
  165. package/dist/esm/import-protection-plugin/rewriteDeniedImports.js +0 -205
  166. package/dist/esm/import-protection-plugin/rewriteDeniedImports.js.map +0 -1
  167. package/dist/esm/import-protection-plugin/sourceLocation.js.map +0 -1
  168. package/dist/esm/import-protection-plugin/trace.js.map +0 -1
  169. package/dist/esm/import-protection-plugin/utils.js.map +0 -1
  170. package/dist/esm/import-protection-plugin/virtualModules.d.ts +0 -78
  171. package/dist/esm/import-protection-plugin/virtualModules.js.map +0 -1
  172. package/dist/esm/start-compiler/load-module.d.ts +0 -14
  173. package/dist/esm/start-compiler/load-module.js +0 -18
  174. package/dist/esm/start-compiler/load-module.js.map +0 -1
  175. package/src/import-protection-plugin/INTERNALS.md +0 -700
  176. package/src/import-protection-plugin/postCompileUsage.ts +0 -100
  177. package/src/import-protection-plugin/rewriteDeniedImports.ts +0 -379
  178. package/src/start-compiler/load-module.ts +0 -31
  179. /package/dist/esm/{import-protection-plugin → import-protection}/ast.d.ts +0 -0
  180. /package/dist/esm/{import-protection-plugin → import-protection}/defaults.d.ts +0 -0
  181. /package/dist/esm/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.d.ts +0 -0
  182. /package/dist/esm/{import-protection-plugin → import-protection}/matchers.d.ts +0 -0
  183. /package/dist/esm/{import-protection-plugin → vite/import-protection-plugin}/plugin.d.ts +0 -0
  184. /package/src/{import-protection-plugin → import-protection}/ast.ts +0 -0
  185. /package/src/{import-protection-plugin → import-protection}/defaults.ts +0 -0
  186. /package/src/{import-protection-plugin → import-protection}/extensionlessAbsoluteIdResolver.ts +0 -0
  187. /package/src/{import-protection-plugin → import-protection}/matchers.ts +0 -0
@@ -0,0 +1,8 @@
1
+ import { MARKER_PREFIX, MOCK_BUILD_PREFIX, MOCK_EDGE_PREFIX, MOCK_MODULE_ID, MOCK_RUNTIME_PREFIX, RUNTIME_SUGGESTION_TEXT, generateDevSelfDenialModule, generateSelfContainedMockModule, loadMarkerModule, loadMockEdgeModule, loadMockRuntimeModule, loadSilentMockModule, makeMockEdgeModuleId, mockRuntimeModuleIdFromViolation } from '../../import-protection/virtualModules.js';
2
+ export declare function resolvedMarkerVirtualModuleId(kind: 'server' | 'client'): string;
3
+ export declare function getResolvedVirtualModuleMatchers(): ReadonlyArray<string>;
4
+ export declare function resolveInternalVirtualModuleId(source: string): string | undefined;
5
+ export declare function loadResolvedVirtualModule(id: string): {
6
+ code: string;
7
+ } | undefined;
8
+ export { MARKER_PREFIX, MOCK_BUILD_PREFIX, MOCK_EDGE_PREFIX, MOCK_MODULE_ID, MOCK_RUNTIME_PREFIX, RUNTIME_SUGGESTION_TEXT, generateDevSelfDenialModule, generateSelfContainedMockModule, loadMarkerModule, loadMockEdgeModule, loadMockRuntimeModule, loadSilentMockModule, makeMockEdgeModuleId, mockRuntimeModuleIdFromViolation, };
@@ -0,0 +1,49 @@
1
+ import { resolveViteId } from "../../utils.js";
2
+ import { MARKER_PREFIX, MOCK_BUILD_PREFIX, MOCK_EDGE_PREFIX, MOCK_MODULE_ID, MOCK_RUNTIME_PREFIX, VITE_BROWSER_VIRTUAL_PREFIX } from "../../import-protection/constants.js";
3
+ import { loadMarkerModule, loadMockEdgeModule, loadMockRuntimeModule, loadSilentMockModule } from "../../import-protection/virtualModules.js";
4
+ //#region src/vite/import-protection-plugin/virtualModules.ts
5
+ var RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID);
6
+ var RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX);
7
+ var RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX);
8
+ var RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX);
9
+ var RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX);
10
+ var RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`);
11
+ var RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`);
12
+ function resolvedMarkerVirtualModuleId(kind) {
13
+ return kind === "server" ? RESOLVED_MARKER_SERVER_ONLY : RESOLVED_MARKER_CLIENT_ONLY;
14
+ }
15
+ function getResolvedVirtualModuleMatchers() {
16
+ return RESOLVED_VIRTUAL_MODULE_MATCHERS;
17
+ }
18
+ var RESOLVED_VIRTUAL_MODULE_MATCHERS = [
19
+ RESOLVED_MOCK_MODULE_ID,
20
+ RESOLVED_MOCK_BUILD_PREFIX,
21
+ RESOLVED_MOCK_EDGE_PREFIX,
22
+ RESOLVED_MOCK_RUNTIME_PREFIX,
23
+ RESOLVED_MARKER_PREFIX
24
+ ];
25
+ var RESOLVE_PREFIX_PAIRS = [
26
+ [MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],
27
+ [MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],
28
+ [MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],
29
+ [MARKER_PREFIX, RESOLVED_MARKER_PREFIX]
30
+ ];
31
+ function resolveInternalVirtualModuleId(source) {
32
+ if (source.startsWith("/@id/__x00__")) return resolveInternalVirtualModuleId(`\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`);
33
+ if (source === "tanstack-start-import-protection:mock" || source === RESOLVED_MOCK_MODULE_ID) return RESOLVED_MOCK_MODULE_ID;
34
+ for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {
35
+ if (source.startsWith(unresolvedPrefix)) return resolveViteId(source);
36
+ if (source.startsWith(resolvedPrefix)) return source;
37
+ }
38
+ }
39
+ function loadResolvedVirtualModule(id) {
40
+ if (id === RESOLVED_MOCK_MODULE_ID) return loadSilentMockModule();
41
+ if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) return loadSilentMockModule();
42
+ if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length));
43
+ if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length));
44
+ if (id.startsWith(RESOLVED_MARKER_PREFIX)) return loadMarkerModule();
45
+ }
46
+ //#endregion
47
+ export { getResolvedVirtualModuleMatchers, loadResolvedVirtualModule, resolveInternalVirtualModuleId, resolvedMarkerVirtualModuleId };
48
+
49
+ //# sourceMappingURL=virtualModules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualModules.js","names":[],"sources":["../../../../src/vite/import-protection-plugin/virtualModules.ts"],"sourcesContent":["import { resolveViteId } from '../../utils'\nimport {\n MARKER_PREFIX,\n MOCK_BUILD_PREFIX,\n MOCK_EDGE_PREFIX,\n MOCK_MODULE_ID,\n MOCK_RUNTIME_PREFIX,\n RUNTIME_SUGGESTION_TEXT,\n generateDevSelfDenialModule,\n generateSelfContainedMockModule,\n loadMarkerModule,\n loadMockEdgeModule,\n loadMockRuntimeModule,\n loadSilentMockModule,\n makeMockEdgeModuleId,\n mockRuntimeModuleIdFromViolation,\n} from '../../import-protection/virtualModules'\nimport { VITE_BROWSER_VIRTUAL_PREFIX } from '../../import-protection/constants'\n\nconst RESOLVED_MOCK_MODULE_ID = resolveViteId(MOCK_MODULE_ID)\nconst RESOLVED_MOCK_BUILD_PREFIX = resolveViteId(MOCK_BUILD_PREFIX)\nconst RESOLVED_MOCK_EDGE_PREFIX = resolveViteId(MOCK_EDGE_PREFIX)\nconst RESOLVED_MOCK_RUNTIME_PREFIX = resolveViteId(MOCK_RUNTIME_PREFIX)\nconst RESOLVED_MARKER_PREFIX = resolveViteId(MARKER_PREFIX)\nconst RESOLVED_MARKER_SERVER_ONLY = resolveViteId(`${MARKER_PREFIX}server-only`)\nconst RESOLVED_MARKER_CLIENT_ONLY = resolveViteId(`${MARKER_PREFIX}client-only`)\n\nexport function resolvedMarkerVirtualModuleId(\n kind: 'server' | 'client',\n): string {\n return kind === 'server'\n ? RESOLVED_MARKER_SERVER_ONLY\n : RESOLVED_MARKER_CLIENT_ONLY\n}\n\nexport function getResolvedVirtualModuleMatchers(): ReadonlyArray<string> {\n return RESOLVED_VIRTUAL_MODULE_MATCHERS\n}\n\nconst RESOLVED_VIRTUAL_MODULE_MATCHERS = [\n RESOLVED_MOCK_MODULE_ID,\n RESOLVED_MOCK_BUILD_PREFIX,\n RESOLVED_MOCK_EDGE_PREFIX,\n RESOLVED_MOCK_RUNTIME_PREFIX,\n RESOLVED_MARKER_PREFIX,\n] as const\n\nconst RESOLVE_PREFIX_PAIRS = [\n [MOCK_EDGE_PREFIX, RESOLVED_MOCK_EDGE_PREFIX],\n [MOCK_RUNTIME_PREFIX, RESOLVED_MOCK_RUNTIME_PREFIX],\n [MOCK_BUILD_PREFIX, RESOLVED_MOCK_BUILD_PREFIX],\n [MARKER_PREFIX, RESOLVED_MARKER_PREFIX],\n] as const\n\nexport function resolveInternalVirtualModuleId(\n source: string,\n): string | undefined {\n if (source.startsWith(VITE_BROWSER_VIRTUAL_PREFIX)) {\n return resolveInternalVirtualModuleId(\n `\\0${source.slice(VITE_BROWSER_VIRTUAL_PREFIX.length)}`,\n )\n }\n\n if (source === MOCK_MODULE_ID || source === RESOLVED_MOCK_MODULE_ID) {\n return RESOLVED_MOCK_MODULE_ID\n }\n\n for (const [unresolvedPrefix, resolvedPrefix] of RESOLVE_PREFIX_PAIRS) {\n if (source.startsWith(unresolvedPrefix)) {\n return resolveViteId(source)\n }\n\n if (source.startsWith(resolvedPrefix)) {\n return source\n }\n }\n\n return undefined\n}\n\nexport function loadResolvedVirtualModule(\n id: string,\n): { code: string } | undefined {\n if (id === RESOLVED_MOCK_MODULE_ID) {\n return loadSilentMockModule()\n }\n\n if (id.startsWith(RESOLVED_MOCK_BUILD_PREFIX)) {\n return loadSilentMockModule()\n }\n\n if (id.startsWith(RESOLVED_MOCK_EDGE_PREFIX)) {\n return loadMockEdgeModule(id.slice(RESOLVED_MOCK_EDGE_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MOCK_RUNTIME_PREFIX)) {\n return loadMockRuntimeModule(id.slice(RESOLVED_MOCK_RUNTIME_PREFIX.length))\n }\n\n if (id.startsWith(RESOLVED_MARKER_PREFIX)) {\n return loadMarkerModule()\n }\n\n return undefined\n}\n\nexport {\n MARKER_PREFIX,\n MOCK_BUILD_PREFIX,\n MOCK_EDGE_PREFIX,\n MOCK_MODULE_ID,\n MOCK_RUNTIME_PREFIX,\n RUNTIME_SUGGESTION_TEXT,\n generateDevSelfDenialModule,\n generateSelfContainedMockModule,\n loadMarkerModule,\n loadMockEdgeModule,\n loadMockRuntimeModule,\n loadSilentMockModule,\n makeMockEdgeModuleId,\n mockRuntimeModuleIdFromViolation,\n}\n"],"mappings":";;;;AAmBA,IAAM,0BAA0B,cAAc,eAAe;AAC7D,IAAM,6BAA6B,cAAc,kBAAkB;AACnE,IAAM,4BAA4B,cAAc,iBAAiB;AACjE,IAAM,+BAA+B,cAAc,oBAAoB;AACvE,IAAM,yBAAyB,cAAc,cAAc;AAC3D,IAAM,8BAA8B,cAAc,GAAG,cAAc,aAAa;AAChF,IAAM,8BAA8B,cAAc,GAAG,cAAc,aAAa;AAEhF,SAAgB,8BACd,MACQ;AACR,QAAO,SAAS,WACZ,8BACA;;AAGN,SAAgB,mCAA0D;AACxE,QAAO;;AAGT,IAAM,mCAAmC;CACvC;CACA;CACA;CACA;CACA;CACD;AAED,IAAM,uBAAuB;CAC3B,CAAC,kBAAkB,0BAA0B;CAC7C,CAAC,qBAAqB,6BAA6B;CACnD,CAAC,mBAAmB,2BAA2B;CAC/C,CAAC,eAAe,uBAAuB;CACxC;AAED,SAAgB,+BACd,QACoB;AACpB,KAAI,OAAO,WAAA,eAAuC,CAChD,QAAO,+BACL,KAAK,OAAO,MAAM,4BAA4B,OAAO,GACtD;AAGH,KAAI,WAAA,2CAA6B,WAAW,wBAC1C,QAAO;AAGT,MAAK,MAAM,CAAC,kBAAkB,mBAAmB,sBAAsB;AACrE,MAAI,OAAO,WAAW,iBAAiB,CACrC,QAAO,cAAc,OAAO;AAG9B,MAAI,OAAO,WAAW,eAAe,CACnC,QAAO;;;AAOb,SAAgB,0BACd,IAC8B;AAC9B,KAAI,OAAO,wBACT,QAAO,sBAAsB;AAG/B,KAAI,GAAG,WAAW,2BAA2B,CAC3C,QAAO,sBAAsB;AAG/B,KAAI,GAAG,WAAW,0BAA0B,CAC1C,QAAO,mBAAmB,GAAG,MAAM,0BAA0B,OAAO,CAAC;AAGvE,KAAI,GAAG,WAAW,6BAA6B,CAC7C,QAAO,sBAAsB,GAAG,MAAM,6BAA6B,OAAO,CAAC;AAG7E,KAAI,GAAG,WAAW,uBAAuB,CACvC,QAAO,kBAAkB"}
@@ -0,0 +1,5 @@
1
+ export type { TanStackStartVitePluginCoreOptions, ViteRscForwardSsrResolverStrategy, } from './types.js';
2
+ export type { TanStackStartViteInputConfig } from './schema.js';
3
+ export { START_ENVIRONMENT_NAMES, VITE_ENVIRONMENT_NAMES } from '../constants.js';
4
+ export { createVirtualModule } from './createVirtualModule.js';
5
+ export { tanStackStartVite } from './plugin.js';
@@ -0,0 +1,4 @@
1
+ import { START_ENVIRONMENT_NAMES, VITE_ENVIRONMENT_NAMES } from "../constants.js";
2
+ import { createVirtualModule } from "./createVirtualModule.js";
3
+ import { tanStackStartVite } from "./plugin.js";
4
+ export { START_ENVIRONMENT_NAMES, VITE_ENVIRONMENT_NAMES, createVirtualModule, tanStackStartVite };
@@ -1,7 +1,7 @@
1
1
  import { START_ENVIRONMENT_NAMES } from "../constants.js";
2
2
  import { createServerFnBasePath, normalizePublicBase, shouldRewriteDevBasepath } from "../planning.js";
3
3
  import { applyResolvedBaseAndOutput, applyResolvedRouterBasepath, createStartConfigContext } from "../config-context.js";
4
- import { importProtectionPlugin } from "../import-protection-plugin/plugin.js";
4
+ import { importProtectionPlugin } from "./import-protection-plugin/plugin.js";
5
5
  import { startCompilerPlugin } from "./start-compiler-plugin/plugin.js";
6
6
  import { loadEnvPlugin } from "./load-env-plugin/plugin.js";
7
7
  import { buildStartViteEnvironments, createViteConfigPlan, createViteDefineConfig, createViteResolvedEntryAliases } from "./planning.js";
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../../src/vite/plugin.ts"],"sourcesContent":["import { crawlFrameworkPkgs } from 'vitefu'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { START_ENVIRONMENT_NAMES } from '../constants'\nimport { importProtectionPlugin } from '../import-protection-plugin/plugin'\nimport {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport {\n buildStartViteEnvironments,\n createViteConfigPlan,\n createViteDefineConfig,\n createViteResolvedEntryAliases,\n} from './planning'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport {\n createDevBaseRewritePlugin,\n createPostBuildPlugin,\n createVirtualClientEntryPlugin,\n} from './plugins'\nimport { parseStartConfig } from './schema'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { serializationAdaptersPlugin } from './serialization-adapters-plugin'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from './types'\nimport type { TanStackStartViteInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\n\nexport function tanStackStartVite(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartViteInputConfig | undefined,\n): Array<PluginOption> {\n const normalizedStartPluginOpts = startPluginOpts ?? {}\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts: normalizedStartPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const environments: Array<{\n name: string\n type: 'client' | 'server'\n getServerFnById?: string\n }> = [\n { name: START_ENVIRONMENT_NAMES.client, type: 'client' },\n {\n name: START_ENVIRONMENT_NAMES.server,\n type: 'server',\n getServerFnById:\n corePluginOpts.ssrResolverStrategy.type === 'vite-rsc-forward'\n ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy)\n : undefined,\n },\n ]\n if (\n serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server &&\n !environments.find((e) => e.name === serverFnProviderEnv)\n ) {\n environments.push({\n name: serverFnProviderEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n const publicBase = normalizePublicBase(viteConfig.base)\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root: viteConfig.root || process.cwd(),\n publicBase,\n clientOutputDirectory: getClientOutputDirectory(viteConfig),\n serverOutputDirectory: getServerOutputDirectory(viteConfig),\n })\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n if (\n shouldRewriteDevBasepath({\n command,\n middlewareMode: Boolean(viteConfig.server?.middlewareMode),\n routerBasepath,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n })\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n\n const TSS_SERVER_FN_BASE = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const resolvedEntryPlan = configContext.resolveEntries()\n\n const entryAliases = createViteResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n const viteConfigPlan = createViteConfigPlan({\n viteConfig,\n framework: corePluginOpts.framework,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n serverFnProviderEnv,\n optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: viteConfigPlan.environments,\n resolve: viteConfigPlan.resolve,\n define: createViteDefineConfig({\n command,\n mode: viteConfig.mode,\n serverFnBase: TSS_SERVER_FN_BASE,\n routerBasepath,\n spaEnabled: startConfig.spa?.enabled,\n devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,\n devSsrStylesBasepath:\n startConfig.dev.ssrStyles.basepath ??\n resolvedStartConfig.basePaths.publicBase,\n staticNodeEnv: startConfig.server.build.staticNodeEnv,\n }),\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n await buildStartViteEnvironments({\n builder,\n providerEnvironmentName: serverFnProviderEnv,\n ssrIsProvider,\n })\n },\n },\n }\n },\n },\n createPostBuildPlugin({\n getConfig,\n postServerBuild,\n }),\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId:\n normalizedStartPluginOpts.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n createVirtualClientEntryPlugin({\n getClientEntry: () => configContext.resolveEntries().entryPaths.client,\n }),\n startManifestPlugin({\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n createDevBaseRewritePlugin({\n shouldRewriteDevBase: () => needsDevBaseRewrite,\n resolvedStartConfig,\n }),\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled:\n normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,\n installDevServerMiddleware:\n normalizedStartPluginOpts.vite?.installDevServerMiddleware,\n }),\n previewServerPlugin(),\n serializationAdaptersPlugin({\n adapters: corePluginOpts.serializationAdapters,\n }),\n ]\n}\n\nfunction createViteRscForwarder(strategy: ViteRscForwardSsrResolverStrategy) {\n return `export async function getServerFnById(id, access) {\n const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})\n return m[${JSON.stringify(strategy.exportName)}](id, access)\n}`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA4CA,SAAgB,kBACd,gBACA,iBACqB;CACrB,MAAM,4BAA4B,mBAAmB,EAAE;CAEvD,MAAM,gBAAgB,yBAAyB;EAC7C;EACA,iBAAiB;EACjB,aAAa;EACd,CAAC;CACF,MAAM,EAAE,WAAW,wBAAwB;CAC3C,MAAM,sBAAsB,eAAe;CAC3C,MAAM,gBAAgB,eAAe;CAIrC,IAAI,sBAAsB;CAE1B,MAAM,eAID,CACH;EAAE,MAAM,wBAAwB;EAAQ,MAAM;EAAU,EACxD;EACE,MAAM,wBAAwB;EAC9B,MAAM;EACN,iBACE,eAAe,oBAAoB,SAAS,qBACxC,uBAAuB,eAAe,oBAAoB,GAC1D,KAAA;EACP,CACF;AACD,KACE,wBAAwB,wBAAwB,UAChD,CAAC,aAAa,MAAM,MAAM,EAAE,SAAS,oBAAoB,CAEzD,cAAa,KAAK;EAChB,MAAM;EACN,MAAM;EACP,CAAC;AAEJ,QAAO;EACL;GACE,MAAM;GACN,SAAS;GACT,MAAM,OAAO,YAAY,EAAE,WAAW;IACpC,MAAM,aAAa,oBAAoB,WAAW,KAAK;AACvD,+BAA2B;KACzB;KACA,MAAM,WAAW,QAAQ,QAAQ,KAAK;KACtC;KACA,uBAAuB,yBAAyB,WAAW;KAC3D,uBAAuB,yBAAyB,WAAW;KAC5D,CAAC;IACF,MAAM,EAAE,gBAAgB,WAAW;IACnC,MAAM,iBAAiB,4BAA4B;KACjD;KACA;KACD,CAAC;AAEF,QACE,yBAAyB;KACvB;KACA,gBAAgB,QAAQ,WAAW,QAAQ,eAAe;KAC1D;KACA,YAAY,oBAAoB,UAAU;KAC3C,CAAC,CAOF,uBAAsB;IAGxB,MAAM,qBAAqB,uBAAuB;KAChD;KACA,cAAc,YAAY,UAAU;KACrC,CAAC;IAGF,MAAM,eAAe,+BAA+B,EAClD,YAHwB,cAAc,gBAAgB,CAGxB,YAC/B,CAAC;IAEF,MAAM,mBACJ,aAAa,eAAe,UAAU;IAQxC,MAAM,2BAA2B,MAAM,mBAAmB;KACxD,MAAM,QAAQ,KAAK;KACnB,SAAS,YAAY;KACrB,qBAAqB,SAAS;MAC5B,MAAM,mBAAmB,QAAQ;AAEjC,UAAI;WAEA,oBAAoB,oBACpB,iCAAiC,iBAEjC,QAAO;;AAIX,aAAO;;KAEV,CAAC;IAEF,MAAM,iBAAiB,qBAAqB;KAC1C;KACA,WAAW,eAAe;KAC1B;KACA,uBAAuB,oBAAoB,kBAAkB;KAC7D,uBAAuB,oBAAoB,kBAAkB;KAC7D;KACA,qBAAqB,yBAAyB,aAAa;KAC3D,YAAY,yBAAyB,IAAI,WAAW,MAAM;KAC3D,CAAC;AAEF,WAAO;KAGL,SAAS,WAAW,WAAW;KAC/B,cAAc,eAAe;KAC7B,SAAS,eAAe;KACxB,QAAQ,uBAAuB;MAC7B;MACA,MAAM,WAAW;MACjB,cAAc;MACd;MACA,YAAY,YAAY,KAAK;MAC7B,qBAAqB,YAAY,IAAI,UAAU;MAC/C,sBACE,YAAY,IAAI,UAAU,YAC1B,oBAAoB,UAAU;MAChC,eAAe,YAAY,OAAO,MAAM;MACzC,CAAC;KACF,SAAS;MACP,eAAe;MACf,MAAM,SAAS,SAAS;AACtB,aAAM,2BAA2B;QAC/B;QACA,yBAAyB;QACzB;QACD,CAAC;;MAEL;KACF;;GAEJ;EACD,sBAAsB;GACpB;GACA;GACD,CAAC;EAOF,oBAAoB;GAClB,WAAW,eAAe;GAC1B;GACA,oBACE,0BAA0B,WAAW;GACvC,iBAAiB;GAClB,CAAC;EACF,uBAAuB;GACrB;GACA,WAAW,eAAe;GAC1B;GACA,iBAAiB;GAClB,CAAC;EACF,oBAAoB,2BAA2B,WAAW,eAAe;EACzE,eAAe;EACf,+BAA+B,EAC7B,sBAAsB,cAAc,gBAAgB,CAAC,WAAW,QACjE,CAAC;EACF,oBAAoB,EAClB,WACD,CAAC;EAOF,2BAA2B;GACzB,4BAA4B;GAC5B;GACD,CAAC;EACF,gBAAgB;GACd;GACA,qBACE,0BAA0B,KAAK,WAAW,WAAW;GACvD,4BACE,0BAA0B,MAAM;GACnC,CAAC;EACF,qBAAqB;EACrB,4BAA4B,EAC1B,UAAU,eAAe,uBAC1B,CAAC;EACH;;AAGH,SAAS,uBAAuB,UAA6C;AAC3E,QAAO;mDAC0C,KAAK,UAAU,SAAS,sBAAsB,CAAC,IAAI,KAAK,UAAU,SAAS,YAAY,CAAC;aAC9H,KAAK,UAAU,SAAS,WAAW,CAAC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../../src/vite/plugin.ts"],"sourcesContent":["import { crawlFrameworkPkgs } from 'vitefu'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { START_ENVIRONMENT_NAMES } from '../constants'\nimport {\n createServerFnBasePath,\n normalizePublicBase,\n shouldRewriteDevBasepath,\n} from '../planning'\nimport { importProtectionPlugin } from './import-protection-plugin/plugin'\nimport { startCompilerPlugin } from './start-compiler-plugin/plugin'\nimport { loadEnvPlugin } from './load-env-plugin/plugin'\nimport {\n buildStartViteEnvironments,\n createViteConfigPlan,\n createViteDefineConfig,\n createViteResolvedEntryAliases,\n} from './planning'\nimport { devServerPlugin } from './dev-server-plugin/plugin'\nimport { previewServerPlugin } from './preview-server-plugin/plugin'\nimport {\n createDevBaseRewritePlugin,\n createPostBuildPlugin,\n createVirtualClientEntryPlugin,\n} from './plugins'\nimport { parseStartConfig } from './schema'\nimport { startManifestPlugin } from './start-manifest-plugin/plugin'\nimport { tanStackStartRouter } from './start-router-plugin/plugin'\nimport {\n getClientOutputDirectory,\n getServerOutputDirectory,\n} from './output-directory'\nimport { postServerBuild } from './post-server-build'\nimport { serializationAdaptersPlugin } from './serialization-adapters-plugin'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from './types'\nimport type { TanStackStartViteInputConfig } from './schema'\nimport type { PluginOption } from 'vite'\n\nexport function tanStackStartVite(\n corePluginOpts: TanStackStartVitePluginCoreOptions,\n startPluginOpts: TanStackStartViteInputConfig | undefined,\n): Array<PluginOption> {\n const normalizedStartPluginOpts = startPluginOpts ?? {}\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts: normalizedStartPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // When the router basepath and vite base are misaligned during dev,\n // we install a URL rewrite middleware instead of erroring.\n let needsDevBaseRewrite = false\n\n const environments: Array<{\n name: string\n type: 'client' | 'server'\n getServerFnById?: string\n }> = [\n { name: START_ENVIRONMENT_NAMES.client, type: 'client' },\n {\n name: START_ENVIRONMENT_NAMES.server,\n type: 'server',\n getServerFnById:\n corePluginOpts.ssrResolverStrategy.type === 'vite-rsc-forward'\n ? createViteRscForwarder(corePluginOpts.ssrResolverStrategy)\n : undefined,\n },\n ]\n if (\n serverFnProviderEnv !== START_ENVIRONMENT_NAMES.server &&\n !environments.find((e) => e.name === serverFnProviderEnv)\n ) {\n environments.push({\n name: serverFnProviderEnv,\n type: 'server',\n })\n }\n return [\n {\n name: 'tanstack-start-core:config',\n enforce: 'pre',\n async config(viteConfig, { command }) {\n const publicBase = normalizePublicBase(viteConfig.base)\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root: viteConfig.root || process.cwd(),\n publicBase,\n clientOutputDirectory: getClientOutputDirectory(viteConfig),\n serverOutputDirectory: getServerOutputDirectory(viteConfig),\n })\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n if (\n shouldRewriteDevBasepath({\n command,\n middlewareMode: Boolean(viteConfig.server?.middlewareMode),\n routerBasepath,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n })\n ) {\n // The router basepath and vite base are misaligned.\n // Instead of erroring, we install a dev-server middleware that\n // rewrites incoming request URLs to prepend the vite base prefix.\n // This allows users to have e.g. base: '/_ui/' for asset URLs\n // while keeping router basepath at '/' for page navigation.\n needsDevBaseRewrite = true\n }\n\n const TSS_SERVER_FN_BASE = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const resolvedEntryPlan = configContext.resolveEntries()\n\n const entryAliases = createViteResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const startPackageName =\n `@tanstack/${corePluginOpts.framework}-start` as const\n\n // crawl packages that have start in \"peerDependencies\"\n // see https://github.com/svitejs/vitefu/blob/d8d82fa121e3b2215ba437107093c77bde51b63b/src/index.js#L95-L101\n\n // this is currently uncached; could be implemented similarly as vite handles lock file changes\n // see https://github.com/vitejs/vite/blob/557f797d29422027e8c451ca50dd84bf8c41b5f0/packages/vite/src/node/optimizer/index.ts#L1282\n\n const crawlFrameworkPkgsResult = await crawlFrameworkPkgs({\n root: process.cwd(),\n isBuild: command === 'build',\n isFrameworkPkgByJson(pkgJson) {\n const peerDependencies = pkgJson['peerDependencies']\n\n if (peerDependencies) {\n if (\n startPackageName in peerDependencies ||\n '@tanstack/start-client-core' in peerDependencies\n ) {\n return true\n }\n }\n\n return false\n },\n })\n\n const viteConfigPlan = createViteConfigPlan({\n viteConfig,\n framework: corePluginOpts.framework,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n serverFnProviderEnv,\n optimizeDepsExclude: crawlFrameworkPkgsResult.optimizeDeps.exclude,\n noExternal: crawlFrameworkPkgsResult.ssr.noExternal.sort(),\n })\n\n return {\n // see https://vite.dev/config/shared-options.html#apptype\n // this will prevent vite from injecting middlewares that we don't want\n appType: viteConfig.appType ?? 'custom',\n environments: viteConfigPlan.environments,\n resolve: viteConfigPlan.resolve,\n define: createViteDefineConfig({\n command,\n mode: viteConfig.mode,\n serverFnBase: TSS_SERVER_FN_BASE,\n routerBasepath,\n spaEnabled: startConfig.spa?.enabled,\n devSsrStylesEnabled: startConfig.dev.ssrStyles.enabled,\n devSsrStylesBasepath:\n startConfig.dev.ssrStyles.basepath ??\n resolvedStartConfig.basePaths.publicBase,\n staticNodeEnv: startConfig.server.build.staticNodeEnv,\n }),\n builder: {\n sharedPlugins: true,\n async buildApp(builder) {\n await buildStartViteEnvironments({\n builder,\n providerEnvironmentName: serverFnProviderEnv,\n ssrIsProvider,\n })\n },\n },\n }\n },\n },\n createPostBuildPlugin({\n getConfig,\n postServerBuild,\n }),\n // Server function plugin handles:\n // 1. Identifying createServerFn().handler() calls\n // 2. Extracting server functions to separate modules\n // 3. Replacing call sites with RPC stubs\n // 4. Generating the server function manifest\n // Also handles createIsomorphicFn, createServerOnlyFn, createClientOnlyFn, createMiddleware\n startCompilerPlugin({\n framework: corePluginOpts.framework,\n environments,\n generateFunctionId:\n normalizedStartPluginOpts.serverFns?.generateFunctionId,\n providerEnvName: serverFnProviderEnv,\n }),\n importProtectionPlugin({\n getConfig,\n framework: corePluginOpts.framework,\n environments,\n providerEnvName: serverFnProviderEnv,\n }),\n tanStackStartRouter(normalizedStartPluginOpts, getConfig, corePluginOpts),\n loadEnvPlugin(),\n createVirtualClientEntryPlugin({\n getClientEntry: () => configContext.resolveEntries().entryPaths.client,\n }),\n startManifestPlugin({\n getConfig,\n }),\n // When the vite base and router basepath are misaligned (e.g. base: '/_ui/', basepath: '/'),\n // install a middleware that rewrites incoming request URLs to prepend the vite base prefix.\n // This allows Vite's internal base middleware to accept the requests, then strips the prefix\n // before passing to the SSR handler.\n // Registered BEFORE devServerPlugin so this middleware is added to the Connect stack first,\n // ensuring all subsequent middlewares (CSS, SSR, etc.) see the rewritten URL.\n createDevBaseRewritePlugin({\n shouldRewriteDevBase: () => needsDevBaseRewrite,\n resolvedStartConfig,\n }),\n devServerPlugin({\n getConfig,\n devSsrStylesEnabled:\n normalizedStartPluginOpts.dev?.ssrStyles?.enabled ?? true,\n installDevServerMiddleware:\n normalizedStartPluginOpts.vite?.installDevServerMiddleware,\n }),\n previewServerPlugin(),\n serializationAdaptersPlugin({\n adapters: corePluginOpts.serializationAdapters,\n }),\n ]\n}\n\nfunction createViteRscForwarder(strategy: ViteRscForwardSsrResolverStrategy) {\n return `export async function getServerFnById(id, access) {\n const m = await import.meta.viteRsc.loadModule(${JSON.stringify(strategy.sourceEnvironmentName)}, ${JSON.stringify(strategy.sourceEntry)})\n return m[${JSON.stringify(strategy.exportName)}](id, access)\n}`\n}\n"],"mappings":"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"}
@@ -1,39 +1,21 @@
1
1
  import { getClientOutputDirectory } from "./output-directory.js";
2
- import { buildSitemap } from "../build-sitemap.js";
3
- import { prerender } from "./prerender.js";
4
- import { HEADERS } from "@tanstack/start-server-core";
2
+ import { postBuild } from "../post-build.js";
3
+ import { prerenderWithVite } from "./prerender.js";
5
4
  //#region src/vite/post-server-build.ts
6
5
  async function postServerBuild({ builder, startConfig }) {
7
- if (startConfig.prerender?.enabled !== false) startConfig.prerender = {
8
- ...startConfig.prerender,
9
- enabled: startConfig.prerender?.enabled ?? startConfig.pages.some((d) => typeof d === "string" ? false : !!d.prerender?.enabled)
10
- };
11
- if (startConfig.spa?.enabled) {
12
- startConfig.prerender = {
13
- ...startConfig.prerender,
14
- enabled: true
15
- };
16
- const maskUrl = new URL(startConfig.spa.maskPath, "http://localhost");
17
- if (maskUrl.origin !== "http://localhost") throw new Error("spa.maskPath must be a path (no protocol/host)");
18
- startConfig.pages.push({
19
- path: maskUrl.toString().replace("http://localhost", ""),
20
- prerender: {
21
- ...startConfig.spa.prerender,
22
- headers: {
23
- ...startConfig.spa.prerender.headers,
24
- [HEADERS.TSS_SHELL]: "true"
25
- }
26
- },
27
- sitemap: { exclude: true }
28
- });
29
- }
30
- if (startConfig.prerender.enabled) await prerender({
31
- startConfig,
32
- builder
33
- });
34
- if (startConfig.sitemap?.enabled) buildSitemap({
6
+ await postBuild({
35
7
  startConfig,
36
- publicDir: getClientOutputDirectory(builder.config)
8
+ adapter: {
9
+ getClientOutputDirectory() {
10
+ return getClientOutputDirectory(builder.config);
11
+ },
12
+ prerender(startConfig) {
13
+ return prerenderWithVite({
14
+ startConfig,
15
+ builder
16
+ });
17
+ }
18
+ }
37
19
  });
38
20
  }
39
21
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"post-server-build.js","names":[],"sources":["../../../src/vite/post-server-build.ts"],"sourcesContent":["import { HEADERS } from '@tanstack/start-server-core'\nimport { buildSitemap } from '../build-sitemap'\nimport { prerender } from './prerender'\nimport { getClientOutputDirectory } from './output-directory'\nimport type { TanStackStartOutputConfig } from '../schema'\nimport type { ViteBuilder } from 'vite'\n\nexport async function postServerBuild({\n builder,\n startConfig,\n}: {\n builder: ViteBuilder\n startConfig: TanStackStartOutputConfig\n}) {\n // If the user has not set a prerender option, we need to set it to true\n // if the pages array is not empty and has sub options requiring for prerendering\n // If the user has explicitly set prerender.enabled, this should be respected\n if (startConfig.prerender?.enabled !== false) {\n startConfig.prerender = {\n ...startConfig.prerender,\n enabled:\n startConfig.prerender?.enabled ??\n startConfig.pages.some((d) =>\n typeof d === 'string' ? false : !!d.prerender?.enabled,\n ),\n }\n }\n\n // Setup the options for prerendering the SPA shell (i.e `src/routes/__root.tsx`)\n if (startConfig.spa?.enabled) {\n startConfig.prerender = {\n ...startConfig.prerender,\n enabled: true,\n }\n\n const maskUrl = new URL(startConfig.spa.maskPath, 'http://localhost')\n if (maskUrl.origin !== 'http://localhost') {\n throw new Error('spa.maskPath must be a path (no protocol/host)')\n }\n\n startConfig.pages.push({\n path: maskUrl.toString().replace('http://localhost', ''),\n prerender: {\n ...startConfig.spa.prerender,\n headers: {\n ...startConfig.spa.prerender.headers,\n [HEADERS.TSS_SHELL]: 'true',\n },\n },\n sitemap: {\n exclude: true,\n },\n })\n }\n\n // Run the prerendering process\n if (startConfig.prerender.enabled) {\n await prerender({\n startConfig,\n builder,\n })\n }\n\n // Run the sitemap build process\n if (startConfig.sitemap?.enabled) {\n buildSitemap({\n startConfig,\n publicDir: getClientOutputDirectory(builder.config),\n })\n }\n}\n"],"mappings":";;;;;AAOA,eAAsB,gBAAgB,EACpC,SACA,eAIC;AAID,KAAI,YAAY,WAAW,YAAY,MACrC,aAAY,YAAY;EACtB,GAAG,YAAY;EACf,SACE,YAAY,WAAW,WACvB,YAAY,MAAM,MAAM,MACtB,OAAO,MAAM,WAAW,QAAQ,CAAC,CAAC,EAAE,WAAW,QAChD;EACJ;AAIH,KAAI,YAAY,KAAK,SAAS;AAC5B,cAAY,YAAY;GACtB,GAAG,YAAY;GACf,SAAS;GACV;EAED,MAAM,UAAU,IAAI,IAAI,YAAY,IAAI,UAAU,mBAAmB;AACrE,MAAI,QAAQ,WAAW,mBACrB,OAAM,IAAI,MAAM,iDAAiD;AAGnE,cAAY,MAAM,KAAK;GACrB,MAAM,QAAQ,UAAU,CAAC,QAAQ,oBAAoB,GAAG;GACxD,WAAW;IACT,GAAG,YAAY,IAAI;IACnB,SAAS;KACP,GAAG,YAAY,IAAI,UAAU;MAC5B,QAAQ,YAAY;KACtB;IACF;GACD,SAAS,EACP,SAAS,MACV;GACF,CAAC;;AAIJ,KAAI,YAAY,UAAU,QACxB,OAAM,UAAU;EACd;EACA;EACD,CAAC;AAIJ,KAAI,YAAY,SAAS,QACvB,cAAa;EACX;EACA,WAAW,yBAAyB,QAAQ,OAAO;EACpD,CAAC"}
1
+ {"version":3,"file":"post-server-build.js","names":[],"sources":["../../../src/vite/post-server-build.ts"],"sourcesContent":["import { postBuild } from '../post-build'\nimport { getClientOutputDirectory } from './output-directory'\nimport { prerenderWithVite } from './prerender'\nimport type { TanStackStartOutputConfig } from '../schema'\nimport type { ViteBuilder } from 'vite'\n\nexport async function postServerBuild({\n builder,\n startConfig,\n}: {\n builder: ViteBuilder\n startConfig: TanStackStartOutputConfig\n}) {\n await postBuild({\n startConfig,\n adapter: {\n getClientOutputDirectory() {\n return getClientOutputDirectory(builder.config)\n },\n prerender(startConfig) {\n return prerenderWithVite({\n startConfig,\n builder,\n })\n },\n },\n })\n}\n"],"mappings":";;;;AAMA,eAAsB,gBAAgB,EACpC,SACA,eAIC;AACD,OAAM,UAAU;EACd;EACA,SAAS;GACP,2BAA2B;AACzB,WAAO,yBAAyB,QAAQ,OAAO;;GAEjD,UAAU,aAAa;AACrB,WAAO,kBAAkB;KACvB;KACA;KACD,CAAC;;GAEL;EACF,CAAC"}
@@ -1,6 +1,6 @@
1
- import { ViteBuilder } from 'vite';
2
1
  import { TanStackStartOutputConfig } from '../schema.js';
3
- export declare function prerender({ startConfig, builder, }: {
2
+ import { ViteBuilder } from 'vite';
3
+ export declare function prerenderWithVite({ startConfig, builder, }: {
4
4
  startConfig: TanStackStartOutputConfig;
5
5
  builder: ViteBuilder;
6
6
  }): Promise<void>;
@@ -1,27 +1,7 @@
1
1
  import { VITE_ENVIRONMENT_NAMES } from "../constants.js";
2
- import { createLogger } from "../utils.js";
3
- import { Queue } from "../queue.js";
4
- import path from "pathe";
5
- import { joinURL, withBase, withTrailingSlash, withoutBase } from "ufo";
6
- import { promises } from "node:fs";
7
- import os from "node:os";
2
+ import { prerender } from "../prerender.js";
8
3
  //#region src/vite/prerender.ts
9
- async function prerender({ startConfig, builder }) {
10
- const logger = createLogger("prerender");
11
- logger.info("Prerendering pages...");
12
- if (startConfig.prerender?.enabled) {
13
- let pages = startConfig.pages.length ? startConfig.pages : [{ path: "/" }];
14
- if (startConfig.prerender.autoStaticPathsDiscovery ?? true) {
15
- const pagesMap = new Map(pages.map((item) => [item.path, item]));
16
- const discoveredPages = globalThis.TSS_PRERENDABLE_PATHS || [];
17
- for (const page of discoveredPages) if (!pagesMap.has(page.path)) pagesMap.set(page.path, page);
18
- pages = Array.from(pagesMap.values());
19
- }
20
- startConfig.pages = pages;
21
- }
22
- const routerBasePath = joinURL("/", startConfig.router.basepath ?? "");
23
- const routerBaseUrl = new URL(routerBasePath, "http://localhost");
24
- startConfig.pages = validateAndNormalizePrerenderPages(startConfig.pages, routerBaseUrl);
4
+ async function prerenderWithVite({ startConfig, builder }) {
25
5
  const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server];
26
6
  if (!serverEnv) throw new Error(`Vite's "${VITE_ENVIRONMENT_NAMES.server}" environment not found`);
27
7
  const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client];
@@ -31,115 +11,21 @@ async function prerender({ startConfig, builder }) {
31
11
  process.env.TSS_CLIENT_OUTPUT_DIR = outputDir;
32
12
  const previewServer = await startPreviewServer(serverEnv.config);
33
13
  const baseUrl = getResolvedUrl(previewServer);
34
- const isRedirectResponse = (res) => {
35
- return res.status >= 300 && res.status < 400 && res.headers.get("location");
36
- };
37
- async function localFetch(path, options, maxRedirects = 5) {
38
- const url = new URL(path, baseUrl);
39
- const request = new Request(url, options);
40
- const response = await fetch(request);
41
- if (isRedirectResponse(response) && maxRedirects > 0) {
42
- const location = response.headers.get("location");
43
- if (location.startsWith("http://localhost") || location.startsWith("/")) return localFetch(location.replace("http://localhost", ""), options, maxRedirects - 1);
44
- logger.warn(`Skipping redirect to external location: ${location}`);
45
- }
46
- return response;
47
- }
48
- try {
49
- const pages = await prerenderPages({ outputDir });
50
- logger.info(`Prerendered ${pages.length} pages:`);
51
- pages.forEach((page) => {
52
- logger.info(`- ${page}`);
53
- });
54
- } catch (error) {
55
- logger.error(error);
56
- } finally {
57
- await previewServer.close();
58
- }
59
- function extractLinks(html) {
60
- const linkRegex = /<a[^>]+href=["']([^"']+)["'][^>]*>/g;
61
- const links = [];
62
- let match;
63
- while ((match = linkRegex.exec(html)) !== null) {
64
- const href = match[1];
65
- if (href && (href.startsWith("/") || href.startsWith("./"))) links.push(href);
66
- }
67
- return links;
68
- }
69
- async function prerenderPages({ outputDir }) {
70
- const seen = /* @__PURE__ */ new Set();
71
- const prerendered = /* @__PURE__ */ new Set();
72
- const retriesByPath = /* @__PURE__ */ new Map();
73
- const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length;
74
- logger.info(`Concurrency: ${concurrency}`);
75
- const queue = new Queue({ concurrency });
76
- const routerBasePath = joinURL("/", startConfig.router.basepath ?? "");
77
- const routerBaseUrl = new URL(routerBasePath, "http://localhost");
78
- startConfig.pages = validateAndNormalizePrerenderPages(startConfig.pages, routerBaseUrl);
79
- startConfig.pages.forEach((page) => addCrawlPageTask(page));
80
- if (queue.isSettled()) {
81
- logger.info("No pages matched prerender filter; skipping.");
82
- return Array.from(prerendered);
83
- }
84
- await queue.start();
85
- return Array.from(prerendered);
86
- function addCrawlPageTask(page) {
87
- if (seen.has(page.path)) return;
88
- seen.add(page.path);
89
- if (page.fromCrawl) startConfig.pages.push(page);
90
- if (!(page.prerender?.enabled ?? true)) return;
91
- if (startConfig.prerender?.filter && !startConfig.prerender.filter(page)) return;
92
- const prerenderOptions = {
93
- ...startConfig.prerender,
94
- ...page.prerender
95
- };
96
- queue.add(async () => {
97
- logger.info(`Crawling: ${page.path}`);
98
- const retries = retriesByPath.get(page.path) || 0;
99
- try {
100
- const res = await localFetch(withTrailingSlash(withBase(page.path, routerBasePath)), { headers: { ...prerenderOptions.headers ?? {} } }, prerenderOptions.maxRedirects);
101
- if (!res.ok) {
102
- if (isRedirectResponse(res)) logger.warn(`Max redirects reached for ${page.path}`);
103
- throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, { cause: res });
104
- }
105
- const cleanPagePath = (prerenderOptions.outputPath || page.path).split(/[?#]/)[0];
106
- const contentType = res.headers.get("content-type") || "";
107
- const isImplicitHTML = !cleanPagePath.endsWith(".html") && contentType.includes("html");
108
- const routeWithIndex = cleanPagePath.endsWith("/") ? cleanPagePath + "index" : cleanPagePath;
109
- const isSpaShell = startConfig.spa?.prerender.outputPath === cleanPagePath;
110
- let htmlPath;
111
- if (isSpaShell) htmlPath = cleanPagePath + ".html";
112
- else if (cleanPagePath.endsWith("/") || (prerenderOptions.autoSubfolderIndex ?? true)) htmlPath = joinURL(cleanPagePath, "index.html");
113
- else htmlPath = cleanPagePath + ".html";
114
- const filename = withoutBase(isImplicitHTML ? htmlPath : routeWithIndex, routerBasePath);
115
- const html = await res.text();
116
- const filepath = path.join(outputDir, filename);
117
- await promises.mkdir(path.dirname(filepath), { recursive: true });
118
- await promises.writeFile(filepath, html);
119
- prerendered.add(page.path);
120
- const newPage = await prerenderOptions.onSuccess?.({
121
- page,
122
- html
123
- });
124
- if (newPage) Object.assign(page, newPage);
125
- if (prerenderOptions.crawlLinks ?? true) {
126
- const links = extractLinks(html);
127
- for (const link of links) addCrawlPageTask({
128
- path: link,
129
- fromCrawl: true
130
- });
131
- }
132
- } catch (error) {
133
- if (retries < (prerenderOptions.retryCount ?? 0)) {
134
- logger.warn(`Encountered error, retrying: ${page.path} in 500ms`);
135
- await new Promise((resolve) => setTimeout(resolve, prerenderOptions.retryDelay));
136
- retriesByPath.set(page.path, retries + 1);
137
- addCrawlPageTask(page);
138
- } else if (prerenderOptions.failOnError ?? true) throw error;
139
- }
140
- });
14
+ return prerender({
15
+ startConfig,
16
+ handler: {
17
+ getClientOutputDirectory() {
18
+ return outputDir;
19
+ },
20
+ request(path, options) {
21
+ const url = new URL(path, baseUrl);
22
+ return fetch(new Request(url, options));
23
+ },
24
+ close() {
25
+ return previewServer.close();
26
+ }
141
27
  }
142
- }
28
+ });
143
29
  }
144
30
  async function startPreviewServer(viteConfig) {
145
31
  const vite = await import("vite");
@@ -160,23 +46,7 @@ function getResolvedUrl(previewServer) {
160
46
  if (!baseUrl) throw new Error("No resolved URL is available from the Vite preview server");
161
47
  return new URL(baseUrl);
162
48
  }
163
- function validateAndNormalizePrerenderPages(pages, routerBaseUrl) {
164
- return pages.map((page) => {
165
- let url;
166
- try {
167
- url = new URL(page.path, routerBaseUrl);
168
- } catch (err) {
169
- throw new Error(`prerender page path must be relative: ${page.path}`, { cause: err });
170
- }
171
- if (url.origin !== "http://localhost") throw new Error(`prerender page path must be relative: ${page.path}`);
172
- const decodedPathname = decodeURIComponent(url.pathname);
173
- return {
174
- ...page,
175
- path: decodedPathname + url.search + url.hash
176
- };
177
- });
178
- }
179
49
  //#endregion
180
- export { prerender };
50
+ export { prerenderWithVite };
181
51
 
182
52
  //# sourceMappingURL=prerender.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prerender.js","names":[],"sources":["../../../src/vite/prerender.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport os from 'node:os'\nimport path from 'pathe'\nimport { joinURL, withBase, withTrailingSlash, withoutBase } from 'ufo'\nimport { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { createLogger } from '../utils'\nimport { Queue } from '../queue'\nimport type { PreviewServer, ResolvedConfig, ViteBuilder } from 'vite'\nimport type { Page, TanStackStartOutputConfig } from '../schema'\n\nexport async function prerender({\n startConfig,\n builder,\n}: {\n startConfig: TanStackStartOutputConfig\n builder: ViteBuilder\n}) {\n const logger = createLogger('prerender')\n logger.info('Prerendering pages...')\n\n if (startConfig.prerender?.enabled) {\n let pages = startConfig.pages.length ? startConfig.pages : [{ path: '/' }]\n\n if (startConfig.prerender.autoStaticPathsDiscovery ?? true) {\n const pagesMap = new Map(pages.map((item) => [item.path, item]))\n const discoveredPages = globalThis.TSS_PRERENDABLE_PATHS || []\n\n for (const page of discoveredPages) {\n if (!pagesMap.has(page.path)) {\n pagesMap.set(page.path, page)\n }\n }\n\n pages = Array.from(pagesMap.values())\n }\n\n startConfig.pages = pages\n }\n\n const routerBasePath = joinURL('/', startConfig.router.basepath ?? '')\n const routerBaseUrl = new URL(routerBasePath, 'http://localhost')\n\n startConfig.pages = validateAndNormalizePrerenderPages(\n startConfig.pages,\n routerBaseUrl,\n )\n\n const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!serverEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.server}\" environment not found`,\n )\n }\n\n const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n if (!clientEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.client}\" environment not found`,\n )\n }\n\n const outputDir = clientEnv.config.build.outDir\n\n process.env.TSS_PRERENDERING = 'true'\n process.env.TSS_CLIENT_OUTPUT_DIR = outputDir\n\n const previewServer = await startPreviewServer(serverEnv.config)\n const baseUrl = getResolvedUrl(previewServer)\n\n const isRedirectResponse = (res: Response) => {\n return res.status >= 300 && res.status < 400 && res.headers.get('location')\n }\n\n async function localFetch(\n path: string,\n options?: RequestInit,\n maxRedirects: number = 5,\n ): Promise<Response> {\n const url = new URL(path, baseUrl)\n const request = new Request(url, options)\n const response = await fetch(request)\n\n if (isRedirectResponse(response) && maxRedirects > 0) {\n const location = response.headers.get('location')!\n if (location.startsWith('http://localhost') || location.startsWith('/')) {\n const newUrl = location.replace('http://localhost', '')\n return localFetch(newUrl, options, maxRedirects - 1)\n }\n\n logger.warn(`Skipping redirect to external location: ${location}`)\n }\n\n return response\n }\n\n try {\n const pages = await prerenderPages({ outputDir })\n\n logger.info(`Prerendered ${pages.length} pages:`)\n pages.forEach((page) => {\n logger.info(`- ${page}`)\n })\n } catch (error) {\n logger.error(error)\n } finally {\n await previewServer.close()\n }\n\n function extractLinks(html: string): Array<string> {\n const linkRegex = /<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>/g\n const links: Array<string> = []\n let match: RegExpExecArray | null\n\n while ((match = linkRegex.exec(html)) !== null) {\n const href = match[1]\n if (href && (href.startsWith('/') || href.startsWith('./'))) {\n links.push(href)\n }\n }\n\n return links\n }\n\n async function prerenderPages({ outputDir }: { outputDir: string }) {\n const seen = new Set<string>()\n const prerendered = new Set<string>()\n const retriesByPath = new Map<string, number>()\n const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length\n logger.info(`Concurrency: ${concurrency}`)\n const queue = new Queue({ concurrency })\n const routerBasePath = joinURL('/', startConfig.router.basepath ?? '')\n\n const routerBaseUrl = new URL(routerBasePath, 'http://localhost')\n startConfig.pages = validateAndNormalizePrerenderPages(\n startConfig.pages,\n routerBaseUrl,\n )\n\n startConfig.pages.forEach((page) => addCrawlPageTask(page))\n\n if (queue.isSettled()) {\n logger.info('No pages matched prerender filter; skipping.')\n return Array.from(prerendered)\n }\n\n await queue.start()\n\n return Array.from(prerendered)\n\n function addCrawlPageTask(page: Page) {\n if (seen.has(page.path)) return\n\n seen.add(page.path)\n\n if (page.fromCrawl) {\n startConfig.pages.push(page)\n }\n\n if (!(page.prerender?.enabled ?? true)) return\n\n if (\n startConfig.prerender?.filter &&\n !startConfig.prerender.filter(page)\n ) {\n return\n }\n\n const prerenderOptions = {\n ...startConfig.prerender,\n ...page.prerender,\n }\n\n queue.add(async () => {\n logger.info(`Crawling: ${page.path}`)\n const retries = retriesByPath.get(page.path) || 0\n try {\n const res = await localFetch(\n withTrailingSlash(withBase(page.path, routerBasePath)),\n {\n headers: {\n ...(prerenderOptions.headers ?? {}),\n },\n },\n prerenderOptions.maxRedirects,\n )\n\n if (!res.ok) {\n if (isRedirectResponse(res)) {\n logger.warn(`Max redirects reached for ${page.path}`)\n }\n throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {\n cause: res,\n })\n }\n\n const cleanPagePath = (\n prerenderOptions.outputPath || page.path\n ).split(/[?#]/)[0]!\n\n const contentType = res.headers.get('content-type') || ''\n const isImplicitHTML =\n !cleanPagePath.endsWith('.html') && contentType.includes('html')\n\n const routeWithIndex = cleanPagePath.endsWith('/')\n ? cleanPagePath + 'index'\n : cleanPagePath\n\n const isSpaShell =\n startConfig.spa?.prerender.outputPath === cleanPagePath\n\n let htmlPath: string\n if (isSpaShell) {\n htmlPath = cleanPagePath + '.html'\n } else if (\n cleanPagePath.endsWith('/') ||\n (prerenderOptions.autoSubfolderIndex ?? true)\n ) {\n htmlPath = joinURL(cleanPagePath, 'index.html')\n } else {\n htmlPath = cleanPagePath + '.html'\n }\n\n const filename = withoutBase(\n isImplicitHTML ? htmlPath : routeWithIndex,\n routerBasePath,\n )\n\n const html = await res.text()\n\n const filepath = path.join(outputDir, filename)\n\n await fsp.mkdir(path.dirname(filepath), {\n recursive: true,\n })\n\n await fsp.writeFile(filepath, html)\n\n prerendered.add(page.path)\n\n const newPage = await prerenderOptions.onSuccess?.({ page, html })\n\n if (newPage) {\n Object.assign(page, newPage)\n }\n\n if (prerenderOptions.crawlLinks ?? true) {\n const links = extractLinks(html)\n for (const link of links) {\n addCrawlPageTask({ path: link, fromCrawl: true })\n }\n }\n } catch (error) {\n if (retries < (prerenderOptions.retryCount ?? 0)) {\n logger.warn(`Encountered error, retrying: ${page.path} in 500ms`)\n await new Promise((resolve) =>\n setTimeout(resolve, prerenderOptions.retryDelay),\n )\n retriesByPath.set(page.path, retries + 1)\n addCrawlPageTask(page)\n } else if (prerenderOptions.failOnError ?? true) {\n throw error\n }\n }\n })\n }\n }\n}\n\nasync function startPreviewServer(\n viteConfig: ResolvedConfig,\n): Promise<PreviewServer> {\n const vite = await import('vite')\n\n try {\n return await vite.preview({\n configFile: viteConfig.configFile,\n preview: {\n port: 0,\n open: false,\n },\n })\n } catch (error) {\n throw new Error(\n 'Failed to start the Vite preview server for prerendering',\n {\n cause: error,\n },\n )\n }\n}\n\nfunction getResolvedUrl(previewServer: PreviewServer): URL {\n const baseUrl = previewServer.resolvedUrls?.local[0]\n\n if (!baseUrl) {\n throw new Error('No resolved URL is available from the Vite preview server')\n }\n\n return new URL(baseUrl)\n}\n\nfunction validateAndNormalizePrerenderPages(\n pages: Array<Page>,\n routerBaseUrl: URL,\n): Array<Page> {\n return pages.map((page) => {\n let url: URL\n try {\n url = new URL(page.path, routerBaseUrl)\n } catch (err) {\n throw new Error(`prerender page path must be relative: ${page.path}`, {\n cause: err,\n })\n }\n\n if (url.origin !== 'http://localhost') {\n throw new Error(`prerender page path must be relative: ${page.path}`)\n }\n\n const decodedPathname = decodeURIComponent(url.pathname)\n\n return {\n ...page,\n path: decodedPathname + url.search + url.hash,\n }\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"prerender.js","names":[],"sources":["../../../src/vite/prerender.ts"],"sourcesContent":["import { VITE_ENVIRONMENT_NAMES } from '../constants'\nimport { prerender } from '../prerender'\nimport type { PrerenderHandler } from '../prerender'\nimport type { TanStackStartOutputConfig } from '../schema'\nimport type { PreviewServer, ResolvedConfig, ViteBuilder } from 'vite'\n\nexport async function prerenderWithVite({\n startConfig,\n builder,\n}: {\n startConfig: TanStackStartOutputConfig\n builder: ViteBuilder\n}) {\n const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server]\n\n if (!serverEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.server}\" environment not found`,\n )\n }\n\n const clientEnv = builder.environments[VITE_ENVIRONMENT_NAMES.client]\n if (!clientEnv) {\n throw new Error(\n `Vite's \"${VITE_ENVIRONMENT_NAMES.client}\" environment not found`,\n )\n }\n\n const outputDir = clientEnv.config.build.outDir\n\n process.env.TSS_PRERENDERING = 'true'\n process.env.TSS_CLIENT_OUTPUT_DIR = outputDir\n\n const previewServer = await startPreviewServer(serverEnv.config)\n const baseUrl = getResolvedUrl(previewServer)\n\n const handler: PrerenderHandler = {\n getClientOutputDirectory() {\n return outputDir\n },\n request(path, options) {\n const url = new URL(path, baseUrl)\n return fetch(new Request(url, options))\n },\n close() {\n return previewServer.close()\n },\n }\n\n return prerender({\n startConfig,\n handler,\n })\n}\n\nasync function startPreviewServer(\n viteConfig: ResolvedConfig,\n): Promise<PreviewServer> {\n const vite = await import('vite')\n\n try {\n return await vite.preview({\n configFile: viteConfig.configFile,\n preview: {\n port: 0,\n open: false,\n },\n })\n } catch (error) {\n throw new Error(\n 'Failed to start the Vite preview server for prerendering',\n {\n cause: error,\n },\n )\n }\n}\n\nfunction getResolvedUrl(previewServer: PreviewServer): URL {\n const baseUrl = previewServer.resolvedUrls?.local[0]\n\n if (!baseUrl) {\n throw new Error('No resolved URL is available from the Vite preview server')\n }\n\n return new URL(baseUrl)\n}\n"],"mappings":";;;AAMA,eAAsB,kBAAkB,EACtC,aACA,WAIC;CACD,MAAM,YAAY,QAAQ,aAAa,uBAAuB;AAE9D,KAAI,CAAC,UACH,OAAM,IAAI,MACR,WAAW,uBAAuB,OAAO,yBAC1C;CAGH,MAAM,YAAY,QAAQ,aAAa,uBAAuB;AAC9D,KAAI,CAAC,UACH,OAAM,IAAI,MACR,WAAW,uBAAuB,OAAO,yBAC1C;CAGH,MAAM,YAAY,UAAU,OAAO,MAAM;AAEzC,SAAQ,IAAI,mBAAmB;AAC/B,SAAQ,IAAI,wBAAwB;CAEpC,MAAM,gBAAgB,MAAM,mBAAmB,UAAU,OAAO;CAChE,MAAM,UAAU,eAAe,cAAc;AAe7C,QAAO,UAAU;EACf;EACA,SAfgC;GAChC,2BAA2B;AACzB,WAAO;;GAET,QAAQ,MAAM,SAAS;IACrB,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ;AAClC,WAAO,MAAM,IAAI,QAAQ,KAAK,QAAQ,CAAC;;GAEzC,QAAQ;AACN,WAAO,cAAc,OAAO;;GAE/B;EAKA,CAAC;;AAGJ,eAAe,mBACb,YACwB;CACxB,MAAM,OAAO,MAAM,OAAO;AAE1B,KAAI;AACF,SAAO,MAAM,KAAK,QAAQ;GACxB,YAAY,WAAW;GACvB,SAAS;IACP,MAAM;IACN,MAAM;IACP;GACF,CAAC;UACK,OAAO;AACd,QAAM,IAAI,MACR,4DACA,EACE,OAAO,OACR,CACF;;;AAIL,SAAS,eAAe,eAAmC;CACzD,MAAM,UAAU,cAAc,cAAc,MAAM;AAElD,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,4DAA4D;AAG9E,QAAO,IAAI,IAAI,QAAQ"}
@@ -78,11 +78,11 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
78
78
  codeSplittingOptions: z.ZodOptional<z.ZodOptional<z.ZodType<import('@tanstack/router-plugin').CodeSplittingOptions, z.ZodTypeDef, import('@tanstack/router-plugin').CodeSplittingOptions>>>;
79
79
  plugin: z.ZodOptional<z.ZodOptional<z.ZodObject<{
80
80
  hmr: z.ZodOptional<z.ZodObject<{
81
- hotExpression: z.ZodOptional<z.ZodString>;
81
+ style: z.ZodOptional<z.ZodEnum<["vite", "webpack"]>>;
82
82
  }, "strip", z.ZodTypeAny, {
83
- hotExpression?: string | undefined;
83
+ style?: "vite" | "webpack" | undefined;
84
84
  }, {
85
- hotExpression?: string | undefined;
85
+ style?: "vite" | "webpack" | undefined;
86
86
  }>>;
87
87
  vite: z.ZodOptional<z.ZodObject<{
88
88
  environmentName: z.ZodOptional<z.ZodString>;
@@ -92,19 +92,19 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
92
92
  environmentName?: string | undefined;
93
93
  }>>;
94
94
  }, "strip", z.ZodTypeAny, {
95
- hmr?: {
96
- hotExpression?: string | undefined;
97
- } | undefined;
98
95
  vite?: {
99
96
  environmentName?: string | undefined;
100
97
  } | undefined;
101
- }, {
102
98
  hmr?: {
103
- hotExpression?: string | undefined;
99
+ style?: "vite" | "webpack" | undefined;
104
100
  } | undefined;
101
+ }, {
105
102
  vite?: {
106
103
  environmentName?: string | undefined;
107
104
  } | undefined;
105
+ hmr?: {
106
+ style?: "vite" | "webpack" | undefined;
107
+ } | undefined;
108
108
  }>>>;
109
109
  }, "strip", z.ZodTypeAny, {
110
110
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
@@ -143,12 +143,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
143
143
  enableRouteGeneration?: boolean | undefined;
144
144
  codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
145
145
  plugin?: {
146
- hmr?: {
147
- hotExpression?: string | undefined;
148
- } | undefined;
149
146
  vite?: {
150
147
  environmentName?: string | undefined;
151
148
  } | undefined;
149
+ hmr?: {
150
+ style?: "vite" | "webpack" | undefined;
151
+ } | undefined;
152
152
  } | undefined;
153
153
  }, {
154
154
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
@@ -187,12 +187,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
187
187
  enableRouteGeneration?: boolean | undefined;
188
188
  codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
189
189
  plugin?: {
190
- hmr?: {
191
- hotExpression?: string | undefined;
192
- } | undefined;
193
190
  vite?: {
194
191
  environmentName?: string | undefined;
195
192
  } | undefined;
193
+ hmr?: {
194
+ style?: "vite" | "webpack" | undefined;
195
+ } | undefined;
196
196
  } | undefined;
197
197
  }>>>>>>;
198
198
  client: z.ZodDefault<z.ZodOptional<z.ZodObject<{
@@ -2438,12 +2438,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
2438
2438
  enableRouteGeneration?: boolean | undefined;
2439
2439
  codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
2440
2440
  plugin?: {
2441
- hmr?: {
2442
- hotExpression?: string | undefined;
2443
- } | undefined;
2444
2441
  vite?: {
2445
2442
  environmentName?: string | undefined;
2446
2443
  } | undefined;
2444
+ hmr?: {
2445
+ style?: "vite" | "webpack" | undefined;
2446
+ } | undefined;
2447
2447
  } | undefined;
2448
2448
  };
2449
2449
  serverFns: {
@@ -2766,12 +2766,12 @@ export declare const tanstackStartViteOptionsSchema: z.ZodDefault<z.ZodOptional<
2766
2766
  enableRouteGeneration?: boolean | undefined;
2767
2767
  codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
2768
2768
  plugin?: {
2769
- hmr?: {
2770
- hotExpression?: string | undefined;
2771
- } | undefined;
2772
2769
  vite?: {
2773
2770
  environmentName?: string | undefined;
2774
2771
  } | undefined;
2772
+ hmr?: {
2773
+ style?: "vite" | "webpack" | undefined;
2774
+ } | undefined;
2775
2775
  } | undefined;
2776
2776
  }) | undefined;
2777
2777
  serverFns?: {
@@ -3068,12 +3068,12 @@ export declare function parseStartConfig(opts: z.input<typeof tanstackStartViteO
3068
3068
  enableRouteGeneration?: boolean | undefined;
3069
3069
  codeSplittingOptions?: import('@tanstack/router-plugin').CodeSplittingOptions | undefined;
3070
3070
  plugin?: {
3071
- hmr?: {
3072
- hotExpression?: string | undefined;
3073
- } | undefined;
3074
3071
  vite?: {
3075
3072
  environmentName?: string | undefined;
3076
3073
  } | undefined;
3074
+ hmr?: {
3075
+ style?: "vite" | "webpack" | undefined;
3076
+ } | undefined;
3077
3077
  } | undefined;
3078
3078
  virtualRouteConfig?: string | import('@tanstack/virtual-file-routes').VirtualRootRoute | undefined;
3079
3079
  routeFilePrefix?: string | undefined;
@@ -0,0 +1,2 @@
1
+ import { EnvironmentModuleNode } from 'vite';
2
+ export declare function mergeHotUpdateModules(currentModules: Array<EnvironmentModuleNode>, additionalModules: Array<EnvironmentModuleNode>): Array<EnvironmentModuleNode> | undefined;
@@ -0,0 +1,16 @@
1
+ //#region src/vite/start-compiler-plugin/hot-update.ts
2
+ function mergeHotUpdateModules(currentModules, additionalModules) {
3
+ if (additionalModules.length === 0) return;
4
+ const mergedModules = currentModules.slice();
5
+ const seenModules = new Set(currentModules);
6
+ for (const mod of additionalModules) {
7
+ if (seenModules.has(mod)) continue;
8
+ seenModules.add(mod);
9
+ mergedModules.push(mod);
10
+ }
11
+ return mergedModules;
12
+ }
13
+ //#endregion
14
+ export { mergeHotUpdateModules };
15
+
16
+ //# sourceMappingURL=hot-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-update.js","names":[],"sources":["../../../../src/vite/start-compiler-plugin/hot-update.ts"],"sourcesContent":["import type { EnvironmentModuleNode } from 'vite'\n\nexport function mergeHotUpdateModules(\n currentModules: Array<EnvironmentModuleNode>,\n additionalModules: Array<EnvironmentModuleNode>,\n): Array<EnvironmentModuleNode> | undefined {\n if (additionalModules.length === 0) {\n return undefined\n }\n\n const mergedModules = currentModules.slice()\n const seenModules = new Set(currentModules)\n\n for (const mod of additionalModules) {\n if (seenModules.has(mod)) {\n continue\n }\n\n seenModules.add(mod)\n mergedModules.push(mod)\n }\n\n return mergedModules\n}\n"],"mappings":";AAEA,SAAgB,sBACd,gBACA,mBAC0C;AAC1C,KAAI,kBAAkB,WAAW,EAC/B;CAGF,MAAM,gBAAgB,eAAe,OAAO;CAC5C,MAAM,cAAc,IAAI,IAAI,eAAe;AAE3C,MAAK,MAAM,OAAO,mBAAmB;AACnC,MAAI,YAAY,IAAI,IAAI,CACtB;AAGF,cAAY,IAAI,IAAI;AACpB,gBAAc,KAAK,IAAI;;AAGzB,QAAO"}