@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.180
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.
- package/LICENSE +8 -0
- package/agent-skill.md +344 -0
- package/dist/_chunks/actions-O_LsyCE4.js +317 -0
- package/dist/_chunks/actions-O_LsyCE4.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js +1202 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-COtkxMRT.js +191 -0
- package/dist/_chunks/define-COtkxMRT.js.map +1 -0
- package/dist/_chunks/define-c4au4I9R.js +82 -0
- package/dist/_chunks/define-c4au4I9R.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
- package/dist/_chunks/logger-AWfuX-KJ.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context---kTF5v8.js +315 -0
- package/dist/_chunks/plugin-context---kTF5v8.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js +50 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js +119 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
- package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
- package/dist/_chunks/segment-classify-Byy425ng.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
- package/dist/_chunks/use-query-states-DFvWd-EA.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/walkers-BtTlKviE.js +1002 -0
- package/dist/_chunks/walkers-BtTlKviE.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +189 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +41 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -172
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +2 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +31 -8
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +52 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -34
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +27 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +21 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +185 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +887 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +121 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +99 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +48 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +26 -7
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +284 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +257 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +17 -3
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +177 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9243 -14093
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +217 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +28 -4
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/request-dep.d.ts +21 -0
- package/dist/plugins/request-dep.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +64 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +81 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +81 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +188 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +93 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +12 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +117 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +242 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +182 -2906
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3892 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +140 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +62 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/key-discipline.d.ts +23 -0
- package/dist/server/prebuilt/key-discipline.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +88 -43
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +53 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +69 -37
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +6 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +25 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +36 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +66 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +72 -9
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +69 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +35 -11
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +311 -0
- package/docs/api/33-api-search-params.mdx +154 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +109 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +252 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +176 -0
- package/docs/learn/13-configuration.mdx +162 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +173 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +105 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +204 -0
- package/src/adapters/cloudflare.ts +620 -129
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +266 -122
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +2 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +237 -0
- package/src/cache/timber-cache.ts +161 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +401 -0
- package/src/cli.ts +167 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +113 -0
- package/src/client/browser-entry/post-hydration.ts +110 -0
- package/src/client/browser-entry/router-init.ts +286 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +21 -6
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +349 -150
- package/src/client/navigation-api.ts +345 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +565 -212
- package/src/client/rsc-fetch.ts +215 -34
- package/src/client/segment-cache.ts +91 -17
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +60 -15
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +108 -10
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +122 -26
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +100 -18
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +446 -352
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +432 -0
- package/src/plugins/adapter-build.ts +220 -7
- package/src/plugins/build-manifest.ts +177 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +134 -16
- package/src/plugins/fonts.ts +225 -660
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +328 -0
- package/src/plugins/request-dep.ts +458 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +241 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +372 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +313 -0
- package/src/routing/manifest-codegen.ts +287 -0
- package/src/routing/scanner.ts +338 -189
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +223 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +82 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +253 -0
- package/src/search-params/define.ts +576 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +101 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +111 -34
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +137 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +19 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +314 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +207 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +45 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +545 -0
- package/src/server/pipeline.ts +274 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +298 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +809 -0
- package/src/server/prebuilt-runtime.ts +815 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +170 -337
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +699 -295
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +158 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/deny-fallback.ts +92 -0
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +210 -85
- package/src/server/rsc-entry/index.ts +332 -332
- package/src/server/rsc-entry/render-route.ts +300 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +102 -42
- package/src/server/rsc-entry/rsc-stream.ts +93 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +275 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +345 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +574 -250
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -86
- package/src/server/ssr-render.ts +345 -86
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +177 -30
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +214 -90
- package/src/server/tree-match.ts +262 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js +0 -153
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import { Component, createElement, type ReactNode } from 'react';
|
|
22
22
|
import { getSsrData } from './ssr-data.js';
|
|
23
|
+
import { getRouterOrNull } from './router-ref.js';
|
|
23
24
|
|
|
24
25
|
// ─── Page Unload Detection ───────────────────────────────────────────────────
|
|
25
26
|
// Track whether the page is being unloaded (user refreshed or navigated away).
|
|
@@ -65,17 +66,24 @@ type ParsedDigest = DenyDigest | RenderErrorDigest | RedirectDigest;
|
|
|
65
66
|
|
|
66
67
|
export interface TimberErrorBoundaryProps {
|
|
67
68
|
/** The component to render when an error is caught. */
|
|
68
|
-
fallbackComponent
|
|
69
|
+
fallbackComponent?: (...args: unknown[]) => ReactNode;
|
|
70
|
+
/**
|
|
71
|
+
* Pre-rendered fallback element. Used for MDX status files which are server
|
|
72
|
+
* components and cannot be passed as function props across the RSC→client
|
|
73
|
+
* boundary. When set, rendered directly instead of calling fallbackComponent.
|
|
74
|
+
*
|
|
75
|
+
* See design/10-error-handling.md §"Status-Code File Variants" — MDX status
|
|
76
|
+
* files are server components by default (zero client JS).
|
|
77
|
+
*/
|
|
78
|
+
fallbackElement?: ReactNode;
|
|
69
79
|
/**
|
|
70
80
|
* Status code filter. If set, only catches errors matching this status.
|
|
71
81
|
* 400 = any 4xx, 500 = any 5xx, specific number = exact match.
|
|
72
82
|
*/
|
|
73
83
|
status?: number;
|
|
74
84
|
/**
|
|
75
|
-
* When true,
|
|
76
|
-
*
|
|
77
|
-
* boundaries should set this — segment boundaries (403.tsx, 4xx.tsx,
|
|
78
|
-
* error.tsx) must NOT, otherwise normal page denies get swallowed.
|
|
85
|
+
* When true, this boundary wraps a parallel slot. Slot denials are
|
|
86
|
+
* graceful degradation — they must NOT change the HTTP status code.
|
|
79
87
|
*/
|
|
80
88
|
isSlotBoundary?: boolean;
|
|
81
89
|
children: ReactNode;
|
|
@@ -86,6 +94,20 @@ interface TimberErrorBoundaryState {
|
|
|
86
94
|
error: Error | null;
|
|
87
95
|
}
|
|
88
96
|
|
|
97
|
+
// Module-level guard: the first boundary to catch a given redirect digest
|
|
98
|
+
// schedules the navigation and marks it handled here. Subsequent renders
|
|
99
|
+
// (React retries the error-boundary render path multiple times in dev, and
|
|
100
|
+
// outer boundaries that also see the error) become no-ops, preventing
|
|
101
|
+
// duplicate router.navigate() calls.
|
|
102
|
+
const _handledRedirects = new WeakSet<object>();
|
|
103
|
+
|
|
104
|
+
// Companion guard keyed by location: client-render redirect() (the
|
|
105
|
+
// next/navigation shim) throws a FRESH error instance on every render
|
|
106
|
+
// attempt, and React replays the errored render — so the WeakSet alone
|
|
107
|
+
// would schedule the navigation twice. While a navigation to a location
|
|
108
|
+
// is pending, further redirect errors for the same location are no-ops.
|
|
109
|
+
let _pendingRedirectLocation: string | null = null;
|
|
110
|
+
|
|
89
111
|
// ─── Component ───────────────────────────────────────────────────────────────
|
|
90
112
|
|
|
91
113
|
export class TimberErrorBoundary extends Component<
|
|
@@ -131,11 +153,55 @@ export class TimberErrorBoundary extends Component<
|
|
|
131
153
|
const error = this.state.error;
|
|
132
154
|
const parsed = parseDigest(error);
|
|
133
155
|
|
|
134
|
-
// RedirectSignal
|
|
135
|
-
//
|
|
136
|
-
//
|
|
156
|
+
// RedirectSignal handling splits by environment:
|
|
157
|
+
//
|
|
158
|
+
// - SSR (no window): re-throw so the Fizz shell fails and the server
|
|
159
|
+
// pipeline catch block can produce a proper HTTP 3xx response. See
|
|
160
|
+
// design/04-authorization.md.
|
|
161
|
+
//
|
|
162
|
+
// - Client (window exists): a RedirectSignal that leaked into the RSC
|
|
163
|
+
// Flight payload during client navigation would otherwise bubble past
|
|
164
|
+
// every error boundary to `window.onerror`, which in dev triggers the
|
|
165
|
+
// Vite error overlay (false positive — navigation itself works).
|
|
166
|
+
// Instead, ask the router to perform an SPA navigation to the target
|
|
167
|
+
// and render nothing while it takes over. The router's own catch path
|
|
168
|
+
// handles cross-origin / hard navigations. See TIM-838.
|
|
137
169
|
if (parsed?.type === 'redirect') {
|
|
138
|
-
|
|
170
|
+
if (typeof window === 'undefined') {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
// Dedupe: React may render the error-boundary fallback path more
|
|
174
|
+
// than once for a single caught error (dev-mode double render, and
|
|
175
|
+
// additional boundaries above us in the tree). Only schedule the
|
|
176
|
+
// navigation on the first render that sees this error instance.
|
|
177
|
+
const alreadyHandled =
|
|
178
|
+
_handledRedirects.has(error) || _pendingRedirectLocation === parsed.location;
|
|
179
|
+
if (!alreadyHandled) {
|
|
180
|
+
_handledRedirects.add(error);
|
|
181
|
+
const router = getRouterOrNull();
|
|
182
|
+
if (router) {
|
|
183
|
+
_pendingRedirectLocation = parsed.location;
|
|
184
|
+
// Schedule the navigation outside the render phase to avoid
|
|
185
|
+
// setState-during-render warnings from router state updates.
|
|
186
|
+
queueMicrotask(() => {
|
|
187
|
+
router
|
|
188
|
+
.navigate(parsed.location, { replace: true })
|
|
189
|
+
.catch(() => {
|
|
190
|
+
// Fall back to a hard navigation if the soft navigation fails.
|
|
191
|
+
window.location.href = parsed.location;
|
|
192
|
+
})
|
|
193
|
+
.finally(() => {
|
|
194
|
+
_pendingRedirectLocation = null;
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
} else {
|
|
198
|
+
// No router available (shouldn't happen post-bootstrap) — fall
|
|
199
|
+
// back to a hard navigation so the user still ends up at the
|
|
200
|
+
// target.
|
|
201
|
+
window.location.href = parsed.location;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
139
205
|
}
|
|
140
206
|
|
|
141
207
|
// If this boundary has a status filter, check whether the error matches.
|
|
@@ -148,23 +214,62 @@ export class TimberErrorBoundary extends Component<
|
|
|
148
214
|
}
|
|
149
215
|
}
|
|
150
216
|
|
|
151
|
-
// Report DenySignal handling
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
217
|
+
// Report DenySignal handling so the pipeline skips the redundant
|
|
218
|
+
// renderDenyPage() re-render — but ONLY when this boundary can fully
|
|
219
|
+
// handle the deny in-tree:
|
|
220
|
+
//
|
|
221
|
+
// ✅ TSX boundaries (fallbackComponent) — can receive runtime props
|
|
222
|
+
// (status, dangerouslyPassData) dynamically in render()
|
|
223
|
+
// ❌ MDX boundaries (fallbackElement) — pre-rendered at tree-build time,
|
|
224
|
+
// cannot receive runtime deny props. Must fall through to re-render.
|
|
225
|
+
//
|
|
226
|
+
// For qualifying segment boundaries: also set the HTTP status code from
|
|
227
|
+
// the DenySignal so the Response has the correct 4xx status. This runs
|
|
228
|
+
// synchronously during Fizz rendering, BEFORE onShellReady.
|
|
229
|
+
//
|
|
230
|
+
// For slot boundaries: set _denyHandledByBoundary but do NOT change
|
|
231
|
+
// statusCode — slot denials are graceful degradation.
|
|
232
|
+
//
|
|
233
|
+
// See TIM-664, LOCAL-298.
|
|
234
|
+
if (parsed?.type === 'deny') {
|
|
235
|
+
const canHandleInTree = this.props.fallbackElement == null;
|
|
236
|
+
|
|
237
|
+
if (canHandleInTree || this.props.isSlotBoundary) {
|
|
238
|
+
const ssrData = getSsrData();
|
|
239
|
+
if (ssrData?._navContext) {
|
|
240
|
+
ssrData._navContext._denyHandledByBoundary = true;
|
|
241
|
+
if (!this.props.isSlotBoundary) {
|
|
242
|
+
ssrData._navContext.statusCode = parsed.status;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
162
245
|
}
|
|
163
246
|
}
|
|
164
247
|
|
|
248
|
+
// Pre-rendered fallback element (MDX status files) — render directly.
|
|
249
|
+
// MDX components are server components that cannot be passed as function
|
|
250
|
+
// props across the RSC→client boundary. Instead, they are pre-rendered
|
|
251
|
+
// as elements in the RSC environment and passed here as fallbackElement.
|
|
252
|
+
if (this.props.fallbackElement != null) {
|
|
253
|
+
return this.props.fallbackElement;
|
|
254
|
+
}
|
|
255
|
+
|
|
165
256
|
// Render the fallback component with the right props shape.
|
|
166
257
|
if (parsed?.type === 'deny') {
|
|
258
|
+
// Status-code file boundaries (404.tsx, 4xx.tsx, …) get the documented
|
|
259
|
+
// 4xx props. error.tsx boundaries (no status filter) get their
|
|
260
|
+
// documented { error, digest, reset } contract — plus the deny extras
|
|
261
|
+
// for dual-shape implementations. Without the error prop, an error.tsx
|
|
262
|
+
// reading error.message crashes on deny fall-through. See TIM-1081.
|
|
263
|
+
if (this.props.status != null) {
|
|
264
|
+
return createElement(this.props.fallbackComponent as never, {
|
|
265
|
+
status: parsed.status,
|
|
266
|
+
dangerouslyPassData: parsed.data,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
167
269
|
return createElement(this.props.fallbackComponent as never, {
|
|
270
|
+
error,
|
|
271
|
+
digest: null,
|
|
272
|
+
reset: this.reset,
|
|
168
273
|
status: parsed.status,
|
|
169
274
|
dangerouslyPassData: parsed.data,
|
|
170
275
|
});
|
|
@@ -196,8 +301,8 @@ function parseDigest(error: Error): ParsedDigest | null {
|
|
|
196
301
|
if (parsed && typeof parsed === 'object' && typeof parsed.type === 'string') {
|
|
197
302
|
return parsed as ParsedDigest;
|
|
198
303
|
}
|
|
199
|
-
} catch {
|
|
200
|
-
|
|
304
|
+
} catch (e) {
|
|
305
|
+
console.debug('[timber] error digest is not valid JSON:', e instanceof Error ? e.message : e);
|
|
201
306
|
}
|
|
202
307
|
return null;
|
|
203
308
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Reconstitutes a SerializableError into a real Error instance before
|
|
5
|
+
* passing to the user's error component.
|
|
6
|
+
*
|
|
7
|
+
* TSX error pages are 'use client' components that receive { error: Error, digest, reset }.
|
|
8
|
+
* Error objects are not RSC-serializable (React Flight throws "Only plain objects
|
|
9
|
+
* can be passed to Client Components"). This wrapper receives the error as a plain
|
|
10
|
+
* SerializableError object, reconstitutes a real Error instance, and passes it
|
|
11
|
+
* to the user's error component — ensuring error instanceof Error works correctly.
|
|
12
|
+
*
|
|
13
|
+
* See design/spike-TIM-565-unify-error-pages.md §"Edge Case B"
|
|
14
|
+
* See design/10-error-handling.md §"RSC → SSR for Error Pages via SerializableError"
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createElement, type ReactNode, type ComponentType } from 'react';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Plain-object representation of an Error that can cross the RSC → client boundary.
|
|
21
|
+
* Stack is only included in dev mode (gated by isDevMode() on the server).
|
|
22
|
+
*/
|
|
23
|
+
export interface SerializableError {
|
|
24
|
+
message: string;
|
|
25
|
+
name: string;
|
|
26
|
+
stack?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Props for the ErrorReconstituter wrapper component.
|
|
31
|
+
* All props are RSC-serializable:
|
|
32
|
+
* - error: plain object (SerializableError)
|
|
33
|
+
* - digest: plain JSON or null
|
|
34
|
+
* - reset: undefined (only meaningful on client after boundary catch)
|
|
35
|
+
* - component: client module reference (RSC Flight serializes as opaque ref)
|
|
36
|
+
* - status / dangerouslyPassData: set only when error.tsx serves a deny()
|
|
37
|
+
* as the last entry in the 4xx fallback chain — forwarded so dual-shape
|
|
38
|
+
* error.tsx implementations can branch on the deny status (TIM-1081)
|
|
39
|
+
*/
|
|
40
|
+
interface ErrorReconstituterProps {
|
|
41
|
+
error: SerializableError;
|
|
42
|
+
digest: { code: string; data: unknown } | null;
|
|
43
|
+
reset: undefined;
|
|
44
|
+
component: ComponentType<{
|
|
45
|
+
error: Error;
|
|
46
|
+
digest: { code: string; data: unknown } | null;
|
|
47
|
+
reset: (() => void) | undefined;
|
|
48
|
+
status?: number;
|
|
49
|
+
dangerouslyPassData?: unknown;
|
|
50
|
+
}>;
|
|
51
|
+
status?: number;
|
|
52
|
+
dangerouslyPassData?: unknown;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Reconstitute a SerializableError into a real Error instance and render
|
|
57
|
+
* the user's error component with the proper props.
|
|
58
|
+
*/
|
|
59
|
+
export function ErrorReconstituter({
|
|
60
|
+
error: serialized,
|
|
61
|
+
digest,
|
|
62
|
+
reset,
|
|
63
|
+
component,
|
|
64
|
+
status,
|
|
65
|
+
dangerouslyPassData,
|
|
66
|
+
}: ErrorReconstituterProps): ReactNode {
|
|
67
|
+
// Reconstitute a real Error so instanceof checks work in user code
|
|
68
|
+
const error = Object.assign(new Error(serialized.message), {
|
|
69
|
+
name: serialized.name,
|
|
70
|
+
...(serialized.stack != null ? { stack: serialized.stack } : {}),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return createElement(component, {
|
|
74
|
+
error,
|
|
75
|
+
digest,
|
|
76
|
+
reset,
|
|
77
|
+
...(status != null ? { status, dangerouslyPassData } : {}),
|
|
78
|
+
});
|
|
79
|
+
}
|
package/src/client/form.tsx
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { useActionState as reactUseActionState, useTransition } from 'react';
|
|
15
|
-
import type { ActionResult, ValidationErrors } from '
|
|
16
|
-
import type { FormFlashData } from '
|
|
15
|
+
import type { ActionFn, ActionResult, InputHint, ValidationErrors } from '../server/action-client';
|
|
16
|
+
import type { FormFlashData } from '../server/form-flash';
|
|
17
17
|
|
|
18
18
|
// ─── Types ───────────────────────────────────────────────────────────────
|
|
19
19
|
|
|
@@ -27,13 +27,15 @@ export type UseActionStateFn<TData> = (
|
|
|
27
27
|
) => Promise<ActionResult<TData>>;
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
* Return type of useActionState
|
|
31
|
-
* [result, formAction, isPending]
|
|
30
|
+
* Return type of useActionState.
|
|
31
|
+
* [result, formAction, isPending, errors]
|
|
32
|
+
* The 4th element is auto-derived from result via useFormErrors logic.
|
|
32
33
|
*/
|
|
33
34
|
export type UseActionStateReturn<TData> = [
|
|
34
35
|
result: ActionResult<TData> | null,
|
|
35
36
|
formAction: (formData: FormData) => void,
|
|
36
37
|
isPending: boolean,
|
|
38
|
+
errors: FormErrorsResult,
|
|
37
39
|
];
|
|
38
40
|
|
|
39
41
|
// ─── useActionState ──────────────────────────────────────────────────────
|
|
@@ -73,7 +75,13 @@ export function useActionState<TData>(
|
|
|
73
75
|
): UseActionStateReturn<TData> {
|
|
74
76
|
// FormFlashData is structurally compatible with ActionResult at runtime —
|
|
75
77
|
// the cast satisfies React's generic inference which would otherwise widen TData.
|
|
76
|
-
|
|
78
|
+
const [result, formAction, isPending] = reactUseActionState(
|
|
79
|
+
action,
|
|
80
|
+
initialState as ActionResult<TData> | null,
|
|
81
|
+
permalink
|
|
82
|
+
);
|
|
83
|
+
const errors = deriveFormErrors(result);
|
|
84
|
+
return [result, formAction, isPending, errors];
|
|
77
85
|
}
|
|
78
86
|
|
|
79
87
|
// ─── useFormAction ───────────────────────────────────────────────────────
|
|
@@ -90,15 +98,22 @@ export function useActionState<TData>(
|
|
|
90
98
|
* </button>
|
|
91
99
|
* ```
|
|
92
100
|
*/
|
|
93
|
-
export function useFormAction<TData>(
|
|
94
|
-
action: (input:
|
|
95
|
-
): [
|
|
101
|
+
export function useFormAction<TData = unknown, TInput = unknown>(
|
|
102
|
+
action: ActionFn<TData, TInput> | ((input: TInput) => Promise<ActionResult<TData>>)
|
|
103
|
+
): [
|
|
104
|
+
(
|
|
105
|
+
...args: undefined extends TInput ? [input?: InputHint<TInput>] : [input: InputHint<TInput>]
|
|
106
|
+
) => Promise<ActionResult<TData>>,
|
|
107
|
+
boolean,
|
|
108
|
+
] {
|
|
96
109
|
const [isPending, startTransition] = useTransition();
|
|
97
110
|
|
|
98
|
-
const execute = (input?:
|
|
111
|
+
const execute = (input?: InputHint<TInput>): Promise<ActionResult<TData>> => {
|
|
99
112
|
return new Promise((resolve) => {
|
|
100
113
|
startTransition(async () => {
|
|
101
|
-
const result = await action(input)
|
|
114
|
+
const result = await (action as (input: InputHint<TInput>) => Promise<ActionResult<TData>>)(
|
|
115
|
+
input as InputHint<TInput>
|
|
116
|
+
);
|
|
102
117
|
resolve(result);
|
|
103
118
|
});
|
|
104
119
|
});
|
|
@@ -107,9 +122,9 @@ export function useFormAction<TData>(
|
|
|
107
122
|
return [execute, isPending];
|
|
108
123
|
}
|
|
109
124
|
|
|
110
|
-
// ───
|
|
125
|
+
// ─── Form error extraction ────────────────────────────────────────────────
|
|
111
126
|
|
|
112
|
-
/** Return type of
|
|
127
|
+
/** Return type of the errors element in useActionState. */
|
|
113
128
|
export interface FormErrorsResult {
|
|
114
129
|
/** Per-field validation errors keyed by field name. */
|
|
115
130
|
fieldErrors: Record<string, string[]>;
|
|
@@ -124,27 +139,11 @@ export interface FormErrorsResult {
|
|
|
124
139
|
}
|
|
125
140
|
|
|
126
141
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* since it's used in render. Accepts the result from `useActionState`
|
|
131
|
-
* or flash data from `getFormFlash()`.
|
|
132
|
-
*
|
|
133
|
-
* @example
|
|
134
|
-
* ```tsx
|
|
135
|
-
* const [result, action, isPending] = useActionState(createTodo, null)
|
|
136
|
-
* const errors = useFormErrors(result)
|
|
137
|
-
*
|
|
138
|
-
* return (
|
|
139
|
-
* <form action={action}>
|
|
140
|
-
* <input name="title" />
|
|
141
|
-
* {errors.getFieldError('title') && <p>{errors.getFieldError('title')}</p>}
|
|
142
|
-
* {errors.formErrors.map(e => <p key={e}>{e}</p>)}
|
|
143
|
-
* </form>
|
|
144
|
-
* )
|
|
145
|
-
* ```
|
|
142
|
+
* Derive FormErrorsResult from an action result.
|
|
143
|
+
* Used internally by useActionState 4th tuple element.
|
|
144
|
+
* @internal — exported for test access only.
|
|
146
145
|
*/
|
|
147
|
-
export function
|
|
146
|
+
export function deriveFormErrors<TData>(
|
|
148
147
|
result:
|
|
149
148
|
| ActionResult<TData>
|
|
150
149
|
| {
|
package/src/client/history.ts
CHANGED
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
// History Stack — stores RSC payloads by URL for instant back/forward navigation
|
|
2
2
|
// See design/19-client-navigation.md § History Stack
|
|
3
3
|
|
|
4
|
-
import type {
|
|
4
|
+
import type { SegmentInfo } from './segment-cache';
|
|
5
5
|
|
|
6
6
|
// ─── Types ───────────────────────────────────────────────────────
|
|
7
7
|
|
|
8
8
|
export interface HistoryEntry {
|
|
9
9
|
/** The complete segment tree payload at the time of navigation */
|
|
10
10
|
payload: unknown;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Route params for this page (for useSegmentParams). Every entry that can
|
|
13
|
+
* be replayed must carry them — the initial SSR entry gets them from the
|
|
14
|
+
* server-embedded __timber_params, navigation entries from X-Timber-Params,
|
|
15
|
+
* and revalidation overwrites preserve the current state (TIM-1037).
|
|
16
|
+
*/
|
|
14
17
|
params?: Record<string, string | string[]> | null;
|
|
18
|
+
/**
|
|
19
|
+
* Segment metadata for this page's route. Restored into the segment cache
|
|
20
|
+
* on popstate cached replay so the next forward navigation computes a
|
|
21
|
+
* correct state tree. Without this, the segment cache retains the
|
|
22
|
+
* *previous* page's segments after back-button, causing the server to
|
|
23
|
+
* skip segments that aren't mounted — and the partial payload targets
|
|
24
|
+
* a non-existent outlet.
|
|
25
|
+
*/
|
|
26
|
+
segmentInfo?: SegmentInfo[] | null;
|
|
15
27
|
}
|
|
16
28
|
|
|
17
29
|
// ─── History Stack ───────────────────────────────────────────────
|
|
@@ -23,8 +35,11 @@ export interface HistoryEntry {
|
|
|
23
35
|
* On forward navigation, the new page's payload is pushed onto the stack.
|
|
24
36
|
* On popstate, the cached payload is replayed instantly.
|
|
25
37
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
38
|
+
* Entries are keyed by pathname + search. Used with the History API
|
|
39
|
+
* fallback and the Navigation API.
|
|
40
|
+
*
|
|
41
|
+
* Scroll positions are stored in history.state or Navigation API entry
|
|
42
|
+
* state, not in this stack — see design/19-client-navigation.md §Scroll Restoration.
|
|
28
43
|
*
|
|
29
44
|
* Entries persist for the session duration (no expiry) and are cleared
|
|
30
45
|
* when the tab is closed — matching browser back-button behavior.
|
package/src/client/index.ts
CHANGED
|
@@ -1,64 +1,86 @@
|
|
|
1
1
|
// @timber-js/app/client — Client-side primitives
|
|
2
2
|
// These are the primary imports for client components.
|
|
3
|
+
//
|
|
4
|
+
// Framework-internal bootstrap, SSR bridge, and segment plumbing is in
|
|
5
|
+
// #client-internal (Node package import).
|
|
6
|
+
// Design doc: design/triage/api-naming-spike.md §8.5
|
|
3
7
|
|
|
4
|
-
|
|
8
|
+
// JsonSerializable moved to @timber-js/app/codec as the single canonical path.
|
|
9
|
+
// Re-export removed per TIM-721.
|
|
10
|
+
export type { RenderErrorDigest } from './types';
|
|
5
11
|
|
|
6
12
|
// Navigation
|
|
7
13
|
export { Link, interpolateParams, resolveHref, validateLinkHref, buildLinkProps } from './link';
|
|
8
|
-
export
|
|
9
|
-
export type {
|
|
10
|
-
export {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
export { mergePreservedSearchParams } from '../shared/merge-search-params.js';
|
|
15
|
+
export type { LinkProps, LinkPropsWithHref, LinkPropsWithParams, LinkBaseProps } from './link';
|
|
16
|
+
export type { LinkSegmentParams, OnNavigateHandler, OnNavigateEvent } from './link';
|
|
17
|
+
|
|
18
|
+
// ─── LinkFunction (originally declared here for module augmentation) ───
|
|
19
|
+
//
|
|
20
|
+
// The codegen emits TWO augmentations of this interface:
|
|
21
|
+
//
|
|
22
|
+
// 1. Per-route call signatures — `href: '/products/[id]'` with direct
|
|
23
|
+
// `segmentParams`/`searchParams` types.
|
|
24
|
+
// 2. Catch-all call signatures — `ExternalHref` + computed `string`
|
|
25
|
+
// variable hrefs.
|
|
26
|
+
//
|
|
27
|
+
// Both live in the codegen output (NOT here). Overload ORDER matters
|
|
28
|
+
// for error UX, and TypeScript's declaration-merging rule "later overload
|
|
29
|
+
// sets ordered first" means that whichever augmentation block is
|
|
30
|
+
// declared LATER in the codegen file ends up FIRST in the merged call-
|
|
31
|
+
// signature list — and therefore the EARLIER block ends up LAST, which
|
|
32
|
+
// is the overload whose error message TypeScript reports when no
|
|
33
|
+
// overload matches.
|
|
34
|
+
//
|
|
35
|
+
// We want the PER-ROUTE overloads to be the error-reporting ones when
|
|
36
|
+
// a user passes a known literal `href` with a mistyped segmentParam.
|
|
37
|
+
// So the codegen emits them FIRST and the catch-all SECOND. That way
|
|
38
|
+
// a call like:
|
|
39
|
+
//
|
|
40
|
+
// <Link href="/products/[id]" segmentParams={{ id: maybeUndef }} />
|
|
41
|
+
//
|
|
42
|
+
// reports the actual mismatch (`'string | undefined' is not assignable
|
|
43
|
+
// to 'string | number'` on `id`) instead of the notorious "Type 'string'
|
|
44
|
+
// is not assignable to type 'never'" cascade that the old fixed
|
|
45
|
+
// catch-all produced (TIM-832, sibling of TIM-830 / TIM-624).
|
|
46
|
+
//
|
|
47
|
+
// The interface is kept as an empty placeholder here so:
|
|
48
|
+
// - module augmentation has a base interface to merge into
|
|
49
|
+
// - `link.tsx` can `import type { LinkFunction }` and use it as the
|
|
50
|
+
// cast target for the `Link` const (an empty interface accepts any
|
|
51
|
+
// non-nullable value, so the cast is valid even without codegen run)
|
|
52
|
+
// - NO call signatures live here — in a fresh checkout where codegen
|
|
53
|
+
// hasn't run yet, invoking `<Link>` is deliberately a type error,
|
|
54
|
+
// which surfaces "codegen hasn't run" rather than a misleading
|
|
55
|
+
// structural type mismatch.
|
|
56
|
+
//
|
|
57
|
+
// See TIM-624 (original typed Link), TIM-830 (flat searchParams), and
|
|
58
|
+
// TIM-832 (this restructure for overload error UX).
|
|
59
|
+
// eslint-disable-next-line typescript/no-empty-interface -- augmented by codegen
|
|
60
|
+
export interface LinkFunction {
|
|
61
|
+
// intentionally empty — call signatures are provided via codegen
|
|
62
|
+
// augmentation in `.timber/timber-routes.d.ts`.
|
|
63
|
+
}
|
|
64
|
+
export { usePendingNavigation } from './use-pending-navigation';
|
|
19
65
|
export { useLinkStatus, LinkStatusContext } from './use-link-status';
|
|
20
66
|
export type { LinkStatus } from './use-link-status';
|
|
21
|
-
export { getRouter, setGlobalRouter } from './router-ref';
|
|
22
67
|
export { useRouter } from './use-router';
|
|
23
68
|
export type { AppRouterInstance } from './use-router';
|
|
24
69
|
export { usePathname } from './use-pathname';
|
|
25
|
-
export {
|
|
70
|
+
export { replaceUrl } from './shallow-url';
|
|
71
|
+
// useSearchParams removed from public exports — lives in next/navigation shim only.
|
|
26
72
|
export { useSelectedLayoutSegment, useSelectedLayoutSegments } from './use-selected-layout-segment';
|
|
27
73
|
|
|
28
|
-
// Segment context (internal, used by rsc-entry to inject layout position)
|
|
29
|
-
export { SegmentProvider, useSegmentContext } from './segment-context';
|
|
30
|
-
export type { SegmentContextValue } from './segment-context';
|
|
31
|
-
|
|
32
|
-
// Segment cache (internal, but exported for advanced use)
|
|
33
|
-
export { SegmentCache, PrefetchCache } from './segment-cache';
|
|
34
|
-
export type { SegmentNode, StateTree } from './segment-cache';
|
|
35
|
-
|
|
36
|
-
// History (internal, but exported for advanced use)
|
|
37
|
-
export { HistoryStack } from './history';
|
|
38
|
-
export type { HistoryEntry } from './history';
|
|
39
|
-
|
|
40
74
|
// Forms
|
|
41
|
-
export { useActionState, useFormAction
|
|
75
|
+
export { useActionState, useFormAction } from './form';
|
|
42
76
|
export type { UseActionStateFn, UseActionStateReturn, FormErrorsResult } from './form';
|
|
43
77
|
|
|
44
|
-
// Params
|
|
45
|
-
export {
|
|
78
|
+
// Params — raw hook for untyped access. For typed params, use defineSegmentParams().useSegmentParams().
|
|
79
|
+
export { useSegmentParams } from './use-segment-params';
|
|
46
80
|
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
export type { NavigationState } from './navigation-context';
|
|
81
|
+
// Query states — useQueryStates lives on defineSearchParams().useQueryStates()
|
|
82
|
+
// and is available via direct import for advanced cases.
|
|
50
83
|
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Cookies
|
|
55
|
-
export { useCookie } from './use-cookie';
|
|
84
|
+
// Cookies — useCookie lives on defineCookie().useCookie().
|
|
85
|
+
// Types still exported for advanced use.
|
|
56
86
|
export type { ClientCookieOptions, CookieSetter } from './use-cookie';
|
|
57
|
-
|
|
58
|
-
// SSR data (framework-internal, used by ssr-entry to provide request data to hooks)
|
|
59
|
-
export { setSsrData, clearSsrData, getSsrData } from './ssr-data';
|
|
60
|
-
export type { SsrData } from './ssr-data';
|
|
61
|
-
|
|
62
|
-
// Error boundary (framework-internal, used by tree-builder and rsc-entry)
|
|
63
|
-
export { TimberErrorBoundary } from './error-boundary';
|
|
64
|
-
export type { TimberErrorBoundaryProps } from './error-boundary';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// #client-internal — Framework-internal client exports
|
|
2
|
+
//
|
|
3
|
+
// This module is a Node package import (#client-internal in package.json
|
|
4
|
+
// "imports" field). It is only resolvable from within @timber-js/app —
|
|
5
|
+
// external consumers cannot import it.
|
|
6
|
+
//
|
|
7
|
+
// These exports are consumed by browser-entry, ssr-entry, and build plugins.
|
|
8
|
+
// They are NOT part of the user-facing API and should not appear in
|
|
9
|
+
// documentation or autocomplete for application developers.
|
|
10
|
+
//
|
|
11
|
+
// Design doc: design/triage/api-naming-spike.md §8.5
|
|
12
|
+
|
|
13
|
+
// ── Bootstrap ────────────────────────────────────────────────────────────
|
|
14
|
+
export { createRouter } from './router.js';
|
|
15
|
+
export type {
|
|
16
|
+
RouterInstance,
|
|
17
|
+
NavigationOptions,
|
|
18
|
+
RouterDeps,
|
|
19
|
+
RouterPhase,
|
|
20
|
+
RscDecoder,
|
|
21
|
+
RootRenderer,
|
|
22
|
+
} from './router.js';
|
|
23
|
+
export { getRouter, getRouterOrNull, setGlobalRouter } from './router-ref.js';
|
|
24
|
+
|
|
25
|
+
// ── SSR bridge ───────────────────────────────────────────────────────────
|
|
26
|
+
export { setSsrData, clearSsrData, getSsrData } from './ssr-data.js';
|
|
27
|
+
export type { SsrData } from './ssr-data.js';
|
|
28
|
+
|
|
29
|
+
// ── Segment context ──────────────────────────────────────────────────────
|
|
30
|
+
export { SegmentProvider, useSegmentContext } from './segment-context.js';
|
|
31
|
+
export type { SegmentContextValue } from './segment-context.js';
|
|
32
|
+
|
|
33
|
+
// ── Segment cache ────────────────────────────────────────────────────────
|
|
34
|
+
export { SegmentCache, PrefetchCache } from './segment-cache.js';
|
|
35
|
+
export type { SegmentNode, StateTree } from './segment-cache.js';
|
|
36
|
+
|
|
37
|
+
// ── History ──────────────────────────────────────────────────────────────
|
|
38
|
+
export { HistoryStack } from './history.js';
|
|
39
|
+
export type { HistoryEntry } from './history.js';
|
|
40
|
+
|
|
41
|
+
// ── Params (internal setter + raw hooks) ─────────────────────────────────
|
|
42
|
+
export { setCurrentParams } from './use-segment-params.js';
|
|
43
|
+
export { useSearchParams } from './use-search-params.js';
|
|
44
|
+
|
|
45
|
+
// ── Navigation context ───────────────────────────────────────────────────
|
|
46
|
+
export {
|
|
47
|
+
NavigationProvider,
|
|
48
|
+
getNavigationState,
|
|
49
|
+
setNavigationState,
|
|
50
|
+
} from './navigation-context.js';
|
|
51
|
+
export type { NavigationState } from './navigation-context.js';
|
|
52
|
+
|
|
53
|
+
// ── Query states (internal binder) ───────────────────────────────────────
|
|
54
|
+
export { bindUseQueryStates } from './use-query-states.js';
|
|
55
|
+
|
|
56
|
+
// ── Error boundary ───────────────────────────────────────────────────────
|
|
57
|
+
export { TimberErrorBoundary } from './error-boundary.js';
|
|
58
|
+
export type { TimberErrorBoundaryProps } from './error-boundary.js';
|