@timber-js/app 0.2.0-alpha.18 → 0.2.0-alpha.180
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 +887 -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 +48 -15
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +26 -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 +565 -212
- package/src/client/rsc-fetch.ts +215 -34
- package/src/client/segment-cache.ts +91 -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
package/src/server/actions.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* - revalidatePath(path) re-renders the route at that path and returns the RSC
|
|
5
5
|
* flight payload for inline reconciliation.
|
|
6
|
-
* - revalidateTag(tag) invalidates
|
|
6
|
+
* - revalidateTag(tag) invalidates timber.cache entries by tag.
|
|
7
7
|
*
|
|
8
8
|
* Both are callable from anywhere on the server — actions, API routes, handlers.
|
|
9
9
|
*
|
|
@@ -14,19 +14,16 @@
|
|
|
14
14
|
* See design/08-forms-and-actions.md
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import
|
|
18
|
-
import { RedirectSignal } from './primitives';
|
|
17
|
+
import { cache } from '../cache/cache-api';
|
|
18
|
+
import { DenySignal, RedirectSignal } from './primitives';
|
|
19
19
|
import { withSpan } from './tracing';
|
|
20
20
|
import { revalidationAls, type RevalidationState } from './als-registry.js';
|
|
21
|
-
|
|
22
21
|
// ─── Types ───────────────────────────────────────────────────────────────
|
|
23
22
|
|
|
24
23
|
/** Result of rendering a revalidation — element tree before RSC serialization. */
|
|
25
24
|
export interface RevalidationResult {
|
|
26
25
|
/** React element tree (pre-serialization — passed to renderToReadableStream). */
|
|
27
26
|
element: unknown;
|
|
28
|
-
/** Resolved head elements for metadata. */
|
|
29
|
-
headElements: unknown[];
|
|
30
27
|
}
|
|
31
28
|
|
|
32
29
|
/** Renderer function that builds a React element tree for a given path. */
|
|
@@ -37,8 +34,6 @@ export type { RevalidationState } from './als-registry.js';
|
|
|
37
34
|
|
|
38
35
|
/** Options for creating the action handler. */
|
|
39
36
|
export interface ActionHandlerConfig {
|
|
40
|
-
/** Cache handler for tag invalidation. */
|
|
41
|
-
cacheHandler?: CacheHandler;
|
|
42
37
|
/** Renderer for producing RSC payloads during revalidation. */
|
|
43
38
|
renderer?: RevalidateRenderer;
|
|
44
39
|
}
|
|
@@ -62,21 +57,11 @@ export interface ActionHandlerResult {
|
|
|
62
57
|
// (the previous module-level global was vulnerable to cross-request pollution).
|
|
63
58
|
|
|
64
59
|
/**
|
|
65
|
-
*
|
|
66
|
-
* @internal —
|
|
67
|
-
*/
|
|
68
|
-
export function _setRevalidationState(state: RevalidationState): void {
|
|
69
|
-
// Enter ALS scope — this is only used by tests that call revalidatePath/Tag
|
|
70
|
-
// directly without going through executeAction().
|
|
71
|
-
revalidationAls.enterWith(state);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Clear the revalidation state after action execution.
|
|
76
|
-
* @internal — kept for test compatibility.
|
|
60
|
+
* Run `fn` inside a revalidation ALS scope.
|
|
61
|
+
* @internal — for tests that call revalidatePath/Tag directly without executeAction().
|
|
77
62
|
*/
|
|
78
|
-
export function
|
|
79
|
-
revalidationAls.
|
|
63
|
+
export function _runWithRevalidationState<T>(state: RevalidationState, fn: () => T): T {
|
|
64
|
+
return revalidationAls.run(state, fn);
|
|
80
65
|
}
|
|
81
66
|
|
|
82
67
|
/**
|
|
@@ -112,8 +97,8 @@ export function revalidatePath(path: string): void {
|
|
|
112
97
|
}
|
|
113
98
|
|
|
114
99
|
/**
|
|
115
|
-
* Invalidate all
|
|
116
|
-
* Does not return a payload — the next request for an invalidated
|
|
100
|
+
* Invalidate all timber.cache entries tagged with `tag`.
|
|
101
|
+
* Does not return a payload — the next request for an invalidated entry re-executes.
|
|
117
102
|
*
|
|
118
103
|
* @param tag - The cache tag to invalidate (e.g. 'products', 'user:123').
|
|
119
104
|
*/
|
|
@@ -172,9 +157,26 @@ export async function executeAction(
|
|
|
172
157
|
}
|
|
173
158
|
});
|
|
174
159
|
|
|
175
|
-
// Process tag invalidation
|
|
176
|
-
|
|
177
|
-
|
|
160
|
+
// Process tag invalidation through cache.invalidate so it records the
|
|
161
|
+
// invalidation epoch — an in-flight cached fn must not re-store data this
|
|
162
|
+
// mutation just invalidated (TIM-1028). cache.invalidate resolves the
|
|
163
|
+
// module-level handler singleton: setCacheHandler() is called at boot from
|
|
164
|
+
// rsc-entry when timber.config.ts provides a cacheHandler; otherwise falls
|
|
165
|
+
// back to in-memory LRU (TIM-599).
|
|
166
|
+
if (state.tags.length > 0) {
|
|
167
|
+
// cache.invalidate handles both data-cache clearing AND component-seed
|
|
168
|
+
// tombstone writes (design/45 §ISR mechanics) — no separate tombstone
|
|
169
|
+
// step needed here.
|
|
170
|
+
// Best-effort: the action body already executed and its mutation committed.
|
|
171
|
+
// Use allSettled so all tags settle before proceeding — Promise.all would
|
|
172
|
+
// short-circuit on the first rejection, leaving other invalidations (including
|
|
173
|
+
// component-seed tombstone writes) in-flight during revalidatePath rendering.
|
|
174
|
+
const results = await Promise.allSettled(state.tags.map((tag) => cache.invalidate({ tag })));
|
|
175
|
+
for (const r of results) {
|
|
176
|
+
if (r.status === 'rejected') {
|
|
177
|
+
console.error('[timber] revalidateTag invalidation failed:', r.reason);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
// Process path revalidation — build element tree (not yet serialized)
|
|
@@ -187,11 +189,28 @@ export async function executeAction(
|
|
|
187
189
|
revalidation = await config.renderer(path);
|
|
188
190
|
} catch (renderError) {
|
|
189
191
|
if (renderError instanceof RedirectSignal) {
|
|
190
|
-
// Revalidation triggered a redirect (e.g., session expired
|
|
192
|
+
// Revalidation triggered a redirect (e.g., session expired,
|
|
193
|
+
// middleware on the target path called `redirect()`).
|
|
191
194
|
redirectTo = renderError.location;
|
|
192
195
|
redirectStatus = renderError.status;
|
|
196
|
+
} else if (renderError instanceof DenySignal) {
|
|
197
|
+
// Target path's middleware/access denied this user.
|
|
198
|
+
//
|
|
199
|
+
// Dropping the revalidation here is the security boundary added
|
|
200
|
+
// in TIM-996: without this branch, a DenySignal would fall into
|
|
201
|
+
// the `console.error` path AND the element tree would have
|
|
202
|
+
// already been built and serialized — leaking a privileged RSC
|
|
203
|
+
// payload to the action submitter. By the time the signal
|
|
204
|
+
// surfaces, the renderer has thrown BEFORE building the tree,
|
|
205
|
+
// so we simply drop `revalidation` and ship the action result
|
|
206
|
+
// alone. The action itself still succeeded.
|
|
207
|
+
console.error(
|
|
208
|
+
`[timber] revalidatePath dropped — target middleware denied (status ${renderError.status})`
|
|
209
|
+
);
|
|
193
210
|
} else {
|
|
194
|
-
// Log but don't fail the action — revalidation is best-effort
|
|
211
|
+
// Log but don't fail the action — revalidation is best-effort.
|
|
212
|
+
// Includes input-validation rejections from the renderer
|
|
213
|
+
// (e.g., revalidatePath('//evil.com/admin')).
|
|
195
214
|
console.error('[timber] revalidatePath render failed:', renderError);
|
|
196
215
|
}
|
|
197
216
|
}
|
|
@@ -203,28 +222,3 @@ export async function executeAction(
|
|
|
203
222
|
...(redirectTo ? { redirectTo, redirectStatus } : {}),
|
|
204
223
|
};
|
|
205
224
|
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Build an HTTP Response for a no-JS form submission.
|
|
209
|
-
* Standard POST → 302 redirect pattern.
|
|
210
|
-
*
|
|
211
|
-
* @param redirectPath - Where to redirect after the action executes.
|
|
212
|
-
*/
|
|
213
|
-
export function buildNoJsResponse(redirectPath: string, status: number = 302): Response {
|
|
214
|
-
return new Response(null, {
|
|
215
|
-
status,
|
|
216
|
-
headers: { Location: redirectPath },
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Detect whether the incoming request is an RSC action request (with JS)
|
|
222
|
-
* or a plain HTML form POST (no JS).
|
|
223
|
-
*
|
|
224
|
-
* RSC action requests use Accept: text/x-component or Content-Type: text/x-component.
|
|
225
|
-
*/
|
|
226
|
-
export function isRscActionRequest(req: Request): boolean {
|
|
227
|
-
const accept = req.headers.get('Accept') ?? '';
|
|
228
|
-
const contentType = req.headers.get('Content-Type') ?? '';
|
|
229
|
-
return accept.includes('text/x-component') || contentType.includes('text/x-component');
|
|
230
|
-
}
|
|
@@ -6,28 +6,64 @@
|
|
|
6
6
|
* this registry and re-export public accessor functions.
|
|
7
7
|
*
|
|
8
8
|
* Why: ALS instances require singleton semantics — if two copies of the
|
|
9
|
-
* same ALS exist (one from a relative import, one from a barrel import
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* same ALS exist (one from a relative import, one from a barrel import,
|
|
10
|
+
* or the same file re-evaluated by Vite after an HMR invalidation), one
|
|
11
|
+
* module writes to its copy and another reads from an empty copy.
|
|
12
|
+
* Centralizing ALS creation in a single module + anchoring each instance
|
|
13
|
+
* on `globalThis` under a `Symbol.for(...)` key eliminates this class of
|
|
14
|
+
* bug, including the Vite-dev case where module instance split would
|
|
15
|
+
* otherwise hand two copies of this file out of a single evaluation cycle.
|
|
12
16
|
*
|
|
13
|
-
* The `timber-shims` plugin
|
|
14
|
-
*
|
|
17
|
+
* The `timber-shims` plugin remaps `@timber-js/app/server` to src/ in
|
|
18
|
+
* RSC and SSR environments so import-specifier paths converge here, and
|
|
19
|
+
* the `globalThis[SYMBOL_FOR]` anchor below closes the remaining gap: any
|
|
20
|
+
* second evaluation of this module picks up the ALS the first evaluation
|
|
21
|
+
* already stored rather than instantiating a fresh one. Same pattern the
|
|
22
|
+
* Cloudflare bindings ALS uses in `adapters/cloudflare.ts`.
|
|
15
23
|
*
|
|
16
24
|
* DO NOT create ALS instances outside this file. If you need a new ALS,
|
|
17
25
|
* add it here and import from `./als-registry.js` in the consuming module.
|
|
26
|
+
* Inside this file, always route through `getOrCreateAls(symbol)` — a raw
|
|
27
|
+
* `new AsyncLocalStorage()` reintroduces the instance-split hazard.
|
|
18
28
|
*
|
|
19
29
|
* See design/18-build-system.md §"Module Singleton Strategy" and
|
|
20
|
-
* §"Singleton State Registry".
|
|
30
|
+
* §"Singleton State Registry". Regression test:
|
|
31
|
+
* `tests/als-registry-singleton.test.ts`.
|
|
21
32
|
*/
|
|
22
33
|
|
|
34
|
+
import '#server-only-guard';
|
|
23
35
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
36
|
+
import type { DebugComponentEntry } from './rsc-entry/helpers.js';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Return a process-wide singleton `AsyncLocalStorage` keyed by `symbol`.
|
|
40
|
+
*
|
|
41
|
+
* `Symbol.for(...)` keys live in the cross-realm symbol registry, and
|
|
42
|
+
* `globalThis` is shared across every module evaluation inside the same
|
|
43
|
+
* Node.js process. Together they give a stable anchor that survives
|
|
44
|
+
* re-evaluation of this file — the second evaluation observes the
|
|
45
|
+
* `globalThis[symbol]` slot already populated by the first and hands
|
|
46
|
+
* back the identical ALS instance.
|
|
47
|
+
*/
|
|
48
|
+
function getOrCreateAls<T>(symbol: symbol): AsyncLocalStorage<T> {
|
|
49
|
+
const g = globalThis as unknown as Record<symbol, unknown>;
|
|
50
|
+
const existing = g[symbol];
|
|
51
|
+
if (existing instanceof AsyncLocalStorage) {
|
|
52
|
+
return existing as AsyncLocalStorage<T>;
|
|
53
|
+
}
|
|
54
|
+
const created = new AsyncLocalStorage<T>();
|
|
55
|
+
g[symbol] = created;
|
|
56
|
+
return created;
|
|
57
|
+
}
|
|
24
58
|
|
|
25
59
|
// ─── Request Context ──────────────────────────────────────────────────────
|
|
26
|
-
// Used by: request-context.ts (
|
|
60
|
+
// Used by: request-context.ts (getHeaders(), getCookies(), getSearchParams())
|
|
27
61
|
// Design doc: design/04-authorization.md
|
|
28
62
|
|
|
29
63
|
/** @internal — import via request-context.ts public API */
|
|
30
|
-
export const requestContextAls =
|
|
64
|
+
export const requestContextAls = getOrCreateAls<RequestContextStore>(
|
|
65
|
+
Symbol.for('timber:request-context-als')
|
|
66
|
+
);
|
|
31
67
|
|
|
32
68
|
export interface RequestContextStore {
|
|
33
69
|
/** Incoming request headers (read-only view). */
|
|
@@ -39,28 +75,82 @@ export interface RequestContextStore {
|
|
|
39
75
|
/** Original (pre-overlay) frozen headers, kept for overlay merging. */
|
|
40
76
|
originalHeaders: Headers;
|
|
41
77
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
78
|
+
* Raw URLSearchParams for the current request.
|
|
79
|
+
* To get typed parsed params, import a search params definition and
|
|
80
|
+
* call `.parse(searchParams())`.
|
|
81
|
+
*/
|
|
82
|
+
searchParams: URLSearchParams;
|
|
83
|
+
/**
|
|
84
|
+
* Raw search string from the request URL (e.g. "?foo=bar&baz=1").
|
|
85
|
+
* Available synchronously for use in `redirect()` with `preserveSearchParams`.
|
|
86
|
+
*/
|
|
87
|
+
searchString: string;
|
|
88
|
+
/**
|
|
89
|
+
* Coerced segment params for the current request.
|
|
90
|
+
* Set by the pipeline after route matching and param coercion, before
|
|
91
|
+
* middleware and rendering. Pages and layouts read params via
|
|
92
|
+
* `getSegmentParams()` instead of receiving them as a prop.
|
|
93
|
+
*
|
|
94
|
+
* See design/07-routing.md §"params.ts — Convention File for Typed Params"
|
|
95
|
+
*/
|
|
96
|
+
segmentParams?: Record<string, string | string[]>;
|
|
97
|
+
/**
|
|
98
|
+
* The matched segment path (e.g. '/(browse)/[artistSlug]/[year]').
|
|
99
|
+
* Includes route groups and parallel slots — uniquely identifies the
|
|
100
|
+
* segment in the route tree. Set by the pipeline alongside segmentParams.
|
|
101
|
+
* Used by getSegmentParams() for dev-mode validation.
|
|
102
|
+
* See design/41-global-params.md §Runtime Validation
|
|
103
|
+
*/
|
|
104
|
+
matchedSegmentPath?: string;
|
|
105
|
+
/**
|
|
106
|
+
* Per-slot coerced segment params, keyed by the slot's full tree path
|
|
107
|
+
* (e.g. '/(browse)/@shows/[artistSlug]/[...year]').
|
|
108
|
+
*
|
|
109
|
+
* Each slot walks its own segment tree and may interpret URL parts
|
|
110
|
+
* differently from the main route (e.g. catch-all vs dynamic). This
|
|
111
|
+
* map stores slot-specific params so getSegmentParams(segmentPath)
|
|
112
|
+
* returns the correct types for slot pages.
|
|
113
|
+
*
|
|
114
|
+
* See design/07-routing.md §"Parallel Slot Params"
|
|
45
115
|
*/
|
|
46
|
-
|
|
116
|
+
slotParamsMap?: Map<string, Record<string, string | string[]>>;
|
|
47
117
|
/** Outgoing Set-Cookie entries (name → serialized value + options). Last write wins. */
|
|
48
118
|
cookieJar: Map<string, CookieEntry>;
|
|
49
119
|
/** Whether the response has flushed (headers committed). */
|
|
50
120
|
flushed: boolean;
|
|
51
121
|
/** Whether the current context allows cookie mutation. */
|
|
52
122
|
mutableContext: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Set by AccessGate or PageDenyBoundary when a DenySignal is caught
|
|
125
|
+
* server-side (inside the React tree, before React Flight sees it).
|
|
126
|
+
* The pipeline reads this after render to set the HTTP status code.
|
|
127
|
+
* See TIM-666.
|
|
128
|
+
*/
|
|
129
|
+
denyStatus?: number;
|
|
130
|
+
/**
|
|
131
|
+
* Callback fired when setDenyStatus() is called. Used by shellSettled
|
|
132
|
+
* to short-circuit when any component catches a DenySignal in-tree,
|
|
133
|
+
* regardless of which component caught it (AccessGate, TracedLayout,
|
|
134
|
+
* or PageDenyBoundary). See TIM-1208.
|
|
135
|
+
*/
|
|
136
|
+
onDenyStatus?: () => void;
|
|
137
|
+
/**
|
|
138
|
+
* Dev-only: getter for the current request's RSC debug components.
|
|
139
|
+
* Set by renderRoute() so onPipelineError can include component tree
|
|
140
|
+
* context for render-phase errors without module-level shared state.
|
|
141
|
+
*/
|
|
142
|
+
debugComponentsGetter?: () => DebugComponentEntry[];
|
|
53
143
|
}
|
|
54
144
|
|
|
55
145
|
/** A single outgoing cookie entry in the cookie jar. */
|
|
56
146
|
export interface CookieEntry {
|
|
57
147
|
name: string;
|
|
58
148
|
value: string;
|
|
59
|
-
options: import('./
|
|
149
|
+
options: import('./cookie-context.js').CookieOptions;
|
|
60
150
|
}
|
|
61
151
|
|
|
62
152
|
// ─── Tracing ──────────────────────────────────────────────────────────────
|
|
63
|
-
// Used by: tracing.ts (
|
|
153
|
+
// Used by: tracing.ts (getTraceId(), getSpanId())
|
|
64
154
|
// Design doc: design/17-logging.md
|
|
65
155
|
|
|
66
156
|
export interface TraceStore {
|
|
@@ -68,10 +158,17 @@ export interface TraceStore {
|
|
|
68
158
|
traceId: string;
|
|
69
159
|
/** OTEL span ID if available, undefined otherwise. */
|
|
70
160
|
spanId?: string;
|
|
161
|
+
/**
|
|
162
|
+
* Innermost active native platform span (e.g. Cloudflare's `Span` from
|
|
163
|
+
* tracing.enterSpan()). Tracked so setSpanAttribute() can set attributes
|
|
164
|
+
* after span creation — the platform API has no getActiveSpan() equivalent.
|
|
165
|
+
* Saved/restored by withSpan() around each callback. See TIM-1135.
|
|
166
|
+
*/
|
|
167
|
+
platformSpan?: import('./tracing.js').PlatformSpan;
|
|
71
168
|
}
|
|
72
169
|
|
|
73
170
|
/** @internal — import via tracing.ts public API */
|
|
74
|
-
export const traceAls =
|
|
171
|
+
export const traceAls = getOrCreateAls<TraceStore>(Symbol.for('timber:trace-als'));
|
|
75
172
|
|
|
76
173
|
// ─── Server-Timing ────────────────────────────────────────────────────────
|
|
77
174
|
// Used by: server-timing.ts (recordTiming(), withTiming())
|
|
@@ -82,7 +179,7 @@ export interface TimingStore {
|
|
|
82
179
|
}
|
|
83
180
|
|
|
84
181
|
/** @internal — import via server-timing.ts public API */
|
|
85
|
-
export const timingAls =
|
|
182
|
+
export const timingAls = getOrCreateAls<TimingStore>(Symbol.for('timber:timing-als'));
|
|
86
183
|
|
|
87
184
|
// ─── Revalidation ─────────────────────────────────────────────────────────
|
|
88
185
|
// Used by: actions.ts (revalidatePath(), revalidateTag())
|
|
@@ -96,14 +193,18 @@ export interface RevalidationState {
|
|
|
96
193
|
}
|
|
97
194
|
|
|
98
195
|
/** @internal — import via actions.ts public API */
|
|
99
|
-
export const revalidationAls =
|
|
196
|
+
export const revalidationAls = getOrCreateAls<RevalidationState>(
|
|
197
|
+
Symbol.for('timber:revalidation-als')
|
|
198
|
+
);
|
|
100
199
|
|
|
101
200
|
// ─── Form Flash ───────────────────────────────────────────────────────────
|
|
102
201
|
// Used by: form-flash.ts (getFormFlash())
|
|
103
202
|
// Design doc: design/08-forms-and-actions.md §"No-JS Error Round-Trip"
|
|
104
203
|
|
|
105
204
|
/** @internal — import via form-flash.ts public API */
|
|
106
|
-
export const formFlashAls =
|
|
205
|
+
export const formFlashAls = getOrCreateAls<import('./form-flash.js').FormFlashData>(
|
|
206
|
+
Symbol.for('timber:form-flash-als')
|
|
207
|
+
);
|
|
107
208
|
|
|
108
209
|
// ─── Early Hints Sender ──────────────────────────────────────────────────
|
|
109
210
|
// Used by: early-hints-sender.ts (sendEarlyHints103())
|
|
@@ -113,7 +214,9 @@ export const formFlashAls = new AsyncLocalStorage<import('./form-flash.js').Form
|
|
|
113
214
|
export type EarlyHintsSenderFn = (links: string[]) => void;
|
|
114
215
|
|
|
115
216
|
/** @internal — import via early-hints-sender.ts public API */
|
|
116
|
-
export const earlyHintsSenderAls =
|
|
217
|
+
export const earlyHintsSenderAls = getOrCreateAls<EarlyHintsSenderFn>(
|
|
218
|
+
Symbol.for('timber:early-hints-sender-als')
|
|
219
|
+
);
|
|
117
220
|
|
|
118
221
|
// ─── waitUntil Bridge ────────────────────────────────────────────────────
|
|
119
222
|
// Used by: waituntil-bridge.ts (waitUntil())
|
|
@@ -123,4 +226,18 @@ export const earlyHintsSenderAls = new AsyncLocalStorage<EarlyHintsSenderFn>();
|
|
|
123
226
|
export type WaitUntilFn = (promise: Promise<unknown>) => void;
|
|
124
227
|
|
|
125
228
|
/** @internal — import via waituntil-bridge.ts public API */
|
|
126
|
-
export const waitUntilAls =
|
|
229
|
+
export const waitUntilAls = getOrCreateAls<WaitUntilFn>(Symbol.for('timber:wait-until-als'));
|
|
230
|
+
|
|
231
|
+
// ─── Workers Cache Purge Bridge ─────────────────────────────────────────
|
|
232
|
+
// Used by: workers-cache-bridge.ts (runWithWorkersCachePurge())
|
|
233
|
+
// Design doc: design/06-caching.md, design/25-production-deployments.md
|
|
234
|
+
|
|
235
|
+
/** Workers Cache purge function from Cloudflare ExecutionContext.cache. */
|
|
236
|
+
export interface WorkersCachePurgeCtx {
|
|
237
|
+
purge(opts: { tags: string[] }): Promise<void>;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** @internal — import via workers-cache-bridge.ts public API */
|
|
241
|
+
export const workersCachePurgeAls = getOrCreateAls<WorkersCachePurgeCtx>(
|
|
242
|
+
Symbol.for('timber:workers-cache-purge-als')
|
|
243
|
+
);
|
|
@@ -8,13 +8,25 @@
|
|
|
8
8
|
* Unhashed assets (e.g. /favicon.ico) get a shorter cache with revalidation:
|
|
9
9
|
* Cache-Control: public, max-age=3600, must-revalidate
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* The `_headers` file lists hashed asset paths (/assets/*, /_timber/fonts/*) as
|
|
12
|
+
* wildcard rules and unhashed files as per-file rules. At runtime, adapters
|
|
13
|
+
* that see static file requests (nitro, preview) also set Cache-Control via
|
|
14
|
+
* `getAssetCacheControl()`. On Cloudflare Workers Static Assets, the worker
|
|
15
|
+
* never sees static file requests — the `_headers` file is the only mechanism.
|
|
16
|
+
* Page responses are NOT affected — those are controlled by the developer
|
|
17
|
+
* via middleware.ts or proxy.ts.
|
|
14
18
|
*
|
|
15
19
|
* Design docs: 18-build-system.md, 06-caching.md
|
|
16
20
|
*/
|
|
17
21
|
|
|
22
|
+
import { IMMUTABLE_CACHE, STATIC_CACHE } from '../adapters/shared.js';
|
|
23
|
+
|
|
24
|
+
// Re-export cache constants and generateHeadersFile from the shared adapter
|
|
25
|
+
// module. The canonical definitions live in adapters/shared.ts because
|
|
26
|
+
// adapters are loaded by Node before Vite's resolver is available — they
|
|
27
|
+
// can only import from within their own directory.
|
|
28
|
+
export { IMMUTABLE_CACHE, STATIC_CACHE, generateHeadersFile } from '../adapters/shared.js';
|
|
29
|
+
|
|
18
30
|
/**
|
|
19
31
|
* Regex matching Vite-hashed asset filenames.
|
|
20
32
|
*
|
|
@@ -30,18 +42,6 @@
|
|
|
30
42
|
*/
|
|
31
43
|
const HASHED_ASSET_RE = /[-.][\da-f]{8,}\.\w+$/;
|
|
32
44
|
|
|
33
|
-
/** One year in seconds (365 days). */
|
|
34
|
-
const ONE_YEAR = 31_536_000;
|
|
35
|
-
|
|
36
|
-
/** One hour in seconds. */
|
|
37
|
-
const ONE_HOUR = 3_600;
|
|
38
|
-
|
|
39
|
-
/** Cache-Control value for hashed (immutable) assets. */
|
|
40
|
-
export const IMMUTABLE_CACHE = `public, max-age=${ONE_YEAR}, immutable`;
|
|
41
|
-
|
|
42
|
-
/** Cache-Control value for unhashed static assets. */
|
|
43
|
-
export const STATIC_CACHE = `public, max-age=${ONE_HOUR}, must-revalidate`;
|
|
44
|
-
|
|
45
45
|
/**
|
|
46
46
|
* Check if a URL path looks like a hashed asset.
|
|
47
47
|
*/
|
|
@@ -57,25 +57,3 @@ export function isHashedAsset(pathname: string): boolean {
|
|
|
57
57
|
export function getAssetCacheControl(pathname: string): string {
|
|
58
58
|
return isHashedAsset(pathname) ? IMMUTABLE_CACHE : STATIC_CACHE;
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Generate a `_headers` file for static asset cache control.
|
|
63
|
-
*
|
|
64
|
-
* The `_headers` file is a platform convention supported by Cloudflare Workers
|
|
65
|
-
* Static Assets, Cloudflare Pages, and Netlify. It maps URL patterns to
|
|
66
|
-
* HTTP response headers.
|
|
67
|
-
*
|
|
68
|
-
* Vite places all hashed chunks under `/assets/` — these get immutable caching.
|
|
69
|
-
* Everything else (favicon.ico, robots.txt, etc.) gets a shorter cache.
|
|
70
|
-
*/
|
|
71
|
-
export function generateHeadersFile(): string {
|
|
72
|
-
return `# Auto-generated by @timber-js/app — static asset cache headers.
|
|
73
|
-
# See design/25-production-deployments.md §"CDN / Edge Cache"
|
|
74
|
-
|
|
75
|
-
/assets/*
|
|
76
|
-
Cache-Control: ${IMMUTABLE_CACHE}
|
|
77
|
-
|
|
78
|
-
/*
|
|
79
|
-
Cache-Control: ${STATIC_CACHE}
|
|
80
|
-
`;
|
|
81
|
-
}
|
|
@@ -53,6 +53,9 @@ export function parseBodySize(size: string): number {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
/** Strict integer pattern: one or more digits, nothing else. */
|
|
57
|
+
const STRICT_INTEGER_RE = /^\d+$/;
|
|
58
|
+
|
|
56
59
|
/** Check whether a request body exceeds the configured size limit (stateless, no ALS). */
|
|
57
60
|
export function enforceBodyLimits(
|
|
58
61
|
req: Request,
|
|
@@ -66,11 +69,16 @@ export function enforceBodyLimits(
|
|
|
66
69
|
return { ok: false, status: 411 };
|
|
67
70
|
}
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
// Reject malformed values: multiple values ("100, 999999"), negative numbers,
|
|
73
|
+
// floats ("100.5"), or non-numeric strings. parseInt would silently parse
|
|
74
|
+
// the first number from "100, 999999" as 100, letting the real body through.
|
|
75
|
+
const trimmed = contentLength.trim();
|
|
76
|
+
if (!STRICT_INTEGER_RE.test(trimmed)) {
|
|
71
77
|
return { ok: false, status: 411 };
|
|
72
78
|
}
|
|
73
79
|
|
|
80
|
+
const bodySize = Number.parseInt(trimmed, 10);
|
|
81
|
+
|
|
74
82
|
const limit = resolveLimit(kind, config);
|
|
75
83
|
return bodySize <= limit ? { ok: true } : { ok: false, status: 413 };
|
|
76
84
|
}
|
|
@@ -35,6 +35,18 @@ export interface BuildManifest {
|
|
|
35
35
|
modulepreload: Record<string, string[]>;
|
|
36
36
|
/** Map from input file path to font assets used by that module. */
|
|
37
37
|
fonts: Record<string, ManifestFontEntry[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Cache-busting hashes for metadata route files (opengraph-image, etc.).
|
|
40
|
+
* Map from file path (relative to project root) to short content hash.
|
|
41
|
+
* In dev mode this is empty — a startup nonce is used instead.
|
|
42
|
+
*/
|
|
43
|
+
metadataRouteHashes?: Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* Static request-dependency map from the Vite plugin's module-graph analysis.
|
|
46
|
+
* Map from segment entry file path to whether it's request-dependent.
|
|
47
|
+
* Used by buildSegmentInfo() for X-Timber-Segments in production.
|
|
48
|
+
*/
|
|
49
|
+
requestDep?: Record<string, boolean>;
|
|
38
50
|
}
|
|
39
51
|
|
|
40
52
|
/** Empty build manifest used in dev mode. */
|
|
@@ -43,6 +55,7 @@ export const EMPTY_BUILD_MANIFEST: BuildManifest = {
|
|
|
43
55
|
js: {},
|
|
44
56
|
modulepreload: {},
|
|
45
57
|
fonts: {},
|
|
58
|
+
metadataRouteHashes: {},
|
|
46
59
|
};
|
|
47
60
|
|
|
48
61
|
/** Segment shape expected by collectRouteCss (matches ManifestSegmentNode). */
|
|
@@ -85,22 +98,15 @@ export function collectRouteCss(segments: SegmentWithFiles[], manifest: BuildMan
|
|
|
85
98
|
* via injectHead() before </head>.
|
|
86
99
|
*/
|
|
87
100
|
export function buildCssLinkTags(cssUrls: string[]): string {
|
|
101
|
+
// Emit only <link rel="stylesheet"> — no preload tags. CSS preloading
|
|
102
|
+
// is handled by 103 Early Hints (Link header) which fires before the
|
|
103
|
+
// HTML stream. Float also emits `<link rel="stylesheet" data-precedence>`
|
|
104
|
+
// at the top of <head> during Fizz rendering — the browser discovers
|
|
105
|
+
// CSS from that tag. A <link rel="preload"> here would arrive *after*
|
|
106
|
+
// Float's stylesheet tag and trigger "Preload was ignored" warnings.
|
|
88
107
|
return cssUrls.map((url) => `<link rel="stylesheet" href="${url}">`).join('');
|
|
89
108
|
}
|
|
90
109
|
|
|
91
|
-
/**
|
|
92
|
-
* Generate a Link header value for CSS preload hints.
|
|
93
|
-
*
|
|
94
|
-
* Cloudflare CDN automatically converts Link headers with rel=preload
|
|
95
|
-
* into 103 Early Hints responses. This avoids platform-specific 103
|
|
96
|
-
* sending code.
|
|
97
|
-
*
|
|
98
|
-
* Example output: `</assets/root.css>; rel=preload; as=style, </assets/page.css>; rel=preload; as=style`
|
|
99
|
-
*/
|
|
100
|
-
export function buildLinkHeaders(cssUrls: string[]): string {
|
|
101
|
-
return cssUrls.map((url) => `<${url}>; rel=preload; as=style`).join(', ');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
110
|
// ─── Font utilities ──────────────────────────────────────────────────────
|
|
105
111
|
|
|
106
112
|
/**
|
|
@@ -148,44 +154,8 @@ export function buildFontPreloadTags(fonts: ManifestFontEntry[]): string {
|
|
|
148
154
|
.join('');
|
|
149
155
|
}
|
|
150
156
|
|
|
151
|
-
/**
|
|
152
|
-
* Generate Link header values for font preload hints.
|
|
153
|
-
*
|
|
154
|
-
* Cloudflare CDN converts Link headers with rel=preload into 103 Early Hints.
|
|
155
|
-
*
|
|
156
|
-
* Example: `</fonts/inter.woff2>; rel=preload; as=font; crossorigin`
|
|
157
|
-
*/
|
|
158
|
-
export function buildFontLinkHeaders(fonts: ManifestFontEntry[]): string {
|
|
159
|
-
return fonts.map((f) => `<${f.href}>; rel=preload; as=font; crossorigin`).join(', ');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
157
|
// ─── JS chunk utilities ──────────────────────────────────────────────────
|
|
163
158
|
|
|
164
|
-
/**
|
|
165
|
-
* Collect JS chunk URLs for a matched route's segment chain.
|
|
166
|
-
*
|
|
167
|
-
* Walks segments root → leaf, collecting the JS chunk for each layout
|
|
168
|
-
* and page. Deduplicates while preserving order.
|
|
169
|
-
*/
|
|
170
|
-
export function collectRouteJs(segments: SegmentWithFiles[], manifest: BuildManifest): string[] {
|
|
171
|
-
const seen = new Set<string>();
|
|
172
|
-
const result: string[] = [];
|
|
173
|
-
|
|
174
|
-
for (const segment of segments) {
|
|
175
|
-
for (const file of [segment.layout, segment.page]) {
|
|
176
|
-
if (!file) continue;
|
|
177
|
-
const jsUrl = manifest.js[file.filePath];
|
|
178
|
-
if (!jsUrl) continue;
|
|
179
|
-
if (!seen.has(jsUrl)) {
|
|
180
|
-
seen.add(jsUrl);
|
|
181
|
-
result.push(jsUrl);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return result;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
159
|
/**
|
|
190
160
|
* Collect modulepreload URLs for a matched route's segment chain.
|
|
191
161
|
*
|
|
@@ -225,10 +195,3 @@ export function collectRouteModulepreloads(
|
|
|
225
195
|
export function buildModulepreloadTags(urls: string[]): string {
|
|
226
196
|
return urls.map((url) => `<link rel="modulepreload" href="${url}">`).join('');
|
|
227
197
|
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Generate a <script type="module"> tag for a JS entry point.
|
|
231
|
-
*/
|
|
232
|
-
export function buildEntryScriptTag(url: string): string {
|
|
233
|
-
return `<script type="module" src="${url}"></script>`;
|
|
234
|
-
}
|
|
@@ -13,11 +13,14 @@ export type CanonicalizeResult = { ok: true; pathname: string } | { ok: false; s
|
|
|
13
13
|
/**
|
|
14
14
|
* Encoded separators that produce a 400 rejection.
|
|
15
15
|
* %2f (/) and %5c (\) cause path-confusion attacks.
|
|
16
|
+
*
|
|
17
|
+
* Shared between the runtime canonicalizer and the build-time route scanner
|
|
18
|
+
* to ensure both enforce identical security rules. See design/13-security.md.
|
|
16
19
|
*/
|
|
17
|
-
const ENCODED_SEPARATOR_RE = /%2f|%5c/i;
|
|
20
|
+
export const ENCODED_SEPARATOR_RE = /%2f|%5c/i;
|
|
18
21
|
|
|
19
|
-
/** Null byte — rejected. */
|
|
20
|
-
const NULL_BYTE_RE = /%00/i;
|
|
22
|
+
/** Null byte — rejected. Shared with the route scanner. */
|
|
23
|
+
export const NULL_BYTE_RE = /%00/i;
|
|
21
24
|
|
|
22
25
|
/**
|
|
23
26
|
* Canonicalize a URL pathname.
|