@timber-js/app 0.2.0-alpha.12 → 0.2.0-alpha.121
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-Dy8vOjFt.js +1101 -0
- package/dist/_chunks/actions-Dy8vOjFt.js.map +1 -0
- package/dist/_chunks/build-output-helper-B1n0sUqj.js +61 -0
- package/dist/_chunks/build-output-helper-B1n0sUqj.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-ByZPGGmS.js +724 -0
- package/dist/_chunks/cli-schema-sync-ByZPGGmS.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DHQLjFu3.js +2 -0
- package/dist/_chunks/codec-registry-G9hD5LOq.js +21 -0
- package/dist/_chunks/codec-registry-G9hD5LOq.js.map +1 -0
- package/dist/_chunks/define-CPVQaWbx.js +124 -0
- package/dist/_chunks/define-CPVQaWbx.js.map +1 -0
- package/dist/_chunks/define-jeHDXZGq.js +195 -0
- package/dist/_chunks/define-jeHDXZGq.js.map +1 -0
- package/dist/_chunks/format-BjN9HLu9.js +14 -0
- package/dist/_chunks/format-BjN9HLu9.js.map +1 -0
- package/dist/_chunks/handler-store-CcwNX-gk.js +54 -0
- package/dist/_chunks/handler-store-CcwNX-gk.js.map +1 -0
- package/dist/_chunks/logger-DDmK5skc.js +291 -0
- package/dist/_chunks/logger-DDmK5skc.js.map +1 -0
- package/dist/_chunks/merge-search-params-az6ZiBeU.js +41 -0
- package/dist/_chunks/merge-search-params-az6ZiBeU.js.map +1 -0
- package/dist/_chunks/navigation-root-DoRTeBm5.js +96 -0
- package/dist/_chunks/navigation-root-DoRTeBm5.js.map +1 -0
- package/dist/_chunks/registry-BI9cgCt7.js +20 -0
- package/dist/_chunks/registry-BI9cgCt7.js.map +1 -0
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js +73 -0
- package/dist/_chunks/resolve-schema-Bf8eC6q6.js.map +1 -0
- package/dist/_chunks/router-ref-CpvjBqdu.js +28 -0
- package/dist/_chunks/router-ref-CpvjBqdu.js.map +1 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js +86 -0
- package/dist/_chunks/schema-bridge-o0SwFtXW.js.map +1 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js +137 -0
- package/dist/_chunks/segment-classify-CnfLLvir.js.map +1 -0
- package/dist/_chunks/segment-context-EsfQpS--.js +34 -0
- package/dist/_chunks/segment-context-EsfQpS--.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-m9-cNEIw.js} +1 -1
- package/dist/_chunks/ssr-data-m9-cNEIw.js.map +1 -0
- package/dist/_chunks/stale-reload-BN2kcE06.js +64 -0
- package/dist/_chunks/stale-reload-BN2kcE06.js.map +1 -0
- package/dist/_chunks/tracing-DvKLzCFa.js +329 -0
- package/dist/_chunks/tracing-DvKLzCFa.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-C9G6LP0F.js} +7 -20
- package/dist/_chunks/use-query-states-C9G6LP0F.js.map +1 -0
- package/dist/_chunks/use-segment-params-CtIAjqK0.js +185 -0
- package/dist/_chunks/use-segment-params-CtIAjqK0.js.map +1 -0
- package/dist/_chunks/validation-BMU5MPzP.js +84 -0
- package/dist/_chunks/validation-BMU5MPzP.js.map +1 -0
- package/dist/_chunks/walkers-DNp9tHyV.js +719 -0
- package/dist/_chunks/walkers-DNp9tHyV.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-B30wpfaS.js} +6 -45
- package/dist/_chunks/warnings-B30wpfaS.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +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 +142 -38
- 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 +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- 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 +151 -81
- 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-schema-sync.d.ts +37 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +42 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -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 +29 -6
- 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 +16 -27
- 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 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +172 -1100
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +964 -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/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/{use-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/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -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 +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4807 -12729
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +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 +9 -7
- 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-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 +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 +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +63 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -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 +95 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +53 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.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/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- 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-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -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-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +155 -2905
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2947 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +118 -23
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/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 +62 -107
- 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 +21 -34
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +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 +49 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/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 +17 -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/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +30 -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/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- 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 +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +41 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +49 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/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 +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +62 -21
- package/src/adapters/build-output-helper.ts +77 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +142 -59
- package/src/adapters/shared.ts +40 -0
- 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 +33 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli-schema-sync.ts +207 -0
- package/src/cli.ts +65 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +126 -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 +149 -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 +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +69 -44
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +366 -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 +300 -73
- package/src/client/rsc-fetch.ts +112 -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/state.ts +2 -2
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- 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/client/{use-params.ts → use-segment-params.ts} +8 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +506 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +1 -1
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +233 -0
- package/src/index.ts +409 -357
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +114 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +101 -0
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +175 -35
- package/src/plugins/entries.ts +111 -9
- package/src/plugins/fonts.ts +157 -654
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +371 -45
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +109 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +316 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +308 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +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 +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +336 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +55 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- 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-injector-core.ts +417 -0
- package/src/server/html-injectors.ts +235 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +176 -0
- package/src/server/pipeline-phases.ts +460 -0
- package/src/server/pipeline.ts +154 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -333
- package/src/server/route-element-builder.ts +309 -195
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +50 -231
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +137 -12
- package/src/server/rsc-entry/index.ts +316 -352
- package/src/server/rsc-entry/render-route.ts +307 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +187 -38
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +228 -246
- package/src/server/ssr-entry.ts +229 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/tree-match.ts +198 -0
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- 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 +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- 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/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/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/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/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/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
// LinkStatusProvider — client component that provides per-link pending status
|
|
4
|
-
// via React context. Used inside <Link> to power useLinkStatus().
|
|
5
|
-
//
|
|
6
|
-
// Reads pendingUrl from PendingNavigationContext (provided by TransitionRoot).
|
|
7
|
-
// The pending URL is set as an URGENT update at navigation start (shows
|
|
8
|
-
// immediately) and cleared inside startTransition when the new tree commits
|
|
9
|
-
// (atomic with params/pathname). This eliminates both:
|
|
10
|
-
// 1. The delay before showing the spinner (urgent update, not deferred)
|
|
11
|
-
// 2. The gap between spinner disappearing and active state updating (same commit)
|
|
12
|
-
|
|
13
|
-
import type { ReactNode } from 'react';
|
|
14
|
-
import { LinkStatusContext, type LinkStatus } from './use-link-status.js';
|
|
15
|
-
import { usePendingNavigationUrl } from './navigation-context.js';
|
|
16
|
-
|
|
17
|
-
const NOT_PENDING: LinkStatus = { pending: false };
|
|
18
|
-
const IS_PENDING: LinkStatus = { pending: true };
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Client component that reads the pending URL from PendingNavigationContext
|
|
22
|
-
* and provides a scoped LinkStatusContext to children. Renders no extra DOM —
|
|
23
|
-
* just a context provider around children.
|
|
24
|
-
*/
|
|
25
|
-
export function LinkStatusProvider({ href, children }: { href: string; children?: ReactNode }) {
|
|
26
|
-
const pendingUrl = usePendingNavigationUrl();
|
|
27
|
-
const status = pendingUrl === href ? IS_PENDING : NOT_PENDING;
|
|
28
|
-
|
|
29
|
-
return <LinkStatusContext.Provider value={status}>{children}</LinkStatusContext.Provider>;
|
|
30
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TransitionRoot — Wrapper component for transition-based rendering.
|
|
3
|
-
*
|
|
4
|
-
* Solves the "new boundary has no old content" problem for client-side
|
|
5
|
-
* navigation. When React renders a completely new Suspense boundary via
|
|
6
|
-
* root.render(), it shows the fallback immediately — root.render() is
|
|
7
|
-
* always an urgent update regardless of startTransition.
|
|
8
|
-
*
|
|
9
|
-
* TransitionRoot holds the current element in React state. Navigation
|
|
10
|
-
* updates call startTransition(() => setState(newElement)), which IS
|
|
11
|
-
* a transition update. React keeps the old committed tree visible while
|
|
12
|
-
* any new Suspense boundaries in the transition resolve.
|
|
13
|
-
*
|
|
14
|
-
* Also manages `pendingUrl` as React state with an urgent/transition split:
|
|
15
|
-
* - Navigation START: `setPendingUrl(url)` is an urgent update — React
|
|
16
|
-
* commits it before the next paint, showing the spinner immediately.
|
|
17
|
-
* - Navigation END: `setPendingUrl(null)` is inside `startTransition`
|
|
18
|
-
* alongside `setElement(newTree)` — both commit atomically, so the
|
|
19
|
-
* spinner disappears in the same frame as the new content appears.
|
|
20
|
-
*
|
|
21
|
-
* See design/05-streaming.md §"deferSuspenseFor"
|
|
22
|
-
* See design/19-client-navigation.md §"NavigationContext"
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import { useState, useTransition, createElement, Fragment, type ReactNode } from 'react';
|
|
26
|
-
import { PendingNavigationProvider } from './navigation-context.js';
|
|
27
|
-
import { TopLoader, type TopLoaderConfig } from './top-loader.js';
|
|
28
|
-
|
|
29
|
-
// ─── Module-level functions ──────────────────────────────────────
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Module-level reference to the state setter wrapped in startTransition.
|
|
33
|
-
* Used for non-navigation renders (applyRevalidation, popstate replay).
|
|
34
|
-
*/
|
|
35
|
-
let _transitionRender: ((element: ReactNode) => void) | null = null;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Module-level reference to the navigation transition function.
|
|
39
|
-
* Wraps a full navigation (fetch + render) in a single startTransition
|
|
40
|
-
* with useOptimistic for the pending URL.
|
|
41
|
-
*/
|
|
42
|
-
let _navigateTransition:
|
|
43
|
-
| ((pendingUrl: string, perform: () => Promise<ReactNode>) => Promise<void>)
|
|
44
|
-
| null = null;
|
|
45
|
-
|
|
46
|
-
// ─── Component ───────────────────────────────────────────────────
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Root wrapper component that enables transition-based rendering.
|
|
50
|
-
*
|
|
51
|
-
* Renders PendingNavigationProvider around children for the pending URL
|
|
52
|
-
* context. The DOM tree matches the server-rendered HTML during hydration
|
|
53
|
-
* (the provider renders no extra DOM elements).
|
|
54
|
-
*
|
|
55
|
-
* Usage in browser-entry.ts:
|
|
56
|
-
* const rootEl = createElement(TransitionRoot, { initial: wrapped });
|
|
57
|
-
* reactRoot = hydrateRoot(document, rootEl);
|
|
58
|
-
*
|
|
59
|
-
* Subsequent navigations:
|
|
60
|
-
* navigateTransition(url, async () => { fetch; return wrappedElement; });
|
|
61
|
-
*
|
|
62
|
-
* Non-navigation renders:
|
|
63
|
-
* transitionRender(newWrappedElement);
|
|
64
|
-
*/
|
|
65
|
-
export function TransitionRoot({
|
|
66
|
-
initial,
|
|
67
|
-
topLoaderConfig,
|
|
68
|
-
}: {
|
|
69
|
-
initial: ReactNode;
|
|
70
|
-
topLoaderConfig?: TopLoaderConfig;
|
|
71
|
-
}): ReactNode {
|
|
72
|
-
const [element, setElement] = useState<ReactNode>(initial);
|
|
73
|
-
const [pendingUrl, setPendingUrl] = useState<string | null>(null);
|
|
74
|
-
const [, startTransition] = useTransition();
|
|
75
|
-
|
|
76
|
-
// Non-navigation render (revalidation, popstate cached replay).
|
|
77
|
-
_transitionRender = (newElement: ReactNode) => {
|
|
78
|
-
startTransition(() => {
|
|
79
|
-
setElement(newElement);
|
|
80
|
-
});
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
// Full navigation transition.
|
|
84
|
-
// setPendingUrl(url) is an URGENT update — React commits it before the next
|
|
85
|
-
// paint, so the pending spinner appears immediately when navigation starts.
|
|
86
|
-
// Inside startTransition: the async fetch + setElement + setPendingUrl(null)
|
|
87
|
-
// are deferred. When the transition commits, the new tree and pendingUrl=null
|
|
88
|
-
// both apply in the same React commit — making the pending→active transition
|
|
89
|
-
// atomic (no frame where pending is false but the old tree is still visible).
|
|
90
|
-
_navigateTransition = (url: string, perform: () => Promise<ReactNode>) => {
|
|
91
|
-
// Urgent: show pending state immediately
|
|
92
|
-
setPendingUrl(url);
|
|
93
|
-
|
|
94
|
-
return new Promise<void>((resolve, reject) => {
|
|
95
|
-
startTransition(async () => {
|
|
96
|
-
try {
|
|
97
|
-
const newElement = await perform();
|
|
98
|
-
setElement(newElement);
|
|
99
|
-
// Clear pending inside the transition — commits atomically with new tree
|
|
100
|
-
setPendingUrl(null);
|
|
101
|
-
resolve();
|
|
102
|
-
} catch (err) {
|
|
103
|
-
// Clear pending on error too
|
|
104
|
-
setPendingUrl(null);
|
|
105
|
-
reject(err);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// Inject TopLoader alongside the element tree inside PendingNavigationProvider.
|
|
112
|
-
// The TopLoader reads pendingUrl from context to show/hide the progress bar.
|
|
113
|
-
// It is rendered only when not explicitly disabled via config.
|
|
114
|
-
const showTopLoader = topLoaderConfig?.enabled !== false;
|
|
115
|
-
const children = showTopLoader
|
|
116
|
-
? createElement(Fragment, null, createElement(TopLoader, { config: topLoaderConfig }), element)
|
|
117
|
-
: element;
|
|
118
|
-
return createElement(PendingNavigationProvider, { value: pendingUrl }, children);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ─── Public API ──────────────────────────────────────────────────
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Trigger a transition render for non-navigation updates.
|
|
125
|
-
* React keeps the old committed tree visible while any new Suspense
|
|
126
|
-
* boundaries in the update resolve.
|
|
127
|
-
*
|
|
128
|
-
* Used for: applyRevalidation, popstate replay with cached payload.
|
|
129
|
-
*/
|
|
130
|
-
export function transitionRender(element: ReactNode): void {
|
|
131
|
-
if (_transitionRender) {
|
|
132
|
-
_transitionRender(element);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Run a full navigation inside a React transition with optimistic pending URL.
|
|
138
|
-
*
|
|
139
|
-
* The `perform` callback runs inside `startTransition` — it should fetch the
|
|
140
|
-
* RSC payload, update router state, and return the wrapped React element.
|
|
141
|
-
* The pending URL shows immediately (useOptimistic urgent update) and reverts
|
|
142
|
-
* to null when the transition commits (atomic with the new tree).
|
|
143
|
-
*
|
|
144
|
-
* Returns a Promise that resolves when the async work completes (note: the
|
|
145
|
-
* React transition may not have committed yet, but all state updates are done).
|
|
146
|
-
*
|
|
147
|
-
* Used for: navigate(), refresh(), popstate with fetch.
|
|
148
|
-
*/
|
|
149
|
-
export function navigateTransition(
|
|
150
|
-
pendingUrl: string,
|
|
151
|
-
perform: () => Promise<ReactNode>
|
|
152
|
-
): Promise<void> {
|
|
153
|
-
if (_navigateTransition) {
|
|
154
|
-
return _navigateTransition(pendingUrl, perform);
|
|
155
|
-
}
|
|
156
|
-
// Fallback: no TransitionRoot mounted (shouldn't happen in production)
|
|
157
|
-
return perform().then(() => {});
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Check if the TransitionRoot is mounted and ready for renders.
|
|
162
|
-
* Used by browser-entry.ts to guard against renders before hydration.
|
|
163
|
-
*/
|
|
164
|
-
export function isTransitionRootReady(): boolean {
|
|
165
|
-
return _transitionRender !== null;
|
|
166
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import type { Plugin } from 'vite';
|
|
2
|
-
import { findFunctionsWithDirective, containsDirective } from '#/utils/directive-parser.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Parse a cacheLife duration string to seconds.
|
|
6
|
-
* Supports: '30s', '5m', '1h', '2d', '1w', or a plain number (seconds).
|
|
7
|
-
*/
|
|
8
|
-
export function parseCacheLife(value: string | number): number {
|
|
9
|
-
if (typeof value === 'number') return value;
|
|
10
|
-
|
|
11
|
-
const match = value.match(/^(\d+)(s|m|h|d|w)$/);
|
|
12
|
-
if (!match) {
|
|
13
|
-
throw new Error(
|
|
14
|
-
`Invalid cacheLife value: "${value}". Expected format: "30s", "5m", "1h", "2d", "1w", or a number.`
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const amount = parseInt(match[1], 10);
|
|
19
|
-
const unit = match[2];
|
|
20
|
-
const multipliers: Record<string, number> = { s: 1, m: 60, h: 3600, d: 86400, w: 604800 };
|
|
21
|
-
return amount * multipliers[unit];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Default TTL when no cacheLife() is specified (Infinity means cache until explicit invalidation).
|
|
25
|
-
const DEFAULT_TTL = Infinity;
|
|
26
|
-
|
|
27
|
-
export interface CacheTransformWarning {
|
|
28
|
-
message: string;
|
|
29
|
-
functionName: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
interface TransformResult {
|
|
33
|
-
code: string;
|
|
34
|
-
map?: null;
|
|
35
|
-
warnings?: CacheTransformWarning[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Match cacheLife() calls: cacheLife('1h'), cacheLife("5m"), cacheLife(300)
|
|
40
|
-
*/
|
|
41
|
-
const CACHE_LIFE_PATTERN = /cacheLife\(\s*(?:'([^']+)'|"([^"]+)"|(\d+))\s*\)/;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Strip the 'use cache' directive and cacheLife() call from a function body.
|
|
45
|
-
* Returns the cleaned body and the extracted TTL.
|
|
46
|
-
*/
|
|
47
|
-
function extractCacheDirectives(body: string): { cleanBody: string; ttl: number } {
|
|
48
|
-
let ttl = DEFAULT_TTL;
|
|
49
|
-
|
|
50
|
-
// Remove 'use cache' / "use cache" directive (including optional semicolon and newline)
|
|
51
|
-
let cleanBody = body.replace(/\s*['"]use cache['"];?\s*\n?/, '\n');
|
|
52
|
-
|
|
53
|
-
// Extract and remove cacheLife() calls
|
|
54
|
-
const lifeMatch = cleanBody.match(CACHE_LIFE_PATTERN);
|
|
55
|
-
if (lifeMatch) {
|
|
56
|
-
const value = lifeMatch[1] || lifeMatch[2] || parseInt(lifeMatch[3], 10);
|
|
57
|
-
ttl = parseCacheLife(value);
|
|
58
|
-
cleanBody = cleanBody.replace(/\s*cacheLife\([^)]*\);?\s*\n?/, '\n');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return { cleanBody, ttl };
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Determine if a function name is a React component (PascalCase).
|
|
66
|
-
*/
|
|
67
|
-
function isComponentName(name: string): boolean {
|
|
68
|
-
return /^[A-Z]/.test(name);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Pattern matching page/layout file conventions in a dynamic route segment.
|
|
73
|
-
* Matches paths like: app/[slug]/page.tsx, app/[id]/layout.ts, etc.
|
|
74
|
-
*/
|
|
75
|
-
const DYNAMIC_ROUTE_PAGE_PATTERN = /\/\[[^\]]+\].*\/(page|layout)\.[jt]sx?$/;
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Detect if a function declaration has Promise-typed parameters.
|
|
79
|
-
*
|
|
80
|
-
* Checks for common patterns:
|
|
81
|
-
* - `params: Promise<...>`
|
|
82
|
-
* - `{ params }: { params: Promise<...> }`
|
|
83
|
-
* - `props: { params: Promise<...> }`
|
|
84
|
-
*/
|
|
85
|
-
const PROMISE_PARAMS_PATTERN = /params\s*(?::|.*?:)\s*Promise\s*</;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Check if a 'use cache' function in a dynamic route page/layout receives
|
|
89
|
-
* Promise-typed params, which are not serializable as cache keys.
|
|
90
|
-
*/
|
|
91
|
-
export function detectPromiseParamsWarning(
|
|
92
|
-
declaration: string,
|
|
93
|
-
functionName: string,
|
|
94
|
-
fileId: string
|
|
95
|
-
): CacheTransformWarning | null {
|
|
96
|
-
if (!DYNAMIC_ROUTE_PAGE_PATTERN.test(fileId)) return null;
|
|
97
|
-
if (!PROMISE_PARAMS_PATTERN.test(declaration)) return null;
|
|
98
|
-
|
|
99
|
-
return {
|
|
100
|
-
message:
|
|
101
|
-
`'use cache' on "${functionName}" in "${fileId}" receives Promise params. ` +
|
|
102
|
-
`Promise is not serializable as a cache key and will cause runtime errors. ` +
|
|
103
|
-
`Either remove 'use cache' or await the params before using them in a separate cached function.`,
|
|
104
|
-
functionName,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Transform source code containing 'use cache' directives into
|
|
110
|
-
* registerCachedFunction() calls.
|
|
111
|
-
*
|
|
112
|
-
* Returns null if no transformations were made.
|
|
113
|
-
*/
|
|
114
|
-
export function transformUseCache(code: string, fileId: string): TransformResult | null {
|
|
115
|
-
if (!containsDirective(code, 'use cache')) return null;
|
|
116
|
-
|
|
117
|
-
const functions = findFunctionsWithDirective(code, 'use cache');
|
|
118
|
-
if (functions.length === 0) return null;
|
|
119
|
-
|
|
120
|
-
let result = code;
|
|
121
|
-
let needsImport = false;
|
|
122
|
-
const warnings: CacheTransformWarning[] = [];
|
|
123
|
-
|
|
124
|
-
// Process functions from end to start (sorted descending by start position)
|
|
125
|
-
for (const fn of functions) {
|
|
126
|
-
// Warn if function receives Promise params in a dynamic route page/layout
|
|
127
|
-
const promiseWarning = detectPromiseParamsWarning(fn.declaration, fn.name, fileId);
|
|
128
|
-
if (promiseWarning) warnings.push(promiseWarning);
|
|
129
|
-
const { cleanBody, ttl } = extractCacheDirectives(fn.bodyContent);
|
|
130
|
-
const stableId = `${fileId}#${fn.name}`;
|
|
131
|
-
const isComponent = isComponentName(fn.name);
|
|
132
|
-
|
|
133
|
-
// Build the options object
|
|
134
|
-
const optsParts = [`ttl: ${ttl === Infinity ? 'Infinity' : ttl}`];
|
|
135
|
-
optsParts.push(`id: '${stableId}'`);
|
|
136
|
-
if (isComponent) {
|
|
137
|
-
optsParts.push('isComponent: true');
|
|
138
|
-
}
|
|
139
|
-
const optsStr = `{ ${optsParts.join(', ')} }`;
|
|
140
|
-
|
|
141
|
-
// Build the replacement
|
|
142
|
-
let replacement: string;
|
|
143
|
-
if (fn.isArrow) {
|
|
144
|
-
// const Name = async (...) => { body } → const Name = registerCachedFunction(async (...) => { body }, opts)
|
|
145
|
-
const arrowSig = fn.declaration.replace(/^(?:const|let|var)\s+\w+\s*=\s*/, '');
|
|
146
|
-
replacement = `const ${fn.name} = registerCachedFunction(${arrowSig} {${cleanBody}}, ${optsStr})`;
|
|
147
|
-
} else {
|
|
148
|
-
// async function Name(...) { body } → const Name = registerCachedFunction(async function Name(...) { body }, opts)
|
|
149
|
-
const fnDecl = fn.declaration.replace(/^(?:export\s+default\s+|export\s+)?/, '');
|
|
150
|
-
const exportPrefix = fn.prefix.includes('default')
|
|
151
|
-
? 'export default '
|
|
152
|
-
: fn.prefix.includes('export')
|
|
153
|
-
? 'export '
|
|
154
|
-
: '';
|
|
155
|
-
|
|
156
|
-
replacement = `${exportPrefix}const ${fn.name} = registerCachedFunction(${fnDecl} {${cleanBody}}, ${optsStr})`;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
result = result.slice(0, fn.start) + replacement + result.slice(fn.end);
|
|
160
|
-
needsImport = true;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if (needsImport) {
|
|
164
|
-
// Add the import at the top of the file
|
|
165
|
-
result = `import { registerCachedFunction } from '@timber-js/app/cache';\n` + result;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return { code: result, map: null, warnings: warnings.length > 0 ? warnings : undefined };
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Vite plugin: timber-cache
|
|
173
|
-
*
|
|
174
|
-
* Transforms 'use cache' directives into registerCachedFunction() calls.
|
|
175
|
-
* Only runs in the RSC environment.
|
|
176
|
-
*/
|
|
177
|
-
export function cacheTransformPlugin(): Plugin {
|
|
178
|
-
return {
|
|
179
|
-
name: 'timber-cache',
|
|
180
|
-
|
|
181
|
-
transform(code, id) {
|
|
182
|
-
// Only transform in RSC environment
|
|
183
|
-
// Skip node_modules and non-JS/TS files
|
|
184
|
-
if (id.includes('node_modules')) return null;
|
|
185
|
-
if (!/\.[jt]sx?$/.test(id)) return null;
|
|
186
|
-
|
|
187
|
-
// Quick bail-out: no 'use cache' directive in this file
|
|
188
|
-
if (!containsDirective(code, 'use cache')) return null;
|
|
189
|
-
|
|
190
|
-
const result = transformUseCache(code, id);
|
|
191
|
-
if (result?.warnings) {
|
|
192
|
-
for (const w of result.warnings) {
|
|
193
|
-
this.warn(`[timber] ${w.message}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return result;
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
}
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dev error overlay — formats and sends errors to Vite's browser overlay and stderr.
|
|
3
|
-
*
|
|
4
|
-
* Integrates with Vite's built-in error overlay (`server.ssrFixStacktrace` +
|
|
5
|
-
* `server.hot.send`) rather than implementing a custom overlay.
|
|
6
|
-
*
|
|
7
|
-
* Design doc: 21-dev-server.md §"Error Overlay"
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { ViteDevServer } from 'vite';
|
|
11
|
-
|
|
12
|
-
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
13
|
-
|
|
14
|
-
/** The phase of the pipeline where the error occurred. */
|
|
15
|
-
export type ErrorPhase =
|
|
16
|
-
| 'module-transform'
|
|
17
|
-
| 'proxy'
|
|
18
|
-
| 'middleware'
|
|
19
|
-
| 'access'
|
|
20
|
-
| 'render'
|
|
21
|
-
| 'handler';
|
|
22
|
-
|
|
23
|
-
/** Labels for terminal output. */
|
|
24
|
-
const PHASE_LABELS: Record<ErrorPhase, string> = {
|
|
25
|
-
'module-transform': 'Module Transform',
|
|
26
|
-
'proxy': 'Proxy',
|
|
27
|
-
'middleware': 'Middleware',
|
|
28
|
-
'access': 'Access Check',
|
|
29
|
-
'render': 'RSC Render',
|
|
30
|
-
'handler': 'Route Handler',
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
// ─── Frame Classification ───────────────────────────────────────────────────
|
|
34
|
-
|
|
35
|
-
export type FrameType = 'app' | 'framework' | 'internal';
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Classify a stack frame line by origin.
|
|
39
|
-
*
|
|
40
|
-
* - 'app': user application code (in project root, not node_modules)
|
|
41
|
-
* - 'framework': timber-app internal code
|
|
42
|
-
* - 'internal': node_modules, Node.js internals
|
|
43
|
-
*/
|
|
44
|
-
export function classifyFrame(frameLine: string, projectRoot: string): FrameType {
|
|
45
|
-
// Strip leading whitespace and "at "
|
|
46
|
-
const trimmed = frameLine.trim();
|
|
47
|
-
|
|
48
|
-
if (trimmed.includes('packages/timber-app/')) return 'framework';
|
|
49
|
-
if (trimmed.includes('node_modules/')) return 'internal';
|
|
50
|
-
if (trimmed.startsWith('at node:') || trimmed.includes('(node:')) return 'internal';
|
|
51
|
-
if (trimmed.includes(projectRoot)) return 'app';
|
|
52
|
-
|
|
53
|
-
return 'internal';
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// ─── Component Stack Extraction ─────────────────────────────────────────────
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Extract the React component stack from an error, if present.
|
|
60
|
-
* React attaches this as `componentStack` during renderToReadableStream errors.
|
|
61
|
-
*/
|
|
62
|
-
export function extractComponentStack(error: unknown): string | null {
|
|
63
|
-
if (
|
|
64
|
-
error &&
|
|
65
|
-
typeof error === 'object' &&
|
|
66
|
-
'componentStack' in error &&
|
|
67
|
-
typeof (error as Record<string, unknown>).componentStack === 'string'
|
|
68
|
-
) {
|
|
69
|
-
return (error as Record<string, unknown>).componentStack as string;
|
|
70
|
-
}
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// ─── First App Frame Parsing ────────────────────────────────────────────────
|
|
75
|
-
|
|
76
|
-
interface SourceLocation {
|
|
77
|
-
file: string;
|
|
78
|
-
line: number;
|
|
79
|
-
column: number;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Parse the first application frame from a stack trace.
|
|
84
|
-
* Returns file/line/column for the overlay's `loc` field.
|
|
85
|
-
*/
|
|
86
|
-
export function parseFirstAppFrame(stack: string, projectRoot: string): SourceLocation | null {
|
|
87
|
-
const lines = stack.split('\n');
|
|
88
|
-
// Match patterns like:
|
|
89
|
-
// at functionName (/absolute/path:line:column)
|
|
90
|
-
// at /absolute/path:line:column
|
|
91
|
-
const parenRegex = /\(([^)]+):(\d+):(\d+)\)/;
|
|
92
|
-
const bareRegex = /at (\/[^:]+):(\d+):(\d+)/;
|
|
93
|
-
|
|
94
|
-
for (const line of lines) {
|
|
95
|
-
if (classifyFrame(line, projectRoot) !== 'app') continue;
|
|
96
|
-
|
|
97
|
-
const match = parenRegex.exec(line) ?? bareRegex.exec(line);
|
|
98
|
-
if (!match) continue;
|
|
99
|
-
|
|
100
|
-
const [, file, lineNum, col] = match;
|
|
101
|
-
if (file && lineNum && col) {
|
|
102
|
-
return { file, line: parseInt(lineNum, 10), column: parseInt(col, 10) };
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// ─── Error Phase Classification ─────────────────────────────────────────────
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Classify the error phase by inspecting the error's stack trace.
|
|
113
|
-
* Falls back to 'render' if no specific phase can be determined.
|
|
114
|
-
*/
|
|
115
|
-
export function classifyErrorPhase(error: Error, projectRoot: string): ErrorPhase {
|
|
116
|
-
const stack = error.stack ?? '';
|
|
117
|
-
|
|
118
|
-
// Check for React component stack (render error)
|
|
119
|
-
if (extractComponentStack(error)) return 'render';
|
|
120
|
-
|
|
121
|
-
// Check for specific file patterns in app frames
|
|
122
|
-
const appRoot = projectRoot.replace(/\/$/, '');
|
|
123
|
-
if (stack.includes(`${appRoot}/app/`) || stack.includes('/app/')) {
|
|
124
|
-
if (stack.includes('/middleware.ts') || stack.includes('/middleware.js')) return 'middleware';
|
|
125
|
-
if (stack.includes('/access.ts') || stack.includes('/access.js')) return 'access';
|
|
126
|
-
if (stack.includes('/route.ts') || stack.includes('/route.js')) return 'handler';
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return 'render';
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// ─── Terminal Formatting ────────────────────────────────────────────────────
|
|
133
|
-
|
|
134
|
-
// ANSI codes
|
|
135
|
-
const RED = '\x1b[31m';
|
|
136
|
-
const DIM = '\x1b[2m';
|
|
137
|
-
const RESET = '\x1b[0m';
|
|
138
|
-
const BOLD = '\x1b[1m';
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Format an error for terminal output.
|
|
142
|
-
*
|
|
143
|
-
* - Red for the error message and phase label
|
|
144
|
-
* - Dim for framework-internal frames
|
|
145
|
-
* - Normal for application frames
|
|
146
|
-
* - Separate section for component stack (if present)
|
|
147
|
-
*/
|
|
148
|
-
export function formatTerminalError(error: Error, phase: ErrorPhase, projectRoot: string): string {
|
|
149
|
-
const lines: string[] = [];
|
|
150
|
-
|
|
151
|
-
// Phase header + error message
|
|
152
|
-
lines.push(`${RED}${BOLD}[timber] ${PHASE_LABELS[phase]} Error${RESET}`);
|
|
153
|
-
lines.push(`${RED}${error.message}${RESET}`);
|
|
154
|
-
lines.push('');
|
|
155
|
-
|
|
156
|
-
// Component stack (if present)
|
|
157
|
-
const componentStack = extractComponentStack(error);
|
|
158
|
-
if (componentStack) {
|
|
159
|
-
lines.push(`${BOLD}Component Stack:${RESET}`);
|
|
160
|
-
for (const csLine of componentStack.trim().split('\n')) {
|
|
161
|
-
lines.push(` ${csLine.trim()}`);
|
|
162
|
-
}
|
|
163
|
-
lines.push('');
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Stack trace with frame dimming
|
|
167
|
-
if (error.stack) {
|
|
168
|
-
lines.push(`${BOLD}Stack Trace:${RESET}`);
|
|
169
|
-
const stackLines = error.stack.split('\n').slice(1); // Skip the first line (message)
|
|
170
|
-
for (const stackLine of stackLines) {
|
|
171
|
-
const frameType = classifyFrame(stackLine, projectRoot);
|
|
172
|
-
if (frameType === 'app') {
|
|
173
|
-
lines.push(stackLine);
|
|
174
|
-
} else {
|
|
175
|
-
lines.push(`${DIM}${stackLine}${RESET}`);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return lines.join('\n');
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// ─── Overlay Integration ────────────────────────────────────────────────────
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Send an error to Vite's browser overlay and log it to stderr.
|
|
187
|
-
*
|
|
188
|
-
* Uses `server.ssrFixStacktrace()` to map stack traces back to source,
|
|
189
|
-
* then sends the error via `server.hot.send()` for the browser overlay.
|
|
190
|
-
*
|
|
191
|
-
* The dev server remains running — errors are handled, not fatal.
|
|
192
|
-
*/
|
|
193
|
-
export function sendErrorToOverlay(
|
|
194
|
-
server: ViteDevServer,
|
|
195
|
-
error: Error,
|
|
196
|
-
phase: ErrorPhase,
|
|
197
|
-
projectRoot: string
|
|
198
|
-
): void {
|
|
199
|
-
// Fix stack trace to use source-mapped positions
|
|
200
|
-
server.ssrFixStacktrace(error);
|
|
201
|
-
|
|
202
|
-
// Log to stderr with frame dimming
|
|
203
|
-
const formatted = formatTerminalError(error, phase, projectRoot);
|
|
204
|
-
process.stderr.write(`${formatted}\n`);
|
|
205
|
-
|
|
206
|
-
// Build overlay payload
|
|
207
|
-
const loc = parseFirstAppFrame(error.stack ?? '', projectRoot);
|
|
208
|
-
const componentStack = extractComponentStack(error);
|
|
209
|
-
|
|
210
|
-
let message = error.message;
|
|
211
|
-
if (componentStack) {
|
|
212
|
-
message = `${error.message}\n\nComponent Stack:\n${componentStack.trim()}`;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Send to browser via Vite's error overlay protocol
|
|
216
|
-
try {
|
|
217
|
-
server.hot.send({
|
|
218
|
-
type: 'error',
|
|
219
|
-
err: {
|
|
220
|
-
message,
|
|
221
|
-
stack: error.stack ?? '',
|
|
222
|
-
id: loc?.file,
|
|
223
|
-
plugin: `timber (${PHASE_LABELS[phase]})`,
|
|
224
|
-
loc: loc ? { file: loc.file, line: loc.line, column: loc.column } : undefined,
|
|
225
|
-
},
|
|
226
|
-
});
|
|
227
|
-
} catch {
|
|
228
|
-
// Overlay send must never crash the dev server
|
|
229
|
-
}
|
|
230
|
-
}
|