@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/actions-DLnUaR65.js +421 -0
- package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
- package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
- package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-C77ScO0m.js +106 -0
- package/dist/_chunks/define-C77ScO0m.js.map +1 -0
- package/dist/_chunks/define-Itxvcd7F.js +199 -0
- package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
- package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
- package/dist/_chunks/format-CYBGxKtc.js +14 -0
- package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-DRlhJWbu.js} +219 -97
- package/dist/_chunks/interception-DRlhJWbu.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
- package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
- package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
- package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
- package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
- package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
- package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
- package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
- package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
- package/dist/_chunks/use-query-states-BiV5GJgm.js.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +135 -11
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +142 -80
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +27 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +23 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +10 -4
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +6 -3
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +229 -1018
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +18 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +890 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-params.d.ts +6 -4
- package/dist/client/use-params.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +266 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -83
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +138 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +72 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +59 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +45 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4294 -2453
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +3 -3
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-404-page.d.ts +56 -0
- package/dist/plugins/dev-404-page.d.ts.map +1 -0
- package/dist/plugins/dev-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +49 -9
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-error-page.d.ts +58 -0
- package/dist/plugins/dev-error-page.d.ts.map +1 -0
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/dev-terminal-error.d.ts +28 -0
- package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +139 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +32 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +78 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +4 -0
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +7 -0
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +32 -4
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/debug.d.ts +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-holding-server.d.ts +52 -0
- package/dist/server/dev-holding-server.d.ts.map +1 -0
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/dev-warnings.d.ts +1 -21
- package/dist/server/dev-warnings.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -43
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2800
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +46 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2900 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +52 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +69 -18
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +112 -43
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +16 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +20 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +23 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +1 -1
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +4 -4
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +3 -2
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +51 -16
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +52 -8
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +31 -0
- package/src/cache/timber-cache.ts +24 -20
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +128 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +143 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +14 -7
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +65 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +342 -113
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +299 -72
- package/src/client/rsc-fetch.ts +97 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-params.ts +7 -5
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/codec.ts +49 -0
- package/src/config-types.ts +264 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +78 -25
- package/src/cookies/index.ts +8 -0
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/pipeline.ts +275 -0
- package/src/fonts/transform.ts +353 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +159 -0
- package/src/index.ts +314 -355
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +9 -3
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-404-page.ts +418 -0
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +286 -42
- package/src/plugins/dev-error-page.ts +536 -0
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +146 -19
- package/src/plugins/dev-terminal-error.ts +217 -0
- package/src/plugins/entries.ts +111 -10
- package/src/plugins/fonts.ts +133 -638
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +213 -31
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen.ts +273 -105
- package/src/routing/convention-lint.ts +356 -0
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +482 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +53 -6
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +34 -6
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-holding-server.ts +185 -0
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/dev-warnings.ts +4 -49
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injectors.ts +280 -120
- package/src/server/index.ts +25 -177
- package/src/server/internal.ts +169 -0
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +261 -66
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +293 -132
- package/src/server/route-element-builder.ts +283 -191
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +31 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +304 -111
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +81 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +171 -38
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +244 -229
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +20 -9
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +1 -1
- package/src/shims/navigation.ts +7 -2
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/cookies/index.js.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -166
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Render-level response deduplication and short-TTL LRU cache.
|
|
3
|
-
*
|
|
4
|
-
* Two layers of optimization:
|
|
5
|
-
*
|
|
6
|
-
* 1. **Singleflight** — concurrent requests to the same URL share a single
|
|
7
|
-
* render. Uses createSingleflight() from cache/singleflight.ts.
|
|
8
|
-
*
|
|
9
|
-
* 2. **LRU cache** — recently rendered responses are reused without
|
|
10
|
-
* re-executing the RSC-to-SSR pipeline. Entries have a short TTL
|
|
11
|
-
* (default 5s) and the cache has a bounded size (default 150 entries).
|
|
12
|
-
*
|
|
13
|
-
* Cache keys are compound: pathname + search + isRscPayload + Vary'd headers.
|
|
14
|
-
* Only GET requests are cached. Responses with Set-Cookie, Cache-Control:
|
|
15
|
-
* no-store/private, or error/redirect status codes are never cached.
|
|
16
|
-
* When `publicOnly` is true (default), requests with Cookie or Authorization
|
|
17
|
-
* headers bypass the cache entirely.
|
|
18
|
-
*
|
|
19
|
-
* See design/02-rendering-pipeline.md, design/31-benchmarking.md.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import { createSingleflight } from '#/cache/singleflight.js';
|
|
23
|
-
|
|
24
|
-
// ─── Configuration ─────────────────────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
export interface ResponseCacheConfig {
|
|
27
|
-
/** Maximum number of entries in the LRU cache. Default: 150. */
|
|
28
|
-
maxSize?: number;
|
|
29
|
-
/** TTL for cached entries in milliseconds. Default: 5000 (5s). */
|
|
30
|
-
ttlMs?: number;
|
|
31
|
-
/**
|
|
32
|
-
* When true (default), requests with Cookie or Authorization headers
|
|
33
|
-
* bypass the cache entirely. This prevents sharing user-specific
|
|
34
|
-
* responses across requests.
|
|
35
|
-
*/
|
|
36
|
-
publicOnly?: boolean;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ResolvedResponseCacheConfig {
|
|
40
|
-
maxSize: number;
|
|
41
|
-
ttlMs: number;
|
|
42
|
-
publicOnly: boolean;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function resolveResponseCacheConfig(
|
|
46
|
-
config?: ResponseCacheConfig | false
|
|
47
|
-
): ResolvedResponseCacheConfig | null {
|
|
48
|
-
// Explicitly disabled
|
|
49
|
-
if (config === false) return null;
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
maxSize: config?.maxSize ?? 150,
|
|
53
|
-
ttlMs: config?.ttlMs ?? 5000,
|
|
54
|
-
publicOnly: config?.publicOnly ?? true,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ─── Cache Entry ───────────────────────────────────────────────────────────
|
|
59
|
-
|
|
60
|
-
interface CacheEntry {
|
|
61
|
-
/** The cached response body as an ArrayBuffer (already consumed). */
|
|
62
|
-
body: ArrayBuffer;
|
|
63
|
-
/** Response status code. */
|
|
64
|
-
status: number;
|
|
65
|
-
/** Response headers (serialized). */
|
|
66
|
-
headers: [string, string][];
|
|
67
|
-
/** Timestamp when this entry was created. */
|
|
68
|
-
createdAt: number;
|
|
69
|
-
/**
|
|
70
|
-
* The Vary header value from the original response, if any.
|
|
71
|
-
* Used to build variant-aware cache keys for subsequent requests.
|
|
72
|
-
*/
|
|
73
|
-
vary: string | null;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ─── LRU Cache ─────────────────────────────────────────────────────────────
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Simple LRU cache backed by a Map (insertion order = access order).
|
|
80
|
-
* On get, we delete and re-insert to move the entry to the end (most recent).
|
|
81
|
-
* On eviction, we delete from the beginning (least recent).
|
|
82
|
-
*/
|
|
83
|
-
class LruCache {
|
|
84
|
-
private readonly map = new Map<string, CacheEntry>();
|
|
85
|
-
private readonly maxSize: number;
|
|
86
|
-
private readonly ttlMs: number;
|
|
87
|
-
|
|
88
|
-
constructor(maxSize: number, ttlMs: number) {
|
|
89
|
-
this.maxSize = maxSize;
|
|
90
|
-
this.ttlMs = ttlMs;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
get(key: string): CacheEntry | undefined {
|
|
94
|
-
const entry = this.map.get(key);
|
|
95
|
-
if (!entry) return undefined;
|
|
96
|
-
|
|
97
|
-
// Check TTL
|
|
98
|
-
if (Date.now() - entry.createdAt > this.ttlMs) {
|
|
99
|
-
this.map.delete(key);
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Move to end (most recently used)
|
|
104
|
-
this.map.delete(key);
|
|
105
|
-
this.map.set(key, entry);
|
|
106
|
-
return entry;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
set(key: string, entry: CacheEntry): void {
|
|
110
|
-
// If key exists, remove to re-insert at end
|
|
111
|
-
this.map.delete(key);
|
|
112
|
-
|
|
113
|
-
// Evict oldest if at capacity
|
|
114
|
-
if (this.map.size >= this.maxSize) {
|
|
115
|
-
const oldest = this.map.keys().next().value;
|
|
116
|
-
if (oldest !== undefined) {
|
|
117
|
-
this.map.delete(oldest);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
this.map.set(key, entry);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
get size(): number {
|
|
125
|
-
return this.map.size;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
clear(): void {
|
|
129
|
-
this.map.clear();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// ─── Response Cache ────────────────────────────────────────────────────────
|
|
134
|
-
|
|
135
|
-
export interface ResponseCache {
|
|
136
|
-
/**
|
|
137
|
-
* Wrap a render function with singleflight dedup + LRU caching.
|
|
138
|
-
* Returns the cached Response or executes the render function.
|
|
139
|
-
*/
|
|
140
|
-
getOrRender(
|
|
141
|
-
req: Request,
|
|
142
|
-
isRscPayload: boolean,
|
|
143
|
-
renderFn: () => Promise<Response>
|
|
144
|
-
): Promise<Response>;
|
|
145
|
-
|
|
146
|
-
/** Number of entries currently in the LRU cache. */
|
|
147
|
-
readonly size: number;
|
|
148
|
-
|
|
149
|
-
/** Clear all cached entries. */
|
|
150
|
-
clear(): void;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// ─── Cache-Control parsing ─────────────────────────────────────────────────
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Check if a Cache-Control header value contains directives that forbid
|
|
157
|
-
* storing the response in a shared cache. We check for `no-store` and
|
|
158
|
-
* `private` — both indicate the response must not be reused.
|
|
159
|
-
*
|
|
160
|
-
* This is intentionally simple: we don't parse `max-age`, `s-maxage`,
|
|
161
|
-
* `must-revalidate`, etc. This is a short-TTL render cache, not an HTTP
|
|
162
|
-
* cache — we just need to respect explicit "don't cache this" signals.
|
|
163
|
-
*/
|
|
164
|
-
function hasCacheControlNoStore(headerValue: string | null): boolean {
|
|
165
|
-
if (!headerValue) return false;
|
|
166
|
-
// Split on comma, trim whitespace, check for no-store or private directives.
|
|
167
|
-
// Case-insensitive per HTTP spec.
|
|
168
|
-
const lower = headerValue.toLowerCase();
|
|
169
|
-
return lower.includes('no-store') || lower.includes('private');
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// ─── Vary header handling ──────────────────────────────────────────────────
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Parse a Vary header value into a sorted list of header names.
|
|
176
|
-
* Returns null if there is no Vary header or it's empty.
|
|
177
|
-
* Returns ['*'] if Vary: * (meaning the response varies on everything —
|
|
178
|
-
* effectively uncacheable).
|
|
179
|
-
*/
|
|
180
|
-
function parseVaryHeader(headerValue: string | null): string[] | null {
|
|
181
|
-
if (!headerValue) return null;
|
|
182
|
-
const trimmed = headerValue.trim();
|
|
183
|
-
if (trimmed === '') return null;
|
|
184
|
-
if (trimmed === '*') return ['*'];
|
|
185
|
-
|
|
186
|
-
// Split on comma, normalize to lowercase, sort for deterministic keys
|
|
187
|
-
return trimmed
|
|
188
|
-
.split(',')
|
|
189
|
-
.map((h) => h.trim().toLowerCase())
|
|
190
|
-
.filter((h) => h.length > 0)
|
|
191
|
-
.sort();
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Build a Vary-aware suffix for the cache key. For each header name in the
|
|
196
|
-
* Vary list, append the request's value for that header. This ensures that
|
|
197
|
-
* requests with different Accept-Language (for example) get different cache
|
|
198
|
-
* entries.
|
|
199
|
-
*/
|
|
200
|
-
function buildVarySuffix(req: Request, varyHeaders: string[]): string {
|
|
201
|
-
return varyHeaders.map((h) => `${h}=${req.headers.get(h) ?? ''}`).join('&');
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// ─── Factory ───────────────────────────────────────────────────────────────
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Create a response cache with singleflight deduplication and LRU caching.
|
|
208
|
-
*/
|
|
209
|
-
export function createResponseCache(config: ResolvedResponseCacheConfig): ResponseCache {
|
|
210
|
-
const lru = new LruCache(config.maxSize, config.ttlMs);
|
|
211
|
-
const singleflight = createSingleflight();
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Known Vary headers per path. When a response includes a Vary header,
|
|
215
|
-
* we store the parsed header names so that subsequent requests to the
|
|
216
|
-
* same path can include the Vary'd header values in their cache key
|
|
217
|
-
* BEFORE rendering (i.e., on cache lookup, not just after the first
|
|
218
|
-
* render). This avoids the "first request always misses" problem for
|
|
219
|
-
* Vary'd responses.
|
|
220
|
-
*/
|
|
221
|
-
const knownVaryHeaders = new Map<string, string[]>();
|
|
222
|
-
|
|
223
|
-
function buildCacheKey(req: Request, isRscPayload: boolean): string | null {
|
|
224
|
-
// Never cache non-GET requests. POST/PUT/DELETE have side effects and
|
|
225
|
-
// may carry per-request state (e.g., form flash data via ALS) that makes
|
|
226
|
-
// the rendered output unique even for the same URL.
|
|
227
|
-
if (req.method !== 'GET') return null;
|
|
228
|
-
|
|
229
|
-
// When publicOnly is true, skip caching for authenticated requests
|
|
230
|
-
if (config.publicOnly) {
|
|
231
|
-
if (req.headers.has('Cookie') || req.headers.has('Authorization')) {
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const url = new URL(req.url);
|
|
237
|
-
// Include search params in the cache key. Pages that use searchParams
|
|
238
|
-
// (e.g., ?sort=asc, ?page=2) produce different output per query string.
|
|
239
|
-
let key = `${url.pathname}${url.search}:${isRscPayload ? 'rsc' : 'html'}`;
|
|
240
|
-
|
|
241
|
-
// If we've seen a Vary header for this path before, include the varied
|
|
242
|
-
// request header values in the key so different variants get different
|
|
243
|
-
// cache entries.
|
|
244
|
-
const pathKey = `${url.pathname}:${isRscPayload ? 'rsc' : 'html'}`;
|
|
245
|
-
const varyHeaders = knownVaryHeaders.get(pathKey);
|
|
246
|
-
if (varyHeaders) {
|
|
247
|
-
if (varyHeaders[0] === '*') {
|
|
248
|
-
// Vary: * means the response varies on everything — uncacheable
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
key += ':' + buildVarySuffix(req, varyHeaders);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return key;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Check if a response is cacheable.
|
|
259
|
-
* Responses with Set-Cookie headers, Cache-Control: no-store/private,
|
|
260
|
-
* error/redirect status codes, or Vary: * are never cached.
|
|
261
|
-
*/
|
|
262
|
-
function isCacheable(response: Response): boolean {
|
|
263
|
-
// Don't cache error responses
|
|
264
|
-
if (response.status >= 400) return false;
|
|
265
|
-
|
|
266
|
-
// Don't cache redirects
|
|
267
|
-
if (response.status >= 300 && response.status < 400) return false;
|
|
268
|
-
|
|
269
|
-
// Don't cache responses with Set-Cookie (user-specific state)
|
|
270
|
-
if (response.headers.has('Set-Cookie')) return false;
|
|
271
|
-
|
|
272
|
-
// Respect Cache-Control: no-store and private directives.
|
|
273
|
-
// If the application explicitly says "don't cache this," we obey.
|
|
274
|
-
if (hasCacheControlNoStore(response.headers.get('Cache-Control'))) return false;
|
|
275
|
-
|
|
276
|
-
// Vary: * means the response varies on everything — don't cache
|
|
277
|
-
const vary = parseVaryHeader(response.headers.get('Vary'));
|
|
278
|
-
if (vary && vary[0] === '*') return false;
|
|
279
|
-
|
|
280
|
-
// Only cache responses with a body
|
|
281
|
-
if (!response.body) return false;
|
|
282
|
-
|
|
283
|
-
return true;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/** Construct a fresh Response from a cache entry (each caller gets their own). */
|
|
287
|
-
function responseFromEntry(entry: CacheEntry): Response {
|
|
288
|
-
// Null-body statuses (204, 304) cannot have a body per HTTP spec.
|
|
289
|
-
// The Response constructor throws if you pass a body with these statuses.
|
|
290
|
-
const isNullBody = entry.status === 204 || entry.status === 304;
|
|
291
|
-
// slice(0) creates a copy so each caller owns their buffer
|
|
292
|
-
return new Response(isNullBody ? null : entry.body.slice(0), {
|
|
293
|
-
status: entry.status,
|
|
294
|
-
headers: entry.headers,
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
* Record the Vary header from a response so future requests to the same
|
|
300
|
-
* path include varied header values in their cache key.
|
|
301
|
-
*/
|
|
302
|
-
function recordVaryHeaders(pathKey: string, response: Response): void {
|
|
303
|
-
const vary = parseVaryHeader(response.headers.get('Vary'));
|
|
304
|
-
if (vary) {
|
|
305
|
-
knownVaryHeaders.set(pathKey, vary);
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return {
|
|
310
|
-
async getOrRender(
|
|
311
|
-
req: Request,
|
|
312
|
-
isRscPayload: boolean,
|
|
313
|
-
renderFn: () => Promise<Response>
|
|
314
|
-
): Promise<Response> {
|
|
315
|
-
const cacheKey = buildCacheKey(req, isRscPayload);
|
|
316
|
-
|
|
317
|
-
// No cache key = skip caching and singleflight entirely.
|
|
318
|
-
// This covers POST requests, authenticated requests (publicOnly),
|
|
319
|
-
// and Vary: * responses.
|
|
320
|
-
if (cacheKey === null) {
|
|
321
|
-
return renderFn();
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Check LRU cache first
|
|
325
|
-
const cached = lru.get(cacheKey);
|
|
326
|
-
if (cached) {
|
|
327
|
-
return responseFromEntry(cached);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// Singleflight: concurrent requests to the same key share one render.
|
|
331
|
-
// We buffer the response body into an ArrayBuffer so ALL callers —
|
|
332
|
-
// including the singleflight leader — get independent copies.
|
|
333
|
-
// This fixes the body-loss bug where the leader consumed the body
|
|
334
|
-
// and concurrent waiters got an empty response.
|
|
335
|
-
const result: CacheEntry | null = await singleflight.do(cacheKey, async () => {
|
|
336
|
-
const response = await renderFn();
|
|
337
|
-
|
|
338
|
-
// Record Vary headers for future cache key construction
|
|
339
|
-
const url = new URL(req.url);
|
|
340
|
-
const pathKey = `${url.pathname}:${isRscPayload ? 'rsc' : 'html'}`;
|
|
341
|
-
recordVaryHeaders(pathKey, response);
|
|
342
|
-
|
|
343
|
-
if (!isCacheable(response)) {
|
|
344
|
-
// Buffer the body even for non-cacheable responses so the
|
|
345
|
-
// singleflight leader and all concurrent waiters each get
|
|
346
|
-
// an independent copy. Without this, the leader consumes
|
|
347
|
-
// the body stream and waiters get an empty response.
|
|
348
|
-
const body = await response.arrayBuffer();
|
|
349
|
-
const headers: [string, string][] = [];
|
|
350
|
-
response.headers.forEach((value, key) => {
|
|
351
|
-
headers.push([key, value]);
|
|
352
|
-
});
|
|
353
|
-
// Return as a CacheEntry shape but DON'T store in LRU.
|
|
354
|
-
// Callers construct Responses from this, but it won't be
|
|
355
|
-
// reused for future requests.
|
|
356
|
-
return {
|
|
357
|
-
body,
|
|
358
|
-
status: response.status,
|
|
359
|
-
headers,
|
|
360
|
-
createdAt: Date.now(),
|
|
361
|
-
vary: response.headers.get('Vary'),
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// Buffer the response body for caching.
|
|
366
|
-
const body = await response.arrayBuffer();
|
|
367
|
-
const headers: [string, string][] = [];
|
|
368
|
-
response.headers.forEach((value, key) => {
|
|
369
|
-
headers.push([key, value]);
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
const entry: CacheEntry = {
|
|
373
|
-
body,
|
|
374
|
-
status: response.status,
|
|
375
|
-
headers,
|
|
376
|
-
createdAt: Date.now(),
|
|
377
|
-
vary: response.headers.get('Vary'),
|
|
378
|
-
};
|
|
379
|
-
|
|
380
|
-
// Re-check the cache key now that we know the Vary headers.
|
|
381
|
-
// The initial key may not have included Vary'd header values
|
|
382
|
-
// if this was the first request to this path. Rebuild the key
|
|
383
|
-
// with the now-known Vary headers for correct LRU storage.
|
|
384
|
-
const updatedKey = buildCacheKey(req, isRscPayload);
|
|
385
|
-
if (updatedKey) {
|
|
386
|
-
lru.set(updatedKey, entry);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
return entry;
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
if (result === null) {
|
|
393
|
-
// Shouldn't happen — singleflight always returns a result.
|
|
394
|
-
// Defensive fallback: re-render.
|
|
395
|
-
return renderFn();
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
return responseFromEntry(result);
|
|
399
|
-
},
|
|
400
|
-
|
|
401
|
-
get size() {
|
|
402
|
-
return lru.size;
|
|
403
|
-
},
|
|
404
|
-
|
|
405
|
-
clear() {
|
|
406
|
-
lru.clear();
|
|
407
|
-
knownVaryHeaders.clear();
|
|
408
|
-
},
|
|
409
|
-
};
|
|
410
|
-
}
|