@timber-js/app 0.2.0-alpha.1 → 0.2.0-alpha.100
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-CQ8Z8VGL.js +1061 -0
- package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
- package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
- package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/define-B-Q_UMOD.js +195 -0
- package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
- package/dist/_chunks/define-CfBPoJb0.js +123 -0
- package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
- package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
- package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
- package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
- package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
- package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
- package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
- package/dist/_chunks/logger-0m8MsKdc.js +291 -0
- package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
- package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
- package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
- package/dist/_chunks/{metadata-routes-CQCnF4VK.js → metadata-routes-BU684ls2.js} +1 -1
- package/dist/_chunks/{metadata-routes-CQCnF4VK.js.map → metadata-routes-BU684ls2.js.map} +1 -1
- package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
- package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
- package/dist/_chunks/registry-I2ss-lvy.js +20 -0
- package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
- package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
- package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
- package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
- package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
- package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
- package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
- package/dist/_chunks/{ssr-data-DLnbYpj1.js → ssr-data-B4CdH7rE.js} +1 -1
- package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
- package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
- package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
- package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
- package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
- package/dist/_chunks/{use-query-states-DAhgj8Gx.js → use-query-states-B2XTqxDR.js} +7 -20
- package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
- package/dist/_chunks/use-segment-params-BkpKAQ7D.js +185 -0
- package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
- package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
- package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
- package/dist/_chunks/{format-DNt20Kt8.js → warnings-Cg47l5sk.js} +7 -45
- package/dist/_chunks/warnings-Cg47l5sk.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/fast-hash.d.ts +22 -0
- package/dist/cache/fast-hash.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 +195 -84
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +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 +26 -5
- 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 +312 -1109
- 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 +73 -63
- 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 +22 -5
- 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-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-merger.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 +8 -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} +7 -5
- package/dist/client/use-segment-params.d.ts.map +1 -0
- 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 +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 +98 -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 +36 -72
- 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/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +4 -2
- package/dist/fonts/local.d.ts.map +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 +64 -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 +103 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -152
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14702 -12350
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +16 -4
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/chunks.d.ts +9 -1
- package/dist/plugins/chunks.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 +8 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -65
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +7 -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-shared.d.ts +55 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +52 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +5 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -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/segment-classify.d.ts +75 -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 +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 +33 -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/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 +82 -0
- package/dist/server/debug.d.ts.map +1 -0
- 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 +212 -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 +9 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +158 -2899
- 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 +2900 -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 +110 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +26 -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 +93 -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 +41 -109
- 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 +20 -3
- 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 +20 -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/rsc-prop-warnings.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +23 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/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 +15 -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/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/server/waituntil-bridge.d.ts.map +1 -1
- 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/directive-parser.d.ts +1 -43
- 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 +56 -22
- 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 +148 -60
- 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/fast-hash.ts +34 -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 +41 -29
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +143 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +97 -20
- 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 +77 -43
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +432 -140
- 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 +83 -18
- 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 +303 -78
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-context.ts +6 -1
- package/src/client/segment-merger.ts +2 -8
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +74 -7
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +41 -25
- package/src/client/use-cookie.ts +29 -0
- 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} +7 -5
- package/src/codec.ts +45 -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 +301 -55
- 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 +288 -0
- package/src/dev-tools/error-page.ts +509 -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} +3 -3
- package/src/dev-tools/overlay.ts +456 -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} +6 -50
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +7 -3
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +406 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +227 -0
- package/src/index.ts +376 -315
- 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 +32 -21
- package/src/plugins/chunks.ts +9 -1
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +154 -21
- package/src/plugins/entries.ts +119 -12
- package/src/plugins/fonts.ts +177 -524
- package/src/plugins/mdx.ts +52 -15
- package/src/plugins/routing.ts +225 -41
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +36 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen-shared.ts +98 -0
- package/src/routing/codegen-types.ts +53 -0
- package/src/routing/codegen.ts +143 -176
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +5 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +294 -0
- package/src/routing/scanner.ts +107 -110
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/status-file-lint.ts +10 -7
- 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 +332 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +79 -36
- package/src/server/action-client.ts +103 -20
- 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 +35 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- 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 +137 -0
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +33 -51
- 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 +403 -0
- package/src/server/html-injectors.ts +244 -223
- package/src/server/index.ts +31 -184
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -35
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +369 -0
- package/src/server/param-coercion.ts +76 -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 +167 -0
- package/src/server/pipeline-phases.ts +409 -0
- package/src/server/pipeline.ts +128 -387
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +113 -29
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +94 -337
- package/src/server/route-element-builder.ts +289 -198
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +44 -65
- 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 +136 -12
- package/src/server/rsc-entry/index.ts +330 -312
- package/src/server/rsc-entry/render-route.ts +304 -0
- package/src/server/rsc-entry/rsc-payload.ts +100 -18
- package/src/server/rsc-entry/rsc-stream.ts +90 -17
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +177 -37
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/rsc-prop-warnings.ts +3 -1
- 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 +245 -230
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/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 +44 -10
- package/src/server/tree-builder.ts +202 -90
- 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/server/waituntil-bridge.ts +4 -1
- 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/directive-parser.ts +1 -390
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-k-AtAQ9R.js +0 -41
- package/dist/_chunks/als-registry-k-AtAQ9R.js.map +0 -1
- package/dist/_chunks/format-DNt20Kt8.js.map +0 -1
- package/dist/_chunks/interception-DGDIjDbR.js +0 -676
- package/dist/_chunks/interception-DGDIjDbR.js.map +0 -1
- package/dist/_chunks/request-context-CRj2Zh1E.js +0 -329
- package/dist/_chunks/request-context-CRj2Zh1E.js.map +0 -1
- package/dist/_chunks/ssr-data-DLnbYpj1.js.map +0 -1
- package/dist/_chunks/tracing-DF0G3FB7.js +0 -173
- package/dist/_chunks/tracing-DF0G3FB7.js.map +0 -1
- package/dist/_chunks/use-cookie-dDbpCTx-.js +0 -91
- package/dist/_chunks/use-cookie-dDbpCTx-.js.map +0 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.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 -22
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/browser-links.d.ts +0 -32
- package/dist/client/browser-links.d.ts.map +0 -1
- package/dist/client/link-navigate-interceptor.d.ts +0 -28
- package/dist/client/link-navigate-interceptor.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/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/src/cache/register-cached-function.ts +0 -99
- package/src/client/browser-entry.ts +0 -686
- package/src/client/browser-links.ts +0 -90
- package/src/client/link-navigate-interceptor.tsx +0 -62
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -160
- 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/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/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -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
|
-
}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* timber-dynamic-transform — Vite sub-plugin for 'use dynamic' directive.
|
|
3
|
-
*
|
|
4
|
-
* Detects `'use dynamic'` directives in server component function bodies
|
|
5
|
-
* and transforms them into `markDynamic()` runtime calls. The directive
|
|
6
|
-
* declares a dynamic boundary — the component and its subtree opt out of
|
|
7
|
-
* the pre-rendered shell and render per-request.
|
|
8
|
-
*
|
|
9
|
-
* - In `output: 'static'` mode, `'use dynamic'` is a build error.
|
|
10
|
-
* - In standard SSR routes (no prerender.ts), the directive is a no-op
|
|
11
|
-
* (everything is already per-request), but the transform still runs
|
|
12
|
-
* so the runtime can skip unnecessary work.
|
|
13
|
-
*
|
|
14
|
-
* Design doc: design/15-future-prerendering.md §"'use dynamic'"
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { Plugin } from 'vite';
|
|
18
|
-
import type { PluginContext } from '#/index.js';
|
|
19
|
-
import { findFunctionsWithDirective, containsDirective } from '#/utils/directive-parser.js';
|
|
20
|
-
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
// Detection
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Quick check: does this source file contain 'use dynamic' anywhere?
|
|
27
|
-
* Used as a fast bail-out before doing expensive AST parsing.
|
|
28
|
-
*/
|
|
29
|
-
export function containsUseDynamic(code: string): boolean {
|
|
30
|
-
return containsDirective(code, 'use dynamic');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// Transform
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
|
|
37
|
-
interface TransformResult {
|
|
38
|
-
code: string;
|
|
39
|
-
map?: null;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Find function declarations/expressions containing 'use dynamic' and
|
|
44
|
-
* transform them into markDynamic() calls.
|
|
45
|
-
*
|
|
46
|
-
* Input:
|
|
47
|
-
* ```tsx
|
|
48
|
-
* export default async function AddToCartButton({ productId }) {
|
|
49
|
-
* 'use dynamic'
|
|
50
|
-
* const user = await getUser()
|
|
51
|
-
* return <button>Add to cart</button>
|
|
52
|
-
* }
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* Output:
|
|
56
|
-
* ```tsx
|
|
57
|
-
* import { markDynamic as __markDynamic } from '@timber-js/app/runtime';
|
|
58
|
-
* export default async function AddToCartButton({ productId }) {
|
|
59
|
-
* __markDynamic();
|
|
60
|
-
* const user = await getUser()
|
|
61
|
-
* return <button>Add to cart</button>
|
|
62
|
-
* }
|
|
63
|
-
* ```
|
|
64
|
-
*
|
|
65
|
-
* The markDynamic() call registers the component boundary as dynamic
|
|
66
|
-
* at render time. The pre-render pass uses this to know which subtrees
|
|
67
|
-
* to skip and leave as holes for per-request rendering.
|
|
68
|
-
*/
|
|
69
|
-
export function transformUseDynamic(code: string): TransformResult | null {
|
|
70
|
-
if (!containsUseDynamic(code)) return null;
|
|
71
|
-
|
|
72
|
-
const functions = findFunctionsWithDirective(code, 'use dynamic');
|
|
73
|
-
if (functions.length === 0) return null;
|
|
74
|
-
|
|
75
|
-
// Replace directive strings with __markDynamic() calls, processing
|
|
76
|
-
// from end to start to preserve source offsets
|
|
77
|
-
let result = code;
|
|
78
|
-
for (const fn of functions) {
|
|
79
|
-
// Replace the directive in the body content
|
|
80
|
-
const cleanBody = fn.bodyContent.replace(/['"]use dynamic['"];?/, '__markDynamic();');
|
|
81
|
-
// Reconstruct: replace the body content between braces
|
|
82
|
-
result = result.slice(0, fn.bodyStart) + cleanBody + result.slice(fn.bodyEnd);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Add the import at the top
|
|
86
|
-
result = `import { markDynamic as __markDynamic } from '@timber-js/app/runtime';\n` + result;
|
|
87
|
-
|
|
88
|
-
return { code: result, map: null };
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
|
-
// Static mode validation
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* In `output: 'static'` mode, `'use dynamic'` is a build error.
|
|
97
|
-
* Static mode renders everything at build time — there is no per-request
|
|
98
|
-
* rendering to opt into.
|
|
99
|
-
*/
|
|
100
|
-
export function validateNoDynamicInStaticMode(
|
|
101
|
-
code: string
|
|
102
|
-
): { message: string; line?: number } | null {
|
|
103
|
-
if (!containsUseDynamic(code)) return null;
|
|
104
|
-
|
|
105
|
-
const functions = findFunctionsWithDirective(code, 'use dynamic');
|
|
106
|
-
if (functions.length === 0) return null;
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
message:
|
|
110
|
-
`'use dynamic' cannot be used in static mode (output: 'static'). ` +
|
|
111
|
-
`Static mode renders all content at build time — there is no per-request rendering. ` +
|
|
112
|
-
`Remove the directive or switch to output: 'server'.`,
|
|
113
|
-
line: functions[functions.length - 1].directiveLine, // First occurrence (sorted descending)
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// ---------------------------------------------------------------------------
|
|
118
|
-
// Vite Plugin
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Create the timber-dynamic-transform Vite plugin.
|
|
123
|
-
*
|
|
124
|
-
* In server mode: transforms 'use dynamic' into markDynamic() calls.
|
|
125
|
-
* In static mode: rejects 'use dynamic' as a build error.
|
|
126
|
-
*/
|
|
127
|
-
export function timberDynamicTransform(ctx: PluginContext): Plugin {
|
|
128
|
-
const isStatic = ctx.config.output === 'static';
|
|
129
|
-
|
|
130
|
-
return {
|
|
131
|
-
name: 'timber-dynamic-transform',
|
|
132
|
-
|
|
133
|
-
transform(code: string, id: string) {
|
|
134
|
-
// Skip node_modules
|
|
135
|
-
if (id.includes('node_modules')) return null;
|
|
136
|
-
|
|
137
|
-
// Only check files in the app directory
|
|
138
|
-
if (!id.includes('/app/') && !id.startsWith('app/')) return null;
|
|
139
|
-
|
|
140
|
-
// Only check JS/TS files
|
|
141
|
-
if (!/\.[jt]sx?$/.test(id)) return null;
|
|
142
|
-
|
|
143
|
-
// Quick bail-out
|
|
144
|
-
if (!containsUseDynamic(code)) return null;
|
|
145
|
-
|
|
146
|
-
// In static mode, 'use dynamic' is a build error
|
|
147
|
-
if (isStatic) {
|
|
148
|
-
const error = validateNoDynamicInStaticMode(code);
|
|
149
|
-
if (error) {
|
|
150
|
-
this.error(
|
|
151
|
-
`[timber] Static mode error in ${id}${error.line ? `:${error.line}` : ''}: ${error.message}`
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// In server mode, transform the directive
|
|
158
|
-
return transformUseDynamic(code);
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
}
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Static analyzability checker for search-params.ts files.
|
|
3
|
-
*
|
|
4
|
-
* Validates that a search-params.ts file's default export is statically
|
|
5
|
-
* analyzable — a createSearchParams() call or a chain of .extend()/.pick()
|
|
6
|
-
* calls on a SearchParamsDefinition.
|
|
7
|
-
*
|
|
8
|
-
* Non-analyzable files produce a hard build error with a diagnostic.
|
|
9
|
-
*
|
|
10
|
-
* Design doc: design/09-typescript.md §"Static Analyzability"
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
// Types
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
|
|
17
|
-
/** Result of analyzing a search-params.ts file. */
|
|
18
|
-
export interface AnalyzeResult {
|
|
19
|
-
/** Whether the file is statically analyzable. */
|
|
20
|
-
valid: boolean;
|
|
21
|
-
/** Error details when valid is false. */
|
|
22
|
-
error?: AnalyzeError;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Diagnostic error for non-analyzable search-params.ts. */
|
|
26
|
-
export interface AnalyzeError {
|
|
27
|
-
/** Absolute file path. */
|
|
28
|
-
filePath: string;
|
|
29
|
-
/** Description of the non-analyzable expression. */
|
|
30
|
-
expression: string;
|
|
31
|
-
/** Suggested fix. */
|
|
32
|
-
suggestion: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// AST-free source analysis
|
|
37
|
-
//
|
|
38
|
-
// We use a lightweight regex-based approach to validate the structure of the
|
|
39
|
-
// default export. This avoids requiring a TypeScript compiler instance at
|
|
40
|
-
// build time for the initial validation pass. The full type extraction
|
|
41
|
-
// (reading T from SearchParamsDefinition<T>) still happens via the TypeScript
|
|
42
|
-
// compiler in the codegen step — this module just validates the *shape*.
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Patterns that indicate a valid default export:
|
|
47
|
-
*
|
|
48
|
-
* 1. `export default createSearchParams(...)`
|
|
49
|
-
* 2. `export default someVar.extend(...)`
|
|
50
|
-
* 3. `export default someVar.pick(...)`
|
|
51
|
-
* 4. `export default someVar.extend(...).extend(...)` (chained)
|
|
52
|
-
* 5. `export default someVar.extend(...).pick(...)` (chained)
|
|
53
|
-
* 6. `export default createSearchParams(...).extend(...)`
|
|
54
|
-
*
|
|
55
|
-
* Invalid patterns:
|
|
56
|
-
* - `export default someFunction(...)` (arbitrary factory)
|
|
57
|
-
* - `export default condition ? a : b` (runtime conditional)
|
|
58
|
-
* - `export default variable` (opaque reference without call)
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Analyze a search-params.ts file source for static analyzability.
|
|
63
|
-
*
|
|
64
|
-
* @param source - The file content as a string
|
|
65
|
-
* @param filePath - Absolute path to the file (for diagnostics)
|
|
66
|
-
*/
|
|
67
|
-
export function analyzeSearchParams(source: string, filePath: string): AnalyzeResult {
|
|
68
|
-
// Strip comments to avoid false matches
|
|
69
|
-
const stripped = stripComments(source);
|
|
70
|
-
|
|
71
|
-
// Find the default export
|
|
72
|
-
const defaultExport = extractDefaultExport(stripped);
|
|
73
|
-
|
|
74
|
-
if (!defaultExport) {
|
|
75
|
-
return {
|
|
76
|
-
valid: false,
|
|
77
|
-
error: {
|
|
78
|
-
filePath,
|
|
79
|
-
expression: '(no default export found)',
|
|
80
|
-
suggestion:
|
|
81
|
-
'search-params.ts must have a default export. Use: export default createSearchParams({ ... })',
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Validate the expression
|
|
87
|
-
if (isValidExpression(defaultExport.trim())) {
|
|
88
|
-
return { valid: true };
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return {
|
|
92
|
-
valid: false,
|
|
93
|
-
error: {
|
|
94
|
-
filePath,
|
|
95
|
-
expression: defaultExport.trim(),
|
|
96
|
-
suggestion:
|
|
97
|
-
'The default export must be a createSearchParams() call, or a chain of ' +
|
|
98
|
-
'.extend() / .pick() calls on a SearchParamsDefinition. Arbitrary factory ' +
|
|
99
|
-
'functions and runtime conditionals are not supported.',
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// ---------------------------------------------------------------------------
|
|
105
|
-
// Internal helpers
|
|
106
|
-
// ---------------------------------------------------------------------------
|
|
107
|
-
|
|
108
|
-
/** Strip single-line and multi-line comments from source. */
|
|
109
|
-
function stripComments(source: string): string {
|
|
110
|
-
// Remove multi-line comments
|
|
111
|
-
let result = source.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
112
|
-
// Remove single-line comments
|
|
113
|
-
result = result.replace(/\/\/.*$/gm, '');
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Extract the expression from `export default <expr>`.
|
|
119
|
-
*
|
|
120
|
-
* Handles both:
|
|
121
|
-
* export default createSearchParams(...)
|
|
122
|
-
* export default expr\n (terminated by newline or semicolon before next statement)
|
|
123
|
-
*/
|
|
124
|
-
function extractDefaultExport(source: string): string | undefined {
|
|
125
|
-
// Match `export default` followed by the expression
|
|
126
|
-
const match = source.match(
|
|
127
|
-
/export\s+default\s+([\s\S]+?)(?:;|\n(?=export|import|const|let|var|function|class|type|interface|declare))/
|
|
128
|
-
);
|
|
129
|
-
if (match) {
|
|
130
|
-
return match[1];
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Fallback: match everything after `export default` to end of file
|
|
134
|
-
const fallback = source.match(/export\s+default\s+([\s\S]+)$/);
|
|
135
|
-
if (fallback) {
|
|
136
|
-
return fallback[1].replace(/;\s*$/, '');
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return undefined;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Check if an expression is a valid statically-analyzable pattern.
|
|
144
|
-
*
|
|
145
|
-
* Valid patterns:
|
|
146
|
-
* - Starts with `createSearchParams(`
|
|
147
|
-
* - Contains `.extend(` or `.pick(` chains (possibly starting with createSearchParams or a variable)
|
|
148
|
-
* - A variable identifier followed by chaining
|
|
149
|
-
*/
|
|
150
|
-
function isValidExpression(expr: string): boolean {
|
|
151
|
-
// Normalize whitespace
|
|
152
|
-
const normalized = expr.replace(/\s+/g, ' ').trim();
|
|
153
|
-
|
|
154
|
-
// Pattern 1: starts with createSearchParams(
|
|
155
|
-
if (normalized.startsWith('createSearchParams(')) {
|
|
156
|
-
return true;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Pattern 2: chain ending with .extend(...) or .pick(...)
|
|
160
|
-
// This covers: someVar.extend(...), createSearchParams(...).extend(...).pick(...), etc.
|
|
161
|
-
if (/\.(extend|pick)\s*\(/.test(normalized)) {
|
|
162
|
-
// Reject ternaries and other conditional patterns
|
|
163
|
-
if (/\?/.test(normalized) && /:/.test(normalized)) {
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
// Reject function declarations/expressions
|
|
167
|
-
if (/^\s*(function|=>|\()/.test(normalized)) {
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
return true;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Format an AnalyzeError into a human-readable build error message.
|
|
178
|
-
*/
|
|
179
|
-
export function formatAnalyzeError(error: AnalyzeError): string {
|
|
180
|
-
return [
|
|
181
|
-
`[timber] Non-analyzable search-params.ts`,
|
|
182
|
-
``,
|
|
183
|
-
` File: ${error.filePath}`,
|
|
184
|
-
` Expression: ${error.expression}`,
|
|
185
|
-
``,
|
|
186
|
-
` ${error.suggestion}`,
|
|
187
|
-
``,
|
|
188
|
-
` The framework must be able to statically extract the type from your`,
|
|
189
|
-
` search-params.ts at build time. Dynamic values, conditionals, and`,
|
|
190
|
-
` arbitrary factory functions prevent this analysis.`,
|
|
191
|
-
].join('\n');
|
|
192
|
-
}
|