@timber-js/app 0.2.0-alpha.97 → 0.2.0-alpha.99

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 (372) hide show
  1. package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
  2. package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
  3. package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
  4. package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
  5. package/dist/_chunks/{define-Itxvcd7F.js → define-B-Q_UMOD.js} +19 -23
  6. package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
  7. package/dist/_chunks/{define-C77ScO0m.js → define-CfBPoJb0.js} +24 -7
  8. package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
  9. package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
  10. package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
  11. package/dist/_chunks/{format-CYBGxKtc.js → format-Bcn-Iv1x.js} +1 -1
  12. package/dist/_chunks/{format-CYBGxKtc.js.map → format-Bcn-Iv1x.js.map} +1 -1
  13. package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
  14. package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
  15. package/dist/_chunks/logger-0m8MsKdc.js +291 -0
  16. package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
  17. package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
  18. package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
  19. package/dist/_chunks/{metadata-routes-DS3eKNmf.js → metadata-routes-BU684ls2.js} +1 -1
  20. package/dist/_chunks/{metadata-routes-DS3eKNmf.js.map → metadata-routes-BU684ls2.js.map} +1 -1
  21. package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
  22. package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
  23. package/dist/_chunks/registry-I2ss-lvy.js +20 -0
  24. package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
  25. package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
  26. package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
  27. package/dist/_chunks/{schema-bridge-C3xl_vfb.js → schema-bridge-Cxu4l-7p.js} +1 -1
  28. package/dist/_chunks/{schema-bridge-C3xl_vfb.js.map → schema-bridge-Cxu4l-7p.js.map} +1 -1
  29. package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
  30. package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
  31. package/dist/_chunks/{segment-context-fHFLF1PE.js → segment-context-Dx_OizxD.js} +1 -1
  32. package/dist/_chunks/{segment-context-fHFLF1PE.js.map → segment-context-Dx_OizxD.js.map} +1 -1
  33. package/dist/_chunks/{router-ref-C8OCm7g7.js → ssr-data-B4CdH7rE.js} +2 -26
  34. package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
  35. package/dist/_chunks/{stale-reload-BX5gL1r-.js → stale-reload-Bab885FO.js} +1 -1
  36. package/dist/_chunks/{stale-reload-BX5gL1r-.js.map → stale-reload-Bab885FO.js.map} +1 -1
  37. package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
  38. package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
  39. package/dist/_chunks/{use-query-states-BiV5GJgm.js → use-query-states-B2XTqxDR.js} +3 -19
  40. package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
  41. package/dist/_chunks/{use-params-IOPu7E8t.js → use-segment-params-BkpKAQ7D.js} +9 -95
  42. package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
  43. package/dist/_chunks/{interception-BbqMCVXa.js → walkers-Tg0Alwcg.js} +66 -87
  44. package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
  45. package/dist/_chunks/{dev-warnings-DpGRGoDi.js → warnings-Cg47l5sk.js} +3 -3
  46. package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
  47. package/dist/adapters/build-output-helper.d.ts +28 -0
  48. package/dist/adapters/build-output-helper.d.ts.map +1 -0
  49. package/dist/adapters/cloudflare.d.ts.map +1 -1
  50. package/dist/adapters/cloudflare.js +8 -28
  51. package/dist/adapters/cloudflare.js.map +1 -1
  52. package/dist/adapters/nitro.d.ts.map +1 -1
  53. package/dist/adapters/nitro.js +63 -31
  54. package/dist/adapters/nitro.js.map +1 -1
  55. package/dist/adapters/shared.d.ts +16 -0
  56. package/dist/adapters/shared.d.ts.map +1 -0
  57. package/dist/cache/index.js +9 -2
  58. package/dist/cache/index.js.map +1 -1
  59. package/dist/cache/timber-cache.d.ts.map +1 -1
  60. package/dist/client/error-boundary.js +2 -1
  61. package/dist/client/error-boundary.js.map +1 -1
  62. package/dist/client/form.d.ts +10 -24
  63. package/dist/client/form.d.ts.map +1 -1
  64. package/dist/client/index.d.ts +1 -5
  65. package/dist/client/index.d.ts.map +1 -1
  66. package/dist/client/index.js +41 -91
  67. package/dist/client/index.js.map +1 -1
  68. package/dist/client/internal.d.ts +2 -1
  69. package/dist/client/internal.d.ts.map +1 -1
  70. package/dist/client/internal.js +81 -7
  71. package/dist/client/internal.js.map +1 -1
  72. package/dist/client/rsc-fetch.d.ts.map +1 -1
  73. package/dist/client/state.d.ts +1 -1
  74. package/dist/client/use-cookie.d.ts +8 -0
  75. package/dist/client/use-cookie.d.ts.map +1 -1
  76. package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +1 -1
  77. package/dist/client/use-segment-params.d.ts.map +1 -0
  78. package/dist/codec.d.ts +1 -1
  79. package/dist/codec.d.ts.map +1 -1
  80. package/dist/codec.js +2 -2
  81. package/dist/config-types.d.ts +28 -0
  82. package/dist/config-types.d.ts.map +1 -1
  83. package/dist/cookies/define-cookie.d.ts +87 -35
  84. package/dist/cookies/define-cookie.d.ts.map +1 -1
  85. package/dist/cookies/index.d.ts +2 -1
  86. package/dist/cookies/index.d.ts.map +1 -1
  87. package/dist/cookies/index.js +48 -2
  88. package/dist/cookies/index.js.map +1 -0
  89. package/dist/cookies/json-cookie.d.ts +64 -0
  90. package/dist/cookies/json-cookie.d.ts.map +1 -0
  91. package/dist/cookies/validation.d.ts +46 -0
  92. package/dist/cookies/validation.d.ts.map +1 -0
  93. package/dist/{plugins/dev-404-page.d.ts → dev-tools/404-page.d.ts} +9 -19
  94. package/dist/dev-tools/404-page.d.ts.map +1 -0
  95. package/dist/{plugins/dev-browser-logs.d.ts → dev-tools/browser-logs.d.ts} +1 -1
  96. package/dist/dev-tools/browser-logs.d.ts.map +1 -0
  97. package/dist/{plugins/dev-error-page.d.ts → dev-tools/error-page.d.ts} +2 -2
  98. package/dist/dev-tools/error-page.d.ts.map +1 -0
  99. package/dist/{server/dev-holding-server.d.ts → dev-tools/holding-server.d.ts} +5 -3
  100. package/dist/dev-tools/holding-server.d.ts.map +1 -0
  101. package/dist/dev-tools/index.d.ts +31 -0
  102. package/dist/dev-tools/index.d.ts.map +1 -0
  103. package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
  104. package/dist/dev-tools/instrumentation.d.ts.map +1 -0
  105. package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
  106. package/dist/dev-tools/logger.d.ts.map +1 -0
  107. package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +1 -1
  108. package/dist/dev-tools/logs.d.ts.map +1 -0
  109. package/dist/{plugins/dev-error-overlay.d.ts → dev-tools/overlay.d.ts} +3 -12
  110. package/dist/dev-tools/overlay.d.ts.map +1 -0
  111. package/dist/dev-tools/stack-classifier.d.ts +34 -0
  112. package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
  113. package/dist/{plugins/dev-terminal-error.d.ts → dev-tools/terminal.d.ts} +2 -2
  114. package/dist/dev-tools/terminal.d.ts.map +1 -0
  115. package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +1 -1
  116. package/dist/dev-tools/warnings.d.ts.map +1 -0
  117. package/dist/index.d.ts +1 -0
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +285 -133
  120. package/dist/index.js.map +1 -1
  121. package/dist/plugin-context.d.ts +1 -1
  122. package/dist/plugin-context.d.ts.map +1 -1
  123. package/dist/plugins/adapter-build.d.ts.map +1 -1
  124. package/dist/plugins/build-report.d.ts +6 -4
  125. package/dist/plugins/build-report.d.ts.map +1 -1
  126. package/dist/routing/convention-lint.d.ts.map +1 -1
  127. package/dist/routing/index.d.ts +5 -3
  128. package/dist/routing/index.d.ts.map +1 -1
  129. package/dist/routing/index.js +3 -3
  130. package/dist/routing/scanner.d.ts +1 -10
  131. package/dist/routing/scanner.d.ts.map +1 -1
  132. package/dist/routing/segment-classify.d.ts +37 -8
  133. package/dist/routing/segment-classify.d.ts.map +1 -1
  134. package/dist/routing/status-file-lint.d.ts.map +1 -1
  135. package/dist/routing/types.d.ts +63 -23
  136. package/dist/routing/types.d.ts.map +1 -1
  137. package/dist/routing/walkers.d.ts +51 -0
  138. package/dist/routing/walkers.d.ts.map +1 -0
  139. package/dist/search-params/define.d.ts +25 -7
  140. package/dist/search-params/define.d.ts.map +1 -1
  141. package/dist/search-params/index.js +5 -3
  142. package/dist/search-params/index.js.map +1 -1
  143. package/dist/search-params/wrappers.d.ts +2 -2
  144. package/dist/search-params/wrappers.d.ts.map +1 -1
  145. package/dist/segment-params/define.d.ts +23 -6
  146. package/dist/segment-params/define.d.ts.map +1 -1
  147. package/dist/segment-params/index.js +1 -1
  148. package/dist/server/access-gate.d.ts +4 -3
  149. package/dist/server/access-gate.d.ts.map +1 -1
  150. package/dist/server/action-handler.d.ts +15 -6
  151. package/dist/server/action-handler.d.ts.map +1 -1
  152. package/dist/server/als-registry.d.ts +5 -5
  153. package/dist/server/als-registry.d.ts.map +1 -1
  154. package/dist/server/asset-headers.d.ts +1 -15
  155. package/dist/server/asset-headers.d.ts.map +1 -1
  156. package/dist/server/cookie-context.d.ts +170 -0
  157. package/dist/server/cookie-context.d.ts.map +1 -0
  158. package/dist/server/cookie-parsing.d.ts +51 -0
  159. package/dist/server/cookie-parsing.d.ts.map +1 -0
  160. package/dist/server/deny-boundary.d.ts +90 -0
  161. package/dist/server/deny-boundary.d.ts.map +1 -0
  162. package/dist/server/deny-renderer.d.ts.map +1 -1
  163. package/dist/server/early-hints-sender.d.ts.map +1 -1
  164. package/dist/server/html-injector-core.d.ts +212 -0
  165. package/dist/server/html-injector-core.d.ts.map +1 -0
  166. package/dist/server/html-injectors.d.ts +59 -59
  167. package/dist/server/html-injectors.d.ts.map +1 -1
  168. package/dist/server/index.d.ts +5 -4
  169. package/dist/server/index.d.ts.map +1 -1
  170. package/dist/server/index.js +4 -149
  171. package/dist/server/index.js.map +1 -1
  172. package/dist/server/internal.d.ts +6 -4
  173. package/dist/server/internal.d.ts.map +1 -1
  174. package/dist/server/internal.js +852 -852
  175. package/dist/server/internal.js.map +1 -1
  176. package/dist/server/logger.d.ts +14 -0
  177. package/dist/server/logger.d.ts.map +1 -1
  178. package/dist/server/middleware-runner.d.ts +17 -0
  179. package/dist/server/middleware-runner.d.ts.map +1 -1
  180. package/dist/server/node-stream-transforms.d.ts +46 -49
  181. package/dist/server/node-stream-transforms.d.ts.map +1 -1
  182. package/dist/server/param-coercion.d.ts +26 -0
  183. package/dist/server/param-coercion.d.ts.map +1 -0
  184. package/dist/server/pipeline-helpers.d.ts +95 -0
  185. package/dist/server/pipeline-helpers.d.ts.map +1 -0
  186. package/dist/server/pipeline-outcome.d.ts +49 -0
  187. package/dist/server/pipeline-outcome.d.ts.map +1 -0
  188. package/dist/server/pipeline-phases.d.ts +52 -0
  189. package/dist/server/pipeline-phases.d.ts.map +1 -0
  190. package/dist/server/pipeline.d.ts +51 -32
  191. package/dist/server/pipeline.d.ts.map +1 -1
  192. package/dist/server/port-resolution.d.ts +117 -0
  193. package/dist/server/port-resolution.d.ts.map +1 -0
  194. package/dist/server/request-context.d.ts +22 -159
  195. package/dist/server/request-context.d.ts.map +1 -1
  196. package/dist/server/route-element-builder.d.ts.map +1 -1
  197. package/dist/server/route-matcher.d.ts +20 -47
  198. package/dist/server/route-matcher.d.ts.map +1 -1
  199. package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
  200. package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
  201. package/dist/server/rsc-entry/helpers.d.ts +1 -1
  202. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  203. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  204. package/dist/server/rsc-entry/render-route.d.ts +50 -0
  205. package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
  206. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
  207. package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
  208. package/dist/server/state-tree-diff.d.ts.map +1 -1
  209. package/dist/server/status-code-resolver.d.ts +16 -11
  210. package/dist/server/status-code-resolver.d.ts.map +1 -1
  211. package/dist/server/tracing.d.ts +1 -1
  212. package/dist/server/tracing.d.ts.map +1 -1
  213. package/dist/server/tree-builder.d.ts +45 -16
  214. package/dist/server/tree-builder.d.ts.map +1 -1
  215. package/dist/server/types.d.ts +48 -0
  216. package/dist/server/types.d.ts.map +1 -1
  217. package/dist/server/utils/escape-html.d.ts +14 -0
  218. package/dist/server/utils/escape-html.d.ts.map +1 -0
  219. package/dist/shims/headers.d.ts +2 -2
  220. package/dist/shims/headers.d.ts.map +1 -1
  221. package/dist/shims/navigation-client.d.ts +3 -1
  222. package/dist/shims/navigation-client.d.ts.map +1 -1
  223. package/dist/shims/navigation.d.ts +9 -4
  224. package/dist/shims/navigation.d.ts.map +1 -1
  225. package/dist/utils/directive-parser.d.ts +0 -45
  226. package/dist/utils/directive-parser.d.ts.map +1 -1
  227. package/package.json +1 -1
  228. package/src/adapters/build-output-helper.ts +77 -0
  229. package/src/adapters/cloudflare.ts +10 -50
  230. package/src/adapters/nitro.ts +66 -50
  231. package/src/adapters/shared.ts +40 -0
  232. package/src/cache/timber-cache.ts +3 -2
  233. package/src/client/form.tsx +17 -25
  234. package/src/client/index.ts +16 -9
  235. package/src/client/internal.ts +3 -2
  236. package/src/client/router.ts +1 -1
  237. package/src/client/rsc-fetch.ts +15 -0
  238. package/src/client/state.ts +2 -2
  239. package/src/client/use-cookie.ts +29 -0
  240. package/src/codec.ts +3 -7
  241. package/src/config-types.ts +28 -0
  242. package/src/cookies/define-cookie.ts +271 -78
  243. package/src/cookies/index.ts +11 -8
  244. package/src/cookies/json-cookie.ts +105 -0
  245. package/src/cookies/validation.ts +134 -0
  246. package/src/{plugins/dev-404-page.ts → dev-tools/404-page.ts} +17 -48
  247. package/src/{plugins/dev-error-page.ts → dev-tools/error-page.ts} +5 -32
  248. package/src/{server/dev-holding-server.ts → dev-tools/holding-server.ts} +4 -2
  249. package/src/dev-tools/index.ts +90 -0
  250. package/src/dev-tools/instrumentation.ts +176 -0
  251. package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +2 -2
  252. package/src/{plugins/dev-error-overlay.ts → dev-tools/overlay.ts} +5 -23
  253. package/src/dev-tools/stack-classifier.ts +75 -0
  254. package/src/{plugins/dev-terminal-error.ts → dev-tools/terminal.ts} +4 -38
  255. package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +1 -1
  256. package/src/index.ts +95 -34
  257. package/src/plugin-context.ts +1 -1
  258. package/src/plugins/adapter-build.ts +3 -1
  259. package/src/plugins/build-report.ts +13 -22
  260. package/src/plugins/dev-server.ts +3 -3
  261. package/src/plugins/routing.ts +14 -12
  262. package/src/plugins/shims.ts +1 -1
  263. package/src/plugins/static-build.ts +1 -1
  264. package/src/routing/codegen.ts +1 -1
  265. package/src/routing/convention-lint.ts +9 -8
  266. package/src/routing/index.ts +5 -3
  267. package/src/routing/interception.ts +1 -1
  268. package/src/routing/scanner.ts +22 -95
  269. package/src/routing/segment-classify.ts +107 -8
  270. package/src/routing/status-file-lint.ts +7 -5
  271. package/src/routing/types.ts +63 -23
  272. package/src/routing/walkers.ts +90 -0
  273. package/src/search-params/define.ts +71 -15
  274. package/src/search-params/wrappers.ts +9 -2
  275. package/src/segment-params/define.ts +66 -13
  276. package/src/server/access-gate.tsx +9 -8
  277. package/src/server/action-handler.ts +34 -38
  278. package/src/server/als-registry.ts +5 -5
  279. package/src/server/asset-headers.ts +8 -34
  280. package/src/server/cookie-context.ts +468 -0
  281. package/src/server/cookie-parsing.ts +135 -0
  282. package/src/server/{deny-page-resolver.ts → deny-boundary.ts} +78 -14
  283. package/src/server/deny-renderer.ts +7 -12
  284. package/src/server/early-hints-sender.ts +3 -2
  285. package/src/server/fallback-error.ts +2 -2
  286. package/src/server/html-injector-core.ts +403 -0
  287. package/src/server/html-injectors.ts +158 -297
  288. package/src/server/index.ts +13 -14
  289. package/src/server/internal.ts +10 -3
  290. package/src/server/logger.ts +23 -0
  291. package/src/server/middleware-runner.ts +44 -0
  292. package/src/server/node-stream-transforms.ts +108 -248
  293. package/src/server/param-coercion.ts +76 -0
  294. package/src/server/pipeline-helpers.ts +204 -0
  295. package/src/server/pipeline-outcome.ts +167 -0
  296. package/src/server/pipeline-phases.ts +409 -0
  297. package/src/server/pipeline.ts +70 -540
  298. package/src/server/port-resolution.ts +215 -0
  299. package/src/server/request-context.ts +46 -451
  300. package/src/server/route-element-builder.ts +8 -4
  301. package/src/server/route-matcher.ts +28 -60
  302. package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
  303. package/src/server/rsc-entry/api-handler.ts +2 -2
  304. package/src/server/rsc-entry/error-renderer.ts +2 -2
  305. package/src/server/rsc-entry/helpers.ts +2 -7
  306. package/src/server/rsc-entry/index.ts +81 -366
  307. package/src/server/rsc-entry/render-route.ts +304 -0
  308. package/src/server/rsc-entry/rsc-payload.ts +1 -1
  309. package/src/server/rsc-entry/ssr-renderer.ts +2 -2
  310. package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
  311. package/src/server/sitemap-generator.ts +1 -1
  312. package/src/server/slot-resolver.ts +1 -1
  313. package/src/server/ssr-entry.ts +1 -1
  314. package/src/server/state-tree-diff.ts +4 -1
  315. package/src/server/status-code-resolver.ts +112 -128
  316. package/src/server/tracing.ts +3 -3
  317. package/src/server/tree-builder.ts +134 -56
  318. package/src/server/types.ts +52 -0
  319. package/src/server/utils/escape-html.ts +20 -0
  320. package/src/shims/headers.ts +3 -3
  321. package/src/shims/navigation-client.ts +4 -3
  322. package/src/shims/navigation.ts +9 -7
  323. package/src/utils/directive-parser.ts +0 -392
  324. package/dist/_chunks/actions-DLnUaR65.js +0 -421
  325. package/dist/_chunks/actions-DLnUaR65.js.map +0 -1
  326. package/dist/_chunks/als-registry-HS0LGUl2.js +0 -41
  327. package/dist/_chunks/als-registry-HS0LGUl2.js.map +0 -1
  328. package/dist/_chunks/debug-ECi_61pb.js +0 -108
  329. package/dist/_chunks/debug-ECi_61pb.js.map +0 -1
  330. package/dist/_chunks/define-C77ScO0m.js.map +0 -1
  331. package/dist/_chunks/define-Itxvcd7F.js.map +0 -1
  332. package/dist/_chunks/define-cookie-BowvzoP0.js +0 -94
  333. package/dist/_chunks/define-cookie-BowvzoP0.js.map +0 -1
  334. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +0 -1
  335. package/dist/_chunks/interception-BbqMCVXa.js.map +0 -1
  336. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +0 -41
  337. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +0 -1
  338. package/dist/_chunks/request-context-CK5tZqIP.js +0 -478
  339. package/dist/_chunks/request-context-CK5tZqIP.js.map +0 -1
  340. package/dist/_chunks/router-ref-C8OCm7g7.js.map +0 -1
  341. package/dist/_chunks/segment-classify-BDNn6EzD.js +0 -65
  342. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +0 -1
  343. package/dist/_chunks/tracing-CCYbKn5n.js +0 -238
  344. package/dist/_chunks/tracing-CCYbKn5n.js.map +0 -1
  345. package/dist/_chunks/use-params-IOPu7E8t.js.map +0 -1
  346. package/dist/_chunks/use-query-states-BiV5GJgm.js.map +0 -1
  347. package/dist/client/use-params.d.ts.map +0 -1
  348. package/dist/plugins/dev-404-page.d.ts.map +0 -1
  349. package/dist/plugins/dev-browser-logs.d.ts.map +0 -1
  350. package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
  351. package/dist/plugins/dev-error-page.d.ts.map +0 -1
  352. package/dist/plugins/dev-logs.d.ts.map +0 -1
  353. package/dist/plugins/dev-terminal-error.d.ts.map +0 -1
  354. package/dist/server/deny-page-resolver.d.ts +0 -52
  355. package/dist/server/deny-page-resolver.d.ts.map +0 -1
  356. package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
  357. package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
  358. package/dist/server/dev-holding-server.d.ts.map +0 -1
  359. package/dist/server/dev-logger.d.ts.map +0 -1
  360. package/dist/server/dev-span-processor.d.ts.map +0 -1
  361. package/dist/server/dev-warnings.d.ts.map +0 -1
  362. package/dist/server/manifest-status-resolver.d.ts +0 -58
  363. package/dist/server/manifest-status-resolver.d.ts.map +0 -1
  364. package/dist/server/page-deny-boundary.d.ts +0 -31
  365. package/dist/server/page-deny-boundary.d.ts.map +0 -1
  366. package/src/server/dev-fetch-instrumentation.ts +0 -96
  367. package/src/server/dev-span-processor.ts +0 -78
  368. package/src/server/manifest-status-resolver.ts +0 -215
  369. package/src/server/page-deny-boundary.tsx +0 -56
  370. /package/src/client/{use-params.ts → use-segment-params.ts} +0 -0
  371. /package/src/{plugins/dev-browser-logs.ts → dev-tools/browser-logs.ts} +0 -0
  372. /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
@@ -5,6 +5,12 @@
5
5
  * correct file to render by walking the fallback chain described in
6
6
  * design/10-error-handling.md §"Status-Code Files".
7
7
  *
8
+ * **Generic over `TFile`** (TIM-848). Walks `SegmentNode<TFile>` trees
9
+ * regardless of whether `TFile` is the build-time `RouteFile` or the
10
+ * runtime `ManifestFile`. Before TIM-848 there were two near-identical
11
+ * resolvers — one for the Map-based scanner output and one for the
12
+ * object-based runtime manifest. Now there is one.
13
+ *
8
14
  * Supports two format families:
9
15
  * - 'component' (default): .tsx/.jsx/.mdx status files → React rendering pipeline
10
16
  * - 'json': .json status files → raw JSON response, no React
@@ -17,17 +23,16 @@
17
23
  * Pass 3 — error.tsx (leaf → root)
18
24
  * Pass 4 — framework default (returns null)
19
25
  *
20
- * **JSON chain (4xx):**
21
- * Pass 1 — json status files (leaf → root): {status}.json → 4xx.json
26
+ * **JSON chain (4xx and 5xx):**
27
+ * Pass 1 — json status files (leaf → root): {status}.json → {category}.json
22
28
  * Pass 2 — framework default JSON (returns null, caller provides bare JSON)
23
29
  *
24
- * **5xx (component only):**
30
+ * **5xx component:**
25
31
  * Per-segment (leaf → root): {status}.tsx → 5xx.tsx → error.tsx
26
- * Then global-error.tsx (future)
27
32
  * Then framework default (returns null)
28
33
  */
29
34
 
30
- import type { SegmentNode, RouteFile } from '../routing/types.js';
35
+ import type { SegmentNode } from '../routing/types.js';
31
36
 
32
37
  // ─── Types ───────────────────────────────────────────────────────────────────
33
38
 
@@ -42,9 +47,9 @@ export type StatusFileKind =
42
47
  export type StatusFileFormat = 'component' | 'json';
43
48
 
44
49
  /** Result of resolving a status-code file for a segment chain. */
45
- export interface StatusFileResolution {
50
+ export interface StatusFileResolution<TFile> {
46
51
  /** The matched route file. */
47
- file: RouteFile;
52
+ file: TFile;
48
53
  /** The HTTP status code (always the original status, not the file's code). */
49
54
  status: number;
50
55
  /** How the file was matched. */
@@ -57,9 +62,9 @@ export interface StatusFileResolution {
57
62
  export type SlotDeniedKind = 'denied' | 'default';
58
63
 
59
64
  /** Result of resolving a slot denied file. */
60
- export interface SlotDeniedResolution {
65
+ export interface SlotDeniedResolution<TFile> {
61
66
  /** The matched route file (denied.tsx or default.tsx). */
62
- file: RouteFile;
67
+ file: TFile;
63
68
  /** Slot name without @ prefix. */
64
69
  slotName: string;
65
70
  /** How the file was matched. */
@@ -78,6 +83,52 @@ const LEGACY_FILE_TO_STATUS: Record<string, number> = {
78
83
  'unauthorized': 401,
79
84
  };
80
85
 
86
+ /** Reverse index: status code → legacy file name. Built once at module load. */
87
+ const STATUS_TO_LEGACY_FILE: Record<number, string> = Object.fromEntries(
88
+ Object.entries(LEGACY_FILE_TO_STATUS).map(([name, status]) => [status, name])
89
+ );
90
+
91
+ // ─── Lookup Helpers ──────────────────────────────────────────────────────
92
+
93
+ /**
94
+ * Look up `{statusStr}` then `{categoryKey}` (e.g. "4xx" / "5xx") in a
95
+ * status-file group on a single segment. Shared by all three fallback
96
+ * chains — the only structural difference between component 4xx,
97
+ * component 5xx, and JSON resolution is *which* group is searched and
98
+ * how the per-segment loop is layered around it.
99
+ */
100
+ function lookupInGroup<TFile>(
101
+ group: Record<string, TFile> | undefined,
102
+ statusStr: string,
103
+ categoryKey: string,
104
+ segmentIndex: number,
105
+ status: number
106
+ ): StatusFileResolution<TFile> | null {
107
+ if (!group) return null;
108
+ const exact = group[statusStr];
109
+ if (exact) return { file: exact, status, kind: 'exact', segmentIndex };
110
+ const category = group[categoryKey];
111
+ if (category) return { file: category, status, kind: 'category', segmentIndex };
112
+ return null;
113
+ }
114
+
115
+ /**
116
+ * Look up the legacy convention file (`not-found.tsx` / `forbidden.tsx` /
117
+ * `unauthorized.tsx`) for `status` on a single segment. Returns null if
118
+ * `status` has no legacy mapping or the file isn't present.
119
+ */
120
+ function lookupLegacy<TFile>(
121
+ group: Record<string, TFile> | undefined,
122
+ status: number,
123
+ segmentIndex: number
124
+ ): StatusFileResolution<TFile> | null {
125
+ if (!group) return null;
126
+ const name = STATUS_TO_LEGACY_FILE[status];
127
+ if (!name) return null;
128
+ const file = group[name];
129
+ return file ? { file, status, kind: 'legacy', segmentIndex } : null;
130
+ }
131
+
81
132
  // ─── Resolver ────────────────────────────────────────────────────────────────
82
133
 
83
134
  /**
@@ -91,101 +142,50 @@ const LEGACY_FILE_TO_STATUS: Record<string, number> = {
91
142
  * @param segments - The matched segment chain from root (index 0) to leaf (last).
92
143
  * @param format - The response format family ('component' or 'json'). Defaults to 'component'.
93
144
  */
94
- export function resolveStatusFile(
145
+ export function resolveStatusFile<TFile>(
95
146
  status: number,
96
- segments: ReadonlyArray<SegmentNode>,
147
+ segments: ReadonlyArray<SegmentNode<TFile>>,
97
148
  format: StatusFileFormat = 'component'
98
- ): StatusFileResolution | null {
99
- if (status >= 400 && status <= 499) {
100
- return format === 'json' ? resolve4xxJson(status, segments) : resolve4xx(status, segments);
101
- }
102
- if (status >= 500 && status <= 599) {
103
- // JSON format for 5xx uses the same json chain pattern
104
- return format === 'json' ? resolve5xxJson(status, segments) : resolve5xx(status, segments);
105
- }
106
- return null;
149
+ ): StatusFileResolution<TFile> | null {
150
+ if (status < 400 || status > 599) return null;
151
+ if (format === 'json') return resolveJson(status, segments);
152
+ if (status <= 499) return resolve4xx(status, segments);
153
+ return resolve5xx(status, segments);
107
154
  }
108
155
 
109
156
  /**
110
- * 4xx component fallback chain (three separate passes):
111
- * Pass 1 — status files (leaf → root): {status}.tsx → 4xx.tsx
112
- * Pass 2 legacy compat (leaf root): not-found.tsx / forbidden.tsx / unauthorized.tsx
113
- * Pass 3 error.tsx (leaf root)
157
+ * 4xx component fallback chain three separate full passes leaf→root.
158
+ *
159
+ * The passes must be separate (not interleaved per-segment) so that a
160
+ * root-level `404.tsx` beats a leaf-level `error.tsx`. The 5xx chain
161
+ * inverts this and is per-segment: a leaf's `error.tsx` beats a root's
162
+ * `5xx.tsx`. This asymmetry is the only reason these two functions exist
163
+ * separately.
164
+ *
165
+ * Pass 1 — {status}.tsx → 4xx.tsx (statusFiles)
166
+ * Pass 2 — not-found / forbidden / unauthorized (legacyStatusFiles)
167
+ * Pass 3 — error.tsx (error)
114
168
  */
115
- function resolve4xx(
169
+ function resolve4xx<TFile>(
116
170
  status: number,
117
- segments: ReadonlyArray<SegmentNode>
118
- ): StatusFileResolution | null {
171
+ segments: ReadonlyArray<SegmentNode<TFile>>
172
+ ): StatusFileResolution<TFile> | null {
119
173
  const statusStr = String(status);
120
174
 
121
- // Pass 1: status files across all segments (leaf → root)
122
- for (let i = segments.length - 1; i >= 0; i--) {
123
- const segment = segments[i];
124
- if (!segment.statusFiles) continue;
125
-
126
- // Exact match first
127
- const exact = segment.statusFiles.get(statusStr);
128
- if (exact) {
129
- return { file: exact, status, kind: 'exact', segmentIndex: i };
130
- }
131
-
132
- // Category catch-all
133
- const category = segment.statusFiles.get('4xx');
134
- if (category) {
135
- return { file: category, status, kind: 'category', segmentIndex: i };
136
- }
137
- }
138
-
139
- // Pass 2: legacy compat files (leaf → root)
140
175
  for (let i = segments.length - 1; i >= 0; i--) {
141
- const segment = segments[i];
142
- if (!segment.legacyStatusFiles) continue;
143
-
144
- for (const [name, legacyStatus] of Object.entries(LEGACY_FILE_TO_STATUS)) {
145
- if (legacyStatus === status) {
146
- const file = segment.legacyStatusFiles.get(name);
147
- if (file) {
148
- return { file, status, kind: 'legacy', segmentIndex: i };
149
- }
150
- }
151
- }
176
+ const r = lookupInGroup(segments[i].statusFiles, statusStr, '4xx', i, status);
177
+ if (r) return r;
152
178
  }
153
179
 
154
- // Pass 3: error.tsx (leaf → root)
155
180
  for (let i = segments.length - 1; i >= 0; i--) {
156
- if (segments[i].error) {
157
- return { file: segments[i].error!, status, kind: 'error', segmentIndex: i };
158
- }
181
+ const r = lookupLegacy(segments[i].legacyStatusFiles, status, i);
182
+ if (r) return r;
159
183
  }
160
184
 
161
- return null;
162
- }
163
-
164
- /**
165
- * 4xx JSON fallback chain (single pass):
166
- * Pass 1 — json status files (leaf → root): {status}.json → 4xx.json
167
- * No legacy compat, no error.tsx — JSON chain terminates at category catch-all.
168
- */
169
- function resolve4xxJson(
170
- status: number,
171
- segments: ReadonlyArray<SegmentNode>
172
- ): StatusFileResolution | null {
173
- const statusStr = String(status);
174
-
175
185
  for (let i = segments.length - 1; i >= 0; i--) {
176
- const segment = segments[i];
177
- if (!segment.jsonStatusFiles) continue;
178
-
179
- // Exact match first
180
- const exact = segment.jsonStatusFiles.get(statusStr);
181
- if (exact) {
182
- return { file: exact, status, kind: 'exact', segmentIndex: i };
183
- }
184
-
185
- // Category catch-all
186
- const category = segment.jsonStatusFiles.get('4xx');
187
- if (category) {
188
- return { file: category, status, kind: 'category', segmentIndex: i };
186
+ const errorFile = segments[i].error;
187
+ if (errorFile) {
188
+ return { file: errorFile, status, kind: 'error', segmentIndex: i };
189
189
  }
190
190
  }
191
191
 
@@ -193,33 +193,22 @@ function resolve4xxJson(
193
193
  }
194
194
 
195
195
  /**
196
- * 5xx component fallback chain (single pass, per-segment):
197
- * At each segment (leaf → root): {status}.tsx → 5xx.tsx → error.tsx
196
+ * 5xx component fallback chain single pass, per-segment leaf→root.
197
+ *
198
+ * At each segment: {status}.tsx → 5xx.tsx → error.tsx. A leaf's
199
+ * `error.tsx` therefore beats a root's `5xx.tsx`, which is the
200
+ * intentional inverse of the 4xx chain.
198
201
  */
199
- function resolve5xx(
202
+ function resolve5xx<TFile>(
200
203
  status: number,
201
- segments: ReadonlyArray<SegmentNode>
202
- ): StatusFileResolution | null {
204
+ segments: ReadonlyArray<SegmentNode<TFile>>
205
+ ): StatusFileResolution<TFile> | null {
203
206
  const statusStr = String(status);
204
207
 
205
208
  for (let i = segments.length - 1; i >= 0; i--) {
206
209
  const segment = segments[i];
207
-
208
- // Exact status file
209
- if (segment.statusFiles) {
210
- const exact = segment.statusFiles.get(statusStr);
211
- if (exact) {
212
- return { file: exact, status, kind: 'exact', segmentIndex: i };
213
- }
214
-
215
- // Category catch-all
216
- const category = segment.statusFiles.get('5xx');
217
- if (category) {
218
- return { file: category, status, kind: 'category', segmentIndex: i };
219
- }
220
- }
221
-
222
- // error.tsx at this segment level (for 5xx, checked per-segment)
210
+ const r = lookupInGroup(segment.statusFiles, statusStr, '5xx', i, status);
211
+ if (r) return r;
223
212
  if (segment.error) {
224
213
  return { file: segment.error, status, kind: 'error', segmentIndex: i };
225
214
  }
@@ -229,29 +218,22 @@ function resolve5xx(
229
218
  }
230
219
 
231
220
  /**
232
- * 5xx JSON fallback chain (single pass):
233
- * At each segment (leaf → root): {status}.json → 5xx.json
234
- * No error.tsx equivalent JSON chain terminates at category catch-all.
221
+ * JSON fallback chain (for both 4xx and 5xx) — single pass leaf→root.
222
+ *
223
+ * At each segment: {status}.json {category}.json. No legacy compat,
224
+ * no error.tsx — the JSON chain terminates at the category catch-all
225
+ * and the caller falls back to a bare-JSON framework default.
235
226
  */
236
- function resolve5xxJson(
227
+ function resolveJson<TFile>(
237
228
  status: number,
238
- segments: ReadonlyArray<SegmentNode>
239
- ): StatusFileResolution | null {
229
+ segments: ReadonlyArray<SegmentNode<TFile>>
230
+ ): StatusFileResolution<TFile> | null {
240
231
  const statusStr = String(status);
232
+ const categoryKey = status >= 500 ? '5xx' : '4xx';
241
233
 
242
234
  for (let i = segments.length - 1; i >= 0; i--) {
243
- const segment = segments[i];
244
- if (!segment.jsonStatusFiles) continue;
245
-
246
- const exact = segment.jsonStatusFiles.get(statusStr);
247
- if (exact) {
248
- return { file: exact, status, kind: 'exact', segmentIndex: i };
249
- }
250
-
251
- const category = segment.jsonStatusFiles.get('5xx');
252
- if (category) {
253
- return { file: category, status, kind: 'category', segmentIndex: i };
254
- }
235
+ const r = lookupInGroup(segments[i].jsonStatusFiles, statusStr, categoryKey, i, status);
236
+ if (r) return r;
255
237
  }
256
238
 
257
239
  return null;
@@ -267,7 +249,9 @@ function resolve5xxJson(
267
249
  *
268
250
  * @param slotNode - The segment node for the slot (segmentType === 'slot').
269
251
  */
270
- export function resolveSlotDenied(slotNode: SegmentNode): SlotDeniedResolution | null {
252
+ export function resolveSlotDenied<TFile>(
253
+ slotNode: SegmentNode<TFile>
254
+ ): SlotDeniedResolution<TFile> | null {
271
255
  const slotName = slotNode.segmentName.replace(/^@/, '');
272
256
 
273
257
  if (slotNode.denied) {
@@ -105,17 +105,17 @@ export function getTraceStore(): TraceStore | undefined {
105
105
  * Only called in dev mode — zero overhead in production.
106
106
  */
107
107
  export async function initDevTracing(
108
- config: import('./dev-logger.js').DevLoggerConfig
108
+ config: import('../dev-tools/logger.js').DevLoggerConfig
109
109
  ): Promise<void> {
110
110
  const api = await getOtelApi();
111
111
  if (!api) return;
112
112
 
113
- let DevSpanProcessor: typeof import('./dev-span-processor.js').DevSpanProcessor;
113
+ let DevSpanProcessor: typeof import('../dev-tools/instrumentation.js').DevSpanProcessor;
114
114
  let BasicTracerProvider: typeof import('@opentelemetry/sdk-trace-base').BasicTracerProvider;
115
115
  let AsyncLocalStorageContextManager: typeof import('@opentelemetry/context-async-hooks').AsyncLocalStorageContextManager;
116
116
 
117
117
  try {
118
- ({ DevSpanProcessor } = await import('./dev-span-processor.js'));
118
+ ({ DevSpanProcessor } = await import('../dev-tools/instrumentation.js'));
119
119
  ({ BasicTracerProvider } = await import('@opentelemetry/sdk-trace-base'));
120
120
  ({ AsyncLocalStorageContextManager } = await import('@opentelemetry/context-async-hooks'));
121
121
  } catch (err) {