@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
|
@@ -15,10 +15,22 @@
|
|
|
15
15
|
import type { Plugin, ViteDevServer, DevEnvironment } from 'vite';
|
|
16
16
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
17
17
|
import { join } from 'node:path';
|
|
18
|
-
import type { PluginContext } from '
|
|
19
|
-
import { setViteServer } from '
|
|
20
|
-
import {
|
|
21
|
-
|
|
18
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
19
|
+
import { setViteServer } from '../server/dev-warnings.js';
|
|
20
|
+
import {
|
|
21
|
+
sendErrorToOverlay,
|
|
22
|
+
classifyErrorPhase,
|
|
23
|
+
fixErrorStacktrace,
|
|
24
|
+
parseFirstAppFrame,
|
|
25
|
+
type ErrorPhase,
|
|
26
|
+
} from './dev-error-overlay.js';
|
|
27
|
+
import {
|
|
28
|
+
generateDevErrorPage,
|
|
29
|
+
extractHmrOptions,
|
|
30
|
+
type DevErrorHmrOptions,
|
|
31
|
+
} from './dev-error-page.js';
|
|
32
|
+
import { addVirtualModuleContext } from '../config-validation.js';
|
|
33
|
+
import { compressResponse } from '../server/compress.js';
|
|
22
34
|
|
|
23
35
|
// ─── Constants ────────────────────────────────────────────────────────────
|
|
24
36
|
|
|
@@ -96,6 +108,21 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
96
108
|
// Pre-hook — registers middleware before Vite's internals
|
|
97
109
|
server.middlewares.use(createTimberMiddleware(server, ctx.root));
|
|
98
110
|
|
|
111
|
+
// Wrap server.listen() to close the holding server immediately
|
|
112
|
+
// before Vite binds the port — no gap where nothing is listening.
|
|
113
|
+
// The holding server was started in rootSync's config() hook to
|
|
114
|
+
// serve a loading page during initialization.
|
|
115
|
+
// See design/21-dev-server.md §"Startup Holding Server", TIM-665.
|
|
116
|
+
if (ctx.holdingServer) {
|
|
117
|
+
const originalListen = server.listen.bind(server);
|
|
118
|
+
const holdingRef = ctx.holdingServer;
|
|
119
|
+
ctx.holdingServer = null;
|
|
120
|
+
server.listen = async (port?: number, isRestart?: boolean) => {
|
|
121
|
+
await holdingRef.close().catch(() => {});
|
|
122
|
+
return originalListen(port, isRestart);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
99
126
|
// Log startup timing summary. configureServer runs on all plugins
|
|
100
127
|
// before the server listens, so this captures the full cold start.
|
|
101
128
|
ctx.timer.end('dev-server-setup');
|
|
@@ -122,6 +149,10 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
122
149
|
* calls next() to let Vite handle them.
|
|
123
150
|
*/
|
|
124
151
|
function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
152
|
+
// Extract HMR connection options once so the error page can construct
|
|
153
|
+
// a correct WebSocket URL (TIM-789).
|
|
154
|
+
const hmrOptions = extractHmrOptions(server.config);
|
|
155
|
+
|
|
125
156
|
return async (req: IncomingMessage, res: ServerResponse, next: () => void): Promise<void> => {
|
|
126
157
|
const url = req.url;
|
|
127
158
|
if (!url) {
|
|
@@ -161,12 +192,38 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
161
192
|
|
|
162
193
|
// Wire pipeline errors into the browser error overlay.
|
|
163
194
|
// setDevPipelineErrorHandler is only defined in dev (rsc-entry.ts exports it).
|
|
195
|
+
// The handler receives optional RSC debug component data (component names,
|
|
196
|
+
// environments, stack frames) from the Flight debug channel for render errors.
|
|
164
197
|
const setHandler = rscModule.setDevPipelineErrorHandler as
|
|
165
|
-
| ((
|
|
198
|
+
| ((
|
|
199
|
+
fn: (
|
|
200
|
+
error: Error,
|
|
201
|
+
phase: string,
|
|
202
|
+
debugComponents?: Array<{ name: string; env: string | null; stack: unknown[] | null }>
|
|
203
|
+
) => void
|
|
204
|
+
) => void)
|
|
166
205
|
| undefined;
|
|
167
206
|
if (typeof setHandler === 'function') {
|
|
168
|
-
setHandler((error) => {
|
|
169
|
-
sendErrorToOverlay(
|
|
207
|
+
setHandler((error, _phase, debugComponents) => {
|
|
208
|
+
sendErrorToOverlay(
|
|
209
|
+
server,
|
|
210
|
+
error,
|
|
211
|
+
classifyErrorPhase(error, projectRoot),
|
|
212
|
+
projectRoot,
|
|
213
|
+
debugComponents
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Wire source-map handler so error pages show original positions.
|
|
219
|
+
// fixErrorStacktrace rewrites the error's stack trace in-place using
|
|
220
|
+
// the Vite dev server's module graph. See TIM-811.
|
|
221
|
+
const setSourceMap = rscModule.setDevSourceMapHandler as
|
|
222
|
+
| ((fn: (error: Error) => void) => void)
|
|
223
|
+
| undefined;
|
|
224
|
+
if (typeof setSourceMap === 'function') {
|
|
225
|
+
setSourceMap((error: Error) => {
|
|
226
|
+
fixErrorStacktrace(server, error);
|
|
170
227
|
});
|
|
171
228
|
}
|
|
172
229
|
} catch (error) {
|
|
@@ -174,9 +231,11 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
174
231
|
// Vite may already show its own overlay for these, but we still
|
|
175
232
|
// log to stderr with frame dimming for the terminal.
|
|
176
233
|
if (error instanceof Error) {
|
|
234
|
+
// Add context for virtual:timber-* module errors
|
|
235
|
+
addTimberContext(error);
|
|
177
236
|
sendErrorToOverlay(server, error, 'module-transform', projectRoot);
|
|
178
237
|
}
|
|
179
|
-
respond500(res, error);
|
|
238
|
+
respond500(res, error, 'module-transform', projectRoot, hmrOptions);
|
|
180
239
|
return;
|
|
181
240
|
}
|
|
182
241
|
|
|
@@ -191,8 +250,20 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
191
250
|
// Convert Node IncomingMessage → Web Request
|
|
192
251
|
const webRequest = toWebRequest(req);
|
|
193
252
|
|
|
194
|
-
//
|
|
195
|
-
|
|
253
|
+
// Check for a platform-specific request wrapper (e.g., Cloudflare
|
|
254
|
+
// dev bindings). The cloudflareDevBindings() plugin stores a wrapper
|
|
255
|
+
// function on the server instance using a well-known Symbol. The
|
|
256
|
+
// wrapper runs the handler inside an ALS context so platform APIs
|
|
257
|
+
// like getCloudflareBindings() work during dev.
|
|
258
|
+
// See design/35-cloudflare-primitives.md §"Dev Experience".
|
|
259
|
+
const wrapper = (server as any)[Symbol.for('timber:dev-request-wrapper')] as
|
|
260
|
+
| (<T>(fn: () => T) => T)
|
|
261
|
+
| undefined;
|
|
262
|
+
|
|
263
|
+
// Run the full pipeline (wrapped if a platform dev plugin is active)
|
|
264
|
+
const webResponse = wrapper
|
|
265
|
+
? await wrapper(() => handler(webRequest))
|
|
266
|
+
: await handler(webRequest);
|
|
196
267
|
|
|
197
268
|
// Compress the response if the client supports it.
|
|
198
269
|
// In dev mode, compression is always enabled for parity with production.
|
|
@@ -207,24 +278,60 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
207
278
|
if (error instanceof Error) {
|
|
208
279
|
const phase = classifyErrorPhase(error, projectRoot);
|
|
209
280
|
sendErrorToOverlay(server, error, phase, projectRoot);
|
|
281
|
+
respond500(res, error, phase, projectRoot, hmrOptions);
|
|
210
282
|
} else {
|
|
211
283
|
process.stderr.write(`\x1b[31m[timber] Dev server error:\x1b[0m ${String(error)}\n`);
|
|
284
|
+
respond500(res, error, 'render', projectRoot, hmrOptions);
|
|
212
285
|
}
|
|
213
|
-
respond500(res, error);
|
|
214
286
|
}
|
|
215
287
|
};
|
|
216
288
|
}
|
|
217
289
|
|
|
218
290
|
/**
|
|
219
291
|
* Send a 500 response without crashing the dev server.
|
|
292
|
+
*
|
|
293
|
+
* In dev mode, renders a styled HTML error page with source context,
|
|
294
|
+
* classified stack trace, and auto-reload on HMR. Falls back to
|
|
295
|
+
* text/plain if the HTML generator fails (must never crash).
|
|
220
296
|
*/
|
|
221
|
-
function respond500(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
297
|
+
function respond500(
|
|
298
|
+
res: ServerResponse,
|
|
299
|
+
error: unknown,
|
|
300
|
+
phase: ErrorPhase,
|
|
301
|
+
projectRoot: string,
|
|
302
|
+
hmrOptions?: DevErrorHmrOptions
|
|
303
|
+
): void {
|
|
304
|
+
if (res.headersSent) return;
|
|
305
|
+
|
|
306
|
+
// Try to render the rich HTML error page
|
|
307
|
+
if (error instanceof Error) {
|
|
308
|
+
try {
|
|
309
|
+
const html = generateDevErrorPage(error, phase, projectRoot, hmrOptions);
|
|
310
|
+
res.statusCode = 500;
|
|
311
|
+
res.setHeader('content-type', 'text/html; charset=utf-8');
|
|
312
|
+
res.end(html);
|
|
313
|
+
return;
|
|
314
|
+
} catch {
|
|
315
|
+
// Fall through to text/plain if the HTML generator fails
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Fallback: plain text (same as before)
|
|
320
|
+
res.statusCode = 500;
|
|
321
|
+
res.setHeader('content-type', 'text/plain');
|
|
322
|
+
res.end(
|
|
323
|
+
`[timber] Internal server error\n\n${error instanceof Error ? (error.stack ?? error.message) : String(error)}`
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Add timber-specific context to an error's message if it references
|
|
329
|
+
* internal virtual modules (virtual:timber-*). Mutates the error in place.
|
|
330
|
+
*/
|
|
331
|
+
function addTimberContext(error: Error): void {
|
|
332
|
+
const enriched = addVirtualModuleContext(error.message);
|
|
333
|
+
if (enriched !== error.message) {
|
|
334
|
+
error.message = enriched;
|
|
228
335
|
}
|
|
229
336
|
}
|
|
230
337
|
|
|
@@ -317,6 +424,17 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
317
424
|
nodeRes.flushHeaders();
|
|
318
425
|
|
|
319
426
|
const reader = webResponse.body.getReader();
|
|
427
|
+
|
|
428
|
+
// Cancel the reader when the client disconnects. This causes any pending
|
|
429
|
+
// reader.read() to reject, breaking the pump loop. Critical for SSE and
|
|
430
|
+
// other infinite streams — without this, disconnected clients leak readers.
|
|
431
|
+
let clientDisconnected = false;
|
|
432
|
+
const onClose = () => {
|
|
433
|
+
clientDisconnected = true;
|
|
434
|
+
reader.cancel('Client disconnected').catch(() => {});
|
|
435
|
+
};
|
|
436
|
+
nodeRes.on('close', onClose);
|
|
437
|
+
|
|
320
438
|
try {
|
|
321
439
|
while (true) {
|
|
322
440
|
const { done, value } = await reader.read();
|
|
@@ -325,9 +443,18 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
325
443
|
// don't need back-pressure here — just keep pushing chunks.
|
|
326
444
|
nodeRes.write(value);
|
|
327
445
|
}
|
|
446
|
+
} catch (err) {
|
|
447
|
+
// reader.cancel() from the close handler causes read() to reject.
|
|
448
|
+
// This is expected on client disconnect — not an error.
|
|
449
|
+
if (!clientDisconnected) {
|
|
450
|
+
throw err;
|
|
451
|
+
}
|
|
328
452
|
} finally {
|
|
453
|
+
nodeRes.off('close', onClose);
|
|
329
454
|
reader.releaseLock();
|
|
330
|
-
nodeRes.
|
|
455
|
+
if (!nodeRes.writableEnded) {
|
|
456
|
+
nodeRes.end();
|
|
457
|
+
}
|
|
331
458
|
}
|
|
332
459
|
}
|
|
333
460
|
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal error formatting — boxed, color-coded error output for dev mode.
|
|
3
|
+
*
|
|
4
|
+
* Produces a visually scannable error block with:
|
|
5
|
+
* - Unicode box-drawing border around the error
|
|
6
|
+
* - Phase badge and error message
|
|
7
|
+
* - First app frame highlighted as the primary action item
|
|
8
|
+
* - OSC 8 clickable file:line links (VSCode terminal, iTerm2, etc.)
|
|
9
|
+
* - Internal/framework frames collapsed with a count
|
|
10
|
+
* - Component stack (for React render errors)
|
|
11
|
+
*
|
|
12
|
+
* Dev-only: this module is only imported by dev-error-overlay.ts.
|
|
13
|
+
*
|
|
14
|
+
* Design doc: 21-dev-server.md §"Error Overlay"
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { pathToFileURL } from 'node:url';
|
|
18
|
+
import {
|
|
19
|
+
classifyFrame,
|
|
20
|
+
extractComponentStack,
|
|
21
|
+
parseFirstAppFrame,
|
|
22
|
+
PHASE_LABELS,
|
|
23
|
+
type ErrorPhase,
|
|
24
|
+
type FrameType,
|
|
25
|
+
} from './dev-error-overlay.js';
|
|
26
|
+
|
|
27
|
+
// ─── ANSI Codes ─────────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
const RED = '\x1b[31m';
|
|
30
|
+
const CYAN = '\x1b[36m';
|
|
31
|
+
const DIM = '\x1b[2m';
|
|
32
|
+
const RESET = '\x1b[0m';
|
|
33
|
+
const BOLD = '\x1b[1m';
|
|
34
|
+
const UNDERLINE = '\x1b[4m';
|
|
35
|
+
|
|
36
|
+
// ─── OSC 8 Hyperlinks ──────────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Wrap text in an OSC 8 hyperlink escape sequence.
|
|
40
|
+
*
|
|
41
|
+
* Terminals that support OSC 8 (VSCode, iTerm2, Windows Terminal, etc.)
|
|
42
|
+
* render this as a clickable link. Others ignore the escape sequences
|
|
43
|
+
* and show the text normally.
|
|
44
|
+
*
|
|
45
|
+
* Format: \x1b]8;;URL\x07TEXT\x1b]8;;\x07
|
|
46
|
+
*/
|
|
47
|
+
function hyperlink(text: string, url: string): string {
|
|
48
|
+
return `\x1b]8;;${url}\x07${text}\x1b]8;;\x07`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Format a file:line:col reference as a clickable terminal link.
|
|
53
|
+
*
|
|
54
|
+
* Uses file:// URLs so terminals open the file in the configured editor.
|
|
55
|
+
* The link text is styled with cyan + underline for visibility.
|
|
56
|
+
*/
|
|
57
|
+
function fileLink(filePath: string, line?: number, col?: number): string {
|
|
58
|
+
const display = line ? `${filePath}:${line}${col ? `:${col}` : ''}` : filePath;
|
|
59
|
+
// Use pathToFileURL for proper encoding of spaces, #, ?, and Windows
|
|
60
|
+
// drive letters (TIM-792). Append :line:col after the URL.
|
|
61
|
+
const base = pathToFileURL(filePath).href;
|
|
62
|
+
const url = line ? `${base}:${line}${col ? `:${col}` : ''}` : base;
|
|
63
|
+
return `${CYAN}${UNDERLINE}${hyperlink(display, url)}${RESET}`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ─── Box Drawing ────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
const BOX = {
|
|
69
|
+
topLeft: '╭',
|
|
70
|
+
topRight: '╮',
|
|
71
|
+
bottomLeft: '╰',
|
|
72
|
+
bottomRight: '╯',
|
|
73
|
+
horizontal: '─',
|
|
74
|
+
vertical: '│',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Wrap lines of text in a Unicode box with a colored left border.
|
|
79
|
+
*
|
|
80
|
+
* @param lines - Content lines (no ANSI length calculation — keeps it simple)
|
|
81
|
+
* @param width - Box width (characters). Lines longer than this are not truncated.
|
|
82
|
+
*/
|
|
83
|
+
function box(lines: string[], borderColor: string, width = 80): string {
|
|
84
|
+
const bar = BOX.horizontal.repeat(width - 2);
|
|
85
|
+
const output: string[] = [];
|
|
86
|
+
|
|
87
|
+
output.push(`${borderColor}${BOX.topLeft}${bar}${BOX.topRight}${RESET}`);
|
|
88
|
+
for (const line of lines) {
|
|
89
|
+
output.push(`${borderColor}${BOX.vertical}${RESET} ${line}`);
|
|
90
|
+
}
|
|
91
|
+
output.push(`${borderColor}${BOX.bottomLeft}${bar}${BOX.bottomRight}${RESET}`);
|
|
92
|
+
|
|
93
|
+
return output.join('\n');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ─── Frame Extraction ───────────────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
interface ClassifiedFrame {
|
|
99
|
+
raw: string;
|
|
100
|
+
type: FrameType;
|
|
101
|
+
file?: string;
|
|
102
|
+
line?: number;
|
|
103
|
+
col?: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Parse file/line/col from a stack frame line. */
|
|
107
|
+
function parseFrame(frameLine: string): { file?: string; line?: number; col?: number } {
|
|
108
|
+
const parenMatch = /\(([^)]+):(\d+):(\d+)\)/.exec(frameLine);
|
|
109
|
+
if (parenMatch) {
|
|
110
|
+
return { file: parenMatch[1], line: Number(parenMatch[2]), col: Number(parenMatch[3]) };
|
|
111
|
+
}
|
|
112
|
+
const bareMatch = /at (\/[^:]+):(\d+):(\d+)/.exec(frameLine);
|
|
113
|
+
if (bareMatch) {
|
|
114
|
+
return { file: bareMatch[1], line: Number(bareMatch[2]), col: Number(bareMatch[3]) };
|
|
115
|
+
}
|
|
116
|
+
return {};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function classifyFrames(stack: string, projectRoot: string): ClassifiedFrame[] {
|
|
120
|
+
return stack
|
|
121
|
+
.split('\n')
|
|
122
|
+
.slice(1)
|
|
123
|
+
.filter((l) => l.trim().startsWith('at '))
|
|
124
|
+
.map((raw) => {
|
|
125
|
+
const type = classifyFrame(raw, projectRoot);
|
|
126
|
+
const { file, line, col } = parseFrame(raw);
|
|
127
|
+
return { raw, type, file, line, col };
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Format an error for terminal output with a boxed layout.
|
|
135
|
+
*
|
|
136
|
+
* The output is designed to be scannable at a glance:
|
|
137
|
+
* 1. Red box with phase badge and error message
|
|
138
|
+
* 2. First app frame as a clickable link (the primary action item)
|
|
139
|
+
* 3. App frames listed normally
|
|
140
|
+
* 4. Internal/framework frames collapsed with count
|
|
141
|
+
* 5. Component stack (if present)
|
|
142
|
+
*/
|
|
143
|
+
export function formatTerminalError(error: Error, phase: ErrorPhase, projectRoot: string): string {
|
|
144
|
+
const sections: string[] = [];
|
|
145
|
+
const componentStack = extractComponentStack(error);
|
|
146
|
+
const loc = parseFirstAppFrame(error.stack ?? '', projectRoot);
|
|
147
|
+
const frames = error.stack ? classifyFrames(error.stack, projectRoot) : [];
|
|
148
|
+
const appFrames = frames.filter((f) => f.type === 'app');
|
|
149
|
+
const internalCount = frames.filter((f) => f.type !== 'app').length;
|
|
150
|
+
|
|
151
|
+
// ── Box: Phase + Message ──────────────────────────────────────────
|
|
152
|
+
const boxLines: string[] = [];
|
|
153
|
+
boxLines.push(`${RED}${BOLD}${PHASE_LABELS[phase]} Error${RESET}`);
|
|
154
|
+
boxLines.push('');
|
|
155
|
+
|
|
156
|
+
// Error message — may be multi-line
|
|
157
|
+
for (const msgLine of error.message.split('\n')) {
|
|
158
|
+
boxLines.push(`${RED}${msgLine}${RESET}`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Primary file location (clickable)
|
|
162
|
+
if (loc) {
|
|
163
|
+
boxLines.push('');
|
|
164
|
+
const relPath = loc.file.startsWith(projectRoot)
|
|
165
|
+
? loc.file.slice(projectRoot.length + 1)
|
|
166
|
+
: loc.file;
|
|
167
|
+
boxLines.push(
|
|
168
|
+
`${BOLD}→${RESET} ${fileLink(loc.file, loc.line, loc.column)} ${DIM}(${relPath})${RESET}`
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
sections.push(box(boxLines, RED));
|
|
173
|
+
|
|
174
|
+
// ── Component Stack ───────────────────────────────────────────────
|
|
175
|
+
if (componentStack) {
|
|
176
|
+
sections.push('');
|
|
177
|
+
sections.push(` ${BOLD}Component Stack:${RESET}`);
|
|
178
|
+
for (const csLine of componentStack.trim().split('\n')) {
|
|
179
|
+
sections.push(` ${DIM}${csLine.trim()}${RESET}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ── App Frames ────────────────────────────────────────────────────
|
|
184
|
+
if (appFrames.length > 0) {
|
|
185
|
+
sections.push('');
|
|
186
|
+
sections.push(` ${BOLD}Application Frames:${RESET}`);
|
|
187
|
+
for (let i = 0; i < appFrames.length; i++) {
|
|
188
|
+
const f = appFrames[i]!;
|
|
189
|
+
if (f.file && f.line) {
|
|
190
|
+
const prefix = i === 0 ? `${BOLD}▸${RESET}` : ' ';
|
|
191
|
+
sections.push(
|
|
192
|
+
` ${prefix} ${fileLink(f.file, f.line, f.col)} ${DIM}${extractFnName(f.raw)}${RESET}`
|
|
193
|
+
);
|
|
194
|
+
} else {
|
|
195
|
+
sections.push(` ${f.raw}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ── Internal Frames (collapsed) ───────────────────────────────────
|
|
201
|
+
if (internalCount > 0) {
|
|
202
|
+
sections.push(
|
|
203
|
+
` ${DIM}… ${internalCount} internal frame${internalCount !== 1 ? 's' : ''} hidden${RESET}`
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
sections.push('');
|
|
208
|
+
return sections.join('\n');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
212
|
+
|
|
213
|
+
/** Extract the function name from a stack frame line like " at fnName (/path:1:2)". */
|
|
214
|
+
function extractFnName(frameLine: string): string {
|
|
215
|
+
const match = /at\s+(\S+)\s+\(/.exec(frameLine.trim());
|
|
216
|
+
return match ? match[1]! : '';
|
|
217
|
+
}
|
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,11 +139,24 @@ 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
|
-
responseCache: ctx.config.responseCache,
|
|
114
143
|
debug: ctx.config.debug ?? false,
|
|
115
|
-
|
|
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
|
+
// Note: project root is NOT included here — it was leaking server
|
|
158
|
+
// filesystem paths to client bundles (TIM-787). Dev error pages get
|
|
159
|
+
// the root through the dev server, not the runtime config.
|
|
116
160
|
};
|
|
117
161
|
|
|
118
162
|
return [
|
|
@@ -178,6 +222,53 @@ export function generateInstrumentationModule(instrumentationPath: string | null
|
|
|
178
222
|
].join('\n');
|
|
179
223
|
}
|
|
180
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Detect the user's timber.config file at the project root.
|
|
227
|
+
* Returns the absolute path or null if not found.
|
|
228
|
+
*/
|
|
229
|
+
function detectConfigFile(root: string): string | null {
|
|
230
|
+
const names = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
|
|
231
|
+
for (const name of names) {
|
|
232
|
+
const candidate = resolve(root, name);
|
|
233
|
+
if (existsSync(candidate)) return candidate;
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Generate the virtual:timber-cache-handler module source.
|
|
240
|
+
*
|
|
241
|
+
* When the user's config has a cacheHandler, generates a module that
|
|
242
|
+
* dynamically imports the config file and extracts the cacheHandler.
|
|
243
|
+
* The cacheHandler is a class instance (e.g. RedisCacheHandler) that
|
|
244
|
+
* cannot be JSON-serialized into virtual:timber-config, so it must
|
|
245
|
+
* be loaded at runtime via dynamic import. See TIM-599.
|
|
246
|
+
*/
|
|
247
|
+
function generateCacheHandlerModule(configPath: string | null, hasCacheHandler: boolean): string {
|
|
248
|
+
if (configPath && hasCacheHandler) {
|
|
249
|
+
return [
|
|
250
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
251
|
+
'// Generated by timber-entries plugin.',
|
|
252
|
+
'',
|
|
253
|
+
`export default async function loadCacheHandler() {`,
|
|
254
|
+
` const mod = await import(${JSON.stringify(configPath)});`,
|
|
255
|
+
` const config = mod.default ?? mod;`,
|
|
256
|
+
` return config.cacheHandler ?? null;`,
|
|
257
|
+
`}`,
|
|
258
|
+
].join('\n');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return [
|
|
262
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
263
|
+
'// Generated by timber-entries plugin.',
|
|
264
|
+
'// No cacheHandler configured in timber.config.',
|
|
265
|
+
'',
|
|
266
|
+
`export default async function loadCacheHandler() {`,
|
|
267
|
+
` return null;`,
|
|
268
|
+
`}`,
|
|
269
|
+
].join('\n');
|
|
270
|
+
}
|
|
271
|
+
|
|
181
272
|
/**
|
|
182
273
|
* Create the timber-entries Vite plugin.
|
|
183
274
|
*
|
|
@@ -220,6 +311,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
220
311
|
return RESOLVED_INSTRUMENTATION_ID;
|
|
221
312
|
}
|
|
222
313
|
|
|
314
|
+
// Check cache handler virtual module
|
|
315
|
+
if (cleanId === VIRTUAL_IDS.cacheHandler) {
|
|
316
|
+
return RESOLVED_CACHE_HANDLER_ID;
|
|
317
|
+
}
|
|
318
|
+
|
|
223
319
|
return null;
|
|
224
320
|
},
|
|
225
321
|
|
|
@@ -237,6 +333,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
237
333
|
const instrumentationPath = detectInstrumentationFile(ctx.root);
|
|
238
334
|
return generateInstrumentationModule(instrumentationPath);
|
|
239
335
|
}
|
|
336
|
+
if (id === RESOLVED_CACHE_HANDLER_ID) {
|
|
337
|
+
const configPath = detectConfigFile(ctx.root);
|
|
338
|
+
const hasCacheHandler = ctx.config.cacheHandler != null;
|
|
339
|
+
return generateCacheHandlerModule(configPath, hasCacheHandler);
|
|
340
|
+
}
|
|
240
341
|
return null;
|
|
241
342
|
},
|
|
242
343
|
|