@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
|
@@ -10,10 +10,15 @@
|
|
|
10
10
|
* exposed to the client (design/13-security.md principle 4).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import type { RouteMatch } from '
|
|
14
|
-
import type { ManifestSegmentNode } from '
|
|
15
|
-
import type { ClientBootstrapConfig } from '
|
|
16
|
-
import type { LayoutEntry } from '
|
|
13
|
+
import type { RouteMatch } from './pipeline.js';
|
|
14
|
+
import type { ManifestSegmentNode } from './route-matcher.js';
|
|
15
|
+
import type { ClientBootstrapConfig } from './html-injectors.js';
|
|
16
|
+
import type { LayoutEntry } from './deny-renderer.js';
|
|
17
|
+
import type { GlobalErrorFile } from './rsc-entry/error-renderer.js';
|
|
18
|
+
import { swallow } from './logger.js';
|
|
19
|
+
import { logRenderError } from './logger.js';
|
|
20
|
+
import { loadModule } from './safe-load.js';
|
|
21
|
+
import { sourceMapError } from './dev-source-map.js';
|
|
17
22
|
|
|
18
23
|
/**
|
|
19
24
|
* Render a fallback error page when the render pipeline throws.
|
|
@@ -27,25 +32,43 @@ export async function renderFallbackError(
|
|
|
27
32
|
responseHeaders: Headers,
|
|
28
33
|
isDev: boolean,
|
|
29
34
|
rootSegment: ManifestSegmentNode,
|
|
30
|
-
clientBootstrap: ClientBootstrapConfig
|
|
35
|
+
clientBootstrap: ClientBootstrapConfig,
|
|
36
|
+
globalError?: GlobalErrorFile,
|
|
37
|
+
projectRoot?: string,
|
|
38
|
+
hmrOptions?: import('../dev-tools/dev-page-shell.js').DevErrorHmrOptions
|
|
31
39
|
): Promise<Response> {
|
|
40
|
+
// Source-map the error's stack trace in dev mode so the error page
|
|
41
|
+
// shows original source positions. See TIM-811.
|
|
42
|
+
sourceMapError(error);
|
|
43
|
+
|
|
32
44
|
if (isDev) {
|
|
33
|
-
return renderDevErrorPage(error);
|
|
45
|
+
return renderDevErrorPage(error, projectRoot, hmrOptions);
|
|
34
46
|
}
|
|
35
47
|
// Lazy import to avoid loading error-renderer in the pipeline module
|
|
36
|
-
const { renderErrorPage } = await import('
|
|
48
|
+
const { renderErrorPage } = await import('./rsc-entry/error-renderer.js');
|
|
37
49
|
const segments = [rootSegment];
|
|
38
50
|
const layoutComponents: LayoutEntry[] = [];
|
|
39
|
-
if
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
// Wrap layout loading in try/catch — if the root layout module itself
|
|
52
|
+
// crashes (evaluation failure, syntax error, etc.), we still want to
|
|
53
|
+
// reach renderErrorPage so it can fall through to global-error.tsx
|
|
54
|
+
// (Tier 2), which renders without any layout wrapping.
|
|
55
|
+
try {
|
|
56
|
+
if (rootSegment.layout) {
|
|
57
|
+
const mod = await loadModule(rootSegment.layout);
|
|
58
|
+
if (mod.default) {
|
|
59
|
+
layoutComponents.push({
|
|
60
|
+
component: mod.default as (...args: unknown[]) => unknown,
|
|
61
|
+
segment: rootSegment,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
46
64
|
}
|
|
65
|
+
} catch (layoutError) {
|
|
66
|
+
// Layout failed to load — proceed without it. renderErrorPage will
|
|
67
|
+
// attempt segment-level error pages (without layout wrapping) and
|
|
68
|
+
// then fall through to global-error.tsx if those also fail.
|
|
69
|
+
logRenderError({ method: req.method, path: new URL(req.url).pathname, error: layoutError });
|
|
47
70
|
}
|
|
48
|
-
const match: RouteMatch = { segments
|
|
71
|
+
const match: RouteMatch = { segments, segmentParams: {}, middlewareChain: [] };
|
|
49
72
|
return renderErrorPage(
|
|
50
73
|
error,
|
|
51
74
|
500,
|
|
@@ -54,94 +77,44 @@ export async function renderFallbackError(
|
|
|
54
77
|
req,
|
|
55
78
|
match,
|
|
56
79
|
responseHeaders,
|
|
57
|
-
clientBootstrap
|
|
80
|
+
clientBootstrap,
|
|
81
|
+
globalError
|
|
58
82
|
);
|
|
59
83
|
}
|
|
60
84
|
|
|
61
85
|
/**
|
|
62
|
-
* Render a dev-mode 500 error page with error
|
|
86
|
+
* Render a dev-mode 500 error page with error details, source context,
|
|
87
|
+
* classified stack trace, and copy button.
|
|
88
|
+
*
|
|
89
|
+
* Dynamically imports the shared template from `plugins/dev-error-page.ts`
|
|
90
|
+
* so it is NOT pulled into production server bundles. The Vite client script
|
|
91
|
+
* is injected so the error overlay fires when the HMR WebSocket connects.
|
|
63
92
|
*
|
|
64
|
-
*
|
|
65
|
-
* The Vite HMR client script is included so the error overlay still fires.
|
|
93
|
+
* Dev-only — the dynamic import has zero production cost.
|
|
66
94
|
*/
|
|
67
|
-
export function renderDevErrorPage(
|
|
95
|
+
export async function renderDevErrorPage(
|
|
96
|
+
error: unknown,
|
|
97
|
+
projectRoot?: string,
|
|
98
|
+
hmrOptions?: import('../dev-tools/dev-page-shell.js').DevErrorHmrOptions
|
|
99
|
+
): Promise<Response> {
|
|
68
100
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
69
|
-
const
|
|
70
|
-
const message = escapeHtml(err.message);
|
|
71
|
-
const stack = err.stack ? escapeHtml(err.stack) : '';
|
|
101
|
+
const root = projectRoot ?? process.cwd();
|
|
72
102
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
.container { max-width: 800px; margin: 0 auto; }
|
|
90
|
-
.badge {
|
|
91
|
-
display: inline-block;
|
|
92
|
-
background: #e74c3c;
|
|
93
|
-
color: white;
|
|
94
|
-
font-size: 0.75rem;
|
|
95
|
-
font-weight: 700;
|
|
96
|
-
padding: 0.2rem 0.6rem;
|
|
97
|
-
border-radius: 4px;
|
|
98
|
-
text-transform: uppercase;
|
|
99
|
-
letter-spacing: 0.05em;
|
|
100
|
-
margin-bottom: 1rem;
|
|
101
|
-
}
|
|
102
|
-
h1 {
|
|
103
|
-
font-size: 1.5rem;
|
|
104
|
-
color: #ff6b6b;
|
|
105
|
-
margin-bottom: 0.5rem;
|
|
106
|
-
word-break: break-word;
|
|
107
|
-
}
|
|
108
|
-
.message {
|
|
109
|
-
font-size: 1.1rem;
|
|
110
|
-
color: #ccc;
|
|
111
|
-
margin-bottom: 1.5rem;
|
|
112
|
-
word-break: break-word;
|
|
113
|
-
}
|
|
114
|
-
.stack-container {
|
|
115
|
-
background: #16213e;
|
|
116
|
-
border: 1px solid #2a2a4a;
|
|
117
|
-
border-radius: 8px;
|
|
118
|
-
padding: 1rem;
|
|
119
|
-
overflow-x: auto;
|
|
120
|
-
}
|
|
121
|
-
.stack {
|
|
122
|
-
font-family: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas, monospace;
|
|
123
|
-
font-size: 0.8rem;
|
|
124
|
-
color: #a0a0c0;
|
|
125
|
-
white-space: pre-wrap;
|
|
126
|
-
word-break: break-all;
|
|
127
|
-
}
|
|
128
|
-
.hint {
|
|
129
|
-
margin-top: 1.5rem;
|
|
130
|
-
font-size: 0.85rem;
|
|
131
|
-
color: #666;
|
|
132
|
-
}
|
|
133
|
-
</style>
|
|
134
|
-
</head>
|
|
135
|
-
<body>
|
|
136
|
-
<div class="container">
|
|
137
|
-
<span class="badge">500 Internal Server Error</span>
|
|
138
|
-
<h1>${escapeHtml(title)}</h1>
|
|
139
|
-
<p class="message">${message}</p>
|
|
140
|
-
${stack ? `<div class="stack-container"><pre class="stack">${stack}</pre></div>` : ''}
|
|
141
|
-
<p class="hint">This error page is only shown in development.</p>
|
|
142
|
-
</div>
|
|
143
|
-
</body>
|
|
144
|
-
</html>`;
|
|
103
|
+
let html: string;
|
|
104
|
+
try {
|
|
105
|
+
// Dynamic import — keeps dev-error-page.ts and its transitive deps
|
|
106
|
+
// (dev-error-overlay.ts, @jridgewell/trace-mapping) out of production bundles.
|
|
107
|
+
const { generateDevErrorPage } = await import('../dev-tools/error-page.js');
|
|
108
|
+
html = generateDevErrorPage(err, 'render', root, hmrOptions);
|
|
109
|
+
// Inject Vite client script so the error overlay fires when HMR connects.
|
|
110
|
+
html = html.replace(
|
|
111
|
+
'</head>',
|
|
112
|
+
' <script type="module" src="/@vite/client"></script>\n</head>'
|
|
113
|
+
);
|
|
114
|
+
} catch (e) {
|
|
115
|
+
swallow(e, 'dev error page template failed, using minimal fallback');
|
|
116
|
+
html = minimalErrorPage(err);
|
|
117
|
+
}
|
|
145
118
|
|
|
146
119
|
return new Response(html, {
|
|
147
120
|
status: 500,
|
|
@@ -149,11 +122,15 @@ export function renderDevErrorPage(error: unknown): Response {
|
|
|
149
122
|
});
|
|
150
123
|
}
|
|
151
124
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Minimal fallback error page — used only if the shared template fails to load.
|
|
127
|
+
*/
|
|
128
|
+
function minimalErrorPage(err: Error): string {
|
|
129
|
+
const esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
130
|
+
return `<!DOCTYPE html><html><head><meta charset="utf-8"><title>500</title>
|
|
131
|
+
<script type="module" src="/@vite/client"></script></head>
|
|
132
|
+
<body style="font-family:system-ui;padding:2rem;background:#1a1a2e;color:#e0e0e0">
|
|
133
|
+
<h1 style="color:#ff6b6b">500 Internal Server Error</h1>
|
|
134
|
+
<pre style="color:#a0a0c0;white-space:pre-wrap">${esc(err.stack ?? err.message)}</pre>
|
|
135
|
+
</body></html>`;
|
|
159
136
|
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared state machine types and transitions for RSC Flight injection.
|
|
3
|
+
*
|
|
4
|
+
* Both html-injectors.ts (Web Streams) and node-stream-transforms.ts
|
|
5
|
+
* (Node.js streams) implement identical state transitions — only the
|
|
6
|
+
* I/O primitives differ. This module defines the discriminated union
|
|
7
|
+
* states and the transition map once.
|
|
8
|
+
*
|
|
9
|
+
* Valid state flow:
|
|
10
|
+
* init → streaming → flushing → done
|
|
11
|
+
* (any) → error
|
|
12
|
+
*
|
|
13
|
+
* Suffix stripping (</body></html>) is handled by a separate
|
|
14
|
+
* createMoveSuffixStream / createNodeMoveSuffixTransform upstream
|
|
15
|
+
* in the pipeline (TIM-530). The flight injector only interleaves
|
|
16
|
+
* RSC scripts between HTML chunks — no suffix tracking needed.
|
|
17
|
+
*
|
|
18
|
+
* Design doc: 02-rendering-pipeline.md
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { TransitionMap } from '../utils/state-machine.js';
|
|
22
|
+
|
|
23
|
+
// ─── States ──────────────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
/** Waiting for first HTML chunk. Pull loop not started. */
|
|
26
|
+
export interface InitState {
|
|
27
|
+
phase: 'init';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** HTML chunks flowing, pull loop running. */
|
|
31
|
+
export interface StreamingState {
|
|
32
|
+
phase: 'streaming';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** HTML stream done (flush fired). Draining remaining RSC chunks. */
|
|
36
|
+
export interface FlushingState {
|
|
37
|
+
phase: 'flushing';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** All streams consumed. Terminal state. */
|
|
41
|
+
export interface DoneState {
|
|
42
|
+
phase: 'done';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Pull loop failed. Terminal state with captured error. */
|
|
46
|
+
export interface ErrorState {
|
|
47
|
+
phase: 'error';
|
|
48
|
+
error: unknown;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type FlightInjectionState =
|
|
52
|
+
| InitState
|
|
53
|
+
| StreamingState
|
|
54
|
+
| FlushingState
|
|
55
|
+
| DoneState
|
|
56
|
+
| ErrorState;
|
|
57
|
+
|
|
58
|
+
// ─── Events ──────────────────────────────────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
/** First HTML chunk arrived — start the pull loop. */
|
|
61
|
+
export interface FirstChunkEvent {
|
|
62
|
+
type: 'FIRST_CHUNK';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** HTML stream finished (flush/end). */
|
|
66
|
+
export interface HtmlDoneEvent {
|
|
67
|
+
type: 'HTML_DONE';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** RSC pull loop completed (all chunks read or stream closed). */
|
|
71
|
+
export interface PullDoneEvent {
|
|
72
|
+
type: 'PULL_DONE';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** RSC pull loop encountered an error. */
|
|
76
|
+
export interface PullErrorEvent {
|
|
77
|
+
type: 'PULL_ERROR';
|
|
78
|
+
error: unknown;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export type FlightInjectionEvent = FirstChunkEvent | HtmlDoneEvent | PullDoneEvent | PullErrorEvent;
|
|
82
|
+
|
|
83
|
+
// ─── Transitions ─────────────────────────────────────────────────────────────
|
|
84
|
+
|
|
85
|
+
export const flightInjectionTransitions: TransitionMap<FlightInjectionState, FlightInjectionEvent> =
|
|
86
|
+
{
|
|
87
|
+
init: {
|
|
88
|
+
FIRST_CHUNK: (): StreamingState => ({ phase: 'streaming' }),
|
|
89
|
+
// Edge case: HTML stream ends immediately (empty body)
|
|
90
|
+
HTML_DONE: (): FlushingState => ({ phase: 'flushing' }),
|
|
91
|
+
},
|
|
92
|
+
streaming: {
|
|
93
|
+
HTML_DONE: (): FlushingState => ({ phase: 'flushing' }),
|
|
94
|
+
PULL_DONE: (): StreamingState => ({ phase: 'streaming' }),
|
|
95
|
+
PULL_ERROR: (_s, e): ErrorState => ({ phase: 'error', error: e.error }),
|
|
96
|
+
},
|
|
97
|
+
flushing: {
|
|
98
|
+
PULL_DONE: (): DoneState => ({ phase: 'done' }),
|
|
99
|
+
PULL_ERROR: (_s, e): ErrorState => ({ phase: 'error', error: e.error }),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
/** Whether the HTML stream has finished (flush/end fired). */
|
|
106
|
+
export function isHtmlDone(state: FlightInjectionState): boolean {
|
|
107
|
+
return state.phase === 'flushing' || state.phase === 'done';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Whether the RSC pull loop has completed. */
|
|
111
|
+
export function isPullDone(state: FlightInjectionState): boolean {
|
|
112
|
+
return state.phase === 'done' || state.phase === 'error';
|
|
113
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Flight data script generation.
|
|
3
|
+
*
|
|
4
|
+
* Both html-injectors.ts (Web Streams / dev) and node-stream-transforms.ts
|
|
5
|
+
* (Node streams / production) use this module to generate inline `<script>`
|
|
6
|
+
* tags for RSC Flight data injection.
|
|
7
|
+
*
|
|
8
|
+
* The init script goes in `<head>` as part of the HTML shell (guaranteed
|
|
9
|
+
* to execute before any streaming chunk scripts). Push scripts are emitted
|
|
10
|
+
* as RSC chunks arrive during streaming.
|
|
11
|
+
*
|
|
12
|
+
* See design/02-rendering-pipeline.md, LOCAL-415
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// ─── JSON Escaping ────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Escape a JSON string for safe embedding inside an HTML `<script>` tag.
|
|
19
|
+
*
|
|
20
|
+
* Prevents XSS via `</script>` injection and handles Unicode line/paragraph
|
|
21
|
+
* separators that are valid JSON but invalid in JS string literals (pre-ES2019).
|
|
22
|
+
*/
|
|
23
|
+
export function htmlEscapeJsonString(str: string): string {
|
|
24
|
+
return str
|
|
25
|
+
.replace(/</g, '\\u003c')
|
|
26
|
+
.replace(/>/g, '\\u003e')
|
|
27
|
+
.replace(/\u2028/g, '\\u2028')
|
|
28
|
+
.replace(/\u2029/g, '\\u2029');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ─── Script Generation ────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
/** The global variable name used for Flight data on the client. */
|
|
34
|
+
const FLIGHT_VAR = 'self.__timber_f';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Generate the init script that creates the Flight data array.
|
|
38
|
+
*
|
|
39
|
+
* This MUST be included in `<head>` (via headHtml) so it executes before
|
|
40
|
+
* any streaming chunk scripts arrive in `<body>`. The array is created
|
|
41
|
+
* unconditionally — no `||[]` guard needed in push scripts.
|
|
42
|
+
*
|
|
43
|
+
* Also emits the bootstrap signal [0] which tells the client that
|
|
44
|
+
* Flight data is active for this page.
|
|
45
|
+
*/
|
|
46
|
+
export function flightInitScript(): string {
|
|
47
|
+
return `<script>${FLIGHT_VAR}=[${htmlEscapeJsonString(JSON.stringify([0]))}]</script>`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Generate a push script for a Flight data chunk.
|
|
52
|
+
*
|
|
53
|
+
* Normally the init script runs first (it's in `<head>`), so
|
|
54
|
+
* `self.__timber_f` already exists. However, shell-less status pages
|
|
55
|
+
* (e.g. standalone error pages) may have no `<head>` tag, so the init script
|
|
56
|
+
* never runs. The `||[]` guard ensures the array is created on first
|
|
57
|
+
* push if needed, preventing a TypeError. See TIM-559.
|
|
58
|
+
*/
|
|
59
|
+
export function flightChunkScript(data: string): string {
|
|
60
|
+
const escaped = htmlEscapeJsonString(JSON.stringify([1, data]));
|
|
61
|
+
return `<script>(${FLIGHT_VAR}=${FLIGHT_VAR}||[]).push(${escaped})</script>`;
|
|
62
|
+
}
|
package/src/server/form-data.ts
CHANGED
|
@@ -29,14 +29,21 @@ export function parseFormData(formData: FormData): Record<string, unknown> {
|
|
|
29
29
|
// Skip React internal fields
|
|
30
30
|
if (key.startsWith('$ACTION_')) continue;
|
|
31
31
|
|
|
32
|
+
// Skip prototype-pollution keys at the top level — assigning to
|
|
33
|
+
// `flat['__proto__']` invokes the prototype setter and can splice
|
|
34
|
+
// attacker-controlled data into `flat`'s prototype chain.
|
|
35
|
+
// The dot-path case is filtered separately in `expandDotPaths`.
|
|
36
|
+
if (DANGEROUS_KEYS.has(key)) continue;
|
|
37
|
+
|
|
32
38
|
const values = formData.getAll(key);
|
|
33
39
|
const processed = values.map(normalizeValue);
|
|
34
40
|
|
|
35
41
|
if (processed.length === 1) {
|
|
36
42
|
flat[key] = processed[0];
|
|
37
43
|
} else {
|
|
38
|
-
// Filter out undefined
|
|
39
|
-
|
|
44
|
+
// Filter out undefined (empty Files) and empty strings from multi-value fields.
|
|
45
|
+
// Multi-value fields (e.g. tags=js&tags=&tags=ts) should not include blanks.
|
|
46
|
+
flat[key] = processed.filter((v) => v !== undefined && v !== '');
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
49
|
|
|
@@ -46,15 +53,13 @@ export function parseFormData(formData: FormData): Record<string, unknown> {
|
|
|
46
53
|
|
|
47
54
|
/**
|
|
48
55
|
* Normalize a single FormData entry value.
|
|
49
|
-
* - Empty strings → undefined (enables .optional() semantics)
|
|
50
56
|
* - Empty File objects (no selection) → undefined
|
|
57
|
+
* - Strings pass through as-is (empty strings stay as empty strings so
|
|
58
|
+
* schema validators like `z.string().min(1, 'Required')` can produce
|
|
59
|
+
* their custom error messages instead of a generic type mismatch)
|
|
51
60
|
* - Everything else passes through as-is
|
|
52
61
|
*/
|
|
53
62
|
function normalizeValue(value: FormDataEntryValue): unknown {
|
|
54
|
-
if (typeof value === 'string') {
|
|
55
|
-
return value === '' ? undefined : value;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
63
|
// File input with no selection: browsers submit a File with name="" and size=0
|
|
59
64
|
if (value instanceof File && value.size === 0 && value.name === '') {
|
|
60
65
|
return undefined;
|
|
@@ -82,18 +87,23 @@ function expandDotPaths(flat: Record<string, unknown>): Record<string, unknown>
|
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
89
|
|
|
85
|
-
// Fast path: no dot-notation keys, return as-is
|
|
90
|
+
// Fast path: no dot-notation keys, return as-is.
|
|
91
|
+
// Top-level dangerous keys are already filtered in `parseFormData` above.
|
|
86
92
|
if (!hasDotPaths) return flat;
|
|
87
93
|
|
|
88
94
|
for (const [key, value] of Object.entries(flat)) {
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
// Reject any path that contains __proto__ / constructor / prototype.
|
|
96
|
+
// Without this, `__proto__.x=1` writes to Object.prototype because
|
|
97
|
+
// `result['__proto__']` resolves to the prototype object itself.
|
|
98
|
+
const parts = key.split('.');
|
|
99
|
+
if (parts.some((p) => DANGEROUS_KEYS.has(p))) continue;
|
|
100
|
+
|
|
101
|
+
if (parts.length === 1) {
|
|
102
|
+
result[parts[0]] = value;
|
|
91
103
|
continue;
|
|
92
104
|
}
|
|
93
105
|
|
|
94
|
-
const parts = key.split('.');
|
|
95
106
|
let current: Record<string, unknown> = result;
|
|
96
|
-
|
|
97
107
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
98
108
|
const part = parts[i];
|
|
99
109
|
if (current[part] === undefined || current[part] === null) {
|
|
@@ -113,6 +123,15 @@ function expandDotPaths(flat: Record<string, unknown>): Record<string, unknown>
|
|
|
113
123
|
return result;
|
|
114
124
|
}
|
|
115
125
|
|
|
126
|
+
// `__proto__` is the only key in this parser that escapes the dot-path
|
|
127
|
+
// walk's `typeof !== 'object'` reset: accessing `obj['__proto__']` returns
|
|
128
|
+
// `Object.prototype` (itself an object), so the walk steps into the global
|
|
129
|
+
// prototype and the leaf write mutates it. `constructor` resolves to a
|
|
130
|
+
// function (reset fires) and `prototype` is undefined on fresh objects
|
|
131
|
+
// (reset fires), so neither escapes the walk — they parse as legit nested
|
|
132
|
+
// keys and do not mutate anything global.
|
|
133
|
+
const DANGEROUS_KEYS = new Set(['__proto__']);
|
|
134
|
+
|
|
116
135
|
// ─── Coercion Helpers ────────────────────────────────────────────────────
|
|
117
136
|
|
|
118
137
|
/**
|
|
@@ -129,6 +148,23 @@ function expandDotPaths(flat: Record<string, unknown>): Record<string, unknown>
|
|
|
129
148
|
* ```
|
|
130
149
|
*/
|
|
131
150
|
export const coerce = {
|
|
151
|
+
/**
|
|
152
|
+
* Coerce an empty string to undefined for optional text fields.
|
|
153
|
+
* Use with `.optional()` schemas where an empty input means "not provided".
|
|
154
|
+
*
|
|
155
|
+
* ```ts
|
|
156
|
+
* // Zod
|
|
157
|
+
* z.unknown().transform(coerce.text).pipe(z.string().optional())
|
|
158
|
+
* // Valibot
|
|
159
|
+
* v.pipe(v.unknown(), v.transform(coerce.text), v.optional(v.string()))
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
text(value: unknown): string | undefined {
|
|
163
|
+
if (value === undefined || value === null || value === '') return undefined;
|
|
164
|
+
if (typeof value === 'string') return value;
|
|
165
|
+
return undefined;
|
|
166
|
+
},
|
|
167
|
+
|
|
132
168
|
/**
|
|
133
169
|
* Coerce a string to a number.
|
|
134
170
|
* - `"42"` → `42`
|
|
@@ -173,4 +209,80 @@ export const coerce = {
|
|
|
173
209
|
return undefined;
|
|
174
210
|
}
|
|
175
211
|
},
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Coerce a date string to a Date object.
|
|
215
|
+
* Handles `<input type="date">` (`"2024-01-15"`), `<input type="datetime-local">`
|
|
216
|
+
* (`"2024-01-15T10:30"`), and full ISO 8601 strings.
|
|
217
|
+
* - Valid date string → `Date`
|
|
218
|
+
* - `""` / `undefined` / `null` → `undefined`
|
|
219
|
+
* - Invalid date strings → `undefined` (schema validation will catch this)
|
|
220
|
+
* - Impossible dates that `new Date()` silently normalizes (e.g. Feb 31) → `undefined`
|
|
221
|
+
*/
|
|
222
|
+
date(value: unknown): Date | undefined {
|
|
223
|
+
if (value === undefined || value === null || value === '') return undefined;
|
|
224
|
+
if (value instanceof Date) return value;
|
|
225
|
+
if (typeof value !== 'string') return undefined;
|
|
226
|
+
const date = new Date(value);
|
|
227
|
+
if (Number.isNaN(date.getTime())) return undefined;
|
|
228
|
+
|
|
229
|
+
// Overflow detection: extract Y/M/D from the input string and verify
|
|
230
|
+
// they match the parsed Date components. new Date('2024-02-31') silently
|
|
231
|
+
// normalizes to March 2nd — we reject such inputs.
|
|
232
|
+
const ymdMatch = value.match(/^(\d{4})-(\d{2})-(\d{2})/);
|
|
233
|
+
if (ymdMatch) {
|
|
234
|
+
const inputYear = Number(ymdMatch[1]);
|
|
235
|
+
const inputMonth = Number(ymdMatch[2]);
|
|
236
|
+
const inputDay = Number(ymdMatch[3]);
|
|
237
|
+
|
|
238
|
+
// Use UTC methods for date-only and Z-suffixed strings to avoid
|
|
239
|
+
// timezone offset shifting the day. For datetime-local (no Z suffix),
|
|
240
|
+
// the Date constructor parses in local time, so use local methods.
|
|
241
|
+
const isUTC = value.length === 10 || value.endsWith('Z');
|
|
242
|
+
const parsedYear = isUTC ? date.getUTCFullYear() : date.getFullYear();
|
|
243
|
+
const parsedMonth = isUTC ? date.getUTCMonth() + 1 : date.getMonth() + 1;
|
|
244
|
+
const parsedDay = isUTC ? date.getUTCDate() : date.getDate();
|
|
245
|
+
|
|
246
|
+
if (inputYear !== parsedYear || inputMonth !== parsedMonth || inputDay !== parsedDay) {
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return date;
|
|
252
|
+
},
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Create a File coercion function with optional size and mime type validation.
|
|
256
|
+
* Returns the File if valid, `undefined` otherwise.
|
|
257
|
+
*
|
|
258
|
+
* ```ts
|
|
259
|
+
* // Basic — just checks it's a real File
|
|
260
|
+
* z.preprocess(coerce.file(), z.instanceof(File))
|
|
261
|
+
*
|
|
262
|
+
* // With constraints
|
|
263
|
+
* z.preprocess(
|
|
264
|
+
* coerce.file({ maxSize: 5 * 1024 * 1024, accept: ['image/png', 'image/jpeg'] }),
|
|
265
|
+
* z.instanceof(File)
|
|
266
|
+
* )
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
file(options?: { maxSize?: number; accept?: string[] }): (value: unknown) => File | undefined {
|
|
270
|
+
return (value: unknown): File | undefined => {
|
|
271
|
+
if (value === undefined || value === null || value === '') return undefined;
|
|
272
|
+
if (!(value instanceof File)) return undefined;
|
|
273
|
+
|
|
274
|
+
// Empty file input (no selection): browsers submit File with name="" and size=0
|
|
275
|
+
if (value.size === 0 && value.name === '') return undefined;
|
|
276
|
+
|
|
277
|
+
if (options?.maxSize !== undefined && value.size > options.maxSize) {
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (options?.accept !== undefined && !options.accept.includes(value.type)) {
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return value;
|
|
286
|
+
};
|
|
287
|
+
},
|
|
176
288
|
};
|