@timber-js/app 0.2.0-alpha.185 → 0.2.0-alpha.187

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 (570) hide show
  1. package/dist/_chunks/{actions-O_LsyCE4.js → actions-35jnMdeJ.js} +4 -3
  2. package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-35jnMdeJ.js.map} +1 -1
  3. package/dist/_chunks/als-registry-C6kcfprT.js +41 -0
  4. package/dist/_chunks/als-registry-C6kcfprT.js.map +1 -0
  5. package/dist/_chunks/als-slots-BEEIPKYm.js +26 -0
  6. package/dist/_chunks/als-slots-BEEIPKYm.js.map +1 -0
  7. package/dist/_chunks/base-path-DaQrzbez.js +80 -0
  8. package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
  9. package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
  10. package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
  11. package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
  12. package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
  13. package/dist/_chunks/{cache-api-B-lhk9p4.js → cache-api-DjNrIWRR.js} +8 -14
  14. package/dist/_chunks/cache-api-DjNrIWRR.js.map +1 -0
  15. package/dist/_chunks/cli-check-CpmN7Nh-.js +256 -0
  16. package/dist/_chunks/cli-check-CpmN7Nh-.js.map +1 -0
  17. package/dist/_chunks/cli-schema-sync-CGMp_Psg.js +298 -0
  18. package/dist/_chunks/cli-schema-sync-CGMp_Psg.js.map +1 -0
  19. package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-CGP6BZKO.js} +92 -14
  20. package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-CGP6BZKO.js.map} +1 -1
  21. package/dist/_chunks/convention-lint-kXsgc_-7.js +784 -0
  22. package/dist/_chunks/convention-lint-kXsgc_-7.js.map +1 -0
  23. package/dist/_chunks/error-boundary-D-ODYX41.js +353 -0
  24. package/dist/_chunks/error-boundary-D-ODYX41.js.map +1 -0
  25. package/dist/_chunks/{fast-hash-D6hIVt1Y.js → fast-hash-C-tVYrLb.js} +6 -1
  26. package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
  27. package/dist/_chunks/file-cache-DmX7OqZP.js +454 -0
  28. package/dist/_chunks/file-cache-DmX7OqZP.js.map +1 -0
  29. package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
  30. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
  31. package/dist/_chunks/{logger-AWfuX-KJ.js → logger-D8xJZXIN.js} +34 -51
  32. package/dist/_chunks/logger-D8xJZXIN.js.map +1 -0
  33. package/dist/_chunks/mdx-file-C005ay-P.js +25 -0
  34. package/dist/_chunks/mdx-file-C005ay-P.js.map +1 -0
  35. package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-rCinWLiE.js} +8 -2
  36. package/dist/_chunks/plugin-context-rCinWLiE.js.map +1 -0
  37. package/dist/_chunks/purge-store-Byr8XOjU.js +14 -0
  38. package/dist/_chunks/purge-store-Byr8XOjU.js.map +1 -0
  39. package/dist/_chunks/{resolve-schema-Dz3fcFUo.js → resolve-schema-5ma5pp1b.js} +2 -2
  40. package/dist/_chunks/{resolve-schema-Dz3fcFUo.js.map → resolve-schema-5ma5pp1b.js.map} +1 -1
  41. package/dist/_chunks/{router-ref-CtmF-aPv.js → router-ref-DuYuV_0Q.js} +2 -2
  42. package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
  43. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
  44. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
  45. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
  46. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
  47. package/dist/_chunks/rsc-media-type-DRqE_lD_.js +46 -0
  48. package/dist/_chunks/rsc-media-type-DRqE_lD_.js.map +1 -0
  49. package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
  50. package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
  51. package/dist/_chunks/scanner-C8b0Gcw3.js +1564 -0
  52. package/dist/_chunks/scanner-C8b0Gcw3.js.map +1 -0
  53. package/dist/_chunks/schema-bridge-Cc2Gngu1.js +199 -0
  54. package/dist/_chunks/schema-bridge-Cc2Gngu1.js.map +1 -0
  55. package/dist/_chunks/{segment-classify-Byy425ng.js → segment-classify-C539Pa2O.js} +23 -2
  56. package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
  57. package/dist/_chunks/segment-context-CjOlyB8Y.js +97 -0
  58. package/dist/_chunks/segment-context-CjOlyB8Y.js.map +1 -0
  59. package/dist/_chunks/{canonicalize-DQHyFClh.js → segment-keys-BawYuNFO.js} +61 -2
  60. package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
  61. package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
  62. package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
  63. package/dist/_chunks/{ssr-data-BOWsq18U.js → ssr-data-14MXm7Pj.js} +17 -2
  64. package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
  65. package/dist/_chunks/{use-query-states-DFvWd-EA.js → use-query-states-BbU5Ge1V.js} +74 -26
  66. package/dist/_chunks/use-query-states-BbU5Ge1V.js.map +1 -0
  67. package/dist/_chunks/use-segment-params-C4r4BD9T.js +398 -0
  68. package/dist/_chunks/use-segment-params-C4r4BD9T.js.map +1 -0
  69. package/dist/_chunks/walkers-RzN6AFjr.js +141 -0
  70. package/dist/_chunks/walkers-RzN6AFjr.js.map +1 -0
  71. package/dist/adapters/build-output-helper.d.ts +37 -0
  72. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  73. package/dist/adapters/cloudflare-dev.js +1 -1
  74. package/dist/adapters/cloudflare-kv-cache.js +1 -1
  75. package/dist/adapters/cloudflare.d.ts.map +1 -1
  76. package/dist/adapters/cloudflare.js +1 -1
  77. package/dist/adapters/compress-module.d.ts +12 -0
  78. package/dist/adapters/compress-module.d.ts.map +1 -1
  79. package/dist/adapters/fs-identity.d.ts +64 -0
  80. package/dist/adapters/fs-identity.d.ts.map +1 -0
  81. package/dist/adapters/nitro.d.ts.map +1 -1
  82. package/dist/adapters/nitro.js +56 -5
  83. package/dist/adapters/nitro.js.map +1 -1
  84. package/dist/adapters/shared.d.ts +57 -1
  85. package/dist/adapters/shared.d.ts.map +1 -1
  86. package/dist/adapters/types.d.ts +13 -1
  87. package/dist/adapters/types.d.ts.map +1 -1
  88. package/dist/cache/fast-hash.d.ts +5 -0
  89. package/dist/cache/fast-hash.d.ts.map +1 -1
  90. package/dist/cache/index.js +1 -1
  91. package/dist/cdn/cloudflare-purge.js +30 -0
  92. package/dist/cdn/cloudflare-purge.js.map +1 -0
  93. package/dist/cdn/fastly-purge.js +33 -0
  94. package/dist/cdn/fastly-purge.js.map +1 -0
  95. package/dist/cdn/index.js +94 -0
  96. package/dist/cdn/index.js.map +1 -0
  97. package/dist/cdn/workers-cache-purge.js +35 -0
  98. package/dist/cdn/workers-cache-purge.js.map +1 -0
  99. package/dist/cli-check.d.ts +153 -0
  100. package/dist/cli-check.d.ts.map +1 -0
  101. package/dist/cli.d.ts +34 -8
  102. package/dist/cli.d.ts.map +1 -1
  103. package/dist/cli.js +46 -21
  104. package/dist/cli.js.map +1 -1
  105. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  106. package/dist/client/browser-entry/hydrate.d.ts +20 -9
  107. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  108. package/dist/client/browser-entry/index.d.ts +1 -1
  109. package/dist/client/browser-entry/index.d.ts.map +1 -1
  110. package/dist/client/browser-entry/post-hydration.d.ts +4 -1
  111. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  112. package/dist/client/browser-entry/router-init.d.ts +3 -0
  113. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  114. package/dist/client/browser-entry/rsc-stream.d.ts +8 -0
  115. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -1
  116. package/dist/client/error-boundary.d.ts +7 -0
  117. package/dist/client/error-boundary.d.ts.map +1 -1
  118. package/dist/client/error-boundary.js +1 -162
  119. package/dist/client/history.d.ts +13 -6
  120. package/dist/client/history.d.ts.map +1 -1
  121. package/dist/client/index.d.ts +1 -0
  122. package/dist/client/index.d.ts.map +1 -1
  123. package/dist/client/index.js +42 -41
  124. package/dist/client/index.js.map +1 -1
  125. package/dist/client/internal.d.ts +4 -3
  126. package/dist/client/internal.d.ts.map +1 -1
  127. package/dist/client/internal.js +877 -311
  128. package/dist/client/internal.js.map +1 -1
  129. package/dist/client/link.d.ts +1 -7
  130. package/dist/client/link.d.ts.map +1 -1
  131. package/dist/client/navigation-api.d.ts +2 -2
  132. package/dist/client/navigation-commit.d.ts +87 -0
  133. package/dist/client/navigation-commit.d.ts.map +1 -0
  134. package/dist/client/navigation-context.d.ts +37 -20
  135. package/dist/client/navigation-context.d.ts.map +1 -1
  136. package/dist/client/navigation-root.d.ts +63 -23
  137. package/dist/client/navigation-root.d.ts.map +1 -1
  138. package/dist/client/params-context.d.ts +81 -0
  139. package/dist/client/params-context.d.ts.map +1 -0
  140. package/dist/client/router-effects.d.ts +129 -0
  141. package/dist/client/router-effects.d.ts.map +1 -0
  142. package/dist/client/router-lifecycle.d.ts +55 -0
  143. package/dist/client/router-lifecycle.d.ts.map +1 -0
  144. package/dist/client/router-pipeline.d.ts +84 -0
  145. package/dist/client/router-pipeline.d.ts.map +1 -0
  146. package/dist/client/router-ref.d.ts +1 -1
  147. package/dist/client/router-ref.d.ts.map +1 -1
  148. package/dist/client/router-skew.d.ts +21 -0
  149. package/dist/client/router-skew.d.ts.map +1 -0
  150. package/dist/client/router-types.d.ts +207 -0
  151. package/dist/client/router-types.d.ts.map +1 -0
  152. package/dist/client/router.d.ts +1 -182
  153. package/dist/client/router.d.ts.map +1 -1
  154. package/dist/client/rsc-fetch.d.ts +47 -26
  155. package/dist/client/rsc-fetch.d.ts.map +1 -1
  156. package/dist/client/segment-cache.d.ts +87 -34
  157. package/dist/client/segment-cache.d.ts.map +1 -1
  158. package/dist/client/ssr-data.d.ts +6 -0
  159. package/dist/client/ssr-data.d.ts.map +1 -1
  160. package/dist/client/stale-client.d.ts +69 -0
  161. package/dist/client/stale-client.d.ts.map +1 -0
  162. package/dist/client/state.d.ts +10 -1
  163. package/dist/client/state.d.ts.map +1 -1
  164. package/dist/client/top-loader.d.ts +2 -1
  165. package/dist/client/top-loader.d.ts.map +1 -1
  166. package/dist/client/unload-guard.d.ts +5 -0
  167. package/dist/client/unload-guard.d.ts.map +1 -1
  168. package/dist/client/use-cookie.d.ts.map +1 -1
  169. package/dist/client/use-query-states.d.ts +9 -3
  170. package/dist/client/use-query-states.d.ts.map +1 -1
  171. package/dist/client/use-router.d.ts +1 -1
  172. package/dist/client/use-segment-params.d.ts +18 -8
  173. package/dist/client/use-segment-params.d.ts.map +1 -1
  174. package/dist/codec.js +1 -1
  175. package/dist/cookies/define-cookie.d.ts.map +1 -1
  176. package/dist/cookies/index.js +5 -5
  177. package/dist/cookies/index.js.map +1 -1
  178. package/dist/index.d.ts +4 -1
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +1009 -759
  181. package/dist/index.js.map +1 -1
  182. package/dist/params/index.js +1 -1
  183. package/dist/plugin-context.d.ts +46 -0
  184. package/dist/plugin-context.d.ts.map +1 -1
  185. package/dist/plugins/adapter-build.d.ts.map +1 -1
  186. package/dist/plugins/build-manifest.d.ts +1 -1
  187. package/dist/plugins/build-manifest.d.ts.map +1 -1
  188. package/dist/plugins/entries.d.ts.map +1 -1
  189. package/dist/plugins/fonts.d.ts.map +1 -1
  190. package/dist/plugins/request-dep/analysis.d.ts +106 -0
  191. package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
  192. package/dist/plugins/request-dep/index.d.ts +75 -0
  193. package/dist/plugins/request-dep/index.d.ts.map +1 -0
  194. package/dist/plugins/request-dep/origin.d.ts +61 -0
  195. package/dist/plugins/request-dep/origin.d.ts.map +1 -0
  196. package/dist/plugins/routing.d.ts.map +1 -1
  197. package/dist/plugins/shims.d.ts.map +1 -1
  198. package/dist/plugins/static-build.d.ts +160 -8
  199. package/dist/plugins/static-build.d.ts.map +1 -1
  200. package/dist/routing/codegen-shared.d.ts +3 -44
  201. package/dist/routing/codegen-shared.d.ts.map +1 -1
  202. package/dist/routing/codegen-types.d.ts +28 -31
  203. package/dist/routing/codegen-types.d.ts.map +1 -1
  204. package/dist/routing/codegen-write.d.ts +51 -0
  205. package/dist/routing/codegen-write.d.ts.map +1 -0
  206. package/dist/routing/codegen.d.ts.map +1 -1
  207. package/dist/routing/collision-probe.d.ts +104 -0
  208. package/dist/routing/collision-probe.d.ts.map +1 -0
  209. package/dist/routing/collision-spaces.d.ts +26 -0
  210. package/dist/routing/collision-spaces.d.ts.map +1 -0
  211. package/dist/routing/convention-lint.d.ts +18 -4
  212. package/dist/routing/convention-lint.d.ts.map +1 -1
  213. package/dist/routing/export-detect.d.ts +16 -0
  214. package/dist/routing/export-detect.d.ts.map +1 -1
  215. package/dist/routing/index.js +4 -3
  216. package/dist/routing/interception.d.ts +235 -6
  217. package/dist/routing/interception.d.ts.map +1 -1
  218. package/dist/routing/link-codegen.d.ts +19 -4
  219. package/dist/routing/link-codegen.d.ts.map +1 -1
  220. package/dist/routing/manifest-codegen.d.ts +1 -7
  221. package/dist/routing/manifest-codegen.d.ts.map +1 -1
  222. package/dist/routing/scanner.d.ts.map +1 -1
  223. package/dist/routing/segment-classify.d.ts +33 -0
  224. package/dist/routing/segment-classify.d.ts.map +1 -1
  225. package/dist/routing/segment-keys.d.ts +95 -0
  226. package/dist/routing/segment-keys.d.ts.map +1 -0
  227. package/dist/routing/slot-placement.d.ts +48 -0
  228. package/dist/routing/slot-placement.d.ts.map +1 -0
  229. package/dist/routing/types.d.ts +0 -6
  230. package/dist/routing/types.d.ts.map +1 -1
  231. package/dist/routing/walkers.d.ts +6 -0
  232. package/dist/routing/walkers.d.ts.map +1 -1
  233. package/dist/schema-bridge.d.ts +60 -9
  234. package/dist/schema-bridge.d.ts.map +1 -1
  235. package/dist/search-params/define.d.ts +62 -14
  236. package/dist/search-params/define.d.ts.map +1 -1
  237. package/dist/search-params/index.d.ts +0 -1
  238. package/dist/search-params/index.d.ts.map +1 -1
  239. package/dist/search-params/index.js +221 -10
  240. package/dist/search-params/index.js.map +1 -1
  241. package/dist/search-params/parse-total.d.ts +70 -0
  242. package/dist/search-params/parse-total.d.ts.map +1 -0
  243. package/dist/search-params/wrappers.d.ts +26 -3
  244. package/dist/search-params/wrappers.d.ts.map +1 -1
  245. package/dist/server/access-gate.d.ts +19 -8
  246. package/dist/server/access-gate.d.ts.map +1 -1
  247. package/dist/server/action-handler.d.ts.map +1 -1
  248. package/dist/server/actions.d.ts +6 -3
  249. package/dist/server/actions.d.ts.map +1 -1
  250. package/dist/server/als-registry.d.ts +18 -1
  251. package/dist/server/als-registry.d.ts.map +1 -1
  252. package/dist/server/build-manifest.d.ts +13 -1
  253. package/dist/server/build-manifest.d.ts.map +1 -1
  254. package/dist/server/chain-url-parts.d.ts +82 -0
  255. package/dist/server/chain-url-parts.d.ts.map +1 -0
  256. package/dist/server/children-interception.d.ts +49 -0
  257. package/dist/server/children-interception.d.ts.map +1 -0
  258. package/dist/server/compress.d.ts.map +1 -1
  259. package/dist/server/default-status-page.d.ts +45 -0
  260. package/dist/server/default-status-page.d.ts.map +1 -0
  261. package/dist/server/deny-boundary.d.ts +148 -15
  262. package/dist/server/deny-boundary.d.ts.map +1 -1
  263. package/dist/server/deny-renderer.d.ts +15 -4
  264. package/dist/server/deny-renderer.d.ts.map +1 -1
  265. package/dist/server/error-boundary-wrapper.d.ts +85 -15
  266. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  267. package/dist/server/head-response.d.ts +35 -0
  268. package/dist/server/head-response.d.ts.map +1 -0
  269. package/dist/server/index.d.ts +0 -1
  270. package/dist/server/index.d.ts.map +1 -1
  271. package/dist/server/index.js +3 -2
  272. package/dist/server/index.js.map +1 -1
  273. package/dist/server/internal.d.ts +3 -1
  274. package/dist/server/internal.d.ts.map +1 -1
  275. package/dist/server/internal.js +712 -418
  276. package/dist/server/internal.js.map +1 -1
  277. package/dist/server/metadata-collector.d.ts +52 -0
  278. package/dist/server/metadata-collector.d.ts.map +1 -0
  279. package/dist/server/param-coercion.d.ts +22 -6
  280. package/dist/server/param-coercion.d.ts.map +1 -1
  281. package/dist/server/pipeline-helpers.d.ts +0 -18
  282. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  283. package/dist/server/pipeline-interception.d.ts +59 -9
  284. package/dist/server/pipeline-interception.d.ts.map +1 -1
  285. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  286. package/dist/server/pipeline-phases.d.ts.map +1 -1
  287. package/dist/server/pipeline.d.ts +11 -0
  288. package/dist/server/pipeline.d.ts.map +1 -1
  289. package/dist/server/primitives.d.ts +23 -0
  290. package/dist/server/primitives.d.ts.map +1 -1
  291. package/dist/server/publish-params.d.ts +33 -0
  292. package/dist/server/publish-params.d.ts.map +1 -0
  293. package/dist/server/request-context.d.ts +48 -0
  294. package/dist/server/request-context.d.ts.map +1 -1
  295. package/dist/server/route-element-builder.d.ts +22 -3
  296. package/dist/server/route-element-builder.d.ts.map +1 -1
  297. package/dist/server/route-handler.d.ts.map +1 -1
  298. package/dist/server/route-matcher.d.ts +13 -0
  299. package/dist/server/route-matcher.d.ts.map +1 -1
  300. package/dist/server/rsc-cache-key-guard.d.ts +78 -0
  301. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
  302. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  303. package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -1
  304. package/dist/server/rsc-entry/error-renderer.d.ts +15 -3
  305. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  306. package/dist/server/rsc-entry/helpers.d.ts +2 -17
  307. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  308. package/dist/server/rsc-entry/index.d.ts +0 -1
  309. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  310. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  311. package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -1
  312. package/dist/server/rsc-entry/rsc-payload.d.ts +1 -2
  313. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  314. package/dist/server/rsc-entry/rsc-stream.d.ts +15 -2
  315. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  316. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  317. package/dist/server/skippable-prefix.d.ts +23 -0
  318. package/dist/server/skippable-prefix.d.ts.map +1 -0
  319. package/dist/server/slot-interception.d.ts +80 -0
  320. package/dist/server/slot-interception.d.ts.map +1 -0
  321. package/dist/server/slot-resolver.d.ts +70 -8
  322. package/dist/server/slot-resolver.d.ts.map +1 -1
  323. package/dist/server/ssr-bridge-types.d.ts +17 -0
  324. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  325. package/dist/server/ssr-entry.d.ts +0 -1
  326. package/dist/server/ssr-entry.d.ts.map +1 -1
  327. package/dist/server/ssr-wrappers.d.ts +24 -13
  328. package/dist/server/ssr-wrappers.d.ts.map +1 -1
  329. package/dist/server/state-tree-diff.d.ts +6 -27
  330. package/dist/server/state-tree-diff.d.ts.map +1 -1
  331. package/dist/server/static-generator.d.ts +6 -0
  332. package/dist/server/static-generator.d.ts.map +1 -1
  333. package/dist/server/static-not-found.d.ts +52 -0
  334. package/dist/server/static-not-found.d.ts.map +1 -0
  335. package/dist/server/status-code-resolver.d.ts +8 -1
  336. package/dist/server/status-code-resolver.d.ts.map +1 -1
  337. package/dist/server/tree-builder.d.ts +28 -36
  338. package/dist/server/tree-builder.d.ts.map +1 -1
  339. package/dist/server/types.d.ts +12 -7
  340. package/dist/server/types.d.ts.map +1 -1
  341. package/dist/server/utils/element-type.d.ts +40 -0
  342. package/dist/server/utils/element-type.d.ts.map +1 -0
  343. package/dist/shared/als-slots.d.ts +41 -0
  344. package/dist/shared/als-slots.d.ts.map +1 -0
  345. package/dist/shared/base-path.d.ts +56 -0
  346. package/dist/shared/base-path.d.ts.map +1 -0
  347. package/dist/shared/param-value.d.ts +80 -0
  348. package/dist/shared/param-value.d.ts.map +1 -0
  349. package/dist/shared/payload-root.d.ts +108 -0
  350. package/dist/shared/payload-root.d.ts.map +1 -0
  351. package/dist/shared/rsc-cache-key.d.ts +163 -0
  352. package/dist/shared/rsc-cache-key.d.ts.map +1 -0
  353. package/dist/shared/rsc-error-envelope.d.ts +25 -0
  354. package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
  355. package/dist/shared/rsc-manifest.d.ts +28 -0
  356. package/dist/shared/rsc-manifest.d.ts.map +1 -0
  357. package/dist/shared/rsc-media-type.d.ts +40 -0
  358. package/dist/shared/rsc-media-type.d.ts.map +1 -0
  359. package/dist/shared/rsc-payload-path.d.ts +42 -0
  360. package/dist/shared/rsc-payload-path.d.ts.map +1 -0
  361. package/dist/shared/segment-info.d.ts +59 -0
  362. package/dist/shared/segment-info.d.ts.map +1 -0
  363. package/dist/shared/slot-params.d.ts +51 -0
  364. package/dist/shared/slot-params.d.ts.map +1 -0
  365. package/dist/shared/static-platform-files.d.ts +71 -0
  366. package/dist/shared/static-platform-files.d.ts.map +1 -0
  367. package/docs/api/30-api-server.mdx +1 -1
  368. package/docs/api/31-api-client.mdx +4 -2
  369. package/docs/api/33-api-search-params.mdx +38 -16
  370. package/docs/api/35-api-typescript.mdx +3 -3
  371. package/docs/api/36-cli.mdx +34 -7
  372. package/docs/learn/00-introduction.mdx +1 -1
  373. package/docs/learn/02-pages-and-layouts.mdx +2 -2
  374. package/docs/learn/05-typed-params.mdx +8 -8
  375. package/docs/learn/07-typed-routes.mdx +12 -7
  376. package/docs/learn/11-error-handling.mdx +18 -0
  377. package/docs/learn/12-client-navigation.mdx +2 -2
  378. package/docs/learn/14-deploying.mdx +23 -0
  379. package/docs/more/01-advanced-routing.mdx +173 -3
  380. package/docs/more/03-coming-from-nextjs.mdx +2 -2
  381. package/docs/more/04-metadata-and-fonts.mdx +1 -1
  382. package/docs/more/50-ai-agent-instructions.mdx +6 -4
  383. package/package.json +9 -6
  384. package/src/adapters/build-output-helper.ts +116 -3
  385. package/src/adapters/cloudflare.ts +90 -12
  386. package/src/adapters/compress-module.ts +79 -1
  387. package/src/adapters/fs-identity.ts +156 -0
  388. package/src/adapters/nitro.ts +6 -6
  389. package/src/adapters/shared.ts +196 -21
  390. package/src/adapters/types.ts +13 -1
  391. package/src/cache/fast-hash.ts +5 -0
  392. package/src/cli-check.ts +458 -0
  393. package/src/cli.ts +59 -24
  394. package/src/client/browser-entry/action-dispatch.ts +11 -5
  395. package/src/client/browser-entry/hydrate.ts +40 -29
  396. package/src/client/browser-entry/index.ts +15 -6
  397. package/src/client/browser-entry/post-hydration.ts +10 -9
  398. package/src/client/browser-entry/router-init.ts +104 -48
  399. package/src/client/browser-entry/rsc-stream.ts +11 -2
  400. package/src/client/error-boundary.tsx +85 -16
  401. package/src/client/history.ts +13 -6
  402. package/src/client/index.ts +14 -3
  403. package/src/client/internal.ts +4 -3
  404. package/src/client/link.tsx +120 -72
  405. package/src/client/navigation-api.ts +3 -3
  406. package/src/client/navigation-commit.ts +197 -0
  407. package/src/client/navigation-context.ts +40 -67
  408. package/src/client/navigation-root.tsx +326 -101
  409. package/src/client/params-context.ts +192 -0
  410. package/src/client/router-effects.ts +231 -0
  411. package/src/client/router-lifecycle.ts +288 -0
  412. package/src/client/router-pipeline.ts +393 -0
  413. package/src/client/router-ref.ts +1 -1
  414. package/src/client/router-skew.ts +30 -0
  415. package/src/client/router-types.ts +230 -0
  416. package/src/client/router.ts +243 -707
  417. package/src/client/rsc-fetch.ts +183 -106
  418. package/src/client/segment-cache.ts +129 -44
  419. package/src/client/ssr-data.ts +6 -0
  420. package/src/client/stale-client.ts +191 -0
  421. package/src/client/state.ts +14 -1
  422. package/src/client/top-loader.tsx +2 -1
  423. package/src/client/unload-guard.ts +34 -2
  424. package/src/client/use-cookie.ts +9 -2
  425. package/src/client/use-query-states.ts +102 -39
  426. package/src/client/use-router.ts +1 -1
  427. package/src/client/use-segment-params.ts +41 -18
  428. package/src/cookies/define-cookie.ts +6 -1
  429. package/src/index.ts +25 -4
  430. package/src/plugin-context.ts +58 -0
  431. package/src/plugins/adapter-build.ts +4 -0
  432. package/src/plugins/build-manifest.ts +34 -13
  433. package/src/plugins/entries.ts +4 -0
  434. package/src/plugins/fonts.ts +11 -8
  435. package/src/plugins/request-dep/analysis.ts +447 -0
  436. package/src/plugins/request-dep/index.ts +376 -0
  437. package/src/plugins/request-dep/origin.ts +310 -0
  438. package/src/plugins/routing.ts +97 -102
  439. package/src/plugins/shims.ts +0 -1
  440. package/src/plugins/static-build.ts +391 -95
  441. package/src/routing/codegen-shared.ts +3 -79
  442. package/src/routing/codegen-types.ts +28 -31
  443. package/src/routing/codegen-write.ts +139 -0
  444. package/src/routing/codegen.ts +86 -172
  445. package/src/routing/collision-probe.ts +438 -0
  446. package/src/routing/collision-spaces.ts +281 -0
  447. package/src/routing/convention-lint.ts +139 -40
  448. package/src/routing/export-detect.ts +151 -7
  449. package/src/routing/interception.ts +896 -50
  450. package/src/routing/link-codegen.ts +32 -65
  451. package/src/routing/manifest-codegen.ts +6 -62
  452. package/src/routing/scanner.ts +117 -92
  453. package/src/routing/segment-classify.ts +57 -0
  454. package/src/routing/segment-keys.ts +146 -0
  455. package/src/routing/slot-placement.ts +97 -0
  456. package/src/routing/types.ts +0 -6
  457. package/src/routing/walkers.ts +8 -0
  458. package/src/schema-bridge.ts +180 -58
  459. package/src/search-params/define.ts +108 -66
  460. package/src/search-params/index.ts +0 -1
  461. package/src/search-params/parse-total.ts +78 -0
  462. package/src/search-params/wrappers.ts +60 -11
  463. package/src/server/access-gate.tsx +60 -40
  464. package/src/server/action-handler.ts +4 -5
  465. package/src/server/actions.ts +6 -3
  466. package/src/server/als-registry.ts +18 -1
  467. package/src/server/build-manifest.ts +14 -1
  468. package/src/server/chain-url-parts.ts +163 -0
  469. package/src/server/children-interception.ts +115 -0
  470. package/src/server/compress.ts +9 -1
  471. package/src/server/default-status-page.ts +127 -0
  472. package/src/server/deny-boundary.ts +269 -41
  473. package/src/server/deny-renderer.ts +111 -39
  474. package/src/server/error-boundary-wrapper.ts +166 -79
  475. package/src/server/head-response.ts +54 -0
  476. package/src/server/index.ts +1 -3
  477. package/src/server/internal.ts +2 -2
  478. package/src/server/metadata-collector.ts +115 -0
  479. package/src/server/param-coercion.ts +51 -69
  480. package/src/server/pipeline-helpers.ts +2 -47
  481. package/src/server/pipeline-interception.ts +81 -32
  482. package/src/server/pipeline-outcome.ts +4 -5
  483. package/src/server/pipeline-phases.ts +77 -25
  484. package/src/server/pipeline.ts +57 -10
  485. package/src/server/prebuilt-runtime.ts +4 -4
  486. package/src/server/primitives.ts +25 -0
  487. package/src/server/publish-params.ts +42 -0
  488. package/src/server/request-context.ts +97 -18
  489. package/src/server/route-element-builder.ts +241 -253
  490. package/src/server/route-handler.ts +8 -8
  491. package/src/server/route-matcher.ts +21 -9
  492. package/src/server/rsc-cache-key-guard.ts +164 -0
  493. package/src/server/rsc-entry/api-handler.ts +6 -8
  494. package/src/server/rsc-entry/deny-fallback.ts +3 -2
  495. package/src/server/rsc-entry/error-renderer.ts +94 -35
  496. package/src/server/rsc-entry/helpers.ts +33 -28
  497. package/src/server/rsc-entry/index.ts +36 -33
  498. package/src/server/rsc-entry/render-route.ts +18 -10
  499. package/src/server/rsc-entry/revalidate-renderer.ts +3 -2
  500. package/src/server/rsc-entry/rsc-payload.ts +113 -40
  501. package/src/server/rsc-entry/rsc-stream.ts +29 -5
  502. package/src/server/rsc-entry/ssr-renderer.ts +38 -22
  503. package/src/server/skippable-prefix.ts +92 -0
  504. package/src/server/slot-interception.ts +168 -0
  505. package/src/server/slot-resolver.ts +263 -158
  506. package/src/server/ssr-bridge-types.ts +18 -0
  507. package/src/server/ssr-entry.ts +20 -10
  508. package/src/server/ssr-wrappers.tsx +33 -32
  509. package/src/server/state-tree-diff.ts +14 -55
  510. package/src/server/static-generator.ts +68 -29
  511. package/src/server/static-not-found.ts +134 -0
  512. package/src/server/status-code-resolver.ts +28 -11
  513. package/src/server/tree-builder.ts +35 -218
  514. package/src/server/types.ts +12 -7
  515. package/src/server/utils/element-type.ts +72 -0
  516. package/src/shared/als-slots.ts +72 -0
  517. package/src/shared/base-path.ts +80 -0
  518. package/src/shared/param-value.ts +244 -0
  519. package/src/shared/payload-root.ts +151 -0
  520. package/src/shared/rsc-cache-key.ts +269 -0
  521. package/src/shared/rsc-error-envelope.ts +31 -0
  522. package/src/shared/rsc-manifest.ts +29 -0
  523. package/src/shared/rsc-media-type.ts +43 -0
  524. package/src/shared/rsc-payload-path.ts +45 -0
  525. package/src/shared/segment-info.ts +60 -0
  526. package/src/shared/slot-params.ts +111 -0
  527. package/src/shared/static-platform-files.ts +75 -0
  528. package/dist/_chunks/build-output-helper-DOGYFb_X.js +0 -196
  529. package/dist/_chunks/build-output-helper-DOGYFb_X.js.map +0 -1
  530. package/dist/_chunks/cache-api-B-lhk9p4.js.map +0 -1
  531. package/dist/_chunks/canonicalize-DQHyFClh.js.map +0 -1
  532. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js +0 -668
  533. package/dist/_chunks/cli-schema-sync-BTWEKJXo.js.map +0 -1
  534. package/dist/_chunks/define-COtkxMRT.js +0 -191
  535. package/dist/_chunks/define-COtkxMRT.js.map +0 -1
  536. package/dist/_chunks/define-c4au4I9R.js +0 -82
  537. package/dist/_chunks/define-c4au4I9R.js.map +0 -1
  538. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +0 -1
  539. package/dist/_chunks/logger-AWfuX-KJ.js.map +0 -1
  540. package/dist/_chunks/navigation-root-bUDZLw74.js +0 -124
  541. package/dist/_chunks/navigation-root-bUDZLw74.js.map +0 -1
  542. package/dist/_chunks/plugin-context---kTF5v8.js.map +0 -1
  543. package/dist/_chunks/registry-DbJPKoBp.js +0 -20
  544. package/dist/_chunks/registry-DbJPKoBp.js.map +0 -1
  545. package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
  546. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +0 -119
  547. package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +0 -1
  548. package/dist/_chunks/segment-classify-Byy425ng.js.map +0 -1
  549. package/dist/_chunks/segment-context-ZDnXDkbz.js +0 -34
  550. package/dist/_chunks/segment-context-ZDnXDkbz.js.map +0 -1
  551. package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
  552. package/dist/_chunks/use-query-states-DFvWd-EA.js.map +0 -1
  553. package/dist/_chunks/use-segment-params-D1CzlgBo.js +0 -151
  554. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +0 -1
  555. package/dist/_chunks/walkers-_6zKFlch.js +0 -1002
  556. package/dist/_chunks/walkers-_6zKFlch.js.map +0 -1
  557. package/dist/client/error-boundary.js.map +0 -1
  558. package/dist/plugins/request-dep.d.ts +0 -32
  559. package/dist/plugins/request-dep.d.ts.map +0 -1
  560. package/dist/search-params/registry.d.ts +0 -20
  561. package/dist/search-params/registry.d.ts.map +0 -1
  562. package/dist/segment-params/define.d.ts +0 -89
  563. package/dist/segment-params/define.d.ts.map +0 -1
  564. package/dist/segment-params/index.d.ts +0 -3
  565. package/dist/segment-params/index.d.ts.map +0 -1
  566. package/dist/segment-params/index.js +0 -2
  567. package/src/plugins/request-dep.ts +0 -499
  568. package/src/search-params/registry.ts +0 -31
  569. package/src/segment-params/define.ts +0 -249
  570. package/src/segment-params/index.ts +0 -9
@@ -1,499 +0,0 @@
1
- /**
2
- * timber-request-dep — Static module-graph analysis for request-dependency.
3
- *
4
- * Replaces runtime ALS-based taint tracking with a build/dev-time computed
5
- * map: segment entry file → statically request-dependent?
6
- *
7
- * A segment/slot is request-dependent iff any module reachable from its
8
- * layout/page/default in the RSC module graph (stopping at client-reference
9
- * boundaries) imports and calls a request accessor (getHeaders, cookies,
10
- * getSearchParams, etc.) or calls .get() on a search-params/cookie
11
- * definition object.
12
- *
13
- * This is deterministic, covers children/barrels/node_modules/Suspense-
14
- * deferred code, and is computed before any byte is flushed.
15
- *
16
- * See design/19-client-navigation.md §"X-Timber-State-Tree Header"
17
- */
18
-
19
- import type { Plugin } from 'vite';
20
- import type { PluginContext } from '../plugin-context.js';
21
- import {
22
- findImportBindings,
23
- type ProgramNode,
24
- type CallExpressionNode,
25
- type MemberExpressionNode,
26
- type IdentifierNode,
27
- } from './callsite-ast.js';
28
-
29
- // ─── Module specifiers whose bindings are request accessors ──────────────
30
-
31
- const ACCESSOR_SOURCES = new Set(['@timber-js/app/server', 'next/headers', 'next/headers.js']);
32
-
33
- const ACCESSOR_NAMES = new Set([
34
- 'getHeaders',
35
- 'getHeader',
36
- 'getSearchParams',
37
- 'getCookieJar',
38
- 'getCookie',
39
- // next/headers shim names
40
- 'headers',
41
- 'cookies',
42
- ]);
43
-
44
- const DEFINITION_FACTORY_SOURCES = new Set([
45
- '@timber-js/app/search-params',
46
- '@timber-js/app/cookies',
47
- ]);
48
-
49
- const DEFINITION_FACTORY_NAMES = new Set(['defineSearchParams', 'defineCookie']);
50
-
51
- // ─── Framework module detection ─────────────────────────────────────────
52
-
53
- export function isFrameworkModule(id: string): boolean {
54
- return (
55
- /[\\/]node_modules[\\/]@timber-js[\\/]app[\\/]/.test(id) ||
56
- /[\\/]packages[\\/]timber-app[\\/]src[\\/]/.test(id)
57
- );
58
- }
59
-
60
- // ─── Fast token pre-filter ───────────────────────────────────────────────
61
-
62
- const ACCESSOR_TOKENS = [
63
- 'getHeaders',
64
- 'getHeader',
65
- 'getSearchParams',
66
- 'getCookieJar',
67
- 'getCookie',
68
- 'headers',
69
- 'cookies',
70
- 'defineSearchParams',
71
- 'defineCookie',
72
- // .get() on imported/local definition bindings (searchParams.get())
73
- '.get(',
74
- ];
75
-
76
- function hasRelevantToken(code: string): boolean {
77
- for (const token of ACCESSOR_TOKENS) {
78
- if (code.includes(token)) return true;
79
- }
80
- return false;
81
- }
82
-
83
- // ─── Per-module facts ────────────────────────────────────────────────────
84
-
85
- export interface ModuleFacts {
86
- /** Module directly calls a request accessor. */
87
- callsAccessor: boolean;
88
- /** Module imports a definition factory (defineSearchParams/defineCookie). */
89
- importsDefinitionFactory: boolean;
90
- /** Import specifiers where `.get()` was called on the binding. */
91
- getterCallSources: string[];
92
- }
93
-
94
- // ─── AST analysis ────────────────────────────────────────────────────────
95
-
96
- export function analyzeModule(code: string, program: ProgramNode): ModuleFacts {
97
- const facts: ModuleFacts = {
98
- callsAccessor: false,
99
- importsDefinitionFactory: false,
100
- getterCallSources: [],
101
- };
102
-
103
- // Check for accessor imports
104
- for (const name of ACCESSOR_NAMES) {
105
- const bindings = findImportBindings(program, ACCESSOR_SOURCES, name);
106
- if (bindings.named.size > 0 || bindings.namespaces.size > 0) {
107
- // Check if any binding is actually called (not just imported)
108
- if (hasCallSite(program, bindings.named, bindings.namespaces, name)) {
109
- facts.callsAccessor = true;
110
- }
111
- }
112
- }
113
-
114
- // Check for definition factory imports
115
- for (const name of DEFINITION_FACTORY_NAMES) {
116
- const bindings = findImportBindings(program, DEFINITION_FACTORY_SOURCES, name);
117
- if (bindings.named.size > 0 || bindings.namespaces.size > 0) {
118
- facts.importsDefinitionFactory = true;
119
- }
120
- }
121
-
122
- // Check for .get() calls on imported bindings (searchParams.get(), etc.)
123
- // Collect which import sources have .get() called on their bindings.
124
- for (const stmt of program.body) {
125
- if (stmt.type !== 'ImportDeclaration') continue;
126
- const decl = stmt as unknown as {
127
- source: { value: string };
128
- specifiers: Array<{ type: string; local: IdentifierNode; imported?: IdentifierNode }>;
129
- };
130
- for (const spec of decl.specifiers) {
131
- if (spec.type === 'ImportDefaultSpecifier' || spec.type === 'ImportSpecifier') {
132
- const localName = spec.local.name;
133
- if (hasGetterCall(program, localName)) {
134
- facts.getterCallSources.push(decl.source.value);
135
- }
136
- }
137
- }
138
- }
139
-
140
- // Check for co-located definitions: const sp = defineSearchParams(...); sp.get()
141
- // If a module both mints a definition AND calls .get() on any local binding
142
- // whose init is a defineSearchParams/defineCookie call, it's a taint source.
143
- if (facts.importsDefinitionFactory) {
144
- for (const stmt of program.body) {
145
- if (stmt.type !== 'VariableDeclaration') continue;
146
- for (const decl of ((stmt as Record<string, unknown>).declarations as Array<
147
- Record<string, unknown>
148
- >) ?? []) {
149
- if (!decl.init || !decl.id) continue;
150
- const init = decl.init as Record<string, unknown>;
151
- // Check if init is a call to a definition factory
152
- if (init.type === 'CallExpression') {
153
- const callee = init.callee as Record<string, unknown>;
154
- if (callee.type === 'Identifier') {
155
- const calleeName = (callee as unknown as IdentifierNode).name;
156
- // Check if this name is a definition factory binding
157
- for (const factoryName of DEFINITION_FACTORY_NAMES) {
158
- const bindings = findImportBindings(program, DEFINITION_FACTORY_SOURCES, factoryName);
159
- if (bindings.named.has(calleeName)) {
160
- // This local variable is a definition instance
161
- const localName =
162
- (decl.id as Record<string, unknown>).type === 'Identifier'
163
- ? (decl.id as unknown as IdentifierNode).name
164
- : null;
165
- if (localName && hasGetterCall(program, localName)) {
166
- facts.callsAccessor = true;
167
- }
168
- }
169
- }
170
- }
171
- }
172
- }
173
- }
174
- }
175
-
176
- return facts;
177
- }
178
-
179
- /** Check if any named/namespace binding is called as a function. */
180
- function hasCallSite(
181
- program: ProgramNode,
182
- named: Set<string>,
183
- namespaces: Set<string>,
184
- importedName: string
185
- ): boolean {
186
- return walkForCall(program, named, namespaces, importedName);
187
- }
188
-
189
- function walkForCall(
190
- node: Record<string, unknown>,
191
- named: Set<string>,
192
- namespaces: Set<string>,
193
- importedName: string
194
- ): boolean {
195
- if (node.type === 'CallExpression') {
196
- const call = node as unknown as CallExpressionNode;
197
- const callee = call.callee;
198
- // Direct call: getHeaders()
199
- if (callee.type === 'Identifier' && named.has((callee as IdentifierNode).name)) {
200
- return true;
201
- }
202
- // Namespace call: ns.getHeaders()
203
- if (callee.type === 'MemberExpression') {
204
- const member = callee as MemberExpressionNode;
205
- if (
206
- !member.computed &&
207
- member.object.type === 'Identifier' &&
208
- namespaces.has((member.object as IdentifierNode).name) &&
209
- member.property.type === 'Identifier' &&
210
- (member.property as IdentifierNode).name === importedName
211
- ) {
212
- return true;
213
- }
214
- }
215
- }
216
- for (const key of Object.keys(node)) {
217
- if (key === 'type' || key === 'start' || key === 'end') continue;
218
- const val = node[key];
219
- if (val && typeof val === 'object') {
220
- if (Array.isArray(val)) {
221
- for (const item of val) {
222
- if (item && typeof item === 'object' && typeof item.type === 'string') {
223
- if (walkForCall(item as Record<string, unknown>, named, namespaces, importedName))
224
- return true;
225
- }
226
- }
227
- } else if (typeof (val as Record<string, unknown>).type === 'string') {
228
- if (walkForCall(val as Record<string, unknown>, named, namespaces, importedName))
229
- return true;
230
- }
231
- }
232
- }
233
- return false;
234
- }
235
-
236
- /**
237
- * Check if the object chain of a `.get()` call contains `localName`.
238
- * Walks through MemberExpression objects and CallExpression callees
239
- * to handle chained patterns like `getFilterCookie(key).get()` or
240
- * `cookies.theme.get()`.
241
- */
242
- function objectChainContains(node: Record<string, unknown>, name: string): boolean {
243
- if (node.type === 'Identifier' && (node as unknown as IdentifierNode).name === name) return true;
244
- if (node.type === 'MemberExpression') {
245
- return objectChainContains(
246
- (node as unknown as MemberExpressionNode).object as Record<string, unknown>,
247
- name
248
- );
249
- }
250
- if (node.type === 'CallExpression') {
251
- return objectChainContains(
252
- (node as unknown as CallExpressionNode).callee as Record<string, unknown>,
253
- name
254
- );
255
- }
256
- return false;
257
- }
258
-
259
- /**
260
- * Check if `.get(...)` is called on `localName` anywhere in the module.
261
- * Handles direct (`localName.get()`), chained call (`localName(args).get()`),
262
- * and nested member (`localName.prop.get()`) patterns.
263
- */
264
- function hasGetterCall(node: Record<string, unknown>, localName: string): boolean {
265
- if (node.type === 'CallExpression') {
266
- const call = node as unknown as CallExpressionNode;
267
- if (call.callee.type === 'MemberExpression') {
268
- const member = call.callee as MemberExpressionNode;
269
- if (
270
- !member.computed &&
271
- member.property.type === 'Identifier' &&
272
- (member.property as IdentifierNode).name === 'get' &&
273
- objectChainContains(member.object as Record<string, unknown>, localName)
274
- ) {
275
- return true;
276
- }
277
- }
278
- }
279
- for (const key of Object.keys(node)) {
280
- if (key === 'type' || key === 'start' || key === 'end') continue;
281
- const val = node[key];
282
- if (val && typeof val === 'object') {
283
- if (Array.isArray(val)) {
284
- for (const item of val) {
285
- if (item && typeof item === 'object' && typeof item.type === 'string') {
286
- if (hasGetterCall(item as Record<string, unknown>, localName)) return true;
287
- }
288
- }
289
- } else if (typeof (val as Record<string, unknown>).type === 'string') {
290
- if (hasGetterCall(val as Record<string, unknown>, localName)) return true;
291
- }
292
- }
293
- }
294
- return false;
295
- }
296
-
297
- // ─── Module graph reachability ───────────────────────────────────────────
298
-
299
- /** Walk the module graph from an entry, returning true if any taint source is reachable. */
300
- function isReachableTaintSource(
301
- entryId: string,
302
- factsMap: Map<string, ModuleFacts>,
303
- definitionModules: Set<string>,
304
- getImports: (id: string) => string[]
305
- ): boolean {
306
- const visited = new Set<string>();
307
- const stack = [entryId];
308
-
309
- while (stack.length > 0) {
310
- const id = stack.pop()!;
311
- if (visited.has(id)) continue;
312
- visited.add(id);
313
-
314
- const facts = factsMap.get(id);
315
- if (facts) {
316
- if (facts.callsAccessor) return true;
317
- // Check if any .get() call is on a definition module
318
- for (const source of facts.getterCallSources) {
319
- // Resolve relative to the module — for now just check if the
320
- // resolved ID is a definition module.
321
- // In dev, the getter source is unresolved; we check if any
322
- // imported module is a definition module by looking at actual imports.
323
- }
324
- }
325
-
326
- // Check if this module IS a definition module and has .get() callers
327
- // (handled by the importer's facts)
328
-
329
- const imports = getImports(id);
330
- for (const imp of imports) {
331
- // Stop at client boundaries — 'use client' modules in the RSC graph
332
- // resolve to generated proxy stubs with no further imports.
333
- // Also stop at virtual modules (they're framework internals).
334
- if (!imp.startsWith('\0') && !visited.has(imp)) {
335
- stack.push(imp);
336
- }
337
- }
338
- }
339
-
340
- // Second pass: check getter calls against definition modules
341
- for (const id of visited) {
342
- const facts = factsMap.get(id);
343
- if (!facts) continue;
344
- if (facts.getterCallSources.length === 0) continue;
345
- // Check if any import of this module is a definition module
346
- const imports = getImports(id);
347
- for (const imp of imports) {
348
- if (definitionModules.has(imp)) {
349
- // This module imports a definition module and calls .get() on some binding.
350
- // Conservative: treat it as a taint source.
351
- return true;
352
- }
353
- }
354
- }
355
-
356
- return false;
357
- }
358
-
359
- // ─── Plugin ──────────────────────────────────────────────────────────────
360
-
361
- const BRIDGE_KEY = Symbol.for('timber:request-dep');
362
-
363
- export function timberRequestDep(ctx: PluginContext): Plugin {
364
- const factsMap = new Map<string, ModuleFacts>();
365
- const definitionModules = new Set<string>();
366
- const cache = new Map<string, boolean>();
367
-
368
- return {
369
- name: 'timber-request-dep',
370
- // Only run in RSC environment — that's where server components render.
371
- applyToEnvironment(env) {
372
- return env.name === 'rsc';
373
- },
374
-
375
- async transform(code, id) {
376
- // Skip non-JS (include .mdx/.md — compiled to JS by timber-mdx before this runs)
377
- if (!/\.[mc]?[jt]sx?$/.test(id) && !/\.mdx?$/.test(id)) return;
378
- // Skip virtual modules
379
- if (id.startsWith('\0') || id.startsWith('virtual:')) return;
380
- // Skip framework modules — their internal accessor calls (e.g.,
381
- // getCookieJar in define-cookie.ts) are implementation details.
382
- // In dev they're externalized and never reach transform; in prod
383
- // they would cause false positives (any module importing defineCookie
384
- // would be tainted). Analysis relies on user-code .get() patterns.
385
- if (isFrameworkModule(id)) return;
386
- // Fast token check
387
- if (!hasRelevantToken(code)) return;
388
-
389
- const program = (this as unknown as { parse(code: string): ProgramNode }).parse(code);
390
- const facts = analyzeModule(code, program);
391
-
392
- if (
393
- facts.callsAccessor ||
394
- facts.importsDefinitionFactory ||
395
- facts.getterCallSources.length > 0
396
- ) {
397
- factsMap.set(id, facts);
398
- if (facts.importsDefinitionFactory) {
399
- definitionModules.add(id);
400
- }
401
- }
402
-
403
- // No code transform needed — this is analysis only.
404
- return undefined;
405
- },
406
-
407
- configureServer(server) {
408
- // Register the bridge so runtime can query request-dep status.
409
- const resolver = (filePath: string): boolean => {
410
- if (cache.has(filePath)) return cache.get(filePath)!;
411
-
412
- const rscEnv = server.environments?.rsc;
413
- if (!rscEnv?.moduleGraph) {
414
- return true; // Unknown → conservative
415
- }
416
-
417
- const getImports = (moduleId: string): string[] => {
418
- const mod = rscEnv.moduleGraph.getModuleById(moduleId);
419
- if (!mod) return [];
420
- const result: string[] = [];
421
- for (const imp of mod.importedModules) {
422
- if (imp.id) result.push(imp.id);
423
- }
424
- return result;
425
- };
426
-
427
- const result = isReachableTaintSource(filePath, factsMap, definitionModules, getImports);
428
- cache.set(filePath, result);
429
- return result;
430
- };
431
-
432
- (globalThis as Record<symbol, unknown>)[BRIDGE_KEY] = resolver;
433
-
434
- // Clear cache on file changes
435
- const clearCache = () => cache.clear();
436
- server.watcher.on('change', clearCache);
437
- server.watcher.on('add', clearCache);
438
- server.watcher.on('unlink', clearCache);
439
- },
440
-
441
- buildEnd() {
442
- // Prod: compute the full map and register on globalThis for the
443
- // build manifest plugin to pick up.
444
- if (ctx.dev) return;
445
-
446
- const getModuleInfo = (
447
- this as unknown as {
448
- getModuleInfo: (
449
- id: string
450
- ) => { importedIds?: string[]; dynamicallyImportedIds?: string[] } | null;
451
- }
452
- ).getModuleInfo;
453
-
454
- const getImports = (moduleId: string): string[] => {
455
- const info = getModuleInfo(moduleId);
456
- if (!info) return [];
457
- return [...(info.importedIds ?? []), ...(info.dynamicallyImportedIds ?? [])];
458
- };
459
-
460
- const requestDepMap: Record<string, boolean> = {};
461
-
462
- // Walk the route tree to find all segment entry files
463
- if (ctx.routeTree) {
464
- walkSegmentTree(ctx.routeTree.root as unknown as WalkableNode, (filePath: string) => {
465
- const result = isReachableTaintSource(filePath, factsMap, definitionModules, getImports);
466
- requestDepMap[filePath] = result;
467
- });
468
- }
469
-
470
- // Store on ctx for build-manifest plugin to serialize into the manifest.
471
- // Prod runtime reads from __TIMBER_BUILD_MANIFEST__.requestDep.
472
- (ctx as unknown as Record<string, unknown>).requestDepMap = requestDepMap;
473
- },
474
- };
475
- }
476
-
477
- interface WalkableNode {
478
- layout?: { filePath: string };
479
- page?: { filePath: string };
480
- default?: { filePath: string };
481
- children?: unknown[];
482
- slots?: Record<string, unknown>;
483
- }
484
-
485
- function walkSegmentTree(node: WalkableNode, fn: (filePath: string) => void): void {
486
- if (node.layout) fn(node.layout.filePath);
487
- if (node.page) fn(node.page.filePath);
488
- if (node.default) fn((node.default as { filePath: string }).filePath);
489
- if (node.children) {
490
- for (const child of node.children) {
491
- walkSegmentTree(child as typeof node, fn);
492
- }
493
- }
494
- if (node.slots) {
495
- for (const slot of Object.values(node.slots)) {
496
- walkSegmentTree(slot as typeof node, fn);
497
- }
498
- }
499
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * Runtime registry for route-scoped search params definitions.
3
- *
4
- * When a route's modules load, the framework registers its search-params
5
- * definition here. useQueryStates('/route') resolves codecs from this map.
6
- *
7
- * Design doc: design/23-search-params.md §"Runtime: Registration at Route Load"
8
- */
9
-
10
- import type { SearchParamsDefinition } from './define.js';
11
-
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- const registry = new Map<string, SearchParamsDefinition<any>>();
14
-
15
- /**
16
- * Register a route's search params definition.
17
- * Called by the generated route manifest loader when a route's modules load.
18
- */
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
- export function registerSearchParams(route: string, definition: SearchParamsDefinition<any>): void {
21
- registry.set(route, definition);
22
- }
23
-
24
- /**
25
- * Look up a route's search params definition.
26
- * Returns undefined if the route hasn't been loaded yet.
27
- */
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- export function getSearchParamsDefinition(route: string): SearchParamsDefinition<any> | undefined {
30
- return registry.get(route);
31
- }