@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.161
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-cjklt63G.js +317 -0
- package/dist/_chunks/actions-cjklt63G.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-CzYUlgXA.js +1125 -0
- package/dist/_chunks/cache-api-CzYUlgXA.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-NfLbLnDw.js +638 -0
- package/dist/_chunks/cli-schema-sync-NfLbLnDw.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-B_O6-mdJ.js +1485 -0
- package/dist/_chunks/logger-B_O6-mdJ.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-9mz9T7mb.js +988 -0
- package/dist/_chunks/walkers-9mz9T7mb.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 +337 -64
- 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 +144 -152
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/types.d.ts +0 -6
- package/dist/adapters/types.d.ts.map +1 -1
- 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/child-segment-context.d.ts +22 -0
- package/dist/client/child-segment-context.d.ts.map +1 -0
- package/dist/client/child-segment-outlet.d.ts +18 -0
- package/dist/client/child-segment-outlet.d.ts.map +1 -0
- package/dist/client/child-segment-provider.d.ts +21 -0
- package/dist/client/child-segment-provider.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 +257 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +50 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +40 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/dev-tools/instrumentation.d.ts +59 -0
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +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 +8471 -14108
- 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 +117 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +21 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +17 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +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 +86 -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 +11 -47
- 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 +3652 -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 +88 -43
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +46 -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 +28 -6
- 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 +103 -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 +571 -118
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -107
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +0 -7
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +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/child-segment-context.ts +40 -0
- package/src/client/child-segment-outlet.tsx +25 -0
- package/src/client/child-segment-provider.tsx +27 -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 +60 -15
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +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 +229 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +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 +199 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -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 +241 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +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 +48 -54
- package/src/server/als-registry.ts +130 -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 +31 -185
- 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 +774 -0
- package/src/server/prebuilt-runtime.ts +731 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +548 -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 +394 -330
- package/src/server/rsc-entry/render-route.ts +288 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +74 -35
- 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/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +344 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +286 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component cache overlay — runtime CacheHandler layer for ISR.
|
|
3
|
+
*
|
|
4
|
+
* Sits in front of the immutable build artifact (`.flight` files) and
|
|
5
|
+
* stores replacement payloads and tombstones via the configured
|
|
6
|
+
* CacheHandler. Overlay entries are per-deploy namespaced:
|
|
7
|
+
* `timber:c:{deploymentId}:{componentId}:{hash}`
|
|
8
|
+
*
|
|
9
|
+
* The CacheHandler contract is untouched — tombstones and the tag index
|
|
10
|
+
* live above the interface as value conventions. Redis, KV, and custom
|
|
11
|
+
* handlers work unmodified.
|
|
12
|
+
*
|
|
13
|
+
* See design/45-cache-lifetimes.md §ISR mechanics.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { getCacheHandler, isCacheHandlerConfigured } from '../../cache/handler-store.js';
|
|
17
|
+
import { MemoryCacheHandler } from '../../cache/index.js';
|
|
18
|
+
import { getDeploymentId } from '../version-skew.js';
|
|
19
|
+
import { buildTagIndex, type SeedKeyInfo } from './manifest-tag-index.js';
|
|
20
|
+
import type { PrebuiltManifest } from './payload-source.js';
|
|
21
|
+
import { ensureManifestLoaded } from './payload-source.js';
|
|
22
|
+
|
|
23
|
+
/** Default ceiling TTL for tag-only entries (24 hours), in seconds. */
|
|
24
|
+
const CEILING_TTL_SECONDS = 24 * 60 * 60;
|
|
25
|
+
|
|
26
|
+
/** Deploy-long physical TTL for seed-backed overlay records (90 days). */
|
|
27
|
+
const DEPLOY_LONG_TTL_SECONDS = 90 * 24 * 60 * 60;
|
|
28
|
+
|
|
29
|
+
// ─── Overlay record shapes (value conventions above CacheHandler) ────────
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A cached component flight payload stored in the overlay.
|
|
33
|
+
* The `_t` discriminant distinguishes this from a tombstone.
|
|
34
|
+
*/
|
|
35
|
+
export interface ComponentOverlayRecord {
|
|
36
|
+
_t: 'co';
|
|
37
|
+
/** Base64-encoded flight payload bytes. */
|
|
38
|
+
p: string;
|
|
39
|
+
/** Logical freshness deadline (Date.now() + ttl * 1000). */
|
|
40
|
+
fu: number;
|
|
41
|
+
/** Whether a build-artifact seed exists for this key. */
|
|
42
|
+
s: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A tombstone marking a build seed as invalidated.
|
|
47
|
+
* Written by revalidateTag for seeds carrying the invalidated tag.
|
|
48
|
+
*/
|
|
49
|
+
export interface ComponentTombstoneRecord {
|
|
50
|
+
_t: 'ct';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type OverlayValue = ComponentOverlayRecord | ComponentTombstoneRecord;
|
|
54
|
+
|
|
55
|
+
export function isOverlayRecord(v: unknown): v is ComponentOverlayRecord {
|
|
56
|
+
return v !== null && typeof v === 'object' && (v as Record<string, unknown>)._t === 'co';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function isTombstone(v: unknown): v is ComponentTombstoneRecord {
|
|
60
|
+
return v !== null && typeof v === 'object' && (v as Record<string, unknown>)._t === 'ct';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ─── Overlay key generation ──────────────────────────────────────────────
|
|
64
|
+
|
|
65
|
+
export function overlayKey(componentId: string, cacheKey: string): string {
|
|
66
|
+
const deploymentId = getDeploymentId() ?? 'dev';
|
|
67
|
+
return `timber:c:${deploymentId}:${componentId}:${cacheKey}`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ─── Overlay read ────────────────────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
export interface OverlayLookupResult {
|
|
73
|
+
kind: 'fresh' | 'stale' | 'tombstone';
|
|
74
|
+
/** The overlay value (null for tombstones). */
|
|
75
|
+
record: ComponentOverlayRecord | null;
|
|
76
|
+
/** Raw flight payload bytes (decoded from base64). Null for tombstones. */
|
|
77
|
+
payload: Uint8Array | null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Look up an overlay entry in the cache handler.
|
|
82
|
+
* Returns null on a clean miss (no overlay entry at all).
|
|
83
|
+
*/
|
|
84
|
+
export async function lookupOverlay(
|
|
85
|
+
componentId: string,
|
|
86
|
+
cacheKey: string
|
|
87
|
+
): Promise<OverlayLookupResult | null> {
|
|
88
|
+
const handler = getCacheHandler();
|
|
89
|
+
const key = overlayKey(componentId, cacheKey);
|
|
90
|
+
const result = await handler.get(key);
|
|
91
|
+
if (!result) return null;
|
|
92
|
+
|
|
93
|
+
const value = result.value as OverlayValue;
|
|
94
|
+
if (isTombstone(value)) {
|
|
95
|
+
return { kind: 'tombstone', record: null, payload: null };
|
|
96
|
+
}
|
|
97
|
+
if (isOverlayRecord(value)) {
|
|
98
|
+
const logicallyStale = Date.now() > value.fu;
|
|
99
|
+
return {
|
|
100
|
+
kind: logicallyStale ? 'stale' : 'fresh',
|
|
101
|
+
record: value,
|
|
102
|
+
payload: base64ToBytes(value.p),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Unknown value shape — treat as miss (forward compatibility).
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ─── Overlay write ───────────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Resolve the effective TTL for a component's runtime lifetime.
|
|
113
|
+
* Tag-only entries (no explicit ttl) get the ceiling TTL (design/45
|
|
114
|
+
* §Tag-only entries carry a ceiling TTL).
|
|
115
|
+
*/
|
|
116
|
+
export function effectiveTtl(ttl: number | undefined): number {
|
|
117
|
+
return ttl ?? CEILING_TTL_SECONDS;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Store a component flight payload in the overlay.
|
|
122
|
+
*/
|
|
123
|
+
export async function storeOverlayEntry(
|
|
124
|
+
componentId: string,
|
|
125
|
+
cacheKey: string,
|
|
126
|
+
payloadBytes: Uint8Array,
|
|
127
|
+
opts: {
|
|
128
|
+
ttl?: number;
|
|
129
|
+
tags: string[];
|
|
130
|
+
hasSeed: boolean;
|
|
131
|
+
}
|
|
132
|
+
): Promise<void> {
|
|
133
|
+
const handler = getCacheHandler();
|
|
134
|
+
const key = overlayKey(componentId, cacheKey);
|
|
135
|
+
const logicalTtl = effectiveTtl(opts.ttl);
|
|
136
|
+
const physicalTtl = opts.hasSeed ? DEPLOY_LONG_TTL_SECONDS : logicalTtl;
|
|
137
|
+
|
|
138
|
+
const record: ComponentOverlayRecord = {
|
|
139
|
+
_t: 'co',
|
|
140
|
+
p: bytesToBase64(payloadBytes),
|
|
141
|
+
fu: Date.now() + logicalTtl * 1000,
|
|
142
|
+
s: opts.hasSeed,
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
await handler.set(key, record, { ttl: physicalTtl, tags: opts.tags });
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ─── Tombstone writes ────────────────────────────────────────────────────
|
|
149
|
+
|
|
150
|
+
let tagIndex: Map<string, SeedKeyInfo[]> | null = null;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Initialize the tag index from the prebuilt manifest. Called once when the
|
|
154
|
+
* manifest is loaded. Without a manifest (no prebuilt components), this is
|
|
155
|
+
* never called and revalidateTag skips the tombstone path entirely.
|
|
156
|
+
*/
|
|
157
|
+
export function initTagIndex(manifest: PrebuiltManifest): void {
|
|
158
|
+
tagIndex = buildTagIndex(manifest);
|
|
159
|
+
emitIsrDiagnosticIfNeeded(manifest);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get the tag index, if initialized.
|
|
164
|
+
* @internal — exported for testing.
|
|
165
|
+
*/
|
|
166
|
+
export function getTagIndex(): Map<string, SeedKeyInfo[]> | null {
|
|
167
|
+
return tagIndex;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Reset the tag index (for tests).
|
|
172
|
+
* @internal
|
|
173
|
+
*/
|
|
174
|
+
export function resetTagIndex(): void {
|
|
175
|
+
tagIndex = null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Write tombstones for all seed entries carrying the given tag.
|
|
180
|
+
* Called from cache.invalidate (cache-api.ts) AFTER the handler's own
|
|
181
|
+
* invalidation clears overlay entries.
|
|
182
|
+
*
|
|
183
|
+
* The tombstone prevents the immutable seed from being served after
|
|
184
|
+
* invalidation — without it, a handler.invalidate that clears the overlay
|
|
185
|
+
* would expose the (now-stale) build artifact on the next request.
|
|
186
|
+
*
|
|
187
|
+
* Ensures the manifest is loaded first so cold-process actions that
|
|
188
|
+
* invalidate before any page render still write tombstones.
|
|
189
|
+
*/
|
|
190
|
+
export async function writeTombstonesForTag(tag: string): Promise<void> {
|
|
191
|
+
if (!tagIndex) {
|
|
192
|
+
await ensureManifestLoaded();
|
|
193
|
+
}
|
|
194
|
+
if (!tagIndex) return;
|
|
195
|
+
const seeds = tagIndex.get(tag);
|
|
196
|
+
if (!seeds || seeds.length === 0) return;
|
|
197
|
+
|
|
198
|
+
const handler = getCacheHandler();
|
|
199
|
+
const tombstone: ComponentTombstoneRecord = { _t: 'ct' };
|
|
200
|
+
|
|
201
|
+
await Promise.all(
|
|
202
|
+
seeds.map((seed) => {
|
|
203
|
+
const key = overlayKey(seed.componentId, seed.cacheKey);
|
|
204
|
+
return handler.set(key, tombstone, {
|
|
205
|
+
ttl: DEPLOY_LONG_TTL_SECONDS,
|
|
206
|
+
tags: [tag],
|
|
207
|
+
});
|
|
208
|
+
})
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// ─── ISR build diagnostic ────────────────────────────────────────────────
|
|
213
|
+
|
|
214
|
+
let isrDiagnosticEmitted = false;
|
|
215
|
+
|
|
216
|
+
function emitIsrDiagnosticIfNeeded(manifest: PrebuiltManifest): void {
|
|
217
|
+
if (isrDiagnosticEmitted) return;
|
|
218
|
+
|
|
219
|
+
const handler = getCacheHandler();
|
|
220
|
+
const isMemoryBased = handler instanceof MemoryCacheHandler || !isCacheHandlerConfigured();
|
|
221
|
+
if (!isMemoryBased) return;
|
|
222
|
+
|
|
223
|
+
for (const [, component] of Object.entries(manifest)) {
|
|
224
|
+
if (!component || typeof component !== 'object' || !('entries' in component)) continue;
|
|
225
|
+
for (const [, entry] of Object.entries(component.entries)) {
|
|
226
|
+
if (entry.tags && entry.tags.length > 0) {
|
|
227
|
+
isrDiagnosticEmitted = true;
|
|
228
|
+
console.warn(
|
|
229
|
+
'[timber] tag revalidation of prerendered components requires a shared cache ' +
|
|
230
|
+
'handler in multi-instance deployments. The current MemoryCacheHandler is ' +
|
|
231
|
+
'per-process — revalidateTag on one instance will not purge the build seed ' +
|
|
232
|
+
'on others. Configure a shared handler (Redis, KV) for production ISR.'
|
|
233
|
+
);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Reset the diagnostic flag (for tests).
|
|
242
|
+
* @internal
|
|
243
|
+
*/
|
|
244
|
+
export function resetIsrDiagnostic(): void {
|
|
245
|
+
isrDiagnosticEmitted = false;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ─── Encoding helpers ────────────────────────────────────────────────────
|
|
249
|
+
|
|
250
|
+
function bytesToBase64(bytes: Uint8Array): string {
|
|
251
|
+
return Buffer.from(bytes).toString('base64');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function base64ToBytes(b64: string): Uint8Array {
|
|
255
|
+
return new Uint8Array(Buffer.from(b64, 'base64'));
|
|
256
|
+
}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prebuilt payload source — the adapter seam through which the runtime
|
|
3
|
+
* reads build-time flight artifacts (`.timber/dist/prebuilt/`).
|
|
4
|
+
*
|
|
5
|
+
* The runtime never touches the filesystem directly: adapters register a
|
|
6
|
+
* source at startup (Node: fs reads; Cloudflare: the assets binding —
|
|
7
|
+
* design/44-render-at-build-time.md §Adapter Integration). Artifacts are
|
|
8
|
+
* produced by the post-build capture pass (TIM-1119, prebuilt-builder.ts);
|
|
9
|
+
* adapter registration of the source is TIM-1122. Until a source is
|
|
10
|
+
* registered (adapter not wired yet, dev mode, no artifacts built), every
|
|
11
|
+
* lookup misses and cache.component wrappers render live — the designed
|
|
12
|
+
* dynamic-fallback behavior.
|
|
13
|
+
*
|
|
14
|
+
* Phase 3 (design/45 runtime tier) inserts the CacheHandler overlay lookup
|
|
15
|
+
* in front of `lookupPrebuiltPayload` — overlay first, then artifact. The
|
|
16
|
+
* single-lookup-function shape here is that seam.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { initTagIndex, resetTagIndex } from './overlay.js';
|
|
20
|
+
|
|
21
|
+
export interface PrebuiltManifestEntry {
|
|
22
|
+
/** Segment params this entry was captured under. */
|
|
23
|
+
params: Record<string, string | string[]>;
|
|
24
|
+
/** Payload path relative to the prebuilt/ directory. */
|
|
25
|
+
file: string;
|
|
26
|
+
/** Payload size in bytes (build report / diagnostics). */
|
|
27
|
+
bytes?: number;
|
|
28
|
+
/** Runtime invalidation tags (design/45 ISR tier). */
|
|
29
|
+
tags?: string[];
|
|
30
|
+
/** Epoch ms when this entry was captured (seed freshness for ISR). */
|
|
31
|
+
buildTimestamp?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface PrebuiltManifest {
|
|
35
|
+
[componentId: string]: {
|
|
36
|
+
entries: Record<string, PrebuiltManifestEntry>;
|
|
37
|
+
/** When true, the component does not read segment params — the cache key uses `{}`. */
|
|
38
|
+
paramIndependent?: boolean;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface PrebuiltPayloadSource {
|
|
43
|
+
/** Load prebuilt/manifest.json. Null when no artifacts exist. */
|
|
44
|
+
loadManifest(): Promise<PrebuiltManifest | null>;
|
|
45
|
+
/** Read a `.flight` payload by manifest file path. Null when missing. */
|
|
46
|
+
readPayload(file: string): Promise<Uint8Array | null>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let source: PrebuiltPayloadSource | null = null;
|
|
50
|
+
let manifestPromise: Promise<PrebuiltManifest | null> | null = null;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Ceiling on the memoized manifest load. Without it, a stalled
|
|
54
|
+
* `loadManifest()` would leave `manifestPromise` pending forever and every
|
|
55
|
+
* subsequent cache.component render would await the same hung promise —
|
|
56
|
+
* the coalesced-promise deadlock class from design/13-security.md (A5).
|
|
57
|
+
* On expiry the load memoizes as null (permanent dynamic fallback, same
|
|
58
|
+
* policy as a failed load) and callers proceed immediately.
|
|
59
|
+
*/
|
|
60
|
+
const MANIFEST_LOAD_TIMEOUT_MS = 5_000;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Per-read ceiling on payload reads. The read is awaited inside a server
|
|
64
|
+
* component render — a stalled adapter promise would otherwise hang the
|
|
65
|
+
* RSC stream until the render timeout kills the whole page, when the
|
|
66
|
+
* correct degradation is a miss → live render (codex review round 4 on
|
|
67
|
+
* PR #835).
|
|
68
|
+
*/
|
|
69
|
+
const PAYLOAD_READ_TIMEOUT_MS = 5_000;
|
|
70
|
+
|
|
71
|
+
/** Race a source promise against a timeout that resolves to `fallback`. */
|
|
72
|
+
async function withTimeout<T>(
|
|
73
|
+
work: Promise<T>,
|
|
74
|
+
timeoutMs: number,
|
|
75
|
+
fallback: T,
|
|
76
|
+
onTimeout: () => void
|
|
77
|
+
): Promise<T> {
|
|
78
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
79
|
+
try {
|
|
80
|
+
return await Promise.race([
|
|
81
|
+
work,
|
|
82
|
+
new Promise<T>((resolve) => {
|
|
83
|
+
timer = setTimeout(() => {
|
|
84
|
+
onTimeout();
|
|
85
|
+
resolve(fallback);
|
|
86
|
+
}, timeoutMs);
|
|
87
|
+
}),
|
|
88
|
+
]);
|
|
89
|
+
} finally {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function loadManifestWithTimeout(
|
|
95
|
+
src: PrebuiltPayloadSource
|
|
96
|
+
): Promise<PrebuiltManifest | null> {
|
|
97
|
+
let manifest: PrebuiltManifest | null;
|
|
98
|
+
try {
|
|
99
|
+
manifest = await withTimeout(src.loadManifest(), MANIFEST_LOAD_TIMEOUT_MS, null, () => {
|
|
100
|
+
console.error(
|
|
101
|
+
`[timber] prebuilt manifest load exceeded ${MANIFEST_LOAD_TIMEOUT_MS}ms — all cache.component lookups will render dynamically`
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
} catch (error) {
|
|
105
|
+
console.error(
|
|
106
|
+
'[timber] failed to load prebuilt manifest — all cache.component lookups will miss:',
|
|
107
|
+
error
|
|
108
|
+
);
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
if (manifest) {
|
|
112
|
+
initTagIndex(manifest);
|
|
113
|
+
}
|
|
114
|
+
return manifest;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Register the payload source. Called once at server startup by the
|
|
119
|
+
* adapter/entry wiring (TIM-1122); tests inject fakes. Passing null
|
|
120
|
+
* unregisters (and drops the memoized manifest).
|
|
121
|
+
*/
|
|
122
|
+
export function setPrebuiltPayloadSource(next: PrebuiltPayloadSource | null): void {
|
|
123
|
+
source = next;
|
|
124
|
+
manifestPromise = null;
|
|
125
|
+
if (!next) resetTagIndex();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Whether a source is registered — the gate for both marker emission and
|
|
130
|
+
* splice-transform installation. False means zero prebuilt overhead.
|
|
131
|
+
*/
|
|
132
|
+
export function hasPrebuiltPayloadSource(): boolean {
|
|
133
|
+
return source !== null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Ensure the manifest is loaded (and the tag index initialized). No-op
|
|
138
|
+
* when no source is registered. Used by the tombstone path to avoid
|
|
139
|
+
* skipping tombstones on cold processes where the first request is an
|
|
140
|
+
* action rather than a page render.
|
|
141
|
+
*/
|
|
142
|
+
export async function ensureManifestLoaded(): Promise<void> {
|
|
143
|
+
if (source === null) return;
|
|
144
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
145
|
+
await manifestPromise;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Look up a manifest entry (metadata only, no payload read).
|
|
150
|
+
* Used by the overlay to check seed existence and freshness.
|
|
151
|
+
*/
|
|
152
|
+
export async function isParamIndependent(componentId: string): Promise<boolean> {
|
|
153
|
+
if (source === null) return false;
|
|
154
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
155
|
+
const manifest = await manifestPromise;
|
|
156
|
+
return manifest?.[componentId]?.paramIndependent === true;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export async function getManifestEntry(
|
|
160
|
+
componentId: string,
|
|
161
|
+
cacheKey: string
|
|
162
|
+
): Promise<PrebuiltManifestEntry | null> {
|
|
163
|
+
if (source === null) return null;
|
|
164
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
165
|
+
const manifest = await manifestPromise;
|
|
166
|
+
return manifest?.[componentId]?.entries?.[cacheKey] ?? null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Look up a cached payload: manifest entry → payload bytes.
|
|
171
|
+
* Null on any miss or read failure — callers fall back to live render.
|
|
172
|
+
*
|
|
173
|
+
* The manifest is loaded once and memoized (design/44 §manifest.json:
|
|
174
|
+
* loaded at startup, held in memory; payloads read on demand). A failed
|
|
175
|
+
* manifest load is memoized as null rather than retried per-request — a
|
|
176
|
+
* broken artifact should degrade to dynamic rendering, not add a failing
|
|
177
|
+
* read to every request.
|
|
178
|
+
*/
|
|
179
|
+
export async function lookupPrebuiltPayload(
|
|
180
|
+
componentId: string,
|
|
181
|
+
cacheKey: string
|
|
182
|
+
): Promise<Uint8Array | null> {
|
|
183
|
+
if (source === null) return null;
|
|
184
|
+
manifestPromise ??= loadManifestWithTimeout(source);
|
|
185
|
+
const manifest = await manifestPromise;
|
|
186
|
+
const entry = manifest?.[componentId]?.entries?.[cacheKey];
|
|
187
|
+
if (!entry) return null;
|
|
188
|
+
try {
|
|
189
|
+
return await withTimeout(source.readPayload(entry.file), PAYLOAD_READ_TIMEOUT_MS, null, () => {
|
|
190
|
+
console.error(
|
|
191
|
+
`[timber] prebuilt payload read for "${entry.file}" exceeded ${PAYLOAD_READ_TIMEOUT_MS}ms — rendering dynamically`
|
|
192
|
+
);
|
|
193
|
+
});
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.error(
|
|
196
|
+
`[timber] failed to read prebuilt payload "${entry.file}" for ${componentId} — rendering dynamically:`,
|
|
197
|
+
error
|
|
198
|
+
);
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic ALS store for build-time capture (design/44 §Param Injection).
|
|
3
|
+
*
|
|
4
|
+
* Each param combo renders inside a `RequestContextStore` that provides
|
|
5
|
+
* segment params and NOTHING else. Every per-request API is a hard error,
|
|
6
|
+
* never a silent empty value — a component that branches on a header
|
|
7
|
+
* (locale, experiment, auth state) must fail the build, not bake the
|
|
8
|
+
* "header absent" branch into the cache for every future request:
|
|
9
|
+
*
|
|
10
|
+
* - `segmentParams.get()` works — reads from this store
|
|
11
|
+
* - `cookies()` / `headers()` / `searchParams` throw `BuildTimeContextError`
|
|
12
|
+
*
|
|
13
|
+
* The enforcement lives in the store's own fields (recording accessors)
|
|
14
|
+
* rather than in request-context.ts / cookie-context.ts, so the request
|
|
15
|
+
* path pays nothing and those modules stay untouched. The per-request
|
|
16
|
+
* fields — `headers`, `parsedCookies`, `searchParams` — are getters that
|
|
17
|
+
* record a violation and throw, so the CALL itself (`getHeaders()`,
|
|
18
|
+
* `getCookieJar()`, `getSearchParams()`) is the build error, not some
|
|
19
|
+
* later member read; merely obtaining and passing the object around is
|
|
20
|
+
* already outside the build-time contract (codex P2 round 5 on PR #836).
|
|
21
|
+
* `mutableContext` gets the same treatment because cookie MUTATORS reach
|
|
22
|
+
* it (via cookie-context's assertMutable, its only reader) before any
|
|
23
|
+
* other store field (codex P2 round 4).
|
|
24
|
+
*
|
|
25
|
+
* Every violation is recorded in a side channel BEFORE the throw — a
|
|
26
|
+
* component that catches the error (`try { headers() } catch { fallback }`)
|
|
27
|
+
* still fails its entry; accepting that render would silently bake the
|
|
28
|
+
* request-dependent fallback branch into the payload (codex P1 on PR #836).
|
|
29
|
+
* The capture pass checks the side channel after every render.
|
|
30
|
+
*
|
|
31
|
+
* This is safe precisely because capture renders the bare component
|
|
32
|
+
* element — no pipeline, no SSR bridge, no action machinery — so the only
|
|
33
|
+
* code that can reach these fields during a capture is the component
|
|
34
|
+
* itself (via the public accessors).
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import type { RequestContextStore } from '../als-registry.js';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Thrown when a prerendered component touches per-request context at
|
|
41
|
+
* build time. The capture pass treats this as a HARD build error —
|
|
42
|
+
* it indicates a design mistake, not transient bad data (design/44
|
|
43
|
+
* §Build-Phase Error Handling).
|
|
44
|
+
*/
|
|
45
|
+
export class BuildTimeContextError extends Error {
|
|
46
|
+
/** The per-request API that was called (e.g. "cookies()"). */
|
|
47
|
+
readonly api: string;
|
|
48
|
+
|
|
49
|
+
constructor(componentId: string, api: string) {
|
|
50
|
+
super(
|
|
51
|
+
`[timber] cache.component "${componentId}": ${api} cannot be used in a ` +
|
|
52
|
+
`prerendered component — there is no request at build time. Prerendered ` +
|
|
53
|
+
`components may read segment params and timber.cache data only. Remove the ` +
|
|
54
|
+
`${api} call, or drop { prerender: true } and render this component ` +
|
|
55
|
+
`per-request. (design/44-render-at-build-time.md §Param Injection)`
|
|
56
|
+
);
|
|
57
|
+
this.name = 'BuildTimeContextError';
|
|
58
|
+
this.api = api;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** A synthetic store plus the side channel its accessors report into. */
|
|
63
|
+
export interface BuildTimeStoreHandle {
|
|
64
|
+
store: RequestContextStore;
|
|
65
|
+
/**
|
|
66
|
+
* Every per-request API access during the render, recorded even when
|
|
67
|
+
* the accompanying throw was caught by user code. Non-empty after the
|
|
68
|
+
* render ⇒ the entry must fail as a hard build error.
|
|
69
|
+
*/
|
|
70
|
+
violations: BuildTimeContextError[];
|
|
71
|
+
/** Whether the component read `segmentParams` during the render. */
|
|
72
|
+
segmentParamsRead: boolean;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Create the synthetic per-combo store. `segmentParams` must already be
|
|
77
|
+
* coerced through the route's codecs — cache-key parity with request time
|
|
78
|
+
* depends on hashing the exact record `coerceSegmentParams` produces.
|
|
79
|
+
*/
|
|
80
|
+
export function createBuildTimeStore(
|
|
81
|
+
componentId: string,
|
|
82
|
+
segmentParams: Record<string, string | string[]>
|
|
83
|
+
): BuildTimeStoreHandle {
|
|
84
|
+
const violations: BuildTimeContextError[] = [];
|
|
85
|
+
const handle: BuildTimeStoreHandle = {
|
|
86
|
+
store: null!,
|
|
87
|
+
violations,
|
|
88
|
+
segmentParamsRead: false,
|
|
89
|
+
};
|
|
90
|
+
const store: RequestContextStore = {
|
|
91
|
+
headers: new Headers(),
|
|
92
|
+
originalHeaders: new Headers(),
|
|
93
|
+
cookieHeader: '',
|
|
94
|
+
searchParams: new URLSearchParams(),
|
|
95
|
+
searchString: '',
|
|
96
|
+
segmentParams,
|
|
97
|
+
cookieJar: new Map(),
|
|
98
|
+
flushed: false,
|
|
99
|
+
mutableContext: false,
|
|
100
|
+
};
|
|
101
|
+
const violate = (api: string): never => {
|
|
102
|
+
const error = new BuildTimeContextError(componentId, api);
|
|
103
|
+
violations.push(error);
|
|
104
|
+
throw error;
|
|
105
|
+
};
|
|
106
|
+
Object.defineProperties(store, {
|
|
107
|
+
headers: { get: () => violate('headers()') },
|
|
108
|
+
parsedCookies: { get: () => violate('cookies()') },
|
|
109
|
+
searchParams: { get: () => violate('searchParams') },
|
|
110
|
+
mutableContext: { get: () => violate('cookies()') },
|
|
111
|
+
segmentParams: {
|
|
112
|
+
get: () => {
|
|
113
|
+
handle.segmentParamsRead = true;
|
|
114
|
+
return segmentParams;
|
|
115
|
+
},
|
|
116
|
+
enumerable: true,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
handle.store = store;
|
|
120
|
+
return handle;
|
|
121
|
+
}
|