@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.121
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/dist/_chunks/actions-Dy8vOjFt.js +1101 -0
- package/dist/_chunks/actions-Dy8vOjFt.js.map +1 -0
- package/dist/_chunks/build-output-helper-B1n0sUqj.js +61 -0
- package/dist/_chunks/build-output-helper-B1n0sUqj.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-ByZPGGmS.js +724 -0
- package/dist/_chunks/cli-schema-sync-ByZPGGmS.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DHQLjFu3.js +2 -0
- package/dist/_chunks/codec-registry-G9hD5LOq.js +21 -0
- package/dist/_chunks/codec-registry-G9hD5LOq.js.map +1 -0
- package/dist/_chunks/define-CPVQaWbx.js +124 -0
- package/dist/_chunks/define-CPVQaWbx.js.map +1 -0
- package/dist/_chunks/define-jeHDXZGq.js +195 -0
- package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
- package/dist/_chunks/format-BjN9HLu9.js +14 -0
- package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
- package/dist/_chunks/handler-store-CcwNX-gk.js +54 -0
- package/dist/_chunks/handler-store-CcwNX-gk.js.map +1 -0
- package/dist/_chunks/logger-DDmK5skc.js +291 -0
- package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
- package/dist/_chunks/merge-search-params-az6ZiBeU.js +41 -0
- package/dist/_chunks/merge-search-params-az6ZiBeU.js.map +1 -0
- package/dist/_chunks/navigation-root-DoRTeBm5.js +96 -0
- package/dist/_chunks/navigation-root-DoRTeBm5.js.map +1 -0
- package/dist/_chunks/registry-BI9cgCt7.js +20 -0
- package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js +73 -0
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js.map +1 -0
- package/dist/_chunks/router-ref-CpvjBqdu.js +28 -0
- package/dist/_chunks/router-ref-CpvjBqdu.js.map +1 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
- package/dist/_chunks/segment-context-EsfQpS--.js +34 -0
- package/dist/_chunks/segment-context-EsfQpS--.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-m9-cNEIw.js} +1 -1
- package/dist/_chunks/ssr-data-m9-cNEIw.js.map +1 -0
- package/dist/_chunks/stale-reload-BN2kcE06.js +64 -0
- package/dist/_chunks/stale-reload-BN2kcE06.js.map +1 -0
- package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
- package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
- package/dist/_chunks/use-segment-params-CtIAjqK0.js +185 -0
- package/dist/_chunks/use-segment-params-CtIAjqK0.js.map +1 -0
- package/dist/_chunks/validation-BMU5MPzP.js +84 -0
- package/dist/_chunks/validation-BMU5MPzP.js.map +1 -0
- package/dist/_chunks/walkers-DNp9tHyV.js +719 -0
- package/dist/_chunks/walkers-DNp9tHyV.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
- package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -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 +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +151 -81
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- 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/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +37 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +42 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -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 +30 -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 +23 -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 +19 -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 +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -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 +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +172 -1100
- 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 +964 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- 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 +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.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/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.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-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- 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-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 +294 -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 +251 -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 +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -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/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- 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/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -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/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4807 -12729
- 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 +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.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 +1 -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 +17 -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/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 +6 -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 +63 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -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/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-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 +76 -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 +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 +95 -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 +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +53 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.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 +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/debug.d.ts +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 +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- 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 -5
- 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/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -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 +155 -2905
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2947 -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/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -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 +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- 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/primitives.d.ts +69 -18
- 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/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- 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 +21 -34
- 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 +2 -2
- 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 +49 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -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/rsc-payload.d.ts +3 -3
- 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 +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -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 +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +30 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -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.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- 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 +41 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +49 -4
- 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/version-skew.d.ts +61 -0
- package/dist/server/version-skew.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/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 +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- 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/package.json +62 -21
- package/src/adapters/build-output-helper.ts +77 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +142 -59
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli-schema-sync.ts +207 -0
- package/src/cli.ts +65 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +126 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +149 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +69 -44
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +366 -113
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +300 -73
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +506 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- 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 +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +409 -357
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +114 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +101 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +175 -35
- package/src/plugins/entries.ts +111 -9
- package/src/plugins/fonts.ts +157 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +371 -45
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +109 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +316 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +165 -110
- 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 +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +336 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +55 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +176 -0
- package/src/server/pipeline-phases.ts +460 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -333
- package/src/server/route-element-builder.ts +309 -195
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +50 -231
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +137 -12
- package/src/server/rsc-entry/index.ts +316 -352
- package/src/server/rsc-entry/render-route.ts +307 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +187 -38
- 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 +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-entry.ts +229 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/tree-match.ts +198 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.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/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/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- 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/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.map +0 -1
- package/dist/server/dev-warnings.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/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.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/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -166
- 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/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { RouteContext } from './types.js';
|
|
12
|
+
import { logRouteError } from './logger.js';
|
|
12
13
|
|
|
13
14
|
// ─── Types ───────────────────────────────────────────────────────────────
|
|
14
15
|
|
|
@@ -122,7 +123,7 @@ async function runHandler(handler: RouteHandler, ctx: RouteContext): Promise<Res
|
|
|
122
123
|
const res = await handler(ctx);
|
|
123
124
|
return mergeResponseHeaders(res, ctx.headers);
|
|
124
125
|
} catch (error) {
|
|
125
|
-
|
|
126
|
+
logRouteError({ method: ctx.req.method, path: new URL(ctx.req.url).pathname, error });
|
|
126
127
|
return new Response(null, { status: 500 });
|
|
127
128
|
}
|
|
128
129
|
}
|
|
@@ -140,10 +141,29 @@ function mergeResponseHeaders(res: Response, ctxHeaders: Headers): Response {
|
|
|
140
141
|
});
|
|
141
142
|
if (!hasCtxHeaders) return res;
|
|
142
143
|
|
|
143
|
-
// Merge: ctx.headers first, then handler response headers override
|
|
144
|
+
// Merge: ctx.headers first, then handler response headers override.
|
|
145
|
+
// Set-Cookie needs special handling: Headers.set() replaces all values
|
|
146
|
+
// for a key, but each Set-Cookie must be its own header per RFC 6265 §4.1.
|
|
147
|
+
// Use append for Set-Cookie, set for everything else.
|
|
144
148
|
const merged = new Headers();
|
|
145
|
-
ctxHeaders.forEach((value, key) =>
|
|
146
|
-
|
|
149
|
+
ctxHeaders.forEach((value, key) => {
|
|
150
|
+
if (key.toLowerCase() === 'set-cookie') {
|
|
151
|
+
merged.append(key, value);
|
|
152
|
+
} else {
|
|
153
|
+
merged.set(key, value);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Response Set-Cookie headers: use getSetCookie() to preserve individual
|
|
157
|
+
// cookies (forEach joins them with ", " into one entry).
|
|
158
|
+
const resCookies = res.headers.getSetCookie();
|
|
159
|
+
for (const cookie of resCookies) {
|
|
160
|
+
merged.append('Set-Cookie', cookie);
|
|
161
|
+
}
|
|
162
|
+
res.headers.forEach((value, key) => {
|
|
163
|
+
if (key.toLowerCase() !== 'set-cookie') {
|
|
164
|
+
merged.set(key, value);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
147
167
|
|
|
148
168
|
return new Response(res.body, {
|
|
149
169
|
status: res.status,
|
|
@@ -10,65 +10,50 @@
|
|
|
10
10
|
|
|
11
11
|
import type { RouteMatch } from './pipeline.js';
|
|
12
12
|
import type { MiddlewareFn } from './middleware-runner.js';
|
|
13
|
+
import type { SegmentNode, RouteTree } from '../routing/types.js';
|
|
13
14
|
import {
|
|
14
15
|
METADATA_ROUTE_CONVENTIONS,
|
|
15
16
|
isStaticMetadataExtension,
|
|
16
17
|
resolveStaticContentType,
|
|
17
18
|
type MetadataRouteType,
|
|
18
19
|
} from './metadata-routes.js';
|
|
20
|
+
import { matchUrlParts } from './tree-match.js';
|
|
19
21
|
|
|
20
22
|
// ─── Manifest Types ───────────────────────────────────────────────────────
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
+
//
|
|
24
|
+
// TIM-848: the runtime route manifest re-uses the same `SegmentNode<TFile>`
|
|
25
|
+
// / `RouteTree<TFile>` interfaces from `routing/types.ts`. The only
|
|
26
|
+
// difference between build-time and runtime is the file reference payload
|
|
27
|
+
// — build-time has `{ filePath, extension }`, runtime has `{ filePath, load }`.
|
|
28
|
+
// Walkers parameterized over `TFile` work on either; there is no separate
|
|
29
|
+
// "manifest" tree shape.
|
|
23
30
|
|
|
24
31
|
/** A file reference in the manifest (lazy import + path). */
|
|
25
|
-
interface ManifestFile {
|
|
32
|
+
export interface ManifestFile {
|
|
26
33
|
load: () => Promise<unknown>;
|
|
27
34
|
filePath: string;
|
|
28
35
|
}
|
|
29
36
|
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
| 'group'
|
|
39
|
-
| 'slot'
|
|
40
|
-
| 'intercepting';
|
|
41
|
-
urlPath: string;
|
|
42
|
-
paramName?: string;
|
|
43
|
-
/** For intercepting segments: the marker used, e.g. "(.)". */
|
|
44
|
-
interceptionMarker?: '(.)' | '(..)' | '(...)' | '(..)(..)';
|
|
45
|
-
/** For intercepting segments: the segment name after stripping the marker. */
|
|
46
|
-
interceptedSegmentName?: string;
|
|
47
|
-
|
|
48
|
-
page?: ManifestFile;
|
|
49
|
-
layout?: ManifestFile;
|
|
50
|
-
middleware?: ManifestFile;
|
|
51
|
-
access?: ManifestFile;
|
|
52
|
-
route?: ManifestFile;
|
|
53
|
-
error?: ManifestFile;
|
|
54
|
-
default?: ManifestFile;
|
|
55
|
-
denied?: ManifestFile;
|
|
56
|
-
searchParams?: ManifestFile;
|
|
57
|
-
statusFiles?: Record<string, ManifestFile>;
|
|
58
|
-
jsonStatusFiles?: Record<string, ManifestFile>;
|
|
59
|
-
legacyStatusFiles?: Record<string, ManifestFile>;
|
|
60
|
-
prerender?: ManifestFile;
|
|
61
|
-
/** Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.) keyed by base name */
|
|
62
|
-
metadataRoutes?: Record<string, ManifestFile>;
|
|
63
|
-
|
|
64
|
-
children: ManifestSegmentNode[];
|
|
65
|
-
slots: Record<string, ManifestSegmentNode>;
|
|
66
|
-
}
|
|
37
|
+
/**
|
|
38
|
+
* A segment node as it appears in the virtual:timber-route-manifest module.
|
|
39
|
+
*
|
|
40
|
+
* Type alias for `SegmentNode<ManifestFile>` — the same shape used by the
|
|
41
|
+
* scanner, only with lazy `load` functions instead of build-time extension
|
|
42
|
+
* metadata.
|
|
43
|
+
*/
|
|
44
|
+
export type ManifestSegmentNode = SegmentNode<ManifestFile>;
|
|
67
45
|
|
|
68
|
-
/**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
46
|
+
/**
|
|
47
|
+
* The manifest shape from virtual:timber-route-manifest.
|
|
48
|
+
*
|
|
49
|
+
* Extends `RouteTree<ManifestFile>` with `viteRoot`, the absolute path
|
|
50
|
+
* to the Vite project root captured at build/load time. Used by dev-only
|
|
51
|
+
* features (e.g., dev error page frame classification) that need a
|
|
52
|
+
* correct project root even when CWD differs (e.g., monorepo custom root).
|
|
53
|
+
* See TIM-807 / TIM-808.
|
|
54
|
+
*/
|
|
55
|
+
export interface ManifestRoot extends RouteTree<ManifestFile> {
|
|
56
|
+
viteRoot: string;
|
|
72
57
|
}
|
|
73
58
|
|
|
74
59
|
// ─── Matcher ──────────────────────────────────────────────────────────────
|
|
@@ -88,201 +73,35 @@ export function createRouteMatcher(
|
|
|
88
73
|
/**
|
|
89
74
|
* Match a canonical pathname against the segment tree.
|
|
90
75
|
*
|
|
91
|
-
* Splits the pathname into segments and
|
|
92
|
-
*
|
|
76
|
+
* Splits the pathname into segments and delegates to the shared
|
|
77
|
+
* tree walker. Collects middleware from the matched segment chain.
|
|
93
78
|
*/
|
|
94
79
|
function matchPathname(root: ManifestSegmentNode, pathname: string): RouteMatch | null {
|
|
95
|
-
// Split pathname into segments: "/blog/hello-world" → ["blog", "hello-world"]
|
|
96
|
-
// "/" → [] (empty segments)
|
|
97
80
|
const parts = pathname === '/' ? [] : pathname.slice(1).split('/');
|
|
98
81
|
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
let middleware: MiddlewareFn | undefined;
|
|
113
|
-
if (leafSegment?.middleware) {
|
|
114
|
-
const loader = leafSegment.middleware.load;
|
|
115
|
-
middleware = async (ctx) => {
|
|
116
|
-
const mod = (await loader()) as { default?: MiddlewareFn };
|
|
117
|
-
if (mod.default) {
|
|
118
|
-
return mod.default(ctx);
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return {
|
|
124
|
-
// The pipeline uses segments as opaque objects passed to the renderer.
|
|
125
|
-
// Cast is safe — the renderer receives what the manifest provides.
|
|
126
|
-
segments: segments as unknown as RouteMatch['segments'],
|
|
127
|
-
params,
|
|
128
|
-
middleware,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* An effective child flattened through group segments.
|
|
134
|
-
* Includes the chain of group nodes that must be added to the segments
|
|
135
|
-
* array before the child itself (to preserve the group → child nesting
|
|
136
|
-
* that the renderer expects).
|
|
137
|
-
*/
|
|
138
|
-
interface EffectiveChild {
|
|
139
|
-
child: ManifestSegmentNode;
|
|
140
|
-
groupChain: ManifestSegmentNode[];
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Collect effective children by flattening through group segments.
|
|
145
|
-
*
|
|
146
|
-
* Groups are transparent for URL matching — their non-group descendants
|
|
147
|
-
* are returned with the chain of group nodes that lead to them. This
|
|
148
|
-
* allows the caller to apply priority ordering (static > dynamic > ...)
|
|
149
|
-
* across all groups uniformly instead of per-group.
|
|
150
|
-
*/
|
|
151
|
-
function collectEffectiveChildren(
|
|
152
|
-
node: ManifestSegmentNode,
|
|
153
|
-
groupChain: ManifestSegmentNode[] = []
|
|
154
|
-
): EffectiveChild[] {
|
|
155
|
-
const result: EffectiveChild[] = [];
|
|
156
|
-
for (const child of node.children) {
|
|
157
|
-
if (child.segmentType === 'group') {
|
|
158
|
-
// Look through the group — its children become effective children
|
|
159
|
-
// with this group prepended to their chain
|
|
160
|
-
const nested = collectEffectiveChildren(child, [...groupChain, child]);
|
|
161
|
-
result.push(...nested);
|
|
162
|
-
} else {
|
|
163
|
-
result.push({ child, groupChain });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return result;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Recursively match URL segments against the segment tree.
|
|
171
|
-
*
|
|
172
|
-
* Priority order for children at each level:
|
|
173
|
-
* 1. Static segments (exact match)
|
|
174
|
-
* 2. Dynamic segments ([param])
|
|
175
|
-
* 3. Catch-all segments ([...param])
|
|
176
|
-
* 4. Optional catch-all segments ([[...param]])
|
|
177
|
-
*
|
|
178
|
-
* Groups are transparent — they don't consume URL segments. Children
|
|
179
|
-
* are flattened through groups so that priority ordering applies across
|
|
180
|
-
* all groups uniformly (a static in group A always beats a dynamic in
|
|
181
|
-
* group B, regardless of group ordering).
|
|
182
|
-
*/
|
|
183
|
-
function matchSegments(
|
|
184
|
-
node: ManifestSegmentNode,
|
|
185
|
-
parts: string[],
|
|
186
|
-
index: number,
|
|
187
|
-
segments: ManifestSegmentNode[],
|
|
188
|
-
params: Record<string, string | string[]>
|
|
189
|
-
): boolean {
|
|
190
|
-
segments.push(node);
|
|
191
|
-
|
|
192
|
-
// All parts consumed — check if this node has a page or route
|
|
193
|
-
if (index >= parts.length) {
|
|
194
|
-
if (node.page || node.route) {
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// Check group children (they don't consume URL segments)
|
|
199
|
-
for (const child of node.children) {
|
|
200
|
-
if (child.segmentType === 'group') {
|
|
201
|
-
if (matchSegments(child, parts, index, segments, params)) {
|
|
202
|
-
return true;
|
|
82
|
+
const result = matchUrlParts(root, parts);
|
|
83
|
+
if (!result) return null;
|
|
84
|
+
|
|
85
|
+
// Collect middleware from all segments in the chain, root to leaf.
|
|
86
|
+
// Each middleware is lazy-loaded via dynamic import on first invocation.
|
|
87
|
+
const middlewareChain: MiddlewareFn[] = [];
|
|
88
|
+
for (const segment of result.chain) {
|
|
89
|
+
if (segment.middleware) {
|
|
90
|
+
const loader = segment.middleware.load;
|
|
91
|
+
middlewareChain.push(async (ctx) => {
|
|
92
|
+
const mod = (await loader()) as { default?: MiddlewareFn };
|
|
93
|
+
if (mod.default) {
|
|
94
|
+
return mod.default(ctx);
|
|
203
95
|
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Check optional catch-all children (direct and through groups)
|
|
208
|
-
const effective = collectEffectiveChildren(node);
|
|
209
|
-
for (const { child, groupChain } of effective) {
|
|
210
|
-
if (child.segmentType === 'optional-catch-all') {
|
|
211
|
-
if (child.page || child.route) {
|
|
212
|
-
segments.push(...groupChain, child);
|
|
213
|
-
// Zero segments → param is undefined (not set), matching Next.js semantics
|
|
214
|
-
return true;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
segments.pop();
|
|
220
|
-
return false;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
const part = parts[index];
|
|
224
|
-
|
|
225
|
-
// Flatten children through groups so priority ordering applies globally
|
|
226
|
-
// across all groups, not per-group.
|
|
227
|
-
const effective = collectEffectiveChildren(node);
|
|
228
|
-
|
|
229
|
-
// 1. Static segments
|
|
230
|
-
for (const { child, groupChain } of effective) {
|
|
231
|
-
if (child.segmentType === 'static' && child.segmentName === part) {
|
|
232
|
-
segments.push(...groupChain);
|
|
233
|
-
if (matchSegments(child, parts, index + 1, segments, params)) {
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
// Backtrack group chain
|
|
237
|
-
segments.length -= groupChain.length;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// 2. Dynamic segments ([param])
|
|
242
|
-
for (const { child, groupChain } of effective) {
|
|
243
|
-
if (child.segmentType === 'dynamic' && child.paramName) {
|
|
244
|
-
segments.push(...groupChain);
|
|
245
|
-
const prevParam = params[child.paramName];
|
|
246
|
-
params[child.paramName] = part;
|
|
247
|
-
if (matchSegments(child, parts, index + 1, segments, params)) {
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
// Backtrack
|
|
251
|
-
segments.length -= groupChain.length;
|
|
252
|
-
if (prevParam !== undefined) {
|
|
253
|
-
params[child.paramName] = prevParam;
|
|
254
|
-
} else {
|
|
255
|
-
delete params[child.paramName];
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// 3. Catch-all segments ([...param])
|
|
261
|
-
for (const { child, groupChain } of effective) {
|
|
262
|
-
if (child.segmentType === 'catch-all' && child.paramName) {
|
|
263
|
-
if (child.page || child.route) {
|
|
264
|
-
const remaining = parts.slice(index);
|
|
265
|
-
segments.push(...groupChain, child);
|
|
266
|
-
params[child.paramName] = remaining;
|
|
267
|
-
return true;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// 4. Optional catch-all segments ([[...param]])
|
|
273
|
-
for (const { child, groupChain } of effective) {
|
|
274
|
-
if (child.segmentType === 'optional-catch-all' && child.paramName) {
|
|
275
|
-
if (child.page || child.route) {
|
|
276
|
-
const remaining = parts.slice(index);
|
|
277
|
-
segments.push(...groupChain, child);
|
|
278
|
-
params[child.paramName] = remaining;
|
|
279
|
-
return true;
|
|
280
|
-
}
|
|
96
|
+
});
|
|
281
97
|
}
|
|
282
98
|
}
|
|
283
99
|
|
|
284
|
-
|
|
285
|
-
|
|
100
|
+
return {
|
|
101
|
+
segments: result.chain,
|
|
102
|
+
segmentParams: result.params,
|
|
103
|
+
middlewareChain,
|
|
104
|
+
};
|
|
286
105
|
}
|
|
287
106
|
|
|
288
107
|
// ─── Metadata Route Matcher ─────────────────────────────────────────────
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware-on-actions runner — runs the matched route's `middleware.ts`
|
|
3
|
+
* chain for an action POST inside its own `runWithRequestContext` scope
|
|
4
|
+
* and returns a `MiddlewareOutcome` value the dispatcher can translate.
|
|
5
|
+
*
|
|
6
|
+
* Lifted out of `wrap-action-dispatch.ts` (TIM-853) so the dispatcher
|
|
7
|
+
* can be read top-to-bottom without scrolling past the chain runner. The
|
|
8
|
+
* function is intentionally a free function (not a closure over deps)
|
|
9
|
+
* so it can be unit-tested in isolation. It does not import virtual
|
|
10
|
+
* modules and does not call into the action handler — it owns exactly
|
|
11
|
+
* the "run middleware once" step and nothing else.
|
|
12
|
+
*
|
|
13
|
+
* Failure modes are encoded as outcome variants rather than thrown so the
|
|
14
|
+
* caller never has to wrap this in try/catch. The only thrown errors are
|
|
15
|
+
* truly unexpected (programmer bugs) and propagate naturally.
|
|
16
|
+
*
|
|
17
|
+
* See TIM-871 for the full design rationale (closing the
|
|
18
|
+
* CVE-2025-29927-class bug where actions silently bypass middleware).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { getCookiesForSsr, getSetCookieHeaders } from '../cookie-context.js';
|
|
22
|
+
import {
|
|
23
|
+
applyRequestHeaderOverlay,
|
|
24
|
+
runWithRequestContext,
|
|
25
|
+
setMutableCookieContext,
|
|
26
|
+
setSegmentParams,
|
|
27
|
+
} from '../request-context.js';
|
|
28
|
+
import { runMiddlewareChain } from '../middleware-runner.js';
|
|
29
|
+
import { DenySignal, RedirectSignal } from '../primitives.js';
|
|
30
|
+
import { ParamCoercionError } from '../route-element-builder.js';
|
|
31
|
+
import type { RouteMatch } from '../pipeline.js';
|
|
32
|
+
import type { MiddlewareContext } from '../types.js';
|
|
33
|
+
|
|
34
|
+
/** Coerce a matched route's segment params via its `params.ts` codecs. */
|
|
35
|
+
export type CoerceSegmentParamsFn = (match: RouteMatch) => Promise<void>;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Outcome of running middleware on an action request, surfaced from the
|
|
39
|
+
* inner `runWithRequestContext` scope so the outer dispatcher can convert
|
|
40
|
+
* it to a Response (short-circuit) or continue to the action handler.
|
|
41
|
+
*
|
|
42
|
+
* Each variant carries the post-middleware Set-Cookie snapshot so the
|
|
43
|
+
* outer scope can apply cookies to whichever Response it ultimately
|
|
44
|
+
* returns. The middleware ALS scope ends before the action ALS scope
|
|
45
|
+
* begins, so cookie state must be threaded explicitly across the boundary
|
|
46
|
+
* via `seedRequestCookies` (cookie reads) and `setCookieHeaders` (cookie
|
|
47
|
+
* writes).
|
|
48
|
+
*/
|
|
49
|
+
export type MiddlewareOutcome =
|
|
50
|
+
| {
|
|
51
|
+
kind: 'continue';
|
|
52
|
+
overlay: Headers;
|
|
53
|
+
cookies: Map<string, string>;
|
|
54
|
+
setCookieHeaders: string[];
|
|
55
|
+
}
|
|
56
|
+
| {
|
|
57
|
+
kind: 'short-circuit';
|
|
58
|
+
response: Response;
|
|
59
|
+
setCookieHeaders: string[];
|
|
60
|
+
}
|
|
61
|
+
| {
|
|
62
|
+
kind: 'redirect';
|
|
63
|
+
signal: RedirectSignal;
|
|
64
|
+
setCookieHeaders: string[];
|
|
65
|
+
}
|
|
66
|
+
| {
|
|
67
|
+
kind: 'deny';
|
|
68
|
+
signal: DenySignal;
|
|
69
|
+
match: RouteMatch;
|
|
70
|
+
setCookieHeaders: string[];
|
|
71
|
+
}
|
|
72
|
+
| {
|
|
73
|
+
kind: 'param-coercion-error';
|
|
74
|
+
}
|
|
75
|
+
| {
|
|
76
|
+
kind: 'error';
|
|
77
|
+
error: unknown;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Run the matched route's middleware chain inside a fresh request-context
|
|
82
|
+
* scope, captured as a `MiddlewareOutcome` value the outer dispatcher can
|
|
83
|
+
* translate to a Response or use as the seed for the action handler.
|
|
84
|
+
*/
|
|
85
|
+
export async function runMiddlewareForAction(
|
|
86
|
+
req: Request,
|
|
87
|
+
match: RouteMatch,
|
|
88
|
+
coerceSegmentParams: CoerceSegmentParamsFn
|
|
89
|
+
): Promise<MiddlewareOutcome> {
|
|
90
|
+
return runWithRequestContext(req, async (): Promise<MiddlewareOutcome> => {
|
|
91
|
+
// ─── Coerce segment params (mirrors page pipeline) ──────────────
|
|
92
|
+
try {
|
|
93
|
+
await coerceSegmentParams(match);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
if (err instanceof ParamCoercionError) {
|
|
96
|
+
return { kind: 'param-coercion-error' };
|
|
97
|
+
}
|
|
98
|
+
return { kind: 'error', error: err };
|
|
99
|
+
}
|
|
100
|
+
setSegmentParams(match.segmentParams);
|
|
101
|
+
|
|
102
|
+
// ─── Build the middleware context ───────────────────────────────
|
|
103
|
+
const responseHeaders = new Headers();
|
|
104
|
+
const requestHeaderOverlay = new Headers();
|
|
105
|
+
const ctx: MiddlewareContext = {
|
|
106
|
+
req,
|
|
107
|
+
requestHeaders: requestHeaderOverlay,
|
|
108
|
+
headers: responseHeaders,
|
|
109
|
+
segmentParams: match.segmentParams,
|
|
110
|
+
// 103 Early Hints are a page-render concern — server actions are
|
|
111
|
+
// RPC and never produce HTML, so there is nothing to hint about.
|
|
112
|
+
// Provide a no-op so user middleware can call `ctx.earlyHints()`
|
|
113
|
+
// unconditionally without branching on request kind.
|
|
114
|
+
earlyHints: () => {},
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// ─── Run the chain ──────────────────────────────────────────────
|
|
118
|
+
setMutableCookieContext(true);
|
|
119
|
+
try {
|
|
120
|
+
let middlewareResponse: Response | undefined;
|
|
121
|
+
try {
|
|
122
|
+
middlewareResponse = await runMiddlewareChain(match.middlewareChain, ctx);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
if (err instanceof RedirectSignal) {
|
|
125
|
+
return {
|
|
126
|
+
kind: 'redirect',
|
|
127
|
+
signal: err,
|
|
128
|
+
setCookieHeaders: getSetCookieHeaders(),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (err instanceof DenySignal) {
|
|
132
|
+
return {
|
|
133
|
+
kind: 'deny',
|
|
134
|
+
signal: err,
|
|
135
|
+
match,
|
|
136
|
+
setCookieHeaders: getSetCookieHeaders(),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return { kind: 'error', error: err };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (middlewareResponse) {
|
|
143
|
+
return {
|
|
144
|
+
kind: 'short-circuit',
|
|
145
|
+
response: middlewareResponse,
|
|
146
|
+
setCookieHeaders: getSetCookieHeaders(),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Middleware passed — apply the request-header overlay to the
|
|
151
|
+
// current scope so any code that might still read it within
|
|
152
|
+
// this scope sees the merged view. The overlay is also captured
|
|
153
|
+
// in the outcome so the caller can re-apply it inside the
|
|
154
|
+
// action's request-context scope (which is a separate ALS run).
|
|
155
|
+
applyRequestHeaderOverlay(requestHeaderOverlay);
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
kind: 'continue',
|
|
159
|
+
overlay: requestHeaderOverlay,
|
|
160
|
+
cookies: getCookiesForSsr(),
|
|
161
|
+
setCookieHeaders: getSetCookieHeaders(),
|
|
162
|
+
};
|
|
163
|
+
} finally {
|
|
164
|
+
setMutableCookieContext(false);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
@@ -6,13 +6,14 @@
|
|
|
6
6
|
* See design/04-authorization.md §"Auth in API Routes".
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { withSpan, setSpanAttribute } from '
|
|
10
|
-
import type { ManifestSegmentNode } from '
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import
|
|
15
|
-
import type {
|
|
9
|
+
import { withSpan, setSpanAttribute } from '../tracing.js';
|
|
10
|
+
import type { ManifestSegmentNode } from '../route-matcher.js';
|
|
11
|
+
import { loadModule } from '../safe-load.js';
|
|
12
|
+
import type { RouteMatch } from '../pipeline.js';
|
|
13
|
+
import { DenySignal, RedirectSignal } from '../primitives.js';
|
|
14
|
+
import { handleRouteRequest } from '../route-handler.js';
|
|
15
|
+
import type { RouteModule } from '../route-handler.js';
|
|
16
|
+
import type { RouteContext } from '../types.js';
|
|
16
17
|
|
|
17
18
|
export async function handleApiRoute(
|
|
18
19
|
req: Request,
|
|
@@ -26,10 +27,8 @@ export async function handleApiRoute(
|
|
|
26
27
|
// Each access.ts is independent — deny()/redirect() throws a signal.
|
|
27
28
|
for (const segment of segments) {
|
|
28
29
|
if (segment.access) {
|
|
29
|
-
const accessMod =
|
|
30
|
-
const accessFn = accessMod.default as
|
|
31
|
-
| ((ctx: { params: Record<string, string | string[]>; searchParams: unknown }) => unknown)
|
|
32
|
-
| undefined;
|
|
30
|
+
const accessMod = await loadModule(segment.access);
|
|
31
|
+
const accessFn = accessMod.default as (() => unknown) | undefined;
|
|
33
32
|
if (accessFn) {
|
|
34
33
|
try {
|
|
35
34
|
await withSpan(
|
|
@@ -37,7 +36,7 @@ export async function handleApiRoute(
|
|
|
37
36
|
{ 'timber.segment': segment.segmentName ?? 'unknown' },
|
|
38
37
|
async () => {
|
|
39
38
|
try {
|
|
40
|
-
await accessFn(
|
|
39
|
+
await accessFn();
|
|
41
40
|
await setSpanAttribute('timber.result', 'pass');
|
|
42
41
|
} catch (error) {
|
|
43
42
|
if (error instanceof DenySignal) {
|
|
@@ -68,10 +67,10 @@ export async function handleApiRoute(
|
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
// Load route.ts module and dispatch
|
|
71
|
-
const routeMod =
|
|
70
|
+
const routeMod = await loadModule<RouteModule>(leaf.route!);
|
|
72
71
|
const ctx: RouteContext = {
|
|
73
72
|
req,
|
|
74
|
-
params: match.
|
|
73
|
+
params: match.segmentParams,
|
|
75
74
|
searchParams: new URL(req.url).searchParams,
|
|
76
75
|
headers: responseHeaders,
|
|
77
76
|
};
|
|
@@ -90,11 +89,11 @@ async function renderApiDeny(
|
|
|
90
89
|
segments: ManifestSegmentNode[],
|
|
91
90
|
responseHeaders: Headers
|
|
92
91
|
): Promise<Response> {
|
|
93
|
-
const {
|
|
92
|
+
const { resolveStatusFile } = await import('../status-code-resolver.js');
|
|
94
93
|
|
|
95
|
-
const resolution =
|
|
94
|
+
const resolution = resolveStatusFile(deny.status, segments, 'json');
|
|
96
95
|
if (resolution) {
|
|
97
|
-
const mod =
|
|
96
|
+
const mod = await loadModule(resolution.file);
|
|
98
97
|
const jsonContent = mod.default ?? mod;
|
|
99
98
|
responseHeaders.set('content-type', 'application/json; charset=utf-8');
|
|
100
99
|
return new Response(JSON.stringify(jsonContent), {
|