@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
|
@@ -14,26 +14,96 @@
|
|
|
14
14
|
* See design/13-security.md §"State tree manipulation"
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { swallow } from './logger.js';
|
|
18
|
+
import { matchUrlParts } from './tree-match.js';
|
|
19
|
+
import type { ManifestSegmentNode } from './route-matcher.js';
|
|
20
|
+
|
|
21
|
+
// ─── Segment Key Computation ─────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Segment node shape expected by computeSegmentKeys.
|
|
25
|
+
* Matches the relevant fields from ManifestSegmentNode without
|
|
26
|
+
* importing it (avoids circular deps from routing → server).
|
|
27
|
+
*/
|
|
28
|
+
interface SegmentKeyInput {
|
|
29
|
+
urlPath: string;
|
|
30
|
+
segmentName?: string;
|
|
31
|
+
segmentType?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Compute state-tree keys for a segment chain.
|
|
36
|
+
*
|
|
37
|
+
* Non-group segments use their urlPath as-is. Route groups accumulate
|
|
38
|
+
* ancestor group names to produce globally unique keys:
|
|
39
|
+
* app/(a)/(shared)/dashboard → keys: ['/', '/(a)', '/(a)/(shared)', '/dashboard']
|
|
40
|
+
*
|
|
41
|
+
* This is the single source of truth for segment keys — used by the
|
|
42
|
+
* element builder (skip decisions, SegmentOutlet props), segment info
|
|
43
|
+
* (X-Timber-Segments header), and the client cache/state tree.
|
|
44
|
+
*/
|
|
45
|
+
export function computeSegmentKeys(segments: SegmentKeyInput[]): string[] {
|
|
46
|
+
const keys: string[] = [];
|
|
47
|
+
let prevKey = '';
|
|
48
|
+
|
|
49
|
+
for (const segment of segments) {
|
|
50
|
+
if (segment.segmentType === 'group') {
|
|
51
|
+
const base = prevKey === '/' ? '' : prevKey;
|
|
52
|
+
const key = `${base}/${segment.segmentName}`;
|
|
53
|
+
keys.push(key);
|
|
54
|
+
prevKey = key;
|
|
55
|
+
} else {
|
|
56
|
+
keys.push(segment.urlPath);
|
|
57
|
+
prevKey = segment.urlPath;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return keys;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compute a unique key for a parallel route slot.
|
|
66
|
+
* Format: `{parentSegmentId}/@{slotName}`, e.g. `/@sidebar` or `/dashboard/@modal`.
|
|
67
|
+
*/
|
|
68
|
+
export function computeSlotKey(parentSegmentId: string, slotName: string): string {
|
|
69
|
+
const name = slotName.startsWith('@') ? slotName : `@${slotName}`;
|
|
70
|
+
const prefix = parentSegmentId === '/' ? '' : parentSegmentId;
|
|
71
|
+
return `${prefix}/${name}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ─── State Tree Parsing ──────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
/** Parsed client state tree with segment paths and optional slot paths. */
|
|
77
|
+
export interface ClientStateTree extends Set<string> {
|
|
78
|
+
slots?: Set<string> | null;
|
|
79
|
+
}
|
|
80
|
+
|
|
17
81
|
/**
|
|
18
82
|
* Parse the X-Timber-State-Tree header from a request.
|
|
19
83
|
*
|
|
20
|
-
* Returns a Set of segment paths the client has cached
|
|
84
|
+
* Returns a Set of segment paths the client has cached (with an
|
|
85
|
+
* additional `slots` property for cached slot paths), or null if
|
|
21
86
|
* the header is missing, malformed, or empty. Parsing happens before
|
|
22
87
|
* renderToReadableStream — not inside the React render pass.
|
|
23
88
|
*
|
|
24
|
-
* @returns
|
|
89
|
+
* @returns ClientStateTree with segments and slots, or null if no valid state tree
|
|
25
90
|
*/
|
|
26
|
-
export function parseClientStateTree(req: Request):
|
|
91
|
+
export function parseClientStateTree(req: Request): ClientStateTree | null {
|
|
27
92
|
const header = req.headers.get('X-Timber-State-Tree');
|
|
28
93
|
if (!header) return null;
|
|
29
94
|
|
|
30
95
|
try {
|
|
31
|
-
const parsed = JSON.parse(header) as { segments?: unknown };
|
|
32
|
-
|
|
96
|
+
const parsed = JSON.parse(header) as { segments?: unknown; slots?: unknown };
|
|
97
|
+
const hasSegments = Array.isArray(parsed.segments) && parsed.segments.length > 0;
|
|
98
|
+
const hasSlots = Array.isArray(parsed.slots) && parsed.slots.length > 0;
|
|
99
|
+
if (!hasSegments && !hasSlots) {
|
|
33
100
|
return null;
|
|
34
101
|
}
|
|
35
|
-
|
|
36
|
-
|
|
102
|
+
const result = new Set(hasSegments ? (parsed.segments as string[]) : []) as ClientStateTree;
|
|
103
|
+
result.slots = hasSlots ? new Set(parsed.slots as string[]) : null;
|
|
104
|
+
return result;
|
|
105
|
+
} catch (err) {
|
|
106
|
+
swallow(err, 'malformed X-Timber-State-Tree header');
|
|
37
107
|
return null;
|
|
38
108
|
}
|
|
39
109
|
}
|
|
@@ -42,36 +112,113 @@ export function parseClientStateTree(req: Request): Set<string> | null {
|
|
|
42
112
|
* Determine whether a segment's layout rendering can be skipped.
|
|
43
113
|
*
|
|
44
114
|
* A segment is skipped when ALL of the following are true:
|
|
45
|
-
* 1. The client
|
|
46
|
-
* 2. The
|
|
47
|
-
* 3. The segment
|
|
115
|
+
* 1. The client sent a state tree (clientSegments is non-null)
|
|
116
|
+
* 2. The client has this segment cached (clientSegments contains urlPath)
|
|
117
|
+
* 3. The segment has a layout (otherwise nothing to skip)
|
|
118
|
+
* 4. The layout is sync (not an async function — async layouts may depend
|
|
119
|
+
* on per-request data and must always re-render)
|
|
120
|
+
* 5. The segment is NOT the leaf (pages are never cached across navigations)
|
|
121
|
+
*
|
|
122
|
+
* Additional constraints enforced by the caller (buildRouteElement):
|
|
123
|
+
* - Must have a rendered layout below (so SegmentOutlet has content to show)
|
|
124
|
+
* - Skipped segments must form a contiguous prefix from root
|
|
48
125
|
*
|
|
49
126
|
* Access.ts still runs for skipped segments — this is enforced by the caller
|
|
50
|
-
*
|
|
127
|
+
* which wraps with AccessGate regardless of skip status.
|
|
51
128
|
*
|
|
52
|
-
* @param
|
|
129
|
+
* @param segmentKey - The segment's state-tree key from computeSegmentKeys()
|
|
53
130
|
* @param layoutComponent - The loaded layout component function
|
|
54
131
|
* @param isLeaf - Whether this is the leaf segment (page segment)
|
|
55
132
|
* @param clientSegments - Set of paths from X-Timber-State-Tree, or null
|
|
56
133
|
*/
|
|
57
134
|
export function shouldSkipSegment(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
135
|
+
segmentKey: string,
|
|
136
|
+
layoutComponent: ((...args: unknown[]) => unknown) | undefined,
|
|
137
|
+
isLeaf: boolean,
|
|
138
|
+
clientSegments: Set<string> | null
|
|
62
139
|
): boolean {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
140
|
+
if (!clientSegments) return false;
|
|
141
|
+
if (!clientSegments.has(segmentKey)) return false;
|
|
142
|
+
if (!layoutComponent) return false;
|
|
143
|
+
if (isLeaf) return false;
|
|
144
|
+
|
|
145
|
+
// Pre-render guard: async layouts may depend on per-request data.
|
|
146
|
+
// Taint tracking (runInTaintScope) handles the post-render client-side
|
|
147
|
+
// caching decision via X-Timber-Segments. This server-side check remains
|
|
148
|
+
// conservative because taint results aren't available at element-build time.
|
|
149
|
+
if (layoutComponent.constructor.name === 'AsyncFunction') return false;
|
|
150
|
+
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ─── Slot Skip Decision ─────────────────────────────────────────
|
|
155
|
+
|
|
156
|
+
interface ShouldSkipSlotArgs {
|
|
157
|
+
slotKey: string;
|
|
158
|
+
clientSlots: Set<string> | null;
|
|
159
|
+
slotNode: ManifestSegmentNode;
|
|
160
|
+
departingUrlParts: string[];
|
|
161
|
+
destinationUrlParts: string[];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Determine whether a parallel route slot can be skipped.
|
|
166
|
+
*
|
|
167
|
+
* A slot is skipped when ALL of:
|
|
168
|
+
* 1. The client has this slot cached (slotKey is in clientSlots)
|
|
169
|
+
* 2. The slot's matched page is the SAME for both the departing and
|
|
170
|
+
* destination URLs (same page file + same extracted params)
|
|
171
|
+
*
|
|
172
|
+
* The comparison uses matchUrlParts to find what each URL would match
|
|
173
|
+
* in the slot's sub-tree, then compares the matched page file and params.
|
|
174
|
+
*
|
|
175
|
+
* This is a performance optimization only, NOT a security boundary.
|
|
176
|
+
* Slot access.ts always runs via SlotAccessGate regardless.
|
|
177
|
+
*/
|
|
178
|
+
export function shouldSkipSlot({
|
|
179
|
+
slotKey,
|
|
180
|
+
clientSlots,
|
|
181
|
+
slotNode,
|
|
182
|
+
departingUrlParts,
|
|
183
|
+
destinationUrlParts,
|
|
184
|
+
}: ShouldSkipSlotArgs): boolean {
|
|
185
|
+
if (!clientSlots) return false;
|
|
186
|
+
if (!clientSlots.has(slotKey)) return false;
|
|
187
|
+
|
|
188
|
+
const departingMatch = matchUrlParts(slotNode, departingUrlParts);
|
|
189
|
+
const destinationMatch = matchUrlParts(slotNode, destinationUrlParts);
|
|
190
|
+
|
|
191
|
+
// Both null (no match) — slot shows default.tsx in both cases
|
|
192
|
+
if (!departingMatch && !destinationMatch) return true;
|
|
193
|
+
// One null, one not — match changed
|
|
194
|
+
if (!departingMatch || !destinationMatch) return false;
|
|
195
|
+
|
|
196
|
+
const departingLeaf = departingMatch.chain[departingMatch.chain.length - 1];
|
|
197
|
+
const destinationLeaf = destinationMatch.chain[destinationMatch.chain.length - 1];
|
|
198
|
+
|
|
199
|
+
// Both must have a page, and the page file must be the same
|
|
200
|
+
if (!departingLeaf.page || !destinationLeaf.page) {
|
|
201
|
+
return !departingLeaf.page && !destinationLeaf.page;
|
|
202
|
+
}
|
|
203
|
+
if (departingLeaf.page.filePath !== destinationLeaf.page.filePath) return false;
|
|
204
|
+
|
|
205
|
+
// Compare extracted params — if any differ, the slot content may change
|
|
206
|
+
return paramsEqual(departingMatch.params, destinationMatch.params);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function paramsEqual(
|
|
210
|
+
a: Record<string, string | string[]>,
|
|
211
|
+
b: Record<string, string | string[]>
|
|
212
|
+
): boolean {
|
|
213
|
+
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
214
|
+
for (const key of keys) {
|
|
215
|
+
const va = a[key];
|
|
216
|
+
const vb = b[key];
|
|
217
|
+
if (Array.isArray(va) && Array.isArray(vb)) {
|
|
218
|
+
if (va.length !== vb.length || va.some((v, i) => v !== vb[i])) return false;
|
|
219
|
+
} else if (va !== vb) {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return true;
|
|
77
224
|
}
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
* correct file to render by walking the fallback chain described in
|
|
6
6
|
* design/10-error-handling.md §"Status-Code Files".
|
|
7
7
|
*
|
|
8
|
+
* **Generic over `TFile`** (TIM-848). Walks `SegmentNode<TFile>` trees
|
|
9
|
+
* regardless of whether `TFile` is the build-time `RouteFile` or the
|
|
10
|
+
* runtime `ManifestFile`. Before TIM-848 there were two near-identical
|
|
11
|
+
* resolvers — one for the Map-based scanner output and one for the
|
|
12
|
+
* object-based runtime manifest. Now there is one.
|
|
13
|
+
*
|
|
8
14
|
* Supports two format families:
|
|
9
15
|
* - 'component' (default): .tsx/.jsx/.mdx status files → React rendering pipeline
|
|
10
16
|
* - 'json': .json status files → raw JSON response, no React
|
|
@@ -17,17 +23,16 @@
|
|
|
17
23
|
* Pass 3 — error.tsx (leaf → root)
|
|
18
24
|
* Pass 4 — framework default (returns null)
|
|
19
25
|
*
|
|
20
|
-
* **JSON chain (4xx):**
|
|
21
|
-
* Pass 1 — json status files (leaf → root): {status}.json →
|
|
26
|
+
* **JSON chain (4xx and 5xx):**
|
|
27
|
+
* Pass 1 — json status files (leaf → root): {status}.json → {category}.json
|
|
22
28
|
* Pass 2 — framework default JSON (returns null, caller provides bare JSON)
|
|
23
29
|
*
|
|
24
|
-
* **5xx
|
|
30
|
+
* **5xx component:**
|
|
25
31
|
* Per-segment (leaf → root): {status}.tsx → 5xx.tsx → error.tsx
|
|
26
|
-
* Then global-error.tsx (future)
|
|
27
32
|
* Then framework default (returns null)
|
|
28
33
|
*/
|
|
29
34
|
|
|
30
|
-
import type { SegmentNode
|
|
35
|
+
import type { SegmentNode } from '../routing/types.js';
|
|
31
36
|
|
|
32
37
|
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
33
38
|
|
|
@@ -42,9 +47,9 @@ export type StatusFileKind =
|
|
|
42
47
|
export type StatusFileFormat = 'component' | 'json';
|
|
43
48
|
|
|
44
49
|
/** Result of resolving a status-code file for a segment chain. */
|
|
45
|
-
export interface StatusFileResolution {
|
|
50
|
+
export interface StatusFileResolution<TFile> {
|
|
46
51
|
/** The matched route file. */
|
|
47
|
-
file:
|
|
52
|
+
file: TFile;
|
|
48
53
|
/** The HTTP status code (always the original status, not the file's code). */
|
|
49
54
|
status: number;
|
|
50
55
|
/** How the file was matched. */
|
|
@@ -57,9 +62,9 @@ export interface StatusFileResolution {
|
|
|
57
62
|
export type SlotDeniedKind = 'denied' | 'default';
|
|
58
63
|
|
|
59
64
|
/** Result of resolving a slot denied file. */
|
|
60
|
-
export interface SlotDeniedResolution {
|
|
65
|
+
export interface SlotDeniedResolution<TFile> {
|
|
61
66
|
/** The matched route file (denied.tsx or default.tsx). */
|
|
62
|
-
file:
|
|
67
|
+
file: TFile;
|
|
63
68
|
/** Slot name without @ prefix. */
|
|
64
69
|
slotName: string;
|
|
65
70
|
/** How the file was matched. */
|
|
@@ -70,14 +75,61 @@ export interface SlotDeniedResolution {
|
|
|
70
75
|
|
|
71
76
|
/**
|
|
72
77
|
* Maps legacy file convention names to their corresponding HTTP status codes.
|
|
73
|
-
* Only used in the 4xx component fallback chain.
|
|
78
|
+
* Only used in the 4xx component fallback chain. Exported so the in-tree
|
|
79
|
+
* deny chain (deny-boundary.ts) uses the same mapping — see TIM-1081.
|
|
74
80
|
*/
|
|
75
|
-
const LEGACY_FILE_TO_STATUS: Record<string, number> = {
|
|
81
|
+
export const LEGACY_FILE_TO_STATUS: Record<string, number> = {
|
|
76
82
|
'not-found': 404,
|
|
77
83
|
'forbidden': 403,
|
|
78
84
|
'unauthorized': 401,
|
|
79
85
|
};
|
|
80
86
|
|
|
87
|
+
/** Reverse index: status code → legacy file name. Built once at module load. */
|
|
88
|
+
const STATUS_TO_LEGACY_FILE: Record<number, string> = Object.fromEntries(
|
|
89
|
+
Object.entries(LEGACY_FILE_TO_STATUS).map(([name, status]) => [status, name])
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// ─── Lookup Helpers ──────────────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Look up `{statusStr}` then `{categoryKey}` (e.g. "4xx" / "5xx") in a
|
|
96
|
+
* status-file group on a single segment. Shared by all three fallback
|
|
97
|
+
* chains — the only structural difference between component 4xx,
|
|
98
|
+
* component 5xx, and JSON resolution is *which* group is searched and
|
|
99
|
+
* how the per-segment loop is layered around it.
|
|
100
|
+
*/
|
|
101
|
+
function lookupInGroup<TFile>(
|
|
102
|
+
group: Record<string, TFile> | undefined,
|
|
103
|
+
statusStr: string,
|
|
104
|
+
categoryKey: string,
|
|
105
|
+
segmentIndex: number,
|
|
106
|
+
status: number
|
|
107
|
+
): StatusFileResolution<TFile> | null {
|
|
108
|
+
if (!group) return null;
|
|
109
|
+
const exact = group[statusStr];
|
|
110
|
+
if (exact) return { file: exact, status, kind: 'exact', segmentIndex };
|
|
111
|
+
const category = group[categoryKey];
|
|
112
|
+
if (category) return { file: category, status, kind: 'category', segmentIndex };
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Look up the legacy convention file (`not-found.tsx` / `forbidden.tsx` /
|
|
118
|
+
* `unauthorized.tsx`) for `status` on a single segment. Returns null if
|
|
119
|
+
* `status` has no legacy mapping or the file isn't present.
|
|
120
|
+
*/
|
|
121
|
+
function lookupLegacy<TFile>(
|
|
122
|
+
group: Record<string, TFile> | undefined,
|
|
123
|
+
status: number,
|
|
124
|
+
segmentIndex: number
|
|
125
|
+
): StatusFileResolution<TFile> | null {
|
|
126
|
+
if (!group) return null;
|
|
127
|
+
const name = STATUS_TO_LEGACY_FILE[status];
|
|
128
|
+
if (!name) return null;
|
|
129
|
+
const file = group[name];
|
|
130
|
+
return file ? { file, status, kind: 'legacy', segmentIndex } : null;
|
|
131
|
+
}
|
|
132
|
+
|
|
81
133
|
// ─── Resolver ────────────────────────────────────────────────────────────────
|
|
82
134
|
|
|
83
135
|
/**
|
|
@@ -91,101 +143,50 @@ const LEGACY_FILE_TO_STATUS: Record<string, number> = {
|
|
|
91
143
|
* @param segments - The matched segment chain from root (index 0) to leaf (last).
|
|
92
144
|
* @param format - The response format family ('component' or 'json'). Defaults to 'component'.
|
|
93
145
|
*/
|
|
94
|
-
export function resolveStatusFile(
|
|
146
|
+
export function resolveStatusFile<TFile>(
|
|
95
147
|
status: number,
|
|
96
|
-
segments: ReadonlyArray<SegmentNode
|
|
148
|
+
segments: ReadonlyArray<SegmentNode<TFile>>,
|
|
97
149
|
format: StatusFileFormat = 'component'
|
|
98
|
-
): StatusFileResolution | null {
|
|
99
|
-
if (status
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
// JSON format for 5xx uses the same json chain pattern
|
|
104
|
-
return format === 'json' ? resolve5xxJson(status, segments) : resolve5xx(status, segments);
|
|
105
|
-
}
|
|
106
|
-
return null;
|
|
150
|
+
): StatusFileResolution<TFile> | null {
|
|
151
|
+
if (status < 400 || status > 599) return null;
|
|
152
|
+
if (format === 'json') return resolveJson(status, segments);
|
|
153
|
+
if (status <= 499) return resolve4xx(status, segments);
|
|
154
|
+
return resolve5xx(status, segments);
|
|
107
155
|
}
|
|
108
156
|
|
|
109
157
|
/**
|
|
110
|
-
* 4xx component fallback chain
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
158
|
+
* 4xx component fallback chain — three separate full passes leaf→root.
|
|
159
|
+
*
|
|
160
|
+
* The passes must be separate (not interleaved per-segment) so that a
|
|
161
|
+
* root-level `404.tsx` beats a leaf-level `error.tsx`. The 5xx chain
|
|
162
|
+
* inverts this and is per-segment: a leaf's `error.tsx` beats a root's
|
|
163
|
+
* `5xx.tsx`. This asymmetry is the only reason these two functions exist
|
|
164
|
+
* separately.
|
|
165
|
+
*
|
|
166
|
+
* Pass 1 — {status}.tsx → 4xx.tsx (statusFiles)
|
|
167
|
+
* Pass 2 — not-found / forbidden / unauthorized (legacyStatusFiles)
|
|
168
|
+
* Pass 3 — error.tsx (error)
|
|
114
169
|
*/
|
|
115
|
-
function resolve4xx(
|
|
170
|
+
function resolve4xx<TFile>(
|
|
116
171
|
status: number,
|
|
117
|
-
segments: ReadonlyArray<SegmentNode
|
|
118
|
-
): StatusFileResolution | null {
|
|
172
|
+
segments: ReadonlyArray<SegmentNode<TFile>>
|
|
173
|
+
): StatusFileResolution<TFile> | null {
|
|
119
174
|
const statusStr = String(status);
|
|
120
175
|
|
|
121
|
-
// Pass 1: status files across all segments (leaf → root)
|
|
122
|
-
for (let i = segments.length - 1; i >= 0; i--) {
|
|
123
|
-
const segment = segments[i];
|
|
124
|
-
if (!segment.statusFiles) continue;
|
|
125
|
-
|
|
126
|
-
// Exact match first
|
|
127
|
-
const exact = segment.statusFiles.get(statusStr);
|
|
128
|
-
if (exact) {
|
|
129
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Category catch-all
|
|
133
|
-
const category = segment.statusFiles.get('4xx');
|
|
134
|
-
if (category) {
|
|
135
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Pass 2: legacy compat files (leaf → root)
|
|
140
176
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
141
|
-
const
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
for (const [name, legacyStatus] of Object.entries(LEGACY_FILE_TO_STATUS)) {
|
|
145
|
-
if (legacyStatus === status) {
|
|
146
|
-
const file = segment.legacyStatusFiles.get(name);
|
|
147
|
-
if (file) {
|
|
148
|
-
return { file, status, kind: 'legacy', segmentIndex: i };
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
177
|
+
const r = lookupInGroup(segments[i].statusFiles, statusStr, '4xx', i, status);
|
|
178
|
+
if (r) return r;
|
|
152
179
|
}
|
|
153
180
|
|
|
154
|
-
// Pass 3: error.tsx (leaf → root)
|
|
155
181
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
182
|
+
const r = lookupLegacy(segments[i].legacyStatusFiles, status, i);
|
|
183
|
+
if (r) return r;
|
|
159
184
|
}
|
|
160
185
|
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* 4xx JSON fallback chain (single pass):
|
|
166
|
-
* Pass 1 — json status files (leaf → root): {status}.json → 4xx.json
|
|
167
|
-
* No legacy compat, no error.tsx — JSON chain terminates at category catch-all.
|
|
168
|
-
*/
|
|
169
|
-
function resolve4xxJson(
|
|
170
|
-
status: number,
|
|
171
|
-
segments: ReadonlyArray<SegmentNode>
|
|
172
|
-
): StatusFileResolution | null {
|
|
173
|
-
const statusStr = String(status);
|
|
174
|
-
|
|
175
186
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
178
|
-
|
|
179
|
-
// Exact match first
|
|
180
|
-
const exact = segment.jsonStatusFiles.get(statusStr);
|
|
181
|
-
if (exact) {
|
|
182
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Category catch-all
|
|
186
|
-
const category = segment.jsonStatusFiles.get('4xx');
|
|
187
|
-
if (category) {
|
|
188
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
187
|
+
const errorFile = segments[i].error;
|
|
188
|
+
if (errorFile) {
|
|
189
|
+
return { file: errorFile, status, kind: 'error', segmentIndex: i };
|
|
189
190
|
}
|
|
190
191
|
}
|
|
191
192
|
|
|
@@ -193,33 +194,22 @@ function resolve4xxJson(
|
|
|
193
194
|
}
|
|
194
195
|
|
|
195
196
|
/**
|
|
196
|
-
* 5xx component fallback chain
|
|
197
|
-
*
|
|
197
|
+
* 5xx component fallback chain — single pass, per-segment leaf→root.
|
|
198
|
+
*
|
|
199
|
+
* At each segment: {status}.tsx → 5xx.tsx → error.tsx. A leaf's
|
|
200
|
+
* `error.tsx` therefore beats a root's `5xx.tsx`, which is the
|
|
201
|
+
* intentional inverse of the 4xx chain.
|
|
198
202
|
*/
|
|
199
|
-
function resolve5xx(
|
|
203
|
+
function resolve5xx<TFile>(
|
|
200
204
|
status: number,
|
|
201
|
-
segments: ReadonlyArray<SegmentNode
|
|
202
|
-
): StatusFileResolution | null {
|
|
205
|
+
segments: ReadonlyArray<SegmentNode<TFile>>
|
|
206
|
+
): StatusFileResolution<TFile> | null {
|
|
203
207
|
const statusStr = String(status);
|
|
204
208
|
|
|
205
209
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
206
210
|
const segment = segments[i];
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
if (segment.statusFiles) {
|
|
210
|
-
const exact = segment.statusFiles.get(statusStr);
|
|
211
|
-
if (exact) {
|
|
212
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Category catch-all
|
|
216
|
-
const category = segment.statusFiles.get('5xx');
|
|
217
|
-
if (category) {
|
|
218
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// error.tsx at this segment level (for 5xx, checked per-segment)
|
|
211
|
+
const r = lookupInGroup(segment.statusFiles, statusStr, '5xx', i, status);
|
|
212
|
+
if (r) return r;
|
|
223
213
|
if (segment.error) {
|
|
224
214
|
return { file: segment.error, status, kind: 'error', segmentIndex: i };
|
|
225
215
|
}
|
|
@@ -229,29 +219,22 @@ function resolve5xx(
|
|
|
229
219
|
}
|
|
230
220
|
|
|
231
221
|
/**
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
222
|
+
* JSON fallback chain (for both 4xx and 5xx) — single pass leaf→root.
|
|
223
|
+
*
|
|
224
|
+
* At each segment: {status}.json → {category}.json. No legacy compat,
|
|
225
|
+
* no error.tsx — the JSON chain terminates at the category catch-all
|
|
226
|
+
* and the caller falls back to a bare-JSON framework default.
|
|
235
227
|
*/
|
|
236
|
-
function
|
|
228
|
+
function resolveJson<TFile>(
|
|
237
229
|
status: number,
|
|
238
|
-
segments: ReadonlyArray<SegmentNode
|
|
239
|
-
): StatusFileResolution | null {
|
|
230
|
+
segments: ReadonlyArray<SegmentNode<TFile>>
|
|
231
|
+
): StatusFileResolution<TFile> | null {
|
|
240
232
|
const statusStr = String(status);
|
|
233
|
+
const categoryKey = status >= 500 ? '5xx' : '4xx';
|
|
241
234
|
|
|
242
235
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
243
|
-
const
|
|
244
|
-
if (
|
|
245
|
-
|
|
246
|
-
const exact = segment.jsonStatusFiles.get(statusStr);
|
|
247
|
-
if (exact) {
|
|
248
|
-
return { file: exact, status, kind: 'exact', segmentIndex: i };
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const category = segment.jsonStatusFiles.get('5xx');
|
|
252
|
-
if (category) {
|
|
253
|
-
return { file: category, status, kind: 'category', segmentIndex: i };
|
|
254
|
-
}
|
|
236
|
+
const r = lookupInGroup(segments[i].jsonStatusFiles, statusStr, categoryKey, i, status);
|
|
237
|
+
if (r) return r;
|
|
255
238
|
}
|
|
256
239
|
|
|
257
240
|
return null;
|
|
@@ -267,7 +250,9 @@ function resolve5xxJson(
|
|
|
267
250
|
*
|
|
268
251
|
* @param slotNode - The segment node for the slot (segmentType === 'slot').
|
|
269
252
|
*/
|
|
270
|
-
export function resolveSlotDenied(
|
|
253
|
+
export function resolveSlotDenied<TFile>(
|
|
254
|
+
slotNode: SegmentNode<TFile>
|
|
255
|
+
): SlotDeniedResolution<TFile> | null {
|
|
271
256
|
const slotName = slotNode.segmentName.replace(/^@/, '');
|
|
272
257
|
|
|
273
258
|
if (slotNode.denied) {
|