@timber-js/app 0.2.0-alpha.14 → 0.2.0-alpha.141
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-DzFMnUAR.js +1147 -0
- package/dist/_chunks/actions-DzFMnUAR.js.map +1 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js +785 -0
- package/dist/_chunks/cli-schema-sync-D2IpXicg.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DH-M8Poy.js +2 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-C3RvHQPK.js +195 -0
- package/dist/_chunks/define-C3RvHQPK.js.map +1 -0
- package/dist/_chunks/define-DMVhsipD.js +112 -0
- package/dist/_chunks/define-DMVhsipD.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/handler-store-DjISKYEB.js +54 -0
- package/dist/_chunks/handler-store-DjISKYEB.js.map +1 -0
- package/dist/_chunks/href-validation-EZktELp8.js +124 -0
- package/dist/_chunks/href-validation-EZktELp8.js.map +1 -0
- package/dist/_chunks/logger-Dt-jQaBO.js +291 -0
- package/dist/_chunks/logger-Dt-jQaBO.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BjepjefT.js} +32 -19
- package/dist/_chunks/metadata-routes-BjepjefT.js.map +1 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js +103 -0
- package/dist/_chunks/navigation-root-DLc4s4ZC.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js +77 -0
- package/dist/_chunks/resolve-schema-Dj8tQloi.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js +86 -0
- package/dist/_chunks/schema-bridge-DK_89h8O.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tracing-M_zKubhk.js +358 -0
- package/dist/_chunks/tracing-M_zKubhk.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/validation-taUkvA4Q.js +113 -0
- package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
- package/dist/_chunks/walkers-7FBPM-hX.js +724 -0
- package/dist/_chunks/walkers-7FBPM-hX.js.map +1 -0
- package/dist/_chunks/{format-RyoGQL74.js → warnings-CNPXaypM.js} +6 -45
- package/dist/_chunks/warnings-CNPXaypM.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 +154 -48
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +23 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +165 -117
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +39 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +48 -6
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +29 -6
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +183 -1134
- 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 +925 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +65 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +27 -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 +14 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +46 -9
- 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 +79 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- 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-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +7 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +251 -36
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +34 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +98 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/local.d.ts +1 -1
- package/dist/fonts/pipeline.d.ts +172 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +78 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +94 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5315 -12687
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +114 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +31 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/client-chunks.d.ts +39 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/cloudflare-wasm.d.ts +18 -0
- package/dist/plugins/cloudflare-wasm.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +60 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -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 +6 -14
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- 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/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +8 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +1 -1
- 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 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +213 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- 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 +3126 -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/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +112 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +111 -19
- 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 +74 -20
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +28 -2
- 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 +25 -36
- 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 +12 -3
- 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 +50 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -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 +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +5 -5
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +38 -0
- package/dist/shared/href-validation.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/image.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +63 -22
- package/src/adapters/build-output-helper.ts +139 -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 +147 -60
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +39 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/timber-cache.ts +52 -24
- package/src/cli-schema-sync.ts +295 -0
- package/src/cli.ts +76 -8
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +125 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +153 -0
- package/src/client/browser-entry/index.ts +151 -0
- package/src/client/browser-entry/post-hydration.ts +113 -0
- package/src/client/browser-entry/router-init.ts +219 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +99 -22
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +116 -0
- package/src/client/link.tsx +343 -150
- package/src/client/nav-link-store.ts +37 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +338 -0
- package/src/client/navigation-context.ts +35 -7
- package/src/client/navigation-root.tsx +347 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +418 -128
- package/src/client/rsc-fetch.ts +208 -10
- package/src/client/segment-cache.ts +6 -3
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +31 -2
- package/src/client/use-link-status.ts +7 -7
- package/src/client/use-pathname.ts +1 -0
- package/src/client/use-pending-navigation.ts +40 -0
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +26 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +233 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/error-page.ts +507 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/ast.ts +525 -16
- package/src/fonts/bundle.ts +131 -0
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/local.ts +3 -3
- package/src/fonts/pipeline.ts +337 -0
- package/src/fonts/transform.ts +317 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +235 -0
- package/src/index.ts +415 -345
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +116 -0
- package/src/plugin-context.ts +247 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/cache.ts +180 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +103 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +179 -37
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +167 -655
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +386 -47
- package/src/plugins/server-bundle.ts +59 -3
- package/src/plugins/shims.ts +136 -35
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +61 -0
- package/src/routing/codegen.ts +321 -177
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/scanner.ts +165 -110
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +60 -22
- 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 +309 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +34 -26
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +17 -4
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +473 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +32 -52
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +35 -27
- 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 +101 -5
- package/src/server/html-injector-core.ts +418 -0
- package/src/server/html-injectors.ts +238 -223
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +182 -0
- package/src/server/logger.ts +67 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +361 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +527 -0
- package/src/server/pipeline.ts +201 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +130 -46
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +437 -208
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +128 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +316 -89
- package/src/server/rsc-entry/helpers.ts +155 -26
- package/src/server/rsc-entry/index.ts +283 -329
- package/src/server/rsc-entry/render-route.ts +313 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +65 -22
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +271 -41
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +148 -0
- package/src/server/slot-resolver.ts +234 -246
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +217 -78
- package/src/server/ssr-render.ts +344 -71
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +210 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/href-validation.ts +127 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/LICENSE +0 -8
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
package/src/fonts/ast.ts
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* AST utilities for extracting static font configs from source code.
|
|
3
|
+
* Uses OXC via Vite's `parseAst` — handles JS/JSX/TS/TSX natively.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Provides two tiers of API:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Source-text helpers** (`extractFontConfigAst`, `extractLocalFontConfigAst`,
|
|
8
|
+
* `detectDynamicFontCallAst`) — parse a snippet and return extracted config.
|
|
9
|
+
* Still used by tests and callers that have only a string.
|
|
10
|
+
*
|
|
11
|
+
* 2. **AST-node helpers** (`extractGoogleFontConfigFromNode`,
|
|
12
|
+
* `extractLocalFontConfigFromNode`, `findFontCallSites`) — operate on
|
|
13
|
+
* nodes from an already-parsed Program so the transform hook can share
|
|
14
|
+
* one parse with all analysis steps.
|
|
8
15
|
*
|
|
9
16
|
* Design doc: 24-fonts.md §"Step 1: Static Analysis"
|
|
10
17
|
*/
|
|
11
18
|
|
|
12
|
-
import {
|
|
19
|
+
import { parseAst as viteParseAst } from 'vite';
|
|
13
20
|
import type { GoogleFontConfig } from './types.js';
|
|
14
21
|
import type { LocalFontConfig, LocalFontSrc } from './types.js';
|
|
15
22
|
|
|
@@ -46,20 +53,34 @@ interface IdentifierNode extends AstNode {
|
|
|
46
53
|
name: string;
|
|
47
54
|
}
|
|
48
55
|
|
|
56
|
+
// ── Offset → line/column helper ──────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/** Convert a 0-based byte offset into a 1-based line and 0-based column. */
|
|
59
|
+
function offsetToLineColumn(source: string, offset: number): { line: number; column: number } {
|
|
60
|
+
let line = 1;
|
|
61
|
+
let lastNewline = -1;
|
|
62
|
+
for (let i = 0; i < offset; i++) {
|
|
63
|
+
if (source[i] === '\n') {
|
|
64
|
+
line++;
|
|
65
|
+
lastNewline = i;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { line, column: offset - lastNewline - 1 };
|
|
69
|
+
}
|
|
70
|
+
|
|
49
71
|
// ── Core AST extraction helpers ──────────────────────────────────────────────
|
|
50
72
|
|
|
51
73
|
/**
|
|
52
74
|
* Parse a JavaScript expression string into an AST node.
|
|
53
75
|
*
|
|
54
|
-
* Wraps the expression in parens so
|
|
76
|
+
* Wraps the expression in parens so OXC (via vite.parseAst) treats it as an expression statement.
|
|
55
77
|
* Returns null if parsing fails.
|
|
56
78
|
*/
|
|
57
79
|
function parseExpression(source: string): AstNode | null {
|
|
58
80
|
try {
|
|
59
|
-
const ast =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}) as unknown as { body: Array<{ expression: AstNode }> };
|
|
81
|
+
const ast = viteParseAst(`(${source})`, { lang: 'tsx' }) as unknown as {
|
|
82
|
+
body: Array<{ expression: AstNode }>;
|
|
83
|
+
};
|
|
63
84
|
return ast.body[0]?.expression ?? null;
|
|
64
85
|
} catch {
|
|
65
86
|
return null;
|
|
@@ -293,7 +314,7 @@ export function extractLocalFontConfigAst(callSource: string): LocalFontConfig |
|
|
|
293
314
|
* Detect if source code contains dynamic/computed font function calls
|
|
294
315
|
* that cannot be statically analyzed.
|
|
295
316
|
*
|
|
296
|
-
* Uses
|
|
317
|
+
* Uses OXC (via vite.parseAst) to parse the full source and inspect CallExpression nodes.
|
|
297
318
|
* Returns the offending expression string if found, null if all calls are static.
|
|
298
319
|
*/
|
|
299
320
|
export function detectDynamicFontCallAst(source: string, importedNames: string[]): string | null {
|
|
@@ -301,10 +322,7 @@ export function detectDynamicFontCallAst(source: string, importedNames: string[]
|
|
|
301
322
|
|
|
302
323
|
let ast;
|
|
303
324
|
try {
|
|
304
|
-
ast =
|
|
305
|
-
ecmaVersion: 'latest',
|
|
306
|
-
sourceType: 'module',
|
|
307
|
-
}) as unknown as { body: AstNode[] };
|
|
325
|
+
ast = viteParseAst(source, { lang: 'tsx' }) as unknown as { body: AstNode[] };
|
|
308
326
|
} catch {
|
|
309
327
|
// If we can't parse the source at all, fall back to no detection
|
|
310
328
|
return null;
|
|
@@ -357,3 +375,494 @@ function walkForDynamicCalls(node: AstNode, names: Set<string>, source: string):
|
|
|
357
375
|
|
|
358
376
|
return null;
|
|
359
377
|
}
|
|
378
|
+
|
|
379
|
+
// ── AST-node-level config extraction ─────────────────────────────────────────
|
|
380
|
+
//
|
|
381
|
+
// These work on an already-parsed ObjectExpression node so the transform
|
|
382
|
+
// hook can share one OXC (via vite.parseAst) parse of the full source file with all analysis
|
|
383
|
+
// steps (TIM-827).
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Extract a GoogleFontConfig from an ObjectExpression AST node.
|
|
387
|
+
*
|
|
388
|
+
* This is the node-level equivalent of `extractFontConfigAst` — it skips
|
|
389
|
+
* the parse step because the caller already has a parsed Program.
|
|
390
|
+
*/
|
|
391
|
+
export function extractGoogleFontConfigFromNode(node: AstNode): GoogleFontConfig | null {
|
|
392
|
+
if (node.type !== 'ObjectExpression') return null;
|
|
393
|
+
return extractGoogleConfig(node as ObjectExpressionNode);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Extract a LocalFontConfig from an ObjectExpression AST node.
|
|
398
|
+
*/
|
|
399
|
+
export function extractLocalFontConfigFromNode(node: AstNode): LocalFontConfig | null {
|
|
400
|
+
if (node.type !== 'ObjectExpression') return null;
|
|
401
|
+
return extractLocalConfig(node as ObjectExpressionNode);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** Shared implementation for GoogleFontConfig extraction from an object node. */
|
|
405
|
+
function extractGoogleConfig(objNode: ObjectExpressionNode): GoogleFontConfig {
|
|
406
|
+
const props = objectProperties(objNode);
|
|
407
|
+
const config: GoogleFontConfig = {};
|
|
408
|
+
|
|
409
|
+
const subsetsNode = props.get('subsets');
|
|
410
|
+
if (subsetsNode) {
|
|
411
|
+
const arr = extractStringArray(subsetsNode);
|
|
412
|
+
if (arr) config.subsets = arr;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const weightNode = props.get('weight');
|
|
416
|
+
if (weightNode) {
|
|
417
|
+
const arr = extractStringArray(weightNode);
|
|
418
|
+
if (arr) {
|
|
419
|
+
config.weight = arr;
|
|
420
|
+
} else {
|
|
421
|
+
const s = extractString(weightNode);
|
|
422
|
+
if (s !== undefined) config.weight = s;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const displayNode = props.get('display');
|
|
427
|
+
if (displayNode) {
|
|
428
|
+
const s = extractString(displayNode);
|
|
429
|
+
if (s !== undefined) config.display = s as GoogleFontConfig['display'];
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const variableNode = props.get('variable');
|
|
433
|
+
if (variableNode) {
|
|
434
|
+
const s = extractString(variableNode);
|
|
435
|
+
if (s !== undefined) config.variable = s;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const styleNode = props.get('style');
|
|
439
|
+
if (styleNode) {
|
|
440
|
+
const arr = extractStringArray(styleNode);
|
|
441
|
+
if (arr) {
|
|
442
|
+
config.style = arr;
|
|
443
|
+
} else {
|
|
444
|
+
const s = extractString(styleNode);
|
|
445
|
+
if (s !== undefined) config.style = s;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const preloadNode = props.get('preload');
|
|
450
|
+
if (preloadNode) {
|
|
451
|
+
const b = extractBoolean(preloadNode);
|
|
452
|
+
if (b !== undefined) config.preload = b;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
return config;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** Shared implementation for LocalFontConfig extraction from an object node. */
|
|
459
|
+
function extractLocalConfig(objNode: ObjectExpressionNode): LocalFontConfig | null {
|
|
460
|
+
const props = objectProperties(objNode);
|
|
461
|
+
|
|
462
|
+
const displayNode = props.get('display');
|
|
463
|
+
const display = displayNode
|
|
464
|
+
? (extractString(displayNode) as LocalFontConfig['display'])
|
|
465
|
+
: undefined;
|
|
466
|
+
|
|
467
|
+
const variableNode = props.get('variable');
|
|
468
|
+
const variable = variableNode ? extractString(variableNode) : undefined;
|
|
469
|
+
|
|
470
|
+
const familyNode = props.get('family');
|
|
471
|
+
const family = familyNode ? extractString(familyNode) : undefined;
|
|
472
|
+
|
|
473
|
+
const srcNode = props.get('src');
|
|
474
|
+
if (!srcNode) return null;
|
|
475
|
+
|
|
476
|
+
const srcString = extractString(srcNode);
|
|
477
|
+
if (srcString !== undefined) {
|
|
478
|
+
return { src: srcString, display, variable, family };
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
if (srcNode.type === 'ArrayExpression') {
|
|
482
|
+
const arr = srcNode as ArrayExpressionNode;
|
|
483
|
+
const entries: LocalFontSrc[] = [];
|
|
484
|
+
for (const elem of arr.elements) {
|
|
485
|
+
const entry = extractLocalFontSrcEntry(elem);
|
|
486
|
+
if (!entry) return null;
|
|
487
|
+
entries.push(entry);
|
|
488
|
+
}
|
|
489
|
+
if (entries.length === 0) return null;
|
|
490
|
+
return { src: entries, display, variable, family };
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return null;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// ── Font module specifiers ───────────────────────────────────────────────────
|
|
497
|
+
|
|
498
|
+
const GOOGLE_FONT_SOURCES = new Set([
|
|
499
|
+
'@timber/fonts/google',
|
|
500
|
+
'@timber-js/app/fonts/google',
|
|
501
|
+
'next/font/google',
|
|
502
|
+
]);
|
|
503
|
+
|
|
504
|
+
const LOCAL_FONT_SOURCES = new Set([
|
|
505
|
+
'@timber/fonts/local',
|
|
506
|
+
'@timber-js/app/fonts/local',
|
|
507
|
+
'next/font/local',
|
|
508
|
+
]);
|
|
509
|
+
|
|
510
|
+
// ── Parsed source types ──────────────────────────────────────────────────────
|
|
511
|
+
|
|
512
|
+
/** A font import binding discovered from an ImportDeclaration. */
|
|
513
|
+
export interface FontBinding {
|
|
514
|
+
/** The local name used in the module (after `as`, if present). */
|
|
515
|
+
localName: string;
|
|
516
|
+
/**
|
|
517
|
+
* The original exported name (before `as`). For Google fonts this is
|
|
518
|
+
* the PascalCase_With_Underscores name that maps to the family. For
|
|
519
|
+
* local fonts (`default` import), this is `'default'`.
|
|
520
|
+
*/
|
|
521
|
+
importedName: string;
|
|
522
|
+
/** `'google'` or `'local'`. */
|
|
523
|
+
provider: 'google' | 'local';
|
|
524
|
+
/** The AST node of the ImportDeclaration (for removal via magic-string). */
|
|
525
|
+
importNode: AstNode & { start: number; end: number };
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/** A font function call site discovered from a CallExpression. */
|
|
529
|
+
export interface FontCallSite {
|
|
530
|
+
/** The binding that this call references. */
|
|
531
|
+
binding: FontBinding;
|
|
532
|
+
/**
|
|
533
|
+
* The variable name this call is assigned to, if the call appears in a
|
|
534
|
+
* VariableDeclarator. `null` for bare expression statements.
|
|
535
|
+
*/
|
|
536
|
+
assignedName: string | null;
|
|
537
|
+
/** The first argument AST node (expected to be an ObjectExpression). */
|
|
538
|
+
configNode: AstNode;
|
|
539
|
+
/**
|
|
540
|
+
* The outermost AST node to replace. For a VariableDeclaration with a
|
|
541
|
+
* single declarator this is the full declaration; for a bare expression
|
|
542
|
+
* statement it is the ExpressionStatement. The transform replaces
|
|
543
|
+
* `source[replaceStart..replaceEnd]`.
|
|
544
|
+
*/
|
|
545
|
+
replaceStart: number;
|
|
546
|
+
replaceEnd: number;
|
|
547
|
+
/** Line number (1-based) of the call for error messages. */
|
|
548
|
+
line: number;
|
|
549
|
+
/** Column (0-based) of the call for error messages. */
|
|
550
|
+
column: number;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/** Result of `findFontCallSites` — everything the transform needs. */
|
|
554
|
+
export interface FontAnalysis {
|
|
555
|
+
bindings: FontBinding[];
|
|
556
|
+
callSites: FontCallSite[];
|
|
557
|
+
/** Import nodes that should be removed (deduplicated). */
|
|
558
|
+
importNodesToRemove: Array<{ start: number; end: number }>;
|
|
559
|
+
/** First dynamic call expression text, or `null`. */
|
|
560
|
+
dynamicCall: string | null;
|
|
561
|
+
/**
|
|
562
|
+
* Font calls found in nested scopes (functions, if-blocks, etc.).
|
|
563
|
+
* These are errors — font calls must be module-level.
|
|
564
|
+
*/
|
|
565
|
+
nestedCalls: Array<{ name: string; line: number; column: number }>;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
interface PositionedNode extends AstNode {
|
|
569
|
+
start: number;
|
|
570
|
+
end: number;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
interface ImportDeclarationNode extends PositionedNode {
|
|
574
|
+
type: 'ImportDeclaration';
|
|
575
|
+
source: LiteralNode & { value: string };
|
|
576
|
+
specifiers: Array<
|
|
577
|
+
PositionedNode & {
|
|
578
|
+
type: string;
|
|
579
|
+
local: IdentifierNode;
|
|
580
|
+
imported?: IdentifierNode;
|
|
581
|
+
}
|
|
582
|
+
>;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
interface CallExpressionNode extends PositionedNode {
|
|
586
|
+
type: 'CallExpression';
|
|
587
|
+
callee: AstNode;
|
|
588
|
+
arguments: PositionedNode[];
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
interface VariableDeclaratorNode extends PositionedNode {
|
|
592
|
+
type: 'VariableDeclarator';
|
|
593
|
+
id: PositionedNode;
|
|
594
|
+
init: PositionedNode | null;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
interface VariableDeclarationNode extends PositionedNode {
|
|
598
|
+
type: 'VariableDeclaration';
|
|
599
|
+
declarations: VariableDeclaratorNode[];
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
interface ExpressionStatementNode extends PositionedNode {
|
|
603
|
+
type: 'ExpressionStatement';
|
|
604
|
+
expression: PositionedNode;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
interface ExportNamedDeclarationNode extends PositionedNode {
|
|
608
|
+
type: 'ExportNamedDeclaration';
|
|
609
|
+
declaration: VariableDeclarationNode | ExpressionStatementNode | null;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
// ── Type guards for AST narrowing ────────────────────────────────────────────
|
|
613
|
+
//
|
|
614
|
+
// OXC's parsed nodes all share the base `PositionedNode` shape with
|
|
615
|
+
// `type: string`. TypeScript can't narrow a union that includes a
|
|
616
|
+
// `string`-typed catch-all, so we use explicit type guards instead of
|
|
617
|
+
// bare `.type ===` checks.
|
|
618
|
+
|
|
619
|
+
function isImportDeclaration(node: PositionedNode): node is ImportDeclarationNode {
|
|
620
|
+
return node.type === 'ImportDeclaration';
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
function isVariableDeclaration(node: PositionedNode): node is VariableDeclarationNode {
|
|
624
|
+
return node.type === 'VariableDeclaration';
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
function isExpressionStatement(node: PositionedNode): node is ExpressionStatementNode {
|
|
628
|
+
return node.type === 'ExpressionStatement';
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
function isExportNamedDeclaration(node: PositionedNode): node is ExportNamedDeclarationNode {
|
|
632
|
+
return node.type === 'ExportNamedDeclaration';
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
function isCallExpression(node: PositionedNode): node is CallExpressionNode {
|
|
636
|
+
return node.type === 'CallExpression';
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
function isIdentifier(node: AstNode): node is IdentifierNode {
|
|
640
|
+
return node.type === 'Identifier';
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
interface ProgramNode extends PositionedNode {
|
|
644
|
+
type: 'Program';
|
|
645
|
+
body: PositionedNode[];
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Parse a full source file and find all font imports and call sites.
|
|
650
|
+
*
|
|
651
|
+
* Returns `null` if the source has no font-related imports.
|
|
652
|
+
*/
|
|
653
|
+
export function findFontCallSites(source: string): FontAnalysis | null {
|
|
654
|
+
let program: ProgramNode;
|
|
655
|
+
try {
|
|
656
|
+
program = viteParseAst(source, { lang: 'tsx' }) as unknown as ProgramNode;
|
|
657
|
+
} catch {
|
|
658
|
+
return null;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Step 1: Find all font import declarations and build the bindings list.
|
|
662
|
+
const bindings: FontBinding[] = [];
|
|
663
|
+
const importNodesToRemove: Array<{ start: number; end: number }> = [];
|
|
664
|
+
|
|
665
|
+
for (const stmt of program.body) {
|
|
666
|
+
if (!isImportDeclaration(stmt)) continue;
|
|
667
|
+
const importDecl = stmt;
|
|
668
|
+
const specSource = importDecl.source.value;
|
|
669
|
+
|
|
670
|
+
let provider: 'google' | 'local' | null = null;
|
|
671
|
+
if (GOOGLE_FONT_SOURCES.has(specSource)) provider = 'google';
|
|
672
|
+
else if (LOCAL_FONT_SOURCES.has(specSource)) provider = 'local';
|
|
673
|
+
if (!provider) continue;
|
|
674
|
+
|
|
675
|
+
for (const spec of importDecl.specifiers) {
|
|
676
|
+
if (spec.type === 'ImportSpecifier' && provider === 'google') {
|
|
677
|
+
bindings.push({
|
|
678
|
+
localName: spec.local.name,
|
|
679
|
+
importedName: spec.imported?.name ?? spec.local.name,
|
|
680
|
+
provider,
|
|
681
|
+
importNode: importDecl,
|
|
682
|
+
});
|
|
683
|
+
} else if (spec.type === 'ImportDefaultSpecifier' && provider === 'local') {
|
|
684
|
+
bindings.push({
|
|
685
|
+
localName: spec.local.name,
|
|
686
|
+
importedName: 'default',
|
|
687
|
+
provider,
|
|
688
|
+
importNode: importDecl,
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
// ImportNamespaceSpecifier (`import * as fonts from ...`) is not
|
|
692
|
+
// currently supported — the old regex didn't handle it either.
|
|
693
|
+
// If we add it later, we'd need to also handle `fonts.Inter(...)`
|
|
694
|
+
// member expressions in the call-site walk.
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
importNodesToRemove.push({ start: stmt.start, end: stmt.end });
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
if (bindings.length === 0) return null;
|
|
701
|
+
|
|
702
|
+
// Step 2: Walk the AST for CallExpression nodes whose callee is a font binding.
|
|
703
|
+
const bindingsByName = new Map(bindings.map((b) => [b.localName, b]));
|
|
704
|
+
const callSites: FontCallSite[] = [];
|
|
705
|
+
let dynamicCall: string | null = null;
|
|
706
|
+
|
|
707
|
+
for (const stmt of program.body) {
|
|
708
|
+
// Unwrap `export const roboto = Roboto(...)` — the AST wraps the
|
|
709
|
+
// VariableDeclaration inside an ExportNamedDeclaration node.
|
|
710
|
+
const effectiveStmt =
|
|
711
|
+
isExportNamedDeclaration(stmt) && stmt.declaration ? stmt.declaration : stmt;
|
|
712
|
+
|
|
713
|
+
// VariableDeclaration: `const inter = Inter({ ... })`
|
|
714
|
+
if (isVariableDeclaration(effectiveStmt)) {
|
|
715
|
+
for (const declarator of effectiveStmt.declarations) {
|
|
716
|
+
if (!declarator.init) continue;
|
|
717
|
+
if (!isCallExpression(declarator.init)) continue;
|
|
718
|
+
const call = declarator.init;
|
|
719
|
+
const site = matchCallExpression(call, bindingsByName, source);
|
|
720
|
+
if (!site) continue;
|
|
721
|
+
|
|
722
|
+
if (site === 'dynamic') {
|
|
723
|
+
if (!dynamicCall && isIdentifier(call.callee)) {
|
|
724
|
+
const argStart = call.arguments[0].start;
|
|
725
|
+
const argEnd = call.arguments[0].end;
|
|
726
|
+
dynamicCall = `${call.callee.name}(${source.slice(argStart, argEnd)})`;
|
|
727
|
+
}
|
|
728
|
+
continue;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
const assignedName = isIdentifier(declarator.id) ? declarator.id.name : null;
|
|
732
|
+
|
|
733
|
+
const { line, column } = offsetToLineColumn(source, call.start);
|
|
734
|
+
callSites.push({
|
|
735
|
+
binding: site.binding,
|
|
736
|
+
assignedName,
|
|
737
|
+
configNode: site.configNode,
|
|
738
|
+
replaceStart: call.start,
|
|
739
|
+
replaceEnd: call.end,
|
|
740
|
+
line,
|
|
741
|
+
column,
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
// ExpressionStatement: `Inter({ ... })` as a bare call
|
|
747
|
+
if (isExpressionStatement(effectiveStmt)) {
|
|
748
|
+
if (isCallExpression(effectiveStmt.expression)) {
|
|
749
|
+
const call = effectiveStmt.expression;
|
|
750
|
+
const site = matchCallExpression(call, bindingsByName, source);
|
|
751
|
+
if (site && site !== 'dynamic') {
|
|
752
|
+
const { line, column } = offsetToLineColumn(source, call.start);
|
|
753
|
+
callSites.push({
|
|
754
|
+
binding: site.binding,
|
|
755
|
+
assignedName: null,
|
|
756
|
+
configNode: site.configNode,
|
|
757
|
+
replaceStart: effectiveStmt.start,
|
|
758
|
+
replaceEnd: effectiveStmt.end,
|
|
759
|
+
line,
|
|
760
|
+
column,
|
|
761
|
+
});
|
|
762
|
+
} else if (site === 'dynamic' && !dynamicCall && isIdentifier(call.callee)) {
|
|
763
|
+
const argStart = call.arguments[0].start;
|
|
764
|
+
const argEnd = call.arguments[0].end;
|
|
765
|
+
dynamicCall = `${call.callee.name}(${source.slice(argStart, argEnd)})`;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// Step 3: Walk nested scopes to find font calls that aren't module-level.
|
|
772
|
+
// Font calls must be at module scope (same constraint as Next.js).
|
|
773
|
+
// If the import is removed but a nested call remains, it's a ReferenceError.
|
|
774
|
+
const nestedCalls: Array<{ name: string; line: number; column: number }> = [];
|
|
775
|
+
for (const stmt of program.body) {
|
|
776
|
+
if (stmt.type === 'ImportDeclaration') continue;
|
|
777
|
+
walkForNestedFontCalls(stmt as AstNode, bindingsByName, source, nestedCalls, false);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
return { bindings, callSites, importNodesToRemove, dynamicCall, nestedCalls };
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* Recursively walk an AST node looking for font CallExpressions in nested
|
|
785
|
+
* scopes (function bodies, if-blocks, loops, etc.). Font calls must be
|
|
786
|
+
* module-level; nested calls are collected as errors.
|
|
787
|
+
*
|
|
788
|
+
* `isNested` tracks whether we've descended past the top-level statement.
|
|
789
|
+
* Top-level VariableDeclarations and ExpressionStatements are already
|
|
790
|
+
* handled by the main loop in `findFontCallSites`, so we only flag calls
|
|
791
|
+
* found deeper.
|
|
792
|
+
*/
|
|
793
|
+
function walkForNestedFontCalls(
|
|
794
|
+
node: AstNode,
|
|
795
|
+
bindings: Map<string, FontBinding>,
|
|
796
|
+
source: string,
|
|
797
|
+
out: Array<{ name: string; line: number; column: number }>,
|
|
798
|
+
isNested: boolean
|
|
799
|
+
): void {
|
|
800
|
+
if (!node || typeof node !== 'object') return;
|
|
801
|
+
|
|
802
|
+
if (node.type === 'CallExpression') {
|
|
803
|
+
const callee = node.callee as AstNode;
|
|
804
|
+
if (isNested && callee.type === 'Identifier' && bindings.has((callee as IdentifierNode).name)) {
|
|
805
|
+
const pos = offsetToLineColumn(source, (node as PositionedNode).start);
|
|
806
|
+
out.push({ name: (callee as IdentifierNode).name, line: pos.line, column: pos.column });
|
|
807
|
+
return; // Don't recurse into this call's children
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
// These node types introduce a nested scope — any font call inside is an error.
|
|
812
|
+
const scopeTypes = new Set([
|
|
813
|
+
'FunctionDeclaration',
|
|
814
|
+
'FunctionExpression',
|
|
815
|
+
'ArrowFunctionExpression',
|
|
816
|
+
'IfStatement',
|
|
817
|
+
'ForStatement',
|
|
818
|
+
'ForInStatement',
|
|
819
|
+
'ForOfStatement',
|
|
820
|
+
'WhileStatement',
|
|
821
|
+
'DoWhileStatement',
|
|
822
|
+
'SwitchStatement',
|
|
823
|
+
'TryStatement',
|
|
824
|
+
'BlockStatement',
|
|
825
|
+
'ClassDeclaration',
|
|
826
|
+
'ClassExpression',
|
|
827
|
+
]);
|
|
828
|
+
const enterNested = isNested || scopeTypes.has(node.type);
|
|
829
|
+
|
|
830
|
+
for (const key of Object.keys(node)) {
|
|
831
|
+
if (key === 'type') continue;
|
|
832
|
+
const child = node[key];
|
|
833
|
+
if (Array.isArray(child)) {
|
|
834
|
+
for (const item of child) {
|
|
835
|
+
if (item && typeof item === 'object' && (item as AstNode).type) {
|
|
836
|
+
walkForNestedFontCalls(item as AstNode, bindings, source, out, enterNested);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
} else if (child && typeof child === 'object' && (child as AstNode).type) {
|
|
840
|
+
walkForNestedFontCalls(child as AstNode, bindings, source, out, enterNested);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/**
|
|
846
|
+
* Match a CallExpression against the font bindings map.
|
|
847
|
+
*
|
|
848
|
+
* Returns the binding + config node if the call is a static font call,
|
|
849
|
+
* `'dynamic'` if it's a font call with a non-object argument, or `null`
|
|
850
|
+
* if the callee doesn't match any font binding.
|
|
851
|
+
*/
|
|
852
|
+
function matchCallExpression(
|
|
853
|
+
call: CallExpressionNode,
|
|
854
|
+
bindings: Map<string, FontBinding>,
|
|
855
|
+
_source: string
|
|
856
|
+
): { binding: FontBinding; configNode: AstNode } | 'dynamic' | null {
|
|
857
|
+
if (!isIdentifier(call.callee)) return null;
|
|
858
|
+
const calleeName = call.callee.name;
|
|
859
|
+
const binding = bindings.get(calleeName);
|
|
860
|
+
if (!binding) return null;
|
|
861
|
+
|
|
862
|
+
const args = call.arguments;
|
|
863
|
+
if (args.length === 0 || args[0].type !== 'ObjectExpression') {
|
|
864
|
+
return 'dynamic';
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
return { binding, configNode: args[0] };
|
|
868
|
+
}
|