@timber-js/app 0.2.0-alpha.10 → 0.2.0-alpha.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +8 -0
- package/dist/_chunks/actions-CQ8Z8VGL.js +1061 -0
- package/dist/_chunks/actions-CQ8Z8VGL.js.map +1 -0
- package/dist/_chunks/build-output-helper-DXnW0qjz.js +61 -0
- package/dist/_chunks/build-output-helper-DXnW0qjz.js.map +1 -0
- package/dist/_chunks/chunk-BYIpzuS7.js +39 -0
- package/dist/_chunks/define-B-Q_UMOD.js +195 -0
- package/dist/_chunks/define-B-Q_UMOD.js.map +1 -0
- package/dist/_chunks/define-CfBPoJb0.js +123 -0
- package/dist/_chunks/define-CfBPoJb0.js.map +1 -0
- package/dist/_chunks/define-cookie-BjpIt4UC.js +194 -0
- package/dist/_chunks/define-cookie-BjpIt4UC.js.map +1 -0
- package/dist/_chunks/format-Bcn-Iv1x.js +14 -0
- package/dist/_chunks/format-Bcn-Iv1x.js.map +1 -0
- package/dist/_chunks/handler-store-B-lqaGyh.js +54 -0
- package/dist/_chunks/handler-store-B-lqaGyh.js.map +1 -0
- package/dist/_chunks/logger-0m8MsKdc.js +291 -0
- package/dist/_chunks/logger-0m8MsKdc.js.map +1 -0
- package/dist/_chunks/merge-search-params-BphMdht_.js +122 -0
- package/dist/_chunks/merge-search-params-BphMdht_.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-BU684ls2.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-BU684ls2.js.map} +1 -1
- package/dist/_chunks/navigation-root-BCYczjml.js +96 -0
- package/dist/_chunks/navigation-root-BCYczjml.js.map +1 -0
- package/dist/_chunks/registry-I2ss-lvy.js +20 -0
- package/dist/_chunks/registry-I2ss-lvy.js.map +1 -0
- package/dist/_chunks/router-ref-h3-UaCQv.js +28 -0
- package/dist/_chunks/router-ref-h3-UaCQv.js.map +1 -0
- package/dist/_chunks/schema-bridge-Cxu4l-7p.js +86 -0
- package/dist/_chunks/schema-bridge-Cxu4l-7p.js.map +1 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js +137 -0
- package/dist/_chunks/segment-classify-BjfuctV2.js.map +1 -0
- package/dist/_chunks/segment-context-Dx_OizxD.js +34 -0
- package/dist/_chunks/segment-context-Dx_OizxD.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-B4CdH7rE.js} +1 -1
- package/dist/_chunks/ssr-data-B4CdH7rE.js.map +1 -0
- package/dist/_chunks/stale-reload-Bab885FO.js +64 -0
- package/dist/_chunks/stale-reload-Bab885FO.js.map +1 -0
- package/dist/_chunks/tracing-C8V-YGsP.js +329 -0
- package/dist/_chunks/tracing-C8V-YGsP.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-B2XTqxDR.js} +7 -20
- package/dist/_chunks/use-query-states-B2XTqxDR.js.map +1 -0
- package/dist/_chunks/use-segment-params-BkpKAQ7D.js +185 -0
- package/dist/_chunks/use-segment-params-BkpKAQ7D.js.map +1 -0
- package/dist/_chunks/walkers-Tg0Alwcg.js +850 -0
- package/dist/_chunks/walkers-Tg0Alwcg.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → warnings-Cg47l5sk.js} +6 -45
- package/dist/_chunks/warnings-Cg47l5sk.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +95 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +142 -38
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -45
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/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 +150 -81
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli.d.ts +6 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +30 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +23 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +19 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +26 -5
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +9 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +261 -1100
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +964 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link-pending-store.d.ts +63 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +62 -55
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- package/dist/client/navigation-api-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +8 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +7 -5
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +33 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/config-types.d.ts +294 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +98 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +36 -72
- package/dist/cookies/index.js.map +1 -1
- package/dist/cookies/json-cookie.d.ts +64 -0
- package/dist/cookies/json-cookie.d.ts.map +1 -0
- package/dist/cookies/validation.d.ts +46 -0
- package/dist/cookies/validation.d.ts.map +1 -0
- package/dist/dev-tools/404-page.d.ts +46 -0
- package/dist/dev-tools/404-page.d.ts.map +1 -0
- package/dist/dev-tools/browser-logs.d.ts +84 -0
- package/dist/dev-tools/browser-logs.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +58 -0
- package/dist/dev-tools/error-page.d.ts.map +1 -0
- package/dist/dev-tools/holding-server.d.ts +54 -0
- package/dist/dev-tools/holding-server.d.ts.map +1 -0
- package/dist/dev-tools/index.d.ts +31 -0
- package/dist/dev-tools/index.d.ts.map +1 -0
- package/dist/{server/dev-span-processor.d.ts → dev-tools/instrumentation.d.ts} +26 -6
- package/dist/dev-tools/instrumentation.d.ts.map +1 -0
- package/dist/{server/dev-logger.d.ts → dev-tools/logger.d.ts} +1 -1
- package/dist/dev-tools/logger.d.ts.map +1 -0
- package/dist/{plugins/dev-logs.d.ts → dev-tools/logs.d.ts} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/{server/dev-warnings.d.ts → dev-tools/warnings.d.ts} +2 -22
- package/dist/dev-tools/warnings.d.ts.map +1 -0
- package/dist/fonts/bundle.d.ts +48 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +167 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +64 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +45 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +103 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14569 -12451
- 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 +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.d.ts.map +1 -0
- package/dist/plugins/content.d.ts +1 -1
- package/dist/plugins/content.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -1
- package/dist/plugins/dev-server.d.ts.map +1 -1
- package/dist/plugins/entries.d.ts +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +17 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +4 -4
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +55 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +52 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/index.d.ts +5 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +95 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +33 -5
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +51 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/debug.d.ts +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +90 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +212 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +9 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +155 -2905
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +48 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +2900 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +110 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +26 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +52 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +93 -23
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +69 -18
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +41 -109
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +21 -34
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +49 -6
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +20 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +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/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +23 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +16 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +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/types.d.ts +49 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +2 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/navigation-client.d.ts +3 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +1 -43
- package/dist/utils/directive-parser.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/package.json +56 -22
- package/src/adapters/build-output-helper.ts +77 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +142 -0
- package/src/adapters/cloudflare.ts +350 -76
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +142 -59
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +81 -18
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +31 -0
- package/src/cache/timber-cache.ts +25 -20
- package/src/cli.ts +16 -6
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +116 -0
- package/src/client/browser-entry/hmr.ts +81 -0
- package/src/client/browser-entry/hydrate.ts +145 -0
- package/src/client/browser-entry/index.ts +143 -0
- package/src/client/browser-entry/post-hydration.ts +119 -0
- package/src/client/browser-entry/router-init.ts +193 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +27 -0
- package/src/client/error-boundary.tsx +97 -20
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +77 -43
- package/src/client/internal.ts +58 -0
- package/src/client/link-pending-store.ts +111 -0
- package/src/client/link.tsx +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 +300 -73
- package/src/client/rsc-fetch.ts +112 -8
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +72 -3
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +18 -6
- package/src/client/use-cookie.ts +29 -0
- package/src/client/use-link-status.ts +7 -7
- package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
- package/src/client/use-query-states.ts +9 -3
- package/src/client/use-router.ts +1 -1
- package/src/client/{use-params.ts → use-segment-params.ts} +7 -5
- package/src/codec.ts +45 -0
- package/src/config-types.ts +292 -0
- package/src/config-validation.ts +303 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +301 -55
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +134 -0
- package/src/dev-tools/404-page.ts +387 -0
- package/src/dev-tools/browser-logs.ts +288 -0
- package/src/dev-tools/error-page.ts +509 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/index.ts +90 -0
- package/src/dev-tools/instrumentation.ts +176 -0
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +3 -3
- package/src/dev-tools/overlay.ts +456 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +183 -0
- package/src/{server/dev-warnings.ts → dev-tools/warnings.ts} +5 -50
- package/src/fonts/bundle.ts +142 -0
- package/src/fonts/css.ts +2 -1
- package/src/fonts/dev-middleware.ts +74 -0
- package/src/fonts/pipeline.ts +314 -0
- package/src/fonts/transform.ts +406 -0
- package/src/fonts/types.ts +50 -1
- package/src/fonts/virtual-modules.ts +227 -0
- package/src/index.ts +376 -356
- package/src/plugin-context.ts +240 -0
- package/src/plugins/adapter-build.ts +12 -4
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +154 -21
- package/src/plugins/entries.ts +111 -10
- package/src/plugins/fonts.ts +155 -654
- package/src/plugins/mdx.ts +43 -10
- package/src/plugins/routing.ts +225 -41
- 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-shared.ts +98 -0
- package/src/routing/codegen-types.ts +53 -0
- package/src/routing/codegen.ts +143 -176
- package/src/routing/convention-lint.ts +357 -0
- package/src/routing/index.ts +5 -1
- package/src/routing/interception.ts +1 -1
- package/src/routing/link-codegen.ts +294 -0
- package/src/routing/scanner.ts +107 -110
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/status-file-lint.ts +10 -7
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +2 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +538 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +92 -0
- package/src/segment-params/define.ts +332 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +76 -34
- package/src/server/action-client.ts +88 -15
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +112 -14
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +35 -7
- package/src/server/asset-headers.ts +8 -34
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/cookie-context.ts +468 -0
- package/src/server/cookie-parsing.ts +135 -0
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +218 -0
- package/src/server/deny-renderer.ts +31 -50
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +74 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injector-core.ts +403 -0
- package/src/server/html-injectors.ts +244 -223
- package/src/server/index.ts +31 -184
- package/src/server/internal.ts +176 -0
- package/src/server/logger.ts +67 -36
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +369 -0
- package/src/server/param-coercion.ts +76 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline-outcome.ts +167 -0
- package/src/server/pipeline-phases.ts +409 -0
- package/src/server/pipeline.ts +128 -394
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +111 -28
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +94 -338
- package/src/server/route-element-builder.ts +288 -192
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +44 -65
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +16 -17
- package/src/server/rsc-entry/error-renderer.ts +305 -89
- package/src/server/rsc-entry/helpers.ts +136 -12
- package/src/server/rsc-entry/index.ts +312 -341
- package/src/server/rsc-entry/render-route.ts +304 -0
- 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/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +245 -230
- package/src/server/ssr-entry.ts +215 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/state-tree-diff.ts +4 -1
- package/src/server/status-code-resolver.ts +112 -128
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +21 -10
- package/src/server/tree-builder.ts +202 -90
- package/src/server/types.ts +55 -6
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +5 -1
- package/src/shims/navigation-client.ts +4 -3
- package/src/shims/navigation.ts +14 -7
- package/src/utils/directive-parser.ts +1 -390
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js +0 -108
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -54
- package/dist/server/response-cache.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -166
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -410
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Skew Detection — graceful recovery when stale clients hit new deployments.
|
|
3
|
+
*
|
|
4
|
+
* When a new version of the app is deployed, clients with open tabs still have
|
|
5
|
+
* the old JavaScript bundle. Without version skew handling, these stale clients
|
|
6
|
+
* will experience:
|
|
7
|
+
*
|
|
8
|
+
* 1. Server action calls that crash (action IDs are content-hashed)
|
|
9
|
+
* 2. Chunk load failures (old filenames gone from CDN)
|
|
10
|
+
* 3. RSC payload mismatches (component references differ between builds)
|
|
11
|
+
*
|
|
12
|
+
* This module implements deployment ID comparison:
|
|
13
|
+
* - A per-build deployment ID is generated at build time (see build-manifest.ts)
|
|
14
|
+
* - The client sends it via `X-Timber-Deployment-Id` header on every RSC/action request
|
|
15
|
+
* - The server compares it against the current build's ID
|
|
16
|
+
* - On mismatch: signal the client to reload (not crash)
|
|
17
|
+
*
|
|
18
|
+
* The deployment ID is always-on in production. Dev mode skips the check
|
|
19
|
+
* (HMR handles code updates without full reloads).
|
|
20
|
+
*
|
|
21
|
+
* See design/25-production-deployments.md, TIM-446
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// ─── Constants ───────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
/** Header sent by the client with every RSC/action request. */
|
|
27
|
+
export const DEPLOYMENT_ID_HEADER = 'X-Timber-Deployment-Id';
|
|
28
|
+
|
|
29
|
+
/** Response header that signals the client to do a full page reload. */
|
|
30
|
+
export const RELOAD_HEADER = 'X-Timber-Reload';
|
|
31
|
+
|
|
32
|
+
// ─── Deployment ID ───────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The current build's deployment ID. Set at startup from the manifest init
|
|
36
|
+
* module (globalThis.__TIMBER_DEPLOYMENT_ID__). Null in dev mode.
|
|
37
|
+
*/
|
|
38
|
+
let currentDeploymentId: string | null = null;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Set the current deployment ID. Called once at server startup from the
|
|
42
|
+
* manifest init module. In dev mode this is never called (deployment ID
|
|
43
|
+
* checks are skipped).
|
|
44
|
+
*/
|
|
45
|
+
export function setDeploymentId(id: string): void {
|
|
46
|
+
currentDeploymentId = id;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get the current deployment ID. Returns null in dev mode.
|
|
51
|
+
*/
|
|
52
|
+
export function getDeploymentId(): string | null {
|
|
53
|
+
return currentDeploymentId;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ─── Skew Detection ──────────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
/** Result of a version skew check. */
|
|
59
|
+
export interface SkewCheckResult {
|
|
60
|
+
/** Whether the client's deployment ID matches the server's. */
|
|
61
|
+
ok: boolean;
|
|
62
|
+
/** The client's deployment ID (null if header not sent — e.g., initial page load). */
|
|
63
|
+
clientId: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Check if a request's deployment ID matches the current build.
|
|
68
|
+
*
|
|
69
|
+
* Returns `{ ok: true }` when:
|
|
70
|
+
* - Dev mode (no deployment ID set — HMR handles updates)
|
|
71
|
+
* - No deployment ID header (initial page load, non-RSC request)
|
|
72
|
+
* - Deployment IDs match
|
|
73
|
+
*
|
|
74
|
+
* Returns `{ ok: false }` when:
|
|
75
|
+
* - Client sends a deployment ID that differs from the current build
|
|
76
|
+
*/
|
|
77
|
+
export function checkVersionSkew(req: Request): SkewCheckResult {
|
|
78
|
+
// Dev mode — no deployment ID checks (HMR handles updates)
|
|
79
|
+
if (!currentDeploymentId) {
|
|
80
|
+
return { ok: true, clientId: null };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const clientId = req.headers.get(DEPLOYMENT_ID_HEADER);
|
|
84
|
+
|
|
85
|
+
// No header — initial page load or non-RSC request. Always OK.
|
|
86
|
+
if (!clientId) {
|
|
87
|
+
return { ok: true, clientId: null };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Compare deployment IDs
|
|
91
|
+
if (clientId === currentDeploymentId) {
|
|
92
|
+
return { ok: true, clientId };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return { ok: false, clientId };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Apply version skew reload headers to a response.
|
|
100
|
+
* Sets X-Timber-Reload: 1 to signal the client to do a full page reload.
|
|
101
|
+
*/
|
|
102
|
+
export function applyReloadHeaders(headers: Headers): void {
|
|
103
|
+
headers.set(RELOAD_HEADER, '1');
|
|
104
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for merging preserved search params into a target URL.
|
|
3
|
+
*
|
|
4
|
+
* Used by both <Link> (client) and redirect() (server). Extracted to a shared
|
|
5
|
+
* module to avoid importing client code ('use client') from server modules.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Merge preserved search params from the current URL into a target href.
|
|
10
|
+
*
|
|
11
|
+
* When `preserve` is `true`, all current search params are merged.
|
|
12
|
+
* When `preserve` is a `string[]`, only the named params are merged.
|
|
13
|
+
*
|
|
14
|
+
* The target href's own search params take precedence — preserved params
|
|
15
|
+
* are only added if the target doesn't already define them.
|
|
16
|
+
*
|
|
17
|
+
* @param targetHref - The resolved target href (may already contain query string)
|
|
18
|
+
* @param currentSearch - The current URL's search string (e.g. "?private=access&page=2")
|
|
19
|
+
* @param preserve - `true` to preserve all, or `string[]` to preserve specific params
|
|
20
|
+
* @returns The target href with preserved search params merged in
|
|
21
|
+
*/
|
|
22
|
+
export function mergePreservedSearchParams(
|
|
23
|
+
targetHref: string,
|
|
24
|
+
currentSearch: string,
|
|
25
|
+
preserve: true | string[]
|
|
26
|
+
): string {
|
|
27
|
+
const currentParams = new URLSearchParams(currentSearch);
|
|
28
|
+
if (currentParams.size === 0) return targetHref;
|
|
29
|
+
|
|
30
|
+
// Split hash fragment from target before processing query params.
|
|
31
|
+
// Hash must come after query string: /path?query=value#hash
|
|
32
|
+
const hashIdx = targetHref.indexOf('#');
|
|
33
|
+
const hrefWithoutHash = hashIdx >= 0 ? targetHref.slice(0, hashIdx) : targetHref;
|
|
34
|
+
const hash = hashIdx >= 0 ? targetHref.slice(hashIdx) : '';
|
|
35
|
+
|
|
36
|
+
// Split target into path and existing query
|
|
37
|
+
const qIdx = hrefWithoutHash.indexOf('?');
|
|
38
|
+
const targetPath = qIdx >= 0 ? hrefWithoutHash.slice(0, qIdx) : hrefWithoutHash;
|
|
39
|
+
const targetParams = new URLSearchParams(qIdx >= 0 ? hrefWithoutHash.slice(qIdx + 1) : '');
|
|
40
|
+
|
|
41
|
+
// Collect params to preserve (that aren't already in the target)
|
|
42
|
+
const merged = new URLSearchParams(targetParams);
|
|
43
|
+
for (const [key, value] of currentParams) {
|
|
44
|
+
// Only preserve if: (a) not already in target, and (b) included in preserve list
|
|
45
|
+
if (!targetParams.has(key)) {
|
|
46
|
+
if (preserve === true || preserve.includes(key)) {
|
|
47
|
+
merged.append(key, value);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const qs = merged.toString();
|
|
53
|
+
const pathWithQuery = qs ? `${targetPath}?${qs}` : targetPath;
|
|
54
|
+
return pathWithQuery + hash;
|
|
55
|
+
}
|
package/src/shims/font-google.ts
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Design doc: 24-fonts.md, "Next.js Font Compatibility"
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import type { GoogleFontConfig, FontResult } from '
|
|
20
|
+
import type { GoogleFontConfig, FontResult } from '../fonts/types.js';
|
|
21
21
|
|
|
22
22
|
export type { GoogleFontConfig, FontResult };
|
|
23
23
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fallback shim for `next/font/local` → `@timber/fonts/local`.
|
|
3
|
+
*
|
|
4
|
+
* At build time, the timber-fonts plugin's transform hook replaces
|
|
5
|
+
* `localFont()` calls with static FontResult objects containing real
|
|
6
|
+
* class names and font stacks. This file serves two purposes:
|
|
7
|
+
*
|
|
8
|
+
* 1. **TypeScript resolution** — provides types for IDEs and `tsc` outside
|
|
9
|
+
* of Vite's module graph (where the virtual module handles it).
|
|
10
|
+
* 2. **Runtime fallback** — returns empty className/fontFamily values when
|
|
11
|
+
* the plugin hasn't processed a call (e.g. in tests or non-Vite environments).
|
|
12
|
+
*
|
|
13
|
+
* Design doc: 24-fonts.md, "Next.js Font Compatibility"
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { LocalFontConfig, FontResult } from '../fonts/types.js';
|
|
17
|
+
|
|
18
|
+
export type { LocalFontConfig, FontResult };
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Create a local font.
|
|
22
|
+
*
|
|
23
|
+
* The timber-fonts plugin replaces these calls at build time with real
|
|
24
|
+
* class names and font stacks. This stub ensures code that imports
|
|
25
|
+
* `localFont` outside of the build pipeline (tests, type-checking)
|
|
26
|
+
* gets a valid FontResult shape without runtime errors.
|
|
27
|
+
*/
|
|
28
|
+
export default function localFont(config?: LocalFontConfig): FontResult {
|
|
29
|
+
return {
|
|
30
|
+
className: '',
|
|
31
|
+
style: { fontFamily: '' },
|
|
32
|
+
variable: config?.variable,
|
|
33
|
+
};
|
|
34
|
+
}
|
package/src/shims/headers.ts
CHANGED
|
@@ -6,4 +6,8 @@
|
|
|
6
6
|
* pipeline (both import from the same shared request-context chunk in dist/).
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
export
|
|
9
|
+
// Re-export timber's primary API
|
|
10
|
+
export { getHeaders, getCookieJar } from '@timber-js/app/server';
|
|
11
|
+
|
|
12
|
+
// Next.js compat aliases — libraries importing from 'next/headers' expect these names.
|
|
13
|
+
export { getHeaders as headers, getCookieJar as cookies } from '@timber-js/app/server';
|
|
@@ -16,11 +16,12 @@
|
|
|
16
16
|
* See design/14-ecosystem.md §"next/navigation" for the full shim audit.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
// Hooks —
|
|
19
|
+
// Hooks — useSegmentParams and useSearchParams import from direct modules
|
|
20
|
+
// since they're no longer in @timber-js/app/client public exports.
|
|
21
|
+
export { useSegmentParams } from '../client/use-segment-params.js';
|
|
22
|
+
export { useSearchParams } from '../client/use-search-params.js';
|
|
20
23
|
export {
|
|
21
|
-
useParams,
|
|
22
24
|
usePathname,
|
|
23
|
-
useSearchParams,
|
|
24
25
|
useRouter,
|
|
25
26
|
useSelectedLayoutSegment,
|
|
26
27
|
useSelectedLayoutSegments,
|
package/src/shims/navigation.ts
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shim: next/navigation → timber navigation primitives
|
|
3
3
|
*
|
|
4
|
-
* Client hooks import from
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Client hooks import from their direct modules since useSegmentParams,
|
|
5
|
+
* useSearchParams, and useQueryStates are no longer part of
|
|
6
|
+
* @timber-js/app/client public exports (they live on define* factories).
|
|
7
|
+
* The shim re-exports them for next/navigation library compat (nuqs etc).
|
|
8
|
+
*
|
|
9
|
+
* Server functions import from @timber-js/app/server for ALS singleton consistency.
|
|
7
10
|
*/
|
|
8
11
|
|
|
9
|
-
// Hooks
|
|
12
|
+
// Hooks re-exported for next/navigation compat
|
|
13
|
+
export { useSegmentParams, useSegmentParams as useParams } from '../client/use-segment-params.js';
|
|
14
|
+
export { useSearchParams } from '../client/use-search-params.js';
|
|
10
15
|
export {
|
|
11
|
-
useParams,
|
|
12
16
|
usePathname,
|
|
13
|
-
useSearchParams,
|
|
14
17
|
useRouter,
|
|
15
18
|
useSelectedLayoutSegment,
|
|
16
19
|
useSelectedLayoutSegments,
|
|
17
20
|
} from '@timber-js/app/client';
|
|
18
21
|
|
|
19
22
|
// Functions (server-side)
|
|
20
|
-
export { redirect,
|
|
23
|
+
export { redirect, redirectExternal, RedirectType } from '@timber-js/app/server';
|
|
24
|
+
|
|
25
|
+
// Next.js compat aliases — these are not part of timber's primary API.
|
|
26
|
+
// They exist so that libraries importing from 'next/navigation' still work.
|
|
27
|
+
export { permanentRedirect, notFound } from '../server/primitives.js';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AST-based directive detection for 'use
|
|
3
|
-
* 'use client', and 'use server'.
|
|
2
|
+
* AST-based directive detection for 'use client' and 'use server'.
|
|
4
3
|
*
|
|
5
4
|
* Uses acorn to parse source code and detect directives properly,
|
|
6
5
|
* avoiding false positives from regex matching inside string literals,
|
|
@@ -26,31 +25,6 @@ export interface FileDirective {
|
|
|
26
25
|
line: number;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
export interface FunctionWithDirective {
|
|
30
|
-
/** Function name (or 'default' for anonymous default exports) */
|
|
31
|
-
name: string;
|
|
32
|
-
/** The directive found in the function body */
|
|
33
|
-
directive: string;
|
|
34
|
-
/** 1-based line number of the directive */
|
|
35
|
-
directiveLine: number;
|
|
36
|
-
/** Start offset of the function in the source */
|
|
37
|
-
start: number;
|
|
38
|
-
/** End offset of the function in the source */
|
|
39
|
-
end: number;
|
|
40
|
-
/** Start offset of the function body block (after the '{') */
|
|
41
|
-
bodyStart: number;
|
|
42
|
-
/** End offset of the function body block (the '}') */
|
|
43
|
-
bodyEnd: number;
|
|
44
|
-
/** Content between { and } of the function body */
|
|
45
|
-
bodyContent: string;
|
|
46
|
-
/** 'export ', 'export default ', or '' */
|
|
47
|
-
prefix: string;
|
|
48
|
-
/** Whether this is an arrow function */
|
|
49
|
-
isArrow: boolean;
|
|
50
|
-
/** The function signature (everything before the body '{') */
|
|
51
|
-
declaration: string;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
28
|
// ---------------------------------------------------------------------------
|
|
55
29
|
// File-level directive detection
|
|
56
30
|
// ---------------------------------------------------------------------------
|
|
@@ -164,366 +138,3 @@ function detectFileDirectiveFallback(code: string, directives: string[]): FileDi
|
|
|
164
138
|
|
|
165
139
|
return null;
|
|
166
140
|
}
|
|
167
|
-
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
// Function-body directive detection
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Find all functions in the source code that contain a directive
|
|
174
|
-
* (e.g. 'use cache', 'use dynamic') as their first body statement.
|
|
175
|
-
*
|
|
176
|
-
* Parses the source with acorn and walks the AST looking for function
|
|
177
|
-
* declarations and arrow function expressions whose body is a
|
|
178
|
-
* BlockStatement with a directive prologue.
|
|
179
|
-
*
|
|
180
|
-
* Returns an array of function info objects, sorted by position
|
|
181
|
-
* (descending) for safe end-to-start replacement.
|
|
182
|
-
*/
|
|
183
|
-
export function findFunctionsWithDirective(
|
|
184
|
-
code: string,
|
|
185
|
-
directive: string
|
|
186
|
-
): FunctionWithDirective[] {
|
|
187
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
188
|
-
let ast: any;
|
|
189
|
-
try {
|
|
190
|
-
ast = jsxParser.parse(code, {
|
|
191
|
-
ecmaVersion: 'latest',
|
|
192
|
-
sourceType: 'module',
|
|
193
|
-
locations: true,
|
|
194
|
-
});
|
|
195
|
-
} catch {
|
|
196
|
-
// TypeScript fallback: return empty — callers should use the quick
|
|
197
|
-
// regex check first and skip non-matching files anyway
|
|
198
|
-
return findFunctionsWithDirectiveFallback(code, directive);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const results: FunctionWithDirective[] = [];
|
|
202
|
-
walkAst(ast, code, directive, results, []);
|
|
203
|
-
|
|
204
|
-
// Sort descending by start position for safe end-to-start replacement
|
|
205
|
-
results.sort((a, b) => b.start - a.start);
|
|
206
|
-
return results;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Recursive AST walker that finds functions with a directive in their body.
|
|
211
|
-
*/
|
|
212
|
-
function walkAst(
|
|
213
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
214
|
-
node: any,
|
|
215
|
-
code: string,
|
|
216
|
-
directive: string,
|
|
217
|
-
results: FunctionWithDirective[],
|
|
218
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
219
|
-
ancestors: any[]
|
|
220
|
-
): void {
|
|
221
|
-
if (!node || typeof node !== 'object') return;
|
|
222
|
-
|
|
223
|
-
if (Array.isArray(node)) {
|
|
224
|
-
for (const child of node) {
|
|
225
|
-
walkAst(child, code, directive, results, ancestors);
|
|
226
|
-
}
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
if (!node.type) return;
|
|
231
|
-
|
|
232
|
-
// Check function declarations and expressions
|
|
233
|
-
if (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression') {
|
|
234
|
-
checkFunctionBody(node, code, directive, results, ancestors);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Check arrow functions with block bodies
|
|
238
|
-
if (node.type === 'ArrowFunctionExpression' && node.body && node.body.type === 'BlockStatement') {
|
|
239
|
-
checkFunctionBody(node, code, directive, results, ancestors);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Walk children
|
|
243
|
-
const newAncestors = [...ancestors, node];
|
|
244
|
-
for (const key of Object.keys(node)) {
|
|
245
|
-
if (key === 'type' || key === 'loc' || key === 'start' || key === 'end') continue;
|
|
246
|
-
const child = node[key];
|
|
247
|
-
if (child && typeof child === 'object') {
|
|
248
|
-
walkAst(child, code, directive, results, newAncestors);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Check if a function's body starts with the target directive.
|
|
255
|
-
*/
|
|
256
|
-
function checkFunctionBody(
|
|
257
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
258
|
-
node: any,
|
|
259
|
-
code: string,
|
|
260
|
-
directive: string,
|
|
261
|
-
results: FunctionWithDirective[],
|
|
262
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
263
|
-
ancestors: any[]
|
|
264
|
-
): void {
|
|
265
|
-
const body = node.type === 'ArrowFunctionExpression' ? node.body : node.body;
|
|
266
|
-
if (!body || body.type !== 'BlockStatement' || body.body.length === 0) return;
|
|
267
|
-
|
|
268
|
-
// Check the first statement for a directive
|
|
269
|
-
const firstStmt = body.body[0];
|
|
270
|
-
if (
|
|
271
|
-
firstStmt.type !== 'ExpressionStatement' ||
|
|
272
|
-
firstStmt.expression.type !== 'Literal' ||
|
|
273
|
-
firstStmt.expression.value !== directive
|
|
274
|
-
) {
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// Determine function metadata from AST context
|
|
279
|
-
const parent = ancestors[ancestors.length - 1];
|
|
280
|
-
const grandparent = ancestors.length >= 2 ? ancestors[ancestors.length - 2] : null;
|
|
281
|
-
|
|
282
|
-
let name = '';
|
|
283
|
-
let prefix = '';
|
|
284
|
-
const isArrow = node.type === 'ArrowFunctionExpression';
|
|
285
|
-
let funcStart = node.start;
|
|
286
|
-
let funcEnd = node.end;
|
|
287
|
-
|
|
288
|
-
if (node.type === 'FunctionDeclaration') {
|
|
289
|
-
name = node.id?.name || 'default';
|
|
290
|
-
|
|
291
|
-
// Check for export
|
|
292
|
-
if (parent?.type === 'ExportNamedDeclaration') {
|
|
293
|
-
prefix = 'export ';
|
|
294
|
-
funcStart = parent.start;
|
|
295
|
-
funcEnd = parent.end;
|
|
296
|
-
} else if (parent?.type === 'ExportDefaultDeclaration') {
|
|
297
|
-
prefix = 'export default ';
|
|
298
|
-
funcStart = parent.start;
|
|
299
|
-
funcEnd = parent.end;
|
|
300
|
-
}
|
|
301
|
-
} else if (node.type === 'ArrowFunctionExpression') {
|
|
302
|
-
// Arrow in variable declaration: const name = async () => {}
|
|
303
|
-
if (parent?.type === 'VariableDeclarator' && parent.id?.name) {
|
|
304
|
-
name = parent.id.name;
|
|
305
|
-
// Include the full variable declaration
|
|
306
|
-
if (grandparent?.type === 'VariableDeclaration') {
|
|
307
|
-
funcStart = grandparent.start;
|
|
308
|
-
funcEnd = grandparent.end;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
} else if (node.type === 'FunctionExpression') {
|
|
312
|
-
// Function expression in variable: const name = async function() {}
|
|
313
|
-
name = node.id?.name || '';
|
|
314
|
-
if (parent?.type === 'VariableDeclarator' && parent.id?.name) {
|
|
315
|
-
name = parent.id.name;
|
|
316
|
-
if (grandparent?.type === 'VariableDeclaration') {
|
|
317
|
-
funcStart = grandparent.start;
|
|
318
|
-
funcEnd = grandparent.end;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
if (!name) return; // Skip anonymous functions we can't name
|
|
324
|
-
|
|
325
|
-
// Extract the body content (between the braces)
|
|
326
|
-
const bodyStart = body.start + 1; // after '{'
|
|
327
|
-
const bodyEnd = body.end - 1; // before '}'
|
|
328
|
-
const bodyContent = code.slice(bodyStart, bodyEnd);
|
|
329
|
-
|
|
330
|
-
// Extract declaration (everything before the body '{')
|
|
331
|
-
const declaration = code.slice(funcStart, body.start).trim();
|
|
332
|
-
|
|
333
|
-
results.push({
|
|
334
|
-
name,
|
|
335
|
-
directive,
|
|
336
|
-
directiveLine: firstStmt.loc.start.line,
|
|
337
|
-
start: funcStart,
|
|
338
|
-
end: funcEnd,
|
|
339
|
-
bodyStart,
|
|
340
|
-
bodyEnd,
|
|
341
|
-
bodyContent,
|
|
342
|
-
prefix,
|
|
343
|
-
isArrow,
|
|
344
|
-
declaration,
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// ---------------------------------------------------------------------------
|
|
349
|
-
// TypeScript fallback for function-body directives
|
|
350
|
-
// ---------------------------------------------------------------------------
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Fallback that uses regex to find functions with directives when acorn
|
|
354
|
-
* cannot parse the file (TypeScript with type annotations).
|
|
355
|
-
*
|
|
356
|
-
* This is less precise but handles common patterns. The regex approach
|
|
357
|
-
* is only used as a fallback — pure JS/JSX files always use the AST path.
|
|
358
|
-
*/
|
|
359
|
-
function findFunctionsWithDirectiveFallback(
|
|
360
|
-
code: string,
|
|
361
|
-
directive: string
|
|
362
|
-
): FunctionWithDirective[] {
|
|
363
|
-
const results: FunctionWithDirective[] = [];
|
|
364
|
-
const directivePattern = new RegExp(`['"]${escapeRegex(directive)}['"]`);
|
|
365
|
-
|
|
366
|
-
// Quick bail-out
|
|
367
|
-
if (!directivePattern.test(code)) return results;
|
|
368
|
-
|
|
369
|
-
// Pattern 1: function declarations
|
|
370
|
-
const fnDeclPattern =
|
|
371
|
-
/(?:(export\s+default\s+|export\s+))?async\s+function\s+(\w+)\s*\([^)]*\)\s*\{/g;
|
|
372
|
-
let match: RegExpExecArray | null;
|
|
373
|
-
|
|
374
|
-
while ((match = fnDeclPattern.exec(code)) !== null) {
|
|
375
|
-
const prefix = match[1]?.trim() || '';
|
|
376
|
-
const name = match[2];
|
|
377
|
-
const bodyStart = match.index + match[0].length;
|
|
378
|
-
const bodyEnd = findMatchingBraceFallback(code, bodyStart - 1);
|
|
379
|
-
if (bodyEnd === -1) continue;
|
|
380
|
-
|
|
381
|
-
const bodyContent = code.slice(bodyStart, bodyEnd);
|
|
382
|
-
// Check that the directive is the first meaningful statement
|
|
383
|
-
const trimmedBody = bodyContent.trimStart();
|
|
384
|
-
if (!trimmedBody.startsWith(`'${directive}'`) && !trimmedBody.startsWith(`"${directive}"`))
|
|
385
|
-
continue;
|
|
386
|
-
|
|
387
|
-
const directiveLine =
|
|
388
|
-
code.slice(0, bodyStart).split('\n').length +
|
|
389
|
-
bodyContent.slice(0, bodyContent.indexOf(directive)).split('\n').length -
|
|
390
|
-
1;
|
|
391
|
-
|
|
392
|
-
results.push({
|
|
393
|
-
name,
|
|
394
|
-
directive,
|
|
395
|
-
directiveLine,
|
|
396
|
-
start: match.index,
|
|
397
|
-
end: bodyEnd + 1,
|
|
398
|
-
bodyStart,
|
|
399
|
-
bodyEnd,
|
|
400
|
-
bodyContent,
|
|
401
|
-
prefix: prefix ? prefix + ' ' : '',
|
|
402
|
-
isArrow: false,
|
|
403
|
-
declaration: code.slice(match.index, bodyStart - 1).trimEnd(),
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
// Pattern 2: arrow functions
|
|
408
|
-
const arrowPattern = /(?:const|let|var)\s+(\w+)\s*=\s*async\s*(\([^)]*\)|[^=]*?)\s*=>\s*\{/g;
|
|
409
|
-
while ((match = arrowPattern.exec(code)) !== null) {
|
|
410
|
-
const name = match[1];
|
|
411
|
-
const bodyStart = match.index + match[0].length;
|
|
412
|
-
const bodyEnd = findMatchingBraceFallback(code, bodyStart - 1);
|
|
413
|
-
if (bodyEnd === -1) continue;
|
|
414
|
-
|
|
415
|
-
const bodyContent = code.slice(bodyStart, bodyEnd);
|
|
416
|
-
const trimmedBody = bodyContent.trimStart();
|
|
417
|
-
if (!trimmedBody.startsWith(`'${directive}'`) && !trimmedBody.startsWith(`"${directive}"`))
|
|
418
|
-
continue;
|
|
419
|
-
|
|
420
|
-
const directiveLine =
|
|
421
|
-
code.slice(0, bodyStart).split('\n').length +
|
|
422
|
-
bodyContent.slice(0, bodyContent.indexOf(directive)).split('\n').length -
|
|
423
|
-
1;
|
|
424
|
-
|
|
425
|
-
results.push({
|
|
426
|
-
name,
|
|
427
|
-
directive,
|
|
428
|
-
directiveLine,
|
|
429
|
-
start: match.index,
|
|
430
|
-
end: bodyEnd + 1,
|
|
431
|
-
bodyStart,
|
|
432
|
-
bodyEnd,
|
|
433
|
-
bodyContent,
|
|
434
|
-
prefix: '',
|
|
435
|
-
isArrow: true,
|
|
436
|
-
declaration: code.slice(match.index, bodyStart - 1).trimEnd(),
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
results.sort((a, b) => b.start - a.start);
|
|
441
|
-
return results;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
function escapeRegex(s: string): string {
|
|
445
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
/**
|
|
449
|
-
* Find matching closing brace — same algorithm as cache-transform.ts
|
|
450
|
-
* but kept here for the fallback path only.
|
|
451
|
-
*/
|
|
452
|
-
function findMatchingBraceFallback(code: string, openPos: number): number {
|
|
453
|
-
let depth = 1;
|
|
454
|
-
let i = openPos + 1;
|
|
455
|
-
|
|
456
|
-
while (i < code.length && depth > 0) {
|
|
457
|
-
const ch = code[i];
|
|
458
|
-
|
|
459
|
-
if (ch === "'" || ch === '"') {
|
|
460
|
-
i = skipStringFallback(code, i);
|
|
461
|
-
continue;
|
|
462
|
-
}
|
|
463
|
-
if (ch === '`') {
|
|
464
|
-
i = skipTemplateFallback(code, i);
|
|
465
|
-
continue;
|
|
466
|
-
}
|
|
467
|
-
if (ch === '/' && code[i + 1] === '/') {
|
|
468
|
-
i = code.indexOf('\n', i);
|
|
469
|
-
if (i === -1) return -1;
|
|
470
|
-
i++;
|
|
471
|
-
continue;
|
|
472
|
-
}
|
|
473
|
-
if (ch === '/' && code[i + 1] === '*') {
|
|
474
|
-
i = code.indexOf('*/', i + 2);
|
|
475
|
-
if (i === -1) return -1;
|
|
476
|
-
i += 2;
|
|
477
|
-
continue;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
if (ch === '{') depth++;
|
|
481
|
-
else if (ch === '}') depth--;
|
|
482
|
-
i++;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
return depth === 0 ? i - 1 : -1;
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
function skipStringFallback(code: string, start: number): number {
|
|
489
|
-
const quote = code[start];
|
|
490
|
-
let i = start + 1;
|
|
491
|
-
while (i < code.length) {
|
|
492
|
-
if (code[i] === '\\') {
|
|
493
|
-
i += 2;
|
|
494
|
-
continue;
|
|
495
|
-
}
|
|
496
|
-
if (code[i] === quote) return i + 1;
|
|
497
|
-
i++;
|
|
498
|
-
}
|
|
499
|
-
return i;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
function skipTemplateFallback(code: string, start: number): number {
|
|
503
|
-
let i = start + 1;
|
|
504
|
-
while (i < code.length) {
|
|
505
|
-
if (code[i] === '\\') {
|
|
506
|
-
i += 2;
|
|
507
|
-
continue;
|
|
508
|
-
}
|
|
509
|
-
if (code[i] === '`') return i + 1;
|
|
510
|
-
if (code[i] === '$' && code[i + 1] === '{') {
|
|
511
|
-
i = findMatchingBraceFallback(code, i + 1) + 1;
|
|
512
|
-
continue;
|
|
513
|
-
}
|
|
514
|
-
i++;
|
|
515
|
-
}
|
|
516
|
-
return i;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
// ---------------------------------------------------------------------------
|
|
520
|
-
// Convenience: quick regex check (for fast bail-out before AST parsing)
|
|
521
|
-
// ---------------------------------------------------------------------------
|
|
522
|
-
|
|
523
|
-
/**
|
|
524
|
-
* Quick regex check for whether code contains a directive string.
|
|
525
|
-
* Use as a fast bail-out before calling the AST-based functions.
|
|
526
|
-
*/
|
|
527
|
-
export function containsDirective(code: string, directive: string): boolean {
|
|
528
|
-
return code.includes(directive);
|
|
529
|
-
}
|