@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.90
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-DLnUaR65.js +421 -0
- package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
- package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
- package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-C77ScO0m.js +106 -0
- package/dist/_chunks/define-C77ScO0m.js.map +1 -0
- package/dist/_chunks/define-Itxvcd7F.js +199 -0
- package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
- package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
- package/dist/_chunks/format-CYBGxKtc.js +14 -0
- package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-DRlhJWbu.js} +219 -97
- package/dist/_chunks/interception-DRlhJWbu.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
- package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
- package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
- package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
- package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
- package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
- package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
- package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
- package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
- package/dist/_chunks/use-query-states-BiV5GJgm.js.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 +135 -11
- 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 +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- 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 +142 -80
- 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.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +27 -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 +10 -4
- 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 +6 -3
- 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 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +229 -1018
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +18 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +890 -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/top-loader.d.ts +5 -5
- package/dist/client/top-loader.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-params.d.ts +6 -4
- package/dist/client/use-params.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/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +266 -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 +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -83
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +138 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +72 -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 +59 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +45 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4294 -2453
- package/dist/index.js.map +1 -1
- 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 +3 -3
- 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-404-page.d.ts +56 -0
- package/dist/plugins/dev-404-page.d.ts.map +1 -0
- package/dist/plugins/dev-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +49 -9
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-error-page.d.ts +58 -0
- package/dist/plugins/dev-error-page.d.ts.map +1 -0
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.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/dev-terminal-error.d.ts +28 -0
- package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
- 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 +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -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 +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- 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 +139 -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 +32 -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 +78 -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 +4 -0
- 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 +7 -0
- 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 +32 -4
- package/dist/server/als-registry.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/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-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-holding-server.d.ts +52 -0
- package/dist/server/dev-holding-server.d.ts.map +1 -0
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/dev-warnings.d.ts +1 -21
- package/dist/server/dev-warnings.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-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -43
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2800
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +46 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2900 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.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.d.ts +52 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- 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 +112 -43
- 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 +16 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- 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 +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +20 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- 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 +14 -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/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 +23 -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/status-code-resolver.d.ts +1 -1
- 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 +4 -4
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- 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 +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +3 -2
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.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 +51 -16
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +52 -8
- 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 +31 -0
- package/src/cache/timber-cache.ts +24 -20
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +128 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -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 +143 -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 +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +14 -7
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +65 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +342 -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 +299 -72
- package/src/client/rsc-fetch.ts +97 -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/top-loader.tsx +18 -6
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-params.ts +7 -5
- 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/codec.ts +49 -0
- package/src/config-types.ts +264 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +78 -25
- package/src/cookies/index.ts +8 -0
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/pipeline.ts +275 -0
- package/src/fonts/transform.ts +353 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +159 -0
- package/src/index.ts +314 -355
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +9 -3
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-404-page.ts +418 -0
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +286 -42
- package/src/plugins/dev-error-page.ts +536 -0
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +146 -19
- package/src/plugins/dev-terminal-error.ts +217 -0
- package/src/plugins/entries.ts +111 -10
- package/src/plugins/fonts.ts +133 -638
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +213 -31
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen.ts +273 -105
- package/src/routing/convention-lint.ts +356 -0
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- 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 +482 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +53 -6
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +34 -6
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-holding-server.ts +185 -0
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/dev-warnings.ts +4 -49
- 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-injectors.ts +280 -120
- package/src/server/index.ts +25 -177
- package/src/server/internal.ts +169 -0
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +261 -66
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +293 -132
- package/src/server/route-element-builder.ts +283 -191
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +31 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +304 -111
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +81 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +171 -38
- 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 +244 -229
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +20 -9
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- 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 +1 -1
- package/src/shims/navigation.ts +7 -2
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- 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/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/cookies/index.js.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/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.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/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/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/dynamic-transform.ts +0 -161
- 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/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
|
@@ -50,14 +50,14 @@ export interface ManifestSegmentNode {
|
|
|
50
50
|
middleware?: ManifestFile;
|
|
51
51
|
access?: ManifestFile;
|
|
52
52
|
route?: ManifestFile;
|
|
53
|
+
/** params.ts — isomorphic convention file for segmentParams + searchParams definitions. */
|
|
54
|
+
params?: ManifestFile;
|
|
53
55
|
error?: ManifestFile;
|
|
54
56
|
default?: ManifestFile;
|
|
55
57
|
denied?: ManifestFile;
|
|
56
|
-
searchParams?: ManifestFile;
|
|
57
58
|
statusFiles?: Record<string, ManifestFile>;
|
|
58
59
|
jsonStatusFiles?: Record<string, ManifestFile>;
|
|
59
60
|
legacyStatusFiles?: Record<string, ManifestFile>;
|
|
60
|
-
prerender?: ManifestFile;
|
|
61
61
|
/** Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.) keyed by base name */
|
|
62
62
|
metadataRoutes?: Record<string, ManifestFile>;
|
|
63
63
|
|
|
@@ -68,7 +68,21 @@ export interface ManifestSegmentNode {
|
|
|
68
68
|
/** The manifest shape from virtual:timber-route-manifest. */
|
|
69
69
|
export interface ManifestRoot {
|
|
70
70
|
root: ManifestSegmentNode;
|
|
71
|
+
/**
|
|
72
|
+
* Absolute path to the Vite project root, captured at build/load time.
|
|
73
|
+
* Used by dev-only features (e.g., dev error page frame classification)
|
|
74
|
+
* that need a correct project root even when CWD differs (e.g., monorepo
|
|
75
|
+
* custom root). See TIM-807 / TIM-808.
|
|
76
|
+
*/
|
|
77
|
+
viteRoot: string;
|
|
71
78
|
proxy?: ManifestFile;
|
|
79
|
+
/**
|
|
80
|
+
* Global error page: app/global-error.{tsx,ts,jsx,js}
|
|
81
|
+
* Tier 2 — standalone full-page replacement (no layouts) when no
|
|
82
|
+
* segment-level error file is found. SSR-only render.
|
|
83
|
+
* See design/10-error-handling.md §"Tier 2"
|
|
84
|
+
*/
|
|
85
|
+
globalError?: ManifestFile;
|
|
72
86
|
}
|
|
73
87
|
|
|
74
88
|
// ─── Matcher ──────────────────────────────────────────────────────────────
|
|
@@ -102,30 +116,27 @@ function matchPathname(root: ManifestSegmentNode, pathname: string): RouteMatch
|
|
|
102
116
|
const matched = matchSegments(root, parts, 0, segments, params);
|
|
103
117
|
if (!matched) return null;
|
|
104
118
|
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return mod.default(ctx);
|
|
119
|
-
}
|
|
120
|
-
};
|
|
119
|
+
// Collect middleware from all segments in the chain, root to leaf.
|
|
120
|
+
// Each middleware is lazy-loaded via dynamic import on first invocation.
|
|
121
|
+
const middlewareChain: MiddlewareFn[] = [];
|
|
122
|
+
for (const segment of segments) {
|
|
123
|
+
if (segment.middleware) {
|
|
124
|
+
const loader = segment.middleware.load;
|
|
125
|
+
middlewareChain.push(async (ctx) => {
|
|
126
|
+
const mod = (await loader()) as { default?: MiddlewareFn };
|
|
127
|
+
if (mod.default) {
|
|
128
|
+
return mod.default(ctx);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
121
132
|
}
|
|
122
133
|
|
|
123
134
|
return {
|
|
124
135
|
// The pipeline uses segments as opaque objects passed to the renderer.
|
|
125
136
|
// Cast is safe — the renderer receives what the manifest provides.
|
|
126
137
|
segments: segments as unknown as RouteMatch['segments'],
|
|
127
|
-
params,
|
|
128
|
-
|
|
138
|
+
segmentParams: params,
|
|
139
|
+
middlewareChain,
|
|
129
140
|
};
|
|
130
141
|
}
|
|
131
142
|
|
|
@@ -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 { resolveManifestStatusFile } = await import('
|
|
92
|
+
const { resolveManifestStatusFile } = await import('../manifest-status-resolver.js');
|
|
94
93
|
|
|
95
94
|
const resolution = resolveManifestStatusFile(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), {
|
|
@@ -1,136 +1,352 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* RSC Error & No-Match Renderers — handles error pages and 404s.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* All error pages (TSX and MDX) render through the RSC → SSR pipeline:
|
|
5
|
+
* - TSX ('use client'): Error is converted to SerializableError, wrapped
|
|
6
|
+
* with ErrorReconstituter to reconstitute a real Error on the client.
|
|
7
|
+
* - MDX (server component): Receives plain props ({ status }), no wrapper needed.
|
|
8
|
+
*
|
|
9
|
+
* This unified approach replaces the former SSR-only bypass for TSX error
|
|
10
|
+
* pages. See design/spike-TIM-565-unify-error-pages.md for the full analysis.
|
|
11
|
+
*
|
|
12
|
+
* Design docs: 10-error-handling.md §"Three-Tier Error Page Rendering"
|
|
5
13
|
*/
|
|
6
14
|
|
|
7
15
|
import { createElement } from 'react';
|
|
8
|
-
import { renderToReadableStream } from '
|
|
9
|
-
|
|
10
|
-
import type { RouteMatch } from '
|
|
11
|
-
import { logRenderError } from '
|
|
12
|
-
import type { ManifestSegmentNode } from '
|
|
13
|
-
import { DenySignal, RenderError } from '
|
|
14
|
-
import type { ClientBootstrapConfig } from '
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
17
|
-
import type {
|
|
18
|
-
import {
|
|
16
|
+
import { renderToReadableStream } from '../../rsc-runtime/rsc.js';
|
|
17
|
+
|
|
18
|
+
import type { RouteMatch } from '../pipeline.js';
|
|
19
|
+
import { logRenderError } from '../logger.js';
|
|
20
|
+
import type { ManifestSegmentNode } from '../route-matcher.js';
|
|
21
|
+
import { DenySignal, RenderError } from '../primitives.js';
|
|
22
|
+
import type { ClientBootstrapConfig } from '../html-injectors.js';
|
|
23
|
+
import { flightInitScript } from '../flight-scripts.js';
|
|
24
|
+
import { renderDenyPage } from '../deny-renderer.js';
|
|
25
|
+
import type { LayoutEntry } from '../deny-renderer.js';
|
|
26
|
+
import type { NavContext } from '../ssr-entry.js';
|
|
27
|
+
import { createDebugChannelSink } from './helpers.js';
|
|
28
|
+
import { getCookiesForSsr } from '../request-context.js';
|
|
19
29
|
import { callSsr } from './ssr-bridge.js';
|
|
30
|
+
import { teeWithErrorPropagation } from '../stream-utils.js';
|
|
31
|
+
import { isDevMode } from '../debug.js';
|
|
32
|
+
import { ErrorReconstituter } from '../../client/error-reconstituter.js';
|
|
33
|
+
import type { SerializableError } from '../../client/error-reconstituter.js';
|
|
34
|
+
import { loadModule } from '../safe-load.js';
|
|
35
|
+
import { sourceMapError } from '../dev-source-map.js';
|
|
20
36
|
|
|
21
37
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* 1. Specific status file (e.g. 503.tsx) matching the error's status
|
|
26
|
-
* 2. 5xx.tsx category catch-all
|
|
27
|
-
* 3. error.tsx
|
|
28
|
-
*
|
|
29
|
-
* Renders the found component with { error, digest, reset } props
|
|
30
|
-
* wrapped in layouts, with the correct HTTP status code.
|
|
38
|
+
* A manifest file reference with lazy import and path.
|
|
39
|
+
* Mirrors the shape from ManifestSegmentNode but kept local to avoid
|
|
40
|
+
* exporting internal types from route-matcher.
|
|
31
41
|
*/
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
layoutComponents: LayoutEntry[],
|
|
37
|
-
req: Request,
|
|
38
|
-
match: RouteMatch,
|
|
39
|
-
responseHeaders: Headers,
|
|
40
|
-
clientBootstrap: ClientBootstrapConfig
|
|
41
|
-
): Promise<Response> {
|
|
42
|
-
const h = createElement as (...args: unknown[]) => React.ReactElement;
|
|
42
|
+
export interface GlobalErrorFile {
|
|
43
|
+
load: () => Promise<unknown>;
|
|
44
|
+
filePath: string;
|
|
45
|
+
}
|
|
43
46
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
/** MDX/markdown extensions — server components that need RSC rendering. */
|
|
48
|
+
const MDX_EXTENSIONS = new Set(['.mdx', '.md']);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Check if a file path ends with an MDX/markdown extension.
|
|
52
|
+
*/
|
|
53
|
+
function isMdxFile(filePath: string): boolean {
|
|
54
|
+
const dotIndex = filePath.lastIndexOf('.');
|
|
55
|
+
if (dotIndex === -1) return false;
|
|
56
|
+
return MDX_EXTENSIONS.has(filePath.slice(dotIndex));
|
|
57
|
+
}
|
|
47
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Result of walking the segment chain for an error file.
|
|
61
|
+
*/
|
|
62
|
+
interface ErrorFileResolution {
|
|
63
|
+
/** The loaded component */
|
|
64
|
+
component: (...args: unknown[]) => unknown;
|
|
65
|
+
/** Index of the segment where the file was found */
|
|
66
|
+
segmentIndex: number;
|
|
67
|
+
/** Whether the file is MDX (server component) */
|
|
68
|
+
isMdx: boolean;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Walk segments from leaf to root to find the nearest error file.
|
|
73
|
+
*
|
|
74
|
+
* Fallback chain at each segment:
|
|
75
|
+
* 1. Specific status file (e.g., 503.tsx) — exact match
|
|
76
|
+
* 2. 5xx.tsx — category catch-all
|
|
77
|
+
* 3. error.tsx — catches all unmatched errors
|
|
78
|
+
*/
|
|
79
|
+
async function resolveErrorFile(
|
|
80
|
+
status: number,
|
|
81
|
+
segments: ManifestSegmentNode[]
|
|
82
|
+
): Promise<ErrorFileResolution | null> {
|
|
48
83
|
for (let i = segments.length - 1; i >= 0; i--) {
|
|
49
84
|
const segment = segments[i];
|
|
50
85
|
|
|
51
|
-
// Check specific status file (e.g. 503.tsx)
|
|
52
86
|
if (segment.statusFiles) {
|
|
87
|
+
// Check specific status file (e.g. 503.tsx)
|
|
53
88
|
const statusKey = String(status);
|
|
54
89
|
const specificFile = segment.statusFiles[statusKey];
|
|
55
90
|
if (specificFile) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
91
|
+
// .catch: if the error page module itself fails to load (syntax error,
|
|
92
|
+
// missing file), fall through to next tier instead of recursive failure.
|
|
93
|
+
// See TIM-584, design/spike-TIM-551-dynamic-import-audit.md §H1.
|
|
94
|
+
const mod = await loadModule(specificFile).catch(() => null);
|
|
95
|
+
if (mod?.default) {
|
|
96
|
+
return {
|
|
97
|
+
component: mod.default as (...args: unknown[]) => unknown,
|
|
98
|
+
segmentIndex: i,
|
|
99
|
+
isMdx: isMdxFile(specificFile.filePath),
|
|
100
|
+
};
|
|
61
101
|
}
|
|
62
102
|
}
|
|
63
103
|
|
|
64
104
|
// Check 5xx.tsx category catch-all
|
|
65
105
|
const categoryFile = segment.statusFiles['5xx'];
|
|
66
106
|
if (categoryFile && status >= 500 && status <= 599) {
|
|
67
|
-
const mod =
|
|
68
|
-
if (mod
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
107
|
+
const mod = await loadModule(categoryFile).catch(() => null);
|
|
108
|
+
if (mod?.default) {
|
|
109
|
+
return {
|
|
110
|
+
component: mod.default as (...args: unknown[]) => unknown,
|
|
111
|
+
segmentIndex: i,
|
|
112
|
+
isMdx: isMdxFile(categoryFile.filePath),
|
|
113
|
+
};
|
|
72
114
|
}
|
|
73
115
|
}
|
|
74
116
|
}
|
|
75
117
|
|
|
76
118
|
// Check error.tsx
|
|
77
119
|
if (segment.error) {
|
|
78
|
-
const mod =
|
|
79
|
-
if (mod
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
120
|
+
const mod = await loadModule(segment.error).catch(() => null);
|
|
121
|
+
if (mod?.default) {
|
|
122
|
+
return {
|
|
123
|
+
component: mod.default as (...args: unknown[]) => unknown,
|
|
124
|
+
segmentIndex: i,
|
|
125
|
+
isMdx: isMdxFile(segment.error.filePath),
|
|
126
|
+
};
|
|
83
127
|
}
|
|
84
128
|
}
|
|
85
129
|
}
|
|
86
130
|
|
|
87
|
-
|
|
88
|
-
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Build the layouts-to-wrap list for an error file at a given segment index.
|
|
136
|
+
*/
|
|
137
|
+
function getLayoutsForErrorFile(
|
|
138
|
+
segments: ManifestSegmentNode[],
|
|
139
|
+
layoutComponents: LayoutEntry[],
|
|
140
|
+
foundSegmentIndex: number
|
|
141
|
+
): LayoutEntry[] {
|
|
142
|
+
const resolvedSegments = new Set(segments.slice(0, foundSegmentIndex + 1));
|
|
143
|
+
return layoutComponents.filter((lc) => resolvedSegments.has(lc.segment));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Convert an error to a SerializableError for RSC Flight serialization.
|
|
148
|
+
* Stack traces are stripped in production (gated by isDevMode).
|
|
149
|
+
*
|
|
150
|
+
* See design/13-security.md §"Debug Flag Security Boundary" — uses isDevMode(),
|
|
151
|
+
* not isDebug(), because this data crosses the RSC → client boundary.
|
|
152
|
+
*/
|
|
153
|
+
function toSerializableError(error: unknown): SerializableError {
|
|
154
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
155
|
+
return {
|
|
156
|
+
message: err.message,
|
|
157
|
+
name: err.name,
|
|
158
|
+
...(isDevMode() && err.stack ? { stack: err.stack } : {}),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Render an error page for unhandled throws or RenderError outside Suspense.
|
|
164
|
+
*
|
|
165
|
+
* All error pages (TSX and MDX) go through RSC → SSR:
|
|
166
|
+
* - TSX: ErrorReconstituter wrapper converts SerializableError → real Error
|
|
167
|
+
* - MDX: Plain props ({ status }), no wrapper needed
|
|
168
|
+
*/
|
|
169
|
+
export async function renderErrorPage(
|
|
170
|
+
error: unknown,
|
|
171
|
+
status: number,
|
|
172
|
+
segments: ManifestSegmentNode[],
|
|
173
|
+
layoutComponents: LayoutEntry[],
|
|
174
|
+
req: Request,
|
|
175
|
+
match: RouteMatch,
|
|
176
|
+
responseHeaders: Headers,
|
|
177
|
+
clientBootstrap: ClientBootstrapConfig,
|
|
178
|
+
globalError?: GlobalErrorFile
|
|
179
|
+
): Promise<Response> {
|
|
180
|
+
// Source-map the error's stack trace in dev mode so the error page
|
|
181
|
+
// shows original source positions instead of transpiled/bundled ones.
|
|
182
|
+
// See TIM-811.
|
|
183
|
+
sourceMapError(error);
|
|
184
|
+
// Walk segments from leaf to root to find the error component
|
|
185
|
+
const resolution = await resolveErrorFile(status, segments);
|
|
186
|
+
|
|
187
|
+
// Tier 2: No segment-level error file — try global-error.tsx
|
|
188
|
+
if (!resolution && globalError) {
|
|
189
|
+
return renderGlobalErrorPage(
|
|
190
|
+
error,
|
|
191
|
+
status,
|
|
192
|
+
globalError,
|
|
193
|
+
req,
|
|
194
|
+
match,
|
|
195
|
+
responseHeaders,
|
|
196
|
+
clientBootstrap
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Tier 3: No error component found at any level — bare response
|
|
201
|
+
if (!resolution) {
|
|
89
202
|
return new Response(null, { status, headers: responseHeaders });
|
|
90
203
|
}
|
|
91
204
|
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
error instanceof RenderError ? { code: error.code, data: error.digest.data } : null;
|
|
205
|
+
const { component: errorComponent, segmentIndex, isMdx } = resolution;
|
|
206
|
+
const layoutsToWrap = getLayoutsForErrorFile(segments, layoutComponents, segmentIndex);
|
|
95
207
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
208
|
+
return renderErrorPageViaRsc(
|
|
209
|
+
error,
|
|
210
|
+
errorComponent,
|
|
211
|
+
isMdx,
|
|
212
|
+
status,
|
|
213
|
+
layoutsToWrap,
|
|
214
|
+
req,
|
|
215
|
+
match,
|
|
216
|
+
responseHeaders,
|
|
217
|
+
clientBootstrap
|
|
218
|
+
);
|
|
219
|
+
}
|
|
102
220
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
221
|
+
/**
|
|
222
|
+
* Render an error page through the RSC → SSR pipeline.
|
|
223
|
+
*
|
|
224
|
+
* Handles both TSX and MDX error pages:
|
|
225
|
+
* - TSX: Wrapped with ErrorReconstituter to reconstitute Error on client
|
|
226
|
+
* - MDX: Receives plain props ({ status }), rendered as server component
|
|
227
|
+
*/
|
|
228
|
+
async function renderErrorPageViaRsc(
|
|
229
|
+
error: unknown,
|
|
230
|
+
errorComponent: (...args: unknown[]) => unknown,
|
|
231
|
+
isMdx: boolean,
|
|
232
|
+
status: number,
|
|
233
|
+
layoutsToWrap: LayoutEntry[],
|
|
234
|
+
req: Request,
|
|
235
|
+
match: RouteMatch,
|
|
236
|
+
responseHeaders: Headers,
|
|
237
|
+
clientBootstrap: ClientBootstrapConfig
|
|
238
|
+
): Promise<Response> {
|
|
239
|
+
const h = createElement as (...args: unknown[]) => React.ReactElement;
|
|
240
|
+
const url = new URL(req.url);
|
|
241
|
+
|
|
242
|
+
let element: React.ReactElement;
|
|
243
|
+
|
|
244
|
+
if (isMdx) {
|
|
245
|
+
// MDX error pages receive plain props — no Error serialization issue
|
|
246
|
+
element = h(errorComponent, { status });
|
|
247
|
+
} else {
|
|
248
|
+
// TSX error pages: wrap with ErrorReconstituter for Error reconstitution.
|
|
249
|
+
// The ErrorReconstituter is a 'use client' component that receives
|
|
250
|
+
// SerializableError (plain object) and reconstitutes a real Error
|
|
251
|
+
// before passing to the user's error component.
|
|
252
|
+
const serializedError = toSerializableError(error);
|
|
253
|
+
const digest =
|
|
254
|
+
error instanceof RenderError ? { code: error.code, data: error.digest.data } : null;
|
|
255
|
+
|
|
256
|
+
element = h(ErrorReconstituter, {
|
|
257
|
+
error: serializedError,
|
|
258
|
+
digest,
|
|
259
|
+
reset: undefined,
|
|
260
|
+
component: errorComponent,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Wrap in layouts
|
|
106
265
|
for (let i = layoutsToWrap.length - 1; i >= 0; i--) {
|
|
107
266
|
const { component } = layoutsToWrap[i];
|
|
108
267
|
element = h(component, null, element);
|
|
109
268
|
}
|
|
110
269
|
|
|
111
|
-
// Render
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
params
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
270
|
+
// Render through RSC → SSR (same path as deny pages)
|
|
271
|
+
try {
|
|
272
|
+
const rscStream = renderToReadableStream(element, {
|
|
273
|
+
signal: req.signal,
|
|
274
|
+
onError(err: unknown) {
|
|
275
|
+
logRenderError({ method: req.method, path: url.pathname, error: err });
|
|
276
|
+
},
|
|
277
|
+
debugChannel: createDebugChannelSink(),
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
const [ssrStream, inlineStream] = teeWithErrorPropagation(rscStream);
|
|
281
|
+
|
|
282
|
+
// Build params bootstrap script so useSegmentParams() works on hydration.
|
|
283
|
+
// Without this, error pages on dynamic routes hydrate with empty params.
|
|
284
|
+
const paramsScript =
|
|
285
|
+
Object.keys(match.segmentParams).length === 0
|
|
286
|
+
? ''
|
|
287
|
+
: `<script>self.__timber_params=${JSON.stringify(match.segmentParams)}</script>`;
|
|
288
|
+
|
|
289
|
+
const navContext: NavContext = {
|
|
290
|
+
pathname: url.pathname,
|
|
291
|
+
params: match.segmentParams,
|
|
292
|
+
searchParams: Object.fromEntries(url.searchParams),
|
|
293
|
+
statusCode: status,
|
|
294
|
+
responseHeaders,
|
|
295
|
+
headHtml: paramsScript + flightInitScript(),
|
|
296
|
+
bootstrapScriptContent: clientBootstrap.bootstrapScriptContent,
|
|
297
|
+
rscStream: inlineStream,
|
|
298
|
+
signal: req.signal,
|
|
299
|
+
cookies: getCookiesForSsr(),
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
return callSsr(ssrStream, navContext);
|
|
303
|
+
} catch (renderError) {
|
|
304
|
+
// Error page itself failed to render — fall through to bare response.
|
|
305
|
+
// This guards against recursive errors in user error page code.
|
|
306
|
+
logRenderError({ method: req.method, path: url.pathname, error: renderError });
|
|
307
|
+
return new Response(null, { status, headers: responseHeaders });
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Tier 2 — Render global-error.tsx as a standalone full-page replacement.
|
|
313
|
+
*
|
|
314
|
+
* No layout wrapping. The component must provide its own <html> and <body>.
|
|
315
|
+
* All formats (TSX and MDX) go through RSC → SSR.
|
|
316
|
+
*
|
|
317
|
+
* See design/10-error-handling.md §"Tier 2 — Global Error Page"
|
|
318
|
+
*/
|
|
319
|
+
async function renderGlobalErrorPage(
|
|
320
|
+
error: unknown,
|
|
321
|
+
status: number,
|
|
322
|
+
globalError: GlobalErrorFile,
|
|
323
|
+
req: Request,
|
|
324
|
+
match: RouteMatch,
|
|
325
|
+
responseHeaders: Headers,
|
|
326
|
+
clientBootstrap: ClientBootstrapConfig
|
|
327
|
+
): Promise<Response> {
|
|
328
|
+
// .catch: if global-error.tsx fails to load, fall through to bare response.
|
|
329
|
+
// This is the last tier — no further recovery. See TIM-584.
|
|
330
|
+
const mod = await loadModule(globalError).catch(() => null);
|
|
331
|
+
if (!mod?.default) {
|
|
332
|
+
return new Response(null, { status, headers: responseHeaders });
|
|
333
|
+
}
|
|
132
334
|
|
|
133
|
-
|
|
335
|
+
const component = mod.default as (...args: unknown[]) => unknown;
|
|
336
|
+
const isMdx = isMdxFile(globalError.filePath);
|
|
337
|
+
|
|
338
|
+
// Reuse the unified RSC path with no layouts
|
|
339
|
+
return renderErrorPageViaRsc(
|
|
340
|
+
error,
|
|
341
|
+
component,
|
|
342
|
+
isMdx,
|
|
343
|
+
status,
|
|
344
|
+
[], // No layouts — global-error is standalone
|
|
345
|
+
req,
|
|
346
|
+
match,
|
|
347
|
+
responseHeaders,
|
|
348
|
+
clientBootstrap
|
|
349
|
+
);
|
|
134
350
|
}
|
|
135
351
|
|
|
136
352
|
/**
|
|
@@ -151,7 +367,7 @@ export async function renderNoMatchPage(
|
|
|
151
367
|
// Load root layout if present
|
|
152
368
|
const layoutComponents: LayoutEntry[] = [];
|
|
153
369
|
if (rootSegment.layout) {
|
|
154
|
-
const mod =
|
|
370
|
+
const mod = await loadModule(rootSegment.layout);
|
|
155
371
|
if (mod.default) {
|
|
156
372
|
layoutComponents.push({
|
|
157
373
|
component: mod.default as (...args: unknown[]) => unknown,
|
|
@@ -161,7 +377,7 @@ export async function renderNoMatchPage(
|
|
|
161
377
|
}
|
|
162
378
|
|
|
163
379
|
const deny = new DenySignal(404);
|
|
164
|
-
const match: RouteMatch = { segments: segments as never,
|
|
380
|
+
const match: RouteMatch = { segments: segments as never, segmentParams: {}, middlewareChain: [] };
|
|
165
381
|
|
|
166
382
|
return renderDenyPage(
|
|
167
383
|
deny,
|