@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.181
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-O_LsyCE4.js +317 -0
- package/dist/_chunks/actions-O_LsyCE4.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-B-lhk9p4.js +1202 -0
- package/dist/_chunks/cache-api-B-lhk9p4.js.map +1 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js +248 -0
- package/dist/_chunks/canonicalize-DQHyFClh.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js +688 -0
- package/dist/_chunks/cli-schema-sync-D3naS3eH.js.map +1 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.js +1188 -0
- package/dist/_chunks/cloudflare-AHoWYTYr.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-COtkxMRT.js +191 -0
- package/dist/_chunks/define-COtkxMRT.js.map +1 -0
- package/dist/_chunks/define-c4au4I9R.js +82 -0
- package/dist/_chunks/define-c4au4I9R.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/json-lossy-check-ClNvBM_3.js +63 -0
- package/dist/_chunks/json-lossy-check-ClNvBM_3.js.map +1 -0
- package/dist/_chunks/logger-AWfuX-KJ.js +1468 -0
- package/dist/_chunks/logger-AWfuX-KJ.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---kTF5v8.js +315 -0
- package/dist/_chunks/plugin-context---kTF5v8.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-Dz3fcFUo.js +50 -0
- package/dist/_chunks/resolve-schema-Dz3fcFUo.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-DT_Tn0Xf.js +119 -0
- package/dist/_chunks/schema-bridge-DT_Tn0Xf.js.map +1 -0
- package/dist/_chunks/segment-classify-Byy425ng.js +176 -0
- package/dist/_chunks/segment-classify-Byy425ng.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/{use-query-states-D5KaffOK.js → use-query-states-DFvWd-EA.js} +71 -26
- package/dist/_chunks/use-query-states-DFvWd-EA.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-BtTlKviE.js +1002 -0
- package/dist/_chunks/walkers-BtTlKviE.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 +65 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +124 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +189 -21
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +2 -188
- 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 +41 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +224 -172
- 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/adapters/types.d.ts +2 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +48 -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 +31 -8
- 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/json-lossy-check.d.ts +11 -0
- package/dist/cache/json-lossy-check.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +140 -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 +52 -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 +35 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +113 -34
- 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 +27 -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 +21 -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 +185 -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 +938 -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 +121 -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 +99 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +62 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +30 -7
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +57 -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/slot-context.d.ts +31 -0
- package/dist/client/slot-context.d.ts.map +1 -0
- package/dist/client/slot-outlet.d.ts +16 -0
- package/dist/client/slot-outlet.d.ts.map +1 -0
- package/dist/client/slot-provider.d.ts +25 -0
- package/dist/client/slot-provider.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 +76 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +284 -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 +257 -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} +17 -3
- 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 +177 -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 +9243 -14093
- 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 +217 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +21 -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 +117 -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 +28 -4
- 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-options-analysis.d.ts +40 -0
- package/dist/plugins/prebuilt-options-analysis.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/request-dep.d.ts +21 -0
- package/dist/plugins/request-dep.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 +81 -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 +81 -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 +188 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +34 -441
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +42 -7
- 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 +93 -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 +12 -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 +117 -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 +242 -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 +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +182 -2906
- 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 +3892 -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 +60 -11
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/metadata.d.ts +8 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +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 +59 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +140 -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 +62 -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/key-discipline.d.ts +23 -0
- package/dist/server/prebuilt/key-discipline.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/slots.d.ts +99 -0
- package/dist/server/prebuilt/slots.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 +111 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +88 -43
- 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/request-dep.d.ts +15 -0
- package/dist/server/request-dep.d.ts.map +1 -0
- package/dist/server/route-element-builder.d.ts +53 -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/deny-fallback.d.ts +29 -0
- package/dist/server/rsc-entry/deny-fallback.d.ts.map +1 -0
- 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 +69 -37
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +51 -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 +6 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +25 -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 +36 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +89 -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 +66 -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 +72 -9
- 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 +69 -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 +120 -120
- package/dist/shims/image.d.ts.map +1 -1
- 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 +311 -0
- package/docs/api/33-api-search-params.mdx +154 -0
- package/docs/api/34-api-config.mdx +325 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +109 -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 +252 -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 +176 -0
- package/docs/learn/13-configuration.mdx +162 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +173 -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 +105 -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 +204 -0
- package/src/adapters/cloudflare.ts +620 -129
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +266 -122
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +2 -7
- 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 +114 -21
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/json-lossy-check.ts +75 -0
- package/src/cache/redis-handler.ts +197 -19
- 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 +237 -0
- package/src/cache/timber-cache.ts +161 -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 +401 -0
- package/src/cli.ts +167 -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 +113 -0
- package/src/client/browser-entry/post-hydration.ts +110 -0
- package/src/client/browser-entry/router-init.ts +286 -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 +21 -6
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +349 -150
- package/src/client/navigation-api.ts +345 -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 +589 -215
- package/src/client/rsc-fetch.ts +251 -34
- package/src/client/segment-cache.ts +105 -17
- package/src/client/segment-outlet.tsx +141 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/slot-context.ts +50 -0
- package/src/client/slot-outlet.tsx +22 -0
- package/src/client/slot-provider.tsx +32 -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 +60 -15
- 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 +108 -10
- 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 +149 -0
- package/src/config-types.ts +282 -0
- package/src/config-validation.ts +330 -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} +122 -26
- 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 +100 -18
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +348 -0
- package/src/fonts/transform.ts +311 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +446 -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 +432 -0
- package/src/plugins/adapter-build.ts +220 -7
- package/src/plugins/build-manifest.ts +177 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +243 -0
- package/src/plugins/callsite-ast.ts +472 -0
- package/src/plugins/callsite-jsx.ts +243 -0
- package/src/plugins/chunks.ts +74 -5
- package/src/plugins/client-chunks.ts +185 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +284 -94
- package/src/plugins/entries.ts +134 -16
- package/src/plugins/fonts.ts +225 -660
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt-options-analysis.ts +175 -0
- package/src/plugins/prebuilt.ts +655 -0
- package/src/plugins/prerender-sugar.ts +328 -0
- package/src/plugins/request-dep.ts +458 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +89 -12
- package/src/plugins/shims.ts +241 -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 +372 -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 +313 -0
- package/src/routing/manifest-codegen.ts +287 -0
- package/src/routing/scanner.ts +338 -189
- package/src/routing/schema-validation.ts +155 -0
- package/src/routing/segment-classify.ts +223 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +82 -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 +253 -0
- package/src/search-params/define.ts +576 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +101 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +111 -34
- package/src/server/action-client.ts +120 -29
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +137 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +19 -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 +314 -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 +495 -0
- package/src/server/html-injectors.ts +271 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +205 -24
- package/src/server/metadata.ts +21 -0
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +336 -0
- package/src/server/param-coercion.ts +207 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +45 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +545 -0
- package/src/server/pipeline.ts +274 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +298 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/key-discipline.ts +53 -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/slots.ts +190 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +809 -0
- package/src/server/prebuilt-runtime.ts +815 -0
- package/src/server/primitives.ts +160 -83
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +170 -337
- package/src/server/request-dep.ts +37 -0
- package/src/server/route-element-builder.ts +699 -295
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +158 -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/deny-fallback.ts +92 -0
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +210 -85
- package/src/server/rsc-entry/index.ts +332 -332
- package/src/server/rsc-entry/render-route.ts +300 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +102 -42
- package/src/server/rsc-entry/rsc-stream.ts +93 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +275 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +186 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +345 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +574 -250
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -86
- package/src/server/ssr-render.ts +345 -86
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +177 -30
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +288 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +214 -90
- package/src/server/tree-match.ts +262 -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 +0 -153
- 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/adapters/cloudflare.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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema key/value validation against the filesystem route tree.
|
|
3
|
+
*
|
|
4
|
+
* Runs at codegen time (build + dev) to catch mismatches between
|
|
5
|
+
* app/schema.ts keys and the actual dynamic segments on disk.
|
|
6
|
+
*
|
|
7
|
+
* Design doc: design/41-global-params.md
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileCached } from './file-cache.js';
|
|
11
|
+
import type { RouteTree, SegmentNode } from './types.js';
|
|
12
|
+
import { findSchemaFile, parseExistingSchemaKeys } from '../cli-schema-sync.js';
|
|
13
|
+
import { classifyUrlSegment } from './segment-classify.js';
|
|
14
|
+
|
|
15
|
+
export interface SchemaWarning {
|
|
16
|
+
type: 'stale-key' | 'missing-key' | 'bracket-mismatch';
|
|
17
|
+
key: string;
|
|
18
|
+
message: string;
|
|
19
|
+
filesystemKey?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Collect all unique bracket-keyed dynamic segment names from a route tree.
|
|
24
|
+
* Returns entries like '[artistSlug]', '[...slug]', '[[...topic]]'.
|
|
25
|
+
*/
|
|
26
|
+
export function collectDynamicSegmentsFromTree(tree: RouteTree): Set<string> {
|
|
27
|
+
const segments = new Set<string>();
|
|
28
|
+
walkTree(tree.root, segments);
|
|
29
|
+
return segments;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function walkTree(node: SegmentNode, segments: Set<string>): void {
|
|
33
|
+
if (node.paramName && node.segmentName) {
|
|
34
|
+
const classified = classifyUrlSegment(node.segmentName);
|
|
35
|
+
if (classified.kind !== 'static') {
|
|
36
|
+
// Use bare bracket form for schema keys — affixed segments like
|
|
37
|
+
// `img-[id].png` register as `[id]`, matching runtime codec lookup.
|
|
38
|
+
if (classified.kind === 'dynamic' && (classified.prefix || classified.suffix)) {
|
|
39
|
+
segments.add(`[${classified.name}]`);
|
|
40
|
+
} else {
|
|
41
|
+
segments.add(node.segmentName);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const child of node.children) {
|
|
46
|
+
walkTree(child, segments);
|
|
47
|
+
}
|
|
48
|
+
for (const slot of Object.values(node.slots)) {
|
|
49
|
+
walkTree(slot, segments);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Extract the param name from a bracket key.
|
|
55
|
+
* '[id]' → 'id', '[...slug]' → 'slug', '[[...topic]]' → 'topic'
|
|
56
|
+
*/
|
|
57
|
+
function extractParamName(bracketKey: string): string | null {
|
|
58
|
+
const seg = classifyUrlSegment(bracketKey);
|
|
59
|
+
if (seg.kind === 'static') return null;
|
|
60
|
+
return seg.name;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Validate schema keys against the filesystem route tree.
|
|
65
|
+
*
|
|
66
|
+
* Returns warnings for:
|
|
67
|
+
* - Stale keys: schema keys that don't match any filesystem segment
|
|
68
|
+
* - Bracket form mismatches: same param name, different bracket form
|
|
69
|
+
* - Missing keys: filesystem segments not registered in schema (informational)
|
|
70
|
+
*/
|
|
71
|
+
export function validateSchemaAgainstRoutes(tree: RouteTree, appDir: string): SchemaWarning[] {
|
|
72
|
+
const schemaPath = findSchemaFile(appDir);
|
|
73
|
+
if (!schemaPath) return [];
|
|
74
|
+
|
|
75
|
+
const content = readFileCached(schemaPath);
|
|
76
|
+
const schemaKeys = parseExistingSchemaKeys(content);
|
|
77
|
+
|
|
78
|
+
if (schemaKeys.length === 0) return [];
|
|
79
|
+
|
|
80
|
+
const filesystemSegments = collectDynamicSegmentsFromTree(tree);
|
|
81
|
+
|
|
82
|
+
return validateKeys(schemaKeys, filesystemSegments);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Core validation: compare schema keys against filesystem segments.
|
|
87
|
+
* Exported separately for testing without filesystem dependencies.
|
|
88
|
+
*/
|
|
89
|
+
export function validateKeys(
|
|
90
|
+
schemaKeys: string[],
|
|
91
|
+
filesystemSegments: Set<string>
|
|
92
|
+
): SchemaWarning[] {
|
|
93
|
+
const warnings: SchemaWarning[] = [];
|
|
94
|
+
|
|
95
|
+
// Build a map of param name → bracket form for filesystem segments
|
|
96
|
+
const fsParamToKey = new Map<string, string>();
|
|
97
|
+
for (const fsKey of filesystemSegments) {
|
|
98
|
+
const name = extractParamName(fsKey);
|
|
99
|
+
if (name) {
|
|
100
|
+
fsParamToKey.set(name, fsKey);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Build a set of schema param names for the missing-key check
|
|
105
|
+
const schemaParamNames = new Set<string>();
|
|
106
|
+
|
|
107
|
+
for (const schemaKey of schemaKeys) {
|
|
108
|
+
const schemaParamName = extractParamName(schemaKey);
|
|
109
|
+
if (!schemaParamName) continue;
|
|
110
|
+
|
|
111
|
+
schemaParamNames.add(schemaParamName);
|
|
112
|
+
|
|
113
|
+
if (filesystemSegments.has(schemaKey)) {
|
|
114
|
+
// Exact match — no issue
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Check if the param name exists but with a different bracket form
|
|
119
|
+
const fsKey = fsParamToKey.get(schemaParamName);
|
|
120
|
+
if (fsKey) {
|
|
121
|
+
warnings.push({
|
|
122
|
+
type: 'bracket-mismatch',
|
|
123
|
+
key: schemaKey,
|
|
124
|
+
filesystemKey: fsKey,
|
|
125
|
+
message:
|
|
126
|
+
`Schema key '${schemaKey}' does not match filesystem bracket form '${fsKey}'. ` +
|
|
127
|
+
`Update the schema key to '${fsKey}'.`,
|
|
128
|
+
});
|
|
129
|
+
} else {
|
|
130
|
+
warnings.push({
|
|
131
|
+
type: 'stale-key',
|
|
132
|
+
key: schemaKey,
|
|
133
|
+
message:
|
|
134
|
+
`Schema key '${schemaKey}' does not match any dynamic segment in the filesystem. ` +
|
|
135
|
+
`Remove it from app/schema.ts or create the corresponding route segment.`,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Check for filesystem segments not in schema (informational)
|
|
141
|
+
for (const fsKey of filesystemSegments) {
|
|
142
|
+
const name = extractParamName(fsKey);
|
|
143
|
+
if (name && !schemaParamNames.has(name)) {
|
|
144
|
+
warnings.push({
|
|
145
|
+
type: 'missing-key',
|
|
146
|
+
key: fsKey,
|
|
147
|
+
message:
|
|
148
|
+
`Dynamic segment '${fsKey}' has no codec in app/schema.ts (defaults to string). ` +
|
|
149
|
+
`Run: timber schema sync`,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return warnings;
|
|
155
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared segment classifier — both URL tokens and filesystem directory names.
|
|
3
|
+
*
|
|
4
|
+
* `classifyUrlSegment(token)` is a pure single-pass character parser that
|
|
5
|
+
* classifies a route segment token (e.g. "dashboard", "[id]", "[...slug]",
|
|
6
|
+
* "[[...path]]") into a typed discriminated union. NO regex, NO Node.js-only
|
|
7
|
+
* APIs — safe to import from browser code (used by `Link` interpolation).
|
|
8
|
+
*
|
|
9
|
+
* `classifySegment(dirName)` is the build-time directory-name classifier
|
|
10
|
+
* used by the scanner. It recognizes timber-only conventions (private
|
|
11
|
+
* `_*`, parallel `@*`, route groups `(name)`, intercepting routes
|
|
12
|
+
* `(.)`/`(..)`/`(...)`/`(..)(..)`) and delegates bracket syntax to
|
|
13
|
+
* `classifyUrlSegment`. It is the **single source of truth** for what
|
|
14
|
+
* counts as a routing segment — there is no separate copy in the
|
|
15
|
+
* scanner. (TIM-848.)
|
|
16
|
+
*
|
|
17
|
+
* Malformed input falls through to `{ kind: 'static' }` — the safe default.
|
|
18
|
+
*
|
|
19
|
+
* If you change the bracket syntax, update ONLY this file. Every
|
|
20
|
+
* consumer imports from here.
|
|
21
|
+
*
|
|
22
|
+
* See design/07-routing.md §"Route Segments"
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { InterceptionMarker, SegmentType } from './types.js';
|
|
26
|
+
import { INTERCEPTION_MARKERS } from './types.js';
|
|
27
|
+
|
|
28
|
+
export type UrlSegment =
|
|
29
|
+
| { kind: 'static'; value: string }
|
|
30
|
+
| { kind: 'dynamic'; name: string; prefix?: string; suffix?: string }
|
|
31
|
+
| { kind: 'catch-all'; name: string }
|
|
32
|
+
| { kind: 'optional-catch-all'; name: string };
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Classify a URL path segment token.
|
|
36
|
+
*
|
|
37
|
+
* Walks the string left-to-right in one pass:
|
|
38
|
+
* 1. Find the first '[' — characters before it are the prefix.
|
|
39
|
+
* 2. Count opening brackets (1 or 2) to detect optional.
|
|
40
|
+
* 3. Check for '...' to detect catch-all.
|
|
41
|
+
* 4. Read the param name up to the closing bracket.
|
|
42
|
+
* 5. Validate the expected closing sequence (']' or ']]').
|
|
43
|
+
* 6. Characters after the close are the suffix.
|
|
44
|
+
* 7. Reject affixes on catch-all/optional-catch-all.
|
|
45
|
+
* 8. Reject affixes that contain '[' or ']' (no multi-param segments).
|
|
46
|
+
*
|
|
47
|
+
* Any structural violation → static (safe default).
|
|
48
|
+
*/
|
|
49
|
+
export function classifyUrlSegment(token: string): UrlSegment {
|
|
50
|
+
const len = token.length;
|
|
51
|
+
if (len === 0) return { kind: 'static', value: token };
|
|
52
|
+
|
|
53
|
+
// Find first '[' — characters before it are the prefix
|
|
54
|
+
const bracketStart = token.indexOf('[');
|
|
55
|
+
if (bracketStart === -1) return { kind: 'static', value: token };
|
|
56
|
+
|
|
57
|
+
const prefix = token.slice(0, bracketStart);
|
|
58
|
+
|
|
59
|
+
let i = bracketStart + 1;
|
|
60
|
+
|
|
61
|
+
// Check for optional: '[[...'
|
|
62
|
+
const optional = i < len && token[i] === '[';
|
|
63
|
+
if (optional) i++;
|
|
64
|
+
|
|
65
|
+
// Check for catch-all: '...'
|
|
66
|
+
const catchAll = i + 2 < len && token[i] === '.' && token[i + 1] === '.' && token[i + 2] === '.';
|
|
67
|
+
if (catchAll) i += 3;
|
|
68
|
+
|
|
69
|
+
// Read param name — everything up to ']'
|
|
70
|
+
const nameStart = i;
|
|
71
|
+
while (i < len && token[i] !== ']') i++;
|
|
72
|
+
|
|
73
|
+
// Must have found a ']' and name must be non-empty
|
|
74
|
+
if (i >= len || i === nameStart) {
|
|
75
|
+
return { kind: 'static', value: token };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const name = token.slice(nameStart, i);
|
|
79
|
+
i++; // skip first ']'
|
|
80
|
+
|
|
81
|
+
// Optional requires a second ']'
|
|
82
|
+
if (optional) {
|
|
83
|
+
if (i >= len || token[i] !== ']') {
|
|
84
|
+
return { kind: 'static', value: token };
|
|
85
|
+
}
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const suffix = token.slice(i);
|
|
90
|
+
|
|
91
|
+
// Reject affixes containing brackets (no multi-param segments like [foo]-[bar])
|
|
92
|
+
if (suffix.includes('[') || suffix.includes(']')) {
|
|
93
|
+
return { kind: 'static', value: token };
|
|
94
|
+
}
|
|
95
|
+
if (prefix.includes(']')) {
|
|
96
|
+
return { kind: 'static', value: token };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const hasAffixes = prefix.length > 0 || suffix.length > 0;
|
|
100
|
+
|
|
101
|
+
if (optional && catchAll) {
|
|
102
|
+
// No affixes on optional catch-all
|
|
103
|
+
if (hasAffixes) return { kind: 'static', value: token };
|
|
104
|
+
return { kind: 'optional-catch-all', name };
|
|
105
|
+
}
|
|
106
|
+
if (catchAll) {
|
|
107
|
+
// No affixes on catch-all
|
|
108
|
+
if (hasAffixes) return { kind: 'static', value: token };
|
|
109
|
+
return { kind: 'catch-all', name };
|
|
110
|
+
}
|
|
111
|
+
if (optional) {
|
|
112
|
+
// '[[name]]' without '...' is malformed — not a valid segment syntax
|
|
113
|
+
return { kind: 'static', value: token };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (hasAffixes) {
|
|
117
|
+
return {
|
|
118
|
+
kind: 'dynamic',
|
|
119
|
+
name,
|
|
120
|
+
prefix: prefix || undefined,
|
|
121
|
+
suffix: suffix || undefined,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return { kind: 'dynamic', name };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ─── Directory-name classifier (build-time scanner) ─────────────────────────
|
|
128
|
+
|
|
129
|
+
/** Result of classifying a filesystem directory name. */
|
|
130
|
+
export interface SegmentClassification {
|
|
131
|
+
type: SegmentType;
|
|
132
|
+
paramName?: string;
|
|
133
|
+
paramPrefix?: string;
|
|
134
|
+
paramSuffix?: string;
|
|
135
|
+
interceptionMarker?: InterceptionMarker;
|
|
136
|
+
interceptedSegmentName?: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Classify a directory name into its segment type.
|
|
141
|
+
*
|
|
142
|
+
* Recognizes all timber file-system conventions in priority order:
|
|
143
|
+
* 1. Private folders: `_name` (excluded from routing)
|
|
144
|
+
* 2. Parallel route slots: `@name`
|
|
145
|
+
* 3. Intercepting routes: `(.)name`, `(..)name`, `(...)name`, `(..)(..)name`
|
|
146
|
+
* 4. Route groups: `(name)`
|
|
147
|
+
* 5. Bracket syntax: `[id]`, `[...slug]`, `[[...path]]` (delegated to
|
|
148
|
+
* `classifyUrlSegment`)
|
|
149
|
+
* 6. Static: anything else
|
|
150
|
+
*
|
|
151
|
+
* If you change the bracket syntax, update only `classifyUrlSegment`.
|
|
152
|
+
* If you change the directory-prefix conventions, update this function.
|
|
153
|
+
*/
|
|
154
|
+
export function classifySegment(dirName: string): SegmentClassification {
|
|
155
|
+
// Private folder: _name (excluded from routing)
|
|
156
|
+
if (dirName.startsWith('_')) {
|
|
157
|
+
return { type: 'private' };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Parallel route slot: @name
|
|
161
|
+
if (dirName.startsWith('@')) {
|
|
162
|
+
return { type: 'slot' };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Intercepting routes: (.)name, (..)name, (...)name, (..)(..)name
|
|
166
|
+
// Check before route groups since intercepting markers also start with (
|
|
167
|
+
const interception = parseInterceptionMarker(dirName);
|
|
168
|
+
if (interception) {
|
|
169
|
+
return {
|
|
170
|
+
type: 'intercepting',
|
|
171
|
+
interceptionMarker: interception.marker,
|
|
172
|
+
interceptedSegmentName: interception.segmentName,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Route group: (name)
|
|
177
|
+
if (dirName.startsWith('(') && dirName.endsWith(')')) {
|
|
178
|
+
return { type: 'group' };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Bracket-syntax segments: [param], [...param], [[...param]]
|
|
182
|
+
const urlSeg = classifyUrlSegment(dirName);
|
|
183
|
+
if (urlSeg.kind !== 'static') {
|
|
184
|
+
const result: SegmentClassification = { type: urlSeg.kind, paramName: urlSeg.name };
|
|
185
|
+
if (urlSeg.kind === 'dynamic') {
|
|
186
|
+
if (urlSeg.prefix) result.paramPrefix = urlSeg.prefix;
|
|
187
|
+
if (urlSeg.suffix) result.paramSuffix = urlSeg.suffix;
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return { type: 'static' };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Parse an interception marker from a directory name.
|
|
197
|
+
*
|
|
198
|
+
* Returns the marker and the remaining segment name, or null if not an
|
|
199
|
+
* intercepting route. Markers are checked longest-first to avoid `(..)`
|
|
200
|
+
* matching before `(..)(..)`.
|
|
201
|
+
*
|
|
202
|
+
* Examples:
|
|
203
|
+
* "(.)photo" → { marker: "(.)", segmentName: "photo" }
|
|
204
|
+
* "(..)feed" → { marker: "(..)", segmentName: "feed" }
|
|
205
|
+
* "(...)photos" → { marker: "(...)", segmentName: "photos" }
|
|
206
|
+
* "(..)(..)admin" → { marker: "(..)(..)", segmentName: "admin" }
|
|
207
|
+
* "(marketing)" → null (route group, not interception)
|
|
208
|
+
*/
|
|
209
|
+
function parseInterceptionMarker(
|
|
210
|
+
dirName: string
|
|
211
|
+
): { marker: InterceptionMarker; segmentName: string } | null {
|
|
212
|
+
for (const marker of INTERCEPTION_MARKERS) {
|
|
213
|
+
if (dirName.startsWith(marker)) {
|
|
214
|
+
const rest = dirName.slice(marker.length);
|
|
215
|
+
// Must have a segment name after the marker, and the rest must not
|
|
216
|
+
// be empty or end with ) (which would be a route group like "(auth)")
|
|
217
|
+
if (rest.length > 0 && !rest.endsWith(')')) {
|
|
218
|
+
return { marker, segmentName: rest };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* $segment type generation and directory-to-route mapping.
|
|
3
|
+
*
|
|
4
|
+
* Generates per-route $segment.d.ts files in .timber/types/ that mirror
|
|
5
|
+
* the app/ directory structure. TypeScript's rootDirs feature makes these
|
|
6
|
+
* importable as './$segment' from route files.
|
|
7
|
+
*
|
|
8
|
+
* Design doc: design/41-global-params.md §The $segment Module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import type { RouteTree, SegmentNode } from './types.js';
|
|
14
|
+
|
|
15
|
+
/** Info carried per directory for type generation. */
|
|
16
|
+
export interface SegmentInfo {
|
|
17
|
+
/** The URL route pattern (groups and slots stripped). e.g. '/[artistSlug]/[year]' */
|
|
18
|
+
route: string;
|
|
19
|
+
/** The full tree path including groups and slots — uniquely identifies a segment.
|
|
20
|
+
* e.g. '/(browse)/[artistSlug]/@shows/[year]' */
|
|
21
|
+
segmentPath: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Build a map of absolute filesystem directory → segment info.
|
|
26
|
+
* Used by resolveId to map a $segment import's importer to the correct route,
|
|
27
|
+
* and by writeSegmentTypes to generate per-route $segment.d.ts files.
|
|
28
|
+
*
|
|
29
|
+
* Walks every segment (not just leaves) so layouts and middleware
|
|
30
|
+
* at any depth can import $segment.
|
|
31
|
+
*/
|
|
32
|
+
export function buildDirToRouteMap(tree: RouteTree, appDir: string): Map<string, SegmentInfo> {
|
|
33
|
+
const map = new Map<string, SegmentInfo>();
|
|
34
|
+
|
|
35
|
+
function walk(node: SegmentNode, fsPath: string, treePath: string): void {
|
|
36
|
+
map.set(fsPath, {
|
|
37
|
+
route: node.urlPath || '/',
|
|
38
|
+
segmentPath: treePath || '/',
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
for (const child of node.children) {
|
|
42
|
+
const childDir = join(fsPath, child.segmentName);
|
|
43
|
+
const childTreePath = `${treePath}/${child.segmentName}`;
|
|
44
|
+
walk(child, childDir, childTreePath);
|
|
45
|
+
}
|
|
46
|
+
for (const [slotName, slotNode] of Object.entries(node.slots)) {
|
|
47
|
+
const slotDir = join(fsPath, `@${slotName}`);
|
|
48
|
+
const slotTreePath = `${treePath}/@${slotName}`;
|
|
49
|
+
walk(slotNode, slotDir, slotTreePath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
walk(tree.root, appDir, '');
|
|
54
|
+
return map;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Generate the full $segment.d.ts content for a segment.
|
|
59
|
+
*/
|
|
60
|
+
export function generateSegmentDts(info: SegmentInfo): string {
|
|
61
|
+
return [
|
|
62
|
+
`export const ROUTE: '${info.route}';`,
|
|
63
|
+
`export const SEGMENT_PATH: '${info.segmentPath}';`,
|
|
64
|
+
'',
|
|
65
|
+
].join('\n');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Generate per-route $segment.d.ts files in .timber/types/ mirroring
|
|
70
|
+
* the app/ directory structure. These files are importable via TypeScript's
|
|
71
|
+
* rootDirs feature.
|
|
72
|
+
*/
|
|
73
|
+
export async function writeSegmentTypes(
|
|
74
|
+
routeTree: RouteTree,
|
|
75
|
+
appDir: string,
|
|
76
|
+
root: string
|
|
77
|
+
): Promise<void> {
|
|
78
|
+
// Compute the relative prefix from project root to appDir.
|
|
79
|
+
// e.g. if appDir is /project/src/app, relative is 'src/app'
|
|
80
|
+
const relative = appDir.slice(root.length + 1);
|
|
81
|
+
const typesBase = join(root, '.timber', 'types', relative);
|
|
82
|
+
const map = buildDirToRouteMap(routeTree, appDir);
|
|
83
|
+
|
|
84
|
+
const writes: Promise<void>[] = [];
|
|
85
|
+
for (const [fsDir, info] of map) {
|
|
86
|
+
// Mirror the app/ structure under .timber/types/
|
|
87
|
+
const relDir = fsDir.slice(appDir.length); // e.g. '/[artistSlug]/[year]'
|
|
88
|
+
const segmentDir = join(typesBase, relDir);
|
|
89
|
+
const segmentFile = join(segmentDir, '$segment.d.ts');
|
|
90
|
+
const content = generateSegmentDts(info);
|
|
91
|
+
|
|
92
|
+
writes.push(
|
|
93
|
+
mkdir(segmentDir, { recursive: true }).then(() => writeFile(segmentFile, content, 'utf-8'))
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
await Promise.all(writes);
|
|
98
|
+
}
|
package/src/routing/types.ts
CHANGED
|
@@ -3,6 +3,23 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The route tree is built by scanning the app/ directory and recognizing
|
|
5
5
|
* file conventions (page.*, layout.*, middleware.ts, access.ts, route.ts, etc.).
|
|
6
|
+
*
|
|
7
|
+
* **Single shape, two specializations** (TIM-848):
|
|
8
|
+
*
|
|
9
|
+
* `SegmentNode<TFile>` is the one canonical in-memory shape for the
|
|
10
|
+
* timber route tree. The same interface is used at build time (with
|
|
11
|
+
* `TFile = RouteFile`) and at request time (with `TFile = ManifestFile`,
|
|
12
|
+
* see `server/route-matcher.ts`). Walkers parameterized over `TFile`
|
|
13
|
+
* work on either, eliminating the previous duplication between
|
|
14
|
+
* `SegmentNode` (Map-based) and `ManifestSegmentNode` (object-based).
|
|
15
|
+
*
|
|
16
|
+
* Keyed groups (`slots`, `statusFiles`, `jsonStatusFiles`,
|
|
17
|
+
* `legacyStatusFiles`, `metadataRoutes`) are plain `Record<string, …>`
|
|
18
|
+
* objects rather than `Map`s so that the build-time tree can be
|
|
19
|
+
* serialized into the virtual route manifest with no shape transform.
|
|
20
|
+
*
|
|
21
|
+
* See design/07-routing.md §"Route Tree Shape" and design/18-build-system.md
|
|
22
|
+
* §"Route Manifest Shape".
|
|
6
23
|
*/
|
|
7
24
|
|
|
8
25
|
/** Segment type classification */
|
|
@@ -27,7 +44,14 @@ export type InterceptionMarker = '(.)' | '(..)' | '(...)' | '(..)(..)';
|
|
|
27
44
|
/** All recognized interception markers, ordered longest-first for parsing. */
|
|
28
45
|
export const INTERCEPTION_MARKERS: InterceptionMarker[] = ['(..)(..)', '(.)', '(..)', '(...)'];
|
|
29
46
|
|
|
30
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* A single file discovered in a route segment at build time.
|
|
49
|
+
*
|
|
50
|
+
* The runtime equivalent (`ManifestFile`, defined in
|
|
51
|
+
* `server/route-matcher.ts`) replaces `extension` with a lazy `load`
|
|
52
|
+
* function. Walkers that only need `filePath` are parameterized over
|
|
53
|
+
* `TFile` and accept either.
|
|
54
|
+
*/
|
|
31
55
|
export interface RouteFile {
|
|
32
56
|
/** Absolute path to the file */
|
|
33
57
|
filePath: string;
|
|
@@ -35,14 +59,27 @@ export interface RouteFile {
|
|
|
35
59
|
extension: string;
|
|
36
60
|
}
|
|
37
61
|
|
|
38
|
-
/**
|
|
39
|
-
|
|
62
|
+
/**
|
|
63
|
+
* A node in the segment tree.
|
|
64
|
+
*
|
|
65
|
+
* Generic over `TFile` so the same interface describes both the
|
|
66
|
+
* build-time tree (`SegmentNode<RouteFile>`, the default) and the
|
|
67
|
+
* runtime manifest tree (`SegmentNode<ManifestFile>`, aliased as
|
|
68
|
+
* `ManifestSegmentNode`). All keyed groups use `Record` (not `Map`)
|
|
69
|
+
* so the build-time tree serializes to the virtual route manifest
|
|
70
|
+
* with no shape transform.
|
|
71
|
+
*/
|
|
72
|
+
export interface SegmentNode<TFile = RouteFile> {
|
|
40
73
|
/** The raw directory name (e.g. "dashboard", "[id]", "(auth)", "@sidebar") */
|
|
41
74
|
segmentName: string;
|
|
42
75
|
/** Classified segment type */
|
|
43
76
|
segmentType: SegmentType;
|
|
44
77
|
/** The dynamic param name, if dynamic (e.g. "id" for "[id]", "slug" for "[...slug]") */
|
|
45
78
|
paramName?: string;
|
|
79
|
+
/** Literal prefix before the dynamic bracket (e.g. "img-" for "img-[id].png") */
|
|
80
|
+
paramPrefix?: string;
|
|
81
|
+
/** Literal suffix after the dynamic bracket (e.g. ".png" for "img-[id].png") */
|
|
82
|
+
paramSuffix?: string;
|
|
46
83
|
/** The URL path prefix at this segment level (e.g. "/dashboard") */
|
|
47
84
|
urlPath: string;
|
|
48
85
|
/** For intercepting segments: the marker used, e.g. "(.)". */
|
|
@@ -54,40 +91,60 @@ export interface SegmentNode {
|
|
|
54
91
|
interceptedSegmentName?: string;
|
|
55
92
|
|
|
56
93
|
// --- File conventions ---
|
|
57
|
-
page?:
|
|
58
|
-
layout?:
|
|
59
|
-
middleware?:
|
|
60
|
-
access?:
|
|
61
|
-
route?:
|
|
62
|
-
|
|
63
|
-
|
|
94
|
+
page?: TFile;
|
|
95
|
+
layout?: TFile;
|
|
96
|
+
middleware?: TFile;
|
|
97
|
+
access?: TFile;
|
|
98
|
+
route?: TFile;
|
|
99
|
+
/**
|
|
100
|
+
* params.ts — isomorphic convention file exporting segmentParams and/or searchParams.
|
|
101
|
+
* Discovered by the scanner like middleware.ts and access.ts.
|
|
102
|
+
* See design/07-routing.md §"params.ts Convention File"
|
|
103
|
+
*/
|
|
104
|
+
params?: TFile;
|
|
105
|
+
error?: TFile;
|
|
106
|
+
default?: TFile;
|
|
64
107
|
/** Status-code files: 4xx.tsx, 5xx.tsx, {status}.tsx (component format) */
|
|
65
|
-
statusFiles?:
|
|
108
|
+
statusFiles?: Record<string, TFile>;
|
|
66
109
|
/** JSON status-code files: 4xx.json, 5xx.json, {status}.json */
|
|
67
|
-
jsonStatusFiles?:
|
|
110
|
+
jsonStatusFiles?: Record<string, TFile>;
|
|
68
111
|
/** denied.tsx — slot-only denial rendering */
|
|
69
|
-
denied?:
|
|
112
|
+
denied?: TFile;
|
|
70
113
|
/** Legacy compat: not-found.tsx (maps to 404), forbidden.tsx (403), unauthorized.tsx (401) */
|
|
71
|
-
legacyStatusFiles?:
|
|
72
|
-
|
|
73
|
-
prerender?: RouteFile;
|
|
74
|
-
/** search-params.ts — typed search params definition for this route */
|
|
75
|
-
searchParams?: RouteFile;
|
|
114
|
+
legacyStatusFiles?: Record<string, TFile>;
|
|
115
|
+
|
|
76
116
|
/** Metadata route files (sitemap.ts, robots.ts, icon.tsx, etc.) keyed by base name */
|
|
77
|
-
metadataRoutes?:
|
|
117
|
+
metadataRoutes?: Record<string, TFile>;
|
|
78
118
|
|
|
79
119
|
// --- Children ---
|
|
80
|
-
children: SegmentNode[];
|
|
120
|
+
children: SegmentNode<TFile>[];
|
|
81
121
|
/** Parallel route slots (keyed by slot name without @) */
|
|
82
|
-
slots:
|
|
122
|
+
slots: Record<string, SegmentNode<TFile>>;
|
|
83
123
|
}
|
|
84
124
|
|
|
85
|
-
/**
|
|
86
|
-
|
|
125
|
+
/**
|
|
126
|
+
* The full route tree output from the scanner (or the root of the
|
|
127
|
+
* runtime route manifest, when `TFile = ManifestFile`).
|
|
128
|
+
*
|
|
129
|
+
* Generic so the same wrapper carries app-root metadata for both
|
|
130
|
+
* shapes. The runtime manifest extends this with `viteRoot` (see
|
|
131
|
+
* `ManifestRoot` in `server/route-matcher.ts`).
|
|
132
|
+
*/
|
|
133
|
+
export interface RouteTree<TFile = RouteFile> {
|
|
87
134
|
/** The root segment node (representing app/) */
|
|
88
|
-
root: SegmentNode
|
|
135
|
+
root: SegmentNode<TFile>;
|
|
89
136
|
/** All discovered proxy.ts files (should be at most one, in app/) */
|
|
90
|
-
proxy?:
|
|
137
|
+
proxy?: TFile;
|
|
138
|
+
/**
|
|
139
|
+
* Global error page: app/global-error.{tsx,ts,jsx,js}
|
|
140
|
+
*
|
|
141
|
+
* Rendered as a standalone full-page replacement (no layout wrapping)
|
|
142
|
+
* when no segment-level error file is found. SSR-only render path.
|
|
143
|
+
* Must provide its own <html> and <body>.
|
|
144
|
+
*
|
|
145
|
+
* See design/10-error-handling.md §"Tier 2 — Global Error Page"
|
|
146
|
+
*/
|
|
147
|
+
globalError?: TFile;
|
|
91
148
|
}
|
|
92
149
|
|
|
93
150
|
/** Configuration passed to the scanner */
|