@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
@@ -10,7 +10,8 @@
10
10
  * See design/02-rendering-pipeline.md §"Element Tree Construction"
11
11
  */
12
12
 
13
- import type { SegmentNode, RouteFile } from '../routing/types.js';
13
+ import type { ReactNode } from 'react';
14
+ import type { RouteFile, SegmentNode } from '../routing/types.js';
14
15
 
15
16
  // ─── Types ───────────────────────────────────────────────────────────────────
16
17
 
@@ -25,22 +26,87 @@ export interface LoadedModule {
25
26
  /** Function that loads a route file's module. */
26
27
  export type ModuleLoader = (file: RouteFile) => LoadedModule | Promise<LoadedModule>;
27
28
 
28
- /** A React element — kept opaque to avoid a React dependency in this module. */
29
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
- export type ReactElement = any;
29
+ /**
30
+ * A React component reference loaded from a route module's default export.
31
+ *
32
+ * Loaded modules' `default` is typed as `unknown` (modules are dynamic), so
33
+ * call sites narrow it through `isValidElementType` (below) before treating
34
+ * it as a component. The signature is a callable returning `ReactNode` —
35
+ * TypeScript's view of every valid React component shape, including exotic
36
+ * components (`memo`, `forwardRef`, `lazy`) which the type system treats as
37
+ * callable even though their runtime values are objects with `$$typeof`
38
+ * markers rather than functions.
39
+ */
40
+ export type LoadedComponent = (...args: unknown[]) => ReactNode;
41
+
42
+ // Marker symbols React stamps onto exotic component types. Mirrors the
43
+ // internal `isValidElementType` check in `react.development.js` — React
44
+ // doesn't export it, and we don't want to add `react-is` just for this one
45
+ // validation. Inlined the same way `isClientReference` in
46
+ // `route-element-builder.ts` inlines the client-reference marker.
47
+ const REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
48
+ const REACT_MEMO_TYPE = Symbol.for('react.memo');
49
+ const REACT_LAZY_TYPE = Symbol.for('react.lazy');
50
+ const REACT_PROVIDER_TYPE = Symbol.for('react.provider');
51
+ const REACT_CONTEXT_TYPE = Symbol.for('react.context');
52
+ const REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
53
+ const REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
54
+ const REACT_CLIENT_REFERENCE_TYPE = Symbol.for('react.client.reference');
55
+
56
+ const REACT_COMPONENT_TYPE_MARKERS: ReadonlySet<symbol> = new Set([
57
+ REACT_FORWARD_REF_TYPE,
58
+ REACT_MEMO_TYPE,
59
+ REACT_LAZY_TYPE,
60
+ REACT_PROVIDER_TYPE,
61
+ REACT_CONTEXT_TYPE,
62
+ REACT_SUSPENSE_TYPE,
63
+ REACT_SUSPENSE_LIST_TYPE,
64
+ REACT_CLIENT_REFERENCE_TYPE,
65
+ ]);
31
66
 
32
- /** Function that creates a React element. Matches React.createElement signature. */
67
+ /**
68
+ * Validate that a loaded module's `default` export is something React
69
+ * accepts as the first argument to `createElement` — i.e. a valid component
70
+ * type. React doesn't export `isValidElementType` (only `isValidElement`,
71
+ * which checks for *elements*, not *component types*), so this mirrors
72
+ * React's internal check:
73
+ *
74
+ * - functions → function or class components
75
+ * - objects with a `$$typeof` matching one of React's known component
76
+ * markers → exotic components (`memo`, `forwardRef`, `lazy`, context,
77
+ * suspense, client references via `@vitejs/plugin-rsc`)
78
+ *
79
+ * Strings (HTML tag names) are valid for `createElement` but never appear
80
+ * as a route module's default export, so they're not recognized here.
81
+ *
82
+ * Anything else (numbers, plain config objects, JSON, etc.) is rejected so
83
+ * the boundary wrapper is skipped rather than crashing inside React.
84
+ */
85
+ function isValidElementType(value: unknown): value is LoadedComponent {
86
+ if (typeof value === 'function') return true;
87
+ if (typeof value !== 'object' || value === null) return false;
88
+ const marker = (value as { $$typeof?: unknown }).$$typeof;
89
+ return typeof marker === 'symbol' && REACT_COMPONENT_TYPE_MARKERS.has(marker);
90
+ }
91
+
92
+ /**
93
+ * Function that creates a React element. Matches React.createElement signature.
94
+ *
95
+ * `props` is typed as `object | null` rather than `Record<string, unknown>` so
96
+ * that interface types with known keys (e.g. `AccessGateProps`,
97
+ * `ErrorBoundaryProps`) flow through without an explicit index-signature cast.
98
+ */
33
99
  export type CreateElement = (
34
100
  type: unknown,
35
- props: Record<string, unknown> | null,
101
+ props: object | null,
36
102
  ...children: unknown[]
37
- ) => ReactElement;
103
+ ) => ReactNode;
38
104
 
39
105
  /**
40
106
  * Resolved slot content for a layout.
41
107
  * Key is slot name (without @), value is the element tree for that slot.
42
108
  */
43
- export type SlotElements = Map<string, ReactElement>;
109
+ export type SlotElements = Map<string, ReactNode>;
44
110
 
45
111
  /** Configuration for the tree builder. */
46
112
  export interface TreeBuilderConfig {
@@ -92,8 +158,8 @@ export interface AccessGateProps {
92
158
  * This prevents the error from reaching React Flight, eliminating the
93
159
  * second render pass. See TIM-666.
94
160
  */
95
- denyPages?: import('./deny-page-resolver.js').DenyPageEntry[];
96
- children: ReactElement;
161
+ denyPages?: import('./deny-boundary.js').DenyPageEntry[];
162
+ children: ReactNode;
97
163
  }
98
164
 
99
165
  /**
@@ -107,24 +173,33 @@ export interface AccessGateProps {
107
173
  export interface SlotAccessGateProps {
108
174
  accessFn: () => unknown;
109
175
  /** The denied.tsx component (not a pre-built element). null if no denied.tsx exists. */
110
- DeniedComponent: ((...args: unknown[]) => unknown) | null;
176
+ DeniedComponent: LoadedComponent | null;
111
177
  /** Slot directory name without @ prefix (e.g. "admin", "sidebar"). */
112
178
  slotName: string;
113
179
  /** createElement function for building elements dynamically. */
114
180
  createElement: CreateElement;
115
- defaultFallback: ReactElement | null;
116
- children: ReactElement;
181
+ defaultFallback: ReactNode;
182
+ children: ReactNode;
117
183
  }
118
184
 
119
185
  /**
120
186
  * Framework-injected error boundary wrapper.
121
187
  * Wraps content with status-code error boundary handling.
188
+ *
189
+ * Field types must agree with `TimberErrorBoundaryProps` in
190
+ * `client/error-boundary.tsx`. The two are kept structurally compatible by
191
+ * convention rather than by direct type import — tree-builder.ts is the
192
+ * server-side construction site and may not import types from a 'use client'
193
+ * module to keep the server barrel free of client coupling.
122
194
  */
123
195
  export interface ErrorBoundaryProps {
124
- fallbackComponent?: ReactElement | null;
125
- fallbackElement?: ReactElement | null;
196
+ /** The component to render when an error is caught (TSX status files). */
197
+ fallbackComponent?: LoadedComponent;
198
+ /** Pre-rendered fallback element (MDX status files — see TIM-503). */
199
+ fallbackElement?: ReactNode;
200
+ /** Status code filter: 400 = any 4xx, 500 = any 5xx, specific number = exact match. */
126
201
  status?: number;
127
- children: ReactElement;
202
+ children: ReactNode;
128
203
  }
129
204
 
130
205
  // ─── Tree Builder ────────────────────────────────────────────────────────────
@@ -133,8 +208,11 @@ export interface ErrorBoundaryProps {
133
208
  * Result of building the element tree.
134
209
  */
135
210
  export interface TreeBuildResult {
136
- /** The root React element tree ready for renderToReadableStream. */
137
- tree: ReactElement;
211
+ /**
212
+ * The root React element tree ready for renderToReadableStream.
213
+ * `null` for API routes (route.ts), which don't render a React tree.
214
+ */
215
+ tree: ReactNode;
138
216
  /** Whether the leaf segment is a route.ts (API endpoint) rather than a page. */
139
217
  isApiRoute: boolean;
140
218
  }
@@ -167,7 +245,7 @@ export async function buildElementTree(config: TreeBuilderConfig): Promise<TreeB
167
245
 
168
246
  // Start with the page component
169
247
  const pageModule = leaf.page ? await loadModule(leaf.page) : null;
170
- const PageComponent = pageModule?.default as ((...args: unknown[]) => ReactElement) | undefined;
248
+ const PageComponent = pageModule?.default as LoadedComponent | undefined;
171
249
 
172
250
  if (!PageComponent) {
173
251
  throw new Error(
@@ -177,7 +255,7 @@ export async function buildElementTree(config: TreeBuilderConfig): Promise<TreeB
177
255
  }
178
256
 
179
257
  // Build the page element — params are accessed via getSegmentParams() from ALS
180
- let element: ReactElement = createElement(PageComponent, {});
258
+ let element: ReactNode = createElement(PageComponent, {});
181
259
 
182
260
  // Build tree bottom-up: wrap page, then walk segments from leaf to root
183
261
  for (let i = segments.length - 1; i >= 0; i--) {
@@ -206,15 +284,15 @@ export async function buildElementTree(config: TreeBuilderConfig): Promise<TreeB
206
284
  // Wrap in layout (if exists and not the leaf's page-level wrapping)
207
285
  if (segment.layout) {
208
286
  const layoutModule = await loadModule(segment.layout);
209
- const LayoutComponent = layoutModule.default as
210
- | ((...args: unknown[]) => ReactElement)
211
- | undefined;
287
+ const LayoutComponent = layoutModule.default as LoadedComponent | undefined;
212
288
 
213
289
  if (LayoutComponent) {
214
290
  // Resolve parallel slots for this layout
215
- const slotProps: Record<string, ReactElement> = {};
216
- if (segment.slots.size > 0) {
217
- for (const [slotName, slotNode] of segment.slots) {
291
+ const slotProps: Record<string, ReactNode> = {};
292
+ const slotNames = Object.keys(segment.slots);
293
+ if (slotNames.length > 0) {
294
+ for (const slotName of slotNames) {
295
+ const slotNode = segment.slots[slotName]!;
218
296
  slotProps[slotName] = await buildSlotElement(
219
297
  slotNode,
220
298
  loadModule,
@@ -248,23 +326,21 @@ async function buildSlotElement(
248
326
  loadModule: ModuleLoader,
249
327
  createElement: CreateElement,
250
328
  errorBoundaryComponent: unknown
251
- ): Promise<ReactElement> {
329
+ ): Promise<ReactNode> {
252
330
  // Load slot page
253
331
  const pageModule = slotNode.page ? await loadModule(slotNode.page) : null;
254
- const PageComponent = pageModule?.default as ((...args: unknown[]) => ReactElement) | undefined;
332
+ const PageComponent = pageModule?.default as LoadedComponent | undefined;
255
333
 
256
334
  // Load default.tsx fallback
257
335
  const defaultModule = slotNode.default ? await loadModule(slotNode.default) : null;
258
- const DefaultComponent = defaultModule?.default as
259
- | ((...args: unknown[]) => ReactElement)
260
- | undefined;
336
+ const DefaultComponent = defaultModule?.default as LoadedComponent | undefined;
261
337
 
262
338
  // If no page, render default.tsx or null
263
339
  if (!PageComponent) {
264
340
  return DefaultComponent ? createElement(DefaultComponent, {}) : null;
265
341
  }
266
342
 
267
- let element: ReactElement = createElement(PageComponent, {});
343
+ let element: ReactNode = createElement(PageComponent, {});
268
344
 
269
345
  // Wrap in error boundaries
270
346
  element = await wrapWithErrorBoundaries(
@@ -283,8 +359,7 @@ async function buildSlotElement(
283
359
  // Load denied.tsx — pass component (not pre-built element) so
284
360
  // SlotAccessGate can forward DenySignal.data dynamically. See TIM-488.
285
361
  const deniedModule = slotNode.denied ? await loadModule(slotNode.denied) : null;
286
- const DeniedComponent =
287
- (deniedModule?.default as ((...args: unknown[]) => ReactElement) | undefined) ?? null;
362
+ const DeniedComponent = (deniedModule?.default as LoadedComponent | undefined) ?? null;
288
363
 
289
364
  const defaultFallback = DefaultComponent ? createElement(DefaultComponent, {}) : null;
290
365
 
@@ -334,34 +409,37 @@ function isMdxFile(file: RouteFile): boolean {
334
409
  */
335
410
  async function wrapWithErrorBoundaries(
336
411
  segment: SegmentNode,
337
- element: ReactElement,
412
+ element: ReactNode,
338
413
  loadModule: ModuleLoader,
339
414
  createElement: CreateElement,
340
415
  errorBoundaryComponent: unknown
341
- ): Promise<ReactElement> {
416
+ ): Promise<ReactNode> {
342
417
  // Wrapping is applied inside-out. The last wrap call produces the outermost boundary.
343
418
  // Order: specific status → category → error.tsx (outermost)
344
419
 
345
420
  if (segment.statusFiles) {
346
421
  // Wrap with specific status files (innermost — highest priority at runtime)
347
- for (const [key, file] of segment.statusFiles) {
422
+ for (const [key, file] of Object.entries(segment.statusFiles)) {
348
423
  if (key !== '4xx' && key !== '5xx') {
349
424
  const status = parseInt(key, 10);
350
425
  if (!isNaN(status)) {
351
426
  const mod = await loadModule(file);
352
- const Component = mod.default;
427
+ // mod.default is `unknown` — narrow to a component reference.
428
+ // `isValidElementType` accepts memo/forwardRef objects in addition to
429
+ // bare functions; non-component values fall through.
430
+ const Component = isValidElementType(mod.default) ? mod.default : null;
353
431
  if (Component) {
354
- const boundaryProps = isMdxFile(file)
355
- ? ({
432
+ const boundaryProps: ErrorBoundaryProps = isMdxFile(file)
433
+ ? {
356
434
  fallbackElement: createElement(Component, { status }),
357
435
  status,
358
436
  children: element,
359
- } satisfies ErrorBoundaryProps)
360
- : ({
437
+ }
438
+ : {
361
439
  fallbackComponent: Component,
362
440
  status,
363
441
  children: element,
364
- } satisfies ErrorBoundaryProps);
442
+ };
365
443
  element = createElement(errorBoundaryComponent, boundaryProps);
366
444
  }
367
445
  }
@@ -369,23 +447,23 @@ async function wrapWithErrorBoundaries(
369
447
  }
370
448
 
371
449
  // Wrap with category catch-alls (4xx.tsx, 5xx.tsx)
372
- for (const [key, file] of segment.statusFiles) {
450
+ for (const [key, file] of Object.entries(segment.statusFiles)) {
373
451
  if (key === '4xx' || key === '5xx') {
374
452
  const mod = await loadModule(file);
375
- const Component = mod.default;
453
+ const Component = isValidElementType(mod.default) ? mod.default : null;
376
454
  if (Component) {
377
455
  const categoryStatus = key === '4xx' ? 400 : 500;
378
- const boundaryProps = isMdxFile(file)
379
- ? ({
456
+ const boundaryProps: ErrorBoundaryProps = isMdxFile(file)
457
+ ? {
380
458
  fallbackElement: createElement(Component, {}),
381
459
  status: categoryStatus,
382
460
  children: element,
383
- } satisfies ErrorBoundaryProps)
384
- : ({
461
+ }
462
+ : {
385
463
  fallbackComponent: Component,
386
464
  status: categoryStatus,
387
465
  children: element,
388
- } satisfies ErrorBoundaryProps);
466
+ };
389
467
  element = createElement(errorBoundaryComponent, boundaryProps);
390
468
  }
391
469
  }
@@ -397,17 +475,17 @@ async function wrapWithErrorBoundaries(
397
475
  // MDX error files are pre-rendered without those props (they're static content).
398
476
  if (segment.error) {
399
477
  const errorModule = await loadModule(segment.error);
400
- const ErrorComponent = errorModule.default;
478
+ const ErrorComponent = isValidElementType(errorModule.default) ? errorModule.default : null;
401
479
  if (ErrorComponent) {
402
- const boundaryProps = isMdxFile(segment.error)
403
- ? ({
480
+ const boundaryProps: ErrorBoundaryProps = isMdxFile(segment.error)
481
+ ? {
404
482
  fallbackElement: createElement(ErrorComponent, {}),
405
483
  children: element,
406
- } satisfies ErrorBoundaryProps)
407
- : ({
484
+ }
485
+ : {
408
486
  fallbackComponent: ErrorComponent,
409
487
  children: element,
410
- } satisfies ErrorBoundaryProps);
488
+ };
411
489
  element = createElement(errorBoundaryComponent, boundaryProps);
412
490
  }
413
491
  }
@@ -160,4 +160,56 @@ export namespace MetadataRoute {
160
160
  sitemap?: string | string[];
161
161
  host?: string;
162
162
  }
163
+ /**
164
+ * PWA Web App Manifest — serialized as `application/manifest+json`.
165
+ *
166
+ * Intentionally permissive: the manifest spec is large and evolving
167
+ * (W3C + browser-specific extensions). Users that want stricter typing
168
+ * can augment the return type with a library like `web-app-manifest`.
169
+ */
170
+ export type Manifest = Record<string, unknown>;
163
171
  }
172
+
173
+ /**
174
+ * The value a dynamic metadata route handler may return.
175
+ *
176
+ * This is a structural union — the pipeline dispatches on the shape at
177
+ * request time (see `pipeline-phases.ts`):
178
+ * - `Response` → returned as-is (e.g. `ImageResponse`, `Response.redirect()`).
179
+ * Used by `icon.tsx`, `opengraph-image.tsx`, `twitter-image.tsx`,
180
+ * `apple-icon.tsx`.
181
+ * - `string` → written as the response body verbatim. Used by `robots.ts`
182
+ * and by any handler that wants to emit a pre-serialized payload.
183
+ * - `MetadataRoute.Sitemap` → serialized via the sitemap XML writer. Used
184
+ * by `sitemap.ts`.
185
+ * - `MetadataRoute.Manifest` → serialized via `JSON.stringify`. Used by
186
+ * `manifest.ts`.
187
+ *
188
+ * See design/16-metadata.md §"Metadata Routes".
189
+ */
190
+ export type MetadataResult = Response | string | MetadataRoute.Sitemap | MetadataRoute.Manifest;
191
+
192
+ /**
193
+ * Default export signature for a dynamic metadata route file
194
+ * (`sitemap.ts`, `robots.ts`, `manifest.ts`, `icon.tsx`,
195
+ * `opengraph-image.tsx`, `twitter-image.tsx`, `apple-icon.tsx`).
196
+ *
197
+ * Parameterize `TResult` to narrow the return type for a specific route:
198
+ *
199
+ * ```ts
200
+ * // app/sitemap.ts
201
+ * import type { MetadataHandler, MetadataRoute } from '@timber-js/app/server';
202
+ *
203
+ * const sitemap: MetadataHandler<MetadataRoute.Sitemap> = async () => [
204
+ * { url: 'https://example.com/', changeFrequency: 'weekly', priority: 1 },
205
+ * ];
206
+ * export default sitemap;
207
+ * ```
208
+ *
209
+ * The handler is currently invoked with no arguments. Per-request context
210
+ * (`params`, `searchParams`, `Request`) is not yet wired through to metadata
211
+ * route handlers; when it is, this signature will grow a context parameter.
212
+ */
213
+ export type MetadataHandler<TResult extends MetadataResult = MetadataResult> = () =>
214
+ | TResult
215
+ | Promise<TResult>;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared HTML escaping utility.
3
+ *
4
+ * Used by both dev-only paths (error pages, 404 page) and production
5
+ * paths (deny-renderer, RSC helpers). Lives in server/utils/ because
6
+ * it's not dev-only.
7
+ */
8
+
9
+ /**
10
+ * Escape a string for safe embedding in HTML content or attributes.
11
+ *
12
+ * Replaces `&`, `<`, `>`, and `"` with their HTML entity equivalents.
13
+ */
14
+ export function escapeHtml(str: string): string {
15
+ return str
16
+ .replace(/&/g, '&amp;')
17
+ .replace(/</g, '&lt;')
18
+ .replace(/>/g, '&gt;')
19
+ .replace(/"/g, '&quot;');
20
+ }
@@ -6,8 +6,8 @@
6
6
  * pipeline (both import from the same shared request-context chunk in dist/).
7
7
  */
8
8
 
9
- // Re-export timber's new names for the primary API
10
- export { getHeaders, getCookies } from '@timber-js/app/server';
9
+ // Re-export timber's primary API
10
+ export { getHeaders, getCookieJar } from '@timber-js/app/server';
11
11
 
12
12
  // Next.js compat aliases — libraries importing from 'next/headers' expect these names.
13
- export { getHeaders as headers, getCookies as cookies } from '@timber-js/app/server';
13
+ export { getHeaders as headers, getCookieJar as cookies } from '@timber-js/app/server';
@@ -16,11 +16,12 @@
16
16
  * See design/14-ecosystem.md §"next/navigation" for the full shim audit.
17
17
  */
18
18
 
19
- // Hooks — imported from the public barrel for module singleton consistency.
19
+ // Hooks — useSegmentParams and useSearchParams import from direct modules
20
+ // since they're no longer in @timber-js/app/client public exports.
21
+ export { useSegmentParams } from '../client/use-segment-params.js';
22
+ export { useSearchParams } from '../client/use-search-params.js';
20
23
  export {
21
- useSegmentParams,
22
24
  usePathname,
23
- useSearchParams,
24
25
  useRouter,
25
26
  useSelectedLayoutSegment,
26
27
  useSelectedLayoutSegments,
@@ -1,17 +1,19 @@
1
1
  /**
2
2
  * Shim: next/navigation → timber navigation primitives
3
3
  *
4
- * Client hooks import from @timber-js/app/client (the public barrel) so they
5
- * resolve to the same module instances as user code in Vite dev. Server
6
- * functions import from @timber-js/app/server for ALS singleton consistency.
4
+ * Client hooks import from their direct modules since useSegmentParams,
5
+ * useSearchParams, and useQueryStates are no longer part of
6
+ * @timber-js/app/client public exports (they live on define* factories).
7
+ * The shim re-exports them for next/navigation library compat (nuqs etc).
8
+ *
9
+ * Server functions import from @timber-js/app/server for ALS singleton consistency.
7
10
  */
8
11
 
9
- // Hooks (client-side — imported from public barrel for module singleton)
12
+ // Hooks re-exported for next/navigation compat
13
+ export { useSegmentParams, useSegmentParams as useParams } from '../client/use-segment-params.js';
14
+ export { useSearchParams } from '../client/use-search-params.js';
10
15
  export {
11
- useSegmentParams,
12
- useSegmentParams as useParams,
13
16
  usePathname,
14
- useSearchParams,
15
17
  useRouter,
16
18
  useSelectedLayoutSegment,
17
19
  useSelectedLayoutSegments,