@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
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal error formatting — boxed, color-coded error output for dev mode.
|
|
3
|
+
*
|
|
4
|
+
* Produces a visually scannable error block with:
|
|
5
|
+
* - Unicode box-drawing border around the error
|
|
6
|
+
* - Phase badge and error message
|
|
7
|
+
* - First app frame highlighted as the primary action item
|
|
8
|
+
* - OSC 8 clickable file:line links (VSCode terminal, iTerm2, etc.)
|
|
9
|
+
* - Internal/framework frames collapsed with a count
|
|
10
|
+
* - Component stack (for React render errors)
|
|
11
|
+
*
|
|
12
|
+
* Dev-only: this module is only imported by dev-error-overlay.ts.
|
|
13
|
+
*
|
|
14
|
+
* Design doc: 21-dev-server.md §"Error Overlay"
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { pathToFileURL } from 'node:url';
|
|
18
|
+
import {
|
|
19
|
+
extractComponentStack,
|
|
20
|
+
parseFirstAppFrame,
|
|
21
|
+
PHASE_LABELS,
|
|
22
|
+
type ErrorPhase,
|
|
23
|
+
} from './overlay.js';
|
|
24
|
+
import { classifyStack } from './stack-classifier.js';
|
|
25
|
+
|
|
26
|
+
// ─── ANSI Codes ─────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
const RED = '\x1b[31m';
|
|
29
|
+
const CYAN = '\x1b[36m';
|
|
30
|
+
const DIM = '\x1b[2m';
|
|
31
|
+
const RESET = '\x1b[0m';
|
|
32
|
+
const BOLD = '\x1b[1m';
|
|
33
|
+
const UNDERLINE = '\x1b[4m';
|
|
34
|
+
|
|
35
|
+
// ─── OSC 8 Hyperlinks ──────────────────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Wrap text in an OSC 8 hyperlink escape sequence.
|
|
39
|
+
*
|
|
40
|
+
* Terminals that support OSC 8 (VSCode, iTerm2, Windows Terminal, etc.)
|
|
41
|
+
* render this as a clickable link. Others ignore the escape sequences
|
|
42
|
+
* and show the text normally.
|
|
43
|
+
*
|
|
44
|
+
* Format: \x1b]8;;URL\x07TEXT\x1b]8;;\x07
|
|
45
|
+
*/
|
|
46
|
+
function hyperlink(text: string, url: string): string {
|
|
47
|
+
return `\x1b]8;;${url}\x07${text}\x1b]8;;\x07`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Format a file:line:col reference as a clickable terminal link.
|
|
52
|
+
*
|
|
53
|
+
* Uses file:// URLs so terminals open the file in the configured editor.
|
|
54
|
+
* The link text is styled with cyan + underline for visibility.
|
|
55
|
+
*/
|
|
56
|
+
function fileLink(filePath: string, line?: number, col?: number): string {
|
|
57
|
+
const display = line ? `${filePath}:${line}${col ? `:${col}` : ''}` : filePath;
|
|
58
|
+
// Use pathToFileURL for proper encoding of spaces, #, ?, and Windows
|
|
59
|
+
// drive letters (TIM-792). Append :line:col after the URL.
|
|
60
|
+
const base = pathToFileURL(filePath).href;
|
|
61
|
+
const url = line ? `${base}:${line}${col ? `:${col}` : ''}` : base;
|
|
62
|
+
return `${CYAN}${UNDERLINE}${hyperlink(display, url)}${RESET}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ─── Box Drawing ────────────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
const BOX = {
|
|
68
|
+
topLeft: '╭',
|
|
69
|
+
topRight: '╮',
|
|
70
|
+
bottomLeft: '╰',
|
|
71
|
+
bottomRight: '╯',
|
|
72
|
+
horizontal: '─',
|
|
73
|
+
vertical: '│',
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Wrap lines of text in a Unicode box with a colored left border.
|
|
78
|
+
*
|
|
79
|
+
* @param lines - Content lines (no ANSI length calculation — keeps it simple)
|
|
80
|
+
* @param width - Box width (characters). Lines longer than this are not truncated.
|
|
81
|
+
*/
|
|
82
|
+
function box(lines: string[], borderColor: string, width = 80): string {
|
|
83
|
+
const bar = BOX.horizontal.repeat(width - 2);
|
|
84
|
+
const output: string[] = [];
|
|
85
|
+
|
|
86
|
+
output.push(`${borderColor}${BOX.topLeft}${bar}${BOX.topRight}${RESET}`);
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
output.push(`${borderColor}${BOX.vertical}${RESET} ${line}`);
|
|
89
|
+
}
|
|
90
|
+
output.push(`${borderColor}${BOX.bottomLeft}${bar}${BOX.bottomRight}${RESET}`);
|
|
91
|
+
|
|
92
|
+
return output.join('\n');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Frame classification and parsing provided by stack-classifier.ts
|
|
96
|
+
|
|
97
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Format an error for terminal output with a boxed layout.
|
|
101
|
+
*
|
|
102
|
+
* The output is designed to be scannable at a glance:
|
|
103
|
+
* 1. Red box with phase badge and error message
|
|
104
|
+
* 2. First app frame as a clickable link (the primary action item)
|
|
105
|
+
* 3. App frames listed normally
|
|
106
|
+
* 4. Internal/framework frames collapsed with count
|
|
107
|
+
* 5. Component stack (if present)
|
|
108
|
+
*/
|
|
109
|
+
export function formatTerminalError(error: Error, phase: ErrorPhase, projectRoot: string): string {
|
|
110
|
+
const sections: string[] = [];
|
|
111
|
+
const componentStack = extractComponentStack(error);
|
|
112
|
+
const loc = parseFirstAppFrame(error.stack ?? '', projectRoot);
|
|
113
|
+
const frames = error.stack ? classifyStack(error.stack, projectRoot) : [];
|
|
114
|
+
const appFrames = frames.filter((f) => f.type === 'app');
|
|
115
|
+
const internalCount = frames.filter((f) => f.type !== 'app').length;
|
|
116
|
+
|
|
117
|
+
// ── Box: Phase + Message ──────────────────────────────────────────
|
|
118
|
+
const boxLines: string[] = [];
|
|
119
|
+
boxLines.push(`${RED}${BOLD}${PHASE_LABELS[phase]} Error${RESET}`);
|
|
120
|
+
boxLines.push('');
|
|
121
|
+
|
|
122
|
+
// Error message — may be multi-line
|
|
123
|
+
for (const msgLine of error.message.split('\n')) {
|
|
124
|
+
boxLines.push(`${RED}${msgLine}${RESET}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Primary file location (clickable)
|
|
128
|
+
if (loc) {
|
|
129
|
+
boxLines.push('');
|
|
130
|
+
const relPath = loc.file.startsWith(projectRoot)
|
|
131
|
+
? loc.file.slice(projectRoot.length + 1)
|
|
132
|
+
: loc.file;
|
|
133
|
+
boxLines.push(
|
|
134
|
+
`${BOLD}→${RESET} ${fileLink(loc.file, loc.line, loc.column)} ${DIM}(${relPath})${RESET}`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
sections.push(box(boxLines, RED));
|
|
139
|
+
|
|
140
|
+
// ── Component Stack ───────────────────────────────────────────────
|
|
141
|
+
if (componentStack) {
|
|
142
|
+
sections.push('');
|
|
143
|
+
sections.push(` ${BOLD}Component Stack:${RESET}`);
|
|
144
|
+
for (const csLine of componentStack.trim().split('\n')) {
|
|
145
|
+
sections.push(` ${DIM}${csLine.trim()}${RESET}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ── App Frames ────────────────────────────────────────────────────
|
|
150
|
+
if (appFrames.length > 0) {
|
|
151
|
+
sections.push('');
|
|
152
|
+
sections.push(` ${BOLD}Application Frames:${RESET}`);
|
|
153
|
+
for (let i = 0; i < appFrames.length; i++) {
|
|
154
|
+
const f = appFrames[i]!;
|
|
155
|
+
if (f.file && f.line) {
|
|
156
|
+
const prefix = i === 0 ? `${BOLD}▸${RESET}` : ' ';
|
|
157
|
+
sections.push(
|
|
158
|
+
` ${prefix} ${fileLink(f.file, f.line, f.col)} ${DIM}${extractFnName(f.raw)}${RESET}`
|
|
159
|
+
);
|
|
160
|
+
} else {
|
|
161
|
+
sections.push(` ${f.raw}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ── Internal Frames (collapsed) ───────────────────────────────────
|
|
167
|
+
if (internalCount > 0) {
|
|
168
|
+
sections.push(
|
|
169
|
+
` ${DIM}… ${internalCount} internal frame${internalCount !== 1 ? 's' : ''} hidden${RESET}`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
sections.push('');
|
|
174
|
+
return sections.join('\n');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
178
|
+
|
|
179
|
+
/** Extract the function name from a stack frame line like " at fnName (/path:1:2)". */
|
|
180
|
+
function extractFnName(frameLine: string): string {
|
|
181
|
+
const match = /at\s+(\S+)\s+\(/.exec(frameLine.trim());
|
|
182
|
+
return match ? match[1]! : '';
|
|
183
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import type { ViteDevServer } from 'vite';
|
|
18
|
+
import { isDebug } from '../server/debug.js';
|
|
18
19
|
|
|
19
20
|
// ─── Warning IDs ───────────────────────────────────────────────────────────
|
|
20
21
|
|
|
@@ -24,7 +25,6 @@ export const WarningId = {
|
|
|
24
25
|
REDIRECT_IN_SUSPENSE: 'REDIRECT_IN_SUSPENSE',
|
|
25
26
|
REDIRECT_IN_ACCESS: 'REDIRECT_IN_ACCESS',
|
|
26
27
|
STATIC_REQUEST_API: 'STATIC_REQUEST_API',
|
|
27
|
-
CACHE_REQUEST_PROPS: 'CACHE_REQUEST_PROPS',
|
|
28
28
|
SLOW_SLOT_NO_SUSPENSE: 'SLOW_SLOT_NO_SUSPENSE',
|
|
29
29
|
} as const;
|
|
30
30
|
|
|
@@ -54,7 +54,7 @@ export function setViteServer(server: ViteDevServer | null): void {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function isDev(): boolean {
|
|
57
|
-
return
|
|
57
|
+
return isDebug();
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/**
|
|
@@ -110,7 +110,7 @@ export function warnSuspenseWrappingChildren(layoutFile: string): void {
|
|
|
110
110
|
'warn',
|
|
111
111
|
`Layout at ${layoutFile} wraps {children} in <Suspense>. ` +
|
|
112
112
|
'This prevents child pages from setting HTTP status codes. ' +
|
|
113
|
-
'Use
|
|
113
|
+
'Use usePendingNavigation() for loading states instead.'
|
|
114
114
|
);
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -178,7 +178,7 @@ export function warnRedirectInAccess(accessFile: string, line?: number): void {
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
/**
|
|
181
|
-
* Warn when
|
|
181
|
+
* Warn when getCookies() or getHeaders() is called during a static build.
|
|
182
182
|
*
|
|
183
183
|
* In output: 'static' mode, there is no per-request context — these APIs
|
|
184
184
|
* read build-time values only. This is almost always a mistake.
|
|
@@ -196,33 +196,8 @@ export function warnStaticRequestApi(api: 'cookies' | 'headers', file: string):
|
|
|
196
196
|
);
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
*
|
|
202
|
-
* Cached components should not depend on per-request data — a userId or
|
|
203
|
-
* sessionId in the props means the cache will either be ineffective
|
|
204
|
-
* (key per user) or dangerous (serve one user's data to another).
|
|
205
|
-
*
|
|
206
|
-
* @param componentName - Name of the cached component
|
|
207
|
-
* @param propName - Name of the suspicious prop
|
|
208
|
-
* @param file - Relative path to the component file
|
|
209
|
-
* @param line - Line number
|
|
210
|
-
*/
|
|
211
|
-
export function warnCacheRequestProps(
|
|
212
|
-
componentName: string,
|
|
213
|
-
propName: string,
|
|
214
|
-
file: string,
|
|
215
|
-
line?: number
|
|
216
|
-
): void {
|
|
217
|
-
const location = line ? `${file}:${line}` : file;
|
|
218
|
-
emitOnce(
|
|
219
|
-
WarningId.CACHE_REQUEST_PROPS,
|
|
220
|
-
`${componentName}:${propName}:${location}`,
|
|
221
|
-
'warn',
|
|
222
|
-
`Cached component ${componentName} receives prop "${propName}" which appears request-specific. ` +
|
|
223
|
-
'Cached components should not depend on per-request data.'
|
|
224
|
-
);
|
|
225
|
-
}
|
|
199
|
+
// NOTE: warnCacheRequestProps removed — 'use cache' directive is a future feature.
|
|
200
|
+
// See design/06-caching.md.
|
|
226
201
|
|
|
227
202
|
/**
|
|
228
203
|
* Warn when a parallel slot resolves slowly without a <Suspense> wrapper.
|
|
@@ -244,25 +219,6 @@ export function warnSlowSlotWithoutSuspense(slotName: string, durationMs: number
|
|
|
244
219
|
);
|
|
245
220
|
}
|
|
246
221
|
|
|
247
|
-
// ─── Legacy aliases ─────────────────────────────────────────────────────────
|
|
248
|
-
|
|
249
|
-
/** @deprecated Use warnStaticRequestApi instead */
|
|
250
|
-
export const warnDynamicApiInStaticBuild = warnStaticRequestApi;
|
|
251
|
-
|
|
252
|
-
/** @deprecated Use warnRedirectInAccess instead */
|
|
253
|
-
export function warnRedirectInSlotAccess(slotName: string): void {
|
|
254
|
-
warnRedirectInAccess(`${slotName}/access.ts`);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/** @deprecated Use warnDenyInSuspense / warnRedirectInSuspense instead */
|
|
258
|
-
export function warnDenyAfterFlush(signal: 'deny' | 'redirect'): void {
|
|
259
|
-
if (signal === 'deny') {
|
|
260
|
-
warnDenyInSuspense('unknown');
|
|
261
|
-
} else {
|
|
262
|
-
warnRedirectInSuspense('unknown');
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
222
|
// ─── Testing ────────────────────────────────────────────────────────────────
|
|
267
223
|
|
|
268
224
|
/**
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-output emission for the timber-fonts plugin.
|
|
3
|
+
*
|
|
4
|
+
* Splits the `generateBundle` hook into pure helpers so the plugin shell
|
|
5
|
+
* can stay focused on Vite wiring. The functions here are deliberately
|
|
6
|
+
* Rollup-agnostic — they take an `EmitFile` callback so the plugin can
|
|
7
|
+
* pass `this.emitFile` from the `generateBundle` context.
|
|
8
|
+
*
|
|
9
|
+
* Design doc: 24-fonts.md
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
13
|
+
import { resolve, normalize } from 'node:path';
|
|
14
|
+
import type { ManifestFontEntry, BuildManifest } from '../server/build-manifest.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Minimal shape of the asset descriptor accepted by Rollup's `emitFile`.
|
|
18
|
+
* Declared inline rather than importing from `rollup` to keep `bundle.ts`
|
|
19
|
+
* Rollup-agnostic and avoid pulling the type into the build graph.
|
|
20
|
+
*/
|
|
21
|
+
interface EmittedAsset {
|
|
22
|
+
type: 'asset';
|
|
23
|
+
fileName: string;
|
|
24
|
+
source: string | Uint8Array;
|
|
25
|
+
}
|
|
26
|
+
import type { FontPipeline } from './pipeline.js';
|
|
27
|
+
import type { CachedFont } from './google.js';
|
|
28
|
+
import { inferFontFormat } from './local.js';
|
|
29
|
+
|
|
30
|
+
type EmitFile = (asset: EmittedAsset) => string;
|
|
31
|
+
type EmitWarning = (msg: string) => void;
|
|
32
|
+
|
|
33
|
+
/** Group cached Google Font binaries by lowercase family name. */
|
|
34
|
+
export function groupCachedFontsByFamily(
|
|
35
|
+
cachedFonts: readonly CachedFont[]
|
|
36
|
+
): Map<string, CachedFont[]> {
|
|
37
|
+
const cachedByFamily = new Map<string, CachedFont[]>();
|
|
38
|
+
for (const cf of cachedFonts) {
|
|
39
|
+
const key = cf.face.family.toLowerCase();
|
|
40
|
+
const arr = cachedByFamily.get(key) ?? [];
|
|
41
|
+
arr.push(cf);
|
|
42
|
+
cachedByFamily.set(key, arr);
|
|
43
|
+
}
|
|
44
|
+
return cachedByFamily;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Emit cached Google Font binaries and local font files into the build
|
|
49
|
+
* output under `_timber/fonts/`. Local files missing on disk produce a
|
|
50
|
+
* warning rather than an error so the build still succeeds.
|
|
51
|
+
*
|
|
52
|
+
* Cached Google Font binaries are deduplicated by `hashedFilename` so
|
|
53
|
+
* each unique file is written exactly once even when multiple font
|
|
54
|
+
* entries share a family (and therefore share `CachedFont` references).
|
|
55
|
+
*/
|
|
56
|
+
export function emitFontAssets(
|
|
57
|
+
pipeline: FontPipeline,
|
|
58
|
+
emitFile: EmitFile,
|
|
59
|
+
warn: EmitWarning
|
|
60
|
+
): void {
|
|
61
|
+
// Cached Google Font binaries (content-hashed, deduped by filename)
|
|
62
|
+
for (const cf of pipeline.uniqueCachedFiles()) {
|
|
63
|
+
emitFile({
|
|
64
|
+
type: 'asset',
|
|
65
|
+
fileName: `_timber/fonts/${cf.hashedFilename}`,
|
|
66
|
+
source: cf.data,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Local font files (emitted by basename)
|
|
71
|
+
for (const font of pipeline.fonts()) {
|
|
72
|
+
if (font.provider !== 'local' || !font.localSources) continue;
|
|
73
|
+
for (const src of font.localSources) {
|
|
74
|
+
const absolutePath = normalize(resolve(src.path));
|
|
75
|
+
if (!existsSync(absolutePath)) {
|
|
76
|
+
warn(`Local font file not found: ${absolutePath}`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const basename = src.path.split('/').pop() ?? src.path;
|
|
80
|
+
const data = readFileSync(absolutePath);
|
|
81
|
+
emitFile({
|
|
82
|
+
type: 'asset',
|
|
83
|
+
fileName: `_timber/fonts/${basename}`,
|
|
84
|
+
source: data,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Populate `buildManifest.fonts` with `ManifestFontEntry[]` keyed by the
|
|
92
|
+
* importer module path (relative to the project root, matching how Vite's
|
|
93
|
+
* `manifest.json` keys css/js).
|
|
94
|
+
*
|
|
95
|
+
* Google fonts use the content-hashed filenames produced during
|
|
96
|
+
* `buildStart`. Local fonts use the source basename.
|
|
97
|
+
*/
|
|
98
|
+
export function writeFontManifest(
|
|
99
|
+
pipeline: FontPipeline,
|
|
100
|
+
buildManifest: BuildManifest,
|
|
101
|
+
rootDir: string
|
|
102
|
+
): void {
|
|
103
|
+
const fontsByImporter = new Map<string, ManifestFontEntry[]>();
|
|
104
|
+
|
|
105
|
+
for (const entry of pipeline.entries()) {
|
|
106
|
+
const manifestEntries = fontsByImporter.get(entry.importer) ?? [];
|
|
107
|
+
|
|
108
|
+
if (entry.provider === 'local' && entry.localSources) {
|
|
109
|
+
for (const src of entry.localSources) {
|
|
110
|
+
const filename = src.path.split('/').pop() ?? src.path;
|
|
111
|
+
const format = inferFontFormat(src.path);
|
|
112
|
+
manifestEntries.push({
|
|
113
|
+
href: `/_timber/fonts/${filename}`,
|
|
114
|
+
format,
|
|
115
|
+
crossOrigin: 'anonymous',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
} else if (entry.cachedFiles) {
|
|
119
|
+
// Google fonts: use the per-entry cached files attached during
|
|
120
|
+
// buildStart. Each entry owns its own cached binaries (TIM-829),
|
|
121
|
+
// so we no longer need a family-grouped lookup.
|
|
122
|
+
for (const cf of entry.cachedFiles) {
|
|
123
|
+
manifestEntries.push({
|
|
124
|
+
href: `/_timber/fonts/${cf.hashedFilename}`,
|
|
125
|
+
format: 'woff2',
|
|
126
|
+
crossOrigin: 'anonymous',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
fontsByImporter.set(entry.importer, manifestEntries);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Normalize importer paths to be relative to project root (matching how
|
|
135
|
+
// Vite's manifest.json keys work for css/js).
|
|
136
|
+
for (const [importer, entries] of fontsByImporter) {
|
|
137
|
+
const relativePath = importer.startsWith(rootDir)
|
|
138
|
+
? importer.slice(rootDir.length + 1)
|
|
139
|
+
: importer;
|
|
140
|
+
buildManifest.fonts[relativePath] = entries;
|
|
141
|
+
}
|
|
142
|
+
}
|
package/src/fonts/css.ts
CHANGED
|
@@ -39,6 +39,7 @@ export function generateFontFaces(descriptors: FontFaceDescriptor[]): string {
|
|
|
39
39
|
* ```css
|
|
40
40
|
* .timber-font-inter {
|
|
41
41
|
* --font-sans: 'Inter', 'Inter Fallback', system-ui, sans-serif;
|
|
42
|
+
* font-family: 'Inter', 'Inter Fallback', system-ui, sans-serif;
|
|
42
43
|
* }
|
|
43
44
|
* ```
|
|
44
45
|
*/
|
|
@@ -47,7 +48,7 @@ export function generateVariableClass(
|
|
|
47
48
|
variable: string,
|
|
48
49
|
fontFamily: string
|
|
49
50
|
): string {
|
|
50
|
-
return `.${className} {\n ${variable}: ${fontFamily};\n}`;
|
|
51
|
+
return `.${className} {\n ${variable}: ${fontFamily};\n font-family: ${fontFamily};\n}`;
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
/**
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-mode middleware that serves local font binaries under
|
|
3
|
+
* `/_timber/fonts/<basename>`.
|
|
4
|
+
*
|
|
5
|
+
* Only files registered in the FontPipeline are served, and only by
|
|
6
|
+
* basename — directory traversal and path separators in the requested
|
|
7
|
+
* filename are rejected up front. Font CSS is no longer served here; it
|
|
8
|
+
* goes through Vite's CSS pipeline via virtual modules.
|
|
9
|
+
*
|
|
10
|
+
* Design doc: 24-fonts.md
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { ViteDevServer } from 'vite';
|
|
14
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
15
|
+
import { resolve, normalize } from 'node:path';
|
|
16
|
+
import type { FontPipeline } from './pipeline.js';
|
|
17
|
+
|
|
18
|
+
const FONT_MIME_TYPES: Record<string, string> = {
|
|
19
|
+
woff2: 'font/woff2',
|
|
20
|
+
woff: 'font/woff',
|
|
21
|
+
ttf: 'font/ttf',
|
|
22
|
+
otf: 'font/otf',
|
|
23
|
+
eot: 'application/vnd.ms-fontopen',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Wire the timber-fonts dev middleware onto a Vite dev server.
|
|
28
|
+
*
|
|
29
|
+
* Returns synchronously after registering the middleware. The pipeline is
|
|
30
|
+
* captured by reference so that fonts registered after `configureServer`
|
|
31
|
+
* runs (during transform) are still resolvable.
|
|
32
|
+
*/
|
|
33
|
+
export function installFontDevMiddleware(server: ViteDevServer, pipeline: FontPipeline): void {
|
|
34
|
+
server.middlewares.use((req, res, next) => {
|
|
35
|
+
const url = req.url;
|
|
36
|
+
if (!url || !url.startsWith('/_timber/fonts/')) return next();
|
|
37
|
+
|
|
38
|
+
const requestedFilename = url.slice('/_timber/fonts/'.length);
|
|
39
|
+
// Reject path traversal attempts and any subdirectory access. We only
|
|
40
|
+
// serve flat basenames out of the registry.
|
|
41
|
+
if (requestedFilename.includes('..') || requestedFilename.includes('/')) {
|
|
42
|
+
res.statusCode = 400;
|
|
43
|
+
res.end('Bad request');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Find the matching font file in the registry. We iterate every local
|
|
48
|
+
// font's source list and match by basename. The set is small (one per
|
|
49
|
+
// localFont() call) so this is cheap.
|
|
50
|
+
for (const font of pipeline.fonts()) {
|
|
51
|
+
if (font.provider !== 'local' || !font.localSources) continue;
|
|
52
|
+
for (const src of font.localSources) {
|
|
53
|
+
const basename = src.path.split('/').pop() ?? '';
|
|
54
|
+
if (basename !== requestedFilename) continue;
|
|
55
|
+
|
|
56
|
+
const absolutePath = normalize(resolve(src.path));
|
|
57
|
+
if (!existsSync(absolutePath)) {
|
|
58
|
+
res.statusCode = 404;
|
|
59
|
+
res.end('Not found');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const data = readFileSync(absolutePath);
|
|
63
|
+
const ext = absolutePath.split('.').pop()?.toLowerCase();
|
|
64
|
+
res.setHeader('Content-Type', FONT_MIME_TYPES[ext ?? ''] ?? 'application/octet-stream');
|
|
65
|
+
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');
|
|
66
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
67
|
+
res.end(data);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
next();
|
|
73
|
+
});
|
|
74
|
+
}
|
package/src/fonts/local.ts
CHANGED
|
@@ -100,18 +100,22 @@ export function generateFamilyName(sources: LocalFontSrc[]): string {
|
|
|
100
100
|
* Generate @font-face descriptors for local font sources.
|
|
101
101
|
*
|
|
102
102
|
* Each source entry produces one @font-face rule. The `src` descriptor
|
|
103
|
-
* uses a `url()` pointing to the
|
|
103
|
+
* uses a `url()` pointing to the served path under `/_timber/fonts/`.
|
|
104
|
+
* The `urlPrefix` defaults to `/_timber/fonts` — the path used by both
|
|
105
|
+
* the dev server middleware and the production build output.
|
|
104
106
|
*/
|
|
105
107
|
export function generateLocalFontFaces(
|
|
106
108
|
family: string,
|
|
107
109
|
sources: LocalFontSrc[],
|
|
108
|
-
display: string
|
|
110
|
+
display: string,
|
|
111
|
+
urlPrefix = '/_timber/fonts'
|
|
109
112
|
): FontFaceDescriptor[] {
|
|
110
113
|
return sources.map((entry) => {
|
|
111
114
|
const format = inferFontFormat(entry.path);
|
|
115
|
+
const basename = entry.path.split('/').pop() ?? entry.path;
|
|
112
116
|
return {
|
|
113
117
|
family,
|
|
114
|
-
src: `url('${
|
|
118
|
+
src: `url('${urlPrefix}/${basename}') format('${format}')`,
|
|
115
119
|
weight: entry.weight,
|
|
116
120
|
style: entry.style,
|
|
117
121
|
display,
|