@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/agent-skill.md +344 -0
- package/dist/_chunks/actions-C9yAuoX3.js +314 -0
- package/dist/_chunks/actions-C9yAuoX3.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-swbefQ6F.js +1125 -0
- package/dist/_chunks/cache-api-swbefQ6F.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.js +638 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-Bssfp6ot.js +82 -0
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/define-CFmvb4Bt.js +203 -0
- package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/logger-CPoQkGK6.js +1523 -0
- package/dist/_chunks/logger-CPoQkGK6.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.js +280 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/walkers-c8aReVgo.js +988 -0
- package/dist/_chunks/walkers-c8aReVgo.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +117 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +177 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +342 -67
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -144
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +26 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +27 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +97 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +51 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +34 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -33
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +11 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +182 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +825 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +120 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +87 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +47 -14
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +4 -4
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +304 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +253 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +158 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7807 -13691
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +190 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +95 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +64 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +37 -440
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +85 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +6 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +115 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +221 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3577 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +122 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +58 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +101 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +83 -31
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +39 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +51 -28
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +30 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +7 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +16 -16
- package/dist/shims/navigation-client.d.ts +35 -11
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +199 -0
- package/docs/api/33-api-search-params.mdx +141 -0
- package/docs/api/34-api-config.mdx +189 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +76 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +136 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +168 -0
- package/docs/learn/13-configuration.mdx +145 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +139 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +102 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +179 -0
- package/src/adapters/cloudflare.ts +594 -119
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -96
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +88 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +122 -15
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +233 -0
- package/src/cache/timber-cache.ts +142 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +388 -0
- package/src/cli.ts +157 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +111 -0
- package/src/client/browser-entry/post-hydration.ts +103 -0
- package/src/client/browser-entry/router-init.ts +287 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +11 -7
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +346 -150
- package/src/client/navigation-api.ts +341 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +482 -166
- package/src/client/rsc-fetch.ts +214 -33
- package/src/client/segment-cache.ts +7 -7
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +49 -14
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +302 -0
- package/src/config-validation.ts +328 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +63 -8
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +316 -0
- package/src/fonts/transform.ts +305 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +431 -352
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +378 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +186 -0
- package/src/plugins/callsite-ast.ts +167 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +144 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +293 -46
- package/src/plugins/entries.ts +129 -8
- package/src/plugins/fonts.ts +191 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +210 -0
- package/src/plugins/prebuilt.ts +700 -0
- package/src/plugins/prerender-sugar.ts +329 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +97 -12
- package/src/plugins/shims.ts +217 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +360 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/manifest-codegen.ts +281 -0
- package/src/routing/scanner.ts +248 -188
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +252 -0
- package/src/search-params/define.ts +570 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +110 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +84 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +39 -54
- package/src/server/als-registry.ts +129 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +13 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +311 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +437 -0
- package/src/server/html-injectors.ts +267 -254
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +331 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +538 -0
- package/src/server/pipeline.ts +226 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +224 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +696 -0
- package/src/server/prebuilt-runtime.ts +708 -0
- package/src/server/primitives.ts +155 -63
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +523 -233
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +144 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +160 -76
- package/src/server/rsc-entry/index.ts +393 -329
- package/src/server/rsc-entry/render-route.ts +284 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +72 -33
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +273 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +344 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +286 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
|
@@ -17,57 +17,56 @@
|
|
|
17
17
|
|
|
18
18
|
// @ts-expect-error — virtual module provided by timber-routing plugin
|
|
19
19
|
import routeManifest from 'virtual:timber-route-manifest';
|
|
20
|
+
// TIM-830: Populate the search-params registry eagerly so <Link> can
|
|
21
|
+
// serialize flat `Partial<T>` values synchronously in RSC renders.
|
|
22
|
+
// The module has side effects only — no exports consumed here.
|
|
23
|
+
// @ts-expect-error — virtual module provided by timber-routing plugin
|
|
24
|
+
import 'virtual:timber-search-params-registry';
|
|
20
25
|
// @ts-expect-error — virtual module provided by timber-entries plugin
|
|
21
26
|
import config from 'virtual:timber-config';
|
|
22
27
|
// @ts-expect-error — virtual module provided by timber-build-manifest plugin
|
|
23
28
|
import buildManifest from 'virtual:timber-build-manifest';
|
|
24
29
|
// @ts-expect-error — virtual module provided by timber-entries plugin
|
|
25
30
|
import loadUserInstrumentation from 'virtual:timber-instrumentation';
|
|
26
|
-
|
|
27
|
-
import
|
|
28
|
-
|
|
29
|
-
import
|
|
30
|
-
|
|
31
|
-
import
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
} from '
|
|
39
|
-
import
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import type {
|
|
46
|
-
import {
|
|
47
|
-
import
|
|
48
|
-
import {
|
|
49
|
-
|
|
50
|
-
import {
|
|
51
|
-
import
|
|
52
|
-
import {
|
|
53
|
-
import {
|
|
54
|
-
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import { handleApiRoute } from './api-handler.js';
|
|
58
|
-
import { renderErrorPage, renderNoMatchPage } from './error-renderer.js';
|
|
59
|
-
import {
|
|
60
|
-
buildRedirectResponse,
|
|
61
|
-
createDebugChannelSink,
|
|
62
|
-
escapeHtml,
|
|
63
|
-
isRscPayloadRequest,
|
|
64
|
-
} from './helpers.js';
|
|
65
|
-
import { parseClientStateTree } from '#/server/state-tree-diff.js';
|
|
66
|
-
import { buildRscPayloadResponse } from './rsc-payload.js';
|
|
67
|
-
import { renderRscStream } from './rsc-stream.js';
|
|
68
|
-
import { renderSsrResponse } from './ssr-renderer.js';
|
|
31
|
+
// @ts-expect-error — virtual module provided by timber-entries plugin
|
|
32
|
+
import loadCacheHandler from 'virtual:timber-cache-handler';
|
|
33
|
+
// @ts-expect-error — virtual module provided by timber-entries plugin
|
|
34
|
+
import { loadCdnPurgeHandler } from 'virtual:timber-cache-handler';
|
|
35
|
+
// @ts-expect-error — virtual module provided by timber-routing plugin
|
|
36
|
+
import globalSchemaCodecs from 'virtual:timber-schema';
|
|
37
|
+
|
|
38
|
+
import { wrapPipelineWithActionDispatch } from './wrap-action-dispatch.js';
|
|
39
|
+
import type { BodyLimitsConfig } from '../body-limits.js';
|
|
40
|
+
import type { BuildManifest } from '../build-manifest.js';
|
|
41
|
+
import type { LayoutEntry } from '../deny-renderer.js';
|
|
42
|
+
import { renderDenyPage, renderDenyPageAsRsc } from '../deny-renderer.js';
|
|
43
|
+
import { resolveLogMode } from '../../dev-tools/logger.js';
|
|
44
|
+
import { sendEarlyHints103 } from '../early-hints-sender.js';
|
|
45
|
+
import { collectEarlyHintHeaders } from '../early-hints.js';
|
|
46
|
+
import { buildClientScripts } from '../html-injectors.js';
|
|
47
|
+
import type { InterceptionContext, PipelineConfig, RouteMatch } from '../pipeline.js';
|
|
48
|
+
import { createPipeline } from '../pipeline.js';
|
|
49
|
+
import { coerceSegmentParams, setGlobalSchemaCodecs } from '../param-coercion.js';
|
|
50
|
+
import type { ManifestSegmentNode } from '../route-matcher.js';
|
|
51
|
+
import { createMetadataRouteMatcher, createRouteMatcher } from '../route-matcher.js';
|
|
52
|
+
import { initDevTracing } from '../tracing.js';
|
|
53
|
+
import { createRevalidateRendererFactory } from './revalidate-renderer.js';
|
|
54
|
+
|
|
55
|
+
import { renderFallbackError as renderFallback } from '../fallback-error.js';
|
|
56
|
+
import { loadInstrumentation } from '../instrumentation.js';
|
|
57
|
+
import { loadModule } from '../safe-load.js';
|
|
58
|
+
import { logRenderError } from '../logger.js';
|
|
59
|
+
import { renderNoMatchPage } from './error-renderer.js';
|
|
60
|
+
import { createDebugChannelSink, isRscPayloadRequest } from './helpers.js';
|
|
61
|
+
import { renderRoute } from './render-route.js';
|
|
69
62
|
import { callSsr } from './ssr-bridge.js';
|
|
70
|
-
import { isDebug, isDevMode, setDebugFromConfig } from '
|
|
63
|
+
import { isDebug, isDevMode, setDebugFromConfig } from '../debug.js';
|
|
64
|
+
import { setSourceMapCallback } from '../dev-source-map.js';
|
|
65
|
+
import { requestContextAls } from '../als-registry.js';
|
|
66
|
+
import { capturePrebuiltPayloads } from '../prebuilt-builder.js';
|
|
67
|
+
import { setPrebuiltPayloadSource } from '../prebuilt/payload-source.js';
|
|
68
|
+
import { setRscFunctions, setComponentRefreshTimeout } from '../prebuilt-runtime.js';
|
|
69
|
+
import { createAutoSitemapHandler } from '../sitemap-handler.js';
|
|
71
70
|
|
|
72
71
|
/**
|
|
73
72
|
* Resolve the Server-Timing mode from timber.config.ts.
|
|
@@ -84,20 +83,24 @@ function resolveServerTimingMode(
|
|
|
84
83
|
return isDev ? 'detailed' : 'total';
|
|
85
84
|
}
|
|
86
85
|
|
|
87
|
-
// Dev-only pipeline error handler, set by the dev server after import.
|
|
88
|
-
// In production this is always undefined — no overhead.
|
|
89
|
-
let _devPipelineErrorHandler: ((error: Error, phase: string) => void) | undefined;
|
|
90
|
-
|
|
91
86
|
/**
|
|
92
|
-
* Set the dev
|
|
87
|
+
* Set the dev source-map handler.
|
|
93
88
|
*
|
|
94
|
-
* Called by the dev server after importing this module to wire
|
|
95
|
-
*
|
|
89
|
+
* Called by the dev server after importing this module to wire Vite's
|
|
90
|
+
* module graph source-mapping into the error rendering pipeline. Errors
|
|
91
|
+
* rendered by renderErrorPage / renderFallbackError will have their
|
|
92
|
+
* stack traces rewritten to show original source positions.
|
|
93
|
+
*
|
|
94
|
+
* No-op in production.
|
|
96
95
|
*/
|
|
97
|
-
export function
|
|
98
|
-
|
|
96
|
+
export function setDevSourceMapHandler(handler: (error: Error) => void): void {
|
|
97
|
+
setSourceMapCallback(handler);
|
|
99
98
|
}
|
|
100
99
|
|
|
100
|
+
// Dev-only: debug components getter is stored per-request in ALS
|
|
101
|
+
// (RequestContextStore.debugComponentsGetter) to avoid cross-request
|
|
102
|
+
// race conditions. See TIM-557.
|
|
103
|
+
|
|
101
104
|
/**
|
|
102
105
|
* Create the RSC request handler from the route manifest.
|
|
103
106
|
*
|
|
@@ -111,18 +114,115 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
111
114
|
// See design/17-logging.md §"register() — Server Startup"
|
|
112
115
|
await loadInstrumentation(loadUserInstrumentation);
|
|
113
116
|
|
|
114
|
-
// Initialize
|
|
115
|
-
|
|
116
|
-
|
|
117
|
+
// Initialize deployment ID for version skew detection (TIM-446).
|
|
118
|
+
// The manifest init module sets globalThis.__TIMBER_DEPLOYMENT_ID__ at startup.
|
|
119
|
+
// In dev mode this is undefined — skew checks are skipped.
|
|
120
|
+
const deploymentId = (globalThis as Record<string, unknown>).__TIMBER_DEPLOYMENT_ID__ as
|
|
121
|
+
| string
|
|
122
|
+
| undefined;
|
|
123
|
+
if (deploymentId) {
|
|
124
|
+
const { setDeploymentId } = await import('../version-skew.js');
|
|
125
|
+
setDeploymentId(deploymentId);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Wire the configured cache handler into the module-level singleton (TIM-599).
|
|
129
|
+
// The cacheHandler is a class instance (e.g. RedisCacheHandler) that can't be
|
|
130
|
+
// JSON-serialized into virtual:timber-config. Instead, virtual:timber-cache-handler
|
|
131
|
+
// dynamically imports the user's timber.config.ts and extracts the handler.
|
|
132
|
+
const userCacheHandler = await loadCacheHandler();
|
|
133
|
+
if (userCacheHandler) {
|
|
134
|
+
const { setCacheHandler } = await import('../../cache/handler-store.js');
|
|
135
|
+
setCacheHandler(userCacheHandler as Parameters<typeof setCacheHandler>[0]);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Wire the CDN purge handler so revalidateTag triggers CDN purge (TIM-1166).
|
|
139
|
+
const userCdnPurge = await loadCdnPurgeHandler();
|
|
140
|
+
if (userCdnPurge) {
|
|
141
|
+
const { setCdnPurgeHandler } = await import('../../cdn/purge-store.js');
|
|
142
|
+
setCdnPurgeHandler(userCdnPurge as Parameters<typeof setCdnPurgeHandler>[0]);
|
|
143
|
+
} else if (typeof process !== 'undefined' && process.env?.TIMBER_RUNTIME === 'cloudflare') {
|
|
144
|
+
// Auto-wire Workers Cache purge on Cloudflare — no API token needed,
|
|
145
|
+
// available on all plans via ctx.cache.purge({ tags }) (TIM-1170).
|
|
146
|
+
const { WorkersCachePurge } = await import('../../cdn/workers-cache-purge.js');
|
|
147
|
+
const { setCdnPurgeHandler } = await import('../../cdn/purge-store.js');
|
|
148
|
+
setCdnPurgeHandler(new WorkersCachePurge());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Propagate renderTimeoutMs into the default singleflight so cache calls
|
|
152
|
+
// without a per-call timeoutMs still get deadlock protection (TIM-1032).
|
|
153
|
+
const renderTimeoutMs = (runtimeConfig as Record<string, unknown>).renderTimeoutMs as
|
|
154
|
+
| number
|
|
117
155
|
| undefined;
|
|
118
|
-
if (
|
|
119
|
-
const {
|
|
120
|
-
|
|
156
|
+
if (renderTimeoutMs) {
|
|
157
|
+
const { setDefaultSingleflightTimeout } = await import('../../cache/timber-cache.js');
|
|
158
|
+
setDefaultSingleflightTimeout(renderTimeoutMs);
|
|
159
|
+
setComponentRefreshTimeout(renderTimeoutMs);
|
|
121
160
|
}
|
|
122
161
|
|
|
162
|
+
// Wire the prebuilt payload source so cache.component wrappers can look
|
|
163
|
+
// up cached flight payloads at request time (TIM-1122). The source is
|
|
164
|
+
// platform-aware: Node/Nitro reads from disk; Cloudflare reads from
|
|
165
|
+
// static assets via globalThis.__TIMBER_PREBUILT_SOURCE__ (set by the
|
|
166
|
+
// generated _worker.js before this module loads).
|
|
167
|
+
// In dev mode there are no prebuilt artifacts — source stays null and
|
|
168
|
+
// all cache.component wrappers render dynamically.
|
|
169
|
+
if (!isDevMode()) {
|
|
170
|
+
const platformSource = (globalThis as Record<string, unknown>).__TIMBER_PREBUILT_SOURCE__ as
|
|
171
|
+
| import('../prebuilt/payload-source.js').PrebuiltPayloadSource
|
|
172
|
+
| undefined;
|
|
173
|
+
if (platformSource) {
|
|
174
|
+
setPrebuiltPayloadSource(platformSource);
|
|
175
|
+
} else {
|
|
176
|
+
// Default: Node/fs-based source — prebuilt/ is alongside rsc/ in the
|
|
177
|
+
// adapter output directory, so resolve relative to this entry.
|
|
178
|
+
try {
|
|
179
|
+
const { readFile: fsReadFile } = await import('node:fs/promises');
|
|
180
|
+
const { join: pathJoin, dirname } = await import('node:path');
|
|
181
|
+
const { fileURLToPath } = await import('node:url');
|
|
182
|
+
const entryDir = dirname(fileURLToPath(import.meta.url));
|
|
183
|
+
const prebuiltDir = pathJoin(entryDir, '..', 'prebuilt');
|
|
184
|
+
setPrebuiltPayloadSource({
|
|
185
|
+
async loadManifest() {
|
|
186
|
+
try {
|
|
187
|
+
const data = await fsReadFile(pathJoin(prebuiltDir, 'manifest.json'), 'utf-8');
|
|
188
|
+
return JSON.parse(data);
|
|
189
|
+
} catch {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
async readPayload(file) {
|
|
194
|
+
try {
|
|
195
|
+
return await fsReadFile(pathJoin(prebuiltDir, file));
|
|
196
|
+
} catch {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
} catch {
|
|
202
|
+
// node:fs not available (e.g. edge runtimes without the global
|
|
203
|
+
// override) — source stays null, wrappers render dynamically.
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Wire RSC flight functions so prebuilt-runtime can revive cached payloads
|
|
209
|
+
// and capture re-renders without a dynamic import (TIM-1165).
|
|
210
|
+
const rscMod = await import('../../rsc-runtime/rsc.js');
|
|
211
|
+
setRscFunctions({
|
|
212
|
+
createFromReadableStream: rscMod.createFromReadableStream,
|
|
213
|
+
renderToReadableStream: rscMod.renderToReadableStream,
|
|
214
|
+
});
|
|
215
|
+
|
|
123
216
|
const matchRoute = createRouteMatcher(manifest);
|
|
124
217
|
const matchMetadataRoute = createMetadataRouteMatcher(manifest);
|
|
125
218
|
|
|
219
|
+
// TIM-931: Register global schema codecs for param coercion.
|
|
220
|
+
// When app/schema.ts exists, globalSchemaCodecs is a Record<string, Codec>;
|
|
221
|
+
// otherwise null. Registered once at startup so all coercion paths
|
|
222
|
+
// (pipeline-phases.ts, action-middleware-runner.ts, revalidation) share
|
|
223
|
+
// the same codec source.
|
|
224
|
+
setGlobalSchemaCodecs(globalSchemaCodecs);
|
|
225
|
+
|
|
126
226
|
// Build the client bootstrap configuration.
|
|
127
227
|
// When client JavaScript is disabled, no scripts are injected
|
|
128
228
|
// (unless enableHMRInDev is true in dev mode — then only HMR client).
|
|
@@ -134,6 +234,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
134
234
|
const clientBootstrap = buildClientScripts({
|
|
135
235
|
...runtimeConfig,
|
|
136
236
|
clientJavascript: clientJsConfig ?? { disabled: false, enableHMRInDev: false },
|
|
237
|
+
devBrowserLogs: (runtimeConfig as Record<string, unknown>).devBrowserLogs as string | undefined,
|
|
137
238
|
buildManifest: buildManifest as BuildManifest,
|
|
138
239
|
});
|
|
139
240
|
|
|
@@ -144,6 +245,18 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
144
245
|
setDebugFromConfig(true);
|
|
145
246
|
}
|
|
146
247
|
|
|
248
|
+
// Wire the global sensitive-field stripping config so `createActionClient`
|
|
249
|
+
// instances in user code pick up `forms.stripSensitiveFields` from
|
|
250
|
+
// `timber.config.ts` without needing to plumb config through each action.
|
|
251
|
+
// See TIM-816 and design/08-forms-and-actions.md §"Validation errors".
|
|
252
|
+
const formsConfig = (runtimeConfig as Record<string, unknown>).forms as
|
|
253
|
+
| { stripSensitiveFields?: import('../sensitive-fields.js').SensitiveFieldsOption }
|
|
254
|
+
| undefined;
|
|
255
|
+
if (formsConfig) {
|
|
256
|
+
const { setGlobalSensitiveFieldsConfig } = await import('../sensitive-fields.js');
|
|
257
|
+
setGlobalSensitiveFieldsConfig(formsConfig.stripSensitiveFields);
|
|
258
|
+
}
|
|
259
|
+
|
|
147
260
|
// Two separate flags for two different security levels:
|
|
148
261
|
//
|
|
149
262
|
// isDev (isDevMode) — gates client-visible behavior: dev error pages with
|
|
@@ -167,15 +280,22 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
167
280
|
await initDevTracing({ mode: devLogMode, slowPhaseMs });
|
|
168
281
|
// Patch globalThis.fetch to create OTEL spans for fetch calls.
|
|
169
282
|
// Spans appear as children of the active component span in the dev log tree.
|
|
170
|
-
const { instrumentDevFetch } = await import('
|
|
283
|
+
const { instrumentDevFetch } = await import('../../dev-tools/instrumentation.js');
|
|
171
284
|
instrumentDevFetch();
|
|
172
285
|
}
|
|
173
286
|
}
|
|
174
287
|
|
|
175
288
|
const typedBuildManifest = buildManifest as BuildManifest;
|
|
176
289
|
|
|
290
|
+
// The routing plugin emits `manifest.proxy = { load, filePath }` only when
|
|
291
|
+
// the app has an `app/proxy.ts`. Convert that to the pipeline's lazy variant
|
|
292
|
+
// so HMR re-imports per request; leave it undefined when there's no proxy.
|
|
293
|
+
const proxyConfig: PipelineConfig['proxy'] = manifest.proxy?.load
|
|
294
|
+
? { kind: 'lazy', loader: manifest.proxy.load }
|
|
295
|
+
: undefined;
|
|
296
|
+
|
|
177
297
|
const pipelineConfig: PipelineConfig = {
|
|
178
|
-
|
|
298
|
+
proxy: proxyConfig,
|
|
179
299
|
matchRoute,
|
|
180
300
|
matchMetadataRoute,
|
|
181
301
|
// 103 Early Hints — fires after route match, before middleware.
|
|
@@ -183,11 +303,7 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
183
303
|
// so the browser starts fetching critical resources while the server renders.
|
|
184
304
|
// In dev mode the manifest is empty — no hints are sent.
|
|
185
305
|
earlyHints: (match: RouteMatch, _req: Request, responseHeaders: Headers) => {
|
|
186
|
-
const
|
|
187
|
-
layout?: { filePath: string };
|
|
188
|
-
page?: { filePath: string };
|
|
189
|
-
}>;
|
|
190
|
-
const headers = collectEarlyHintHeaders(segments, typedBuildManifest, {
|
|
306
|
+
const headers = collectEarlyHintHeaders(match.segments, typedBuildManifest, {
|
|
191
307
|
skipJs: clientJsDisabled,
|
|
192
308
|
});
|
|
193
309
|
for (const h of headers) {
|
|
@@ -208,13 +324,47 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
208
324
|
req,
|
|
209
325
|
match,
|
|
210
326
|
responseHeaders,
|
|
211
|
-
|
|
212
|
-
|
|
327
|
+
{
|
|
328
|
+
clientBootstrap,
|
|
329
|
+
clientJsDisabled,
|
|
330
|
+
rootSegment: manifest.root,
|
|
331
|
+
buildManifest: typedBuildManifest,
|
|
332
|
+
globalError: manifest.globalError,
|
|
333
|
+
},
|
|
213
334
|
interception
|
|
214
335
|
);
|
|
215
336
|
},
|
|
216
337
|
renderNoMatch: async (req: Request, responseHeaders: Headers) => {
|
|
217
|
-
|
|
338
|
+
const response = await renderNoMatchPage(
|
|
339
|
+
req,
|
|
340
|
+
manifest.root,
|
|
341
|
+
responseHeaders,
|
|
342
|
+
clientBootstrap
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
// In dev mode, if the pipeline returned a bare 404 (no body — meaning
|
|
346
|
+
// no user-defined 404.tsx was found), replace it with a helpful dev
|
|
347
|
+
// page that lists available routes and suggests similar paths.
|
|
348
|
+
// Only for GET requests that accept HTML — HEAD/API/RSC clients
|
|
349
|
+
// should receive the bare 404 without an HTML body (TIM-793).
|
|
350
|
+
const acceptsHtml = (req.headers.get('accept') ?? '').includes('text/html');
|
|
351
|
+
if (isDev && !response.body && req.method === 'GET' && acceptsHtml) {
|
|
352
|
+
const { generateDev404Page, collectRoutes } = await import('../../dev-tools/404-page.js');
|
|
353
|
+
const routes = collectRoutes(manifest.root);
|
|
354
|
+
const pathname = new URL(req.url).pathname;
|
|
355
|
+
// devHmrOptions is set by the dev server after this module is
|
|
356
|
+
// imported (read at request time, not closure-capture time).
|
|
357
|
+
const html = generateDev404Page(pathname, routes, pipelineConfig.devHmrOptions);
|
|
358
|
+
return new Response(html, {
|
|
359
|
+
status: 404,
|
|
360
|
+
headers: {
|
|
361
|
+
...Object.fromEntries(responseHeaders.entries()),
|
|
362
|
+
'content-type': 'text/html; charset=utf-8',
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return response;
|
|
218
368
|
},
|
|
219
369
|
interceptionRewrites: manifest.interceptionRewrites,
|
|
220
370
|
// Slow request threshold from timber.config.ts. Default 3000ms, 0 to disable.
|
|
@@ -223,18 +373,120 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
223
373
|
serverTiming: resolveServerTimingMode(runtimeConfig, isDev),
|
|
224
374
|
onPipelineError: isDev
|
|
225
375
|
? (error: Error, phase: string) => {
|
|
226
|
-
if (
|
|
376
|
+
if (pipelineConfig.devPipelineErrorHandler) {
|
|
377
|
+
// For render-phase errors, include RSC debug component data
|
|
378
|
+
// from the Flight debug channel (if available from the current request).
|
|
379
|
+
const store = requestContextAls.getStore();
|
|
380
|
+
const debugComponents =
|
|
381
|
+
phase === 'render' && store?.debugComponentsGetter
|
|
382
|
+
? store.debugComponentsGetter()
|
|
383
|
+
: undefined;
|
|
384
|
+
pipelineConfig.devPipelineErrorHandler(error, phase, debugComponents);
|
|
385
|
+
}
|
|
227
386
|
}
|
|
228
387
|
: undefined,
|
|
388
|
+
|
|
229
389
|
renderFallbackError: (error, req, responseHeaders) =>
|
|
230
|
-
renderFallback(
|
|
390
|
+
renderFallback(
|
|
391
|
+
error,
|
|
392
|
+
req,
|
|
393
|
+
responseHeaders,
|
|
394
|
+
isDev,
|
|
395
|
+
manifest.root,
|
|
396
|
+
clientBootstrap,
|
|
397
|
+
manifest.globalError,
|
|
398
|
+
// Project root for dev error page frame classification.
|
|
399
|
+
// Not in runtimeConfig (TIM-787: leaked to client bundles).
|
|
400
|
+
// manifest.viteRoot is the resolved Vite root string — correct even
|
|
401
|
+
// when CWD differs from project root (e.g., monorepo custom root)
|
|
402
|
+
// (TIM-807). Passing manifest.root (segment tree object) here would
|
|
403
|
+
// stringify to "[object Object]" and misclassify app frames as
|
|
404
|
+
// internal, dropping source locations from the dev error page (TIM-808).
|
|
405
|
+
isDev ? manifest.viteRoot : undefined,
|
|
406
|
+
// HMR options for the dev error page's auto-reload WebSocket —
|
|
407
|
+
// set by the dev server after import, read at request time.
|
|
408
|
+
isDev ? pipelineConfig.devHmrOptions : undefined
|
|
409
|
+
),
|
|
410
|
+
renderDenyFallback: async (deny, req, responseHeaders, matchedRoute) => {
|
|
411
|
+
// Render the deny page (403.tsx, 404.tsx, etc.) for DenySignals
|
|
412
|
+
// that escape from middleware or the render phase.
|
|
413
|
+
//
|
|
414
|
+
// When the pipeline already matched a route (the common case — matching
|
|
415
|
+
// runs before middleware and rendering), resolve the status file against
|
|
416
|
+
// the matched chain so colocated files like a nested `403.tsx` or an API
|
|
417
|
+
// route's `401.json` are picked up. Fall back to the root chain when no
|
|
418
|
+
// match is available (e.g. proxy-stage deny before route matching).
|
|
419
|
+
// See TIM-822, design/04-authorization.md, design/10-error-handling.md.
|
|
420
|
+
const chain: ManifestSegmentNode[] = matchedRoute ? matchedRoute.segments : [manifest.root];
|
|
421
|
+
const layoutComponents: LayoutEntry[] = [];
|
|
422
|
+
try {
|
|
423
|
+
for (const segment of chain) {
|
|
424
|
+
if (!segment.layout) continue;
|
|
425
|
+
const mod = await loadModule(segment.layout);
|
|
426
|
+
if (mod.default) {
|
|
427
|
+
layoutComponents.push({
|
|
428
|
+
component: mod.default as (...args: unknown[]) => unknown,
|
|
429
|
+
segment,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
} catch (layoutError) {
|
|
434
|
+
// Layout failed to load — proceed without it. Partial layout chains
|
|
435
|
+
// are acceptable; the deny renderer wraps in whatever loaded.
|
|
436
|
+
logRenderError({ method: req.method, path: new URL(req.url).pathname, error: layoutError });
|
|
437
|
+
}
|
|
438
|
+
// Reuse the matched route's params/middleware metadata when present so
|
|
439
|
+
// downstream rendering sees the real route shape. Otherwise synthesise
|
|
440
|
+
// a root-only stub (no params, no middleware).
|
|
441
|
+
const match: RouteMatch = matchedRoute ?? {
|
|
442
|
+
segments: chain,
|
|
443
|
+
segmentParams: {},
|
|
444
|
+
middlewareChain: [],
|
|
445
|
+
};
|
|
446
|
+
// For client navigation (Accept: text/x-component), the timber router
|
|
447
|
+
// decodes the response as React Flight. Returning HTML to a Flight
|
|
448
|
+
// decoder breaks navigation, so dispatch to the RSC renderer when the
|
|
449
|
+
// request is an RSC payload request — mirroring the normal render path.
|
|
450
|
+
// See design/19-client-navigation.md §"RSC Payload Handling" and TIM-823.
|
|
451
|
+
if (isRscPayloadRequest(req)) {
|
|
452
|
+
return renderDenyPageAsRsc(
|
|
453
|
+
deny,
|
|
454
|
+
chain,
|
|
455
|
+
layoutComponents,
|
|
456
|
+
req,
|
|
457
|
+
responseHeaders,
|
|
458
|
+
createDebugChannelSink
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
return renderDenyPage(
|
|
462
|
+
deny,
|
|
463
|
+
chain,
|
|
464
|
+
layoutComponents,
|
|
465
|
+
req,
|
|
466
|
+
match,
|
|
467
|
+
responseHeaders,
|
|
468
|
+
clientBootstrap,
|
|
469
|
+
createDebugChannelSink,
|
|
470
|
+
callSsr
|
|
471
|
+
);
|
|
472
|
+
},
|
|
473
|
+
// Auto-generated sitemap handler — enabled when sitemap.enabled is true
|
|
474
|
+
// and no user-authored sitemap exists at the app root.
|
|
475
|
+
// See design/16-metadata.md §"Auto-generated Sitemap"
|
|
476
|
+
autoSitemapHandler: createAutoSitemapHandler(manifest.root, runtimeConfig),
|
|
231
477
|
};
|
|
232
478
|
|
|
233
479
|
const pipeline = createPipeline(pipelineConfig);
|
|
234
480
|
|
|
235
|
-
// Wrap the pipeline to
|
|
236
|
-
//
|
|
237
|
-
//
|
|
481
|
+
// Wrap the pipeline to enforce CSRF at the request boundary and intercept
|
|
482
|
+
// server action requests. By default, the wrapper also runs the matched
|
|
483
|
+
// route's `middleware.ts` chain on action POSTs, so authentication, rate
|
|
484
|
+
// limiting, tenant isolation, and request-header injection apply to
|
|
485
|
+
// actions just like they do to page renders. See TIM-871 and
|
|
486
|
+
// design/08-forms-and-actions.md §"Middleware for Server Actions".
|
|
487
|
+
//
|
|
488
|
+
// CSRF validation lives in the wrapper (not inside the action handler) so
|
|
489
|
+
// it covers route.ts API handlers as well as server actions. See LOCAL-773.
|
|
238
490
|
const csrfConfig = {
|
|
239
491
|
csrf: runtimeConfig.csrf,
|
|
240
492
|
allowedOrigins: (runtimeConfig as Record<string, unknown>).allowedOrigins as
|
|
@@ -242,268 +494,80 @@ async function createRequestHandler(manifest: typeof routeManifest, runtimeConfi
|
|
|
242
494
|
| undefined,
|
|
243
495
|
};
|
|
244
496
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
csrf: csrfConfig,
|
|
249
|
-
bodyLimits: {
|
|
250
|
-
limits: (runtimeConfig as Record<string, unknown>).limits as BodyLimitsConfig['limits'],
|
|
251
|
-
},
|
|
252
|
-
revalidateRenderer: async (path: string) => {
|
|
253
|
-
// Build the React element tree for the route at `path`.
|
|
254
|
-
// Returns the element tree (not serialized) so the action handler can
|
|
255
|
-
// combine it with the action result in a single renderToReadableStream call.
|
|
256
|
-
// Forward original request headers (cookies, session IDs, etc.).
|
|
257
|
-
const revalidateHeaders = new Headers(req.headers);
|
|
258
|
-
revalidateHeaders.set('Accept', 'text/x-component');
|
|
259
|
-
const revalidateReq = new Request(new URL(path, req.url), {
|
|
260
|
-
headers: revalidateHeaders,
|
|
261
|
-
});
|
|
262
|
-
const revalidateMatch = matchRoute(new URL(revalidateReq.url).pathname);
|
|
263
|
-
if (!revalidateMatch) {
|
|
264
|
-
throw new Error(`revalidatePath('${path}') — no matching route`);
|
|
265
|
-
}
|
|
266
|
-
const routeResult = await buildRouteElement(revalidateReq, revalidateMatch);
|
|
267
|
-
return {
|
|
268
|
-
element: routeResult.element,
|
|
269
|
-
headElements: routeResult.headElements,
|
|
270
|
-
};
|
|
271
|
-
},
|
|
272
|
-
});
|
|
273
|
-
if (actionResponse) {
|
|
274
|
-
// Check if this is a re-render signal (no-JS validation failure)
|
|
275
|
-
if ('rerender' in actionResponse) {
|
|
276
|
-
const formRerender = actionResponse as FormRerender;
|
|
277
|
-
// Re-render the page with the action result as flash data.
|
|
278
|
-
// Server components read it via getFormFlash() and pass it to
|
|
279
|
-
// client form components as the initial useActionState value.
|
|
280
|
-
const response = await runWithFormFlash(formRerender.rerender, () => pipeline(req));
|
|
281
|
-
return response;
|
|
282
|
-
}
|
|
283
|
-
return actionResponse;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
return pipeline(req);
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Render a matched route to an HTML Response via RSC → SSR pipeline,
|
|
292
|
-
* or return a raw RSC Flight stream for client-side navigation requests.
|
|
293
|
-
*
|
|
294
|
-
* 1. Load page/layout components from the segment chain
|
|
295
|
-
* 2. Resolve metadata
|
|
296
|
-
* 3. Render to RSC Flight stream (serializes "use client" as references)
|
|
297
|
-
* 4. If Accept: text/x-component → return RSC stream directly
|
|
298
|
-
* Otherwise → pass RSC stream to SSR entry for HTML rendering
|
|
299
|
-
*/
|
|
300
|
-
async function renderRoute(
|
|
301
|
-
_req: Request,
|
|
302
|
-
match: RouteMatch,
|
|
303
|
-
responseHeaders: Headers,
|
|
304
|
-
clientBootstrap: ClientBootstrapConfig,
|
|
305
|
-
clientJsDisabled: boolean,
|
|
306
|
-
interception?: InterceptionContext
|
|
307
|
-
): Promise<Response> {
|
|
308
|
-
const segments = match.segments as unknown as ManifestSegmentNode[];
|
|
309
|
-
const leaf = segments[segments.length - 1];
|
|
310
|
-
|
|
311
|
-
// API routes (route.ts) — run access.ts standalone then dispatch to handler.
|
|
312
|
-
// No React render pass — AccessGate is not used, React.cache is not active.
|
|
313
|
-
// See design/04-authorization.md §"Auth in API Routes".
|
|
314
|
-
if (leaf.route && !leaf.page) {
|
|
315
|
-
return handleApiRoute(_req, match, segments, responseHeaders);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Parse X-Timber-State-Tree for RSC payload requests (client navigation).
|
|
319
|
-
// The state tree lists sync segments the client has cached — the server
|
|
320
|
-
// skips re-rendering those layouts for a smaller, faster RSC payload.
|
|
321
|
-
// Only used for RSC requests — HTML requests always get a full render.
|
|
322
|
-
// See design/19-client-navigation.md §"X-Timber-State-Tree Header"
|
|
323
|
-
const clientStateTree = isRscPayloadRequest(_req) ? parseClientStateTree(_req) : null;
|
|
324
|
-
|
|
325
|
-
// Build the React element tree — loads modules, runs access checks,
|
|
326
|
-
// resolves metadata. DenySignal/RedirectSignal propagate for HTTP handling.
|
|
327
|
-
let routeResult;
|
|
328
|
-
try {
|
|
329
|
-
routeResult = await buildRouteElement(_req, match, interception, clientStateTree);
|
|
330
|
-
} catch (error) {
|
|
331
|
-
// RouteSignalWithContext wraps DenySignal/RedirectSignal with layout context
|
|
332
|
-
if (error instanceof RouteSignalWithContext) {
|
|
333
|
-
const { signal, layoutComponents: lc, segments: segs } = error;
|
|
334
|
-
if (signal instanceof DenySignal) {
|
|
335
|
-
if (isRscPayloadRequest(_req)) {
|
|
336
|
-
return renderDenyPageAsRsc(
|
|
337
|
-
signal,
|
|
338
|
-
segs,
|
|
339
|
-
lc as LayoutEntry[],
|
|
340
|
-
responseHeaders,
|
|
341
|
-
createDebugChannelSink
|
|
342
|
-
);
|
|
343
|
-
}
|
|
344
|
-
return renderDenyPage(
|
|
345
|
-
signal,
|
|
346
|
-
segs,
|
|
347
|
-
lc as LayoutEntry[],
|
|
348
|
-
_req,
|
|
349
|
-
match,
|
|
350
|
-
responseHeaders,
|
|
351
|
-
clientBootstrap,
|
|
352
|
-
createDebugChannelSink,
|
|
353
|
-
callSsr
|
|
354
|
-
);
|
|
355
|
-
}
|
|
356
|
-
if (signal instanceof RedirectSignal) {
|
|
357
|
-
return buildRedirectResponse(_req, signal, responseHeaders);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// No PageComponent found
|
|
361
|
-
if (error instanceof Error && error.message.startsWith('No page component')) {
|
|
362
|
-
return new Response(null, { status: 404 });
|
|
363
|
-
}
|
|
364
|
-
throw error;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
const { element, headElements, layoutComponents, deferSuspenseFor, skippedSegments } =
|
|
368
|
-
routeResult;
|
|
369
|
-
|
|
370
|
-
// Build head HTML for injection into the SSR output.
|
|
371
|
-
// Collects CSS, fonts, and modulepreload from the build manifest for matched segments.
|
|
372
|
-
// In dev mode the manifest is empty — Vite HMR handles CSS/JS.
|
|
373
|
-
//
|
|
374
|
-
// Link headers (for 103 Early Hints) are emitted by the earlyHints pipeline
|
|
375
|
-
// stage before middleware runs. Here we only emit the <head> HTML fallback tags
|
|
376
|
-
// — these ensure resources load even on platforms without Early Hints support.
|
|
377
|
-
const typedManifest = buildManifest as BuildManifest;
|
|
378
|
-
let headHtml = '';
|
|
379
|
-
|
|
380
|
-
const cssUrls = collectRouteCss(segments, typedManifest);
|
|
381
|
-
if (cssUrls.length > 0) {
|
|
382
|
-
headHtml += buildCssLinkTags(cssUrls);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Inline font CSS as a <style> tag — @font-face rules and scoped classes.
|
|
386
|
-
// The font CSS is set on globalThis by the transformed font file's
|
|
387
|
-
// side-effect import of virtual:timber-font-css-register.
|
|
388
|
-
const fontCss = (globalThis as Record<string, unknown>).__timber_font_css as string | undefined;
|
|
389
|
-
if (fontCss) {
|
|
390
|
-
headHtml += `<style data-timber-fonts>${fontCss}</style>`;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
const fontEntries = collectRouteFonts(segments, typedManifest);
|
|
394
|
-
if (fontEntries.length > 0) {
|
|
395
|
-
headHtml += buildFontPreloadTags(fontEntries);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
// Skip modulepreload tags when client JavaScript is disabled — no JS to preload.
|
|
399
|
-
if (!clientJsDisabled) {
|
|
400
|
-
const preloadUrls = collectRouteModulepreloads(segments, typedManifest);
|
|
401
|
-
if (preloadUrls.length > 0) {
|
|
402
|
-
headHtml += buildModulepreloadTags(preloadUrls);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
for (const el of headElements) {
|
|
407
|
-
if (el.tag === 'title' && el.content) {
|
|
408
|
-
headHtml += `<title>${escapeHtml(el.content)}</title>`;
|
|
409
|
-
} else if (el.attrs) {
|
|
410
|
-
const attrs = Object.entries(el.attrs)
|
|
411
|
-
.filter(([, v]) => v != null)
|
|
412
|
-
.map(([k, v]) => `${k}="${escapeHtml(v as string)}"`)
|
|
413
|
-
.join(' ');
|
|
414
|
-
headHtml += `<${el.tag} ${attrs}>`;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Render to RSC Flight stream with signal tracking.
|
|
419
|
-
const { rscStream, signals } = renderRscStream(element, _req);
|
|
420
|
-
|
|
421
|
-
// Synchronous redirect — redirect() in access.ts or a non-async component
|
|
422
|
-
// throws during renderToReadableStream creation. Return HTTP redirect.
|
|
423
|
-
if (signals.redirectSignal) {
|
|
424
|
-
return buildRedirectResponse(_req, signals.redirectSignal, responseHeaders);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
// Synchronous deny — deny() in a non-async component throws during
|
|
428
|
-
// renderToReadableStream creation, caught in the try/catch above.
|
|
429
|
-
if (signals.denySignal) {
|
|
430
|
-
if (isRscPayloadRequest(_req)) {
|
|
431
|
-
return renderDenyPageAsRsc(
|
|
432
|
-
signals.denySignal,
|
|
433
|
-
segments,
|
|
434
|
-
layoutComponents as LayoutEntry[],
|
|
435
|
-
responseHeaders,
|
|
436
|
-
createDebugChannelSink
|
|
437
|
-
);
|
|
438
|
-
}
|
|
439
|
-
return renderDenyPage(
|
|
440
|
-
signals.denySignal,
|
|
441
|
-
segments,
|
|
442
|
-
layoutComponents as LayoutEntry[],
|
|
443
|
-
_req,
|
|
444
|
-
match,
|
|
445
|
-
responseHeaders,
|
|
446
|
-
clientBootstrap,
|
|
447
|
-
createDebugChannelSink,
|
|
448
|
-
callSsr
|
|
449
|
-
);
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// Synchronous render error — renderToReadableStream threw before
|
|
453
|
-
// creating the stream. Render the error page with correct 5xx status.
|
|
454
|
-
// (Async render errors are tracked in onError and handled after SSR.)
|
|
455
|
-
if (signals.renderError && !rscStream) {
|
|
456
|
-
return renderErrorPage(
|
|
457
|
-
signals.renderError.error,
|
|
458
|
-
signals.renderError.status,
|
|
459
|
-
segments,
|
|
460
|
-
layoutComponents as LayoutEntry[],
|
|
461
|
-
_req,
|
|
462
|
-
match,
|
|
463
|
-
responseHeaders,
|
|
464
|
-
clientBootstrap
|
|
465
|
-
);
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
// For RSC payload requests (client navigation), return the RSC Flight
|
|
469
|
-
// stream directly — skip SSR HTML rendering entirely.
|
|
470
|
-
// See design/19-client-navigation.md §"RSC Payload Handling"
|
|
471
|
-
if (isRscPayloadRequest(_req)) {
|
|
472
|
-
return buildRscPayloadResponse(
|
|
473
|
-
_req,
|
|
474
|
-
rscStream!,
|
|
475
|
-
signals,
|
|
476
|
-
segments,
|
|
477
|
-
layoutComponents,
|
|
478
|
-
headElements,
|
|
479
|
-
match,
|
|
480
|
-
responseHeaders,
|
|
481
|
-
skippedSegments
|
|
482
|
-
);
|
|
483
|
-
}
|
|
497
|
+
const actionsConfig = (runtimeConfig as Record<string, unknown>).actions as
|
|
498
|
+
| { runMiddleware?: boolean }
|
|
499
|
+
| undefined;
|
|
484
500
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
501
|
+
const handler = wrapPipelineWithActionDispatch(pipeline, {
|
|
502
|
+
csrfConfig,
|
|
503
|
+
bodyLimits: (runtimeConfig as Record<string, unknown>).limits as BodyLimitsConfig['limits'],
|
|
504
|
+
sensitiveFields: formsConfig?.stripSensitiveFields,
|
|
505
|
+
matchRoute,
|
|
506
|
+
coerceSegmentParams,
|
|
507
|
+
renderDenyFallback: pipelineConfig.renderDenyFallback,
|
|
508
|
+
runMiddleware: actionsConfig?.runMiddleware,
|
|
509
|
+
// Thread the pipeline's `stripTrailingSlash` setting into the wrapper
|
|
510
|
+
// so its canonicalization step (applied before `matchRoute` for
|
|
511
|
+
// action POSTs) matches the page pipeline exactly. Defaults to `true`
|
|
512
|
+
// both here and inside the wrapper.
|
|
513
|
+
stripTrailingSlash: pipelineConfig.stripTrailingSlash,
|
|
514
|
+
// Revalidation renderer — runs the target route's `middleware.ts`
|
|
515
|
+
// chain BEFORE building the element tree so a server action that
|
|
516
|
+
// revalidates a protected path honors that path's auth, tenant
|
|
517
|
+
// isolation, and request-header injection. Closes the silent-bypass
|
|
518
|
+
// bug where `revalidatePath('/admin')` from a public action would
|
|
519
|
+
// serialize the admin RSC tree without ever consulting admin's
|
|
520
|
+
// middleware. Also validates the user-supplied `path` as a local
|
|
521
|
+
// root-relative URL to reject `revalidatePath('//evil.com/admin')`
|
|
522
|
+
// and similar scheme/authority injections. See TIM-996 and
|
|
523
|
+
// design/08-forms-and-actions.md §"revalidatePath()".
|
|
524
|
+
buildRevalidateRenderer: createRevalidateRendererFactory({
|
|
525
|
+
matchRoute,
|
|
526
|
+
coerceSegmentParams,
|
|
527
|
+
buildManifest: buildManifest as BuildManifest,
|
|
528
|
+
}),
|
|
498
529
|
});
|
|
530
|
+
|
|
531
|
+
return { handler, pipelineConfig };
|
|
499
532
|
}
|
|
500
533
|
|
|
501
534
|
// Re-export for generated entry points (e.g., Nitro node-server/bun) to wrap
|
|
502
535
|
// the handler with per-request 103 Early Hints sender via ALS.
|
|
503
|
-
export { runWithEarlyHintsSender } from '
|
|
536
|
+
export { runWithEarlyHintsSender } from '../early-hints-sender.js';
|
|
504
537
|
|
|
505
538
|
// Re-export for generated entry points to wrap the handler with per-request
|
|
506
539
|
// waitUntil support via ALS. See design/11-platform.md §"waitUntil()".
|
|
507
|
-
export { runWithWaitUntil } from '
|
|
540
|
+
export { runWithWaitUntil } from '../waituntil-bridge.js';
|
|
541
|
+
|
|
542
|
+
// Re-export for the Cloudflare adapter's generated _worker.js to bridge
|
|
543
|
+
// ctx.cache from the ExecutionContext into the per-request ALS. The
|
|
544
|
+
// WorkersCachePurge handler reads from this ALS to call ctx.cache.purge().
|
|
545
|
+
export { runWithWorkersCachePurge } from '../workers-cache-bridge.js';
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Post-build flight capture entry point (TIM-1119). The capture pass must
|
|
549
|
+
* run inside the built RSC bundle — the prebuilt component registry, the
|
|
550
|
+
* ALS instances, and the flight renderer are module instances in THIS
|
|
551
|
+
* bundle's graph; an outside import of the framework package would get
|
|
552
|
+
* fresh, empty copies. The timber-prebuilt plugin imports the built
|
|
553
|
+
* `rsc/index.js` after the 5-step build and calls this export.
|
|
554
|
+
* See design/44-render-at-build-time.md §Build Phase.
|
|
555
|
+
*/
|
|
556
|
+
export function __timber_capturePrebuilt(
|
|
557
|
+
options: import('../prebuilt-builder.js').CaptureOptions
|
|
558
|
+
): Promise<import('../prebuilt-builder.js').CaptureSummary> {
|
|
559
|
+
return capturePrebuiltPayloads(routeManifest, options);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
const { handler: _handler, pipelineConfig: _pipelineConfig } = await createRequestHandler(
|
|
563
|
+
routeManifest,
|
|
564
|
+
config
|
|
565
|
+
);
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* The pipeline configuration object. Exported so the dev server can set
|
|
569
|
+
* `devPipelineErrorHandler` after import without a module-level singleton.
|
|
570
|
+
*/
|
|
571
|
+
export const pipelineConfig = _pipelineConfig;
|
|
508
572
|
|
|
509
|
-
export default
|
|
573
|
+
export default _handler;
|