@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.160
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-C9yAuoX3.js +314 -0
- package/dist/_chunks/actions-C9yAuoX3.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-swbefQ6F.js +1125 -0
- package/dist/_chunks/cache-api-swbefQ6F.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.js +638 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.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-Bssfp6ot.js +82 -0
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/define-CFmvb4Bt.js +203 -0
- package/dist/_chunks/define-CFmvb4Bt.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/logger-CPoQkGK6.js +1523 -0
- package/dist/_chunks/logger-CPoQkGK6.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-DeAxFRMq.js +280 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.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-3iUvBV5T.js +50 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.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-BY3QLBL7.js +119 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.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/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.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-c8aReVgo.js +988 -0
- package/dist/_chunks/walkers-c8aReVgo.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 +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +117 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +177 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +342 -67
- package/dist/adapters/cloudflare.js.map +1 -1
- 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 +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -144
- 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/cache/cache-api.d.ts +26 -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 +27 -7
- 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/redis-handler.d.ts +97 -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 +51 -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 +34 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -33
- 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 +26 -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 +11 -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 +182 -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 +825 -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 +120 -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 +87 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +47 -14
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +4 -4
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -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/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 +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +304 -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 +253 -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} +2 -2
- 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 +158 -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 +7807 -13691
- 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 +190 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -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 +95 -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 +1 -1
- 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.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/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 +75 -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 +77 -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 +157 -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 +37 -440
- 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 +41 -6
- 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 +85 -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 +6 -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 +115 -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 +221 -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 +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- 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 +3577 -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 +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -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 +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +122 -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 +58 -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/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/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 +101 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +83 -31
- 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/route-element-builder.d.ts +39 -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/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 +51 -28
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +30 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -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 +5 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -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 +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -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 +7 -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 +12 -5
- 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 +62 -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 +16 -16
- 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 +199 -0
- package/docs/api/33-api-search-params.mdx +141 -0
- package/docs/api/34-api-config.mdx +189 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +76 -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 +136 -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 +168 -0
- package/docs/learn/13-configuration.mdx +145 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +139 -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 +102 -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 +179 -0
- package/src/adapters/cloudflare.ts +594 -119
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -96
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- 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 +88 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +122 -15
- 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 +233 -0
- package/src/cache/timber-cache.ts +142 -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 +388 -0
- package/src/cli.ts +157 -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 +111 -0
- package/src/client/browser-entry/post-hydration.ts +103 -0
- package/src/client/browser-entry/router-init.ts +287 -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 +11 -7
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +346 -150
- package/src/client/navigation-api.ts +341 -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 +482 -166
- package/src/client/rsc-fetch.ts +214 -33
- package/src/client/segment-cache.ts +7 -7
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -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 +49 -14
- 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 +9 -3
- 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 +147 -0
- package/src/config-types.ts +302 -0
- package/src/config-validation.ts +328 -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} +9 -5
- 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 +63 -8
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +316 -0
- package/src/fonts/transform.ts +305 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +431 -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 +378 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +186 -0
- package/src/plugins/callsite-ast.ts +167 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +144 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +293 -46
- package/src/plugins/entries.ts +129 -8
- package/src/plugins/fonts.ts +191 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +210 -0
- package/src/plugins/prebuilt.ts +700 -0
- package/src/plugins/prerender-sugar.ts +329 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +97 -12
- package/src/plugins/shims.ts +217 -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 +360 -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 +310 -0
- package/src/routing/manifest-codegen.ts +281 -0
- package/src/routing/scanner.ts +248 -188
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -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 +252 -0
- package/src/search-params/define.ts +570 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +110 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +84 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +39 -54
- package/src/server/als-registry.ts +129 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +13 -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 +311 -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 +437 -0
- package/src/server/html-injectors.ts +267 -254
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +331 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +538 -0
- package/src/server/pipeline.ts +226 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +224 -0
- package/src/server/prebuilt/capture-state.ts +89 -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/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +696 -0
- package/src/server/prebuilt-runtime.ts +708 -0
- package/src/server/primitives.ts +155 -63
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +523 -233
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +144 -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/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +160 -76
- package/src/server/rsc-entry/index.ts +393 -329
- package/src/server/rsc-entry/render-route.ts +284 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +72 -33
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +273 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +344 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +286 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -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.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/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,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
|
+
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import { Component, createElement, type ReactNode } from 'react';
|
|
22
22
|
import { getSsrData } from './ssr-data.js';
|
|
23
|
+
import { getRouterOrNull } from './router-ref.js';
|
|
23
24
|
|
|
24
25
|
// ─── Page Unload Detection ───────────────────────────────────────────────────
|
|
25
26
|
// Track whether the page is being unloaded (user refreshed or navigated away).
|
|
@@ -65,17 +66,24 @@ type ParsedDigest = DenyDigest | RenderErrorDigest | RedirectDigest;
|
|
|
65
66
|
|
|
66
67
|
export interface TimberErrorBoundaryProps {
|
|
67
68
|
/** The component to render when an error is caught. */
|
|
68
|
-
fallbackComponent
|
|
69
|
+
fallbackComponent?: (...args: unknown[]) => ReactNode;
|
|
70
|
+
/**
|
|
71
|
+
* Pre-rendered fallback element. Used for MDX status files which are server
|
|
72
|
+
* components and cannot be passed as function props across the RSC→client
|
|
73
|
+
* boundary. When set, rendered directly instead of calling fallbackComponent.
|
|
74
|
+
*
|
|
75
|
+
* See design/10-error-handling.md §"Status-Code File Variants" — MDX status
|
|
76
|
+
* files are server components by default (zero client JS).
|
|
77
|
+
*/
|
|
78
|
+
fallbackElement?: ReactNode;
|
|
69
79
|
/**
|
|
70
80
|
* Status code filter. If set, only catches errors matching this status.
|
|
71
81
|
* 400 = any 4xx, 500 = any 5xx, specific number = exact match.
|
|
72
82
|
*/
|
|
73
83
|
status?: number;
|
|
74
84
|
/**
|
|
75
|
-
* When true,
|
|
76
|
-
*
|
|
77
|
-
* boundaries should set this — segment boundaries (403.tsx, 4xx.tsx,
|
|
78
|
-
* error.tsx) must NOT, otherwise normal page denies get swallowed.
|
|
85
|
+
* When true, this boundary wraps a parallel slot. Slot denials are
|
|
86
|
+
* graceful degradation — they must NOT change the HTTP status code.
|
|
79
87
|
*/
|
|
80
88
|
isSlotBoundary?: boolean;
|
|
81
89
|
children: ReactNode;
|
|
@@ -86,6 +94,20 @@ interface TimberErrorBoundaryState {
|
|
|
86
94
|
error: Error | null;
|
|
87
95
|
}
|
|
88
96
|
|
|
97
|
+
// Module-level guard: the first boundary to catch a given redirect digest
|
|
98
|
+
// schedules the navigation and marks it handled here. Subsequent renders
|
|
99
|
+
// (React retries the error-boundary render path multiple times in dev, and
|
|
100
|
+
// outer boundaries that also see the error) become no-ops, preventing
|
|
101
|
+
// duplicate router.navigate() calls.
|
|
102
|
+
const _handledRedirects = new WeakSet<object>();
|
|
103
|
+
|
|
104
|
+
// Companion guard keyed by location: client-render redirect() (the
|
|
105
|
+
// next/navigation shim) throws a FRESH error instance on every render
|
|
106
|
+
// attempt, and React replays the errored render — so the WeakSet alone
|
|
107
|
+
// would schedule the navigation twice. While a navigation to a location
|
|
108
|
+
// is pending, further redirect errors for the same location are no-ops.
|
|
109
|
+
let _pendingRedirectLocation: string | null = null;
|
|
110
|
+
|
|
89
111
|
// ─── Component ───────────────────────────────────────────────────────────────
|
|
90
112
|
|
|
91
113
|
export class TimberErrorBoundary extends Component<
|
|
@@ -131,11 +153,55 @@ export class TimberErrorBoundary extends Component<
|
|
|
131
153
|
const error = this.state.error;
|
|
132
154
|
const parsed = parseDigest(error);
|
|
133
155
|
|
|
134
|
-
// RedirectSignal
|
|
135
|
-
//
|
|
136
|
-
//
|
|
156
|
+
// RedirectSignal handling splits by environment:
|
|
157
|
+
//
|
|
158
|
+
// - SSR (no window): re-throw so the Fizz shell fails and the server
|
|
159
|
+
// pipeline catch block can produce a proper HTTP 3xx response. See
|
|
160
|
+
// design/04-authorization.md.
|
|
161
|
+
//
|
|
162
|
+
// - Client (window exists): a RedirectSignal that leaked into the RSC
|
|
163
|
+
// Flight payload during client navigation would otherwise bubble past
|
|
164
|
+
// every error boundary to `window.onerror`, which in dev triggers the
|
|
165
|
+
// Vite error overlay (false positive — navigation itself works).
|
|
166
|
+
// Instead, ask the router to perform an SPA navigation to the target
|
|
167
|
+
// and render nothing while it takes over. The router's own catch path
|
|
168
|
+
// handles cross-origin / hard navigations. See TIM-838.
|
|
137
169
|
if (parsed?.type === 'redirect') {
|
|
138
|
-
|
|
170
|
+
if (typeof window === 'undefined') {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
// Dedupe: React may render the error-boundary fallback path more
|
|
174
|
+
// than once for a single caught error (dev-mode double render, and
|
|
175
|
+
// additional boundaries above us in the tree). Only schedule the
|
|
176
|
+
// navigation on the first render that sees this error instance.
|
|
177
|
+
const alreadyHandled =
|
|
178
|
+
_handledRedirects.has(error) || _pendingRedirectLocation === parsed.location;
|
|
179
|
+
if (!alreadyHandled) {
|
|
180
|
+
_handledRedirects.add(error);
|
|
181
|
+
const router = getRouterOrNull();
|
|
182
|
+
if (router) {
|
|
183
|
+
_pendingRedirectLocation = parsed.location;
|
|
184
|
+
// Schedule the navigation outside the render phase to avoid
|
|
185
|
+
// setState-during-render warnings from router state updates.
|
|
186
|
+
queueMicrotask(() => {
|
|
187
|
+
router
|
|
188
|
+
.navigate(parsed.location, { replace: true })
|
|
189
|
+
.catch(() => {
|
|
190
|
+
// Fall back to a hard navigation if the soft navigation fails.
|
|
191
|
+
window.location.href = parsed.location;
|
|
192
|
+
})
|
|
193
|
+
.finally(() => {
|
|
194
|
+
_pendingRedirectLocation = null;
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
} else {
|
|
198
|
+
// No router available (shouldn't happen post-bootstrap) — fall
|
|
199
|
+
// back to a hard navigation so the user still ends up at the
|
|
200
|
+
// target.
|
|
201
|
+
window.location.href = parsed.location;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
139
205
|
}
|
|
140
206
|
|
|
141
207
|
// If this boundary has a status filter, check whether the error matches.
|
|
@@ -148,23 +214,62 @@ export class TimberErrorBoundary extends Component<
|
|
|
148
214
|
}
|
|
149
215
|
}
|
|
150
216
|
|
|
151
|
-
// Report DenySignal handling
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
217
|
+
// Report DenySignal handling so the pipeline skips the redundant
|
|
218
|
+
// renderDenyPage() re-render — but ONLY when this boundary can fully
|
|
219
|
+
// handle the deny in-tree:
|
|
220
|
+
//
|
|
221
|
+
// ✅ TSX boundaries (fallbackComponent) — can receive runtime props
|
|
222
|
+
// (status, dangerouslyPassData) dynamically in render()
|
|
223
|
+
// ❌ MDX boundaries (fallbackElement) — pre-rendered at tree-build time,
|
|
224
|
+
// cannot receive runtime deny props. Must fall through to re-render.
|
|
225
|
+
//
|
|
226
|
+
// For qualifying segment boundaries: also set the HTTP status code from
|
|
227
|
+
// the DenySignal so the Response has the correct 4xx status. This runs
|
|
228
|
+
// synchronously during Fizz rendering, BEFORE onShellReady.
|
|
229
|
+
//
|
|
230
|
+
// For slot boundaries: set _denyHandledByBoundary but do NOT change
|
|
231
|
+
// statusCode — slot denials are graceful degradation.
|
|
232
|
+
//
|
|
233
|
+
// See TIM-664, LOCAL-298.
|
|
234
|
+
if (parsed?.type === 'deny') {
|
|
235
|
+
const canHandleInTree = this.props.fallbackElement == null;
|
|
236
|
+
|
|
237
|
+
if (canHandleInTree || this.props.isSlotBoundary) {
|
|
238
|
+
const ssrData = getSsrData();
|
|
239
|
+
if (ssrData?._navContext) {
|
|
240
|
+
ssrData._navContext._denyHandledByBoundary = true;
|
|
241
|
+
if (!this.props.isSlotBoundary) {
|
|
242
|
+
ssrData._navContext.statusCode = parsed.status;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
162
245
|
}
|
|
163
246
|
}
|
|
164
247
|
|
|
248
|
+
// Pre-rendered fallback element (MDX status files) — render directly.
|
|
249
|
+
// MDX components are server components that cannot be passed as function
|
|
250
|
+
// props across the RSC→client boundary. Instead, they are pre-rendered
|
|
251
|
+
// as elements in the RSC environment and passed here as fallbackElement.
|
|
252
|
+
if (this.props.fallbackElement != null) {
|
|
253
|
+
return this.props.fallbackElement;
|
|
254
|
+
}
|
|
255
|
+
|
|
165
256
|
// Render the fallback component with the right props shape.
|
|
166
257
|
if (parsed?.type === 'deny') {
|
|
258
|
+
// Status-code file boundaries (404.tsx, 4xx.tsx, …) get the documented
|
|
259
|
+
// 4xx props. error.tsx boundaries (no status filter) get their
|
|
260
|
+
// documented { error, digest, reset } contract — plus the deny extras
|
|
261
|
+
// for dual-shape implementations. Without the error prop, an error.tsx
|
|
262
|
+
// reading error.message crashes on deny fall-through. See TIM-1081.
|
|
263
|
+
if (this.props.status != null) {
|
|
264
|
+
return createElement(this.props.fallbackComponent as never, {
|
|
265
|
+
status: parsed.status,
|
|
266
|
+
dangerouslyPassData: parsed.data,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
167
269
|
return createElement(this.props.fallbackComponent as never, {
|
|
270
|
+
error,
|
|
271
|
+
digest: null,
|
|
272
|
+
reset: this.reset,
|
|
168
273
|
status: parsed.status,
|
|
169
274
|
dangerouslyPassData: parsed.data,
|
|
170
275
|
});
|
|
@@ -196,8 +301,8 @@ function parseDigest(error: Error): ParsedDigest | null {
|
|
|
196
301
|
if (parsed && typeof parsed === 'object' && typeof parsed.type === 'string') {
|
|
197
302
|
return parsed as ParsedDigest;
|
|
198
303
|
}
|
|
199
|
-
} catch {
|
|
200
|
-
|
|
304
|
+
} catch (e) {
|
|
305
|
+
console.debug('[timber] error digest is not valid JSON:', e instanceof Error ? e.message : e);
|
|
201
306
|
}
|
|
202
307
|
return null;
|
|
203
308
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Reconstitutes a SerializableError into a real Error instance before
|
|
5
|
+
* passing to the user's error component.
|
|
6
|
+
*
|
|
7
|
+
* TSX error pages are 'use client' components that receive { error: Error, digest, reset }.
|
|
8
|
+
* Error objects are not RSC-serializable (React Flight throws "Only plain objects
|
|
9
|
+
* can be passed to Client Components"). This wrapper receives the error as a plain
|
|
10
|
+
* SerializableError object, reconstitutes a real Error instance, and passes it
|
|
11
|
+
* to the user's error component — ensuring error instanceof Error works correctly.
|
|
12
|
+
*
|
|
13
|
+
* See design/spike-TIM-565-unify-error-pages.md §"Edge Case B"
|
|
14
|
+
* See design/10-error-handling.md §"RSC → SSR for Error Pages via SerializableError"
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createElement, type ReactNode, type ComponentType } from 'react';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Plain-object representation of an Error that can cross the RSC → client boundary.
|
|
21
|
+
* Stack is only included in dev mode (gated by isDevMode() on the server).
|
|
22
|
+
*/
|
|
23
|
+
export interface SerializableError {
|
|
24
|
+
message: string;
|
|
25
|
+
name: string;
|
|
26
|
+
stack?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Props for the ErrorReconstituter wrapper component.
|
|
31
|
+
* All props are RSC-serializable:
|
|
32
|
+
* - error: plain object (SerializableError)
|
|
33
|
+
* - digest: plain JSON or null
|
|
34
|
+
* - reset: undefined (only meaningful on client after boundary catch)
|
|
35
|
+
* - component: client module reference (RSC Flight serializes as opaque ref)
|
|
36
|
+
* - status / dangerouslyPassData: set only when error.tsx serves a deny()
|
|
37
|
+
* as the last entry in the 4xx fallback chain — forwarded so dual-shape
|
|
38
|
+
* error.tsx implementations can branch on the deny status (TIM-1081)
|
|
39
|
+
*/
|
|
40
|
+
interface ErrorReconstituterProps {
|
|
41
|
+
error: SerializableError;
|
|
42
|
+
digest: { code: string; data: unknown } | null;
|
|
43
|
+
reset: undefined;
|
|
44
|
+
component: ComponentType<{
|
|
45
|
+
error: Error;
|
|
46
|
+
digest: { code: string; data: unknown } | null;
|
|
47
|
+
reset: (() => void) | undefined;
|
|
48
|
+
status?: number;
|
|
49
|
+
dangerouslyPassData?: unknown;
|
|
50
|
+
}>;
|
|
51
|
+
status?: number;
|
|
52
|
+
dangerouslyPassData?: unknown;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Reconstitute a SerializableError into a real Error instance and render
|
|
57
|
+
* the user's error component with the proper props.
|
|
58
|
+
*/
|
|
59
|
+
export function ErrorReconstituter({
|
|
60
|
+
error: serialized,
|
|
61
|
+
digest,
|
|
62
|
+
reset,
|
|
63
|
+
component,
|
|
64
|
+
status,
|
|
65
|
+
dangerouslyPassData,
|
|
66
|
+
}: ErrorReconstituterProps): ReactNode {
|
|
67
|
+
// Reconstitute a real Error so instanceof checks work in user code
|
|
68
|
+
const error = Object.assign(new Error(serialized.message), {
|
|
69
|
+
name: serialized.name,
|
|
70
|
+
...(serialized.stack != null ? { stack: serialized.stack } : {}),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return createElement(component, {
|
|
74
|
+
error,
|
|
75
|
+
digest,
|
|
76
|
+
reset,
|
|
77
|
+
...(status != null ? { status, dangerouslyPassData } : {}),
|
|
78
|
+
});
|
|
79
|
+
}
|
package/src/client/form.tsx
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { useActionState as reactUseActionState, useTransition } from 'react';
|
|
15
|
-
import type { ActionResult, ValidationErrors } from '
|
|
16
|
-
import type { FormFlashData } from '
|
|
15
|
+
import type { ActionFn, ActionResult, InputHint, ValidationErrors } from '../server/action-client';
|
|
16
|
+
import type { FormFlashData } from '../server/form-flash';
|
|
17
17
|
|
|
18
18
|
// ─── Types ───────────────────────────────────────────────────────────────
|
|
19
19
|
|
|
@@ -27,13 +27,15 @@ export type UseActionStateFn<TData> = (
|
|
|
27
27
|
) => Promise<ActionResult<TData>>;
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
* Return type of useActionState
|
|
31
|
-
* [result, formAction, isPending]
|
|
30
|
+
* Return type of useActionState.
|
|
31
|
+
* [result, formAction, isPending, errors]
|
|
32
|
+
* The 4th element is auto-derived from result via useFormErrors logic.
|
|
32
33
|
*/
|
|
33
34
|
export type UseActionStateReturn<TData> = [
|
|
34
35
|
result: ActionResult<TData> | null,
|
|
35
36
|
formAction: (formData: FormData) => void,
|
|
36
37
|
isPending: boolean,
|
|
38
|
+
errors: FormErrorsResult,
|
|
37
39
|
];
|
|
38
40
|
|
|
39
41
|
// ─── useActionState ──────────────────────────────────────────────────────
|
|
@@ -73,7 +75,13 @@ export function useActionState<TData>(
|
|
|
73
75
|
): UseActionStateReturn<TData> {
|
|
74
76
|
// FormFlashData is structurally compatible with ActionResult at runtime —
|
|
75
77
|
// the cast satisfies React's generic inference which would otherwise widen TData.
|
|
76
|
-
|
|
78
|
+
const [result, formAction, isPending] = reactUseActionState(
|
|
79
|
+
action,
|
|
80
|
+
initialState as ActionResult<TData> | null,
|
|
81
|
+
permalink
|
|
82
|
+
);
|
|
83
|
+
const errors = deriveFormErrors(result);
|
|
84
|
+
return [result, formAction, isPending, errors];
|
|
77
85
|
}
|
|
78
86
|
|
|
79
87
|
// ─── useFormAction ───────────────────────────────────────────────────────
|
|
@@ -90,15 +98,22 @@ export function useActionState<TData>(
|
|
|
90
98
|
* </button>
|
|
91
99
|
* ```
|
|
92
100
|
*/
|
|
93
|
-
export function useFormAction<TData>(
|
|
94
|
-
action: (input:
|
|
95
|
-
): [
|
|
101
|
+
export function useFormAction<TData = unknown, TInput = unknown>(
|
|
102
|
+
action: ActionFn<TData, TInput> | ((input: TInput) => Promise<ActionResult<TData>>)
|
|
103
|
+
): [
|
|
104
|
+
(
|
|
105
|
+
...args: undefined extends TInput ? [input?: InputHint<TInput>] : [input: InputHint<TInput>]
|
|
106
|
+
) => Promise<ActionResult<TData>>,
|
|
107
|
+
boolean,
|
|
108
|
+
] {
|
|
96
109
|
const [isPending, startTransition] = useTransition();
|
|
97
110
|
|
|
98
|
-
const execute = (input?:
|
|
111
|
+
const execute = (input?: InputHint<TInput>): Promise<ActionResult<TData>> => {
|
|
99
112
|
return new Promise((resolve) => {
|
|
100
113
|
startTransition(async () => {
|
|
101
|
-
const result = await action(input)
|
|
114
|
+
const result = await (action as (input: InputHint<TInput>) => Promise<ActionResult<TData>>)(
|
|
115
|
+
input as InputHint<TInput>
|
|
116
|
+
);
|
|
102
117
|
resolve(result);
|
|
103
118
|
});
|
|
104
119
|
});
|
|
@@ -107,9 +122,9 @@ export function useFormAction<TData>(
|
|
|
107
122
|
return [execute, isPending];
|
|
108
123
|
}
|
|
109
124
|
|
|
110
|
-
// ───
|
|
125
|
+
// ─── Form error extraction ────────────────────────────────────────────────
|
|
111
126
|
|
|
112
|
-
/** Return type of
|
|
127
|
+
/** Return type of the errors element in useActionState. */
|
|
113
128
|
export interface FormErrorsResult {
|
|
114
129
|
/** Per-field validation errors keyed by field name. */
|
|
115
130
|
fieldErrors: Record<string, string[]>;
|
|
@@ -124,27 +139,11 @@ export interface FormErrorsResult {
|
|
|
124
139
|
}
|
|
125
140
|
|
|
126
141
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* since it's used in render. Accepts the result from `useActionState`
|
|
131
|
-
* or flash data from `getFormFlash()`.
|
|
132
|
-
*
|
|
133
|
-
* @example
|
|
134
|
-
* ```tsx
|
|
135
|
-
* const [result, action, isPending] = useActionState(createTodo, null)
|
|
136
|
-
* const errors = useFormErrors(result)
|
|
137
|
-
*
|
|
138
|
-
* return (
|
|
139
|
-
* <form action={action}>
|
|
140
|
-
* <input name="title" />
|
|
141
|
-
* {errors.getFieldError('title') && <p>{errors.getFieldError('title')}</p>}
|
|
142
|
-
* {errors.formErrors.map(e => <p key={e}>{e}</p>)}
|
|
143
|
-
* </form>
|
|
144
|
-
* )
|
|
145
|
-
* ```
|
|
142
|
+
* Derive FormErrorsResult from an action result.
|
|
143
|
+
* Used internally by useActionState 4th tuple element.
|
|
144
|
+
* @internal — exported for test access only.
|
|
146
145
|
*/
|
|
147
|
-
export function
|
|
146
|
+
export function deriveFormErrors<TData>(
|
|
148
147
|
result:
|
|
149
148
|
| ActionResult<TData>
|
|
150
149
|
| {
|
package/src/client/history.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
// History Stack — stores RSC payloads by URL for instant back/forward navigation
|
|
2
2
|
// See design/19-client-navigation.md § History Stack
|
|
3
3
|
|
|
4
|
-
import type { HeadElement } from './head';
|
|
5
|
-
|
|
6
4
|
// ─── Types ───────────────────────────────────────────────────────
|
|
7
5
|
|
|
8
6
|
export interface HistoryEntry {
|
|
9
7
|
/** The complete segment tree payload at the time of navigation */
|
|
10
8
|
payload: unknown;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Route params for this page (for useSegmentParams). Every entry that can
|
|
11
|
+
* be replayed must carry them — the initial SSR entry gets them from the
|
|
12
|
+
* server-embedded __timber_params, navigation entries from X-Timber-Params,
|
|
13
|
+
* and revalidation overwrites preserve the current state (TIM-1037).
|
|
14
|
+
*/
|
|
14
15
|
params?: Record<string, string | string[]> | null;
|
|
15
16
|
}
|
|
16
17
|
|
|
@@ -23,8 +24,11 @@ export interface HistoryEntry {
|
|
|
23
24
|
* On forward navigation, the new page's payload is pushed onto the stack.
|
|
24
25
|
* On popstate, the cached payload is replayed instantly.
|
|
25
26
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
27
|
+
* Entries are keyed by pathname + search. Used with the History API
|
|
28
|
+
* fallback and the Navigation API.
|
|
29
|
+
*
|
|
30
|
+
* Scroll positions are stored in history.state or Navigation API entry
|
|
31
|
+
* state, not in this stack — see design/19-client-navigation.md §Scroll Restoration.
|
|
28
32
|
*
|
|
29
33
|
* Entries persist for the session duration (no expiry) and are cleared
|
|
30
34
|
* when the tab is closed — matching browser back-button behavior.
|