@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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Hydration Wiring — history stack, segment cache, popstate, scroll.
|
|
3
|
+
*
|
|
4
|
+
* Sets up everything that needs to happen after the React root exists:
|
|
5
|
+
* - Stores initial page in history stack for instant back navigation
|
|
6
|
+
* - Initializes scroll state for the initial entry
|
|
7
|
+
* - Populates segment cache from server-embedded metadata
|
|
8
|
+
* - Registers popstate handler for back/forward navigation
|
|
9
|
+
* - Sets up debounced scroll position saving
|
|
10
|
+
*
|
|
11
|
+
* See design/19-client-navigation.md §"History Stack"
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { RouterInstance } from '#client-internal';
|
|
15
|
+
import { getNavigationState } from '../navigation-context.js';
|
|
16
|
+
import type { NavigationApiController } from '../navigation-api.js';
|
|
17
|
+
import { getScrollY } from './scroll.js';
|
|
18
|
+
|
|
19
|
+
interface PostHydrationOptions {
|
|
20
|
+
router: RouterInstance;
|
|
21
|
+
navApiController: NavigationApiController | null;
|
|
22
|
+
/** Decoded RSC element from initial SSR (null if no RSC payload) */
|
|
23
|
+
initialElement: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Wire up post-hydration event handlers and state.
|
|
28
|
+
*/
|
|
29
|
+
export function setupPostHydration({
|
|
30
|
+
router,
|
|
31
|
+
navApiController,
|
|
32
|
+
initialElement,
|
|
33
|
+
}: PostHydrationOptions): void {
|
|
34
|
+
// Store the initial page in the history stack so back-button works
|
|
35
|
+
// after the first navigation. We store the decoded RSC element so
|
|
36
|
+
// back navigation can replay it instantly without a server fetch.
|
|
37
|
+
// Params were captured from the server-embedded __timber_params by
|
|
38
|
+
// runPreHydration() — without them on the entry, the cached replay on
|
|
39
|
+
// back-navigation would normalize params to {} and wipe every
|
|
40
|
+
// useSegmentParams() consumer on the initial page (TIM-1037).
|
|
41
|
+
// Populate the segment cache from server-embedded segment metadata.
|
|
42
|
+
// This enables state tree diffing from the very first client navigation.
|
|
43
|
+
// See design/19-client-navigation.md §"X-Timber-State-Tree Header"
|
|
44
|
+
const timberSegments = (self as unknown as Record<string, unknown>).__timber_segments;
|
|
45
|
+
const initialSegmentInfo = Array.isArray(timberSegments)
|
|
46
|
+
? (timberSegments as import('../segment-cache').SegmentInfo[])
|
|
47
|
+
: null;
|
|
48
|
+
if (initialSegmentInfo) {
|
|
49
|
+
router.initSegmentCache(initialSegmentInfo);
|
|
50
|
+
delete (self as unknown as Record<string, unknown>).__timber_segments;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Store the initial page in the history stack so back-button works
|
|
54
|
+
// after the first navigation. Include segmentInfo so the segment
|
|
55
|
+
// cache is restored correctly on popstate cached replay.
|
|
56
|
+
router.historyStack.push(window.location.pathname + window.location.search, {
|
|
57
|
+
payload: initialElement,
|
|
58
|
+
params: getNavigationState().params,
|
|
59
|
+
segmentInfo: initialSegmentInfo,
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Initialize scroll state for the initial entry.
|
|
63
|
+
// When Navigation API is available, use per-entry state.
|
|
64
|
+
// Otherwise fall back to history.state.
|
|
65
|
+
if (navApiController) {
|
|
66
|
+
navApiController.saveScrollPosition(0);
|
|
67
|
+
} else {
|
|
68
|
+
window.history.replaceState({ timber: true, scrollY: 0 }, '');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Register popstate handler for back/forward navigation.
|
|
72
|
+
// When Navigation API is active, the navigate event covers traversals —
|
|
73
|
+
// popstate is a no-op. When unavailable, popstate handles back/forward.
|
|
74
|
+
//
|
|
75
|
+
// Use pathname+search (not full href) to match the URL format used by
|
|
76
|
+
// navigate() — Link hrefs are relative paths like "/scroll-test/page-a".
|
|
77
|
+
// Read scrollY from history.state — the browser maintains per-entry state
|
|
78
|
+
// so duplicate URLs in history each have their own scroll position.
|
|
79
|
+
window.addEventListener('popstate', () => {
|
|
80
|
+
// Navigation API handles traversals via the navigate event.
|
|
81
|
+
if (navApiController) return;
|
|
82
|
+
|
|
83
|
+
const state = window.history.state;
|
|
84
|
+
const scrollY = state && typeof state.scrollY === 'number' ? state.scrollY : 0;
|
|
85
|
+
void router.handlePopState(window.location.pathname + window.location.search, scrollY);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Keep scroll position up to date as the user scrolls.
|
|
89
|
+
// This ensures that when the user presses back/forward, the departing
|
|
90
|
+
// page's scroll position is already saved in its history entry.
|
|
91
|
+
// When Navigation API is available, uses per-entry state via
|
|
92
|
+
// navigation.updateCurrentEntry(). Otherwise falls back to history.state.
|
|
93
|
+
// Debounced to avoid excessive state updates during smooth scrolling.
|
|
94
|
+
let scrollTimer: ReturnType<typeof setTimeout>;
|
|
95
|
+
function saveScrollPosition(): void {
|
|
96
|
+
clearTimeout(scrollTimer);
|
|
97
|
+
scrollTimer = setTimeout(() => {
|
|
98
|
+
const y = getScrollY();
|
|
99
|
+
if (navApiController) {
|
|
100
|
+
navApiController.saveScrollPosition(y);
|
|
101
|
+
} else {
|
|
102
|
+
const state = window.history.state;
|
|
103
|
+
if (state && typeof state === 'object') {
|
|
104
|
+
window.history.replaceState({ ...state, scrollY: y }, '');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}, 100);
|
|
108
|
+
}
|
|
109
|
+
window.addEventListener('scroll', saveScrollPosition, { passive: true });
|
|
110
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router Initialization — creates the timber router with all dependencies.
|
|
3
|
+
*
|
|
4
|
+
* Wires up RouterDeps (fetch, history, scroll, RSC decoding, render
|
|
5
|
+
* callbacks) and optionally sets up Navigation API integration.
|
|
6
|
+
*
|
|
7
|
+
* See design/19-client-navigation.md §"Navigation API Integration"
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createElement } from 'react';
|
|
11
|
+
import { createFromFetch } from '../../rsc-runtime/browser.js';
|
|
12
|
+
import { createRouter, setGlobalRouter } from '#client-internal';
|
|
13
|
+
import type { RouterDeps, RouterInstance } from '#client-internal';
|
|
14
|
+
import type { NavigationState } from '#client-internal';
|
|
15
|
+
import { TimberNuqsAdapter } from '../nuqs-adapter.js';
|
|
16
|
+
import {
|
|
17
|
+
NavigationProvider,
|
|
18
|
+
getNavigationState,
|
|
19
|
+
setNavigationState,
|
|
20
|
+
} from '../navigation-context.js';
|
|
21
|
+
import { transitionRender, navigateTransition } from '../navigation-root.js';
|
|
22
|
+
import { SegmentUpdateContext, EMPTY_SEGMENT_UPDATES } from '../segment-update-context.js';
|
|
23
|
+
import {
|
|
24
|
+
hasNavigationApi,
|
|
25
|
+
setupNavigationApi,
|
|
26
|
+
type NavigationApiController,
|
|
27
|
+
} from '../navigation-api.js';
|
|
28
|
+
import { getScrollY, scrollToHashTarget } from './scroll.js';
|
|
29
|
+
|
|
30
|
+
export interface RouterInitOptions {
|
|
31
|
+
initialElement?: unknown;
|
|
32
|
+
clientSegmentCache?: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface RouterInitResult {
|
|
36
|
+
router: RouterInstance;
|
|
37
|
+
navApiController: NavigationApiController | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Create and register the global timber router.
|
|
42
|
+
*
|
|
43
|
+
* Must be called before hydrateRoot so `useRouter()` works during
|
|
44
|
+
* the initial render (methods lazily resolve the router at invocation,
|
|
45
|
+
* not render time, but initRouter must still run first).
|
|
46
|
+
*/
|
|
47
|
+
export function createTimberRouter(options?: RouterInitOptions): RouterInitResult {
|
|
48
|
+
// Feature-detect Navigation API. When available, the navigate event
|
|
49
|
+
// replaces popstate for back/forward and catches external navigations.
|
|
50
|
+
// See design/19-client-navigation.md §"Navigation API Integration"
|
|
51
|
+
const useNavApi = hasNavigationApi();
|
|
52
|
+
|
|
53
|
+
// Track the current unwrapped RSC payload. On partial navigation, the
|
|
54
|
+
// router re-wraps this same element with new NavigationProvider context
|
|
55
|
+
// so mounted SegmentOutlets are preserved (they pick up changes via
|
|
56
|
+
// SegmentUpdateContext, not from new children props).
|
|
57
|
+
// Initialized from the hydration element so partial nav works on the
|
|
58
|
+
// very first client navigation (before any wrapPayload call).
|
|
59
|
+
let currentPayload: unknown = options?.initialElement ?? null;
|
|
60
|
+
|
|
61
|
+
// ─── History API Patch ──────────────────────────────────────────
|
|
62
|
+
// Patch pushState/replaceState to detect external URL changes (nuqs
|
|
63
|
+
// shallow updates, replaceUrl, third-party libraries). When the router
|
|
64
|
+
// itself calls pushState/replaceState, it sets a flag so the patch
|
|
65
|
+
// skips the sync — the router already updates NavigationContext.
|
|
66
|
+
//
|
|
67
|
+
// On Navigation API browsers, the navigate event catches most URL
|
|
68
|
+
// changes. The patch is defense-in-depth and the primary mechanism
|
|
69
|
+
// for History API-only browsers (older Safari/Firefox).
|
|
70
|
+
const ROUTER_HISTORY_FLAG = Symbol.for('__timber_router_history_update');
|
|
71
|
+
const gFlags = globalThis as Record<symbol, boolean>;
|
|
72
|
+
|
|
73
|
+
const originalPushState = window.history.pushState.bind(window.history);
|
|
74
|
+
const originalReplaceState = window.history.replaceState.bind(window.history);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Sync NavigationContext.search after a shallow URL update. Called by
|
|
78
|
+
* the Navigation API shallow handler and the History API patch.
|
|
79
|
+
*
|
|
80
|
+
* @param search — the new search string. The Navigation API path passes
|
|
81
|
+
* this from event.destination.url (window.location hasn't committed
|
|
82
|
+
* yet when the navigate listener fires). The History API patch omits
|
|
83
|
+
* it, reading window.location.search (already committed by the time
|
|
84
|
+
* the patched pushState/replaceState returns).
|
|
85
|
+
*
|
|
86
|
+
* Bails when search is unchanged (scroll saves, no-ops, dual-fire).
|
|
87
|
+
* Re-wraps currentPayload with updated NavigationProvider and commits
|
|
88
|
+
* via transitionRender (startTransition — non-blocking).
|
|
89
|
+
*/
|
|
90
|
+
function syncShallowSearch(search?: string): void {
|
|
91
|
+
const currentSearch = search ?? window.location.search;
|
|
92
|
+
const navState = getNavigationState();
|
|
93
|
+
if (currentSearch === navState.search) return;
|
|
94
|
+
if (!currentPayload) return;
|
|
95
|
+
|
|
96
|
+
const newNavState: NavigationState = {
|
|
97
|
+
params: navState.params,
|
|
98
|
+
pathname: navState.pathname,
|
|
99
|
+
search: currentSearch,
|
|
100
|
+
};
|
|
101
|
+
setNavigationState(newNavState);
|
|
102
|
+
|
|
103
|
+
const withNav = createElement(
|
|
104
|
+
NavigationProvider,
|
|
105
|
+
{ value: newNavState },
|
|
106
|
+
currentPayload as React.ReactNode
|
|
107
|
+
);
|
|
108
|
+
const withUpdates = createElement(
|
|
109
|
+
SegmentUpdateContext.Provider,
|
|
110
|
+
{ value: EMPTY_SEGMENT_UPDATES },
|
|
111
|
+
withNav
|
|
112
|
+
);
|
|
113
|
+
const wrapped = createElement(TimberNuqsAdapter, null, withUpdates);
|
|
114
|
+
transitionRender(wrapped);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
window.history.pushState = function (
|
|
118
|
+
data: unknown,
|
|
119
|
+
unused: string,
|
|
120
|
+
url?: string | URL | null
|
|
121
|
+
): void {
|
|
122
|
+
originalPushState(data, unused, url);
|
|
123
|
+
if (!gFlags[ROUTER_HISTORY_FLAG]) {
|
|
124
|
+
syncShallowSearch();
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
window.history.replaceState = function (
|
|
129
|
+
data: unknown,
|
|
130
|
+
unused: string,
|
|
131
|
+
url?: string | URL | null
|
|
132
|
+
): void {
|
|
133
|
+
originalReplaceState(data, unused, url);
|
|
134
|
+
if (!gFlags[ROUTER_HISTORY_FLAG]) {
|
|
135
|
+
syncShallowSearch();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const deps: RouterDeps = {
|
|
140
|
+
clientSegmentCache: options?.clientSegmentCache ?? false,
|
|
141
|
+
fetch: (url, init) => window.fetch(url, init),
|
|
142
|
+
pushState: (data, unused, url) => {
|
|
143
|
+
gFlags[ROUTER_HISTORY_FLAG] = true;
|
|
144
|
+
window.history.pushState(data, unused, url);
|
|
145
|
+
gFlags[ROUTER_HISTORY_FLAG] = false;
|
|
146
|
+
},
|
|
147
|
+
replaceState: (data, unused, url) => {
|
|
148
|
+
gFlags[ROUTER_HISTORY_FLAG] = true;
|
|
149
|
+
window.history.replaceState(data, unused, url);
|
|
150
|
+
gFlags[ROUTER_HISTORY_FLAG] = false;
|
|
151
|
+
},
|
|
152
|
+
navigationApiActive: useNavApi,
|
|
153
|
+
scrollTo: (x, y) => {
|
|
154
|
+
// Scroll the document viewport.
|
|
155
|
+
window.scrollTo(x, y);
|
|
156
|
+
document.documentElement.scrollTop = y;
|
|
157
|
+
document.body.scrollTop = y;
|
|
158
|
+
// Scroll any element explicitly marked as a scroll container.
|
|
159
|
+
// With segment tree merging, shared layouts (sidebars, nav bars)
|
|
160
|
+
// are reconciled in place via cloneElement — React preserves their
|
|
161
|
+
// DOM and scroll state naturally. We no longer auto-detect overflow
|
|
162
|
+
// containers, which previously found the wrong element (e.g.,
|
|
163
|
+
// scrolling a sidebar instead of the main content area).
|
|
164
|
+
// Use `data-timber-scroll-restoration` to opt in specific containers.
|
|
165
|
+
for (const el of document.querySelectorAll('[data-timber-scroll-restoration]')) {
|
|
166
|
+
(el as HTMLElement).scrollTop = y;
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
getCurrentUrl: () => window.location.pathname + window.location.search,
|
|
170
|
+
getScrollY,
|
|
171
|
+
scrollToHash: scrollToHashTarget,
|
|
172
|
+
|
|
173
|
+
decodeRsc: (fetchPromise: Promise<Response>) => {
|
|
174
|
+
return createFromFetch(fetchPromise);
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
// Render decoded RSC tree via NavigationRoot's state-based mechanism.
|
|
178
|
+
// Used for non-navigation renders (popstate cached replay, applyRevalidation).
|
|
179
|
+
// Wraps with NavigationProvider + TimberNuqsAdapter.
|
|
180
|
+
//
|
|
181
|
+
// For navigation renders (navigate, refresh, popstate-with-fetch),
|
|
182
|
+
// navigateTransition is used instead — it wraps the entire navigation
|
|
183
|
+
// in a React transition with useOptimistic for the pending URL.
|
|
184
|
+
//
|
|
185
|
+
// navState is passed explicitly by the router — no temporal coupling
|
|
186
|
+
// with getNavigationState().
|
|
187
|
+
renderRoot: (element: unknown, navState: NavigationState) => {
|
|
188
|
+
currentPayload = element;
|
|
189
|
+
const withNav = createElement(
|
|
190
|
+
NavigationProvider,
|
|
191
|
+
{ value: navState },
|
|
192
|
+
element as React.ReactNode
|
|
193
|
+
);
|
|
194
|
+
const withUpdates = createElement(
|
|
195
|
+
SegmentUpdateContext.Provider,
|
|
196
|
+
{ value: EMPTY_SEGMENT_UPDATES },
|
|
197
|
+
withNav
|
|
198
|
+
);
|
|
199
|
+
const wrapped = createElement(TimberNuqsAdapter, null, withUpdates);
|
|
200
|
+
transitionRender(wrapped);
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
// Run a navigation inside a React transition with optimistic pending URL.
|
|
204
|
+
// The entire fetch + state update runs inside startTransition. useOptimistic
|
|
205
|
+
// shows the pending URL immediately and reverts to null when the transition
|
|
206
|
+
// commits (atomic with the new tree + params).
|
|
207
|
+
//
|
|
208
|
+
// The perform callback receives a wrapPayload function that wraps the
|
|
209
|
+
// decoded RSC payload with NavigationProvider + NuqsAdapter. navState
|
|
210
|
+
// is passed explicitly by the router — no getNavigationState() needed.
|
|
211
|
+
navigateTransition: (pendingUrl: string, perform) => {
|
|
212
|
+
return navigateTransition(pendingUrl, async () => {
|
|
213
|
+
const { element, decodePromise } = await perform(
|
|
214
|
+
(
|
|
215
|
+
rawPayload: unknown,
|
|
216
|
+
navState: NavigationState,
|
|
217
|
+
segmentUpdates?: Map<string, unknown>
|
|
218
|
+
) => {
|
|
219
|
+
currentPayload = rawPayload;
|
|
220
|
+
const withNav = createElement(
|
|
221
|
+
NavigationProvider,
|
|
222
|
+
{ value: navState },
|
|
223
|
+
rawPayload as React.ReactNode
|
|
224
|
+
);
|
|
225
|
+
const withUpdates = createElement(
|
|
226
|
+
SegmentUpdateContext.Provider,
|
|
227
|
+
{ value: (segmentUpdates ?? EMPTY_SEGMENT_UPDATES) as Map<string, React.ReactNode> },
|
|
228
|
+
withNav
|
|
229
|
+
);
|
|
230
|
+
return createElement(TimberNuqsAdapter, null, withUpdates);
|
|
231
|
+
}
|
|
232
|
+
);
|
|
233
|
+
return { element: element as React.ReactNode, decodePromise };
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
_getCurrentPayload: () => currentPayload,
|
|
238
|
+
|
|
239
|
+
// Schedule a callback after the next paint so scroll operations
|
|
240
|
+
// happen after React commits the new content to the DOM.
|
|
241
|
+
// Double-rAF ensures the browser has painted the new frame.
|
|
242
|
+
afterPaint: (callback: () => void) => {
|
|
243
|
+
requestAnimationFrame(() => {
|
|
244
|
+
requestAnimationFrame(callback);
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const router = createRouter(deps);
|
|
250
|
+
setGlobalRouter(router);
|
|
251
|
+
|
|
252
|
+
// Set up Navigation API integration after router is created.
|
|
253
|
+
// The navigate event listener delegates to router.navigate and
|
|
254
|
+
// router.handlePopState for external navigations and traversals.
|
|
255
|
+
let navApiController: NavigationApiController | null = null;
|
|
256
|
+
if (useNavApi) {
|
|
257
|
+
navApiController = setupNavigationApi({
|
|
258
|
+
onExternalNavigate: async (url, { replace, signal, scroll, departingUrl }) => {
|
|
259
|
+
await router.navigate(url, {
|
|
260
|
+
replace,
|
|
261
|
+
scroll,
|
|
262
|
+
_signal: signal,
|
|
263
|
+
_skipHistory: true,
|
|
264
|
+
_departingUrl: departingUrl,
|
|
265
|
+
});
|
|
266
|
+
},
|
|
267
|
+
onTraverse: async (url, scrollY, signal) => {
|
|
268
|
+
// Back/forward — delegate to the router's popstate handler.
|
|
269
|
+
await router.handlePopState(url, scrollY, signal);
|
|
270
|
+
},
|
|
271
|
+
onShallowNavigate: (destinationUrl: string) => {
|
|
272
|
+
const search = new URL(destinationUrl).search;
|
|
273
|
+
syncShallowSearch(search);
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Wire the router-navigating flag into RouterDeps.
|
|
278
|
+
// This must be done after setupNavigationApi returns the controller.
|
|
279
|
+
deps.setRouterNavigating = (v) => navApiController!.setRouterNavigating(v);
|
|
280
|
+
deps.saveNavigationEntryScroll = (y) => navApiController!.saveScrollPosition(y);
|
|
281
|
+
deps.completeRouterNavigation = () => navApiController!.completeRouterNavigation();
|
|
282
|
+
deps.navigationNavigate = (url, replace) => navApiController!.navigate(url, replace);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return { router, navApiController };
|
|
286
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RSC Stream Bootstrap — decodes the server-inlined RSC payload.
|
|
3
|
+
*
|
|
4
|
+
* The RSC payload is embedded in the HTML as progressive inline script
|
|
5
|
+
* tags that call `self.__timber_f.push([type, data])` as RSC chunks arrive.
|
|
6
|
+
* Typed tuples: [0] = bootstrap signal, [1, string] = Flight data chunk.
|
|
7
|
+
*
|
|
8
|
+
* This module sets up a ReadableStream fed by those push() calls so
|
|
9
|
+
* `createFromReadableStream` can decode the Flight protocol progressively.
|
|
10
|
+
*
|
|
11
|
+
* See design/18-build-system.md §"Entry Files"
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { createFromReadableStream } from '../../rsc-runtime/browser.js';
|
|
15
|
+
import { isPageUnloading } from '../unload-guard.js';
|
|
16
|
+
|
|
17
|
+
type FlightSegment = [isBootstrap: 0] | [isData: 1, data: string];
|
|
18
|
+
|
|
19
|
+
export interface RscStreamResult {
|
|
20
|
+
/** The decoded RSC element (thenable/lazy — resolved by React during render) */
|
|
21
|
+
element: unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create the RSC payload stream from server-inlined `__timber_f` chunks.
|
|
26
|
+
*
|
|
27
|
+
* Returns null if no RSC payload was inlined (e.g., JS-only client).
|
|
28
|
+
* When a payload exists, returns the decoded element for hydration.
|
|
29
|
+
*/
|
|
30
|
+
export function createRscPayloadStream(): RscStreamResult | null {
|
|
31
|
+
// __timber_f is initialized in <head> via flightInitScript() (see
|
|
32
|
+
// flight-scripts.ts). If it doesn't exist, skip Flight decoding
|
|
33
|
+
// entirely and fall through to the createRoot branch.
|
|
34
|
+
// Do NOT defensively create it here: that would cause
|
|
35
|
+
// createFromReadableStream to be called on an empty stream, producing
|
|
36
|
+
// a "Connection closed" error on hydration. See TIM-552.
|
|
37
|
+
const timberChunks = (self as unknown as Record<string, FlightSegment[] | undefined>).__timber_f;
|
|
38
|
+
if (!timberChunks) return null;
|
|
39
|
+
|
|
40
|
+
const encoder = new TextEncoder();
|
|
41
|
+
|
|
42
|
+
// Buffer to hold string data until the stream writer is ready.
|
|
43
|
+
// Scripts that execute before hydration starts push data here.
|
|
44
|
+
let dataBuffer: string[] | undefined = [];
|
|
45
|
+
let streamWriter: ReadableStreamDefaultController<Uint8Array> | null = null;
|
|
46
|
+
let streamFlushed = false;
|
|
47
|
+
|
|
48
|
+
/** Process a typed tuple from __timber_f. */
|
|
49
|
+
function handleSegment(seg: FlightSegment): void {
|
|
50
|
+
if (seg[0] === 0) {
|
|
51
|
+
// Bootstrap signal — initialize buffer (already done above)
|
|
52
|
+
if (!dataBuffer) dataBuffer = [];
|
|
53
|
+
} else if (seg[0] === 1) {
|
|
54
|
+
// Flight data chunk
|
|
55
|
+
if (streamWriter) {
|
|
56
|
+
streamWriter.enqueue(encoder.encode(seg[1]));
|
|
57
|
+
} else if (dataBuffer) {
|
|
58
|
+
dataBuffer.push(seg[1]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Process any chunks that arrived before this script executed.
|
|
64
|
+
for (const seg of timberChunks) {
|
|
65
|
+
handleSegment(seg);
|
|
66
|
+
}
|
|
67
|
+
// Clear the array to release memory.
|
|
68
|
+
timberChunks.length = 0;
|
|
69
|
+
|
|
70
|
+
// Patch push() so subsequent script tags feed data in real time.
|
|
71
|
+
(timberChunks as unknown as { push: (seg: FlightSegment) => void }).push = handleSegment;
|
|
72
|
+
|
|
73
|
+
const rscPayload = new ReadableStream<Uint8Array>({
|
|
74
|
+
start(controller) {
|
|
75
|
+
streamWriter = controller;
|
|
76
|
+
// Flush buffered data into the stream.
|
|
77
|
+
if (dataBuffer) {
|
|
78
|
+
for (const data of dataBuffer) {
|
|
79
|
+
controller.enqueue(encoder.encode(data));
|
|
80
|
+
}
|
|
81
|
+
dataBuffer = undefined;
|
|
82
|
+
}
|
|
83
|
+
// If DOM already loaded (non-streaming or fast page), close now.
|
|
84
|
+
if (streamFlushed) {
|
|
85
|
+
controller.close();
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Close the stream when the document finishes loading.
|
|
91
|
+
// DOMContentLoaded fires after the HTML parser has processed all
|
|
92
|
+
// inline scripts (including streamed Suspense replacements and
|
|
93
|
+
// RSC data), so all push() calls have completed by this point.
|
|
94
|
+
//
|
|
95
|
+
// If the page is unloading (user refreshed or navigated away),
|
|
96
|
+
// do NOT close the stream. When the connection drops mid-stream,
|
|
97
|
+
// DOMContentLoaded fires because the parser finishes. Closing an
|
|
98
|
+
// incomplete RSC stream causes React's Flight client to throw
|
|
99
|
+
// "Connection closed." — a jarring error on a page being replaced.
|
|
100
|
+
// Leaving the stream open is harmless: the page is being torn down.
|
|
101
|
+
function onDOMContentLoaded(): void {
|
|
102
|
+
if (isPageUnloading()) return;
|
|
103
|
+
|
|
104
|
+
// In dev mode, do NOT close the stream. React's RSC renderer
|
|
105
|
+
// includes debug owner/stack references ($1, $14, etc.) in the
|
|
106
|
+
// Flight payload that point to rows delivered through the debug
|
|
107
|
+
// channel, not the main Flight stream. The browser Flight client
|
|
108
|
+
// tracks these as pending chunks. Closing the stream with
|
|
109
|
+
// unresolved chunks triggers reportGlobalError("Connection closed")
|
|
110
|
+
// which kills the entire React tree.
|
|
111
|
+
//
|
|
112
|
+
// Leaving the stream open is harmless: React has already received
|
|
113
|
+
// all data rows and can hydrate fully. The pending debug chunks
|
|
114
|
+
// just remain unresolved (they're only used for React DevTools
|
|
115
|
+
// component stacks, not rendering).
|
|
116
|
+
//
|
|
117
|
+
// In production, debug rows are not emitted, so closing is safe.
|
|
118
|
+
if (process.env.NODE_ENV === 'development') {
|
|
119
|
+
// Mark as flushed so no more data is buffered, but don't close.
|
|
120
|
+
streamFlushed = true;
|
|
121
|
+
dataBuffer = undefined;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (streamWriter && !streamFlushed) {
|
|
126
|
+
streamWriter.close();
|
|
127
|
+
streamFlushed = true;
|
|
128
|
+
dataBuffer = undefined;
|
|
129
|
+
}
|
|
130
|
+
streamFlushed = true;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (document.readyState === 'loading') {
|
|
134
|
+
document.addEventListener('DOMContentLoaded', onDOMContentLoaded, false);
|
|
135
|
+
} else {
|
|
136
|
+
// DOM already parsed. All inline RSC <script> tags have already
|
|
137
|
+
// executed and pushed their data into the buffer. The buffer was
|
|
138
|
+
// flushed into the stream during start() above.
|
|
139
|
+
//
|
|
140
|
+
// Close via queueMicrotask rather than setTimeout. setTimeout
|
|
141
|
+
// defers to the next macrotask, which can race with React's
|
|
142
|
+
// Flight client read loop — if React finishes reading all queued
|
|
143
|
+
// chunks and issues a reader.read() that pends, the stream is
|
|
144
|
+
// NOT closed yet (setTimeout hasn't fired), so React sees an
|
|
145
|
+
// open stream and waits. Then setTimeout fires and closes it.
|
|
146
|
+
// This works in theory but some React Flight builds interpret
|
|
147
|
+
// a mid-read close as "Connection closed" rather than clean EOF.
|
|
148
|
+
// queueMicrotask fires at the end of the current microtask
|
|
149
|
+
// checkpoint — after start() and createFromReadableStream
|
|
150
|
+
// initialization but before any macrotask, giving React a
|
|
151
|
+
// consistent close signal. See TIM-524.
|
|
152
|
+
queueMicrotask(onDOMContentLoaded);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const element = createFromReadableStream(rscPayload);
|
|
156
|
+
return { element };
|
|
157
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scroll position helpers for the browser entry.
|
|
3
|
+
*
|
|
4
|
+
* Reads scroll position from the document viewport or explicitly marked
|
|
5
|
+
* `data-timber-scroll-restoration` containers.
|
|
6
|
+
*
|
|
7
|
+
* See design/19-client-navigation.md §"Overflow Scroll Containers".
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Read the current scroll position.
|
|
12
|
+
*
|
|
13
|
+
* Checks window scroll first, then explicit `data-timber-scroll-restoration`
|
|
14
|
+
* containers. With segment tree merging, shared layouts are reconciled in
|
|
15
|
+
* place via `cloneElement` — React preserves their DOM and scroll state
|
|
16
|
+
* naturally. We don't need to auto-detect overflow containers; only
|
|
17
|
+
* explicitly marked containers are tracked.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Scroll the element matching a URL #fragment into view.
|
|
21
|
+
*
|
|
22
|
+
* Mirrors browser anchor behavior: looks up the decoded fragment by id,
|
|
23
|
+
* then by anchor name. Returns true when a matching element was found and
|
|
24
|
+
* scrolled; false otherwise (the router falls back to scroll-to-top, same
|
|
25
|
+
* as a full page load with an unknown fragment). See TIM-1035.
|
|
26
|
+
*/
|
|
27
|
+
export function scrollToHashTarget(hash: string): boolean {
|
|
28
|
+
const fragment = hash.startsWith('#') ? hash.slice(1) : hash;
|
|
29
|
+
if (!fragment) return false;
|
|
30
|
+
let id: string;
|
|
31
|
+
try {
|
|
32
|
+
id = decodeURIComponent(fragment);
|
|
33
|
+
} catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const target = document.getElementById(id) ?? document.getElementsByName(id)[0];
|
|
37
|
+
if (!target) return false;
|
|
38
|
+
target.scrollIntoView();
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function getScrollY(): number {
|
|
43
|
+
if (window.scrollY || document.documentElement.scrollTop || document.body.scrollTop) {
|
|
44
|
+
return window.scrollY || document.documentElement.scrollTop || document.body.scrollTop;
|
|
45
|
+
}
|
|
46
|
+
for (const el of document.querySelectorAll('[data-timber-scroll-restoration]')) {
|
|
47
|
+
if ((el as HTMLElement).scrollTop > 0) return (el as HTMLElement).scrollTop;
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
}
|