@timber-js/app 0.2.0-alpha.196 → 0.2.0-alpha.198

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 (289) hide show
  1. package/dist/_chunks/{actions-CWYtq6ii.js → actions-BS-m5SLv.js} +3 -3
  2. package/dist/_chunks/{actions-CWYtq6ii.js.map → actions-BS-m5SLv.js.map} +1 -1
  3. package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -1
  4. package/dist/_chunks/{build-manifest-DWppEdLB.js → build-manifest-DTmSGLRz.js} +51 -2
  5. package/dist/_chunks/build-manifest-DTmSGLRz.js.map +1 -0
  6. package/dist/_chunks/{cache-api-CQeYzA5g.js → cache-api-DqzgTEqk.js} +4 -49
  7. package/dist/_chunks/cache-api-DqzgTEqk.js.map +1 -0
  8. package/dist/_chunks/{chains-h7EO-u3n.js → chains-CZG7E5zg.js} +2 -2
  9. package/dist/_chunks/{chains-h7EO-u3n.js.map → chains-CZG7E5zg.js.map} +1 -1
  10. package/dist/_chunks/{cli-check-BVthpfLS.js → cli-check-dVDi1GQz.js} +3 -3
  11. package/dist/_chunks/{cli-check-BVthpfLS.js.map → cli-check-dVDi1GQz.js.map} +1 -1
  12. package/dist/_chunks/{cli-schema-sync-3Wutm8pH.js → cli-schema-sync-DTy_-Msq.js} +2 -2
  13. package/dist/_chunks/{cli-schema-sync-3Wutm8pH.js.map → cli-schema-sync-DTy_-Msq.js.map} +1 -1
  14. package/dist/_chunks/{cloudflare-BKJC3SC_.js → cloudflare-BFb__LYG.js} +2 -2
  15. package/dist/_chunks/{cloudflare-BKJC3SC_.js.map → cloudflare-BFb__LYG.js.map} +1 -1
  16. package/dist/_chunks/{convention-lint-DO10_pVl.js → convention-lint-Ph6luW4c.js} +4 -2
  17. package/dist/_chunks/convention-lint-Ph6luW4c.js.map +1 -0
  18. package/dist/_chunks/{error-boundary-D-lkwyaD.js → error-boundary-BvRCCmbN.js} +3 -3
  19. package/dist/_chunks/{error-boundary-D-lkwyaD.js.map → error-boundary-BvRCCmbN.js.map} +1 -1
  20. package/dist/_chunks/{href-validation-CMc5JRls.js → href-validation-BIrxavIy.js} +74 -2
  21. package/dist/_chunks/href-validation-BIrxavIy.js.map +1 -0
  22. package/dist/_chunks/{live-graph-Bx4HodF1.js → live-graph-BXDsdzBv.js} +3 -3
  23. package/dist/_chunks/{live-graph-Bx4HodF1.js.map → live-graph-BXDsdzBv.js.map} +1 -1
  24. package/dist/_chunks/{logger-pumCm3Il.js → logger-DDirEsn7.js} +3 -4
  25. package/dist/_chunks/{logger-pumCm3Il.js.map → logger-DDirEsn7.js.map} +1 -1
  26. package/dist/_chunks/navigation-root-B00jjGd5.js +233 -0
  27. package/dist/_chunks/navigation-root-B00jjGd5.js.map +1 -0
  28. package/dist/_chunks/{segment-context-CjOlyB8Y.js → param-value-C8TNYchQ.js} +2 -33
  29. package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
  30. package/dist/_chunks/{poison-scan-BAxfTT5L.js → poison-scan-BoDLgbix.js} +2 -2
  31. package/dist/_chunks/{poison-scan-BAxfTT5L.js.map → poison-scan-BoDLgbix.js.map} +1 -1
  32. package/dist/_chunks/{router-ref-BzqbPwYC.js → router-ref-8gr8qsxN.js} +2 -2
  33. package/dist/_chunks/{router-ref-BzqbPwYC.js.map → router-ref-8gr8qsxN.js.map} +1 -1
  34. package/dist/_chunks/{rsc-cache-key-DD0fl_-s.js → rsc-cache-key-ClUiXQnK.js} +2 -2
  35. package/dist/_chunks/{rsc-cache-key-DD0fl_-s.js.map → rsc-cache-key-ClUiXQnK.js.map} +1 -1
  36. package/dist/_chunks/{scanner-BRIOmHE2.js → scanner-tdFPvDYi.js} +174 -7
  37. package/dist/_chunks/scanner-tdFPvDYi.js.map +1 -0
  38. package/dist/_chunks/segment-context-D9_89u34.js +34 -0
  39. package/dist/_chunks/segment-context-D9_89u34.js.map +1 -0
  40. package/dist/_chunks/singleflight-2lUWfcAk.js +54 -0
  41. package/dist/_chunks/singleflight-2lUWfcAk.js.map +1 -0
  42. package/dist/_chunks/{ssr-data-Ya2HJPFp.js → ssr-data-BQGhTPAK.js} +2 -17
  43. package/dist/_chunks/ssr-data-BQGhTPAK.js.map +1 -0
  44. package/dist/_chunks/{walkers-BU6z9xRV.js → walkers-DNX05dC0.js} +2 -2
  45. package/dist/_chunks/{walkers-BU6z9xRV.js.map → walkers-DNX05dC0.js.map} +1 -1
  46. package/dist/adapters/cloudflare-dev.js +1 -1
  47. package/dist/adapters/cloudflare-kv-cache.js +1 -1
  48. package/dist/adapters/cloudflare.js +1 -1
  49. package/dist/adapters/nitro.d.ts +1 -1
  50. package/dist/adapters/nitro.d.ts.map +1 -1
  51. package/dist/adapters/nitro.js.map +1 -1
  52. package/dist/analyze/crawl-entry.js +2 -2
  53. package/dist/analyze/graph-command.js +2 -2
  54. package/dist/cache/index.js +1 -1
  55. package/dist/cache/singleflight.d.ts +2 -0
  56. package/dist/cache/singleflight.d.ts.map +1 -1
  57. package/dist/cli.js +2 -2
  58. package/dist/client/browser-entry/hydrate.d.ts +21 -15
  59. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  60. package/dist/client/browser-entry/index.d.ts +4 -3
  61. package/dist/client/browser-entry/index.d.ts.map +1 -1
  62. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  63. package/dist/client/browser-entry/router-init.d.ts +17 -1
  64. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  65. package/dist/client/error-boundary.js +1 -1
  66. package/dist/client/global-context.d.ts +15 -0
  67. package/dist/client/global-context.d.ts.map +1 -0
  68. package/dist/client/index.js +138 -35
  69. package/dist/client/index.js.map +1 -1
  70. package/dist/client/internal.d.ts +0 -1
  71. package/dist/client/internal.d.ts.map +1 -1
  72. package/dist/client/internal.js +206 -55
  73. package/dist/client/internal.js.map +1 -1
  74. package/dist/client/link.d.ts.map +1 -1
  75. package/dist/client/location-search.d.ts +12 -0
  76. package/dist/client/location-search.d.ts.map +1 -0
  77. package/dist/client/navigation-api.d.ts.map +1 -1
  78. package/dist/client/navigation-commit.d.ts +18 -0
  79. package/dist/client/navigation-commit.d.ts.map +1 -1
  80. package/dist/client/navigation-context.d.ts +13 -11
  81. package/dist/client/navigation-context.d.ts.map +1 -1
  82. package/dist/client/navigation-root.d.ts +47 -108
  83. package/dist/client/navigation-root.d.ts.map +1 -1
  84. package/dist/client/navigation-transition.d.ts +136 -0
  85. package/dist/client/navigation-transition.d.ts.map +1 -0
  86. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  87. package/dist/client/params-context.d.ts +4 -5
  88. package/dist/client/params-context.d.ts.map +1 -1
  89. package/dist/client/react-root.d.ts +44 -0
  90. package/dist/client/react-root.d.ts.map +1 -0
  91. package/dist/client/router-pipeline.d.ts +2 -2
  92. package/dist/client/router-pipeline.d.ts.map +1 -1
  93. package/dist/client/router-types.d.ts +12 -2
  94. package/dist/client/router-types.d.ts.map +1 -1
  95. package/dist/client/router.d.ts.map +1 -1
  96. package/dist/client/segment-cache.d.ts +39 -0
  97. package/dist/client/segment-cache.d.ts.map +1 -1
  98. package/dist/client/segment-context.d.ts.map +1 -1
  99. package/dist/client/segment-outlet.d.ts +25 -14
  100. package/dist/client/segment-outlet.d.ts.map +1 -1
  101. package/dist/client/segment-update-context.d.ts +3 -9
  102. package/dist/client/segment-update-context.d.ts.map +1 -1
  103. package/dist/client/slot-content-cache-context.d.ts +35 -0
  104. package/dist/client/slot-content-cache-context.d.ts.map +1 -0
  105. package/dist/client/ssr-data.d.ts +8 -2
  106. package/dist/client/ssr-data.d.ts.map +1 -1
  107. package/dist/client/state.d.ts +0 -15
  108. package/dist/client/state.d.ts.map +1 -1
  109. package/dist/client/use-pathname.d.ts +13 -11
  110. package/dist/client/use-pathname.d.ts.map +1 -1
  111. package/dist/client/use-search-params.d.ts +13 -13
  112. package/dist/client/use-search-params.d.ts.map +1 -1
  113. package/dist/client/use-segment-params.d.ts +18 -68
  114. package/dist/client/use-segment-params.d.ts.map +1 -1
  115. package/dist/config-types.d.ts +17 -0
  116. package/dist/config-types.d.ts.map +1 -1
  117. package/dist/config-validation.d.ts.map +1 -1
  118. package/dist/cookies/index.js +1 -1
  119. package/dist/dev-tools/holding-server.d.ts +15 -10
  120. package/dist/dev-tools/holding-server.d.ts.map +1 -1
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +44 -43
  123. package/dist/index.js.map +1 -1
  124. package/dist/plugins/dev-server.d.ts.map +1 -1
  125. package/dist/plugins/entries.d.ts.map +1 -1
  126. package/dist/plugins/shims.d.ts.map +1 -1
  127. package/dist/plugins/static-build.d.ts +2 -2
  128. package/dist/plugins/static-build.d.ts.map +1 -1
  129. package/dist/routing/codegen-write.d.ts.map +1 -1
  130. package/dist/routing/index.js +2 -2
  131. package/dist/routing/interception-overlap.d.ts +35 -0
  132. package/dist/routing/interception-overlap.d.ts.map +1 -0
  133. package/dist/routing/interception.d.ts.map +1 -1
  134. package/dist/rsc-runtime/ssr.d.ts +3 -1
  135. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  136. package/dist/server/als-registry.d.ts +6 -0
  137. package/dist/server/als-registry.d.ts.map +1 -1
  138. package/dist/server/csp-nonce.d.ts +45 -0
  139. package/dist/server/csp-nonce.d.ts.map +1 -0
  140. package/dist/server/default-status-page.d.ts.map +1 -1
  141. package/dist/server/deny-renderer.d.ts.map +1 -1
  142. package/dist/server/flight-scripts.d.ts +5 -2
  143. package/dist/server/flight-scripts.d.ts.map +1 -1
  144. package/dist/server/html-injector-core.d.ts +17 -2
  145. package/dist/server/html-injector-core.d.ts.map +1 -1
  146. package/dist/server/html-injectors.d.ts +3 -2
  147. package/dist/server/html-injectors.d.ts.map +1 -1
  148. package/dist/server/index.js +2 -2
  149. package/dist/server/internal.js +86 -37
  150. package/dist/server/internal.js.map +1 -1
  151. package/dist/server/metadata-render.d.ts.map +1 -1
  152. package/dist/server/node-stream-transforms.d.ts +3 -17
  153. package/dist/server/node-stream-transforms.d.ts.map +1 -1
  154. package/dist/server/nuqs-ssr-provider.d.ts +7 -3
  155. package/dist/server/nuqs-ssr-provider.d.ts.map +1 -1
  156. package/dist/server/pipeline-phases.d.ts.map +1 -1
  157. package/dist/server/prebuilt/key-discipline.d.ts +32 -3
  158. package/dist/server/prebuilt/key-discipline.d.ts.map +1 -1
  159. package/dist/server/primitives.d.ts.map +1 -1
  160. package/dist/server/render-utils.d.ts +4 -3
  161. package/dist/server/render-utils.d.ts.map +1 -1
  162. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -1
  163. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  164. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  165. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  166. package/dist/server/ssr-bridge-types.d.ts +22 -2
  167. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  168. package/dist/server/ssr-entry.d.ts.map +1 -1
  169. package/dist/server/ssr-render.d.ts +5 -1
  170. package/dist/server/ssr-render.d.ts.map +1 -1
  171. package/dist/server/ssr-wrappers.d.ts +59 -27
  172. package/dist/server/ssr-wrappers.d.ts.map +1 -1
  173. package/dist/server/types.d.ts +10 -0
  174. package/dist/server/types.d.ts.map +1 -1
  175. package/dist/shims/navigation-rsc.d.ts +21 -0
  176. package/dist/shims/navigation-rsc.d.ts.map +1 -0
  177. package/docs/api/30-api-server.mdx +1 -0
  178. package/docs/api/35-api-typescript.mdx +4 -83
  179. package/docs/learn/03-fetching-data.mdx +1 -1
  180. package/docs/learn/{03b-access-control.mdx → 04-access-control.mdx} +2 -17
  181. package/docs/learn/05-the-flush-point.mdx +175 -0
  182. package/docs/learn/{05-typed-params.mdx → 06-typed-params.mdx} +1 -1
  183. package/docs/learn/07-typed-routes.mdx +25 -49
  184. package/docs/learn/{08-streaming.mdx → 09-streaming.mdx} +1 -7
  185. package/docs/learn/{10-middleware.mdx → 11-middleware.mdx} +1 -0
  186. package/package.json +3 -3
  187. package/src/adapters/nitro.ts +7 -7
  188. package/src/cache/singleflight.ts +5 -0
  189. package/src/client/browser-entry/hydrate.ts +54 -104
  190. package/src/client/browser-entry/index.ts +16 -6
  191. package/src/client/browser-entry/post-hydration.ts +3 -2
  192. package/src/client/browser-entry/router-init.ts +84 -33
  193. package/src/client/global-context.ts +31 -0
  194. package/src/client/internal.ts +1 -2
  195. package/src/client/link.tsx +18 -18
  196. package/src/client/location-search.ts +15 -0
  197. package/src/client/navigation-api.ts +4 -2
  198. package/src/client/navigation-commit.ts +48 -2
  199. package/src/client/navigation-context.ts +25 -37
  200. package/src/client/navigation-root.tsx +55 -411
  201. package/src/client/navigation-transition.ts +278 -0
  202. package/src/client/nuqs-adapter.tsx +4 -5
  203. package/src/client/params-context.ts +13 -18
  204. package/src/client/react-root.ts +72 -0
  205. package/src/client/router-lifecycle.ts +1 -1
  206. package/src/client/router-pipeline.ts +96 -22
  207. package/src/client/router-types.ts +12 -2
  208. package/src/client/router.ts +48 -36
  209. package/src/client/segment-cache.ts +70 -2
  210. package/src/client/segment-context.ts +7 -4
  211. package/src/client/segment-outlet.tsx +41 -86
  212. package/src/client/segment-update-context.ts +7 -26
  213. package/src/client/slot-content-cache-context.ts +43 -0
  214. package/src/client/ssr-data.ts +8 -2
  215. package/src/client/state.ts +0 -26
  216. package/src/client/use-pathname.ts +21 -31
  217. package/src/client/use-search-params.ts +31 -29
  218. package/src/client/use-segment-params.ts +27 -126
  219. package/src/config-types.ts +17 -0
  220. package/src/config-validation.ts +17 -0
  221. package/src/dev-tools/holding-server.ts +23 -12
  222. package/src/index.ts +26 -11
  223. package/src/plugins/dev-server.ts +9 -12
  224. package/src/plugins/entries.ts +3 -0
  225. package/src/plugins/shims.ts +8 -7
  226. package/src/plugins/static-build.ts +9 -5
  227. package/src/react-canary.d.ts +2 -0
  228. package/src/routing/codegen-write.ts +2 -0
  229. package/src/routing/interception-overlap.ts +141 -0
  230. package/src/routing/interception.ts +118 -5
  231. package/src/rsc-runtime/ssr.ts +3 -2
  232. package/src/server/als-registry.ts +6 -0
  233. package/src/server/csp-nonce.ts +70 -0
  234. package/src/server/default-status-page.ts +1 -0
  235. package/src/server/deny-renderer.ts +7 -3
  236. package/src/server/flight-scripts.ts +9 -4
  237. package/src/server/html-injector-core.ts +26 -9
  238. package/src/server/html-injectors.ts +8 -8
  239. package/src/server/metadata-render.ts +26 -4
  240. package/src/server/node-stream-transforms.ts +7 -20
  241. package/src/server/nuqs-ssr-provider.tsx +8 -7
  242. package/src/server/pipeline-phases.ts +5 -0
  243. package/src/server/prebuilt/key-discipline.ts +82 -13
  244. package/src/server/prebuilt-runtime.ts +2 -2
  245. package/src/server/primitives.ts +4 -4
  246. package/src/server/render-utils.ts +8 -4
  247. package/src/server/rsc-entry/action-middleware-runner.ts +7 -0
  248. package/src/server/rsc-entry/error-renderer.ts +5 -2
  249. package/src/server/rsc-entry/index.ts +8 -0
  250. package/src/server/rsc-entry/ssr-renderer.ts +11 -4
  251. package/src/server/ssr-bridge-types.ts +22 -2
  252. package/src/server/ssr-entry.ts +35 -28
  253. package/src/server/ssr-render.ts +13 -4
  254. package/src/server/ssr-wrappers.tsx +81 -61
  255. package/src/server/types.ts +10 -0
  256. package/src/shared/slot-params.ts +3 -4
  257. package/src/shims/navigation-rsc.ts +47 -0
  258. package/dist/_chunks/build-manifest-DWppEdLB.js.map +0 -1
  259. package/dist/_chunks/cache-api-CQeYzA5g.js.map +0 -1
  260. package/dist/_chunks/convention-lint-DO10_pVl.js.map +0 -1
  261. package/dist/_chunks/href-validation-CMc5JRls.js.map +0 -1
  262. package/dist/_chunks/scanner-BRIOmHE2.js.map +0 -1
  263. package/dist/_chunks/segment-context-CjOlyB8Y.js.map +0 -1
  264. package/dist/_chunks/slot-params-BCTmZkQB.js +0 -76
  265. package/dist/_chunks/slot-params-BCTmZkQB.js.map +0 -1
  266. package/dist/_chunks/ssr-data-Ya2HJPFp.js.map +0 -1
  267. package/dist/_chunks/use-segment-params-DzTBpkvj.js +0 -398
  268. package/dist/_chunks/use-segment-params-DzTBpkvj.js.map +0 -1
  269. package/docs/learn/04-loading-states.mdx +0 -67
  270. package/docs/learn/04b-the-flush-point.mdx +0 -115
  271. package/docs/learn/12-client-navigation.mdx +0 -176
  272. package/docs/learn/13-configuration.mdx +0 -166
  273. package/docs/more/01-advanced-routing.mdx +0 -344
  274. package/docs/more/02-advanced-forms.mdx +0 -137
  275. package/docs/more/03-coming-from-nextjs.mdx +0 -186
  276. package/docs/more/04-metadata-and-fonts.mdx +0 -193
  277. package/docs/more/04b-mdx.mdx +0 -229
  278. package/docs/more/05-content-collections.mdx +0 -90
  279. package/docs/more/06-instrumentation.mdx +0 -214
  280. package/docs/more/07-security.mdx +0 -129
  281. package/docs/more/08-developer-experience.mdx +0 -134
  282. package/docs/more/40-why-timber.mdx +0 -50
  283. package/docs/more/41-timber-vs-nextjs.mdx +0 -81
  284. package/docs/more/42-timber-vs-others.mdx +0 -68
  285. package/docs/more/50-ai-agent-instructions.mdx +0 -171
  286. /package/docs/learn/{06-forms-and-actions.mdx → 08-forms-and-actions.mdx} +0 -0
  287. /package/docs/learn/{09-caching.mdx → 10-caching.mdx} +0 -0
  288. /package/docs/learn/{11-error-handling.mdx → 12-error-handling.mdx} +0 -0
  289. /package/docs/learn/{14-deploying.mdx → 13-deploying.mdx} +0 -0
@@ -13,8 +13,10 @@
13
13
  *
14
14
  * The holding server is started in rootSync's config() hook (the
15
15
  * earliest Vite plugin lifecycle point where we know the port) and
16
- * closed in timber-dev-server's configureServer() hook (the last
17
- * plugin, right before Vite calls server.listen()).
16
+ * closed directly in timber-dev-server's configureServer() hook
17
+ * (the last plugin, fire-and-forget). configureServer runs during
18
+ * createServer(), well before Vite's port probe and bind, so the
19
+ * port is free by the time httpServerStart() runs. (TIM-1419)
18
20
  *
19
21
  * Browser requests (Accept: text/html) get the HTML holding page.
20
22
  * API requests (Accept: application/json) get a 503 JSON response.
@@ -24,10 +26,12 @@
24
26
  */
25
27
  export interface HoldingServer {
26
28
  /**
27
- * Start listening on the given port.
29
+ * Start listening on the given port and host.
30
+ * The host must match Vite's resolved `server.host` so the probe
31
+ * faithfully detects conflicts on the same address Vite will bind.
28
32
  * Returns the actual bound port (useful when port is 0 for OS assignment).
29
33
  */
30
- listen(port: number): Promise<number>;
34
+ listen(port: number, host?: string): Promise<number>;
31
35
  /** Gracefully close the server and stop accepting connections. */
32
36
  close(): Promise<void>;
33
37
  }
@@ -42,12 +46,13 @@ export interface HoldingServer {
42
46
  * const holding = createHoldingServer();
43
47
  * await bindWithBump((p) => holding.listen(p), { startPort: 3000, autoBump: true });
44
48
  *
45
- * // In last plugin's configureServer() — wrap listen for seamless handoff
46
- * const originalListen = server.listen.bind(server);
47
- * server.listen = async (...args) => {
48
- * await holding.close();
49
- * return originalListen(...args);
50
- * };
49
+ * // In last plugin's configureServer() — close directly so Vite 8's
50
+ * // isPortAvailable() probe and httpServer.listen() both see a free
51
+ * // port. SO_REUSEADDR allows immediate rebind. (TIM-1419)
52
+ * if (ctx.holdingServer) {
53
+ * ctx.holdingServer.close().catch(() => {});
54
+ * ctx.holdingServer = null;
55
+ * }
51
56
  * ```
52
57
  */
53
58
  export declare function createHoldingServer(): HoldingServer;
@@ -1 +1 @@
1
- {"version":3,"file":"holding-server.d.ts","sourceRoot":"","sources":["../../src/dev-tools/holding-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtC,kEAAkE;IAClE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA8ED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAmDnD"}
1
+ {"version":3,"file":"holding-server.d.ts","sourceRoot":"","sources":["../../src/dev-tools/holding-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAErD,kEAAkE;IAClE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA8ED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAyDnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAyCjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAa1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQ1D,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElG;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,MAAM;CAAG;AAE1B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEvE;AAyGD,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAsXhE;eAEc,MAAM"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAyCjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAa1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQ1D,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElG;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,MAAM;CAAG;AAE1B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEvE;AAyGD,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAqYhE;eAEc,MAAM"}
package/dist/index.js CHANGED
@@ -2,17 +2,17 @@ import { l as registerDevDiscovery } from "./_chunks/graph-cache-CP4GEmf9.js";
2
2
  import { n as isScannableSourceFile, t as buildSourceExtensions } from "./_chunks/scan-BoP17W3w.js";
3
3
  import { t as RSC_CONTENT_TYPE } from "./_chunks/rsc-media-type-DDc7duTD.js";
4
4
  import { a as canonicalize, d as isMetadataRouteServePath, u as isDynamicMetadataExtension } from "./_chunks/segment-keys-BhqoHiLc.js";
5
- import { i as matchUrlParts, n as scanRoutes, r as collectInterceptionRewrites } from "./_chunks/scanner-BRIOmHE2.js";
5
+ import { i as matchUrlParts, n as scanRoutes, r as collectInterceptionRewrites } from "./_chunks/scanner-tdFPvDYi.js";
6
6
  import { t as MDX_EXTENSIONS } from "./_chunks/mdx-file-CXyHGUpS.js";
7
- import { h as swallow } from "./_chunks/logger-pumCm3Il.js";
8
- import { c as writeRouteCodegen, i as getPrerenderExport, l as buildDirToRouteMap, n as formatConventionWarnings, r as lintConventions, s as flushCodegenWrites, t as checkAppDirExists } from "./_chunks/convention-lint-DO10_pVl.js";
7
+ import { h as swallow } from "./_chunks/logger-DDirEsn7.js";
8
+ import { c as writeRouteCodegen, i as getPrerenderExport, l as buildDirToRouteMap, n as formatConventionWarnings, r as lintConventions, s as flushCodegenWrites, t as checkAppDirExists } from "./_chunks/convention-lint-Ph6luW4c.js";
9
9
  import { c as resolveClientJavascript, i as mergeFileConfig, l as createNoopTimer, o as resolveAppDir, r as loadTimberConfigFile, s as resolveBuildDir, t as createPluginContext } from "./_chunks/plugin-context-8idfR3UZ.js";
10
- import { r as validateSchemaAgainstRoutes, t as collectLeafRoutes } from "./_chunks/walkers-BU6z9xRV.js";
10
+ import { r as validateSchemaAgainstRoutes, t as collectLeafRoutes } from "./_chunks/walkers-DNX05dC0.js";
11
11
  import { i as poisonPillSource, r as markerFor, t as EXPLICIT_MARKERS } from "./_chunks/poison-rules-DoEhbqaY.js";
12
12
  import { i as withBasePath, n as normalizeBasePath, t as isRelativeBase } from "./_chunks/base-path-DaQrzbez.js";
13
+ import { t as EMPTY_BUILD_MANIFEST } from "./_chunks/build-manifest-DTmSGLRz.js";
13
14
  import { t as rscPayloadPath } from "./_chunks/rsc-payload-path-B_LBodc2.js";
14
15
  import { a as REDIRECTS_FILE, n as detectFsIdentity, o as RESERVED_OUTPUT_PATHS, r as fsKey, t as EXACT_FS_IDENTITY } from "./_chunks/fs-identity-D7vb6GdI.js";
15
- import { t as EMPTY_BUILD_MANIFEST } from "./_chunks/build-manifest-DWppEdLB.js";
16
16
  import { t as fnv1aHash } from "./_chunks/fast-hash-C-tVYrLb.js";
17
17
  import { t as formatSize } from "./_chunks/format-BKclgVbk.js";
18
18
  import { createLogger, normalizePath, parseAst } from "vite";
@@ -1193,6 +1193,7 @@ var knownKeys = new Set(Object.keys({
1193
1193
  reactCompiler: true,
1194
1194
  sitemap: true,
1195
1195
  buildDir: true,
1196
+ cache: true,
1196
1197
  clientSegmentCache: true,
1197
1198
  topLoader: true,
1198
1199
  budget: true
@@ -1296,6 +1297,14 @@ function validateConfig(config) {
1296
1297
  suggestion: "Example: budget: { firstLoadJs: 150_000 } for a ~150 kB limit."
1297
1298
  });
1298
1299
  }
1300
+ if (config.cache != null && typeof config.cache === "object") {
1301
+ if (config.cache.strictKeyDiscipline !== void 0 && typeof config.cache.strictKeyDiscipline !== "boolean") errors.push({
1302
+ field: "cache.strictKeyDiscipline",
1303
+ message: `cache.strictKeyDiscipline must be a boolean (got ${JSON.stringify(config.cache.strictKeyDiscipline)}).`,
1304
+ value: config.cache.strictKeyDiscipline,
1305
+ suggestion: "Use cache: { strictKeyDiscipline: true } to promote key-discipline warnings to errors."
1306
+ });
1307
+ }
1299
1308
  const MOVED_TO_CACHE_FILE = /* @__PURE__ */ new Set(["cacheHandler", "cdnPurge"]);
1300
1309
  for (const key of Object.keys(config)) if (!knownKeys.has(key)) errors.push({
1301
1310
  field: key,
@@ -1515,7 +1524,7 @@ function createGraphEndpointMiddleware(server, ctx) {
1515
1524
  }
1516
1525
  reflectCors(res, origin);
1517
1526
  try {
1518
- const { classifyLiveFile, classifyLiveProject } = await import("./_chunks/live-graph-Bx4HodF1.js");
1527
+ const { classifyLiveFile, classifyLiveProject } = await import("./_chunks/live-graph-BXDsdzBv.js");
1519
1528
  const preserveSymlinks = server.config.resolve.preserveSymlinks;
1520
1529
  const root = normalizePath(preserveSymlinks ? ctx.root : await realpath(ctx.root));
1521
1530
  const appDir = normalizePath(preserveSymlinks ? ctx.appDir : await realpath(ctx.appDir).catch(() => join(root, relative(ctx.root, ctx.appDir))));
@@ -1894,7 +1903,7 @@ function timberDevServer(ctx) {
1894
1903
  * rewritten /index.html. Vite-internal and asset requests are
1895
1904
  * filtered out explicitly and passed through to Vite.
1896
1905
  */
1897
- configureServer(server) {
1906
+ async configureServer(server) {
1898
1907
  const configPaths = CONFIG_FILE_NAMES.map((name) => join(ctx.root, name));
1899
1908
  server.watcher.add(configPaths);
1900
1909
  listenForClientErrors(server, ctx.root);
@@ -1923,13 +1932,8 @@ function timberDevServer(ctx) {
1923
1932
  server.middlewares.use(createTimberMiddleware(server, ctx));
1924
1933
  registerDevDiscovery(server.httpServer, ctx.root, server.config);
1925
1934
  if (ctx.holdingServer) {
1926
- const originalListen = server.listen.bind(server);
1927
- const holdingRef = ctx.holdingServer;
1935
+ await ctx.holdingServer.close().catch(() => {});
1928
1936
  ctx.holdingServer = null;
1929
- server.listen = async (port, isRestart) => {
1930
- await holdingRef.close().catch(() => {});
1931
- return originalListen(port, isRestart);
1932
- };
1933
1937
  }
1934
1938
  ctx.timer.end("dev-server-setup");
1935
1939
  const summary = ctx.timer.formatSummary();
@@ -2302,6 +2306,7 @@ function generateConfigModule(ctx) {
2302
2306
  forms: serializeFormsConfig(ctx.config.forms),
2303
2307
  deploymentId: ctx.deploymentId ?? null,
2304
2308
  clientSegmentCache: ctx.config.clientSegmentCache ?? false,
2309
+ cache: { strictKeyDiscipline: ctx.config.cache?.strictKeyDiscipline ?? false },
2305
2310
  devBrowserLogs: ctx.config.devBrowserLogs
2306
2311
  };
2307
2312
  return [
@@ -3158,7 +3163,11 @@ function timberShims(_ctx) {
3158
3163
  for (const marker of EXPLICIT_MARKERS) if (id === marker.specifier) return marker.virtualId;
3159
3164
  const cleanId = stripJsExtension(id);
3160
3165
  if (cleanId in SHIM_MAP) {
3161
- if (envName(this) === "client" && cleanId === "next/navigation") return resolve(SHIMS_DIR, "navigation-client.ts");
3166
+ if (cleanId === "next/navigation") {
3167
+ const env = envName(this);
3168
+ if (env === "client") return resolve(SHIMS_DIR, "navigation-client.ts");
3169
+ if (env === "rsc") return resolve(SHIMS_DIR, "navigation-rsc.ts");
3170
+ }
3162
3171
  return SHIM_MAP[cleanId];
3163
3172
  }
3164
3173
  if (cleanId === "#server-only-guard") {
@@ -6695,19 +6704,6 @@ async function stripJsFromRscAssetsManifests(buildDir) {
6695
6704
  //#endregion
6696
6705
  //#region src/server/flight-scripts.ts
6697
6706
  /**
6698
- * Shared Flight data script generation.
6699
- *
6700
- * Both html-injectors.ts (Web Streams / dev) and node-stream-transforms.ts
6701
- * (Node streams / production) use this module to generate inline `<script>`
6702
- * tags for RSC Flight data injection.
6703
- *
6704
- * The init script goes in `<head>` as part of the HTML shell (guaranteed
6705
- * to execute before any streaming chunk scripts). Push scripts are emitted
6706
- * as RSC chunks arrive during streaming.
6707
- *
6708
- * See design/02-rendering-pipeline.md, LOCAL-415
6709
- */
6710
- /**
6711
6707
  * Escape a JSON string for safe embedding inside an HTML `<script>` tag.
6712
6708
  *
6713
6709
  * Prevents XSS via `<\/script>` injection and handles Unicode line/paragraph
@@ -6843,7 +6839,6 @@ function staticOutputPath(entry) {
6843
6839
  * @internal Exported for testing.
6844
6840
  */
6845
6841
  var StaticOutputPaths = class {
6846
- identity;
6847
6842
  claimed = /* @__PURE__ */ new Map();
6848
6843
  /** Every ancestor directory of a claimed path, mapped to its claimant. */
6849
6844
  directories = /* @__PURE__ */ new Map();
@@ -6855,6 +6850,7 @@ var StaticOutputPaths = class {
6855
6850
  * asked, not assumed. Folding unconditionally would reject `/Foo` beside
6856
6851
  * `/foo` on Linux, where both are perfectly servable files.
6857
6852
  */
6853
+ identity;
6858
6854
  constructor(identity = EXACT_FS_IDENTITY) {
6859
6855
  this.identity = identity;
6860
6856
  }
@@ -6905,10 +6901,10 @@ function ancestors(relPath) {
6905
6901
  * @internal Exported for testing.
6906
6902
  */
6907
6903
  var StaticSiteWriter = class {
6908
- staticDir;
6909
6904
  /** Content-Type per URL path for extensionless API routes (TIM-1241). */
6910
6905
  contentTypes = {};
6911
6906
  paths;
6907
+ staticDir;
6912
6908
  constructor(staticDir, identity = EXACT_FS_IDENTITY) {
6913
6909
  this.staticDir = staticDir;
6914
6910
  this.paths = new StaticOutputPaths(identity);
@@ -10800,8 +10796,10 @@ function validateKeyFormat(key) {
10800
10796
  *
10801
10797
  * The holding server is started in rootSync's config() hook (the
10802
10798
  * earliest Vite plugin lifecycle point where we know the port) and
10803
- * closed in timber-dev-server's configureServer() hook (the last
10804
- * plugin, right before Vite calls server.listen()).
10799
+ * closed directly in timber-dev-server's configureServer() hook
10800
+ * (the last plugin, fire-and-forget). configureServer runs during
10801
+ * createServer(), well before Vite's port probe and bind, so the
10802
+ * port is free by the time httpServerStart() runs. (TIM-1419)
10805
10803
  *
10806
10804
  * Browser requests (Accept: text/html) get the HTML holding page.
10807
10805
  * API requests (Accept: application/json) get a 503 JSON response.
@@ -10891,12 +10889,13 @@ var HOLDING_PAGE_HTML = [
10891
10889
  * const holding = createHoldingServer();
10892
10890
  * await bindWithBump((p) => holding.listen(p), { startPort: 3000, autoBump: true });
10893
10891
  *
10894
- * // In last plugin's configureServer() — wrap listen for seamless handoff
10895
- * const originalListen = server.listen.bind(server);
10896
- * server.listen = async (...args) => {
10897
- * await holding.close();
10898
- * return originalListen(...args);
10899
- * };
10892
+ * // In last plugin's configureServer() — close directly so Vite 8's
10893
+ * // isPortAvailable() probe and httpServer.listen() both see a free
10894
+ * // port. SO_REUSEADDR allows immediate rebind. (TIM-1419)
10895
+ * if (ctx.holdingServer) {
10896
+ * ctx.holdingServer.close().catch(() => {});
10897
+ * ctx.holdingServer = null;
10898
+ * }
10900
10899
  * ```
10901
10900
  */
10902
10901
  function createHoldingServer() {
@@ -10922,10 +10921,10 @@ function createHoldingServer() {
10922
10921
  res.end(HOLDING_PAGE_HTML);
10923
10922
  });
10924
10923
  return {
10925
- listen(port) {
10924
+ listen(port, host) {
10926
10925
  return new Promise((resolve, reject) => {
10927
10926
  server.once("error", reject);
10928
- server.listen(port, () => {
10927
+ server.listen(port, host, () => {
10929
10928
  server.removeListener("error", reject);
10930
10929
  const addr = server.address();
10931
10930
  resolve(typeof addr === "object" && addr ? addr.port : port);
@@ -10933,6 +10932,7 @@ function createHoldingServer() {
10933
10932
  });
10934
10933
  },
10935
10934
  close() {
10935
+ server.closeAllConnections();
10936
10936
  return new Promise((resolve, reject) => {
10937
10937
  server.close((err) => {
10938
10938
  if (err) reject(err);
@@ -11176,19 +11176,20 @@ function timber(config) {
11176
11176
  let resolvedDevPort = null;
11177
11177
  let resolvedDevPortExplicit = false;
11178
11178
  const isMiddlewareMode = Boolean(userConfig.server?.middlewareMode);
11179
+ const resolvedHost = typeof userConfig.server?.host === "string" ? userConfig.server.host : userConfig.server?.host === true ? void 0 : "localhost";
11179
11180
  if (command === "serve" && !isPreview && !isMiddlewareMode) {
11180
11181
  ctx.holdingServer = createHoldingServer();
11181
11182
  const holdingRef = ctx.holdingServer;
11182
11183
  const result = await startDevServerPort({
11183
11184
  configPort: typeof userConfig.server?.port === "number" ? userConfig.server.port : void 0,
11184
11185
  envPort: process.env.PORT,
11185
- listen: (p) => holdingRef.listen(p)
11186
+ listen: (p) => holdingRef.listen(p, resolvedHost)
11186
11187
  });
11187
11188
  if (!result.bound) ctx.holdingServer = null;
11188
- if (result.bound || result.explicit) {
11189
+ if (result.bound) {
11189
11190
  resolvedDevPort = result.port;
11190
11191
  resolvedDevPortExplicit = result.explicit;
11191
- }
11192
+ } else if (result.explicit) resolvedDevPort = result.port;
11192
11193
  } else if (command === "serve" && isPreview) {
11193
11194
  const start = resolveStartPort({
11194
11195
  configPort: typeof userConfig.preview?.port === "number" ? userConfig.preview.port : typeof userConfig.server?.port === "number" ? userConfig.server.port : void 0,
@@ -11225,7 +11226,7 @@ function timber(config) {
11225
11226
  if (resolvedDevPort != null) {
11226
11227
  if (!isPreview) {
11227
11228
  serverConfig.port = resolvedDevPort;
11228
- serverConfig.strictPort = true;
11229
+ serverConfig.strictPort = resolvedDevPortExplicit;
11229
11230
  }
11230
11231
  previewConfig.port = resolvedDevPort;
11231
11232
  previewConfig.strictPort = resolvedDevPortExplicit;