@timber-js/app 0.2.0-alpha.15 → 0.2.0-alpha.150
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-a0RczDnB.js +1106 -0
- package/dist/_chunks/actions-a0RczDnB.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/cache-api-Co-yI-gP.js +424 -0
- package/dist/_chunks/cache-api-Co-yI-gP.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-DJDdyEae.js +629 -0
- package/dist/_chunks/cli-schema-sync-DJDdyEae.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D_IhHEUW.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-Bssfp6ot.js +82 -0
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/define-CFmvb4Bt.js +203 -0
- package/dist/_chunks/define-CFmvb4Bt.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/href-validation-FiA_rToW.js +141 -0
- package/dist/_chunks/href-validation-FiA_rToW.js.map +1 -0
- package/dist/_chunks/logger-CM0clugc.js +645 -0
- package/dist/_chunks/logger-CM0clugc.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context-DurqFBuY.js +2 -0
- package/dist/_chunks/plugin-context-GfDWsdd2.js +268 -0
- package/dist/_chunks/plugin-context-GfDWsdd2.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-3iUvBV5T.js +50 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.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-BY3QLBL7.js +119 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.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/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.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-DvWDj453.js +790 -0
- package/dist/_chunks/walkers-DvWDj453.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 +117 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +142 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +150 -64
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +146 -147
- 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 +25 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +100 -240
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +85 -8
- package/dist/cache/redis-handler.d.ts.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/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +26 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +70 -33
- 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 +29 -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 +28 -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 +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -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 +11 -3
- 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 +900 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- 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 +122 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- 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 +86 -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/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 +12 -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 +249 -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 +50 -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/dev-page-shell.d.ts +78 -0
- package/dist/dev-tools/dev-page-shell.d.ts.map +1 -0
- package/dist/dev-tools/error-page.d.ts +32 -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/hydration-overlay.d.ts +11 -0
- package/dist/dev-tools/hydration-overlay.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/dev-tools/instrumentation.d.ts +59 -0
- 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/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -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/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +158 -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 +77 -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 +6432 -13423
- 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 +137 -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 +73 -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 +21 -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 +17 -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 +16 -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 +29 -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 +64 -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/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.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/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-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 +91 -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 +37 -440
- 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 +9 -30
- 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 +6 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.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 +115 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- 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/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +221 -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 +44 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3015 -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 +119 -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 +122 -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 +75 -31
- 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/render-utils.d.ts +25 -0
- package/dist/server/render-utils.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 +30 -18
- 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 +51 -23
- 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 +7 -5
- 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 +22 -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 +7 -6
- 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/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.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/head-header.d.ts +54 -0
- package/dist/shared/head-header.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -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/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.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 +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +16 -16
- package/dist/shims/navigation-client.d.ts +35 -11
- 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 -24
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +179 -0
- package/src/adapters/cloudflare.ts +356 -116
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +155 -99
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +47 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +84 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +110 -15
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/timber-cache.ts +132 -36
- package/src/cli-schema-sync.ts +388 -0
- package/src/cli.ts +98 -34
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +119 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +111 -0
- package/src/client/browser-entry/post-hydration.ts +104 -0
- package/src/client/browser-entry/router-init.ts +292 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +11 -3
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +346 -150
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +347 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +490 -140
- package/src/client/rsc-fetch.ts +220 -17
- 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/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 +31 -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 +311 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -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 +286 -0
- package/src/dev-tools/browser-logs.ts +291 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -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/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +7 -3
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +316 -0
- package/src/fonts/transform.ts +344 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +417 -346
- 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 +84 -0
- package/src/plugin-context.ts +325 -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 +285 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +264 -46
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +170 -663
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +85 -12
- package/src/plugins/shims.ts +207 -64
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +380 -178
- package/src/routing/convention-lint.ts +358 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/manifest-codegen.ts +290 -0
- package/src/routing/scanner.ts +248 -188
- 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/schema-bridge.ts +252 -0
- package/src/search-params/define.ts +570 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +110 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +84 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +122 -16
- package/src/server/actions.ts +39 -53
- 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 +13 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +147 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +311 -0
- package/src/server/deny-renderer.ts +80 -64
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +101 -5
- package/src/server/html-injector-core.ts +437 -0
- package/src/server/html-injectors.ts +256 -251
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +165 -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 +331 -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 +213 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +126 -63
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +481 -222
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +144 -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 +306 -89
- package/src/server/rsc-entry/helpers.ts +160 -59
- package/src/server/rsc-entry/index.ts +299 -329
- package/src/server/rsc-entry/render-route.ts +311 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +71 -26
- 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 +273 -43
- 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 +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +38 -11
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/shared/head-header.ts +69 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- 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-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- 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/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- 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 +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.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/stale-reload.ts +0 -87
- 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/codecs.ts +0 -153
- 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/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- 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
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
import type { CacheHandler, CacheOptions } from './index';
|
|
2
2
|
import { stableStringify } from './stable-stringify';
|
|
3
3
|
import { createSingleflight } from './singleflight';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
currentInvalidationEpoch,
|
|
6
|
+
lastInvalidationEpochFor,
|
|
7
|
+
wasInvalidatedSince,
|
|
8
|
+
} from './invalidation-epoch';
|
|
9
|
+
import { addSpanEventSync } from '../server/tracing.js';
|
|
10
|
+
import { logSwrRefetchFailed } from '../server/logger.js';
|
|
11
|
+
import { getWaitUntil } from '../server/waituntil-bridge.js';
|
|
5
12
|
import { fnv1aHash } from './fast-hash.js';
|
|
6
13
|
|
|
7
|
-
|
|
14
|
+
let defaultSingleflight = createSingleflight();
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Set the timeout for the module-level default singleflight.
|
|
18
|
+
* Called at framework boot with renderTimeoutMs from timber.config.ts so that
|
|
19
|
+
* cache calls without a per-call timeoutMs still get deadlock protection.
|
|
20
|
+
* See design/06-caching.md §"Singleflight Timeout — Deadlock Risk".
|
|
21
|
+
*/
|
|
22
|
+
export function setDefaultSingleflightTimeout(timeoutMs: number): void {
|
|
23
|
+
defaultSingleflight = createSingleflight({ timeoutMs });
|
|
24
|
+
}
|
|
8
25
|
|
|
9
26
|
/**
|
|
10
27
|
* Generate a cache key from function identity and serialized args.
|
|
@@ -33,17 +50,62 @@ function resolveTags<Fn extends (...args: any[]) => any>(
|
|
|
33
50
|
return opts.tags(...args);
|
|
34
51
|
}
|
|
35
52
|
|
|
36
|
-
|
|
37
|
-
|
|
53
|
+
/** Per-process count of byte-identical fn sources seen by deriveFallbackFnId. */
|
|
54
|
+
const fallbackIdOccurrences = new Map<string, number>();
|
|
55
|
+
let hasWarnedFallbackId = false;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Derive a fallback fnId for callsites the timber-cache-transform Vite plugin
|
|
59
|
+
* could not statically detect (aliased bindings, user re-export wrappers).
|
|
60
|
+
*
|
|
61
|
+
* The base is fnv1a(fn.toString()) — deterministic across instances and cold
|
|
62
|
+
* starts of the same build, so two *different* functions can never swap fnIds
|
|
63
|
+
* by module-evaluation order (the TIM-997 poisoning scenario that the old
|
|
64
|
+
* process-local counter allowed; see TIM-1054). A per-process occurrence
|
|
65
|
+
* suffix disambiguates byte-identical duplicate sources. That residue is the
|
|
66
|
+
* one remaining hazard: closures produced by the same factory share source
|
|
67
|
+
* text but capture different values, and their occurrence order may differ
|
|
68
|
+
* across instances — such callsites need an explicit `key` option.
|
|
69
|
+
*/
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
+
function deriveFallbackFnId(fn: (...args: any[]) => any): string {
|
|
72
|
+
const sourceHash = fnv1aHash(fn.toString());
|
|
73
|
+
const occurrence = fallbackIdOccurrences.get(sourceHash) ?? 0;
|
|
74
|
+
fallbackIdOccurrences.set(sourceHash, occurrence + 1);
|
|
75
|
+
|
|
76
|
+
if (!hasWarnedFallbackId && typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {
|
|
77
|
+
hasWarnedFallbackId = true;
|
|
78
|
+
console.warn(
|
|
79
|
+
'[timber] cache() callsite has no build-time stable ID and no explicit `key` option — ' +
|
|
80
|
+
'the call is not statically visible to the timber Vite plugin (e.g. an aliased ' +
|
|
81
|
+
'binding like `const c = cache` or a re-export wrapper module). Falling back to a ' +
|
|
82
|
+
'function-source hash for the cache key. With a shared CacheHandler (Redis/KV) this ' +
|
|
83
|
+
'is safe for distinct functions, but byte-identical closures from a factory can swap ' +
|
|
84
|
+
'cache entries across instances. Provide an explicit `key` option to make the cache ' +
|
|
85
|
+
'key contract stable and auditable.'
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return `timber-cache:fn:${sourceHash}:${occurrence}`;
|
|
90
|
+
}
|
|
38
91
|
|
|
39
92
|
/**
|
|
40
93
|
* Creates a cached wrapper around an async function.
|
|
41
94
|
*
|
|
42
|
-
* -
|
|
43
|
-
* - Singleflight: concurrent misses → single execution
|
|
95
|
+
* - FNV-1a default keys with normalized JSON args
|
|
96
|
+
* - Singleflight: concurrent misses → single execution AND single
|
|
97
|
+
* handler.set — the write happens inside the coalesced callback (TIM-1028)
|
|
98
|
+
* - Writes are skipped when the key/tags were invalidated while fn was in
|
|
99
|
+
* flight, so explicit invalidation is never silently undone (TIM-1028)
|
|
44
100
|
* - SWR: serve stale immediately, background refetch
|
|
45
101
|
* - Tags as string[] or function of args
|
|
46
|
-
* -
|
|
102
|
+
* - The handler is resolved per invocation via `getHandler`, never captured
|
|
103
|
+
* at wrapper-creation time — module-scope cache() wrappers created before
|
|
104
|
+
* the framework's boot wiring calls setCacheHandler() still use the
|
|
105
|
+
* configured handler once it arrives (TIM-1029)
|
|
106
|
+
* - No ALS dependency for correctness — cache() works outside a request
|
|
107
|
+
* context. The waitUntil ALS bridge is read optionally so the SWR
|
|
108
|
+
* background refetch survives handler return on Workers/Lambda.
|
|
47
109
|
*
|
|
48
110
|
* Cache hits/misses are recorded as OTEL span events on the enclosing
|
|
49
111
|
* span (not child spans). The DevSpanProcessor reads these for dev log output.
|
|
@@ -52,15 +114,30 @@ let fnIdCounter = 0;
|
|
|
52
114
|
export function createCache<Fn extends (...args: any[]) => Promise<any>>(
|
|
53
115
|
fn: Fn,
|
|
54
116
|
opts: CacheOptions<Fn>,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
117
|
+
getHandler: () => CacheHandler,
|
|
118
|
+
stableId?: string
|
|
119
|
+
): Fn {
|
|
120
|
+
// With an explicit `key` option the fnId never reaches key generation, so
|
|
121
|
+
// no fallback derivation (or warning) is needed in that case.
|
|
122
|
+
const fnId = stableId ?? (opts.key ? undefined : deriveFallbackFnId(fn));
|
|
123
|
+
|
|
124
|
+
// Per-call timeoutMs gets a dedicated singleflight instance. Otherwise
|
|
125
|
+
// resolve defaultSingleflight per invocation (not captured at creation
|
|
126
|
+
// time) so wrappers created before boot pick up the timeout once
|
|
127
|
+
// setDefaultSingleflightTimeout is called (TIM-1032, same rationale as
|
|
128
|
+
// getCacheHandler for TIM-1029).
|
|
129
|
+
const perCallSf =
|
|
130
|
+
opts.timeoutMs !== undefined ? createSingleflight({ timeoutMs: opts.timeoutMs }) : undefined;
|
|
58
131
|
|
|
59
|
-
|
|
60
|
-
|
|
132
|
+
// Cast to Fn to preserve the original function's generic call signature.
|
|
133
|
+
// Without this, generic type parameters (e.g. <T> in apiFetch<T>) are
|
|
134
|
+
// erased and callers lose type safety on the return type.
|
|
135
|
+
return (async (...args: Parameters<Fn>): Promise<Awaited<ReturnType<Fn>>> => {
|
|
136
|
+
const sf = perCallSf ?? defaultSingleflight;
|
|
137
|
+
const key = opts.key ? opts.key(...args) : defaultKeyGenerator(fnId as string, args);
|
|
61
138
|
|
|
62
139
|
const cacheStart = performance.now();
|
|
63
|
-
const cached = await
|
|
140
|
+
const cached = await getHandler().get(key);
|
|
64
141
|
|
|
65
142
|
if (cached && !cached.stale) {
|
|
66
143
|
// Record as OTEL span event on enclosing span (not a child span).
|
|
@@ -72,6 +149,30 @@ export function createCache<Fn extends (...args: any[]) => Promise<any>>(
|
|
|
72
149
|
return cached.value as Awaited<ReturnType<Fn>>;
|
|
73
150
|
}
|
|
74
151
|
|
|
152
|
+
// From here fn() will execute (SWR refetch or miss). Scope the
|
|
153
|
+
// singleflight key by the last invalidation epoch affecting this
|
|
154
|
+
// key/tags: a caller arriving after an invalidation must not coalesce
|
|
155
|
+
// onto a flight that started before it — it would receive the
|
|
156
|
+
// pre-invalidation result the invalidation was issued to discard.
|
|
157
|
+
// NUL separator: cannot collide with user-provided key strings.
|
|
158
|
+
const tags = resolveTags(opts, args);
|
|
159
|
+
const flightKey = `${key}\u0000${lastInvalidationEpochFor(key, tags)}`;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Run fn and store the result — exactly once per coalesced execution,
|
|
163
|
+
* inside the singleflight callback. The write is skipped when the key or
|
|
164
|
+
* any resolved tag was invalidated after fn started: storing would
|
|
165
|
+
* resurrect just-invalidated data as fresh for the full TTL.
|
|
166
|
+
*/
|
|
167
|
+
const executeAndStore = async (): Promise<Awaited<ReturnType<Fn>>> => {
|
|
168
|
+
const startEpoch = currentInvalidationEpoch();
|
|
169
|
+
const result = await fn(...args);
|
|
170
|
+
if (!wasInvalidatedSince(startEpoch, key, tags)) {
|
|
171
|
+
await getHandler().set(key, result, { ttl: opts.ttl, tags });
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
};
|
|
175
|
+
|
|
75
176
|
if (cached && cached.stale && opts.staleWhileRevalidate) {
|
|
76
177
|
// Record stale cache hit as OTEL span event (fire-and-forget).
|
|
77
178
|
addSpanEventSync('timber.cache.hit', {
|
|
@@ -80,27 +181,32 @@ export function createCache<Fn extends (...args: any[]) => Promise<any>>(
|
|
|
80
181
|
stale: true,
|
|
81
182
|
});
|
|
82
183
|
// Serve stale immediately, trigger background refetch
|
|
83
|
-
|
|
84
|
-
.do(`swr:${
|
|
184
|
+
const refetch = sf
|
|
185
|
+
.do(`swr:${flightKey}`, async () => {
|
|
85
186
|
try {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
await handler.set(key, fresh, { ttl: opts.ttl, tags });
|
|
89
|
-
} catch {
|
|
187
|
+
await executeAndStore();
|
|
188
|
+
} catch (err) {
|
|
90
189
|
// Failed refetch — stale entry continues to be served.
|
|
91
|
-
|
|
190
|
+
logSwrRefetchFailed({ cacheKey: key, error: err });
|
|
92
191
|
}
|
|
93
192
|
})
|
|
94
193
|
.catch(() => {
|
|
95
194
|
// Singleflight promise rejection handled — stale continues.
|
|
96
195
|
});
|
|
196
|
+
// Platforms that cancel work when the handler returns (Cloudflare
|
|
197
|
+
// Workers, Lambda) would otherwise kill the refetch mid-flight —
|
|
198
|
+
// stale data re-served forever. Register the (never-rejecting)
|
|
199
|
+
// refetch with the request's waitUntil; undefined outside a request
|
|
200
|
+
// context or on platforms without lifecycle extension (Node servers
|
|
201
|
+
// keep floating promises alive, so behavior there is unchanged).
|
|
202
|
+
getWaitUntil()?.(refetch);
|
|
97
203
|
return cached.value as Awaited<ReturnType<Fn>>;
|
|
98
204
|
}
|
|
99
205
|
|
|
100
|
-
// Cache miss (or stale without SWR) — execute with singleflight
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
206
|
+
// Cache miss (or stale without SWR) — execute with singleflight.
|
|
207
|
+
// The handler.set lives inside the coalesced callback, so N concurrent
|
|
208
|
+
// misses produce exactly one write (TIM-1028).
|
|
209
|
+
const result = await sf.do(flightKey, executeAndStore);
|
|
104
210
|
|
|
105
211
|
// Record cache miss as OTEL span event (fire-and-forget).
|
|
106
212
|
addSpanEventSync('timber.cache.miss', {
|
|
@@ -108,16 +214,6 @@ export function createCache<Fn extends (...args: any[]) => Promise<any>>(
|
|
|
108
214
|
duration_ms: Math.round(performance.now() - cacheStart),
|
|
109
215
|
});
|
|
110
216
|
|
|
111
|
-
return result
|
|
112
|
-
};
|
|
217
|
+
return result;
|
|
218
|
+
}) as unknown as Fn;
|
|
113
219
|
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Invalidate cache entries by tag or key.
|
|
117
|
-
*/
|
|
118
|
-
createCache.invalidate = async function invalidate(
|
|
119
|
-
handler: CacheHandler,
|
|
120
|
-
opts: { key?: string; tag?: string }
|
|
121
|
-
): Promise<void> {
|
|
122
|
-
await handler.invalidate(opts);
|
|
123
|
-
};
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `timber schema sync` — scan filesystem for dynamic segments, append
|
|
3
|
+
* missing entries with `codec.string` defaults, and remove stale entries
|
|
4
|
+
* whose segments no longer exist in the filesystem.
|
|
5
|
+
*
|
|
6
|
+
* Design doc: design/41-global-params.md §Auto-Scaffolding
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { scanRoutes } from './routing/scanner.js';
|
|
12
|
+
import type { SegmentNode } from './routing/types.js';
|
|
13
|
+
import { resolveAppDir } from './plugin-context.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Collect all unique bracket-keyed dynamic segment names from the route tree.
|
|
17
|
+
* Returns entries like '[artistSlug]', '[...slug]', '[[...topic]]'.
|
|
18
|
+
*/
|
|
19
|
+
export function collectDynamicSegments(appDir: string): string[] {
|
|
20
|
+
const tree = scanRoutes(appDir);
|
|
21
|
+
const segments = new Set<string>();
|
|
22
|
+
walkSegments(tree.root, segments);
|
|
23
|
+
return [...segments].sort();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function walkSegments(node: SegmentNode, segments: Set<string>): void {
|
|
27
|
+
if (node.paramName) {
|
|
28
|
+
// Reconstruct bracket key from segmentName (already has brackets)
|
|
29
|
+
segments.add(node.segmentName);
|
|
30
|
+
}
|
|
31
|
+
for (const child of node.children) {
|
|
32
|
+
walkSegments(child, segments);
|
|
33
|
+
}
|
|
34
|
+
for (const slot of Object.values(node.slots)) {
|
|
35
|
+
walkSegments(slot, segments);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Replace comment bodies (and optionally string contents) with spaces,
|
|
41
|
+
* preserving length and newlines so every index maps 1:1 to the original.
|
|
42
|
+
* Lets the structural scanning below ignore `segmentParams` mentions and
|
|
43
|
+
* braces inside comments/strings without a TS parser (fine pre-alpha,
|
|
44
|
+
* see TIM-1066).
|
|
45
|
+
*
|
|
46
|
+
* With `maskStrings`, string contents are blanked too — except literal
|
|
47
|
+
* 'segmentParams' strings, kept so a quoted property key stays findable.
|
|
48
|
+
*/
|
|
49
|
+
function maskSource(content: string, maskStrings: boolean): string {
|
|
50
|
+
const out = content.split('');
|
|
51
|
+
const n = content.length;
|
|
52
|
+
let i = 0;
|
|
53
|
+
|
|
54
|
+
const blank = (from: number, to: number): void => {
|
|
55
|
+
for (let j = from; j < to; j++) {
|
|
56
|
+
if (content[j] !== '\n') out[j] = ' ';
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
while (i < n) {
|
|
61
|
+
const ch = content[i];
|
|
62
|
+
const next = content[i + 1];
|
|
63
|
+
if (ch === '/' && next === '/') {
|
|
64
|
+
const start = i;
|
|
65
|
+
while (i < n && content[i] !== '\n') i++;
|
|
66
|
+
blank(start, i);
|
|
67
|
+
} else if (ch === '/' && next === '*') {
|
|
68
|
+
const start = i;
|
|
69
|
+
i += 2;
|
|
70
|
+
while (i < n && !(content[i] === '*' && content[i + 1] === '/')) i++;
|
|
71
|
+
i = Math.min(i + 2, n);
|
|
72
|
+
blank(start, i);
|
|
73
|
+
} else if (ch === '"' || ch === "'" || ch === '`') {
|
|
74
|
+
const start = i;
|
|
75
|
+
i++;
|
|
76
|
+
while (i < n && content[i] !== ch) {
|
|
77
|
+
if (content[i] === '\\') i++;
|
|
78
|
+
i++;
|
|
79
|
+
}
|
|
80
|
+
const end = i; // at closing quote (or n if unterminated)
|
|
81
|
+
if (maskStrings && content.slice(start + 1, end) !== 'segmentParams') {
|
|
82
|
+
blank(start + 1, end);
|
|
83
|
+
}
|
|
84
|
+
i++;
|
|
85
|
+
} else {
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return out.join('');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Locate the `segmentParams: { ... }` block in a schema file.
|
|
94
|
+
* Returns the indices of the opening and matching closing brace, or null
|
|
95
|
+
* if no segmentParams property is found. Comments and strings are masked
|
|
96
|
+
* first, so a JSDoc example mentioning `segmentParams: { ... }` above the
|
|
97
|
+
* real defineSchema call is not mistaken for the block, and braces inside
|
|
98
|
+
* comments/strings don't skew the depth count. The search is anchored to
|
|
99
|
+
* the `defineSchema(` call when present, so helper objects with their own
|
|
100
|
+
* segmentParams property earlier in the file are skipped.
|
|
101
|
+
*/
|
|
102
|
+
export function findSegmentParamsBlock(
|
|
103
|
+
content: string
|
|
104
|
+
): { openBrace: number; closeBrace: number } | null {
|
|
105
|
+
const masked = maskSource(content, true);
|
|
106
|
+
|
|
107
|
+
const defineCall = /\bdefineSchema\s*\(/.exec(masked);
|
|
108
|
+
const keyRe = /(['"]?)segmentParams\1\s*:\s*\{/g;
|
|
109
|
+
keyRe.lastIndex = defineCall ? defineCall.index + defineCall[0].length : 0;
|
|
110
|
+
const keyMatch = keyRe.exec(masked);
|
|
111
|
+
if (!keyMatch) return null;
|
|
112
|
+
|
|
113
|
+
const openBrace = keyMatch.index + keyMatch[0].length - 1;
|
|
114
|
+
let depth = 1;
|
|
115
|
+
let i = openBrace + 1;
|
|
116
|
+
while (i < masked.length && depth > 0) {
|
|
117
|
+
if (masked[i] === '{') depth++;
|
|
118
|
+
else if (masked[i] === '}') depth--;
|
|
119
|
+
i++;
|
|
120
|
+
}
|
|
121
|
+
if (depth > 0) return null;
|
|
122
|
+
// i now points to just after the closing brace
|
|
123
|
+
return { openBrace, closeBrace: i - 1 };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Parse existing bracket keys from an app/schema.ts file.
|
|
128
|
+
* Scoped to the segmentParams: { ... } block — bracket keys elsewhere in
|
|
129
|
+
* the file (unrelated objects, comments above defineSchema) are ignored.
|
|
130
|
+
* Comments inside the block are masked, so a commented-out entry does not
|
|
131
|
+
* count as registered.
|
|
132
|
+
*
|
|
133
|
+
* The key charset matches the route classifier (segment-classify.ts):
|
|
134
|
+
* any character except `]`, so hyphenated params like '[my-param]' parse.
|
|
135
|
+
*/
|
|
136
|
+
export function parseExistingSchemaKeys(content: string): string[] {
|
|
137
|
+
const block = findSegmentParamsBlock(content);
|
|
138
|
+
if (!block) return [];
|
|
139
|
+
|
|
140
|
+
const blockContent = maskSource(content, false).slice(block.openBrace, block.closeBrace);
|
|
141
|
+
const keys: string[] = [];
|
|
142
|
+
// Match quoted bracket keys like '[artistSlug]', '[...slug]', '[[...topic]]'
|
|
143
|
+
const re = /['"](\[{1,2}(?:\.{3})?[^\]]+\]{1,2})['"]\s*:/g;
|
|
144
|
+
let m: RegExpExecArray | null;
|
|
145
|
+
while ((m = re.exec(blockContent)) !== null) {
|
|
146
|
+
keys.push(m[1]);
|
|
147
|
+
}
|
|
148
|
+
return keys;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Schema file extensions to check. */
|
|
152
|
+
const SCHEMA_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Find the schema file path if it exists.
|
|
156
|
+
*/
|
|
157
|
+
export function findSchemaFile(appDir: string): string | undefined {
|
|
158
|
+
for (const ext of SCHEMA_EXTENSIONS) {
|
|
159
|
+
const p = join(appDir, `schema${ext}`);
|
|
160
|
+
if (existsSync(p)) return p;
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function defaultCodecForSegment(seg: string): string {
|
|
166
|
+
if (seg.startsWith('[[...')) return 'codec.optionalCatchAll(codec.string)';
|
|
167
|
+
if (seg.startsWith('[...')) return 'codec.stringArray';
|
|
168
|
+
return 'codec.string';
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Generate the content for a new app/schema.ts with the given segment keys.
|
|
173
|
+
*/
|
|
174
|
+
function generateNewSchema(segments: string[]): string {
|
|
175
|
+
const lines: string[] = [];
|
|
176
|
+
lines.push("import { defineSchema } from '@timber-js/app/params';");
|
|
177
|
+
lines.push("import { codec } from '@timber-js/app/codec';");
|
|
178
|
+
lines.push('');
|
|
179
|
+
lines.push('export default defineSchema({');
|
|
180
|
+
lines.push(' segmentParams: {');
|
|
181
|
+
for (const seg of segments) {
|
|
182
|
+
lines.push(` '${seg}': ${defaultCodecForSegment(seg)},`);
|
|
183
|
+
}
|
|
184
|
+
lines.push(' },');
|
|
185
|
+
lines.push('});');
|
|
186
|
+
lines.push('');
|
|
187
|
+
return lines.join('\n');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Append missing segment entries to an existing schema file.
|
|
192
|
+
* Inserts new entries before the closing `}` of segmentParams.
|
|
193
|
+
*/
|
|
194
|
+
const CODEC_IMPORT = "import { codec } from '@timber-js/app/codec';";
|
|
195
|
+
|
|
196
|
+
function hasCodecImport(content: string): boolean {
|
|
197
|
+
return /import\s+\{[^}]*\bcodec\b[^}]*\}\s+from\s+['"]@timber-js\/app\/codec['"]/.test(content);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function ensureCodecImport(content: string): string {
|
|
201
|
+
if (hasCodecImport(content)) return content;
|
|
202
|
+
|
|
203
|
+
// Insert after the last existing import statement
|
|
204
|
+
const lines = content.split('\n');
|
|
205
|
+
let lastImportIndex = -1;
|
|
206
|
+
for (let i = 0; i < lines.length; i++) {
|
|
207
|
+
if (/^\s*import\s/.test(lines[i])) lastImportIndex = i;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (lastImportIndex === -1) {
|
|
211
|
+
return CODEC_IMPORT + '\n' + content;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
lines.splice(lastImportIndex + 1, 0, CODEC_IMPORT);
|
|
215
|
+
return lines.join('\n');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function appendToSchema(content: string, newSegments: string[]): string {
|
|
219
|
+
content = ensureCodecImport(content);
|
|
220
|
+
|
|
221
|
+
const block = findSegmentParamsBlock(content);
|
|
222
|
+
if (!block) {
|
|
223
|
+
throw new Error(
|
|
224
|
+
'[timber] Could not find segmentParams in schema file. ' +
|
|
225
|
+
'Expected a defineSchema({ segmentParams: { ... } }) call.'
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
const { openBrace, closeBrace } = block;
|
|
229
|
+
|
|
230
|
+
// Detect indentation from existing entries
|
|
231
|
+
const existingLine = content.slice(openBrace, closeBrace).match(/^(\s+)['"]\[/m);
|
|
232
|
+
const indent = existingLine ? existingLine[1] : ' ';
|
|
233
|
+
|
|
234
|
+
// Build insertion text
|
|
235
|
+
const insertion = newSegments
|
|
236
|
+
.map((seg) => `${indent}'${seg}': ${defaultCodecForSegment(seg)},`)
|
|
237
|
+
.join('\n');
|
|
238
|
+
|
|
239
|
+
// Insert before the closing brace
|
|
240
|
+
const before = content.slice(0, closeBrace);
|
|
241
|
+
const after = content.slice(closeBrace);
|
|
242
|
+
|
|
243
|
+
// Add newline if the content before doesn't end with one
|
|
244
|
+
const separator = before.trimEnd().endsWith(',') ? '\n' : '\n';
|
|
245
|
+
|
|
246
|
+
return before + separator + insertion + '\n' + after;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Remove entries from the segmentParams block whose keys match `staleSegments`.
|
|
251
|
+
* Removes the entire entry including trailing comma/whitespace. Scoped to
|
|
252
|
+
* the segmentParams block — identical keys in unrelated objects elsewhere
|
|
253
|
+
* in the file are left untouched.
|
|
254
|
+
*/
|
|
255
|
+
function removeFromSchema(content: string, staleSegments: string[]): string {
|
|
256
|
+
const block = findSegmentParamsBlock(content);
|
|
257
|
+
if (!block) return content;
|
|
258
|
+
|
|
259
|
+
let blockContent = content.slice(block.openBrace, block.closeBrace);
|
|
260
|
+
// Key matching and the entry walk run on a comment-masked copy (same
|
|
261
|
+
// length, indices align) so commented-out entries are never removed.
|
|
262
|
+
// Both copies are spliced in sync to keep indices valid.
|
|
263
|
+
let blockMasked = maskSource(blockContent, false);
|
|
264
|
+
|
|
265
|
+
for (const seg of staleSegments) {
|
|
266
|
+
const escaped = seg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
267
|
+
const keyRe = new RegExp(`^[ \t]*['"]${escaped}['"][ \t]*:`, 'gm');
|
|
268
|
+
let m: RegExpExecArray | null;
|
|
269
|
+
while ((m = keyRe.exec(blockMasked)) !== null) {
|
|
270
|
+
const start = m.index;
|
|
271
|
+
let i = m.index + m[0].length;
|
|
272
|
+
let depth = 0;
|
|
273
|
+
let inString: string | null = null;
|
|
274
|
+
|
|
275
|
+
while (i < blockMasked.length) {
|
|
276
|
+
const ch = blockMasked[i];
|
|
277
|
+
if (inString) {
|
|
278
|
+
if (ch === '\\') {
|
|
279
|
+
i++;
|
|
280
|
+
} else if (ch === inString) {
|
|
281
|
+
inString = null;
|
|
282
|
+
}
|
|
283
|
+
} else if (ch === '"' || ch === "'" || ch === '`') {
|
|
284
|
+
inString = ch;
|
|
285
|
+
} else if (ch === '(' || ch === '{' || ch === '[') {
|
|
286
|
+
depth++;
|
|
287
|
+
} else if (ch === ')' || ch === '}' || ch === ']') {
|
|
288
|
+
depth--;
|
|
289
|
+
} else if (depth === 0 && ch === ',') {
|
|
290
|
+
i++;
|
|
291
|
+
break;
|
|
292
|
+
} else if (depth === 0 && (ch === '\n' || ch === '}')) {
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
i++;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Consume trailing newline
|
|
299
|
+
if (i < blockMasked.length && blockMasked[i] === '\n') i++;
|
|
300
|
+
|
|
301
|
+
blockContent = blockContent.slice(0, start) + blockContent.slice(i);
|
|
302
|
+
blockMasked = blockMasked.slice(0, start) + blockMasked.slice(i);
|
|
303
|
+
keyRe.lastIndex = start;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return content.slice(0, block.openBrace) + blockContent + content.slice(block.closeBrace);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
export interface SchemaSyncResult {
|
|
311
|
+
/** Segments found in the filesystem. */
|
|
312
|
+
filesystemSegments: string[];
|
|
313
|
+
/** Segments already defined in app/schema.ts. */
|
|
314
|
+
existingSegments: string[];
|
|
315
|
+
/** Segments that were added. */
|
|
316
|
+
addedSegments: string[];
|
|
317
|
+
/** Segments that were removed (no longer in filesystem). */
|
|
318
|
+
removedSegments: string[];
|
|
319
|
+
/** Whether a new schema file was created. */
|
|
320
|
+
created: boolean;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Run the schema sync: scan filesystem, diff against schema, append missing.
|
|
325
|
+
*/
|
|
326
|
+
export function runSchemaSync(projectRoot: string): SchemaSyncResult {
|
|
327
|
+
const appDir = resolveAppDir(projectRoot);
|
|
328
|
+
|
|
329
|
+
const filesystemSegments = collectDynamicSegments(appDir);
|
|
330
|
+
|
|
331
|
+
const schemaPath = findSchemaFile(appDir);
|
|
332
|
+
|
|
333
|
+
if (filesystemSegments.length === 0 && !schemaPath) {
|
|
334
|
+
return {
|
|
335
|
+
filesystemSegments: [],
|
|
336
|
+
existingSegments: [],
|
|
337
|
+
addedSegments: [],
|
|
338
|
+
removedSegments: [],
|
|
339
|
+
created: false,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (!schemaPath) {
|
|
344
|
+
// Create new schema file
|
|
345
|
+
const newPath = join(appDir, 'schema.ts');
|
|
346
|
+
writeFileSync(newPath, generateNewSchema(filesystemSegments), 'utf-8');
|
|
347
|
+
return {
|
|
348
|
+
filesystemSegments,
|
|
349
|
+
existingSegments: [],
|
|
350
|
+
addedSegments: filesystemSegments,
|
|
351
|
+
removedSegments: [],
|
|
352
|
+
created: true,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Read existing schema and diff
|
|
357
|
+
const content = readFileSync(schemaPath, 'utf-8');
|
|
358
|
+
const existingSegments = parseExistingSchemaKeys(content);
|
|
359
|
+
const missing = filesystemSegments.filter((seg) => !existingSegments.includes(seg));
|
|
360
|
+
const stale = existingSegments.filter((seg) => !filesystemSegments.includes(seg));
|
|
361
|
+
|
|
362
|
+
if (missing.length === 0 && stale.length === 0) {
|
|
363
|
+
return {
|
|
364
|
+
filesystemSegments,
|
|
365
|
+
existingSegments,
|
|
366
|
+
addedSegments: [],
|
|
367
|
+
removedSegments: [],
|
|
368
|
+
created: false,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
let updated = content;
|
|
373
|
+
if (stale.length > 0) {
|
|
374
|
+
updated = removeFromSchema(updated, stale);
|
|
375
|
+
}
|
|
376
|
+
if (missing.length > 0) {
|
|
377
|
+
updated = appendToSchema(updated, missing);
|
|
378
|
+
}
|
|
379
|
+
writeFileSync(schemaPath, updated, 'utf-8');
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
filesystemSegments,
|
|
383
|
+
existingSegments,
|
|
384
|
+
addedSegments: missing,
|
|
385
|
+
removedSegments: stale,
|
|
386
|
+
created: false,
|
|
387
|
+
};
|
|
388
|
+
}
|