@timber-js/app 0.2.0-alpha.184 → 0.2.0-alpha.186

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 (441) hide show
  1. package/dist/_chunks/{actions-O_LsyCE4.js → actions-C-Rw9vPc.js} +3 -3
  2. package/dist/_chunks/{actions-O_LsyCE4.js.map → actions-C-Rw9vPc.js.map} +1 -1
  3. package/dist/_chunks/als-slots-mFweg276.js +27 -0
  4. package/dist/_chunks/als-slots-mFweg276.js.map +1 -0
  5. package/dist/_chunks/base-path-DaQrzbez.js +80 -0
  6. package/dist/_chunks/base-path-DaQrzbez.js.map +1 -0
  7. package/dist/_chunks/build-manifest-DWppEdLB.js +86 -0
  8. package/dist/_chunks/build-manifest-DWppEdLB.js.map +1 -0
  9. package/dist/_chunks/build-output-helper-C3DrfzZR.js +369 -0
  10. package/dist/_chunks/build-output-helper-C3DrfzZR.js.map +1 -0
  11. package/dist/_chunks/{cache-api-B-lhk9p4.js → cache-api-Cd0VZ_Pd.js} +3 -3
  12. package/dist/_chunks/{cache-api-B-lhk9p4.js.map → cache-api-Cd0VZ_Pd.js.map} +1 -1
  13. package/dist/_chunks/cli-schema-sync-CKgHC2MB.js +1857 -0
  14. package/dist/_chunks/cli-schema-sync-CKgHC2MB.js.map +1 -0
  15. package/dist/_chunks/{cloudflare-CnT5Lr7U.js → cloudflare-Cs0uZXea.js} +89 -12
  16. package/dist/_chunks/{cloudflare-CnT5Lr7U.js.map → cloudflare-Cs0uZXea.js.map} +1 -1
  17. package/dist/_chunks/error-boundary-DpYRI_I1.js +330 -0
  18. package/dist/_chunks/error-boundary-DpYRI_I1.js.map +1 -0
  19. package/dist/_chunks/{fast-hash-D6hIVt1Y.js → fast-hash-C-tVYrLb.js} +6 -1
  20. package/dist/_chunks/fast-hash-C-tVYrLb.js.map +1 -0
  21. package/dist/_chunks/fs-identity-D7vb6GdI.js +208 -0
  22. package/dist/_chunks/fs-identity-D7vb6GdI.js.map +1 -0
  23. package/dist/_chunks/{logger-AWfuX-KJ.js → logger-N7e5auP0.js} +9 -13
  24. package/dist/_chunks/logger-N7e5auP0.js.map +1 -0
  25. package/dist/_chunks/navigation-root-B29qg0_T.js +274 -0
  26. package/dist/_chunks/navigation-root-B29qg0_T.js.map +1 -0
  27. package/dist/_chunks/param-value-C8TNYchQ.js +66 -0
  28. package/dist/_chunks/param-value-C8TNYchQ.js.map +1 -0
  29. package/dist/_chunks/{plugin-context---kTF5v8.js → plugin-context-DEGLSJs3.js} +2 -1
  30. package/dist/_chunks/plugin-context-DEGLSJs3.js.map +1 -0
  31. package/dist/_chunks/{router-ref-CtmF-aPv.js → router-ref-DuYuV_0Q.js} +2 -2
  32. package/dist/_chunks/router-ref-DuYuV_0Q.js.map +1 -0
  33. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js +243 -0
  34. package/dist/_chunks/rsc-cache-key-DD0fl_-s.js.map +1 -0
  35. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js +40 -0
  36. package/dist/_chunks/rsc-error-envelope-tT5PJs4q.js.map +1 -0
  37. package/dist/_chunks/rsc-payload-path-B_LBodc2.js +48 -0
  38. package/dist/_chunks/rsc-payload-path-B_LBodc2.js.map +1 -0
  39. package/dist/_chunks/{segment-classify-Byy425ng.js → segment-classify-C539Pa2O.js} +23 -2
  40. package/dist/_chunks/segment-classify-C539Pa2O.js.map +1 -0
  41. package/dist/_chunks/{canonicalize-DQHyFClh.js → segment-keys-BawYuNFO.js} +61 -2
  42. package/dist/_chunks/segment-keys-BawYuNFO.js.map +1 -0
  43. package/dist/_chunks/slot-params-BCTmZkQB.js +76 -0
  44. package/dist/_chunks/slot-params-BCTmZkQB.js.map +1 -0
  45. package/dist/_chunks/{ssr-data-BOWsq18U.js → ssr-data-14MXm7Pj.js} +17 -2
  46. package/dist/_chunks/ssr-data-14MXm7Pj.js.map +1 -0
  47. package/dist/_chunks/use-segment-params-ClyUNq4d.js +128 -0
  48. package/dist/_chunks/use-segment-params-ClyUNq4d.js.map +1 -0
  49. package/dist/_chunks/{walkers-BtTlKviE.js → walkers-BhhwI9TD.js} +21 -87
  50. package/dist/_chunks/walkers-BhhwI9TD.js.map +1 -0
  51. package/dist/adapters/build-output-helper.d.ts +37 -0
  52. package/dist/adapters/build-output-helper.d.ts.map +1 -1
  53. package/dist/adapters/cloudflare-dev.js +1 -1
  54. package/dist/adapters/cloudflare-kv-cache.js +1 -1
  55. package/dist/adapters/cloudflare.d.ts.map +1 -1
  56. package/dist/adapters/cloudflare.js +1 -1
  57. package/dist/adapters/fs-identity.d.ts +64 -0
  58. package/dist/adapters/fs-identity.d.ts.map +1 -0
  59. package/dist/adapters/nitro.d.ts.map +1 -1
  60. package/dist/adapters/nitro.js +2 -3
  61. package/dist/adapters/nitro.js.map +1 -1
  62. package/dist/adapters/shared.d.ts +57 -1
  63. package/dist/adapters/shared.d.ts.map +1 -1
  64. package/dist/adapters/types.d.ts +13 -1
  65. package/dist/adapters/types.d.ts.map +1 -1
  66. package/dist/cache/fast-hash.d.ts +5 -0
  67. package/dist/cache/fast-hash.d.ts.map +1 -1
  68. package/dist/cache/index.js +1 -1
  69. package/dist/cli.js +2 -2
  70. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
  71. package/dist/client/browser-entry/hydrate.d.ts +20 -9
  72. package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
  73. package/dist/client/browser-entry/post-hydration.d.ts +4 -1
  74. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -1
  75. package/dist/client/browser-entry/router-init.d.ts +3 -0
  76. package/dist/client/browser-entry/router-init.d.ts.map +1 -1
  77. package/dist/client/browser-entry/rsc-stream.d.ts +8 -0
  78. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -1
  79. package/dist/client/error-boundary.d.ts +1 -0
  80. package/dist/client/error-boundary.d.ts.map +1 -1
  81. package/dist/client/error-boundary.js +1 -162
  82. package/dist/client/history.d.ts +13 -6
  83. package/dist/client/history.d.ts.map +1 -1
  84. package/dist/client/index.js +18 -11
  85. package/dist/client/index.js.map +1 -1
  86. package/dist/client/internal.d.ts +4 -3
  87. package/dist/client/internal.d.ts.map +1 -1
  88. package/dist/client/internal.js +872 -305
  89. package/dist/client/internal.js.map +1 -1
  90. package/dist/client/link.d.ts.map +1 -1
  91. package/dist/client/navigation-api.d.ts +2 -2
  92. package/dist/client/navigation-commit.d.ts +71 -0
  93. package/dist/client/navigation-commit.d.ts.map +1 -0
  94. package/dist/client/navigation-context.d.ts +37 -20
  95. package/dist/client/navigation-context.d.ts.map +1 -1
  96. package/dist/client/navigation-root.d.ts +63 -23
  97. package/dist/client/navigation-root.d.ts.map +1 -1
  98. package/dist/client/params-context.d.ts +81 -0
  99. package/dist/client/params-context.d.ts.map +1 -0
  100. package/dist/client/router-effects.d.ts +129 -0
  101. package/dist/client/router-effects.d.ts.map +1 -0
  102. package/dist/client/router-lifecycle.d.ts +55 -0
  103. package/dist/client/router-lifecycle.d.ts.map +1 -0
  104. package/dist/client/router-pipeline.d.ts +84 -0
  105. package/dist/client/router-pipeline.d.ts.map +1 -0
  106. package/dist/client/router-ref.d.ts +1 -1
  107. package/dist/client/router-ref.d.ts.map +1 -1
  108. package/dist/client/router-skew.d.ts +21 -0
  109. package/dist/client/router-skew.d.ts.map +1 -0
  110. package/dist/client/router-types.d.ts +207 -0
  111. package/dist/client/router-types.d.ts.map +1 -0
  112. package/dist/client/router.d.ts +1 -182
  113. package/dist/client/router.d.ts.map +1 -1
  114. package/dist/client/rsc-fetch.d.ts +39 -16
  115. package/dist/client/rsc-fetch.d.ts.map +1 -1
  116. package/dist/client/segment-cache.d.ts +79 -34
  117. package/dist/client/segment-cache.d.ts.map +1 -1
  118. package/dist/client/ssr-data.d.ts +6 -0
  119. package/dist/client/ssr-data.d.ts.map +1 -1
  120. package/dist/client/stale-client.d.ts +69 -0
  121. package/dist/client/stale-client.d.ts.map +1 -0
  122. package/dist/client/state.d.ts +10 -1
  123. package/dist/client/state.d.ts.map +1 -1
  124. package/dist/client/top-loader.d.ts +2 -1
  125. package/dist/client/top-loader.d.ts.map +1 -1
  126. package/dist/client/unload-guard.d.ts +5 -0
  127. package/dist/client/unload-guard.d.ts.map +1 -1
  128. package/dist/client/use-cookie.d.ts.map +1 -1
  129. package/dist/client/use-router.d.ts +1 -1
  130. package/dist/client/use-segment-params.d.ts +18 -8
  131. package/dist/client/use-segment-params.d.ts.map +1 -1
  132. package/dist/cookies/index.js +3 -3
  133. package/dist/cookies/index.js.map +1 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +915 -320
  136. package/dist/index.js.map +1 -1
  137. package/dist/plugin-context.d.ts +33 -1
  138. package/dist/plugin-context.d.ts.map +1 -1
  139. package/dist/plugins/adapter-build.d.ts.map +1 -1
  140. package/dist/plugins/build-manifest.d.ts +1 -1
  141. package/dist/plugins/build-manifest.d.ts.map +1 -1
  142. package/dist/plugins/entries.d.ts.map +1 -1
  143. package/dist/plugins/fonts.d.ts.map +1 -1
  144. package/dist/plugins/request-dep/analysis.d.ts +106 -0
  145. package/dist/plugins/request-dep/analysis.d.ts.map +1 -0
  146. package/dist/plugins/request-dep/index.d.ts +75 -0
  147. package/dist/plugins/request-dep/index.d.ts.map +1 -0
  148. package/dist/plugins/request-dep/origin.d.ts +61 -0
  149. package/dist/plugins/request-dep/origin.d.ts.map +1 -0
  150. package/dist/plugins/routing.d.ts +9 -0
  151. package/dist/plugins/routing.d.ts.map +1 -1
  152. package/dist/plugins/static-build.d.ts +149 -8
  153. package/dist/plugins/static-build.d.ts.map +1 -1
  154. package/dist/routing/codegen-types.d.ts +18 -0
  155. package/dist/routing/codegen-types.d.ts.map +1 -1
  156. package/dist/routing/codegen.d.ts.map +1 -1
  157. package/dist/routing/collision-probe.d.ts +104 -0
  158. package/dist/routing/collision-probe.d.ts.map +1 -0
  159. package/dist/routing/collision-spaces.d.ts +26 -0
  160. package/dist/routing/collision-spaces.d.ts.map +1 -0
  161. package/dist/routing/index.js +3 -3
  162. package/dist/routing/interception.d.ts +235 -6
  163. package/dist/routing/interception.d.ts.map +1 -1
  164. package/dist/routing/manifest-codegen.d.ts.map +1 -1
  165. package/dist/routing/scanner.d.ts.map +1 -1
  166. package/dist/routing/segment-classify.d.ts +33 -0
  167. package/dist/routing/segment-classify.d.ts.map +1 -1
  168. package/dist/routing/segment-keys.d.ts +95 -0
  169. package/dist/routing/segment-keys.d.ts.map +1 -0
  170. package/dist/routing/slot-placement.d.ts +48 -0
  171. package/dist/routing/slot-placement.d.ts.map +1 -0
  172. package/dist/routing/types.d.ts +1 -3
  173. package/dist/routing/types.d.ts.map +1 -1
  174. package/dist/routing/walkers.d.ts +6 -0
  175. package/dist/routing/walkers.d.ts.map +1 -1
  176. package/dist/search-params/define.d.ts +0 -6
  177. package/dist/search-params/define.d.ts.map +1 -1
  178. package/dist/search-params/index.js +176 -2
  179. package/dist/search-params/index.js.map +1 -1
  180. package/dist/segment-params/define.d.ts +0 -6
  181. package/dist/segment-params/define.d.ts.map +1 -1
  182. package/dist/segment-params/index.js +69 -1
  183. package/dist/segment-params/index.js.map +1 -0
  184. package/dist/server/actions.d.ts +6 -3
  185. package/dist/server/actions.d.ts.map +1 -1
  186. package/dist/server/als-registry.d.ts +2 -1
  187. package/dist/server/als-registry.d.ts.map +1 -1
  188. package/dist/server/build-manifest.d.ts +13 -1
  189. package/dist/server/build-manifest.d.ts.map +1 -1
  190. package/dist/server/chain-url-parts.d.ts +82 -0
  191. package/dist/server/chain-url-parts.d.ts.map +1 -0
  192. package/dist/server/children-interception.d.ts +49 -0
  193. package/dist/server/children-interception.d.ts.map +1 -0
  194. package/dist/server/default-status-page.d.ts +45 -0
  195. package/dist/server/default-status-page.d.ts.map +1 -0
  196. package/dist/server/deny-boundary.d.ts +4 -7
  197. package/dist/server/deny-boundary.d.ts.map +1 -1
  198. package/dist/server/deny-renderer.d.ts +14 -3
  199. package/dist/server/deny-renderer.d.ts.map +1 -1
  200. package/dist/server/head-response.d.ts +35 -0
  201. package/dist/server/head-response.d.ts.map +1 -0
  202. package/dist/server/index.js +2 -2
  203. package/dist/server/internal.js +528 -373
  204. package/dist/server/internal.js.map +1 -1
  205. package/dist/server/param-coercion.d.ts +10 -1
  206. package/dist/server/param-coercion.d.ts.map +1 -1
  207. package/dist/server/pipeline-helpers.d.ts +0 -18
  208. package/dist/server/pipeline-helpers.d.ts.map +1 -1
  209. package/dist/server/pipeline-interception.d.ts +59 -9
  210. package/dist/server/pipeline-interception.d.ts.map +1 -1
  211. package/dist/server/pipeline-outcome.d.ts.map +1 -1
  212. package/dist/server/pipeline-phases.d.ts.map +1 -1
  213. package/dist/server/pipeline.d.ts +11 -0
  214. package/dist/server/pipeline.d.ts.map +1 -1
  215. package/dist/server/prebuilt-builder.d.ts.map +1 -1
  216. package/dist/server/primitives.d.ts +0 -12
  217. package/dist/server/primitives.d.ts.map +1 -1
  218. package/dist/server/publish-params.d.ts +33 -0
  219. package/dist/server/publish-params.d.ts.map +1 -0
  220. package/dist/server/request-context.d.ts +48 -0
  221. package/dist/server/request-context.d.ts.map +1 -1
  222. package/dist/server/route-element-builder.d.ts +32 -2
  223. package/dist/server/route-element-builder.d.ts.map +1 -1
  224. package/dist/server/route-handler.d.ts.map +1 -1
  225. package/dist/server/route-matcher.d.ts +13 -0
  226. package/dist/server/route-matcher.d.ts.map +1 -1
  227. package/dist/server/rsc-cache-key-guard.d.ts +78 -0
  228. package/dist/server/rsc-cache-key-guard.d.ts.map +1 -0
  229. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  230. package/dist/server/rsc-entry/error-renderer.d.ts +14 -2
  231. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  232. package/dist/server/rsc-entry/helpers.d.ts +2 -10
  233. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  234. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  235. package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
  236. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -2
  237. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  238. package/dist/server/rsc-entry/rsc-stream.d.ts +3 -2
  239. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  240. package/dist/server/rsc-entry/ssr-renderer.d.ts +2 -0
  241. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  242. package/dist/server/sitemap-generator.d.ts.map +1 -1
  243. package/dist/server/skippable-prefix.d.ts +23 -0
  244. package/dist/server/skippable-prefix.d.ts.map +1 -0
  245. package/dist/server/slot-interception.d.ts +80 -0
  246. package/dist/server/slot-interception.d.ts.map +1 -0
  247. package/dist/server/slot-resolver.d.ts +70 -8
  248. package/dist/server/slot-resolver.d.ts.map +1 -1
  249. package/dist/server/ssr-bridge-types.d.ts +6 -0
  250. package/dist/server/ssr-bridge-types.d.ts.map +1 -1
  251. package/dist/server/ssr-entry.d.ts.map +1 -1
  252. package/dist/server/ssr-wrappers.d.ts +24 -13
  253. package/dist/server/ssr-wrappers.d.ts.map +1 -1
  254. package/dist/server/state-tree-diff.d.ts +6 -27
  255. package/dist/server/state-tree-diff.d.ts.map +1 -1
  256. package/dist/server/static-generator.d.ts +6 -0
  257. package/dist/server/static-generator.d.ts.map +1 -1
  258. package/dist/server/static-not-found.d.ts +52 -0
  259. package/dist/server/static-not-found.d.ts.map +1 -0
  260. package/dist/server/status-code-resolver.d.ts +3 -10
  261. package/dist/server/status-code-resolver.d.ts.map +1 -1
  262. package/dist/shared/als-slots.d.ts +41 -0
  263. package/dist/shared/als-slots.d.ts.map +1 -0
  264. package/dist/shared/base-path.d.ts +56 -0
  265. package/dist/shared/base-path.d.ts.map +1 -0
  266. package/dist/shared/param-value.d.ts +80 -0
  267. package/dist/shared/param-value.d.ts.map +1 -0
  268. package/dist/shared/payload-root.d.ts +108 -0
  269. package/dist/shared/payload-root.d.ts.map +1 -0
  270. package/dist/shared/rsc-cache-key.d.ts +163 -0
  271. package/dist/shared/rsc-cache-key.d.ts.map +1 -0
  272. package/dist/shared/rsc-error-envelope.d.ts +25 -0
  273. package/dist/shared/rsc-error-envelope.d.ts.map +1 -0
  274. package/dist/shared/rsc-manifest.d.ts +28 -0
  275. package/dist/shared/rsc-manifest.d.ts.map +1 -0
  276. package/dist/shared/rsc-payload-path.d.ts +42 -0
  277. package/dist/shared/rsc-payload-path.d.ts.map +1 -0
  278. package/dist/shared/segment-info.d.ts +59 -0
  279. package/dist/shared/segment-info.d.ts.map +1 -0
  280. package/dist/shared/slot-params.d.ts +51 -0
  281. package/dist/shared/slot-params.d.ts.map +1 -0
  282. package/dist/shared/static-platform-files.d.ts +71 -0
  283. package/dist/shared/static-platform-files.d.ts.map +1 -0
  284. package/dist/shims/navigation-client.d.ts +8 -19
  285. package/dist/shims/navigation-client.d.ts.map +1 -1
  286. package/dist/shims/navigation.d.ts +0 -1
  287. package/dist/shims/navigation.d.ts.map +1 -1
  288. package/docs/api/31-api-client.mdx +4 -2
  289. package/docs/learn/02-pages-and-layouts.mdx +1 -1
  290. package/docs/learn/11-error-handling.mdx +4 -3
  291. package/docs/learn/12-client-navigation.mdx +2 -2
  292. package/docs/learn/14-deploying.mdx +23 -0
  293. package/docs/more/01-advanced-routing.mdx +172 -2
  294. package/docs/more/04-metadata-and-fonts.mdx +1 -1
  295. package/package.json +2 -2
  296. package/src/adapters/build-output-helper.ts +116 -3
  297. package/src/adapters/cloudflare.ts +86 -11
  298. package/src/adapters/fs-identity.ts +156 -0
  299. package/src/adapters/nitro.ts +6 -6
  300. package/src/adapters/shared.ts +196 -21
  301. package/src/adapters/types.ts +13 -1
  302. package/src/cache/fast-hash.ts +5 -0
  303. package/src/client/browser-entry/action-dispatch.ts +9 -4
  304. package/src/client/browser-entry/hydrate.ts +40 -29
  305. package/src/client/browser-entry/index.ts +15 -1
  306. package/src/client/browser-entry/post-hydration.ts +10 -9
  307. package/src/client/browser-entry/router-init.ts +104 -48
  308. package/src/client/browser-entry/rsc-stream.ts +11 -2
  309. package/src/client/error-boundary.tsx +20 -15
  310. package/src/client/history.ts +13 -6
  311. package/src/client/internal.ts +4 -3
  312. package/src/client/link.tsx +55 -8
  313. package/src/client/navigation-api.ts +3 -3
  314. package/src/client/navigation-commit.ts +174 -0
  315. package/src/client/navigation-context.ts +40 -67
  316. package/src/client/navigation-root.tsx +326 -101
  317. package/src/client/params-context.ts +192 -0
  318. package/src/client/router-effects.ts +231 -0
  319. package/src/client/router-lifecycle.ts +288 -0
  320. package/src/client/router-pipeline.ts +389 -0
  321. package/src/client/router-ref.ts +1 -1
  322. package/src/client/router-skew.ts +30 -0
  323. package/src/client/router-types.ts +230 -0
  324. package/src/client/router.ts +242 -690
  325. package/src/client/rsc-fetch.ts +180 -122
  326. package/src/client/segment-cache.ts +121 -44
  327. package/src/client/ssr-data.ts +6 -0
  328. package/src/client/stale-client.ts +191 -0
  329. package/src/client/state.ts +14 -1
  330. package/src/client/top-loader.tsx +2 -1
  331. package/src/client/unload-guard.ts +34 -2
  332. package/src/client/use-cookie.ts +9 -2
  333. package/src/client/use-router.ts +1 -1
  334. package/src/client/use-segment-params.ts +41 -18
  335. package/src/index.ts +5 -1
  336. package/src/plugin-context.ts +34 -1
  337. package/src/plugins/adapter-build.ts +4 -0
  338. package/src/plugins/build-manifest.ts +34 -13
  339. package/src/plugins/entries.ts +4 -0
  340. package/src/plugins/fonts.ts +11 -8
  341. package/src/plugins/request-dep/analysis.ts +447 -0
  342. package/src/plugins/request-dep/index.ts +376 -0
  343. package/src/plugins/request-dep/origin.ts +310 -0
  344. package/src/plugins/routing.ts +60 -3
  345. package/src/plugins/static-build.ts +333 -63
  346. package/src/routing/codegen-types.ts +18 -0
  347. package/src/routing/codegen.ts +50 -10
  348. package/src/routing/collision-probe.ts +438 -0
  349. package/src/routing/collision-spaces.ts +281 -0
  350. package/src/routing/interception.ts +896 -50
  351. package/src/routing/manifest-codegen.ts +6 -9
  352. package/src/routing/scanner.ts +114 -113
  353. package/src/routing/segment-classify.ts +57 -0
  354. package/src/routing/segment-keys.ts +146 -0
  355. package/src/routing/slot-placement.ts +97 -0
  356. package/src/routing/types.ts +1 -3
  357. package/src/routing/walkers.ts +8 -0
  358. package/src/search-params/define.ts +6 -29
  359. package/src/segment-params/define.ts +4 -27
  360. package/src/server/action-handler.ts +3 -1
  361. package/src/server/actions.ts +6 -3
  362. package/src/server/als-registry.ts +2 -1
  363. package/src/server/build-manifest.ts +14 -1
  364. package/src/server/chain-url-parts.ts +163 -0
  365. package/src/server/children-interception.ts +115 -0
  366. package/src/server/default-status-page.ts +127 -0
  367. package/src/server/deny-boundary.ts +5 -31
  368. package/src/server/deny-renderer.ts +83 -22
  369. package/src/server/head-response.ts +54 -0
  370. package/src/server/param-coercion.ts +48 -18
  371. package/src/server/pipeline-helpers.ts +0 -45
  372. package/src/server/pipeline-interception.ts +81 -32
  373. package/src/server/pipeline-outcome.ts +3 -5
  374. package/src/server/pipeline-phases.ts +68 -16
  375. package/src/server/pipeline.ts +57 -10
  376. package/src/server/prebuilt-builder.ts +1 -7
  377. package/src/server/prebuilt-runtime.ts +4 -4
  378. package/src/server/primitives.ts +0 -18
  379. package/src/server/publish-params.ts +42 -0
  380. package/src/server/request-context.ts +97 -18
  381. package/src/server/route-element-builder.ts +89 -98
  382. package/src/server/route-handler.ts +8 -8
  383. package/src/server/route-matcher.ts +21 -9
  384. package/src/server/rsc-cache-key-guard.ts +170 -0
  385. package/src/server/rsc-entry/api-handler.ts +6 -8
  386. package/src/server/rsc-entry/error-renderer.ts +64 -25
  387. package/src/server/rsc-entry/helpers.ts +31 -16
  388. package/src/server/rsc-entry/index.ts +36 -28
  389. package/src/server/rsc-entry/render-route.ts +12 -7
  390. package/src/server/rsc-entry/revalidate-renderer.ts +1 -1
  391. package/src/server/rsc-entry/rsc-payload.ts +14 -25
  392. package/src/server/rsc-entry/rsc-stream.ts +4 -3
  393. package/src/server/rsc-entry/ssr-renderer.ts +13 -9
  394. package/src/server/sitemap-generator.ts +1 -7
  395. package/src/server/skippable-prefix.ts +92 -0
  396. package/src/server/slot-interception.ts +168 -0
  397. package/src/server/slot-resolver.ts +253 -156
  398. package/src/server/ssr-bridge-types.ts +6 -0
  399. package/src/server/ssr-entry.ts +12 -4
  400. package/src/server/ssr-wrappers.tsx +33 -32
  401. package/src/server/state-tree-diff.ts +14 -55
  402. package/src/server/static-generator.ts +67 -45
  403. package/src/server/static-not-found.ts +134 -0
  404. package/src/server/status-code-resolver.ts +4 -47
  405. package/src/shared/als-slots.ts +72 -0
  406. package/src/shared/base-path.ts +80 -0
  407. package/src/shared/param-value.ts +244 -0
  408. package/src/shared/payload-root.ts +151 -0
  409. package/src/shared/rsc-cache-key.ts +269 -0
  410. package/src/shared/rsc-error-envelope.ts +31 -0
  411. package/src/shared/rsc-manifest.ts +29 -0
  412. package/src/shared/rsc-payload-path.ts +45 -0
  413. package/src/shared/segment-info.ts +60 -0
  414. package/src/shared/slot-params.ts +111 -0
  415. package/src/shared/static-platform-files.ts +75 -0
  416. package/src/shims/navigation-client.ts +8 -26
  417. package/src/shims/navigation.ts +0 -4
  418. package/dist/_chunks/build-output-helper-DOGYFb_X.js +0 -196
  419. package/dist/_chunks/build-output-helper-DOGYFb_X.js.map +0 -1
  420. package/dist/_chunks/canonicalize-DQHyFClh.js.map +0 -1
  421. package/dist/_chunks/cli-schema-sync-D3naS3eH.js +0 -688
  422. package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +0 -1
  423. package/dist/_chunks/define-COtkxMRT.js +0 -191
  424. package/dist/_chunks/define-COtkxMRT.js.map +0 -1
  425. package/dist/_chunks/define-c4au4I9R.js +0 -82
  426. package/dist/_chunks/define-c4au4I9R.js.map +0 -1
  427. package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +0 -1
  428. package/dist/_chunks/logger-AWfuX-KJ.js.map +0 -1
  429. package/dist/_chunks/navigation-root-bUDZLw74.js +0 -124
  430. package/dist/_chunks/navigation-root-bUDZLw74.js.map +0 -1
  431. package/dist/_chunks/plugin-context---kTF5v8.js.map +0 -1
  432. package/dist/_chunks/router-ref-CtmF-aPv.js.map +0 -1
  433. package/dist/_chunks/segment-classify-Byy425ng.js.map +0 -1
  434. package/dist/_chunks/ssr-data-BOWsq18U.js.map +0 -1
  435. package/dist/_chunks/use-segment-params-D1CzlgBo.js +0 -151
  436. package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +0 -1
  437. package/dist/_chunks/walkers-BtTlKviE.js.map +0 -1
  438. package/dist/client/error-boundary.js.map +0 -1
  439. package/dist/plugins/request-dep.d.ts +0 -32
  440. package/dist/plugins/request-dep.d.ts.map +0 -1
  441. package/src/plugins/request-dep.ts +0 -499
@@ -0,0 +1,447 @@
1
+ /**
2
+ * Per-module syntactic facts for request-dependency analysis.
3
+ *
4
+ * This module is deliberately dumb: it records *what the source says*, with no
5
+ * knowledge of which specifiers or names are interesting. Every judgement —
6
+ * "is this an accessor", "is this a definition object" — lives in `origin.ts`,
7
+ * which resolves a binding to the module it actually came from.
8
+ *
9
+ * That split is the point. The previous shape asked each module in isolation
10
+ * "do you import `getSearchParams` from `@timber-js/app/server` and call it",
11
+ * which any indirection defeats: a barrel re-export, a namespace import, a
12
+ * factory reached through the app's own `_lib`. Each of those was a separate
13
+ * hole and each was found separately (TIM-1291). Recording bindings and edges
14
+ * here, and resolving them across the graph there, closes the family instead of
15
+ * its members.
16
+ *
17
+ * See design/19-client-navigation.md §"Why the slot comparison ignores the query".
18
+ */
19
+
20
+ import type {
21
+ ProgramNode,
22
+ PositionedNode,
23
+ IdentifierNode,
24
+ CallExpressionNode,
25
+ MemberExpressionNode,
26
+ } from '../callsite-ast.js';
27
+
28
+ /**
29
+ * One module-graph edge introduced by an `import` or `export … from`.
30
+ *
31
+ * `imported` is the name as it exists in the *source* module: an export name,
32
+ * `'default'`, or `'*'` for a namespace/star form.
33
+ */
34
+ export interface ImportEdge {
35
+ source: string;
36
+ imported: string;
37
+ }
38
+
39
+ /** The callee of `const x = f()` / `const x = ns.f()`. */
40
+ export type CalleeRef =
41
+ | { kind: 'local'; name: string }
42
+ | { kind: 'member'; object: string; property: string };
43
+
44
+ export interface ModuleFacts {
45
+ /** Local name → the edge that bound it (`import { a as b } from 'x'`). */
46
+ importedBindings: Map<string, ImportEdge>;
47
+ /** Exported name → edge, for `export { a as b } from 'x'`. */
48
+ reExports: Map<string, ImportEdge>;
49
+ /** Sources of anonymous `export * from 'x'`, in source order. */
50
+ starReExports: string[];
51
+ /** Exported name → local name, for `export { x }`, `export const x = …`. */
52
+ localExports: Map<string, string>;
53
+ /** Local variable name → the callee that produced its value. */
54
+ factoryCalls: Map<string, CalleeRef>;
55
+ /** Local names invoked directly: `f()`. */
56
+ calledLocals: Set<string>;
57
+ /** `ns.f()` → `ns` → `{ f }`. */
58
+ calledMembers: Map<string, Set<string>>;
59
+ /** Base identifier of a `.get()` chain: `x.get()`, `x().get()`, `x.p.get()`. */
60
+ getterLocals: Set<string>;
61
+ /** `ns.defs.get()` → `ns` → `{ defs }`. */
62
+ getterMembers: Map<string, Set<string>>;
63
+ /** Every name the module *body* mentions — import/export clauses excluded. */
64
+ referencedLocals: Set<string>;
65
+ /** Specifier → resolved module id, filled by the plugin via `this.resolve`. */
66
+ resolvedSources: Map<string, string>;
67
+ /** Specifiers that failed to resolve — treated as request-dependent. */
68
+ unresolvedSources: Set<string>;
69
+ }
70
+
71
+ /** `export default` has no local name of its own; this stands in for one. */
72
+ export const DEFAULT_EXPORT = 'default';
73
+
74
+ export function createModuleFacts(): ModuleFacts {
75
+ return {
76
+ importedBindings: new Map(),
77
+ reExports: new Map(),
78
+ starReExports: [],
79
+ localExports: new Map(),
80
+ factoryCalls: new Map(),
81
+ calledLocals: new Set(),
82
+ calledMembers: new Map(),
83
+ getterLocals: new Set(),
84
+ getterMembers: new Map(),
85
+ referencedLocals: new Set(),
86
+ resolvedSources: new Map(),
87
+ unresolvedSources: new Set(),
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Specifiers the origin walk can actually reach, so the plugin resolves those
93
+ * and not every import in the file.
94
+ *
95
+ * A re-export edge is always reachable — a downstream module can ask for any
96
+ * name it forwards. An `import` edge is reachable through any local name the
97
+ * module body mentions, or that it re-exports.
98
+ *
99
+ * The name set must be **the same one the taint rules consult**. Deriving it
100
+ * from the call shapes instead (called, `.get()`d, member-called, minted from)
101
+ * left `read(filters)` — a definition passed as an argument — with its
102
+ * specifier unresolved, so the origin walk reported it inert and the page read
103
+ * as request-independent. Two hand-maintained lists of "names that matter" is
104
+ * one list too many; this is the one, and `referencedLocals` is a superset of
105
+ * every call shape by construction, since each of them is an identifier the
106
+ * walk visits. (Codex review round 1 on PR #991.)
107
+ */
108
+ export function usedSources(facts: ModuleFacts): Set<string> {
109
+ const sources = new Set<string>(facts.starReExports);
110
+ for (const edge of facts.reExports.values()) sources.add(edge.source);
111
+
112
+ for (const local of facts.referencedLocals) {
113
+ const edge = facts.importedBindings.get(local);
114
+ if (edge) sources.add(edge.source);
115
+ }
116
+ for (const local of facts.localExports.values()) {
117
+ const edge = facts.importedBindings.get(local);
118
+ if (edge) sources.add(edge.source);
119
+ }
120
+ return sources;
121
+ }
122
+
123
+ /**
124
+ * True when the module cannot affect any answer, so its facts need not be kept.
125
+ *
126
+ * Every judgement bottoms out at a module edge: a call site resolves through
127
+ * `importedBindings`, a chain link through `reExports` / `starReExports`. A
128
+ * module with none of those can only ever resolve to `none` — its exports lead
129
+ * to locals that lead nowhere — which is exactly what a *missing* entry
130
+ * produces. Dropping it is behaviour-preserving and keeps the dev-time map from
131
+ * holding an entry for every leaf module in the graph.
132
+ */
133
+ export function contributesNothing(facts: ModuleFacts): boolean {
134
+ return (
135
+ facts.importedBindings.size === 0 &&
136
+ facts.reExports.size === 0 &&
137
+ facts.starReExports.length === 0
138
+ );
139
+ }
140
+
141
+ function addToMapSet(map: Map<string, Set<string>>, key: string, value: string): void {
142
+ const existing = map.get(key);
143
+ if (existing) existing.add(value);
144
+ else map.set(key, new Set([value]));
145
+ }
146
+
147
+ // ─── Declaration collection ──────────────────────────────────────────────
148
+
149
+ /**
150
+ * A module-export name slot: `Identifier`, or the string-literal form ESTree
151
+ * allows (`export { x as "a-b" } from './m'`) — a valid export name that is not
152
+ * a valid identifier.
153
+ */
154
+ type NameNode = PositionedNode | undefined;
155
+
156
+ interface SpecifierNode extends PositionedNode {
157
+ local?: NameNode;
158
+ imported?: NameNode;
159
+ exported?: NameNode;
160
+ }
161
+
162
+ function nameOf(node: NameNode): string | null {
163
+ if (!node) return null;
164
+ if (node.type === 'Identifier') return (node as IdentifierNode).name;
165
+ if (node.type === 'Literal' && typeof node.value === 'string') return node.value;
166
+ return null;
167
+ }
168
+
169
+ /**
170
+ * `import type { … }` needs no handling here. Vite's TypeScript transform is a
171
+ * core plugin and runs before this one, so types are already erased by the time
172
+ * the analysis parses — and the parser it runs on is JavaScript-only, so
173
+ * unerased TypeScript would throw rather than be silently misread.
174
+ * `tests/request-dep-plugin.test.ts` pins the resulting property through the
175
+ * real pipeline: a type-only accessor import is not request-dependent.
176
+ */
177
+ function collectImportDeclaration(stmt: PositionedNode, facts: ModuleFacts): void {
178
+ const source = (stmt.source as { value: string } | undefined)?.value;
179
+ if (typeof source !== 'string') return;
180
+ for (const spec of (stmt.specifiers as SpecifierNode[] | undefined) ?? []) {
181
+ const local = nameOf(spec.local);
182
+ if (!local) continue;
183
+ if (spec.type === 'ImportNamespaceSpecifier') {
184
+ facts.importedBindings.set(local, { source, imported: '*' });
185
+ } else if (spec.type === 'ImportDefaultSpecifier') {
186
+ facts.importedBindings.set(local, { source, imported: DEFAULT_EXPORT });
187
+ } else if (spec.type === 'ImportSpecifier') {
188
+ facts.importedBindings.set(local, { source, imported: nameOf(spec.imported) ?? local });
189
+ }
190
+ }
191
+ }
192
+
193
+ function collectDeclaredNames(decl: PositionedNode, out: Set<string>): void {
194
+ if (decl.type === 'VariableDeclaration') {
195
+ for (const d of (decl.declarations as PositionedNode[] | undefined) ?? []) {
196
+ const id = d.id as PositionedNode | undefined;
197
+ if (id?.type === 'Identifier') out.add((id as IdentifierNode).name);
198
+ }
199
+ } else if (decl.type === 'FunctionDeclaration' || decl.type === 'ClassDeclaration') {
200
+ const id = decl.id as PositionedNode | undefined;
201
+ if (id?.type === 'Identifier') out.add((id as IdentifierNode).name);
202
+ }
203
+ }
204
+
205
+ function collectExportNamed(stmt: PositionedNode, facts: ModuleFacts): void {
206
+ const source = (stmt.source as { value: string } | undefined)?.value;
207
+ const specifiers = (stmt.specifiers as SpecifierNode[] | undefined) ?? [];
208
+
209
+ if (typeof source === 'string') {
210
+ // `export { a as b } from './m'` — `local` names the export in './m'.
211
+ for (const spec of specifiers) {
212
+ const imported = nameOf(spec.imported) ?? nameOf(spec.local);
213
+ const exported = nameOf(spec.exported);
214
+ if (imported && exported) facts.reExports.set(exported, { source, imported });
215
+ }
216
+ return;
217
+ }
218
+
219
+ // `export { x }` / `export { x as y }` — `local` is a binding in this module.
220
+ for (const spec of specifiers) {
221
+ const local = nameOf(spec.local);
222
+ const exported = nameOf(spec.exported);
223
+ if (local && exported) facts.localExports.set(exported, local);
224
+ }
225
+
226
+ // `export const x = …`, `export function f() {}`
227
+ const declaration = stmt.declaration as PositionedNode | undefined;
228
+ if (declaration) {
229
+ const names = new Set<string>();
230
+ collectDeclaredNames(declaration, names);
231
+ for (const name of names) facts.localExports.set(name, name);
232
+ }
233
+ }
234
+
235
+ function collectExportAll(stmt: PositionedNode, facts: ModuleFacts): void {
236
+ const source = (stmt.source as { value: string } | undefined)?.value;
237
+ if (typeof source !== 'string') return;
238
+ const exported = nameOf(stmt.exported as NameNode);
239
+ if (exported) {
240
+ // `export * as ns from './m'` — a namespace object under one name.
241
+ facts.reExports.set(exported, { source, imported: '*' });
242
+ } else {
243
+ facts.starReExports.push(source);
244
+ }
245
+ }
246
+
247
+ function collectExportDefault(stmt: PositionedNode, facts: ModuleFacts): void {
248
+ const declaration = stmt.declaration as PositionedNode | undefined;
249
+ if (!declaration) return;
250
+ facts.localExports.set(DEFAULT_EXPORT, DEFAULT_EXPORT);
251
+ if (declaration.type === 'Identifier') {
252
+ // `export default x` — alias the default onto the existing binding.
253
+ facts.localExports.set(DEFAULT_EXPORT, (declaration as IdentifierNode).name);
254
+ } else if (declaration.type === 'CallExpression') {
255
+ const ref = calleeRef(declaration as unknown as CallExpressionNode);
256
+ if (ref) facts.factoryCalls.set(DEFAULT_EXPORT, ref);
257
+ }
258
+ }
259
+
260
+ // ─── Expression collection ───────────────────────────────────────────────
261
+
262
+ function calleeRef(call: CallExpressionNode): CalleeRef | null {
263
+ const callee = call.callee;
264
+ if (callee.type === 'Identifier') {
265
+ return { kind: 'local', name: (callee as IdentifierNode).name };
266
+ }
267
+ if (callee.type === 'MemberExpression') {
268
+ const member = callee as MemberExpressionNode;
269
+ if (
270
+ !member.computed &&
271
+ member.object.type === 'Identifier' &&
272
+ member.property.type === 'Identifier'
273
+ ) {
274
+ return {
275
+ kind: 'member',
276
+ object: (member.object as IdentifierNode).name,
277
+ property: (member.property as IdentifierNode).name,
278
+ };
279
+ }
280
+ }
281
+ return null;
282
+ }
283
+
284
+ /**
285
+ * Walk down a `.get()` receiver to the identifier it is ultimately rooted in,
286
+ * along with the first property accessed on that identifier.
287
+ *
288
+ * `x.get()` → `x`, no property. `x(a).get()` → `x`. `ns.defs.get()` → `ns`
289
+ * plus `defs`, which is both the namespace-member shape and the
290
+ * `cookies.theme.get()` shape — the resolver tries the base binding and the
291
+ * member, so one walk covers both.
292
+ */
293
+ function chainRoot(node: PositionedNode): { base: string; property: string | null } | null {
294
+ let current = node;
295
+ let property: string | null = null;
296
+ for (;;) {
297
+ if (current.type === 'Identifier') {
298
+ return { base: (current as IdentifierNode).name, property };
299
+ }
300
+ if (current.type === 'MemberExpression') {
301
+ const member = current as MemberExpressionNode;
302
+ if (!member.computed && member.property.type === 'Identifier') {
303
+ property = (member.property as IdentifierNode).name;
304
+ } else {
305
+ property = null;
306
+ }
307
+ current = member.object;
308
+ continue;
309
+ }
310
+ if (current.type === 'CallExpression') {
311
+ property = null;
312
+ current = (current as CallExpressionNode).callee;
313
+ continue;
314
+ }
315
+ return null;
316
+ }
317
+ }
318
+
319
+ function collectExpression(node: PositionedNode, facts: ModuleFacts): void {
320
+ if (node.type === 'VariableDeclarator') {
321
+ const id = node.id as PositionedNode | undefined;
322
+ const init = node.init as PositionedNode | undefined;
323
+ if (id?.type === 'Identifier' && init?.type === 'CallExpression') {
324
+ const ref = calleeRef(init as unknown as CallExpressionNode);
325
+ if (ref) facts.factoryCalls.set((id as IdentifierNode).name, ref);
326
+ }
327
+ return;
328
+ }
329
+
330
+ if (node.type !== 'CallExpression') return;
331
+ const call = node as unknown as CallExpressionNode;
332
+ const callee = call.callee;
333
+
334
+ if (callee.type === 'Identifier') {
335
+ facts.calledLocals.add((callee as IdentifierNode).name);
336
+ return;
337
+ }
338
+ if (callee.type !== 'MemberExpression') return;
339
+ const member = callee as MemberExpressionNode;
340
+ if (member.computed || member.property.type !== 'Identifier') return;
341
+ const propertyName = (member.property as IdentifierNode).name;
342
+
343
+ if (propertyName === 'get') {
344
+ const root = chainRoot(member.object);
345
+ if (root) {
346
+ facts.getterLocals.add(root.base);
347
+ if (root.property) addToMapSet(facts.getterMembers, root.base, root.property);
348
+ }
349
+ return;
350
+ }
351
+ if (member.object.type === 'Identifier') {
352
+ addToMapSet(facts.calledMembers, (member.object as IdentifierNode).name, propertyName);
353
+ }
354
+ }
355
+
356
+ /**
357
+ * Statements whose whole subtree is an import/export *clause* rather than code.
358
+ *
359
+ * The walk skips them so `referencedLocals` means "the module body mentions
360
+ * this name". Without the skip every imported name would count as referenced,
361
+ * and a pure barrel — which mentions its names only in the clauses — would be
362
+ * indistinguishable from a module that uses them.
363
+ */
364
+ function isClauseOnly(node: PositionedNode): boolean {
365
+ if (node.type === 'ImportDeclaration' || node.type === 'ExportAllDeclaration') return true;
366
+ if (node.type === 'ExportNamedDeclaration') return !node.declaration;
367
+ // `export default someBinding` forwards; `export default f()` is code.
368
+ if (node.type === 'ExportDefaultDeclaration') {
369
+ return (node.declaration as PositionedNode | undefined)?.type === 'Identifier';
370
+ }
371
+ return false;
372
+ }
373
+
374
+ /**
375
+ * Keys holding *binding* positions rather than references: the name being
376
+ * declared, not a mention of one.
377
+ *
378
+ * `referencedLocals` must exclude these or `export const filters =
379
+ * defineSearchParams({})` would count as referencing `filters`, and possession
380
+ * would then taint every definition module — and through it every page that
381
+ * imports one, whether or not it reads the request. Skipping only these keys
382
+ * keeps a shadowing parameter's *body* uses as references, which over-reports
383
+ * in the safe direction.
384
+ */
385
+ const BINDING_KEYS: Readonly<Record<string, readonly string[]>> = {
386
+ VariableDeclarator: ['id'],
387
+ FunctionDeclaration: ['id', 'params'],
388
+ FunctionExpression: ['id', 'params'],
389
+ ArrowFunctionExpression: ['params'],
390
+ ClassDeclaration: ['id'],
391
+ ClassExpression: ['id'],
392
+ CatchClause: ['param'],
393
+ };
394
+
395
+ function walk(node: PositionedNode, facts: ModuleFacts): void {
396
+ if (isClauseOnly(node)) return;
397
+ if (node.type === 'Identifier') facts.referencedLocals.add((node as IdentifierNode).name);
398
+ collectExpression(node, facts);
399
+ const bindingKeys = BINDING_KEYS[node.type];
400
+ for (const key of Object.keys(node)) {
401
+ if (key === 'type' || key === 'start' || key === 'end') continue;
402
+ if (bindingKeys?.includes(key)) continue;
403
+ const value = node[key];
404
+ if (!value || typeof value !== 'object') continue;
405
+ if (Array.isArray(value)) {
406
+ for (const item of value) {
407
+ if (item && typeof item === 'object' && typeof item.type === 'string') {
408
+ walk(item as PositionedNode, facts);
409
+ }
410
+ }
411
+ } else if (typeof (value as PositionedNode).type === 'string') {
412
+ walk(value as PositionedNode, facts);
413
+ }
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Record every binding, module edge, and call shape in one module.
419
+ *
420
+ * Names are recorded without scope analysis, so a parameter that shadows an
421
+ * imported name is credited to the import. That direction is deliberate: a
422
+ * needlessly request-dependent segment costs a re-render, a wrongly static one
423
+ * serves stale content.
424
+ */
425
+ export function analyzeModule(program: ProgramNode): ModuleFacts {
426
+ const facts = createModuleFacts();
427
+
428
+ for (const stmt of program.body) {
429
+ switch (stmt.type) {
430
+ case 'ImportDeclaration':
431
+ collectImportDeclaration(stmt, facts);
432
+ break;
433
+ case 'ExportNamedDeclaration':
434
+ collectExportNamed(stmt, facts);
435
+ break;
436
+ case 'ExportAllDeclaration':
437
+ collectExportAll(stmt, facts);
438
+ break;
439
+ case 'ExportDefaultDeclaration':
440
+ collectExportDefault(stmt, facts);
441
+ break;
442
+ }
443
+ }
444
+
445
+ walk(program, facts);
446
+ return facts;
447
+ }