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

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 (246) hide show
  1. package/dist/_chunks/{actions-BS-m5SLv.js → actions-d1hCqnU3.js} +35 -8
  2. package/dist/_chunks/actions-d1hCqnU3.js.map +1 -0
  3. package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -1
  4. package/dist/_chunks/{cache-api-DqzgTEqk.js → cache-api-ByagcC-J.js} +2 -2
  5. package/dist/_chunks/{cache-api-DqzgTEqk.js.map → cache-api-ByagcC-J.js.map} +1 -1
  6. package/dist/_chunks/canonicalize-CgHoscYO.js +66 -0
  7. package/dist/_chunks/canonicalize-CgHoscYO.js.map +1 -0
  8. package/dist/_chunks/{chains-CZG7E5zg.js → chains-Bpb0W4ax.js} +3 -3
  9. package/dist/_chunks/{chains-CZG7E5zg.js.map → chains-Bpb0W4ax.js.map} +1 -1
  10. package/dist/_chunks/{cli-check-dVDi1GQz.js → cli-check-D6VolrDV.js} +3 -3
  11. package/dist/_chunks/{cli-check-dVDi1GQz.js.map → cli-check-D6VolrDV.js.map} +1 -1
  12. package/dist/_chunks/{cli-schema-sync-DTy_-Msq.js → cli-schema-sync-D6rO-VcS.js} +2 -2
  13. package/dist/_chunks/{cli-schema-sync-DTy_-Msq.js.map → cli-schema-sync-D6rO-VcS.js.map} +1 -1
  14. package/dist/_chunks/{convention-lint-Ph6luW4c.js → convention-lint-fRkwVwEH.js} +25 -4
  15. package/dist/_chunks/convention-lint-fRkwVwEH.js.map +1 -0
  16. package/dist/_chunks/error-boundary-BfPHZjm0.js +1050 -0
  17. package/dist/_chunks/error-boundary-BfPHZjm0.js.map +1 -0
  18. package/dist/_chunks/{live-graph-BXDsdzBv.js → live-graph-D_2D32Ad.js} +3 -3
  19. package/dist/_chunks/{live-graph-BXDsdzBv.js.map → live-graph-D_2D32Ad.js.map} +1 -1
  20. package/dist/_chunks/{logger-DDirEsn7.js → logger-uLBuGKDI.js} +471 -440
  21. package/dist/_chunks/logger-uLBuGKDI.js.map +1 -0
  22. package/dist/_chunks/{navigation-root-B00jjGd5.js → navigation-context-D0TU0Jog.js} +3 -101
  23. package/dist/_chunks/navigation-context-D0TU0Jog.js.map +1 -0
  24. package/dist/_chunks/navigation-root-mHSK9psY.js +126 -0
  25. package/dist/_chunks/{navigation-root-B00jjGd5.js.map → navigation-root-mHSK9psY.js.map} +1 -1
  26. package/dist/_chunks/{poison-scan-BoDLgbix.js → poison-scan-Bm9Yyqk9.js} +2 -2
  27. package/dist/_chunks/{poison-scan-BoDLgbix.js.map → poison-scan-Bm9Yyqk9.js.map} +1 -1
  28. package/dist/_chunks/{scanner-tdFPvDYi.js → scanner-AiazgH_f.js} +6 -5
  29. package/dist/_chunks/scanner-AiazgH_f.js.map +1 -0
  30. package/dist/_chunks/{segment-keys-BhqoHiLc.js → segment-keys-lqtdookO.js} +2 -65
  31. package/dist/_chunks/segment-keys-lqtdookO.js.map +1 -0
  32. package/dist/_chunks/{ssr-data-BQGhTPAK.js → ssr-data-D6T6Y3ef.js} +4 -26
  33. package/dist/_chunks/ssr-data-D6T6Y3ef.js.map +1 -0
  34. package/dist/_chunks/state-FippDgxN.js +52 -0
  35. package/dist/_chunks/state-FippDgxN.js.map +1 -0
  36. package/dist/_chunks/status-page-marker-DwQBrLBz.js +496 -0
  37. package/dist/_chunks/status-page-marker-DwQBrLBz.js.map +1 -0
  38. package/dist/_chunks/{walkers-DNX05dC0.js → walkers-B6XUtmqK.js} +2 -2
  39. package/dist/_chunks/{walkers-DNX05dC0.js.map → walkers-B6XUtmqK.js.map} +1 -1
  40. package/dist/analyze/crawl-entry.js +2 -2
  41. package/dist/analyze/graph-command.js +2 -2
  42. package/dist/cache/index.js +1 -1
  43. package/dist/cli.js +2 -2
  44. package/dist/client/browser-entry/action-dispatch.d.ts +6 -4
  45. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  46. package/dist/client/browser-entry/action-queue.d.ts +44 -0
  47. package/dist/client/browser-entry/action-queue.d.ts.map +1 -0
  48. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  49. package/dist/client/deny-last-resort.d.ts +29 -0
  50. package/dist/client/deny-last-resort.d.ts.map +1 -0
  51. package/dist/client/error-boundary.d.ts +48 -2
  52. package/dist/client/error-boundary.d.ts.map +1 -1
  53. package/dist/client/error-boundary.js +2 -2
  54. package/dist/client/history.d.ts +21 -2
  55. package/dist/client/history.d.ts.map +1 -1
  56. package/dist/client/index.js +34 -14
  57. package/dist/client/index.js.map +1 -1
  58. package/dist/client/internal.d.ts +1 -0
  59. package/dist/client/internal.d.ts.map +1 -1
  60. package/dist/client/internal.js +272 -1225
  61. package/dist/client/internal.js.map +1 -1
  62. package/dist/client/link.d.ts.map +1 -1
  63. package/dist/client/navigation-commit.d.ts +12 -19
  64. package/dist/client/navigation-commit.d.ts.map +1 -1
  65. package/dist/client/navigation-transition.d.ts +62 -11
  66. package/dist/client/navigation-transition.d.ts.map +1 -1
  67. package/dist/client/router-effects.d.ts +9 -8
  68. package/dist/client/router-effects.d.ts.map +1 -1
  69. package/dist/client/router-lifecycle.d.ts +60 -17
  70. package/dist/client/router-lifecycle.d.ts.map +1 -1
  71. package/dist/client/router-pipeline.d.ts +7 -4
  72. package/dist/client/router-pipeline.d.ts.map +1 -1
  73. package/dist/client/router-types.d.ts +63 -8
  74. package/dist/client/router-types.d.ts.map +1 -1
  75. package/dist/client/router.d.ts.map +1 -1
  76. package/dist/client/rsc-fetch.d.ts +0 -9
  77. package/dist/client/rsc-fetch.d.ts.map +1 -1
  78. package/dist/client/segment-cache.d.ts +23 -8
  79. package/dist/client/segment-cache.d.ts.map +1 -1
  80. package/dist/client/state.d.ts +16 -0
  81. package/dist/client/state.d.ts.map +1 -1
  82. package/dist/client/status-page-marker.d.ts +25 -0
  83. package/dist/client/status-page-marker.d.ts.map +1 -0
  84. package/dist/cookies/index.js +1 -1
  85. package/dist/dev-tools/holding-server.d.ts +4 -17
  86. package/dist/dev-tools/holding-server.d.ts.map +1 -1
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +74 -175
  89. package/dist/index.js.map +1 -1
  90. package/dist/plugins/dev-server.d.ts.map +1 -1
  91. package/dist/routing/index.js +2 -2
  92. package/dist/routing/interception.d.ts +2 -2
  93. package/dist/routing/slot-placement.d.ts +2 -2
  94. package/dist/server/access-gate.d.ts +73 -1
  95. package/dist/server/access-gate.d.ts.map +1 -1
  96. package/dist/server/action-handler.d.ts.map +1 -1
  97. package/dist/server/actions.d.ts +16 -1
  98. package/dist/server/actions.d.ts.map +1 -1
  99. package/dist/server/als-registry.d.ts +3 -9
  100. package/dist/server/als-registry.d.ts.map +1 -1
  101. package/dist/server/children-interception.d.ts +1 -1
  102. package/dist/server/default-status-page.d.ts +2 -2
  103. package/dist/server/default-status-page.d.ts.map +1 -1
  104. package/dist/server/deny-boundary.d.ts +15 -9
  105. package/dist/server/deny-boundary.d.ts.map +1 -1
  106. package/dist/server/deny-renderer.d.ts.map +1 -1
  107. package/dist/server/error-boundary-wrapper.d.ts +21 -4
  108. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  109. package/dist/server/error-response-headers.d.ts +3 -0
  110. package/dist/server/error-response-headers.d.ts.map +1 -0
  111. package/dist/server/index.js +3 -3
  112. package/dist/server/index.js.map +1 -1
  113. package/dist/server/internal.d.ts +1 -2
  114. package/dist/server/internal.d.ts.map +1 -1
  115. package/dist/server/internal.js +2339 -2506
  116. package/dist/server/internal.js.map +1 -1
  117. package/dist/server/metadata-collector.d.ts +2 -5
  118. package/dist/server/metadata-collector.d.ts.map +1 -1
  119. package/dist/server/param-coercion.d.ts +10 -3
  120. package/dist/server/param-coercion.d.ts.map +1 -1
  121. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  122. package/dist/server/pipeline-phases.d.ts +11 -0
  123. package/dist/server/pipeline-phases.d.ts.map +1 -1
  124. package/dist/server/port-resolution.d.ts +3 -89
  125. package/dist/server/port-resolution.d.ts.map +1 -1
  126. package/dist/server/primitives.d.ts +38 -10
  127. package/dist/server/primitives.d.ts.map +1 -1
  128. package/dist/server/response-cache-policy.d.ts +3 -0
  129. package/dist/server/response-cache-policy.d.ts.map +1 -0
  130. package/dist/server/route-element-builder.d.ts +11 -41
  131. package/dist/server/route-element-builder.d.ts.map +1 -1
  132. package/dist/server/route-element-helpers.d.ts +12 -0
  133. package/dist/server/route-element-helpers.d.ts.map +1 -0
  134. package/dist/server/route-module-loader.d.ts +37 -0
  135. package/dist/server/route-module-loader.d.ts.map +1 -0
  136. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -1
  137. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -1
  138. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  139. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  140. package/dist/server/rsc-entry/rsc-payload.d.ts +22 -1
  141. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  142. package/dist/server/rsc-entry/rsc-stream.d.ts +4 -11
  143. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  144. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  145. package/dist/server/rsc-error-envelope.d.ts +11 -0
  146. package/dist/server/rsc-error-envelope.d.ts.map +1 -0
  147. package/dist/server/skippable-prefix.d.ts +18 -15
  148. package/dist/server/skippable-prefix.d.ts.map +1 -1
  149. package/dist/server/slot-resolver.d.ts.map +1 -1
  150. package/dist/server/slot-subtree-contain.d.ts +54 -0
  151. package/dist/server/slot-subtree-contain.d.ts.map +1 -0
  152. package/dist/server/stream-utils.d.ts.map +1 -1
  153. package/dist/server/utils/element-type.d.ts +10 -0
  154. package/dist/server/utils/element-type.d.ts.map +1 -1
  155. package/dist/shared/rsc-error-envelope.d.ts +0 -9
  156. package/dist/shared/rsc-error-envelope.d.ts.map +1 -1
  157. package/dist/shared/status-reason-phrase.d.ts +26 -0
  158. package/dist/shared/status-reason-phrase.d.ts.map +1 -0
  159. package/docs/api/30-api-server.mdx +4 -2
  160. package/docs/api/31-api-client.mdx +5 -1
  161. package/docs/api/36-cli.mdx +5 -3
  162. package/docs/learn/12-error-handling.mdx +5 -1
  163. package/package.json +10 -10
  164. package/src/client/browser-entry/action-dispatch.ts +166 -99
  165. package/src/client/browser-entry/action-queue.ts +90 -0
  166. package/src/client/browser-entry/router-init.ts +60 -35
  167. package/src/client/deny-last-resort.tsx +54 -0
  168. package/src/client/error-boundary.tsx +144 -42
  169. package/src/client/history.ts +52 -3
  170. package/src/client/internal.ts +1 -0
  171. package/src/client/link.tsx +70 -35
  172. package/src/client/navigation-commit.ts +79 -27
  173. package/src/client/navigation-transition.ts +176 -127
  174. package/src/client/router-effects.ts +14 -17
  175. package/src/client/router-lifecycle.ts +181 -115
  176. package/src/client/router-pipeline.ts +94 -71
  177. package/src/client/router-types.ts +61 -7
  178. package/src/client/router.ts +147 -74
  179. package/src/client/rsc-fetch.ts +0 -13
  180. package/src/client/segment-cache.ts +43 -10
  181. package/src/client/state.ts +26 -0
  182. package/src/client/status-page-marker.tsx +32 -0
  183. package/src/dev-tools/holding-server.ts +4 -17
  184. package/src/index.ts +18 -34
  185. package/src/plugins/dev-server.ts +2 -1
  186. package/src/routing/interception.ts +2 -2
  187. package/src/routing/slot-placement.ts +2 -2
  188. package/src/server/access-gate.tsx +89 -21
  189. package/src/server/action-client.ts +2 -2
  190. package/src/server/action-handler.ts +23 -10
  191. package/src/server/actions.ts +81 -34
  192. package/src/server/als-registry.ts +3 -9
  193. package/src/server/children-interception.ts +1 -1
  194. package/src/server/default-status-page.ts +7 -47
  195. package/src/server/deny-boundary.ts +45 -28
  196. package/src/server/deny-renderer.ts +6 -2
  197. package/src/server/error-boundary-wrapper.ts +23 -4
  198. package/src/server/error-response-headers.ts +18 -0
  199. package/src/server/internal.ts +2 -10
  200. package/src/server/metadata-collector.ts +3 -18
  201. package/src/server/param-coercion.ts +13 -4
  202. package/src/server/pipeline-outcome.ts +35 -13
  203. package/src/server/pipeline-phases.ts +22 -16
  204. package/src/server/port-resolution.ts +3 -165
  205. package/src/server/prebuilt-builder.ts +4 -4
  206. package/src/server/primitives.ts +75 -11
  207. package/src/server/response-cache-policy.ts +45 -0
  208. package/src/server/route-element-builder.ts +149 -412
  209. package/src/server/route-element-helpers.ts +37 -0
  210. package/src/server/route-handler.ts +2 -2
  211. package/src/server/route-module-loader.ts +161 -0
  212. package/src/server/rsc-cache-key-guard.ts +2 -42
  213. package/src/server/rsc-entry/action-middleware-runner.ts +4 -4
  214. package/src/server/rsc-entry/api-handler.ts +5 -5
  215. package/src/server/rsc-entry/error-renderer.ts +3 -4
  216. package/src/server/rsc-entry/helpers.ts +1 -1
  217. package/src/server/rsc-entry/index.ts +3 -3
  218. package/src/server/rsc-entry/render-route.ts +4 -8
  219. package/src/server/rsc-entry/rsc-payload.ts +59 -42
  220. package/src/server/rsc-entry/rsc-stream.ts +48 -27
  221. package/src/server/rsc-entry/ssr-renderer.ts +6 -10
  222. package/src/server/rsc-error-envelope.ts +18 -0
  223. package/src/server/skippable-prefix.ts +105 -7
  224. package/src/server/slot-resolver.ts +43 -12
  225. package/src/server/slot-subtree-contain.ts +255 -0
  226. package/src/server/stream-utils.ts +12 -8
  227. package/src/server/utils/element-type.ts +18 -2
  228. package/src/shared/rsc-error-envelope.ts +0 -15
  229. package/src/shared/status-reason-phrase.ts +61 -0
  230. package/dist/_chunks/actions-BS-m5SLv.js.map +0 -1
  231. package/dist/_chunks/convention-lint-Ph6luW4c.js.map +0 -1
  232. package/dist/_chunks/error-boundary-BvRCCmbN.js +0 -353
  233. package/dist/_chunks/error-boundary-BvRCCmbN.js.map +0 -1
  234. package/dist/_chunks/logger-DDirEsn7.js.map +0 -1
  235. package/dist/_chunks/mdx-file-CXyHGUpS.js +0 -25
  236. package/dist/_chunks/mdx-file-CXyHGUpS.js.map +0 -1
  237. package/dist/_chunks/router-ref-8gr8qsxN.js +0 -28
  238. package/dist/_chunks/router-ref-8gr8qsxN.js.map +0 -1
  239. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +0 -40
  240. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +0 -1
  241. package/dist/_chunks/scanner-tdFPvDYi.js.map +0 -1
  242. package/dist/_chunks/segment-keys-BhqoHiLc.js.map +0 -1
  243. package/dist/_chunks/ssr-data-BQGhTPAK.js.map +0 -1
  244. package/dist/server/tree-builder.d.ts +0 -150
  245. package/dist/server/tree-builder.d.ts.map +0 -1
  246. package/src/server/tree-builder.ts +0 -313
@@ -20,14 +20,6 @@ export interface PrefetchResult {
20
20
  params?: PublishedParams | Promise<PublishedParams>;
21
21
  /** Segment paths skipped by the server (for client-side merging). */
22
22
  skippedSegments?: string[] | null;
23
- /**
24
- * HTTP status of the prefetched response. A deny payload is an ordinary
25
- * Flight response carrying a 4xx, so it prefetches and caches like any
26
- * other — and the tree it renders is one the segment cache must not learn
27
- * from. Absent on entries that predate the field, and on the negative
28
- * sentinel. See TIM-1356.
29
- */
30
- status?: number;
31
23
  }
32
24
  /**
33
25
  * A node in the client-side segment tree. Each node represents a mounted
@@ -173,6 +165,7 @@ export declare class PrefetchCache {
173
165
  private static readonly TTL_MS;
174
166
  private entries;
175
167
  private flights;
168
+ private evictionGen;
176
169
  set(key: PrefetchKey, result: PrefetchResult): void;
177
170
  get(key: PrefetchKey): PrefetchResult | undefined;
178
171
  /** True if a ready or negative entry exists for this key. */
@@ -212,5 +205,27 @@ export declare class PrefetchCache {
212
205
  setNegative(key: PrefetchKey): void;
213
206
  /** Check if the entry is a negative cache entry (URL is not a route). */
214
207
  isNegative(key: PrefetchKey): boolean;
208
+ /**
209
+ * Invalidate all entries whose destination URL matches (TIM-1454).
210
+ * Used by `revalidatePath` on a non-current route so the next navigation
211
+ * fetches fresh data instead of replaying a stale prefetch.
212
+ */
213
+ invalidateUrl(url: string): void;
214
+ /**
215
+ * Evict all ready entries and fence in-flight singleflights (TIM-1476).
216
+ * Called after a server action that revalidated data — the mutation may
217
+ * affect any route, not just the paths the server named. In-flight
218
+ * singleflights are not aborted (they may carry post-mutation data),
219
+ * but their results are discarded if they complete after eviction:
220
+ * `fetchOrCoalesce` captures the generation before the flight and
221
+ * skips the store when it has been bumped.
222
+ *
223
+ * Consumers that join an in-flight flight via `joinInflight` must
224
+ * check `getEvictionGen()` before and after the await: if the gen
225
+ * changed, the result predates the eviction and must be discarded
226
+ * (codex on #1131 round 2).
227
+ */
228
+ clearReady(): void;
229
+ getEvictionGen(): number;
215
230
  }
216
231
  //# sourceMappingURL=segment-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"segment-cache.d.ts","sourceRoot":"","sources":["../../src/client/segment-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"segment-cache.d.ts","sourceRoot":"","sources":["../../src/client/segment-cache.ts"],"names":[],"mappings":"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"}
@@ -39,4 +39,20 @@ export declare function _setCachedSearch(search: string, params: URLSearchParams
39
39
  /** Whether the page is currently being unloaded. */
40
40
  export declare let unloading: boolean;
41
41
  export declare function _setUnloading(value: boolean): void;
42
+ /**
43
+ * Whether a status page for the main route has rendered since the last
44
+ * navigation was prepared. Raised by `StatusPageMarker`, consumed by the
45
+ * navigation's commit. See navigation-commit.ts §"What a status page
46
+ * teaches the cache".
47
+ */
48
+ export declare let statusPageRendered: boolean;
49
+ export declare function _setStatusPageRendered(value: boolean): void;
50
+ /**
51
+ * What a status page report does beyond raising the flag: registered by the
52
+ * router's committer so the report can clear the segment cache at once, for
53
+ * the commits no navigation consumes (a row arriving inside Suspense after
54
+ * its navigation published, a status document being hydrated).
55
+ */
56
+ export declare let onStatusPageRendered: (() => void) | undefined;
57
+ export declare function _setOnStatusPageRendered(handler: (() => void) | undefined): void;
42
58
  //# sourceMappingURL=state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/client/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,+DAA+D;AAC/D,eAAO,IAAI,YAAY,EAAE,cAAc,GAAG,IAAW,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAEpE;AAID;;;GAGG;AACH,eAAO,IAAI,eAAe,EAAE,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;AAEpE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,GAAG,IAAI,CAE3F;AAED,gEAAgE;AAChE,eAAO,IAAI,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;AAE/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAElE;AAID,uEAAuE;AACvE,eAAO,IAAI,YAAY,QAAK,CAAC;AAC7B,eAAO,IAAI,kBAAkB,iBAAwB,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAG9E;AAID,oDAAoD;AACpD,eAAO,IAAI,SAAS,SAAQ,CAAC;AAE7B,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAElD"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/client/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,+DAA+D;AAC/D,eAAO,IAAI,YAAY,EAAE,cAAc,GAAG,IAAW,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAEpE;AAID;;;GAGG;AACH,eAAO,IAAI,eAAe,EAAE,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;AAEpE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,GAAG,IAAI,CAE3F;AAED,gEAAgE;AAChE,eAAO,IAAI,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;AAE/C,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAElE;AAID,uEAAuE;AACvE,eAAO,IAAI,YAAY,QAAK,CAAC;AAC7B,eAAO,IAAI,kBAAkB,iBAAwB,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAG9E;AAID,oDAAoD;AACpD,eAAO,IAAI,SAAS,SAAQ,CAAC;AAE7B,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAElD;AAID;;;;;GAKG;AACH,eAAO,IAAI,kBAAkB,SAAQ,CAAC;AAEtC,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE3D;AAED;;;;;GAKG;AACH,eAAO,IAAI,oBAAoB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;AAE1D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAEhF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The one way a status page tells the router it is on screen.
3
+ *
4
+ * A status page replaces a subtree, and the segment cache must not learn a
5
+ * chain that never mounted (see `navigation-commit.ts` §"What a status page
6
+ * teaches the cache"). Status pages are produced in three places — an
7
+ * in-tree catch site rendering the page it owns, the server's fallback
8
+ * renderers, and a client boundary rendering its fallback for a Flight row —
9
+ * and every one of them wraps the page in this marker, so the report does
10
+ * not depend on which producer it was. In particular the in-tree case, the
11
+ * common `access.ts` deny, never involves a client boundary at all.
12
+ *
13
+ * A layout effect, on every commit that renders the marker rather than on
14
+ * mount only: React reuses the fiber when one status page is replaced by
15
+ * another at the same position, and the second one must report too. Layout
16
+ * effects run child-before-parent, so the report lands before the ancestor
17
+ * `NavigationRoot` publishes the same commit, and never for a render React
18
+ * discards. Idempotent, so StrictMode's double invocation and a status page
19
+ * re-rendering on its own state are harmless. See TIM-1495.
20
+ */
21
+ import { type ReactNode } from 'react';
22
+ export declare function StatusPageMarker({ children }: {
23
+ children: ReactNode;
24
+ }): ReactNode;
25
+ //# sourceMappingURL=status-page-marker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-page-marker.d.ts","sourceRoot":"","sources":["../../src/client/status-page-marker.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxD,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAKjF"}
@@ -1,6 +1,6 @@
1
1
  import { i as assertValidCookieName, r as stringifySetCookie, t as parseCookie } from "../_chunks/dist-DtrJyBbw.js";
2
- import { n as getSsrData } from "../_chunks/ssr-data-BQGhTPAK.js";
3
2
  import { a as resolveCodecOrSchema } from "../_chunks/schema-bridge-C83xa9lT.js";
3
+ import { n as getSsrData } from "../_chunks/ssr-data-D6T6Y3ef.js";
4
4
  import * as React$1 from "react";
5
5
  import { getCookieJar } from "@timber-js/app/server";
6
6
  //#region src/client/use-cookie.ts
@@ -14,7 +14,7 @@
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
16
  * closed directly in timber-dev-server's configureServer() hook
17
- * (the last plugin, fire-and-forget). configureServer runs during
17
+ * (the last plugin, awaited). configureServer runs during
18
18
  * createServer(), well before Vite's port probe and bind, so the
19
19
  * port is free by the time httpServerStart() runs. (TIM-1419)
20
20
  *
@@ -38,22 +38,9 @@ export interface HoldingServer {
38
38
  /**
39
39
  * Create a holding HTTP server that serves a loading page during startup.
40
40
  *
41
- * Usage (inside Vite plugin):
42
- * ```ts
43
- * // In config() hook — earliest point where port is known.
44
- * // Use bindWithBump() to honor the default-3000 + auto-bump policy
45
- * // (see ../server/port-resolution.ts and TIM-842).
46
- * const holding = createHoldingServer();
47
- * await bindWithBump((p) => holding.listen(p), { startPort: 3000, autoBump: true });
48
- *
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
- * }
56
- * ```
41
+ * The config hook attempts one bind on the requested port. If it fails,
42
+ * startup continues without the holding page; Vite owns port selection.
43
+ * The last configureServer hook awaits close() before Vite probes/binds.
57
44
  */
58
45
  export declare function createHoldingServer(): HoldingServer;
59
46
  //# sourceMappingURL=holding-server.d.ts.map
@@ -1 +1 @@
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
+ {"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;;;;;;GAMG;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,CAqYhE;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,CAqXhE;eAEc,MAAM"}
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  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
- 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-tdFPvDYi.js";
6
- import { t as MDX_EXTENSIONS } from "./_chunks/mdx-file-CXyHGUpS.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";
4
+ import { M as isSsrStreamError, h as swallow } from "./_chunks/logger-uLBuGKDI.js";
5
+ import { c as isMetadataRouteServePath, s as isDynamicMetadataExtension } from "./_chunks/segment-keys-lqtdookO.js";
6
+ import { r as canonicalize } from "./_chunks/canonicalize-CgHoscYO.js";
7
+ import { i as matchUrlParts, n as scanRoutes, r as collectInterceptionRewrites } from "./_chunks/scanner-AiazgH_f.js";
8
+ import { c as writeRouteCodegen, i as getPrerenderExport, l as buildDirToRouteMap, n as formatConventionWarnings, r as lintConventions, s as flushCodegenWrites, t as checkAppDirExists, u as MDX_EXTENSIONS } from "./_chunks/convention-lint-fRkwVwEH.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-DNX05dC0.js";
10
+ import { r as validateSchemaAgainstRoutes, t as collectLeafRoutes } from "./_chunks/walkers-B6XUtmqK.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
13
  import { t as EMPTY_BUILD_MANIFEST } from "./_chunks/build-manifest-DTmSGLRz.js";
@@ -117,7 +117,7 @@ function timberContent(ctx) {
117
117
  };
118
118
  }
119
119
  //#endregion
120
- //#region ../../node_modules/.pnpm/srvx@0.12.7/node_modules/srvx/dist/adapters/node.mjs
120
+ //#region ../../node_modules/.pnpm/srvx@1.0.4/node_modules/srvx/dist/adapters/node.mjs
121
121
  function sendNodeResponse(nodeRes, webRes) {
122
122
  try {
123
123
  return _sendNodeResponse(nodeRes, webRes, false) || Promise.resolve();
@@ -1524,7 +1524,7 @@ function createGraphEndpointMiddleware(server, ctx) {
1524
1524
  }
1525
1525
  reflectCors(res, origin);
1526
1526
  try {
1527
- const { classifyLiveFile, classifyLiveProject } = await import("./_chunks/live-graph-BXDsdzBv.js");
1527
+ const { classifyLiveFile, classifyLiveProject } = await import("./_chunks/live-graph-D_2D32Ad.js");
1528
1528
  const preserveSymlinks = server.config.resolve.preserveSymlinks;
1529
1529
  const root = normalizePath(preserveSymlinks ? ctx.root : await realpath(ctx.root));
1530
1530
  const appDir = normalizePath(preserveSymlinks ? ctx.appDir : await realpath(ctx.appDir).catch(() => join(root, relative(ctx.root, ctx.appDir))));
@@ -2013,7 +2013,7 @@ function createTimberMiddleware(server, ctx) {
2013
2013
  await sendNodeResponse(res, finalResponse);
2014
2014
  } catch (error) {
2015
2015
  if (error instanceof Error) {
2016
- const displayError = error.name === "SsrStreamError" && error.cause instanceof Error ? error.cause : error;
2016
+ const displayError = isSsrStreamError(error) && error.cause instanceof Error ? error.cause : error;
2017
2017
  const phase = classifyErrorPhase(displayError, projectRoot);
2018
2018
  sendErrorToOverlay(server, displayError, phase, projectRoot);
2019
2019
  respond500(res, displayError, phase, projectRoot, hmrOptions);
@@ -4809,7 +4809,7 @@ function renderEntryCss(entry, urlPrefix) {
4809
4809
  return cssParts.join("\n\n");
4810
4810
  }
4811
4811
  //#endregion
4812
- //#region ../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
4812
+ //#region ../../node_modules/.pnpm/@jridgewell+sourcemap-codec@1.6.0/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
4813
4813
  var comma = ",".charCodeAt(0);
4814
4814
  var semicolon = ";".charCodeAt(0);
4815
4815
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -4820,16 +4820,16 @@ for (let i = 0; i < chars.length; i++) {
4820
4820
  intToChar[i] = c;
4821
4821
  charToInt[c] = i;
4822
4822
  }
4823
- function encodeInteger(builder, num, relative) {
4824
- let delta = num - relative;
4825
- delta = delta < 0 ? -delta << 1 | 1 : delta << 1;
4823
+ function encodeInteger(builder, num) {
4826
4824
  do {
4827
- let clamped = delta & 31;
4828
- delta >>>= 5;
4829
- if (delta > 0) clamped |= 32;
4825
+ let clamped = num & 31;
4826
+ num >>>= 5;
4827
+ if (num > 0) clamped |= 32;
4830
4828
  builder.write(intToChar[clamped]);
4831
- } while (delta > 0);
4832
- return num;
4829
+ } while (num > 0);
4830
+ }
4831
+ function encodeSign(num) {
4832
+ return num < 0 ? -num << 1 | 1 : num << 1;
4833
4833
  }
4834
4834
  var bufLength = 16384;
4835
4835
  var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { decode(buf) {
@@ -4872,19 +4872,24 @@ function encode(decoded) {
4872
4872
  for (let j = 0; j < line.length; j++) {
4873
4873
  const segment = line[j];
4874
4874
  if (j > 0) writer.write(comma);
4875
- genColumn = encodeInteger(writer, segment[0], genColumn);
4875
+ encodeInteger(writer, encodeSign(segment[0] - genColumn));
4876
+ genColumn = segment[0];
4876
4877
  if (segment.length === 1) continue;
4877
- sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);
4878
- sourceLine = encodeInteger(writer, segment[2], sourceLine);
4879
- sourceColumn = encodeInteger(writer, segment[3], sourceColumn);
4878
+ encodeInteger(writer, encodeSign(segment[1] - sourcesIndex));
4879
+ encodeInteger(writer, encodeSign(segment[2] - sourceLine));
4880
+ encodeInteger(writer, encodeSign(segment[3] - sourceColumn));
4881
+ sourcesIndex = segment[1];
4882
+ sourceLine = segment[2];
4883
+ sourceColumn = segment[3];
4880
4884
  if (segment.length === 4) continue;
4881
- namesIndex = encodeInteger(writer, segment[4], namesIndex);
4885
+ encodeInteger(writer, encodeSign(segment[4] - namesIndex));
4886
+ namesIndex = segment[4];
4882
4887
  }
4883
4888
  }
4884
4889
  return writer.flush();
4885
4890
  }
4886
4891
  //#endregion
4887
- //#region ../../node_modules/.pnpm/magic-string@1.2.2/node_modules/magic-string/dist/index.mjs
4892
+ //#region ../../node_modules/.pnpm/magic-string@1.2.3/node_modules/magic-string/dist/index.mjs
4888
4893
  var BitSet = class BitSet {
4889
4894
  constructor(arg) {
4890
4895
  this.bits = arg instanceof BitSet ? arg.bits.slice() : [];
@@ -5585,8 +5590,8 @@ var MagicString = class MagicString {
5585
5590
  end = end + this.offset;
5586
5591
  if (typeof content !== "string") throw new MagicStringError(`content must be a string, got ${typeof content}`);
5587
5592
  if (this.original.length !== 0) {
5588
- while (start < 0) start += this.original.length;
5589
- while (end < 0) end += this.original.length;
5593
+ if (start < 0) start = Math.max(0, start + this.original.length);
5594
+ if (end < 0) end = Math.max(0, end + this.original.length);
5590
5595
  }
5591
5596
  if (start < 0) throw new MagicStringError(`start ${start} is out of bounds`);
5592
5597
  if (end > this.original.length) throw new MagicStringError(`end ${end} is out of bounds`);
@@ -5669,8 +5674,8 @@ var MagicString = class MagicString {
5669
5674
  start = start + this.offset;
5670
5675
  end = end + this.offset;
5671
5676
  if (this.original.length !== 0) {
5672
- while (start < 0) start += this.original.length;
5673
- while (end < 0) end += this.original.length;
5677
+ if (start < 0) start = Math.max(0, start + this.original.length);
5678
+ if (end < 0) end = Math.max(0, end + this.original.length);
5674
5679
  }
5675
5680
  if (start === end) return this;
5676
5681
  if (start < 0 || end > this.original.length) throw new MagicStringError(`range ${start}–${end} is out of bounds`);
@@ -5693,8 +5698,8 @@ var MagicString = class MagicString {
5693
5698
  start = start + this.offset;
5694
5699
  end = end + this.offset;
5695
5700
  if (this.original.length !== 0) {
5696
- while (start < 0) start += this.original.length;
5697
- while (end < 0) end += this.original.length;
5701
+ if (start < 0) start = Math.max(0, start + this.original.length);
5702
+ if (end < 0) end = Math.max(0, end + this.original.length);
5698
5703
  }
5699
5704
  if (start === end) return this;
5700
5705
  if (start < 0 || end > this.original.length) throw new MagicStringError(`range ${start}–${end} is out of bounds`);
@@ -5755,8 +5760,8 @@ var MagicString = class MagicString {
5755
5760
  start = start + this.offset;
5756
5761
  end = end + this.offset;
5757
5762
  if (this.original.length !== 0) {
5758
- while (start < 0) start += this.original.length;
5759
- while (end < 0) end += this.original.length;
5763
+ if (start < 0) start = Math.max(0, start + this.original.length);
5764
+ if (end < 0) end = Math.max(0, end + this.original.length);
5760
5765
  }
5761
5766
  let result = "";
5762
5767
  let chunk = this.firstChunk;
@@ -5942,27 +5947,19 @@ var MagicString = class MagicString {
5942
5947
  });
5943
5948
  else return replacement(match[0], ...match.slice(1), match.index, str, match.groups);
5944
5949
  }
5945
- function matchAll(re, str) {
5946
- const matches = [];
5947
- while (true) {
5948
- const match = re.exec(str);
5949
- if (!match) break;
5950
- matches.push(match);
5951
- }
5952
- return matches;
5953
- }
5954
- if (searchValue.global) matchAll(searchValue, this.original).forEach((match) => {
5955
- if (match.index != null) {
5956
- const replacement = getReplacement(match, this.original);
5957
- if (replacement !== match[0]) this.overwrite(match.index, match.index + match[0].length, replacement);
5958
- }
5959
- });
5960
- else {
5950
+ const replaceMatch = (match) => {
5951
+ if (match.index == null) return;
5952
+ const replacement = getReplacement(match, this.original);
5953
+ if (replacement === match[0]) return;
5954
+ if (match[0].length === 0) this.appendRight(match.index, replacement);
5955
+ else this.overwrite(match.index, match.index + match[0].length, replacement);
5956
+ };
5957
+ if (searchValue.global) {
5958
+ searchValue.lastIndex = 0;
5959
+ for (const match of this.original.matchAll(searchValue)) replaceMatch(match);
5960
+ } else {
5961
5961
  const match = this.original.match(searchValue);
5962
- if (match && match.index != null) {
5963
- const replacement = getReplacement(match, this.original);
5964
- if (replacement !== match[0]) this.overwrite(match.index, match.index + match[0].length, replacement);
5965
- }
5962
+ if (match) replaceMatch(match);
5966
5963
  }
5967
5964
  return this;
5968
5965
  }
@@ -5972,7 +5969,8 @@ var MagicString = class MagicString {
5972
5969
  const index = original.indexOf(string);
5973
5970
  if (index !== -1) {
5974
5971
  if (typeof replacement === "function") replacement = replacement(string, index, original);
5975
- if (string !== replacement) this.overwrite(index, index + string.length, replacement);
5972
+ if (string !== replacement) if (string.length === 0) this.appendRight(index, replacement);
5973
+ else this.overwrite(index, index + string.length, replacement);
5976
5974
  }
5977
5975
  return this;
5978
5976
  }
@@ -5987,6 +5985,13 @@ var MagicString = class MagicString {
5987
5985
  _replaceAllString(string, replacement) {
5988
5986
  const { original } = this;
5989
5987
  const stringLength = string.length;
5988
+ if (stringLength === 0) {
5989
+ for (let index = 0; index <= original.length; index += 1) {
5990
+ const _replacement = typeof replacement === "function" ? replacement("", index, original) : replacement;
5991
+ if (_replacement !== "") this.appendRight(index, _replacement);
5992
+ }
5993
+ return this;
5994
+ }
5990
5995
  for (let index = original.indexOf(string); index !== -1; index = original.indexOf(string, index + stringLength)) {
5991
5996
  const previous = original.slice(index, index + stringLength);
5992
5997
  const _replacement = typeof replacement === "function" ? replacement(previous, index, original) : replacement;
@@ -10797,7 +10802,7 @@ function validateKeyFormat(key) {
10797
10802
  * The holding server is started in rootSync's config() hook (the
10798
10803
  * earliest Vite plugin lifecycle point where we know the port) and
10799
10804
  * closed directly in timber-dev-server's configureServer() hook
10800
- * (the last plugin, fire-and-forget). configureServer runs during
10805
+ * (the last plugin, awaited). configureServer runs during
10801
10806
  * createServer(), well before Vite's port probe and bind, so the
10802
10807
  * port is free by the time httpServerStart() runs. (TIM-1419)
10803
10808
  *
@@ -10881,22 +10886,9 @@ var HOLDING_PAGE_HTML = [
10881
10886
  /**
10882
10887
  * Create a holding HTTP server that serves a loading page during startup.
10883
10888
  *
10884
- * Usage (inside Vite plugin):
10885
- * ```ts
10886
- * // In config() hook — earliest point where port is known.
10887
- * // Use bindWithBump() to honor the default-3000 + auto-bump policy
10888
- * // (see ../server/port-resolution.ts and TIM-842).
10889
- * const holding = createHoldingServer();
10890
- * await bindWithBump((p) => holding.listen(p), { startPort: 3000, autoBump: true });
10891
- *
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
- * }
10899
- * ```
10889
+ * The config hook attempts one bind on the requested port. If it fails,
10890
+ * startup continues without the holding page; Vite owns port selection.
10891
+ * The last configureServer hook awaits close() before Vite probes/binds.
10900
10892
  */
10901
10893
  function createHoldingServer() {
10902
10894
  const server = nodeHTTP.createServer((req, res) => {
@@ -10942,33 +10934,10 @@ function createHoldingServer() {
10942
10934
  }
10943
10935
  };
10944
10936
  }
10945
- //#endregion
10946
- //#region src/server/port-resolution.ts
10947
- /**
10948
- * Port resolution for the dev server, Vite preview, and the Node
10949
- * production preview server.
10950
- *
10951
- * Behavior (see TIM-842):
10952
- *
10953
- * 1. Default port is **3000** for both dev and prod.
10954
- * 2. If the user did NOT set an explicit port, auto-bump from 3000
10955
- * until a free port is found (3000 → 3001 → 3002 → …).
10956
- * 3. If the user DID set an explicit port (via `--port`, `PORT` env
10957
- * var, or `vite.config.ts` `server.port`), use it as-is and let
10958
- * the bind fail loudly on conflict (`strictPort: true`).
10959
- *
10960
- * The port-bump probe is performed by binding the **actual** server
10961
- * (e.g. the dev holding server) — not a throwaway probe — so there is
10962
- * no time-of-check / time-of-use race between probing and listening.
10963
- *
10964
- * Design doc: 21-dev-server.md §"Default Port and Auto-Bump".
10965
- */
10966
- /** Default port used by `timber dev` and `timber preview`. */
10967
- var DEFAULT_PORT = 3e3;
10968
10937
  /**
10969
10938
  * Pure: compute the starting port from config / env / defaults.
10970
10939
  *
10971
- * Performs no I/O — pair with {@link bindWithBump} to actually listen.
10940
+ * Performs no I/O.
10972
10941
  */
10973
10942
  function resolveStartPort(input) {
10974
10943
  const defaultPort = input.defaultPort ?? 3e3;
@@ -10988,76 +10957,6 @@ function resolveStartPort(input) {
10988
10957
  explicit: false
10989
10958
  };
10990
10959
  }
10991
- /**
10992
- * Bind a server starting at `startPort`, optionally bumping the port
10993
- * on `EADDRINUSE` until a free one is found.
10994
- *
10995
- * Use this with the actual server you intend to keep listening (e.g.
10996
- * the dev holding server). Pairing the probe with the real listen
10997
- * eliminates the TOCTOU race that a throwaway probe would introduce.
10998
- */
10999
- async function bindWithBump(listen, options) {
11000
- const maxAttempts = options.autoBump ? options.maxAttempts ?? 100 : 1;
11001
- let lastErr = null;
11002
- for (let i = 0; i < maxAttempts; i++) {
11003
- const port = options.startPort + i;
11004
- try {
11005
- return {
11006
- port: await listen(port),
11007
- bumped: i > 0
11008
- };
11009
- } catch (err) {
11010
- lastErr = err;
11011
- if (!isAddrInUse(err)) throw err;
11012
- }
11013
- }
11014
- throw lastErr ?? /* @__PURE__ */ new Error(`Could not bind to a free port starting at ${options.startPort}`);
11015
- }
11016
- /** True if `err` is a Node `EADDRINUSE` error from `server.listen()`. */
11017
- function isAddrInUse(err) {
11018
- return typeof err === "object" && err !== null && err.code === "EADDRINUSE";
11019
- }
11020
- /**
11021
- * Run the full dev-server port resolution + holding-server bind sequence.
11022
- *
11023
- * Resolves the port from config / env / default, attempts to bind the
11024
- * holding server (auto-bumping when the port came from the default),
11025
- * and logs the chosen URL. On a clean failure for an explicit port, it
11026
- * warns and falls back to the requested port so Vite can surface the
11027
- * conflict via `strictPort: true`.
11028
- *
11029
- * Extracted from `index.ts` so the rootSync `config()` hook stays
11030
- * focused on plugin assembly.
11031
- */
11032
- async function startDevServerPort(input) {
11033
- const log = input.log ?? ((msg) => console.log(msg));
11034
- const warn = input.warn ?? ((msg) => console.warn(msg));
11035
- const start = resolveStartPort({
11036
- configPort: input.configPort,
11037
- envPort: input.envPort,
11038
- defaultPort: DEFAULT_PORT
11039
- });
11040
- try {
11041
- const result = await bindWithBump(input.listen, {
11042
- startPort: start.port,
11043
- autoBump: !start.explicit
11044
- });
11045
- if (result.bumped) log(`\n \x1b[33m[timber]\x1b[0m Port ${start.port} in use, using ${result.port}\n`);
11046
- log(`\n \x1b[2m\u{1FAB5} timber.js dev server starting at\x1b[0m \x1b[36mhttp://localhost:${result.port}\x1b[0m\n`);
11047
- return {
11048
- port: result.port,
11049
- explicit: start.explicit,
11050
- bound: true
11051
- };
11052
- } catch (err) {
11053
- if (start.explicit && isAddrInUse(err)) warn(`\n \x1b[33m[timber]\x1b[0m Port ${start.port} is already in use. Set PORT (or remove the override) to pick another port.\n`);
11054
- return {
11055
- port: start.port,
11056
- explicit: start.explicit,
11057
- bound: false
11058
- };
11059
- }
11060
- }
11061
10960
  //#endregion
11062
10961
  //#region src/index.ts
11063
10962
  /**
@@ -11178,18 +11077,18 @@ function timber(config) {
11178
11077
  const isMiddlewareMode = Boolean(userConfig.server?.middlewareMode);
11179
11078
  const resolvedHost = typeof userConfig.server?.host === "string" ? userConfig.server.host : userConfig.server?.host === true ? void 0 : "localhost";
11180
11079
  if (command === "serve" && !isPreview && !isMiddlewareMode) {
11181
- ctx.holdingServer = createHoldingServer();
11182
- const holdingRef = ctx.holdingServer;
11183
- const result = await startDevServerPort({
11184
- configPort: typeof userConfig.server?.port === "number" ? userConfig.server.port : void 0,
11185
- envPort: process.env.PORT,
11186
- listen: (p) => holdingRef.listen(p, resolvedHost)
11080
+ const start = resolveStartPort({
11081
+ configPort: userConfig.server?.port,
11082
+ envPort: process.env.PORT
11187
11083
  });
11188
- if (!result.bound) ctx.holdingServer = null;
11189
- if (result.bound) {
11190
- resolvedDevPort = result.port;
11191
- resolvedDevPortExplicit = result.explicit;
11192
- } else if (result.explicit) resolvedDevPort = result.port;
11084
+ resolvedDevPort = start.port;
11085
+ resolvedDevPortExplicit = userConfig.server?.strictPort ?? false;
11086
+ if (start.port !== 0) {
11087
+ ctx.holdingServer = createHoldingServer();
11088
+ await ctx.holdingServer.listen(start.port, resolvedHost).catch(() => {
11089
+ ctx.holdingServer = null;
11090
+ });
11091
+ }
11193
11092
  } else if (command === "serve" && isPreview) {
11194
11093
  const start = resolveStartPort({
11195
11094
  configPort: typeof userConfig.preview?.port === "number" ? userConfig.preview.port : typeof userConfig.server?.port === "number" ? userConfig.server.port : void 0,