@timber-js/app 0.2.0-alpha.9 → 0.2.0-alpha.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/actions-DLnUaR65.js +421 -0
- package/dist/_chunks/actions-DLnUaR65.js.map +1 -0
- package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
- package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-C77ScO0m.js +106 -0
- package/dist/_chunks/define-C77ScO0m.js.map +1 -0
- package/dist/_chunks/define-Itxvcd7F.js +199 -0
- package/dist/_chunks/define-Itxvcd7F.js.map +1 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js +94 -0
- package/dist/_chunks/define-cookie-BowvzoP0.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
- package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
- package/dist/_chunks/format-CYBGxKtc.js +14 -0
- package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-DRlhJWbu.js} +219 -97
- package/dist/_chunks/interception-DRlhJWbu.js.map +1 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
- package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/request-context-CK5tZqIP.js +478 -0
- package/dist/_chunks/request-context-CK5tZqIP.js.map +1 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
- package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
- package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
- package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
- package/dist/_chunks/stale-reload-BX5gL1r-.js +64 -0
- package/dist/_chunks/stale-reload-BX5gL1r-.js.map +1 -0
- package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
- package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
- package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
- package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-BiV5GJgm.js} +7 -4
- package/dist/_chunks/use-query-states-BiV5GJgm.js.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +135 -11
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +142 -80
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +27 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +23 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +10 -4
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +6 -3
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -21
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +229 -1018
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +18 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +890 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-params.d.ts +6 -4
- package/dist/client/use-params.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +266 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.js +1 -83
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +138 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +72 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +59 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +45 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4294 -2453
- package/dist/index.js.map +1 -1
- package/dist/plugin-context.d.ts +107 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +3 -3
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-404-page.d.ts +56 -0
- package/dist/plugins/dev-404-page.d.ts.map +1 -0
- package/dist/plugins/dev-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +49 -9
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-error-page.d.ts +58 -0
- package/dist/plugins/dev-error-page.d.ts.map +1 -0
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/dev-terminal-error.d.ts +28 -0
- package/dist/plugins/dev-terminal-error.d.ts.map +1 -0
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +139 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +32 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +78 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +4 -0
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +7 -0
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +32 -4
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/debug.d.ts +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-holding-server.d.ts +52 -0
- package/dist/server/dev-holding-server.d.ts.map +1 -0
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/dev-warnings.d.ts +1 -21
- package/dist/server/dev-warnings.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -43
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +195 -2800
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +46 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2900 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +52 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +69 -18
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +112 -43
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +16 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +20 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +14 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +23 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/status-code-resolver.d.ts +1 -1
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +4 -4
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +3 -2
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +51 -16
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +52 -8
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +31 -0
- package/src/cache/timber-cache.ts +24 -20
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +128 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +143 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +14 -7
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +65 -38
- package/src/client/internal.ts +57 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +342 -113
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +31 -6
- package/src/client/navigation-root.tsx +342 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +299 -72
- package/src/client/rsc-fetch.ts +97 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-params.ts +7 -5
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/codec.ts +49 -0
- package/src/config-types.ts +264 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +78 -25
- package/src/cookies/index.ts +8 -0
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/pipeline.ts +275 -0
- package/src/fonts/transform.ts +353 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +159 -0
- package/src/index.ts +314 -355
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +9 -3
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-404-page.ts +418 -0
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +286 -42
- package/src/plugins/dev-error-page.ts +536 -0
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +146 -19
- package/src/plugins/dev-terminal-error.ts +217 -0
- package/src/plugins/entries.ts +111 -10
- package/src/plugins/fonts.ts +133 -638
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +213 -31
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +17 -11
- package/src/routing/codegen.ts +273 -105
- package/src/routing/convention-lint.ts +356 -0
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +482 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +53 -6
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +34 -6
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-holding-server.ts +185 -0
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/dev-warnings.ts +4 -49
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injectors.ts +280 -120
- package/src/server/index.ts +25 -177
- package/src/server/internal.ts +169 -0
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +261 -66
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +293 -132
- package/src/server/route-element-builder.ts +283 -191
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +31 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +304 -111
- package/src/server/rsc-entry/rsc-payload.ts +65 -18
- package/src/server/rsc-entry/rsc-stream.ts +81 -13
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +171 -38
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +244 -229
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +20 -9
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +1 -1
- package/src/shims/navigation.ts +7 -2
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/cookies/index.js.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -166
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
|
@@ -2,36 +2,42 @@
|
|
|
2
2
|
* defineCookie — typed cookie definitions.
|
|
3
3
|
*
|
|
4
4
|
* Bundles name + codec + options into a reusable CookieDefinition<T>
|
|
5
|
-
* with .
|
|
5
|
+
* with async .getCookie(), .setCookie(), .deleteCookie() server methods
|
|
6
|
+
* and a sync .useCookie() client hook.
|
|
7
|
+
*
|
|
8
|
+
* Server methods are async to future-proof the API for v2 features
|
|
9
|
+
* (signed cookies via crypto.subtle, encrypted cookies, external stores).
|
|
6
10
|
*
|
|
7
11
|
* Reuses the SearchParamCodec protocol via fromSchema() bridge.
|
|
8
12
|
* Validation on read returns the codec default (never throws).
|
|
9
13
|
*
|
|
14
|
+
* IMPORTANT: This module must NOT have top-level value imports from either
|
|
15
|
+
* server or client modules. Server methods lazy-import request-context;
|
|
16
|
+
* useCookie() lazy-imports use-cookie. This ensures:
|
|
17
|
+
* - Client bundles don't pull in ALS/server code
|
|
18
|
+
* - RSC bundles don't pull in useSyncExternalStore/client code
|
|
19
|
+
* - Tree-shaking is not required for correctness
|
|
20
|
+
*
|
|
10
21
|
* See design/29-cookies.md §"Typed Cookies with Schema Validation"
|
|
11
22
|
*/
|
|
12
23
|
|
|
13
|
-
import {
|
|
14
|
-
import type {
|
|
15
|
-
import { useCookie as useRawCookie } from '#/client/use-cookie.js';
|
|
16
|
-
import type { ClientCookieOptions } from '#/client/use-cookie.js';
|
|
24
|
+
import type { CookieOptions } from '../server/request-context.js';
|
|
25
|
+
import type { ClientCookieOptions } from '../client/use-cookie.js';
|
|
17
26
|
|
|
18
27
|
// ─── Types ────────────────────────────────────────────────────────────────
|
|
19
28
|
|
|
29
|
+
import type { Codec } from '../codec.js';
|
|
30
|
+
|
|
20
31
|
/**
|
|
21
32
|
* A codec that converts between string cookie values and typed values.
|
|
22
|
-
*
|
|
33
|
+
* Type alias for the shared Codec<T> protocol.
|
|
23
34
|
*/
|
|
24
|
-
export
|
|
25
|
-
parse(value: string | string[] | undefined): T;
|
|
26
|
-
serialize(value: T): string | null;
|
|
27
|
-
}
|
|
35
|
+
export type CookieCodec<T> = Codec<T>;
|
|
28
36
|
|
|
29
37
|
/** Options for defineCookie: codec + CookieOptions merged. */
|
|
30
|
-
export interface DefineCookieOptions<T> extends
|
|
38
|
+
export interface DefineCookieOptions<T> extends CookieOptions {
|
|
31
39
|
/** Codec for parsing/serializing the cookie value. */
|
|
32
40
|
codec: CookieCodec<T>;
|
|
33
|
-
/** Sign the cookie with HMAC-SHA256. */
|
|
34
|
-
signed?: boolean;
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
/** A fully typed cookie definition with server and client methods. */
|
|
@@ -44,16 +50,49 @@ export interface CookieDefinition<T> {
|
|
|
44
50
|
readonly codec: CookieCodec<T>;
|
|
45
51
|
|
|
46
52
|
/** Server: read the typed value from the current request. */
|
|
47
|
-
|
|
53
|
+
getCookie(): Promise<T>;
|
|
48
54
|
/** Server: set the typed value on the response. */
|
|
49
|
-
|
|
55
|
+
setCookie(value: T): Promise<void>;
|
|
50
56
|
/** Server: delete the cookie. */
|
|
51
|
-
|
|
57
|
+
deleteCookie(): Promise<void>;
|
|
52
58
|
|
|
53
59
|
/** Client: React hook for reading/writing this cookie. Returns [value, setter, deleter]. */
|
|
54
60
|
useCookie(): [T, (value: T) => void, () => void];
|
|
55
61
|
}
|
|
56
62
|
|
|
63
|
+
// ─── Lazy Module References ───────────────────────────────────────────────
|
|
64
|
+
//
|
|
65
|
+
// These are resolved on first use, not at module load time. This prevents
|
|
66
|
+
// the server module graph from pulling in client code and vice versa.
|
|
67
|
+
// The dynamic import() in server methods is natural (they're async).
|
|
68
|
+
// For useCookie() (sync), we cache the module reference after first load.
|
|
69
|
+
|
|
70
|
+
let _useCookieModule: typeof import('../client/use-cookie.js') | undefined;
|
|
71
|
+
|
|
72
|
+
function getUseCookieModule(): typeof import('../client/use-cookie.js') {
|
|
73
|
+
if (!_useCookieModule) {
|
|
74
|
+
// In the client/SSR environment, this module is already in the module
|
|
75
|
+
// graph (imported by the client entry). The throw is a safeguard —
|
|
76
|
+
// if useCookie() is somehow called before the module is available,
|
|
77
|
+
// the developer gets a clear error instead of a silent failure.
|
|
78
|
+
throw new Error(
|
|
79
|
+
'[timber] defineCookie().useCookie() requires @timber-js/app/client to be loaded. ' +
|
|
80
|
+
'This hook can only be used in client components.'
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
return _useCookieModule;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Register the client cookie module. Called by the client entry to wire
|
|
88
|
+
* up the lazy reference without a top-level import.
|
|
89
|
+
*
|
|
90
|
+
* @internal — framework use only
|
|
91
|
+
*/
|
|
92
|
+
export function _registerUseCookieModule(mod: typeof import('../client/use-cookie.js')): void {
|
|
93
|
+
_useCookieModule = mod;
|
|
94
|
+
}
|
|
95
|
+
|
|
57
96
|
// ─── Factory ──────────────────────────────────────────────────────────────
|
|
58
97
|
|
|
59
98
|
/**
|
|
@@ -61,7 +100,7 @@ export interface CookieDefinition<T> {
|
|
|
61
100
|
*
|
|
62
101
|
* ```ts
|
|
63
102
|
* import { defineCookie } from '@timber-js/app/cookies';
|
|
64
|
-
* import { fromSchema } from '@timber-js/app/
|
|
103
|
+
* import { fromSchema } from '@timber-js/app/codec';
|
|
65
104
|
* import { z } from 'zod/v4';
|
|
66
105
|
*
|
|
67
106
|
* export const themeCookie = defineCookie('theme', {
|
|
@@ -69,6 +108,13 @@ export interface CookieDefinition<T> {
|
|
|
69
108
|
* httpOnly: false,
|
|
70
109
|
* maxAge: 60 * 60 * 24 * 365,
|
|
71
110
|
* });
|
|
111
|
+
*
|
|
112
|
+
* // Server
|
|
113
|
+
* const theme = await themeCookie.getCookie();
|
|
114
|
+
* await themeCookie.setCookie('dark');
|
|
115
|
+
*
|
|
116
|
+
* // Client
|
|
117
|
+
* const [theme, setTheme] = themeCookie.useCookie();
|
|
72
118
|
* ```
|
|
73
119
|
*/
|
|
74
120
|
export function defineCookie<T>(
|
|
@@ -83,32 +129,39 @@ export function defineCookie<T>(
|
|
|
83
129
|
options: resolvedOptions,
|
|
84
130
|
codec,
|
|
85
131
|
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
const
|
|
132
|
+
async getCookie(): Promise<T> {
|
|
133
|
+
const { getCookies } = await import('../server/request-context.js');
|
|
134
|
+
const jar = await getCookies();
|
|
135
|
+
const raw = jar.get(name);
|
|
89
136
|
return codec.parse(raw);
|
|
90
137
|
},
|
|
91
138
|
|
|
92
|
-
|
|
139
|
+
async setCookie(value: T): Promise<void> {
|
|
140
|
+
const { getCookies } = await import('../server/request-context.js');
|
|
141
|
+
const jar = await getCookies();
|
|
93
142
|
const serialized = codec.serialize(value);
|
|
94
143
|
if (serialized === null) {
|
|
95
|
-
|
|
144
|
+
jar.delete(name, {
|
|
96
145
|
path: resolvedOptions.path,
|
|
97
146
|
domain: resolvedOptions.domain,
|
|
98
147
|
});
|
|
99
148
|
} else {
|
|
100
|
-
|
|
149
|
+
jar.set(name, serialized, resolvedOptions);
|
|
101
150
|
}
|
|
102
151
|
},
|
|
103
152
|
|
|
104
|
-
|
|
105
|
-
|
|
153
|
+
async deleteCookie(): Promise<void> {
|
|
154
|
+
const { getCookies } = await import('../server/request-context.js');
|
|
155
|
+
const jar = await getCookies();
|
|
156
|
+
jar.delete(name, {
|
|
106
157
|
path: resolvedOptions.path,
|
|
107
158
|
domain: resolvedOptions.domain,
|
|
108
159
|
});
|
|
109
160
|
},
|
|
110
161
|
|
|
111
162
|
useCookie(): [T, (value: T) => void, () => void] {
|
|
163
|
+
const { useCookie: useRawCookie } = getUseCookieModule();
|
|
164
|
+
|
|
112
165
|
// Extract client-safe options (no httpOnly — client cookies can't be httpOnly)
|
|
113
166
|
const clientOpts: ClientCookieOptions = {
|
|
114
167
|
path: resolvedOptions.path,
|
package/src/cookies/index.ts
CHANGED
|
@@ -3,3 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
export { defineCookie } from './define-cookie.js';
|
|
5
5
|
export type { CookieDefinition, CookieCodec, DefineCookieOptions } from './define-cookie.js';
|
|
6
|
+
|
|
7
|
+
// Codec is the canonical home for the Codec type — import from
|
|
8
|
+
// @timber-js/app/codec. Re-export removed per TIM-721.
|
|
9
|
+
|
|
10
|
+
// cookies() is a server-only function (requires AsyncLocalStorage) and is
|
|
11
|
+
// exported from @timber-js/app/server. It is intentionally NOT re-exported
|
|
12
|
+
// here so that client-side code importing defineCookie doesn't pull in
|
|
13
|
+
// server ALS code. See TIM-704.
|
|
@@ -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
|
+
}
|