@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.160
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/agent-skill.md +344 -0
- package/dist/_chunks/actions-C9yAuoX3.js +314 -0
- package/dist/_chunks/actions-C9yAuoX3.js.map +1 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js +158 -0
- package/dist/_chunks/build-output-helper-DF5uScqS.js.map +1 -0
- package/dist/_chunks/cache-api-swbefQ6F.js +1125 -0
- package/dist/_chunks/cache-api-swbefQ6F.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-BhYDz_-x.js +638 -0
- package/dist/_chunks/cli-schema-sync-BhYDz_-x.js.map +1 -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/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.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-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/logger-CPoQkGK6.js +1523 -0
- package/dist/_chunks/logger-CPoQkGK6.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-DeAxFRMq.js +280 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.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/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.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/walkers-c8aReVgo.js +988 -0
- package/dist/_chunks/walkers-c8aReVgo.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -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 +177 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +342 -67
- 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 +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +143 -144
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +6 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +26 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +27 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- 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 +97 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- 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/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +51 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +34 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -33
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -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 -6
- 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 +182 -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 +825 -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.d.ts +120 -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 +87 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +47 -14
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +4 -4
- 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 +304 -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 +253 -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 +40 -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 +82 -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 +7807 -13691
- 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 +190 -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 +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +95 -0
- package/dist/plugins/callsite-ast.d.ts.map +1 -0
- package/dist/plugins/callsite-jsx.d.ts +35 -0
- package/dist/plugins/callsite-jsx.d.ts.map +1 -0
- package/dist/plugins/chunks.d.ts +11 -4
- package/dist/plugins/chunks.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +40 -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/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- 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/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.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 +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +85 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- 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 +65 -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 +41 -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 +82 -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 +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3577 -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/prebuilt/cache-key.d.ts +58 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +101 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +83 -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 +39 -25
- 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 -28
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +30 -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 +5 -6
- 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 +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- 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/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.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/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +199 -0
- package/docs/api/33-api-search-params.mdx +141 -0
- package/docs/api/34-api-config.mdx +189 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +76 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +136 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +168 -0
- package/docs/learn/13-configuration.mdx +145 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +139 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +102 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +179 -0
- package/src/adapters/cloudflare.ts +594 -119
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -96
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +107 -0
- package/src/cache/handler-store.ts +76 -0
- package/src/cache/index.ts +88 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +122 -15
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +233 -0
- package/src/cache/timber-cache.ts +142 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +388 -0
- package/src/cli.ts +157 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -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 +103 -0
- package/src/client/browser-entry/router-init.ts +287 -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 -7
- 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.ts +341 -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 +482 -166
- package/src/client/rsc-fetch.ts +214 -33
- package/src/client/segment-cache.ts +7 -7
- 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 +49 -14
- 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 +302 -0
- package/src/config-validation.ts +328 -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 +55 -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/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- 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 +182 -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 +63 -8
- 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 +305 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +431 -352
- 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 +378 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +186 -0
- package/src/plugins/callsite-ast.ts +167 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +144 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +293 -46
- package/src/plugins/entries.ts +129 -8
- package/src/plugins/fonts.ts +191 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +210 -0
- package/src/plugins/prebuilt.ts +700 -0
- package/src/plugins/prerender-sugar.ts +329 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +97 -12
- package/src/plugins/shims.ts +217 -64
- package/src/plugins/static-build.ts +15 -90
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +360 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -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 +281 -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 +9 -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 +123 -33
- package/src/server/actions.ts +39 -54
- package/src/server/als-registry.ts +129 -20
- package/src/server/asset-headers.ts +15 -37
- 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 +163 -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 +85 -77
- 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 +124 -12
- package/src/server/html-injector-core.ts +437 -0
- package/src/server/html-injectors.ts +267 -254
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -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 +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +538 -0
- package/src/server/pipeline.ts +226 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +224 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +696 -0
- package/src/server/prebuilt-runtime.ts +708 -0
- package/src/server/primitives.ts +155 -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 +523 -233
- 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 -76
- package/src/server/rsc-entry/index.ts +393 -329
- package/src/server/rsc-entry/render-route.ts +284 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +72 -33
- 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 +344 -0
- package/src/server/sitemap-handler.ts +157 -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 +286 -0
- package/src/server/tracing.ts +126 -14
- 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/server/workers-cache-bridge.ts +33 -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/index.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/head.d.ts +0 -16
- package/dist/client/head.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/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.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/head.ts +0 -61
- 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/client-module-map.ts +0 -58
- 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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDN header helpers — pure functions that build Cache-Control,
|
|
3
|
+
* CDN-Cache-Control, Surrogate-Control, and Surrogate-Key header values.
|
|
4
|
+
*
|
|
5
|
+
* These are developer-elected utilities for wiring CDN caching in
|
|
6
|
+
* proxy.ts / middleware.ts. The framework never sets these automatically.
|
|
7
|
+
* See design/25-production-deployments.md §Layer 2.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface CacheControlOptions {
|
|
11
|
+
/** Mark the response as publicly cacheable (CDN, shared caches). */
|
|
12
|
+
public?: boolean;
|
|
13
|
+
/** Mark the response as private (browser cache only, not CDN). */
|
|
14
|
+
private?: boolean;
|
|
15
|
+
/** Max freshness in seconds for the browser/client. */
|
|
16
|
+
maxAge?: number;
|
|
17
|
+
/** Max freshness in seconds for shared caches (CDN, proxy). Overrides maxAge for CDNs. */
|
|
18
|
+
sMaxAge?: number;
|
|
19
|
+
/** Serve stale while revalidating in the background (seconds). */
|
|
20
|
+
staleWhileRevalidate?: number;
|
|
21
|
+
/** Serve stale on upstream error (seconds). */
|
|
22
|
+
staleIfError?: number;
|
|
23
|
+
/** Response must not be stored by any cache. */
|
|
24
|
+
noStore?: boolean;
|
|
25
|
+
/** Caches must revalidate before using a stored response. */
|
|
26
|
+
noCache?: boolean;
|
|
27
|
+
/** Caches must revalidate once stale — no serving stale without checking origin. */
|
|
28
|
+
mustRevalidate?: boolean;
|
|
29
|
+
/** Response will not change — allows aggressive caching. Pair with hashed URLs. */
|
|
30
|
+
immutable?: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Build a `Cache-Control` header value.
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* ctx.headers.set('Cache-Control', cacheControl({
|
|
38
|
+
* public: true,
|
|
39
|
+
* maxAge: 300,
|
|
40
|
+
* staleWhileRevalidate: 60,
|
|
41
|
+
* }));
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function cacheControl(opts: CacheControlOptions): string {
|
|
45
|
+
if (opts.public && opts.private) {
|
|
46
|
+
throw new Error('cacheControl: public and private are mutually exclusive');
|
|
47
|
+
}
|
|
48
|
+
if (opts.noStore && opts.maxAge !== undefined) {
|
|
49
|
+
throw new Error('cacheControl: noStore makes maxAge meaningless — remove one');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const parts: string[] = [];
|
|
53
|
+
|
|
54
|
+
parts.push(opts.public ? 'public' : 'private');
|
|
55
|
+
|
|
56
|
+
if (opts.noStore) parts.push('no-store');
|
|
57
|
+
if (opts.noCache) parts.push('no-cache');
|
|
58
|
+
if (opts.maxAge !== undefined) parts.push(`max-age=${opts.maxAge}`);
|
|
59
|
+
if (opts.sMaxAge !== undefined) parts.push(`s-maxage=${opts.sMaxAge}`);
|
|
60
|
+
if (opts.staleWhileRevalidate !== undefined)
|
|
61
|
+
parts.push(`stale-while-revalidate=${opts.staleWhileRevalidate}`);
|
|
62
|
+
if (opts.staleIfError !== undefined) parts.push(`stale-if-error=${opts.staleIfError}`);
|
|
63
|
+
if (opts.mustRevalidate) parts.push('must-revalidate');
|
|
64
|
+
if (opts.immutable) parts.push('immutable');
|
|
65
|
+
|
|
66
|
+
return parts.join(', ');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface SurrogateControlOptions {
|
|
70
|
+
/** Max freshness in seconds for the surrogate (CDN). */
|
|
71
|
+
maxAge?: number;
|
|
72
|
+
/** Do not store in surrogate cache. */
|
|
73
|
+
noStore?: boolean;
|
|
74
|
+
/** Serve stale while revalidating (seconds). */
|
|
75
|
+
staleWhileRevalidate?: number;
|
|
76
|
+
/** Serve stale on error (seconds). */
|
|
77
|
+
staleIfError?: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Build a `Surrogate-Control` header value (Fastly, Akamai, Varnish).
|
|
82
|
+
*
|
|
83
|
+
* ```ts
|
|
84
|
+
* ctx.headers.set('Surrogate-Control', surrogateControl({ maxAge: 3600 }));
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export function surrogateControl(opts: SurrogateControlOptions): string {
|
|
88
|
+
const parts: string[] = [];
|
|
89
|
+
if (opts.noStore) parts.push('no-store');
|
|
90
|
+
if (opts.maxAge !== undefined) parts.push(`max-age=${opts.maxAge}`);
|
|
91
|
+
if (opts.staleWhileRevalidate !== undefined)
|
|
92
|
+
parts.push(`stale-while-revalidate=${opts.staleWhileRevalidate}`);
|
|
93
|
+
if (opts.staleIfError !== undefined) parts.push(`stale-if-error=${opts.staleIfError}`);
|
|
94
|
+
return parts.join(', ');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Build a `CDN-Cache-Control` header value (Cloudflare).
|
|
99
|
+
* Same directive syntax as Surrogate-Control but recognized by Cloudflare.
|
|
100
|
+
*
|
|
101
|
+
* ```ts
|
|
102
|
+
* ctx.headers.set('CDN-Cache-Control', cdnCacheControl({ maxAge: 3600 }));
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export function cdnCacheControl(opts: SurrogateControlOptions): string {
|
|
106
|
+
return surrogateControl(opts);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Build a `Surrogate-Key` header value — space-separated tags for CDN
|
|
111
|
+
* tag-based purging (Fastly, Cloudflare Enterprise, Akamai).
|
|
112
|
+
*
|
|
113
|
+
* Tags are deduplicated. Tags must not contain spaces or double quotes
|
|
114
|
+
* (these are separators/delimiters in the header format).
|
|
115
|
+
*
|
|
116
|
+
* ```ts
|
|
117
|
+
* ctx.headers.set('Surrogate-Key', surrogateKey(['products', `product:${id}`]));
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export function surrogateKey(tags: string[]): string {
|
|
121
|
+
for (const tag of tags) {
|
|
122
|
+
if (tag.includes(' ') || tag.includes('"')) {
|
|
123
|
+
throw new Error(`surrogateKey: tag "${tag}" must not contain spaces or double quotes`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return [...new Set(tags)].join(' ');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Build a `Cache-Tag` header value — comma-separated tags for Cloudflare
|
|
131
|
+
* Workers Cache tag-based purging. Available on ALL Cloudflare plans.
|
|
132
|
+
*
|
|
133
|
+
* Tags are deduplicated. Tags must not contain commas (the delimiter).
|
|
134
|
+
* Maximum tag length is 1024 characters per Cloudflare's limits.
|
|
135
|
+
*
|
|
136
|
+
* Use this instead of `surrogateKey()` when using Cloudflare Workers Cache
|
|
137
|
+
* (ctx.cache.purge). Workers Cache reads `Cache-Tag`, not `Surrogate-Key`.
|
|
138
|
+
*
|
|
139
|
+
* ```ts
|
|
140
|
+
* ctx.headers.set('Cache-Tag', cacheTag(['products', `product:${id}`]));
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export function cacheTag(tags: string[]): string {
|
|
144
|
+
for (const tag of tags) {
|
|
145
|
+
if (tag.includes(',')) {
|
|
146
|
+
throw new Error(`cacheTag: tag "${tag}" must not contain commas`);
|
|
147
|
+
}
|
|
148
|
+
if (tag.length > 1024) {
|
|
149
|
+
throw new Error(`cacheTag: tag "${tag}" exceeds 1024-character limit`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return [...new Set(tags)].join(',');
|
|
153
|
+
}
|
package/src/cdn/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @timber-js/app/cdn — CDN integration helpers
|
|
2
|
+
//
|
|
3
|
+
// Header utilities and purge handler for CDN caching. Developer-elected,
|
|
4
|
+
// never automatic. See design/25-production-deployments.md §Layer 2.
|
|
5
|
+
|
|
6
|
+
export { cacheControl, surrogateKey, surrogateControl, cdnCacheControl, cacheTag } from './headers';
|
|
7
|
+
export type { CacheControlOptions, SurrogateControlOptions } from './headers';
|
|
8
|
+
|
|
9
|
+
export { setCdnPurgeHandler, getCdnPurgeHandler } from './purge-store';
|
|
10
|
+
export type { CdnPurgeHandler } from './purge-store';
|
|
11
|
+
|
|
12
|
+
// Platform-specific purge handlers are at their own entry points:
|
|
13
|
+
// @timber-js/app/cdn/cloudflare → CloudflarePurge (REST API, Enterprise)
|
|
14
|
+
// @timber-js/app/cdn/cloudflare-workers → WorkersCachePurge (ctx.cache, all plans)
|
|
15
|
+
// @timber-js/app/cdn/fastly → FastlyPurge
|
|
16
|
+
// Same pattern as @timber-js/app/cache/stores/* — keeps platform
|
|
17
|
+
// dependencies out of the main CDN import.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDN purge handler singleton — same pattern as cache/handler-store.ts.
|
|
3
|
+
*
|
|
4
|
+
* Set via timber.config.ts or setCdnPurgeHandler() at boot. When set,
|
|
5
|
+
* cache.invalidate({ tag }) also triggers CDN purge for the invalidated
|
|
6
|
+
* tags, so revalidateTag() composes with CDN caching out of the box.
|
|
7
|
+
*
|
|
8
|
+
* See design/25-production-deployments.md §Layer 2.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface CdnPurgeHandler {
|
|
12
|
+
/**
|
|
13
|
+
* Purge the given cache tags from the CDN.
|
|
14
|
+
* Called by cache.invalidate when a tag is invalidated.
|
|
15
|
+
*/
|
|
16
|
+
purgeTags(tags: string[]): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let handler: CdnPurgeHandler | undefined;
|
|
20
|
+
|
|
21
|
+
/** Install a CDN purge handler. Called by the framework at boot from timber.config.ts. */
|
|
22
|
+
export function setCdnPurgeHandler(h: CdnPurgeHandler): void {
|
|
23
|
+
handler = h;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Get the current CDN purge handler, if configured. */
|
|
27
|
+
export function getCdnPurgeHandler(): CdnPurgeHandler | undefined {
|
|
28
|
+
return handler;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** @internal — reset for tests only. */
|
|
32
|
+
export function _resetCdnPurgeHandler(): void {
|
|
33
|
+
handler = undefined;
|
|
34
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers Cache purge handler — purges by cache tag via
|
|
3
|
+
* ctx.cache.purge() on the ExecutionContext.
|
|
4
|
+
*
|
|
5
|
+
* Available on ALL Cloudflare plans (no Enterprise requirement).
|
|
6
|
+
* No API token needed — uses the Workers runtime's built-in cache API.
|
|
7
|
+
*
|
|
8
|
+
* Auto-wired by the Cloudflare adapter when no user-configured CDN
|
|
9
|
+
* purge handler is set. Uses the Workers Cache ALS bridge to access
|
|
10
|
+
* ctx.cache from within the request context.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { CdnPurgeHandler } from './purge-store';
|
|
14
|
+
import { getWorkersCachePurgeCtx } from '../server/workers-cache-bridge.js';
|
|
15
|
+
|
|
16
|
+
export class WorkersCachePurge implements CdnPurgeHandler {
|
|
17
|
+
async purgeTags(tags: string[]): Promise<void> {
|
|
18
|
+
if (tags.length === 0) return;
|
|
19
|
+
|
|
20
|
+
const ctx = getWorkersCachePurgeCtx();
|
|
21
|
+
if (!ctx) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
'WorkersCachePurge: no Workers Cache context available. ' +
|
|
24
|
+
'This handler can only be used within a Cloudflare Workers request context.'
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
await ctx.purge({ tags });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -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
|
+
}
|