@timber-js/app 0.2.0-alpha.8 → 0.2.0-alpha.80
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/dist/_chunks/actions-Dg-ANYHb.js +421 -0
- package/dist/_chunks/actions-Dg-ANYHb.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-DYhsFzuS.js +33 -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-CZqDwhSu.js +199 -0
- package/dist/_chunks/define-CZqDwhSu.js.map +1 -0
- package/dist/_chunks/define-cookie-C2IkoFGN.js +94 -0
- package/dist/_chunks/define-cookie-C2IkoFGN.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-Dpn_UfAD.js} +171 -97
- package/dist/_chunks/interception-Dpn_UfAD.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-qMsWgy9C.js +478 -0
- package/dist/_chunks/request-context-qMsWgy9C.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-C2plcNtG.js +64 -0
- package/dist/_chunks/stale-reload-C2plcNtG.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-Lo_s_pw2.js} +4 -4
- package/dist/_chunks/use-query-states-Lo_s_pw2.js.map +1 -0
- package/dist/_chunks/wrappers-_DTmImGt.js +63 -0
- package/dist/_chunks/wrappers-_DTmImGt.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 +6 -1
- 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 +2 -2
- 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 +7 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +210 -1017
- 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 +90 -32
- 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 +210 -0
- package/dist/config-types.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/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/index.d.ts +45 -192
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12296 -11901
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +84 -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-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 +26 -1
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- 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/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +19 -5
- 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/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 +4 -474
- 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 +6 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +4 -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 +12 -1
- 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.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-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 +4 -3
- 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 +6 -43
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +38 -2798
- 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 +2883 -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 +42 -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 +9 -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 +8 -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 +4 -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/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 +22 -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 +53 -23
- 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 +6 -1
- 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 +138 -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 +2 -2
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +19 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +329 -97
- 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 +16 -8
- 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 +3 -3
- package/src/client/use-router.ts +1 -1
- package/src/codec.ts +49 -0
- package/src/config-types.ts +208 -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/css.ts +2 -1
- package/src/index.ts +258 -354
- package/src/plugin-context.ts +200 -0
- package/src/plugins/adapter-build.ts +8 -2
- 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-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +70 -1
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +70 -9
- package/src/plugins/entries.ts +71 -10
- package/src/plugins/fonts.ts +168 -61
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +57 -17
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +135 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen.ts +165 -105
- 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 +29 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +21 -2
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +21 -4
- 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-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 +31 -15
- 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 +26 -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 +227 -62
- 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 +24 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +300 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +200 -112
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +65 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +168 -38
- package/src/server/safe-load.ts +60 -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 +211 -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/search-params/index.js.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
|
@@ -180,6 +180,63 @@ export function formatTerminalError(error: Error, phase: ErrorPhase, projectRoot
|
|
|
180
180
|
return lines.join('\n');
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
// ─── RSC Debug Context ──────────────────────────────────────────────────────
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Component info extracted from the RSC debug channel.
|
|
187
|
+
* Contains only names, environments, and stack frames — never source code.
|
|
188
|
+
*/
|
|
189
|
+
export interface RscDebugComponentInfo {
|
|
190
|
+
name: string;
|
|
191
|
+
env: string | null;
|
|
192
|
+
stack: unknown[] | null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Format RSC debug component info into a readable string for the overlay.
|
|
197
|
+
*
|
|
198
|
+
* Renders the server component tree that was active when an error occurred,
|
|
199
|
+
* including component names and source locations from stack frames. This
|
|
200
|
+
* gives developers visibility into which server components were rendering
|
|
201
|
+
* without exposing source code.
|
|
202
|
+
*
|
|
203
|
+
* Returns an empty string if no components are provided.
|
|
204
|
+
*/
|
|
205
|
+
export function formatRscDebugContext(components: RscDebugComponentInfo[]): string {
|
|
206
|
+
if (!components || components.length === 0) return '';
|
|
207
|
+
|
|
208
|
+
// Deduplicate by name — the debug channel may emit the same component
|
|
209
|
+
// multiple times (e.g., when re-rendered or when multiple instances exist).
|
|
210
|
+
const seen = new Set<string>();
|
|
211
|
+
const unique: RscDebugComponentInfo[] = [];
|
|
212
|
+
for (const c of components) {
|
|
213
|
+
if (!seen.has(c.name)) {
|
|
214
|
+
seen.add(c.name);
|
|
215
|
+
unique.push(c);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const lines: string[] = ['Server Component Tree:'];
|
|
220
|
+
for (let i = 0; i < unique.length; i++) {
|
|
221
|
+
const c = unique[i]!;
|
|
222
|
+
const indent = ' '.repeat(i + 1);
|
|
223
|
+
const envLabel = c.env ? ` [${c.env}]` : '';
|
|
224
|
+
|
|
225
|
+
// Extract file location from stack frames if available
|
|
226
|
+
let locStr = '';
|
|
227
|
+
if (c.stack && c.stack.length > 0) {
|
|
228
|
+
const frame = c.stack[0] as [string, string, number, number] | undefined;
|
|
229
|
+
if (Array.isArray(frame) && frame.length >= 3) {
|
|
230
|
+
locStr = ` (${frame[1]}:${frame[2]})`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
lines.push(`${indent}${c.name}${envLabel}${locStr}`);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return lines.join('\n');
|
|
238
|
+
}
|
|
239
|
+
|
|
183
240
|
// ─── Overlay Integration ────────────────────────────────────────────────────
|
|
184
241
|
|
|
185
242
|
/**
|
|
@@ -188,13 +245,19 @@ export function formatTerminalError(error: Error, phase: ErrorPhase, projectRoot
|
|
|
188
245
|
* Uses `server.ssrFixStacktrace()` to map stack traces back to source,
|
|
189
246
|
* then sends the error via `server.hot.send()` for the browser overlay.
|
|
190
247
|
*
|
|
248
|
+
* When `rscDebugComponents` is provided (dev mode only), the server
|
|
249
|
+
* component tree context is appended to the error message. This helps
|
|
250
|
+
* developers identify which server component caused the error without
|
|
251
|
+
* exposing source code.
|
|
252
|
+
*
|
|
191
253
|
* The dev server remains running — errors are handled, not fatal.
|
|
192
254
|
*/
|
|
193
255
|
export function sendErrorToOverlay(
|
|
194
256
|
server: ViteDevServer,
|
|
195
257
|
error: Error,
|
|
196
258
|
phase: ErrorPhase,
|
|
197
|
-
projectRoot: string
|
|
259
|
+
projectRoot: string,
|
|
260
|
+
rscDebugComponents?: RscDebugComponentInfo[]
|
|
198
261
|
): void {
|
|
199
262
|
// Fix stack trace to use source-mapped positions
|
|
200
263
|
server.ssrFixStacktrace(error);
|
|
@@ -212,6 +275,12 @@ export function sendErrorToOverlay(
|
|
|
212
275
|
message = `${error.message}\n\nComponent Stack:\n${componentStack.trim()}`;
|
|
213
276
|
}
|
|
214
277
|
|
|
278
|
+
// Append RSC debug context if available (dev mode only)
|
|
279
|
+
const debugContext = formatRscDebugContext(rscDebugComponents ?? []);
|
|
280
|
+
if (debugContext) {
|
|
281
|
+
message = `${message}\n\n${debugContext}`;
|
|
282
|
+
}
|
|
283
|
+
|
|
215
284
|
// Send to browser via Vite's error overlay protocol
|
|
216
285
|
try {
|
|
217
286
|
server.hot.send({
|
package/src/plugins/dev-logs.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import type { Plugin, ViteDevServer } from 'vite';
|
|
16
|
-
import type { PluginContext } from '
|
|
16
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
17
17
|
|
|
18
18
|
// ─── Types ───────────────────────────────────────────────────────────────
|
|
19
19
|
|
|
@@ -15,10 +15,10 @@
|
|
|
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 '
|
|
18
|
+
import type { PluginContext } from '../plugin-context.js';
|
|
19
|
+
import { setViteServer } from '../server/dev-warnings.js';
|
|
20
20
|
import { sendErrorToOverlay, classifyErrorPhase, parseFirstAppFrame } from './dev-error-overlay.js';
|
|
21
|
-
import { compressResponse } from '
|
|
21
|
+
import { compressResponse } from '../server/compress.js';
|
|
22
22
|
|
|
23
23
|
// ─── Constants ────────────────────────────────────────────────────────────
|
|
24
24
|
|
|
@@ -96,6 +96,21 @@ export function timberDevServer(ctx: PluginContext): Plugin {
|
|
|
96
96
|
// Pre-hook — registers middleware before Vite's internals
|
|
97
97
|
server.middlewares.use(createTimberMiddleware(server, ctx.root));
|
|
98
98
|
|
|
99
|
+
// Wrap server.listen() to close the holding server immediately
|
|
100
|
+
// before Vite binds the port — no gap where nothing is listening.
|
|
101
|
+
// The holding server was started in rootSync's config() hook to
|
|
102
|
+
// serve a loading page during initialization.
|
|
103
|
+
// See design/21-dev-server.md §"Startup Holding Server", TIM-665.
|
|
104
|
+
if (ctx.holdingServer) {
|
|
105
|
+
const originalListen = server.listen.bind(server);
|
|
106
|
+
const holdingRef = ctx.holdingServer;
|
|
107
|
+
ctx.holdingServer = null;
|
|
108
|
+
server.listen = async (port?: number, isRestart?: boolean) => {
|
|
109
|
+
await holdingRef.close().catch(() => {});
|
|
110
|
+
return originalListen(port, isRestart);
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
99
114
|
// Log startup timing summary. configureServer runs on all plugins
|
|
100
115
|
// before the server listens, so this captures the full cold start.
|
|
101
116
|
ctx.timer.end('dev-server-setup');
|
|
@@ -161,12 +176,26 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
161
176
|
|
|
162
177
|
// Wire pipeline errors into the browser error overlay.
|
|
163
178
|
// setDevPipelineErrorHandler is only defined in dev (rsc-entry.ts exports it).
|
|
179
|
+
// The handler receives optional RSC debug component data (component names,
|
|
180
|
+
// environments, stack frames) from the Flight debug channel for render errors.
|
|
164
181
|
const setHandler = rscModule.setDevPipelineErrorHandler as
|
|
165
|
-
| ((
|
|
182
|
+
| ((
|
|
183
|
+
fn: (
|
|
184
|
+
error: Error,
|
|
185
|
+
phase: string,
|
|
186
|
+
debugComponents?: Array<{ name: string; env: string | null; stack: unknown[] | null }>
|
|
187
|
+
) => void
|
|
188
|
+
) => void)
|
|
166
189
|
| undefined;
|
|
167
190
|
if (typeof setHandler === 'function') {
|
|
168
|
-
setHandler((error) => {
|
|
169
|
-
sendErrorToOverlay(
|
|
191
|
+
setHandler((error, _phase, debugComponents) => {
|
|
192
|
+
sendErrorToOverlay(
|
|
193
|
+
server,
|
|
194
|
+
error,
|
|
195
|
+
classifyErrorPhase(error, projectRoot),
|
|
196
|
+
projectRoot,
|
|
197
|
+
debugComponents
|
|
198
|
+
);
|
|
170
199
|
});
|
|
171
200
|
}
|
|
172
201
|
} catch (error) {
|
|
@@ -191,8 +220,20 @@ function createTimberMiddleware(server: ViteDevServer, projectRoot: string) {
|
|
|
191
220
|
// Convert Node IncomingMessage → Web Request
|
|
192
221
|
const webRequest = toWebRequest(req);
|
|
193
222
|
|
|
194
|
-
//
|
|
195
|
-
|
|
223
|
+
// Check for a platform-specific request wrapper (e.g., Cloudflare
|
|
224
|
+
// dev bindings). The cloudflareDevBindings() plugin stores a wrapper
|
|
225
|
+
// function on the server instance using a well-known Symbol. The
|
|
226
|
+
// wrapper runs the handler inside an ALS context so platform APIs
|
|
227
|
+
// like getCloudflareBindings() work during dev.
|
|
228
|
+
// See design/35-cloudflare-primitives.md §"Dev Experience".
|
|
229
|
+
const wrapper = (server as any)[Symbol.for('timber:dev-request-wrapper')] as
|
|
230
|
+
| (<T>(fn: () => T) => T)
|
|
231
|
+
| undefined;
|
|
232
|
+
|
|
233
|
+
// Run the full pipeline (wrapped if a platform dev plugin is active)
|
|
234
|
+
const webResponse = wrapper
|
|
235
|
+
? await wrapper(() => handler(webRequest))
|
|
236
|
+
: await handler(webRequest);
|
|
196
237
|
|
|
197
238
|
// Compress the response if the client supports it.
|
|
198
239
|
// In dev mode, compression is always enabled for parity with production.
|
|
@@ -317,6 +358,17 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
317
358
|
nodeRes.flushHeaders();
|
|
318
359
|
|
|
319
360
|
const reader = webResponse.body.getReader();
|
|
361
|
+
|
|
362
|
+
// Cancel the reader when the client disconnects. This causes any pending
|
|
363
|
+
// reader.read() to reject, breaking the pump loop. Critical for SSE and
|
|
364
|
+
// other infinite streams — without this, disconnected clients leak readers.
|
|
365
|
+
let clientDisconnected = false;
|
|
366
|
+
const onClose = () => {
|
|
367
|
+
clientDisconnected = true;
|
|
368
|
+
reader.cancel('Client disconnected').catch(() => {});
|
|
369
|
+
};
|
|
370
|
+
nodeRes.on('close', onClose);
|
|
371
|
+
|
|
320
372
|
try {
|
|
321
373
|
while (true) {
|
|
322
374
|
const { done, value } = await reader.read();
|
|
@@ -325,9 +377,18 @@ async function sendWebResponse(nodeRes: ServerResponse, webResponse: Response):
|
|
|
325
377
|
// don't need back-pressure here — just keep pushing chunks.
|
|
326
378
|
nodeRes.write(value);
|
|
327
379
|
}
|
|
380
|
+
} catch (err) {
|
|
381
|
+
// reader.cancel() from the close handler causes read() to reject.
|
|
382
|
+
// This is expected on client disconnect — not an error.
|
|
383
|
+
if (!clientDisconnected) {
|
|
384
|
+
throw err;
|
|
385
|
+
}
|
|
328
386
|
} finally {
|
|
387
|
+
nodeRes.off('close', onClose);
|
|
329
388
|
reader.releaseLock();
|
|
330
|
-
nodeRes.
|
|
389
|
+
if (!nodeRes.writableEnded) {
|
|
390
|
+
nodeRes.end();
|
|
391
|
+
}
|
|
331
392
|
}
|
|
332
393
|
}
|
|
333
394
|
|
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
|
*
|
|
@@ -95,11 +99,6 @@ function stripRootPrefix(id: string, root: string): string {
|
|
|
95
99
|
* Serializes output mode and feature flags for runtime consumption.
|
|
96
100
|
*/
|
|
97
101
|
function generateConfigModule(ctx: PluginContext): string {
|
|
98
|
-
// Resolve cookie secrets: `secret` shorthand expands to `secrets: [secret]`
|
|
99
|
-
const cookieSecrets =
|
|
100
|
-
ctx.config.cookies?.secrets ??
|
|
101
|
-
(ctx.config.cookies?.secret ? [ctx.config.cookies.secret] : undefined);
|
|
102
|
-
|
|
103
102
|
const runtimeConfig = {
|
|
104
103
|
output: ctx.config.output ?? 'server',
|
|
105
104
|
csrf: ctx.config.csrf ?? true,
|
|
@@ -108,11 +107,16 @@ function generateConfigModule(ctx: PluginContext): string {
|
|
|
108
107
|
dev: ctx.dev ?? false,
|
|
109
108
|
slowPhaseMs: ctx.config.dev?.slowPhaseMs ?? 200,
|
|
110
109
|
slowRequestMs: ctx.config.slowRequestMs ?? 3000,
|
|
111
|
-
cookieSecrets,
|
|
112
110
|
topLoader: ctx.config.topLoader,
|
|
113
|
-
responseCache: ctx.config.responseCache,
|
|
114
111
|
debug: ctx.config.debug ?? false,
|
|
115
|
-
|
|
112
|
+
serverTiming: ctx.config.serverTiming,
|
|
113
|
+
renderTimeoutMs: ctx.config.renderTimeoutMs ?? 30_000,
|
|
114
|
+
// Auto-generated sitemap config — opt-in via timber.config.ts.
|
|
115
|
+
// See design/16-metadata.md §"Auto-generated Sitemap"
|
|
116
|
+
sitemap: ctx.config.sitemap,
|
|
117
|
+
// Per-build deployment ID for version skew detection (TIM-446).
|
|
118
|
+
// Null in dev mode — HMR handles code updates without full reloads.
|
|
119
|
+
deploymentId: ctx.deploymentId ?? null,
|
|
116
120
|
};
|
|
117
121
|
|
|
118
122
|
return [
|
|
@@ -178,6 +182,53 @@ export function generateInstrumentationModule(instrumentationPath: string | null
|
|
|
178
182
|
].join('\n');
|
|
179
183
|
}
|
|
180
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Detect the user's timber.config file at the project root.
|
|
187
|
+
* Returns the absolute path or null if not found.
|
|
188
|
+
*/
|
|
189
|
+
function detectConfigFile(root: string): string | null {
|
|
190
|
+
const names = ['timber.config.ts', 'timber.config.js', 'timber.config.mjs'];
|
|
191
|
+
for (const name of names) {
|
|
192
|
+
const candidate = resolve(root, name);
|
|
193
|
+
if (existsSync(candidate)) return candidate;
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Generate the virtual:timber-cache-handler module source.
|
|
200
|
+
*
|
|
201
|
+
* When the user's config has a cacheHandler, generates a module that
|
|
202
|
+
* dynamically imports the config file and extracts the cacheHandler.
|
|
203
|
+
* The cacheHandler is a class instance (e.g. RedisCacheHandler) that
|
|
204
|
+
* cannot be JSON-serialized into virtual:timber-config, so it must
|
|
205
|
+
* be loaded at runtime via dynamic import. See TIM-599.
|
|
206
|
+
*/
|
|
207
|
+
function generateCacheHandlerModule(configPath: string | null, hasCacheHandler: boolean): string {
|
|
208
|
+
if (configPath && hasCacheHandler) {
|
|
209
|
+
return [
|
|
210
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
211
|
+
'// Generated by timber-entries plugin.',
|
|
212
|
+
'',
|
|
213
|
+
`export default async function loadCacheHandler() {`,
|
|
214
|
+
` const mod = await import(${JSON.stringify(configPath)});`,
|
|
215
|
+
` const config = mod.default ?? mod;`,
|
|
216
|
+
` return config.cacheHandler ?? null;`,
|
|
217
|
+
`}`,
|
|
218
|
+
].join('\n');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return [
|
|
222
|
+
'// Auto-generated cache handler loader — do not edit.',
|
|
223
|
+
'// Generated by timber-entries plugin.',
|
|
224
|
+
'// No cacheHandler configured in timber.config.',
|
|
225
|
+
'',
|
|
226
|
+
`export default async function loadCacheHandler() {`,
|
|
227
|
+
` return null;`,
|
|
228
|
+
`}`,
|
|
229
|
+
].join('\n');
|
|
230
|
+
}
|
|
231
|
+
|
|
181
232
|
/**
|
|
182
233
|
* Create the timber-entries Vite plugin.
|
|
183
234
|
*
|
|
@@ -220,6 +271,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
220
271
|
return RESOLVED_INSTRUMENTATION_ID;
|
|
221
272
|
}
|
|
222
273
|
|
|
274
|
+
// Check cache handler virtual module
|
|
275
|
+
if (cleanId === VIRTUAL_IDS.cacheHandler) {
|
|
276
|
+
return RESOLVED_CACHE_HANDLER_ID;
|
|
277
|
+
}
|
|
278
|
+
|
|
223
279
|
return null;
|
|
224
280
|
},
|
|
225
281
|
|
|
@@ -237,6 +293,11 @@ export function timberEntries(ctx: PluginContext): Plugin {
|
|
|
237
293
|
const instrumentationPath = detectInstrumentationFile(ctx.root);
|
|
238
294
|
return generateInstrumentationModule(instrumentationPath);
|
|
239
295
|
}
|
|
296
|
+
if (id === RESOLVED_CACHE_HANDLER_ID) {
|
|
297
|
+
const configPath = detectConfigFile(ctx.root);
|
|
298
|
+
const hasCacheHandler = ctx.config.cacheHandler != null;
|
|
299
|
+
return generateCacheHandlerModule(configPath, hasCacheHandler);
|
|
300
|
+
}
|
|
240
301
|
return null;
|
|
241
302
|
},
|
|
242
303
|
|