@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
|
@@ -14,11 +14,25 @@
|
|
|
14
14
|
|
|
15
15
|
import type { Plugin, ViteDevServer, DevEnvironment } from 'vite';
|
|
16
16
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
17
|
+
import type { TLSSocket } from 'node:tls';
|
|
18
|
+
import { existsSync, statSync } from 'node:fs';
|
|
17
19
|
import { join } from 'node:path';
|
|
18
|
-
import type { PluginContext } from '
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
21
|
+
import {
|
|
22
|
+
sendErrorToOverlay,
|
|
23
|
+
classifyErrorPhase,
|
|
24
|
+
fixErrorStacktrace,
|
|
25
|
+
parseFirstAppFrame,
|
|
26
|
+
type ErrorPhase,
|
|
27
|
+
} from '../dev-tools/overlay.js';
|
|
28
|
+
import { generateDevErrorPage } from '../dev-tools/error-page.js';
|
|
29
|
+
import { extractHmrOptions, type DevErrorHmrOptions } from '../dev-tools/dev-page-shell.js';
|
|
30
|
+
import { addVirtualModuleContext } from '../config-validation.js';
|
|
31
|
+
import { compressResponse } from '../server/compress.js';
|
|
32
|
+
import { isMetadataRouteServePath } from '../server/metadata-routes.js';
|
|
33
|
+
import { canonicalize } from '../server/canonicalize.js';
|
|
34
|
+
import { matchUrlParts } from '../server/tree-match.js';
|
|
35
|
+
import type { RouteTree } from '../routing/types.js';
|
|
22
36
|
|
|
23
37
|
// ─── Constants ────────────────────────────────────────────────────────────
|
|
24
38
|
|
|
@@ -72,20 +86,15 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
72
86
|
* filtered out explicitly and passed through to Vite.
|
|
73
87
|
*/
|
|
74
88
|
configureServer(server: ViteDevServer) {
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
//
|
|
89
|
+
// Ensure config files are in the watch set. Vite's watcher covers
|
|
90
|
+
// the project root, but `server.watcher.add()` is a no-op for files
|
|
91
|
+
// already watched, and ensures newly-created config files (e.g. from
|
|
92
|
+
// create-timber-app) are picked up. The actual restart logic is
|
|
93
|
+
// handled by Vite's built-in configFileDependencies check — see the
|
|
94
|
+
// configResolved hook in index.ts where we register the config path.
|
|
95
|
+
// See 21-dev-server.md §HMR Wiring.
|
|
78
96
|
const configPaths = CONFIG_FILE_NAMES.map((name) => join(ctx.root, name));
|
|
79
|
-
|
|
80
|
-
server.watcher.on('change', (filePath: string) => {
|
|
81
|
-
if (configPaths.includes(filePath)) {
|
|
82
|
-
server.restart();
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// Register Vite server for browser console warning forwarding.
|
|
87
|
-
// See 21-dev-server.md §Dev-Mode Warnings.
|
|
88
|
-
setViteServer(server);
|
|
97
|
+
server.watcher.add(configPaths);
|
|
89
98
|
|
|
90
99
|
// Listen for client-side errors forwarded from the browser.
|
|
91
100
|
// The browser entry sends 'timber:client-error' events via HMR
|
|
@@ -94,7 +103,22 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
94
103
|
listenForClientErrors(server, ctx.root);
|
|
95
104
|
|
|
96
105
|
// Pre-hook — registers middleware before Vite's internals
|
|
97
|
-
server.middlewares.use(createTimberMiddleware(server, ctx
|
|
106
|
+
server.middlewares.use(createTimberMiddleware(server, ctx));
|
|
107
|
+
|
|
108
|
+
// Wrap server.listen() to close the holding server immediately
|
|
109
|
+
// before Vite binds the port — no gap where nothing is listening.
|
|
110
|
+
// The holding server was started in rootSync's config() hook to
|
|
111
|
+
// serve a loading page during initialization.
|
|
112
|
+
// See design/21-dev-server.md §"Startup Holding Server", TIM-665.
|
|
113
|
+
if (ctx.holdingServer) {
|
|
114
|
+
const originalListen = server.listen.bind(server);
|
|
115
|
+
const holdingRef = ctx.holdingServer;
|
|
116
|
+
ctx.holdingServer = null;
|
|
117
|
+
server.listen = async (port?: number, isRestart?: boolean) => {
|
|
118
|
+
await holdingRef.close().catch(() => {});
|
|
119
|
+
return originalListen(port, isRestart);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
98
122
|
|
|
99
123
|
// Log startup timing summary. configureServer runs on all plugins
|
|
100
124
|
// before the server listens, so this captures the full cold start.
|
|
@@ -121,7 +145,12 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
121
145
|
* For non-route requests (assets, Vite internals, HMR), the middleware
|
|
122
146
|
* calls next() to let Vite handle them.
|
|
123
147
|
*/
|
|
124
|
-
function createTimberMiddleware(server: ViteDevServer,
|
|
148
|
+
function createTimberMiddleware(server: ViteDevServer, ctx: PluginContext) {
|
|
149
|
+
const projectRoot = ctx.root;
|
|
150
|
+
// Extract HMR connection options once so the error page can construct
|
|
151
|
+
// a correct WebSocket URL (TIM-789).
|
|
152
|
+
const hmrOptions = extractHmrOptions(server.config);
|
|
153
|
+
|
|
125
154
|
return async (req: IncomingMessage, res: ServerResponse, next: () => void): Promise<void> => {
|
|
126
155
|
const url = req.url;
|
|
127
156
|
if (!url) {
|
|
@@ -135,8 +164,27 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
135
164
|
return;
|
|
136
165
|
}
|
|
137
166
|
|
|
138
|
-
//
|
|
139
|
-
|
|
167
|
+
// Files that exist in public/ are always served by Vite's static
|
|
168
|
+
// middleware, regardless of extension. Without this, extensions like
|
|
169
|
+
// .ico, .txt, .xml, .html either get caught by the metadata route
|
|
170
|
+
// check or aren't in ASSET_EXTENSIONS, so they fall through to the
|
|
171
|
+
// app router where a dynamic segment like [artistSlug] 404s them.
|
|
172
|
+
if (isPublicFile(server, url)) {
|
|
173
|
+
next();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Pass through static asset requests — but not metadata routes like
|
|
178
|
+
// /favicon.ico that match asset extensions but are handled by timber,
|
|
179
|
+
// and not registered routes like app/feed.json/route.ts whose URL ends
|
|
180
|
+
// in an asset extension. Production serves these through the RSC
|
|
181
|
+
// handler, so letting them fall through to Vite would 404 in dev only
|
|
182
|
+
// (TIM-1038).
|
|
183
|
+
if (
|
|
184
|
+
isAssetRequest(url) &&
|
|
185
|
+
!isMetadataRouteServePath(url) &&
|
|
186
|
+
!isRouteOwnedAsset(ctx.routeTree, server, url)
|
|
187
|
+
) {
|
|
140
188
|
next();
|
|
141
189
|
return;
|
|
142
190
|
}
|
|
@@ -160,13 +208,50 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
160
208
|
handler = rscModule.default as (req: Request) => Promise<Response>;
|
|
161
209
|
|
|
162
210
|
// Wire pipeline errors into the browser error overlay.
|
|
163
|
-
//
|
|
164
|
-
|
|
165
|
-
|
|
211
|
+
// Set devPipelineErrorHandler directly on the pipeline config —
|
|
212
|
+
// no module-level singleton. The handler receives optional RSC debug
|
|
213
|
+
// component data (component names, environments, stack frames) from
|
|
214
|
+
// the Flight debug channel for render errors.
|
|
215
|
+
const config = rscModule.pipelineConfig as
|
|
216
|
+
| {
|
|
217
|
+
devPipelineErrorHandler?: (
|
|
218
|
+
error: Error,
|
|
219
|
+
phase: string,
|
|
220
|
+
debugComponents?: Array<{
|
|
221
|
+
name: string;
|
|
222
|
+
env: string | null;
|
|
223
|
+
stack: unknown[] | null;
|
|
224
|
+
}>
|
|
225
|
+
) => void;
|
|
226
|
+
devHmrOptions?: DevErrorHmrOptions;
|
|
227
|
+
}
|
|
228
|
+
| undefined;
|
|
229
|
+
if (config) {
|
|
230
|
+
config.devPipelineErrorHandler = (error, _phase, debugComponents) => {
|
|
231
|
+
sendErrorToOverlay(
|
|
232
|
+
server,
|
|
233
|
+
error,
|
|
234
|
+
classifyErrorPhase(error, projectRoot),
|
|
235
|
+
projectRoot,
|
|
236
|
+
debugComponents
|
|
237
|
+
);
|
|
238
|
+
};
|
|
239
|
+
// Plumb the resolved HMR options into the RSC environment. The RSC
|
|
240
|
+
// entry can't read the Vite server config (separate module graph),
|
|
241
|
+
// but its dev 404 page and fallback error page need the HMR endpoint
|
|
242
|
+
// (including Vite 8's required WS token) for auto-reload (TIM-1067).
|
|
243
|
+
config.devHmrOptions = hmrOptions;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Wire source-map handler so error pages show original positions.
|
|
247
|
+
// fixErrorStacktrace rewrites the error's stack trace in-place using
|
|
248
|
+
// the Vite dev server's module graph. See TIM-811.
|
|
249
|
+
const setSourceMap = rscModule.setDevSourceMapHandler as
|
|
250
|
+
| ((fn: (error: Error) => void) => void)
|
|
166
251
|
| undefined;
|
|
167
|
-
if (typeof
|
|
168
|
-
|
|
169
|
-
|
|
252
|
+
if (typeof setSourceMap === 'function') {
|
|
253
|
+
setSourceMap((error: Error) => {
|
|
254
|
+
fixErrorStacktrace(server, error);
|
|
170
255
|
});
|
|
171
256
|
}
|
|
172
257
|
} catch (error) {
|
|
@@ -174,9 +259,11 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
174
259
|
// Vite may already show its own overlay for these, but we still
|
|
175
260
|
// log to stderr with frame dimming for the terminal.
|
|
176
261
|
if (error instanceof Error) {
|
|
262
|
+
// Add context for virtual:timber-* module errors
|
|
263
|
+
addTimberContext(error);
|
|
177
264
|
sendErrorToOverlay(server, error, 'module-transform', projectRoot);
|
|
178
265
|
}
|
|
179
|
-
respond500(res, error);
|
|
266
|
+
respond500(res, error, 'module-transform', projectRoot, hmrOptions);
|
|
180
267
|
return;
|
|
181
268
|
}
|
|
182
269
|
|
|
@@ -191,8 +278,20 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
191
278
|
// Convert Node IncomingMessage → Web Request
|
|
192
279
|
const webRequest = toWebRequest(req);
|
|
193
280
|
|
|
194
|
-
//
|
|
195
|
-
|
|
281
|
+
// Check for a platform-specific request wrapper (e.g., Cloudflare
|
|
282
|
+
// dev bindings). The cloudflareDevBindings() plugin stores a wrapper
|
|
283
|
+
// function on the server instance using a well-known Symbol. The
|
|
284
|
+
// wrapper runs the handler inside an ALS context so platform APIs
|
|
285
|
+
// like getCloudflareBindings() work during dev.
|
|
286
|
+
// See design/35-cloudflare-primitives.md §"Dev Experience".
|
|
287
|
+
const wrapper = (server as any)[Symbol.for('timber:dev-request-wrapper')] as
|
|
288
|
+
| (<T>(fn: () => T) => T)
|
|
289
|
+
| undefined;
|
|
290
|
+
|
|
291
|
+
// Run the full pipeline (wrapped if a platform dev plugin is active)
|
|
292
|
+
const webResponse = wrapper
|
|
293
|
+
? await wrapper(() => handler(webRequest))
|
|
294
|
+
: await handler(webRequest);
|
|
196
295
|
|
|
197
296
|
// Compress the response if the client supports it.
|
|
198
297
|
// In dev mode, compression is always enabled for parity with production.
|
|
@@ -205,26 +304,71 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
205
304
|
// Pipeline error — classify the phase, send to overlay, respond 500.
|
|
206
305
|
// The dev server remains running for recovery on file fix + HMR.
|
|
207
306
|
if (error instanceof Error) {
|
|
208
|
-
|
|
209
|
-
|
|
307
|
+
// Unwrap SsrStreamError to show the real cause in the error overlay.
|
|
308
|
+
// SsrStreamError wraps the original RSC render error with a generic
|
|
309
|
+
// message; the developer needs to see the actual error (e.g.,
|
|
310
|
+
// "useSegmentParams is not a function"), not the wrapper.
|
|
311
|
+
const displayError =
|
|
312
|
+
error.name === 'SsrStreamError' && error.cause instanceof Error ? error.cause : error;
|
|
313
|
+
const phase = classifyErrorPhase(displayError, projectRoot);
|
|
314
|
+
sendErrorToOverlay(server, displayError, phase, projectRoot);
|
|
315
|
+
respond500(res, displayError, phase, projectRoot, hmrOptions);
|
|
210
316
|
} else {
|
|
211
317
|
process.stderr.write(`\x1b[31m[timber] Dev server error:\x1b[0m ${String(error)}\n`);
|
|
318
|
+
respond500(res, error, 'render', projectRoot, hmrOptions);
|
|
212
319
|
}
|
|
213
|
-
respond500(res, error);
|
|
214
320
|
}
|
|
215
321
|
};
|
|
216
322
|
}
|
|
217
323
|
|
|
218
324
|
/**
|
|
219
325
|
* Send a 500 response without crashing the dev server.
|
|
326
|
+
*
|
|
327
|
+
* In dev mode, renders a styled HTML error page with source context,
|
|
328
|
+
* classified stack trace, and auto-reload on HMR. Falls back to
|
|
329
|
+
* text/plain if the HTML generator fails (must never crash).
|
|
220
330
|
*/
|
|
221
|
-
function respond500(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
331
|
+
function respond500(
|
|
332
|
+
res: ServerResponse,
|
|
333
|
+
error: unknown,
|
|
334
|
+
phase: ErrorPhase,
|
|
335
|
+
projectRoot: string,
|
|
336
|
+
hmrOptions?: DevErrorHmrOptions
|
|
337
|
+
): void {
|
|
338
|
+
if (res.headersSent) return;
|
|
339
|
+
|
|
340
|
+
// Try to render the rich HTML error page
|
|
341
|
+
if (error instanceof Error) {
|
|
342
|
+
try {
|
|
343
|
+
const html = generateDevErrorPage(error, phase, projectRoot, hmrOptions);
|
|
344
|
+
res.statusCode = 500;
|
|
345
|
+
res.setHeader('content-type', 'text/html; charset=utf-8');
|
|
346
|
+
res.end(html);
|
|
347
|
+
return;
|
|
348
|
+
} catch (e) {
|
|
349
|
+
console.debug(
|
|
350
|
+
'[timber] dev error page generation failed, falling back to text/plain:',
|
|
351
|
+
e instanceof Error ? e.message : e
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Fallback: plain text (same as before)
|
|
357
|
+
res.statusCode = 500;
|
|
358
|
+
res.setHeader('content-type', 'text/plain');
|
|
359
|
+
res.end(
|
|
360
|
+
`[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Add timber-specific context to an error's message if it references
|
|
366
|
+
* internal virtual modules (virtual:timber-*). Mutates the error in place.
|
|
367
|
+
*/
|
|
368
|
+
function addTimberContext(error: Error): void {
|
|
369
|
+
const enriched = addVirtualModuleContext(error.message);
|
|
370
|
+
if (enriched !== error.message) {
|
|
371
|
+
error.message = enriched;
|
|
228
372
|
}
|
|
229
373
|
}
|
|
230
374
|
|
|
@@ -235,15 +379,30 @@ function respond500(res: ServerResponse, error: unknown): void {
|
|
|
235
379
|
*
|
|
236
380
|
* Constructs the full URL from the Host header and request URL,
|
|
237
381
|
* and forwards the method, headers, and body.
|
|
382
|
+
*
|
|
383
|
+
* The scheme comes from the socket's TLS state — with `server.https` the
|
|
384
|
+
* browser sends `Origin: https://host`, and a hardcoded `http://` would
|
|
385
|
+
* fail CSRF origin comparison on every POST. X-Forwarded-Proto is NOT
|
|
386
|
+
* consulted: dev connections are direct, so the header would be
|
|
387
|
+
* attacker-controlled. (TIM-1067, B32)
|
|
388
|
+
*
|
|
389
|
+
* Exported for tests.
|
|
238
390
|
*/
|
|
239
|
-
function toWebRequest(nodeReq: IncomingMessage): Request {
|
|
240
|
-
const protocol = 'http';
|
|
241
|
-
|
|
391
|
+
export function toWebRequest(nodeReq: IncomingMessage): Request {
|
|
392
|
+
const protocol = (nodeReq.socket as TLSSocket | undefined)?.encrypted ? 'https' : 'http';
|
|
393
|
+
// Under HTTP/2 there is no Host header — the authority lives in the
|
|
394
|
+
// `:authority` pseudo-header.
|
|
395
|
+
const host =
|
|
396
|
+
nodeReq.headers.host ?? (nodeReq.headers[':authority'] as string | undefined) ?? 'localhost';
|
|
242
397
|
const url = `${protocol}://${host}${nodeReq.url}`;
|
|
243
398
|
|
|
244
399
|
const headers = new Headers();
|
|
245
400
|
for (const [key, value] of Object.entries(nodeReq.headers)) {
|
|
246
401
|
if (value === undefined) continue;
|
|
402
|
+
// HTTP/2 pseudo-headers (:method, :path, :authority, :scheme) are not
|
|
403
|
+
// valid Headers names — Headers.set() throws on them. They're already
|
|
404
|
+
// reflected in the request URL/method above.
|
|
405
|
+
if (key.startsWith(':')) continue;
|
|
247
406
|
if (Array.isArray(value)) {
|
|
248
407
|
for (const v of value) {
|
|
249
408
|
headers.append(key, v);
|
|
@@ -252,6 +411,11 @@ function toWebRequest(nodeReq: IncomingMessage): Request {
|
|
|
252
411
|
headers.set(key, value);
|
|
253
412
|
}
|
|
254
413
|
}
|
|
414
|
+
// HTTP/2 requests carry the authority in `:authority`, not Host — but
|
|
415
|
+
// downstream consumers (CSRF origin validation) read the Host header.
|
|
416
|
+
if (!headers.has('host')) {
|
|
417
|
+
headers.set('host', host);
|
|
418
|
+
}
|
|
255
419
|
|
|
256
420
|
const method = nodeReq.method ?? 'GET';
|
|
257
421
|
const hasBody = method !== 'GET' && method !== 'HEAD';
|
|
@@ -317,6 +481,17 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
317
481
|
nodeRes.flushHeaders();
|
|
318
482
|
|
|
319
483
|
const reader = webResponse.body.getReader();
|
|
484
|
+
|
|
485
|
+
// Cancel the reader when the client disconnects. This causes any pending
|
|
486
|
+
// reader.read() to reject, breaking the pump loop. Critical for SSE and
|
|
487
|
+
// other infinite streams — without this, disconnected clients leak readers.
|
|
488
|
+
let clientDisconnected = false;
|
|
489
|
+
const onClose = () => {
|
|
490
|
+
clientDisconnected = true;
|
|
491
|
+
reader.cancel('Client disconnected').catch(() => {});
|
|
492
|
+
};
|
|
493
|
+
nodeRes.on('close', onClose);
|
|
494
|
+
|
|
320
495
|
try {
|
|
321
496
|
while (true) {
|
|
322
497
|
const { done, value } = await reader.read();
|
|
@@ -325,9 +500,18 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
325
500
|
// don't need back-pressure here — just keep pushing chunks.
|
|
326
501
|
nodeRes.write(value);
|
|
327
502
|
}
|
|
503
|
+
} catch (err) {
|
|
504
|
+
// reader.cancel() from the close handler causes read() to reject.
|
|
505
|
+
// This is expected on client disconnect — not an error.
|
|
506
|
+
if (!clientDisconnected) {
|
|
507
|
+
throw err;
|
|
508
|
+
}
|
|
328
509
|
} finally {
|
|
510
|
+
nodeRes.off('close', onClose);
|
|
329
511
|
reader.releaseLock();
|
|
330
|
-
nodeRes.
|
|
512
|
+
if (!nodeRes.writableEnded) {
|
|
513
|
+
nodeRes.end();
|
|
514
|
+
}
|
|
331
515
|
}
|
|
332
516
|
}
|
|
333
517
|
|
|
@@ -347,6 +531,69 @@ function isAssetRequest(url: string): boolean {
|
|
|
347
531
|
return ASSET_EXTENSIONS.test(url);
|
|
348
532
|
}
|
|
349
533
|
|
|
534
|
+
/**
|
|
535
|
+
* Check if a URL maps to a real file in the project's public/ directory.
|
|
536
|
+
* Vite serves public/ files as static assets — if a file exists there it
|
|
537
|
+
* must be passed through to Vite regardless of extension.
|
|
538
|
+
*/
|
|
539
|
+
function isPublicFile(server: ViteDevServer, url: string): boolean {
|
|
540
|
+
const { publicDir } = server.config;
|
|
541
|
+
if (!publicDir) return false;
|
|
542
|
+
const pathname = url.split('?')[0];
|
|
543
|
+
const relativePath = pathname.startsWith('/') ? pathname.slice(1) : pathname;
|
|
544
|
+
if (!relativePath) return false;
|
|
545
|
+
const fullPath = join(publicDir, relativePath);
|
|
546
|
+
try {
|
|
547
|
+
return statSync(fullPath).isFile();
|
|
548
|
+
} catch {
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* Check whether an asset-extension URL belongs to a scanned route rather
|
|
555
|
+
* than a static file.
|
|
556
|
+
*
|
|
557
|
+
* Route handlers may live at paths ending in asset-like extensions
|
|
558
|
+
* (app/feed.json/route.ts → /feed.json), which the asset bypass would
|
|
559
|
+
* otherwise hand to Vite — 404ing in dev while working in production.
|
|
560
|
+
* Uses the same canonicalization and tree walker as the runtime matcher
|
|
561
|
+
* so dev classification agrees with what the pipeline would match.
|
|
562
|
+
*
|
|
563
|
+
* A file that actually exists on disk wins over the route match: the
|
|
564
|
+
* production server serves public/ statics before the RSC handler (see
|
|
565
|
+
* adapters/nitro.ts), and Vite serves root-relative source files (e.g.
|
|
566
|
+
* /app/global.css) in dev. Without this, a broad catch-all route like
|
|
567
|
+
* app/[...slug] would shadow every static asset. Joining the canonical
|
|
568
|
+
* pathname is traversal-safe — canonicalize() resolves `..` segments and
|
|
569
|
+
* rejects root escapes and encoded separators.
|
|
570
|
+
*
|
|
571
|
+
* Reads ctx.routeTree per request — the routing plugin rescans it on
|
|
572
|
+
* file add/unlink/change, so newly created routes are picked up live.
|
|
573
|
+
*/
|
|
574
|
+
function isRouteOwnedAsset(
|
|
575
|
+
routeTree: RouteTree | null,
|
|
576
|
+
server: ViteDevServer,
|
|
577
|
+
url: string
|
|
578
|
+
): boolean {
|
|
579
|
+
if (!routeTree) return false;
|
|
580
|
+
const rawPathname = url.split('?')[0];
|
|
581
|
+
const result = canonicalize(rawPathname);
|
|
582
|
+
// Malformed URLs can't match a route — let Vite handle them as before.
|
|
583
|
+
if (!result.ok) return false;
|
|
584
|
+
const parts = result.pathname === '/' ? [] : result.pathname.slice(1).split('/');
|
|
585
|
+
if (matchUrlParts(routeTree.root, parts) === null) return false;
|
|
586
|
+
|
|
587
|
+
// Real static files win over the route match (dev/prod parity: the
|
|
588
|
+
// production server tries public/ before the RSC handler).
|
|
589
|
+
const relativePath = result.pathname.slice(1);
|
|
590
|
+
const { publicDir, root } = server.config;
|
|
591
|
+
if (publicDir && existsSync(join(publicDir, relativePath))) return false;
|
|
592
|
+
if (existsSync(join(root, relativePath))) return false;
|
|
593
|
+
|
|
594
|
+
return true;
|
|
595
|
+
}
|
|
596
|
+
|
|
350
597
|
// ─── Client Error Listener ─────────────────────────────────────────────
|
|
351
598
|
|
|
352
599
|
interface ClientErrorPayload {
|
|
@@ -392,8 +639,8 @@ function listenForClientErrors(server: ViteDevServer, projectRoot: string): void
|
|
|
392
639
|
loc: loc ? { file: loc.file, line: loc.line, column: loc.column } : undefined,
|
|
393
640
|
},
|
|
394
641
|
});
|
|
395
|
-
} catch {
|
|
396
|
-
|
|
642
|
+
} catch (e) {
|
|
643
|
+
console.debug('[timber] overlay send failed:', e instanceof Error ? e.message : e);
|
|
397
644
|
}
|
|
398
645
|
});
|
|
399
646
|
}
|
package/src/plugins/entries.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { Plugin } from 'vite';
|
|
|
15
15
|
import { resolve, dirname } from 'node:path';
|
|
16
16
|
import { fileURLToPath } from 'node:url';
|
|
17
17
|
import { existsSync } from 'node:fs';
|
|
18
|
-
import type { PluginContext } from '
|
|
18
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
19
19
|
|
|
20
20
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
21
|
|
|
@@ -34,6 +34,7 @@ const VIRTUAL_IDS = {
|
|
|
34
34
|
browserEntry: 'virtual:timber-browser-entry',
|
|
35
35
|
config: 'virtual:timber-config',
|
|
36
36
|
instrumentation: 'virtual:timber-instrumentation',
|
|
37
|
+
cacheHandler: 'virtual:timber-cache-handler',
|
|
37
38
|
} as const;
|
|
38
39
|
|
|
39
40
|
/**
|
|
@@ -48,7 +49,7 @@ const VIRTUAL_IDS = {
|
|
|
48
49
|
const ENTRY_FILE_MAP: Record<string, string> = {
|
|
49
50
|
[VIRTUAL_IDS.rscEntry]: resolve(SRC_DIR, 'server', 'rsc-entry', 'index.ts'),
|
|
50
51
|
[VIRTUAL_IDS.ssrEntry]: resolve(SRC_DIR, 'server', 'ssr-entry.ts'),
|
|
51
|
-
[VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry.ts'),
|
|
52
|
+
[VIRTUAL_IDS.browserEntry]: resolve(SRC_DIR, 'client', 'browser-entry', 'index.ts'),
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
/** The \0-prefixed resolved ID for virtual:timber-config */
|
|
@@ -57,6 +58,9 @@ const RESOLVED_CONFIG_ID = `\0${VIRTUAL_IDS.config}`;
|
|
|
57
58
|
/** The \0-prefixed resolved ID for virtual:timber-instrumentation */
|
|
58
59
|
const RESOLVED_INSTRUMENTATION_ID = `\0${VIRTUAL_IDS.instrumentation}`;
|
|
59
60
|
|
|
61
|
+
/** The \0-prefixed resolved ID for virtual:timber-cache-handler */
|
|
62
|
+
const RESOLVED_CACHE_HANDLER_ID = `\0${VIRTUAL_IDS.cacheHandler}`;
|
|
63
|
+
|
|
60
64
|
/**
|
|
61
65
|
* Strip the \0 prefix from a module ID.
|
|
62
66
|
*
|
|
@@ -94,12 +98,39 @@ function stripRootPrefix(id: string, root: string): string {
|
|
|
94
98
|
*
|
|
95
99
|
* Serializes output mode and feature flags for runtime consumption.
|
|
96
100
|
*/
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Extract the JSON-serializable subset of `forms` config.
|
|
103
|
+
*
|
|
104
|
+
* Drops function-valued `stripSensitiveFields` with a build-time warning —
|
|
105
|
+
* functions cannot cross the JSON boundary to the runtime, so users must
|
|
106
|
+
* configure function predicates per-action via `createActionClient` instead.
|
|
107
|
+
*/
|
|
108
|
+
function serializeFormsConfig(
|
|
109
|
+
forms: { stripSensitiveFields?: unknown } | undefined
|
|
110
|
+
): { stripSensitiveFields?: boolean | readonly string[] } | undefined {
|
|
111
|
+
if (!forms) return undefined;
|
|
112
|
+
const opt = forms.stripSensitiveFields;
|
|
113
|
+
if (opt === undefined) return {};
|
|
114
|
+
if (typeof opt === 'boolean') return { stripSensitiveFields: opt };
|
|
115
|
+
if (Array.isArray(opt)) {
|
|
116
|
+
// Coerce to a string array and drop any non-string entries.
|
|
117
|
+
const names = opt.filter((v): v is string => typeof v === 'string');
|
|
118
|
+
return { stripSensitiveFields: names };
|
|
119
|
+
}
|
|
120
|
+
if (typeof opt === 'function') {
|
|
121
|
+
console.warn(
|
|
122
|
+
'[timber] forms.stripSensitiveFields was set to a function in timber.config.ts — ' +
|
|
123
|
+
'this is not supported at the global level (functions cannot be serialized ' +
|
|
124
|
+
'into the runtime config). Use a per-action override via ' +
|
|
125
|
+
'`createActionClient({ stripSensitiveFields: (name) => ... })` instead. ' +
|
|
126
|
+
'The built-in deny-list will be used globally.'
|
|
127
|
+
);
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
return {};
|
|
131
|
+
}
|
|
102
132
|
|
|
133
|
+
function generateConfigModule(ctx: PluginContext): string {
|
|
103
134
|
const runtimeConfig = {
|
|
104
135
|
output: ctx.config.output ?? 'server',
|
|
105
136
|
csrf: ctx.config.csrf ?? true,
|
|
@@ -108,10 +139,28 @@ function generateConfigModule(ctx: PluginContext): string {
|
|
|
108
139
|
dev: ctx.dev ?? false,
|
|
109
140
|
slowPhaseMs: ctx.config.dev?.slowPhaseMs ?? 200,
|
|
110
141
|
slowRequestMs: ctx.config.slowRequestMs ?? 3000,
|
|
111
|
-
cookieSecrets,
|
|
112
142
|
topLoader: ctx.config.topLoader,
|
|
113
143
|
debug: ctx.config.debug ?? false,
|
|
114
144
|
serverTiming: ctx.config.serverTiming,
|
|
145
|
+
renderTimeoutMs: ctx.config.renderTimeoutMs ?? 30_000,
|
|
146
|
+
// Auto-generated sitemap config — opt-in via timber.config.ts.
|
|
147
|
+
// See design/16-metadata.md §"Auto-generated Sitemap"
|
|
148
|
+
sitemap: ctx.config.sitemap,
|
|
149
|
+
// Forms config — only the serializable subset. `stripSensitiveFields`
|
|
150
|
+
// accepts boolean | string[] at the global level. Functions must be
|
|
151
|
+
// configured per-action via `createActionClient({ stripSensitiveFields })`
|
|
152
|
+
// because JSON.stringify would silently drop them here. See TIM-816.
|
|
153
|
+
forms: serializeFormsConfig(ctx.config.forms),
|
|
154
|
+
// Per-build deployment ID for version skew detection (TIM-446).
|
|
155
|
+
// Null in dev mode — HMR handles code updates without full reloads.
|
|
156
|
+
deploymentId: ctx.deploymentId ?? null,
|
|
157
|
+
// Browser log forwarding threshold — used by buildClientScripts to
|
|
158
|
+
// decide whether /@vite/client is needed when clientJavascript is
|
|
159
|
+
// disabled. See TIM-1152.
|
|
160
|
+
devBrowserLogs: ctx.config.devBrowserLogs,
|
|
161
|
+
// Note: project root is NOT included here — it was leaking server
|
|
162
|
+
// filesystem paths to client bundles (TIM-787). Dev error pages get
|
|
163
|
+
// the root through the dev server, not the runtime config.
|
|
115
164
|
};
|
|
116
165
|
|
|
117
166
|
return [
|
|
@@ -177,6 +226,67 @@ export function generateInstrumentationModule(instrumentationPath: string | null
|
|
|
177
226
|
].join('\n');
|
|
178
227
|
}
|
|
179
228
|
|
|
229
|
+
/**
|
|
230
|
+
* Detect the user's timber.config file at the project root.
|
|
231
|
+
* Returns the absolute path or null if not found.
|
|
232
|
+
*/
|
|
233
|
+
function detectConfigFile(root: string): string | null {
|
|
234
|
+
const names = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
|
|
235
|
+
for (const name of names) {
|
|
236
|
+
const candidate = resolve(root, name);
|
|
237
|
+
if (existsSync(candidate)) return candidate;
|
|
238
|
+
}
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Generate the virtual:timber-cache-handler module source.
|
|
244
|
+
*
|
|
245
|
+
* When the user's config has a cacheHandler, generates a module that
|
|
246
|
+
* dynamically imports the config file and extracts the cacheHandler.
|
|
247
|
+
* The cacheHandler is a class instance (e.g. RedisCacheHandler) that
|
|
248
|
+
* cannot be JSON-serialized into virtual:timber-config, so it must
|
|
249
|
+
* be loaded at runtime via dynamic import. See TIM-599.
|
|
250
|
+
*/
|
|
251
|
+
function generateCacheHandlerModule(
|
|
252
|
+
configPath: string | null,
|
|
253
|
+
hasCacheHandler: boolean,
|
|
254
|
+
hasCdnPurge: boolean
|
|
255
|
+
): string {
|
|
256
|
+
if (configPath && (hasCacheHandler || hasCdnPurge)) {
|
|
257
|
+
return [
|
|
258
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
259
|
+
'// Generated by timber-entries plugin.',
|
|
260
|
+
'',
|
|
261
|
+
`export default async function loadCacheHandler() {`,
|
|
262
|
+
` const mod = await import(${JSON.stringify(configPath)});`,
|
|
263
|
+
` const config = mod.default ?? mod;`,
|
|
264
|
+
` return config.cacheHandler ?? null;`,
|
|
265
|
+
`}`,
|
|
266
|
+
'',
|
|
267
|
+
`export async function loadCdnPurgeHandler() {`,
|
|
268
|
+
` const mod = await import(${JSON.stringify(configPath)});`,
|
|
269
|
+
` const config = mod.default ?? mod;`,
|
|
270
|
+
` return config.cdnPurge ?? null;`,
|
|
271
|
+
`}`,
|
|
272
|
+
].join('\n');
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return [
|
|
276
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
277
|
+
'// Generated by timber-entries plugin.',
|
|
278
|
+
'// No cacheHandler or cdnPurge configured in timber.config.',
|
|
279
|
+
'',
|
|
280
|
+
`export default async function loadCacheHandler() {`,
|
|
281
|
+
` return null;`,
|
|
282
|
+
`}`,
|
|
283
|
+
'',
|
|
284
|
+
`export async function loadCdnPurgeHandler() {`,
|
|
285
|
+
` return null;`,
|
|
286
|
+
`}`,
|
|
287
|
+
].join('\n');
|
|
288
|
+
}
|
|
289
|
+
|
|
180
290
|
/**
|
|
181
291
|
* Create the timber-entries Vite plugin.
|
|
182
292
|
*
|
|
@@ -219,6 +329,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
219
329
|
return RESOLVED_INSTRUMENTATION_ID;
|
|
220
330
|
}
|
|
221
331
|
|
|
332
|
+
// Check cache handler virtual module
|
|
333
|
+
if (cleanId === VIRTUAL_IDS.cacheHandler) {
|
|
334
|
+
return RESOLVED_CACHE_HANDLER_ID;
|
|
335
|
+
}
|
|
336
|
+
|
|
222
337
|
return null;
|
|
223
338
|
},
|
|
224
339
|
|
|
@@ -236,6 +351,12 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
236
351
|
const instrumentationPath = detectInstrumentationFile(ctx.root);
|
|
237
352
|
return generateInstrumentationModule(instrumentationPath);
|
|
238
353
|
}
|
|
354
|
+
if (id === RESOLVED_CACHE_HANDLER_ID) {
|
|
355
|
+
const configPath = detectConfigFile(ctx.root);
|
|
356
|
+
const hasCacheHandler = ctx.config.cacheHandler != null;
|
|
357
|
+
const hasCdnPurge = ctx.config.cdnPurge != null;
|
|
358
|
+
return generateCacheHandlerModule(configPath, hasCacheHandler, hasCdnPurge);
|
|
359
|
+
}
|
|
239
360
|
return null;
|
|
240
361
|
},
|
|
241
362
|
|