@timber-js/app 0.2.0-alpha.16 → 0.2.0-alpha.161
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-cjklt63G.js +317 -0
- package/dist/_chunks/actions-cjklt63G.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-CzYUlgXA.js +1125 -0
- package/dist/_chunks/cache-api-CzYUlgXA.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → canonicalize-P41GR6tY.js} +94 -18
- package/dist/_chunks/canonicalize-P41GR6tY.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-NfLbLnDw.js +638 -0
- package/dist/_chunks/cli-schema-sync-NfLbLnDw.js.map +1 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js +21 -0
- package/dist/_chunks/codec-registry-oOUxugz3.js.map +1 -0
- package/dist/_chunks/define-Bssfp6ot.js +82 -0
- package/dist/_chunks/define-Bssfp6ot.js.map +1 -0
- package/dist/_chunks/define-CFmvb4Bt.js +203 -0
- package/dist/_chunks/define-CFmvb4Bt.js.map +1 -0
- package/dist/_chunks/dist-BA3u1z3W.js +423 -0
- package/dist/_chunks/dist-BA3u1z3W.js.map +1 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js +36 -0
- package/dist/_chunks/fast-hash-D6hIVt1Y.js.map +1 -0
- package/dist/_chunks/format-CfwjgPz9.js +14 -0
- package/dist/_chunks/format-CfwjgPz9.js.map +1 -0
- package/dist/_chunks/href-validation-CMc5JRls.js +141 -0
- package/dist/_chunks/href-validation-CMc5JRls.js.map +1 -0
- package/dist/_chunks/logger-B_O6-mdJ.js +1485 -0
- package/dist/_chunks/logger-B_O6-mdJ.js.map +1 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js +124 -0
- package/dist/_chunks/navigation-root-bUDZLw74.js.map +1 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.js +280 -0
- package/dist/_chunks/plugin-context-DeAxFRMq.js.map +1 -0
- package/dist/_chunks/registry-DbJPKoBp.js +20 -0
- package/dist/_chunks/registry-DbJPKoBp.js.map +1 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.js +50 -0
- package/dist/_chunks/resolve-schema-3iUvBV5T.js.map +1 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js +28 -0
- package/dist/_chunks/router-ref-CtmF-aPv.js.map +1 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.js +119 -0
- package/dist/_chunks/schema-bridge-BY3QLBL7.js.map +1 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js +137 -0
- package/dist/_chunks/segment-classify-CDDRVKs7.js.map +1 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js +34 -0
- package/dist/_chunks/segment-context-ZDnXDkbz.js.map +1 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js +35 -0
- package/dist/_chunks/sizeof-lXffQ1Vr.js.map +1 -0
- package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-BOWsq18U.js} +1 -1
- package/dist/_chunks/ssr-data-BOWsq18U.js.map +1 -0
- package/dist/_chunks/tree-match-D2l830j2.js +102 -0
- package/dist/_chunks/tree-match-D2l830j2.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-CbeQmext.js} +7 -20
- package/dist/_chunks/use-query-states-CbeQmext.js.map +1 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js +151 -0
- package/dist/_chunks/use-segment-params-D1CzlgBo.js.map +1 -0
- package/dist/_chunks/walkers-9mz9T7mb.js +988 -0
- package/dist/_chunks/walkers-9mz9T7mb.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +29 -0
- package/dist/adapters/build-output-helper.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.d.ts +109 -0
- package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
- package/dist/adapters/cloudflare-dev.js +73 -0
- package/dist/adapters/cloudflare-dev.js.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
- package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
- package/dist/adapters/cloudflare-kv-cache.js +117 -0
- package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +177 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +337 -64
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts +5 -4
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +1 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +144 -152
- 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 +0 -6
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/cache/cache-api.d.ts +26 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +33 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +27 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +3 -326
- package/dist/cache/invalidation-epoch.d.ts +43 -0
- package/dist/cache/invalidation-epoch.d.ts.map +1 -0
- package/dist/cache/redis-handler.d.ts +97 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +19 -2
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/sizeof.d.ts +22 -0
- package/dist/cache/sizeof.d.ts.map +1 -0
- package/dist/cache/stable-stringify.d.ts +9 -0
- package/dist/cache/stable-stringify.d.ts.map +1 -1
- package/dist/cache/store.d.ts +53 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.d.ts +38 -0
- package/dist/cache/stores/cloudflare-kv.d.ts.map +1 -0
- package/dist/cache/stores/cloudflare-kv.js +29 -0
- package/dist/cache/stores/cloudflare-kv.js.map +1 -0
- package/dist/cache/stores/memory.d.ts +42 -0
- package/dist/cache/stores/memory.d.ts.map +1 -0
- package/dist/cache/stores/memory.js +90 -0
- package/dist/cache/stores/memory.js.map +1 -0
- package/dist/cache/stores/redis.d.ts +69 -0
- package/dist/cache/stores/redis.d.ts.map +1 -0
- package/dist/cache/stores/redis.js +35 -0
- package/dist/cache/stores/redis.js.map +1 -0
- package/dist/cache/stores/vercel.d.ts +36 -0
- package/dist/cache/stores/vercel.d.ts.map +1 -0
- package/dist/cache/stores/vercel.js +33 -0
- package/dist/cache/stores/vercel.js.map +1 -0
- package/dist/cache/tag-aware-handler.d.ts +51 -0
- package/dist/cache/tag-aware-handler.d.ts.map +1 -0
- package/dist/cache/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cdn/cloudflare-purge.d.ts +23 -0
- package/dist/cdn/cloudflare-purge.d.ts.map +1 -0
- package/dist/cdn/fastly-purge.d.ts +25 -0
- package/dist/cdn/fastly-purge.d.ts.map +1 -0
- package/dist/cdn/headers.d.ts +97 -0
- package/dist/cdn/headers.d.ts.map +1 -0
- package/dist/cdn/index.d.ts +5 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/purge-store.d.ts +23 -0
- package/dist/cdn/purge-store.d.ts.map +1 -0
- package/dist/cdn/workers-cache-purge.d.ts +16 -0
- package/dist/cdn/workers-cache-purge.d.ts.map +1 -0
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +34 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +107 -33
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +37 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/child-segment-context.d.ts +22 -0
- package/dist/client/child-segment-context.d.ts.map +1 -0
- package/dist/client/child-segment-outlet.d.ts +18 -0
- package/dist/client/child-segment-outlet.d.ts.map +1 -0
- package/dist/client/child-segment-provider.d.ts +21 -0
- package/dist/client/child-segment-provider.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +11 -6
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +10 -24
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +182 -1134
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.d.ts +19 -0
- package/dist/client/internal.d.ts.map +1 -0
- package/dist/client/internal.js +825 -0
- package/dist/client/internal.js.map +1 -0
- package/dist/client/link.d.ts +69 -60
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/navigation-api.d.ts +120 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +3 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/navigation-root.d.ts +119 -0
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts +1 -1
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router-ref.d.ts +1 -1
- package/dist/client/router.d.ts +87 -14
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +47 -14
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +4 -4
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +49 -0
- package/dist/client/segment-outlet.d.ts.map +1 -0
- package/dist/client/segment-update-context.d.ts +21 -0
- package/dist/client/segment-update-context.d.ts.map +1 -0
- package/dist/client/shallow-url.d.ts +10 -0
- package/dist/client/shallow-url.d.ts.map +1 -0
- package/dist/client/ssr-data.d.ts +13 -4
- package/dist/client/ssr-data.d.ts.map +1 -1
- package/dist/client/state.d.ts +1 -1
- package/dist/client/top-loader.d.ts +5 -5
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-cookie.d.ts +12 -0
- package/dist/client/use-cookie.d.ts.map +1 -1
- package/dist/client/use-link-status.d.ts +5 -5
- package/dist/client/use-link-status.d.ts.map +1 -1
- package/dist/client/use-pathname.d.ts.map +1 -1
- package/dist/client/use-pending-navigation.d.ts +23 -0
- package/dist/client/use-pending-navigation.d.ts.map +1 -0
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/client/use-router.d.ts +1 -1
- package/dist/client/use-router.d.ts.map +1 -1
- package/dist/client/use-search-params.d.ts +12 -5
- package/dist/client/use-search-params.d.ts.map +1 -1
- package/dist/client/{use-params.d.ts → use-segment-params.d.ts} +8 -6
- package/dist/client/use-segment-params.d.ts.map +1 -0
- package/dist/codec.d.ts +69 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +75 -0
- package/dist/codec.js.map +1 -0
- package/dist/config-types.d.ts +304 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-validation.d.ts +51 -0
- package/dist/config-validation.d.ts.map +1 -0
- package/dist/content/index.d.ts +1 -10
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +0 -2
- package/dist/cookies/define-cookie.d.ts +58 -25
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -1
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +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} +2 -2
- package/dist/dev-tools/logs.d.ts.map +1 -0
- package/dist/dev-tools/overlay.d.ts +91 -0
- package/dist/dev-tools/overlay.d.ts.map +1 -0
- package/dist/dev-tools/stack-classifier.d.ts +34 -0
- package/dist/dev-tools/stack-classifier.d.ts.map +1 -0
- package/dist/dev-tools/terminal.d.ts +28 -0
- package/dist/dev-tools/terminal.d.ts.map +1 -0
- package/dist/fonts/ast-walk.d.ts +68 -0
- package/dist/fonts/ast-walk.d.ts.map +1 -0
- package/dist/fonts/ast.d.ts +110 -6
- package/dist/fonts/ast.d.ts.map +1 -1
- package/dist/fonts/bundle.d.ts +50 -0
- package/dist/fonts/bundle.d.ts.map +1 -0
- package/dist/fonts/dev-middleware.d.ts +22 -0
- package/dist/fonts/dev-middleware.d.ts.map +1 -0
- package/dist/fonts/fallbacks.d.ts +0 -7
- package/dist/fonts/fallbacks.d.ts.map +1 -1
- package/dist/fonts/google.d.ts +4 -2
- package/dist/fonts/google.d.ts.map +1 -1
- package/dist/fonts/local.d.ts +4 -4
- package/dist/fonts/local.d.ts.map +1 -1
- package/dist/fonts/paths.d.ts +43 -0
- package/dist/fonts/paths.d.ts.map +1 -0
- package/dist/fonts/pipeline.d.ts +158 -0
- package/dist/fonts/pipeline.d.ts.map +1 -0
- package/dist/fonts/transform.d.ts +82 -0
- package/dist/fonts/transform.d.ts.map +1 -0
- package/dist/fonts/types.d.ts +47 -1
- package/dist/fonts/types.d.ts.map +1 -1
- package/dist/fonts/virtual-modules.d.ts +77 -0
- package/dist/fonts/virtual-modules.d.ts.map +1 -0
- package/dist/index.d.ts +46 -180
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8471 -14108
- package/dist/index.js.map +1 -1
- package/dist/params/codec-registry.d.ts +26 -0
- package/dist/params/codec-registry.d.ts.map +1 -0
- package/dist/params/define-schema.d.ts +81 -0
- package/dist/params/define-schema.d.ts.map +1 -0
- package/dist/params/index.d.ts +5 -0
- package/dist/params/index.d.ts.map +1 -0
- package/dist/params/index.js +34 -0
- package/dist/params/index.js.map +1 -0
- package/dist/params/resolve-schema.d.ts +34 -0
- package/dist/params/resolve-schema.d.ts.map +1 -0
- package/dist/plugin-context.d.ts +190 -0
- package/dist/plugin-context.d.ts.map +1 -0
- package/dist/plugins/adapter-build.d.ts +20 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +7 -3
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +43 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +64 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/callsite-ast.d.ts +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 +1 -1
- package/dist/plugins/entries.d.ts.map +1 -1
- package/dist/plugins/fonts.d.ts +16 -73
- package/dist/plugins/fonts.d.ts.map +1 -1
- package/dist/plugins/mdx.d.ts +1 -1
- package/dist/plugins/mdx.d.ts.map +1 -1
- package/dist/plugins/prebuilt-capture.d.ts +60 -0
- package/dist/plugins/prebuilt-capture.d.ts.map +1 -0
- package/dist/plugins/prebuilt.d.ts +82 -0
- package/dist/plugins/prebuilt.d.ts.map +1 -0
- package/dist/plugins/prerender-sugar.d.ts +42 -0
- package/dist/plugins/prerender-sugar.d.ts.map +1 -0
- package/dist/plugins/routing.d.ts +1 -1
- package/dist/plugins/routing.d.ts.map +1 -1
- package/dist/plugins/server-bundle.d.ts.map +1 -1
- package/dist/plugins/shims.d.ts +29 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +5 -26
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen-shared.d.ts +67 -0
- package/dist/routing/codegen-shared.d.ts.map +1 -0
- package/dist/routing/codegen-types.d.ts +64 -0
- package/dist/routing/codegen-types.d.ts.map +1 -0
- package/dist/routing/codegen.d.ts +7 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/convention-lint.d.ts +41 -0
- package/dist/routing/convention-lint.d.ts.map +1 -0
- package/dist/routing/export-detect.d.ts +56 -0
- package/dist/routing/export-detect.d.ts.map +1 -0
- package/dist/routing/file-cache.d.ts +8 -0
- package/dist/routing/file-cache.d.ts.map +1 -0
- package/dist/routing/index.d.ts +7 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +4 -2
- package/dist/routing/interception.d.ts +0 -5
- package/dist/routing/interception.d.ts.map +1 -1
- package/dist/routing/link-codegen.d.ts +90 -0
- package/dist/routing/link-codegen.d.ts.map +1 -0
- package/dist/routing/manifest-codegen.d.ts +32 -0
- package/dist/routing/manifest-codegen.d.ts.map +1 -0
- package/dist/routing/scanner.d.ts +1 -10
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/schema-validation.d.ts +35 -0
- package/dist/routing/schema-validation.d.ts.map +1 -0
- package/dist/routing/segment-classify.d.ts +75 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/segment-codegen.d.ts +38 -0
- package/dist/routing/segment-codegen.d.ts.map +1 -0
- package/dist/routing/types.d.ts +77 -25
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/routing/walkers.d.ts +51 -0
- package/dist/routing/walkers.d.ts.map +1 -0
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/rsc-runtime/ssr.d.ts +12 -0
- package/dist/rsc-runtime/ssr.d.ts.map +1 -1
- package/dist/schema-bridge.d.ts +91 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +157 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -7
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +37 -440
- package/dist/search-params/index.js.map +1 -1
- package/dist/search-params/registry.d.ts +2 -2
- package/dist/search-params/registry.d.ts.map +1 -1
- package/dist/search-params/wrappers.d.ts +53 -0
- package/dist/search-params/wrappers.d.ts.map +1 -0
- package/dist/segment-params/define.d.ts +89 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +3 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +2 -0
- package/dist/server/access-gate.d.ts +8 -3
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +41 -6
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-encryption.d.ts +76 -0
- package/dist/server/action-encryption.d.ts.map +1 -0
- package/dist/server/action-handler.d.ts +35 -1
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/actions.d.ts +6 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +86 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +8 -18
- package/dist/server/asset-headers.d.ts.map +1 -1
- package/dist/server/body-limits.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +6 -29
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/canonicalize.d.ts +10 -0
- package/dist/server/canonicalize.d.ts.map +1 -1
- package/dist/server/coalesce-tick.d.ts +40 -0
- package/dist/server/coalesce-tick.d.ts.map +1 -0
- package/dist/server/cookie-context.d.ts +170 -0
- package/dist/server/cookie-context.d.ts.map +1 -0
- package/dist/server/cookie-parsing.d.ts +65 -0
- package/dist/server/cookie-parsing.d.ts.map +1 -0
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/default-logger.d.ts +22 -0
- package/dist/server/default-logger.d.ts.map +1 -0
- package/dist/server/deny-boundary.d.ts +115 -0
- package/dist/server/deny-boundary.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts +2 -2
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-source-map.d.ts +22 -0
- package/dist/server/dev-source-map.d.ts.map +1 -0
- package/dist/server/early-hints-sender.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -11
- package/dist/server/early-hints.d.ts.map +1 -1
- package/dist/server/error-boundary-wrapper.d.ts +7 -1
- package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
- package/dist/server/fallback-error.d.ts +12 -7
- package/dist/server/fallback-error.d.ts.map +1 -1
- package/dist/server/flight-injection-state.d.ts +66 -0
- package/dist/server/flight-injection-state.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +42 -0
- package/dist/server/flight-scripts.d.ts.map +1 -0
- package/dist/server/form-data.d.ts +41 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injector-core.d.ts +221 -0
- package/dist/server/html-injector-core.d.ts.map +1 -0
- package/dist/server/html-injectors.d.ts +82 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +11 -47
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +49 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3652 -0
- package/dist/server/internal.js.map +1 -0
- package/dist/server/logger.d.ts +39 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/metadata-routes.d.ts +23 -7
- package/dist/server/metadata-routes.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +36 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +119 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/param-coercion.d.ts +54 -0
- package/dist/server/param-coercion.d.ts.map +1 -0
- package/dist/server/pipeline-helpers.d.ts +95 -0
- package/dist/server/pipeline-helpers.d.ts.map +1 -0
- package/dist/server/pipeline-interception.d.ts +1 -1
- package/dist/server/pipeline-interception.d.ts.map +1 -1
- package/dist/server/pipeline-metadata.d.ts +6 -0
- package/dist/server/pipeline-metadata.d.ts.map +1 -1
- package/dist/server/pipeline-outcome.d.ts +49 -0
- package/dist/server/pipeline-outcome.d.ts.map +1 -0
- package/dist/server/pipeline-phases.d.ts +56 -0
- package/dist/server/pipeline-phases.d.ts.map +1 -0
- package/dist/server/pipeline.d.ts +122 -19
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/port-resolution.d.ts +117 -0
- package/dist/server/port-resolution.d.ts.map +1 -0
- package/dist/server/prebuilt/cache-key.d.ts +58 -0
- package/dist/server/prebuilt/cache-key.d.ts.map +1 -0
- package/dist/server/prebuilt/capture-state.d.ts +57 -0
- package/dist/server/prebuilt/capture-state.d.ts.map +1 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts +27 -0
- package/dist/server/prebuilt/manifest-tag-index.d.ts.map +1 -0
- package/dist/server/prebuilt/overlay.d.ts +100 -0
- package/dist/server/prebuilt/overlay.d.ts.map +1 -0
- package/dist/server/prebuilt/payload-source.d.ts +78 -0
- package/dist/server/prebuilt/payload-source.d.ts.map +1 -0
- package/dist/server/prebuilt/synthetic-store.d.ts +66 -0
- package/dist/server/prebuilt/synthetic-store.d.ts.map +1 -0
- package/dist/server/prebuilt-builder.d.ts +120 -0
- package/dist/server/prebuilt-builder.d.ts.map +1 -0
- package/dist/server/prebuilt-runtime.d.ts +101 -0
- package/dist/server/prebuilt-runtime.d.ts.map +1 -0
- package/dist/server/primitives.d.ts +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/route-element-builder.d.ts +46 -25
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-matcher.d.ts +25 -36
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-middleware-runner.d.ts +66 -0
- package/dist/server/rsc-entry/action-middleware-runner.d.ts.map +1 -0
- package/dist/server/rsc-entry/api-handler.d.ts +12 -3
- package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/helpers.d.ts +51 -28
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +28 -6
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +5 -6
- package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts +17 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +5 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +34 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts +119 -0
- package/dist/server/rsc-entry/wrap-action-dispatch.d.ts.map +1 -0
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.d.ts.map +1 -0
- package/dist/server/sensitive-fields.d.ts +74 -0
- package/dist/server/sensitive-fields.d.ts.map +1 -0
- package/dist/server/sitemap-generator.d.ts +129 -0
- package/dist/server/sitemap-generator.d.ts.map +1 -0
- package/dist/server/sitemap-handler.d.ts +22 -0
- package/dist/server/sitemap-handler.d.ts.map +1 -0
- package/dist/server/slot-resolver.d.ts +7 -5
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +121 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -0
- package/dist/server/ssr-entry.d.ts +2 -43
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +64 -21
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/server/ssr-wrappers.d.ts +50 -0
- package/dist/server/ssr-wrappers.d.ts.map +1 -0
- package/dist/server/state-tree-diff.d.ts +12 -5
- package/dist/server/state-tree-diff.d.ts.map +1 -1
- package/dist/server/status-code-resolver.d.ts +22 -11
- package/dist/server/status-code-resolver.d.ts.map +1 -1
- package/dist/server/stream-utils.d.ts +47 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +44 -9
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +62 -30
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/tree-match.d.ts +49 -0
- package/dist/server/tree-match.d.ts.map +1 -0
- package/dist/server/types.d.ts +71 -6
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/utils/escape-html.d.ts +14 -0
- package/dist/server/utils/escape-html.d.ts.map +1 -0
- package/dist/server/utils/mdx-file.d.ts +15 -0
- package/dist/server/utils/mdx-file.d.ts.map +1 -0
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/workers-cache-bridge.d.ts +26 -0
- package/dist/server/workers-cache-bridge.d.ts.map +1 -0
- package/dist/shared/href-validation.d.ts +49 -0
- package/dist/shared/href-validation.d.ts.map +1 -0
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.d.ts.map +1 -0
- package/dist/shared/redirect-type.d.ts +17 -0
- package/dist/shared/redirect-type.d.ts.map +1 -0
- package/dist/shims/font-google.d.ts +1 -1
- package/dist/shims/font-google.d.ts.map +1 -1
- package/dist/shims/font-google.js +42 -0
- package/dist/shims/font-google.js.map +1 -0
- package/dist/shims/font-local.d.ts +26 -0
- package/dist/shims/font-local.d.ts.map +1 -0
- package/dist/shims/font-local.js +20 -0
- package/dist/shims/font-local.js.map +1 -0
- package/dist/shims/headers.d.ts +53 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/image.d.ts +16 -16
- package/dist/shims/navigation-client.d.ts +35 -11
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +11 -5
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/state-machine.d.ts +80 -0
- package/dist/utils/state-machine.d.ts.map +1 -0
- package/docs/api/30-api-server.mdx +233 -0
- package/docs/api/31-api-client.mdx +161 -0
- package/docs/api/32-api-cache.mdx +199 -0
- package/docs/api/33-api-search-params.mdx +141 -0
- package/docs/api/34-api-config.mdx +189 -0
- package/docs/api/35-api-typescript.mdx +170 -0
- package/docs/api/36-cli.mdx +143 -0
- package/docs/learn/00-introduction.mdx +76 -0
- package/docs/learn/01-quick-start.mdx +94 -0
- package/docs/learn/02-pages-and-layouts.mdx +147 -0
- package/docs/learn/03-fetching-data.mdx +211 -0
- package/docs/learn/03b-access-control.mdx +130 -0
- package/docs/learn/04-loading-states.mdx +67 -0
- package/docs/learn/04b-the-flush-point.mdx +115 -0
- package/docs/learn/05-typed-params.mdx +275 -0
- package/docs/learn/06-forms-and-actions.mdx +146 -0
- package/docs/learn/07-typed-routes.mdx +127 -0
- package/docs/learn/08-streaming.mdx +146 -0
- package/docs/learn/09-caching.mdx +136 -0
- package/docs/learn/10-middleware.mdx +157 -0
- package/docs/learn/11-error-handling.mdx +156 -0
- package/docs/learn/12-client-navigation.mdx +168 -0
- package/docs/learn/13-configuration.mdx +145 -0
- package/docs/learn/14-deploying.mdx +264 -0
- package/docs/more/01-advanced-routing.mdx +139 -0
- package/docs/more/02-advanced-forms.mdx +137 -0
- package/docs/more/03-coming-from-nextjs.mdx +186 -0
- package/docs/more/04-metadata-and-fonts.mdx +193 -0
- package/docs/more/04b-mdx.mdx +209 -0
- package/docs/more/05-content-collections.mdx +90 -0
- package/docs/more/06-instrumentation.mdx +214 -0
- package/docs/more/07-security.mdx +129 -0
- package/docs/more/08-developer-experience.mdx +134 -0
- package/docs/more/40-why-timber.mdx +50 -0
- package/docs/more/41-timber-vs-nextjs.mdx +81 -0
- package/docs/more/42-timber-vs-others.mdx +68 -0
- package/docs/more/50-ai-agent-instructions.mdx +169 -0
- package/llms.txt +55 -0
- package/package.json +103 -26
- package/src/adapters/build-output-helper.ts +199 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +179 -0
- package/src/adapters/cloudflare.ts +571 -118
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +131 -107
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +68 -0
- package/src/adapters/types.ts +0 -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 +88 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +122 -15
- package/src/cache/singleflight.ts +64 -6
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/store.ts +71 -0
- package/src/cache/stores/cloudflare-kv.ts +52 -0
- package/src/cache/stores/memory.ts +125 -0
- package/src/cache/stores/redis.ts +97 -0
- package/src/cache/stores/vercel.ts +59 -0
- package/src/cache/tag-aware-handler.ts +233 -0
- package/src/cache/timber-cache.ts +142 -36
- package/src/cdn/cloudflare-purge.ts +50 -0
- package/src/cdn/fastly-purge.ts +63 -0
- package/src/cdn/headers.ts +153 -0
- package/src/cdn/index.ts +17 -0
- package/src/cdn/purge-store.ts +34 -0
- package/src/cdn/workers-cache-purge.ts +30 -0
- package/src/cli-schema-sync.ts +388 -0
- package/src/cli.ts +157 -34
- package/src/client/browser-dev.ts +156 -1
- package/src/client/browser-entry/action-dispatch.ts +124 -0
- package/src/client/browser-entry/hmr.ts +70 -0
- package/src/client/browser-entry/hydrate.ts +187 -0
- package/src/client/browser-entry/index.ts +111 -0
- package/src/client/browser-entry/post-hydration.ts +103 -0
- package/src/client/browser-entry/router-init.ts +287 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/child-segment-context.ts +40 -0
- package/src/client/child-segment-outlet.tsx +25 -0
- package/src/client/child-segment-provider.tsx +27 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +11 -7
- package/src/client/index.ts +67 -45
- package/src/client/internal.ts +58 -0
- package/src/client/link.tsx +346 -150
- package/src/client/navigation-api.ts +341 -0
- package/src/client/navigation-context.ts +15 -7
- package/src/client/navigation-root.tsx +355 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router-ref.ts +1 -1
- package/src/client/router.ts +482 -166
- package/src/client/rsc-fetch.ts +214 -33
- package/src/client/segment-cache.ts +7 -7
- package/src/client/segment-outlet.tsx +77 -0
- package/src/client/segment-update-context.ts +42 -0
- package/src/client/shallow-url.ts +22 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/state.ts +2 -2
- package/src/client/top-loader.tsx +11 -9
- package/src/client/use-cookie.ts +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 +9 -3
- package/src/client/use-router.ts +4 -1
- package/src/client/use-search-params.ts +31 -44
- package/src/client/{use-params.ts → use-segment-params.ts} +9 -6
- package/src/codec.ts +147 -0
- package/src/config-types.ts +302 -0
- package/src/config-validation.ts +328 -0
- package/src/content/index.ts +5 -13
- package/src/cookies/define-cookie.ts +217 -53
- package/src/cookies/index.ts +12 -1
- package/src/cookies/json-cookie.ts +105 -0
- package/src/cookies/validation.ts +192 -0
- package/src/dev-tools/404-page.ts +286 -0
- package/src/dev-tools/browser-logs.ts +55 -0
- package/src/dev-tools/dev-page-shell.ts +260 -0
- package/src/dev-tools/error-page.ts +331 -0
- package/src/dev-tools/holding-server.ts +187 -0
- package/src/dev-tools/hydration-overlay.ts +158 -0
- package/src/dev-tools/index.ts +83 -0
- package/src/dev-tools/instrumentation.ts +213 -0
- package/src/{server/dev-logger.ts → dev-tools/logger.ts} +33 -51
- package/src/{plugins/dev-logs.ts → dev-tools/logs.ts} +9 -5
- package/src/dev-tools/overlay.ts +469 -0
- package/src/dev-tools/stack-classifier.ts +75 -0
- package/src/dev-tools/terminal.ts +182 -0
- package/src/fonts/ast-walk.ts +235 -0
- package/src/fonts/ast.ts +477 -126
- package/src/fonts/bundle.ts +138 -0
- package/src/fonts/dev-middleware.ts +85 -0
- package/src/fonts/fallbacks.ts +0 -23
- package/src/fonts/google.ts +63 -8
- package/src/fonts/local.ts +9 -8
- package/src/fonts/paths.ts +58 -0
- package/src/fonts/pipeline.ts +316 -0
- package/src/fonts/transform.ts +305 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +431 -352
- package/src/params/codec-registry.ts +34 -0
- package/src/params/define-schema.ts +115 -0
- package/src/params/index.ts +17 -0
- package/src/params/resolve-schema.ts +84 -0
- package/src/plugin-context.ts +378 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +253 -35
- package/src/plugins/cache.ts +229 -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 +144 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +293 -46
- package/src/plugins/entries.ts +129 -8
- package/src/plugins/fonts.ts +199 -664
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/prebuilt-capture.ts +217 -0
- package/src/plugins/prebuilt.ts +700 -0
- package/src/plugins/prerender-sugar.ts +329 -0
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +97 -12
- package/src/plugins/shims.ts +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 +360 -178
- package/src/routing/convention-lint.ts +394 -0
- package/src/routing/export-detect.ts +304 -0
- package/src/routing/file-cache.ts +23 -0
- package/src/routing/index.ts +10 -1
- package/src/routing/interception.ts +3 -22
- package/src/routing/link-codegen.ts +310 -0
- package/src/routing/manifest-codegen.ts +281 -0
- package/src/routing/scanner.ts +248 -188
- package/src/routing/schema-validation.ts +149 -0
- package/src/routing/segment-classify.ts +188 -0
- package/src/routing/segment-codegen.ts +98 -0
- package/src/routing/types.ts +78 -25
- package/src/routing/walkers.ts +90 -0
- package/src/rsc-runtime/rsc.ts +9 -0
- package/src/rsc-runtime/ssr.ts +50 -0
- package/src/rsc-runtime/vendor-types.d.ts +7 -0
- package/src/schema-bridge.ts +252 -0
- package/src/search-params/define.ts +570 -0
- package/src/search-params/index.ts +14 -20
- package/src/search-params/registry.ts +2 -2
- package/src/search-params/wrappers.ts +110 -0
- package/src/segment-params/define.ts +249 -0
- package/src/segment-params/index.ts +9 -0
- package/src/server/access-gate.tsx +84 -34
- package/src/server/action-client.ts +119 -28
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +123 -33
- package/src/server/actions.ts +48 -54
- package/src/server/als-registry.ts +130 -20
- package/src/server/asset-headers.ts +15 -37
- package/src/server/body-limits.ts +10 -2
- package/src/server/build-manifest.ts +13 -56
- package/src/server/canonicalize.ts +6 -3
- package/src/server/coalesce-tick.ts +75 -0
- package/src/server/compress.ts +34 -7
- package/src/server/cookie-context.ts +484 -0
- package/src/server/cookie-parsing.ts +163 -0
- package/src/server/csrf.ts +39 -6
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-boundary.ts +311 -0
- package/src/server/deny-renderer.ts +85 -77
- package/src/server/dev-source-map.ts +31 -0
- package/src/server/early-hints-sender.ts +3 -2
- package/src/server/early-hints.ts +37 -27
- package/src/server/error-boundary-wrapper.ts +61 -22
- package/src/server/fallback-error.ts +79 -102
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/form-data.ts +124 -12
- package/src/server/html-injector-core.ts +437 -0
- package/src/server/html-injectors.ts +267 -254
- package/src/server/index.ts +31 -185
- package/src/server/internal.ts +181 -0
- package/src/server/logger.ts +72 -36
- package/src/server/metadata-routes.ts +44 -19
- package/src/server/middleware-runner.ts +75 -4
- package/src/server/node-stream-transforms.ts +331 -0
- package/src/server/param-coercion.ts +206 -0
- package/src/server/pipeline-helpers.ts +204 -0
- package/src/server/pipeline-interception.ts +32 -18
- package/src/server/pipeline-metadata.ts +14 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +538 -0
- package/src/server/pipeline.ts +226 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/prebuilt/cache-key.ts +224 -0
- package/src/server/prebuilt/capture-state.ts +89 -0
- package/src/server/prebuilt/manifest-tag-index.ts +46 -0
- package/src/server/prebuilt/overlay.ts +256 -0
- package/src/server/prebuilt/payload-source.ts +201 -0
- package/src/server/prebuilt/synthetic-store.ts +121 -0
- package/src/server/prebuilt-builder.ts +774 -0
- package/src/server/prebuilt-runtime.ts +731 -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 +168 -337
- package/src/server/route-element-builder.ts +548 -233
- package/src/server/route-handler.ts +31 -4
- package/src/server/route-matcher.ts +144 -277
- package/src/server/rsc-entry/action-middleware-runner.ts +167 -0
- package/src/server/rsc-entry/api-handler.ts +69 -32
- package/src/server/rsc-entry/error-renderer.ts +306 -89
- package/src/server/rsc-entry/helpers.ts +160 -76
- package/src/server/rsc-entry/index.ts +394 -330
- package/src/server/rsc-entry/render-route.ts +288 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +349 -0
- package/src/server/rsc-entry/rsc-payload.ts +74 -35
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +273 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/server-only-guard-noop.js +3 -0
- package/src/server/sitemap-generator.ts +344 -0
- package/src/server/sitemap-handler.ts +157 -0
- package/src/server/slot-resolver.ts +258 -257
- package/src/server/ssr-bridge-types.ts +124 -0
- package/src/server/ssr-entry.ts +206 -78
- package/src/server/ssr-render.ts +345 -82
- package/src/server/ssr-wrappers.tsx +141 -0
- package/src/server/state-tree-diff.ts +30 -23
- package/src/server/status-code-resolver.ts +115 -130
- package/src/server/stream-utils.ts +286 -0
- package/src/server/tracing.ts +126 -14
- package/src/server/tree-builder.ts +204 -90
- package/src/server/tree-match.ts +220 -0
- package/src/server/types.ts +78 -9
- package/src/server/utils/escape-html.ts +20 -0
- package/src/server/utils/mdx-file.ts +22 -0
- package/src/server/version-skew.ts +104 -0
- package/src/server/workers-cache-bridge.ts +33 -0
- package/src/shared/href-validation.ts +159 -0
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shared/redirect-type.ts +17 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/headers.ts +122 -1
- package/src/shims/navigation-client.ts +51 -29
- package/src/shims/navigation.ts +14 -7
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js +0 -41
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-B3Gypr3D.js +0 -108
- package/dist/_chunks/debug-B3Gypr3D.js.map +0 -1
- package/dist/_chunks/format-RyoGQL74.js +0 -164
- package/dist/_chunks/format-RyoGQL74.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js +0 -676
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/metadata-routes-Cjmvi3rQ.js.map +0 -1
- package/dist/_chunks/request-context-BQUC8PHn.js +0 -330
- package/dist/_chunks/request-context-BQUC8PHn.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-CemImE6h.js +0 -187
- package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
- package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
- package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
- package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/register-cached-function.d.ts +0 -17
- package/dist/cache/register-cached-function.d.ts.map +0 -1
- package/dist/client/browser-entry.d.ts +0 -21
- package/dist/client/browser-entry.d.ts.map +0 -1
- package/dist/client/head.d.ts +0 -16
- package/dist/client/head.d.ts.map +0 -1
- package/dist/client/link-status-provider.d.ts +0 -11
- package/dist/client/link-status-provider.d.ts.map +0 -1
- package/dist/client/segment-merger.d.ts +0 -119
- package/dist/client/segment-merger.d.ts.map +0 -1
- package/dist/client/stale-reload.d.ts +0 -44
- package/dist/client/stale-reload.d.ts.map +0 -1
- package/dist/client/transition-root.d.ts +0 -74
- package/dist/client/transition-root.d.ts.map +0 -1
- package/dist/client/use-navigation-pending.d.ts +0 -26
- package/dist/client/use-navigation-pending.d.ts.map +0 -1
- package/dist/client/use-params.d.ts.map +0 -1
- package/dist/plugins/cache-transform.d.ts +0 -36
- package/dist/plugins/cache-transform.d.ts.map +0 -1
- package/dist/plugins/dev-error-overlay.d.ts +0 -60
- package/dist/plugins/dev-error-overlay.d.ts.map +0 -1
- package/dist/plugins/dev-logs.d.ts.map +0 -1
- package/dist/plugins/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.d.ts.map +0 -1
- package/dist/plugins/server-action-exports.d.ts +0 -26
- package/dist/plugins/server-action-exports.d.ts.map +0 -1
- package/dist/routing/status-file-lint.d.ts +0 -33
- package/dist/routing/status-file-lint.d.ts.map +0 -1
- package/dist/search-params/analyze.d.ts +0 -54
- package/dist/search-params/analyze.d.ts.map +0 -1
- package/dist/search-params/builtin-codecs.d.ts +0 -105
- package/dist/search-params/builtin-codecs.d.ts.map +0 -1
- package/dist/search-params/codecs.d.ts +0 -53
- package/dist/search-params/codecs.d.ts.map +0 -1
- package/dist/search-params/create.d.ts +0 -106
- package/dist/search-params/create.d.ts.map +0 -1
- package/dist/server/client-module-map.d.ts +0 -47
- package/dist/server/client-module-map.d.ts.map +0 -1
- package/dist/server/dev-fetch-instrumentation.d.ts +0 -22
- package/dist/server/dev-fetch-instrumentation.d.ts.map +0 -1
- package/dist/server/dev-logger.d.ts.map +0 -1
- package/dist/server/dev-span-processor.d.ts +0 -29
- package/dist/server/dev-span-processor.d.ts.map +0 -1
- package/dist/server/dev-warnings.d.ts +0 -129
- package/dist/server/dev-warnings.d.ts.map +0 -1
- package/dist/server/flush.d.ts +0 -74
- package/dist/server/flush.d.ts.map +0 -1
- package/dist/server/manifest-status-resolver.d.ts +0 -58
- package/dist/server/manifest-status-resolver.d.ts.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/utils/directive-parser.d.ts +0 -70
- package/dist/utils/directive-parser.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -103
- package/src/client/browser-entry.ts +0 -678
- package/src/client/head.ts +0 -61
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/segment-merger.ts +0 -339
- package/src/client/stale-reload.ts +0 -87
- package/src/client/transition-root.tsx +0 -166
- package/src/client/use-navigation-pending.ts +0 -38
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dev-error-overlay.ts +0 -230
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/plugins/server-action-exports.ts +0 -220
- package/src/routing/status-file-lint.ts +0 -112
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/codecs.ts +0 -153
- package/src/search-params/create.ts +0 -321
- package/src/server/client-module-map.ts +0 -58
- package/src/server/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
|
@@ -1,20 +1,137 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTML stream injectors —
|
|
2
|
+
* HTML stream injectors — Web `TransformStream` wrappers around the
|
|
3
|
+
* pure helpers in `html-injector-core.ts`.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* Used on edge runtimes (Cloudflare Workers, Deno, browser SSR) where
|
|
6
|
+
* Web Streams are the native shape. The Node.js / Bun adapters live in
|
|
7
|
+
* `node-stream-transforms.ts` and wrap the same core in Node `Transform`s.
|
|
8
|
+
* Both wrappers must stay byte-for-byte equivalent — the core enforces
|
|
9
|
+
* that. If you fix a streaming bug here, you almost certainly need to
|
|
10
|
+
* fix it (or its cause) in the core, not in the Node wrapper.
|
|
11
|
+
*
|
|
12
|
+
* Also exports the `buildClientScripts` helper used by RSC entry to
|
|
13
|
+
* resolve bootstrap script URLs from the build manifest. That helper
|
|
14
|
+
* is unrelated to streaming but lives here for historical reasons (it
|
|
15
|
+
* shares no code with the core and was previously co-located with the
|
|
16
|
+
* Web stream transforms).
|
|
6
17
|
*
|
|
7
18
|
* Design docs: 02-rendering-pipeline.md, 18-build-system.md §"Entry Files"
|
|
8
19
|
*/
|
|
9
20
|
|
|
21
|
+
import {
|
|
22
|
+
BufferAggregator,
|
|
23
|
+
FlightInjectorCore,
|
|
24
|
+
createInjectorState,
|
|
25
|
+
createSuffixState,
|
|
26
|
+
encodeUtf8,
|
|
27
|
+
injectorFlush,
|
|
28
|
+
processInjectorChunk,
|
|
29
|
+
processSuffixChunk,
|
|
30
|
+
suffixFlush,
|
|
31
|
+
} from './html-injector-core.js';
|
|
32
|
+
import { flightChunkScript } from './flight-scripts.js';
|
|
33
|
+
import { withTimeout, RenderTimeoutError } from './render-timeout.js';
|
|
34
|
+
import { createTickCoalescer } from './coalesce-tick.js';
|
|
35
|
+
|
|
36
|
+
// ─── Buffered Transform ──────────────────────────────────────────────────────
|
|
37
|
+
|
|
38
|
+
export interface BufferedTransformOptions {
|
|
39
|
+
/**
|
|
40
|
+
* Flush synchronously once the buffer reaches this many bytes.
|
|
41
|
+
* Prevents unbounded memory growth for very large Fizz flushes.
|
|
42
|
+
* Default: Infinity (no byte limit — flush only on tick boundary).
|
|
43
|
+
*/
|
|
44
|
+
readonly maxBufferByteLength?: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
10
47
|
/**
|
|
11
|
-
*
|
|
48
|
+
* Buffer incoming chunks and coalesce them within a single event loop tick.
|
|
49
|
+
*
|
|
50
|
+
* React Fizz may emit multiple micro-chunks within a single flush. Without
|
|
51
|
+
* coalescing, downstream transforms (especially flight injection) could
|
|
52
|
+
* see chunk boundaries in the middle of HTML tags. This transform collects
|
|
53
|
+
* everything that arrives in the same tick and emits it as one concatenated
|
|
54
|
+
* chunk on the next `setImmediate` — a single-shot schedule, not a poll.
|
|
55
|
+
*
|
|
56
|
+
* See design/02 §"No Polling" and §"Scripts at Chunk Boundaries Only".
|
|
57
|
+
*/
|
|
58
|
+
export function createBufferedTransformStream(
|
|
59
|
+
options: BufferedTransformOptions = {}
|
|
60
|
+
): TransformStream<Uint8Array, Uint8Array> {
|
|
61
|
+
const buffer = new BufferAggregator(options.maxBufferByteLength ?? Infinity);
|
|
62
|
+
let controller: TransformStreamDefaultController<Uint8Array> | null = null;
|
|
63
|
+
|
|
64
|
+
const drainTo = () => {
|
|
65
|
+
const merged = buffer.drain();
|
|
66
|
+
if (!merged || !controller) return;
|
|
67
|
+
try {
|
|
68
|
+
controller.enqueue(merged);
|
|
69
|
+
} catch {
|
|
70
|
+
// Controller may be errored (e.g. cancelled) — ignore.
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const coalescer = createTickCoalescer(drainTo);
|
|
75
|
+
|
|
76
|
+
return new TransformStream<Uint8Array, Uint8Array>({
|
|
77
|
+
transform(chunk, ctrl) {
|
|
78
|
+
controller = ctrl;
|
|
79
|
+
const overCap = buffer.append(chunk);
|
|
80
|
+
if (overCap) {
|
|
81
|
+
drainTo();
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
coalescer.schedule();
|
|
85
|
+
},
|
|
86
|
+
flush() {
|
|
87
|
+
return coalescer.pending;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ─── Move Suffix Transform ───────────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Move `</body></html>` to the end of the stream.
|
|
96
|
+
*
|
|
97
|
+
* React's renderToReadableStream emits the closing tags as part of the
|
|
98
|
+
* shell chunk. Content arriving after the shell (Suspense resolutions,
|
|
99
|
+
* RSC scripts) would otherwise appear after `</html>` and produce invalid
|
|
100
|
+
* HTML. This transform strips the suffix on first sight and re-emits it
|
|
101
|
+
* from `flush()` — after every other byte has passed through. If the
|
|
102
|
+
* suffix never appeared in the input, it is appended anyway so output
|
|
103
|
+
* is well-formed.
|
|
12
104
|
*
|
|
13
|
-
*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
105
|
+
* Equivalent to Next.js's `createMoveSuffixStream`.
|
|
106
|
+
*/
|
|
107
|
+
export function createMoveSuffixStream(): TransformStream<Uint8Array, Uint8Array> {
|
|
108
|
+
const state = createSuffixState();
|
|
109
|
+
|
|
110
|
+
return new TransformStream<Uint8Array, Uint8Array>({
|
|
111
|
+
transform(chunk, controller) {
|
|
112
|
+
const result = processSuffixChunk(state, chunk);
|
|
113
|
+
if (result.kind === 'passthrough' || result.kind === 'noSuffix') {
|
|
114
|
+
controller.enqueue(chunk);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (result.before) controller.enqueue(result.before);
|
|
118
|
+
if (result.after) controller.enqueue(result.after);
|
|
119
|
+
},
|
|
120
|
+
flush(controller) {
|
|
121
|
+
controller.enqueue(suffixFlush(state));
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ─── Tag Injection ───────────────────────────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Inject `content` immediately before (or after) `targetTag` in the stream.
|
|
130
|
+
*
|
|
131
|
+
* Streams chunks through immediately, keeping only a small trailing buffer
|
|
132
|
+
* (length of target tag minus one) so a tag split across chunks is still
|
|
133
|
+
* detected. Suspense streaming chunks are never held back waiting for the
|
|
134
|
+
* closing tag.
|
|
18
135
|
*/
|
|
19
136
|
function createInjector(
|
|
20
137
|
stream: ReadableStream<Uint8Array>,
|
|
@@ -23,57 +140,29 @@ function createInjector(
|
|
|
23
140
|
position: 'before' | 'after' = 'before'
|
|
24
141
|
): ReadableStream<Uint8Array> {
|
|
25
142
|
if (!content) return stream;
|
|
26
|
-
|
|
27
|
-
const decoder = new TextDecoder();
|
|
28
|
-
const encoder = new TextEncoder();
|
|
29
|
-
let injected = false;
|
|
30
|
-
// Keep a trailing buffer just large enough that the target tag
|
|
31
|
-
// can't be split across the boundary without us seeing it.
|
|
32
|
-
let tail = '';
|
|
33
|
-
const tailLen = targetTag.length - 1;
|
|
143
|
+
const state = createInjectorState({ content, targetTag, position });
|
|
34
144
|
|
|
35
145
|
return stream.pipeThrough(
|
|
36
146
|
new TransformStream<Uint8Array, Uint8Array>({
|
|
37
147
|
transform(chunk, controller) {
|
|
38
|
-
|
|
148
|
+
const result = processInjectorChunk(state, chunk);
|
|
149
|
+
if (result.kind === 'passthrough') {
|
|
39
150
|
controller.enqueue(chunk);
|
|
40
151
|
return;
|
|
41
152
|
}
|
|
42
|
-
|
|
43
|
-
// Combine the trailing buffer with the new chunk
|
|
44
|
-
const text = tail + decoder.decode(chunk, { stream: true });
|
|
45
|
-
const tagIndex = text.indexOf(targetTag);
|
|
46
|
-
|
|
47
|
-
if (tagIndex !== -1) {
|
|
48
|
-
const splitPoint = position === 'before' ? tagIndex : tagIndex + targetTag.length;
|
|
49
|
-
const before = text.slice(0, splitPoint);
|
|
50
|
-
const after = text.slice(splitPoint);
|
|
51
|
-
controller.enqueue(encoder.encode(before + content + after));
|
|
52
|
-
injected = true;
|
|
53
|
-
tail = '';
|
|
54
|
-
} else {
|
|
55
|
-
// Flush everything except the last tailLen chars (which might
|
|
56
|
-
// be the start of the target tag split across chunks).
|
|
57
|
-
const safeEnd = Math.max(0, text.length - tailLen);
|
|
58
|
-
if (safeEnd > 0) {
|
|
59
|
-
controller.enqueue(encoder.encode(text.slice(0, safeEnd)));
|
|
60
|
-
}
|
|
61
|
-
tail = text.slice(safeEnd);
|
|
62
|
-
}
|
|
153
|
+
if (result.bytes) controller.enqueue(result.bytes);
|
|
63
154
|
},
|
|
64
155
|
flush(controller) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
156
|
+
const leftover = injectorFlush(state);
|
|
157
|
+
if (leftover) controller.enqueue(leftover);
|
|
68
158
|
},
|
|
69
159
|
})
|
|
70
160
|
);
|
|
71
161
|
}
|
|
72
162
|
|
|
73
163
|
/**
|
|
74
|
-
* Inject metadata elements before
|
|
75
|
-
*
|
|
76
|
-
* If no </head> is found, the buffer is emitted as-is.
|
|
164
|
+
* Inject metadata elements before `</head>` in the HTML stream.
|
|
165
|
+
* If no `</head>` is found, the buffer is emitted as-is.
|
|
77
166
|
*/
|
|
78
167
|
export function injectHead(
|
|
79
168
|
stream: ReadableStream<Uint8Array>,
|
|
@@ -83,10 +172,9 @@ export function injectHead(
|
|
|
83
172
|
}
|
|
84
173
|
|
|
85
174
|
/**
|
|
86
|
-
* Inject client bootstrap scripts before
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* If no </body> is found, the buffer is emitted as-is.
|
|
175
|
+
* Inject client bootstrap scripts before `</body>` in the HTML stream.
|
|
176
|
+
* Returns the stream unchanged if `scriptsHtml` is empty (client JS
|
|
177
|
+
* disabled mode). If no `</body>` is found, the buffer is emitted as-is.
|
|
90
178
|
*/
|
|
91
179
|
export function injectScripts(
|
|
92
180
|
stream: ReadableStream<Uint8Array>,
|
|
@@ -95,65 +183,49 @@ export function injectScripts(
|
|
|
95
183
|
return createInjector(stream, scriptsHtml, '</body>');
|
|
96
184
|
}
|
|
97
185
|
|
|
98
|
-
|
|
99
|
-
* Escape a string for safe embedding inside a `<script>` tag within
|
|
100
|
-
* a JSON-encoded value.
|
|
101
|
-
*
|
|
102
|
-
* Only needs to prevent `</script>` from closing the tag early and
|
|
103
|
-
* handle U+2028/U+2029 (line/paragraph separators valid in JSON but
|
|
104
|
-
* historically problematic in JS). Since we use JSON.stringify for the
|
|
105
|
-
* outer encoding, we only escape `<` and the line separators.
|
|
106
|
-
*/
|
|
107
|
-
function htmlEscapeJsonString(str: string): string {
|
|
108
|
-
return str
|
|
109
|
-
.replace(/</g, '\\u003c')
|
|
110
|
-
.replace(/\u2028/g, '\\u2028')
|
|
111
|
-
.replace(/\u2029/g, '\\u2029');
|
|
112
|
-
}
|
|
186
|
+
// ─── RSC Flight Injection ────────────────────────────────────────────────────
|
|
113
187
|
|
|
114
188
|
/**
|
|
115
189
|
* Transform an RSC Flight stream into a stream of inline `<script>` tags.
|
|
116
190
|
*
|
|
117
191
|
* Uses a **pull-based** ReadableStream — the consumer (the injection
|
|
118
192
|
* transform) drives reads from the RSC stream on demand. No background
|
|
119
|
-
* reader, no shared mutable arrays, no race conditions.
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
* The first chunk emitted is the bootstrap signal [0] which the client
|
|
125
|
-
* uses to initialize its buffer.
|
|
126
|
-
*
|
|
127
|
-
* Uses JSON-encoded typed tuples matching the pattern from Next.js:
|
|
128
|
-
* [0] — bootstrap signal
|
|
129
|
-
* [1, data] — RSC Flight data chunk (UTF-8 string)
|
|
193
|
+
* reader, no shared mutable arrays, no race conditions. Each RSC chunk
|
|
194
|
+
* becomes `<script>self.__timber_f.push([1,"data"])</script>`. The
|
|
195
|
+
* init script (which creates `__timber_f`) is in `<head>` via
|
|
196
|
+
* `flightInitScript()` — see flight-scripts.ts.
|
|
130
197
|
*/
|
|
131
198
|
export function createInlinedRscStream(
|
|
132
|
-
rscStream: ReadableStream<Uint8Array
|
|
199
|
+
rscStream: ReadableStream<Uint8Array>,
|
|
200
|
+
renderTimeoutMs?: number
|
|
133
201
|
): ReadableStream<Uint8Array> {
|
|
134
|
-
const encoder = new TextEncoder();
|
|
135
202
|
const rscReader = rscStream.getReader();
|
|
136
203
|
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
204
|
+
// When renderTimeoutMs is 0 ("disabled"), enforce a safety ceiling
|
|
205
|
+
// so a stalled RSC stream can't hang the connection forever.
|
|
206
|
+
const timeoutMs = (renderTimeoutMs ?? 30_000) || 120_000;
|
|
137
207
|
|
|
138
208
|
return new ReadableStream<Uint8Array>({
|
|
139
|
-
start(controller) {
|
|
140
|
-
// Emit bootstrap signal — tells the client that __timber_f is active
|
|
141
|
-
const bootstrap = `<script>(self.__timber_f=self.__timber_f||[]).push(${htmlEscapeJsonString(JSON.stringify([0]))})</script>`;
|
|
142
|
-
controller.enqueue(encoder.encode(bootstrap));
|
|
143
|
-
},
|
|
144
209
|
async pull(controller) {
|
|
145
210
|
try {
|
|
146
|
-
const
|
|
211
|
+
const readPromise = rscReader.read();
|
|
212
|
+
const { done, value } = await withTimeout(
|
|
213
|
+
readPromise,
|
|
214
|
+
timeoutMs,
|
|
215
|
+
'RSC stream read timed out'
|
|
216
|
+
);
|
|
147
217
|
if (done) {
|
|
148
218
|
controller.close();
|
|
149
219
|
return;
|
|
150
220
|
}
|
|
151
221
|
if (value) {
|
|
152
222
|
const decoded = decoder.decode(value, { stream: true });
|
|
153
|
-
|
|
154
|
-
controller.enqueue(encoder.encode(`<script>self.__timber_f.push(${escaped})</script>`));
|
|
223
|
+
controller.enqueue(encodeUtf8(flightChunkScript(decoded)));
|
|
155
224
|
}
|
|
156
225
|
} catch (error) {
|
|
226
|
+
if (error instanceof RenderTimeoutError) {
|
|
227
|
+
rscReader.cancel(error).catch(() => {});
|
|
228
|
+
}
|
|
157
229
|
controller.error(error);
|
|
158
230
|
}
|
|
159
231
|
},
|
|
@@ -161,191 +233,124 @@ export function createInlinedRscStream(
|
|
|
161
233
|
}
|
|
162
234
|
|
|
163
235
|
/**
|
|
164
|
-
* Merge RSC
|
|
165
|
-
*
|
|
236
|
+
* Merge a raw RSC byte stream into the HTML stream, wrapping each RSC
|
|
237
|
+
* chunk in a `<script>` and injecting it between HTML chunks at safe
|
|
238
|
+
* boundaries. Suffix stripping is handled upstream by
|
|
239
|
+
* `createMoveSuffixStream` — this transform only interleaves.
|
|
166
240
|
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
241
|
+
* The state machine, pending queue, script wrapping (`flightChunkScript`),
|
|
242
|
+
* and pull loop all live in `FlightInjectorCore`. This wrapper only
|
|
243
|
+
* shuffles bytes between the core and the Web `TransformStream` controller.
|
|
169
244
|
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
* has been stripped — guaranteeing body-level injection.
|
|
174
|
-
* 3. Re-emits `</body></html>` at the very end after all RSC scripts.
|
|
245
|
+
* **Input must be the raw RSC stream, not the pre-scripted output of
|
|
246
|
+
* `createInlinedRscStream`.** The core wraps each chunk itself; passing
|
|
247
|
+
* an already-wrapped stream would double-wrap and break hydration.
|
|
175
248
|
*
|
|
176
|
-
*
|
|
177
|
-
* scripts are always direct children of `<body>` regardless of how
|
|
178
|
-
* React's renderToReadableStream chunks the HTML. No HTML structure
|
|
179
|
-
* scanning or depth tracking needed — the suffix removal is the
|
|
180
|
-
* structural guarantee.
|
|
249
|
+
* State machine phases: init → streaming → flushing → done; (any) → error.
|
|
181
250
|
*
|
|
182
|
-
* Inspired by Next.js createFlightDataInjectionTransformStream
|
|
251
|
+
* Inspired by Next.js `createFlightDataInjectionTransformStream`. See
|
|
252
|
+
* design/02 §"Scripts at Chunk Boundaries Only".
|
|
183
253
|
*/
|
|
184
254
|
function createFlightInjectionTransform(
|
|
185
|
-
|
|
255
|
+
rscStream: ReadableStream<Uint8Array>,
|
|
256
|
+
renderTimeoutMs?: number,
|
|
257
|
+
errorSignal?: AbortSignal
|
|
186
258
|
): TransformStream<Uint8Array, Uint8Array> {
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
// iteration) instead of setTimeout(0) (timer phase — next
|
|
213
|
-
// iteration). Under concurrency, setTimeout(0) yields to
|
|
214
|
-
// ALL pending timer callbacks from other requests, adding
|
|
215
|
-
// 1-4ms per yield. setImmediate fires before timers.
|
|
216
|
-
// Available on both Node.js and Cloudflare Workers.
|
|
217
|
-
await new Promise<void>((r) => setImmediate(r));
|
|
218
|
-
|
|
219
|
-
try {
|
|
220
|
-
for (;;) {
|
|
221
|
-
const { done, value } = await rscReader.read();
|
|
222
|
-
if (done) {
|
|
223
|
-
donePulling = true;
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
pending.push(value);
|
|
227
|
-
// Yield between reads so HTML chunks get a chance to flow
|
|
228
|
-
// through transform() first — but only while HTML is still
|
|
229
|
-
// streaming. Once flush() fires (all HTML emitted), drain
|
|
230
|
-
// remaining RSC chunks without yielding.
|
|
231
|
-
if (!htmlStreamFinished) {
|
|
232
|
-
await new Promise<void>((r) => setImmediate(r));
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
} catch (err) {
|
|
236
|
-
pullError = err;
|
|
237
|
-
donePulling = true;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/** Drain all buffered RSC script chunks to the output. */
|
|
242
|
-
function drainPending(controller: TransformStreamDefaultController<Uint8Array>): void {
|
|
243
|
-
while (pending.length > 0) {
|
|
244
|
-
controller.enqueue(pending.shift()!);
|
|
245
|
-
}
|
|
246
|
-
if (pullError) {
|
|
247
|
-
const err = pullError;
|
|
248
|
-
pullError = null;
|
|
249
|
-
controller.error(err);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return new TransformStream<Uint8Array, Uint8Array>({
|
|
254
|
-
transform(chunk, controller) {
|
|
255
|
-
// Pull-based start: don't begin reading RSC until the first
|
|
256
|
-
// HTML chunk flows through. This matches Next.js's approach
|
|
257
|
-
// and ensures the shell HTML is enqueued before any RSC
|
|
258
|
-
// script tags. Without this, the pull loop starts eagerly
|
|
259
|
-
// and may read RSC data before the browser has any HTML.
|
|
260
|
-
if (!pullPromise) {
|
|
261
|
-
pullPromise = pullLoop();
|
|
259
|
+
const core = new FlightInjectorCore(rscStream, renderTimeoutMs, errorSignal);
|
|
260
|
+
// Controller reference — set on first transform() call so the pull
|
|
261
|
+
// loop can drain pending scripts between HTML chunks (after yielding).
|
|
262
|
+
let _controller: TransformStreamDefaultController<Uint8Array> | null = null;
|
|
263
|
+
|
|
264
|
+
const drain = (controller: TransformStreamDefaultController<Uint8Array>): void => {
|
|
265
|
+
while (core.pending.length > 0) controller.enqueue(core.pending.shift()!);
|
|
266
|
+
const err = core.terminalError;
|
|
267
|
+
if (err !== null) controller.error(err);
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
const onYieldDrain = (): void => {
|
|
271
|
+
if (_controller) drain(_controller);
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
// The cast is needed because TypeScript's lib types don't include the
|
|
275
|
+
// `cancel` method on Transformer, even though it's part of the WHATWG
|
|
276
|
+
// Streams spec and supported in all target runtimes.
|
|
277
|
+
const transformer = {
|
|
278
|
+
transform(chunk: Uint8Array, controller: TransformStreamDefaultController<Uint8Array>) {
|
|
279
|
+
_controller = controller;
|
|
280
|
+
|
|
281
|
+
if (core.isInit) {
|
|
282
|
+
core.notifyFirstChunk();
|
|
283
|
+
core.ensurePullLoop(onYieldDrain);
|
|
262
284
|
}
|
|
263
285
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Look for </body></html> in the shell chunk.
|
|
273
|
-
const text = decoder.decode(chunk, { stream: true });
|
|
274
|
-
const idx = text.indexOf(suffix);
|
|
275
|
-
if (idx !== -1) {
|
|
276
|
-
foundSuffix = true;
|
|
277
|
-
// Emit everything before the suffix (still inside <body>'s
|
|
278
|
-
// child elements — don't inject scripts here).
|
|
279
|
-
const before = text.slice(0, idx);
|
|
280
|
-
const after = text.slice(idx + suffix.length);
|
|
281
|
-
if (before) controller.enqueue(encoder.encode(before));
|
|
282
|
-
// Now we're at body level — drain buffered scripts
|
|
283
|
-
if (pending.length > 0) drainPending(controller);
|
|
284
|
-
// Emit any content after the suffix (shouldn't normally exist)
|
|
285
|
-
if (after) controller.enqueue(encoder.encode(after));
|
|
286
|
-
} else {
|
|
287
|
-
// Pre-suffix: inside nested elements. Pass through, don't
|
|
288
|
-
// inject scripts (they'd become children of nested elements).
|
|
289
|
-
controller.enqueue(chunk);
|
|
290
|
-
}
|
|
286
|
+
// Emit the HTML chunk, then drain any buffered RSC scripts.
|
|
287
|
+
// Scripts always come AFTER a complete HTML chunk — never mid-tag.
|
|
288
|
+
// The buffered transform upstream (TIM-528) ensures coherent chunks.
|
|
289
|
+
// Suffix stripping is upstream via createMoveSuffixStream (TIM-530).
|
|
290
|
+
controller.enqueue(chunk);
|
|
291
|
+
if (core.pending.length > 0) drain(controller);
|
|
291
292
|
},
|
|
292
|
-
flush(controller) {
|
|
293
|
-
// All HTML chunks
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
// Drain remaining RSC chunks at body level
|
|
298
|
-
const finish = () => {
|
|
299
|
-
drainPending(controller);
|
|
300
|
-
// Re-emit the suffix at the very end so HTML is well-formed
|
|
301
|
-
if (foundSuffix) {
|
|
302
|
-
controller.enqueue(suffixBytes);
|
|
303
|
-
}
|
|
304
|
-
};
|
|
293
|
+
flush(controller: TransformStreamDefaultController<Uint8Array>) {
|
|
294
|
+
// All HTML chunks emitted. Pull loop stops yielding.
|
|
295
|
+
core.notifyHtmlDone();
|
|
296
|
+
|
|
297
|
+
const finish = () => drain(controller);
|
|
305
298
|
|
|
306
|
-
if (
|
|
299
|
+
if (core.isPullDone) {
|
|
307
300
|
finish();
|
|
308
301
|
return;
|
|
309
302
|
}
|
|
310
|
-
|
|
311
|
-
pullPromise = pullLoop();
|
|
312
|
-
}
|
|
313
|
-
return pullPromise.then(finish);
|
|
303
|
+
return core.ensurePullLoop(onYieldDrain).then(finish);
|
|
314
304
|
},
|
|
315
|
-
|
|
305
|
+
cancel(reason: unknown) {
|
|
306
|
+
core.abort(reason ?? 'transform cancelled');
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
return new TransformStream<Uint8Array, Uint8Array>(
|
|
311
|
+
transformer as Transformer<Uint8Array, Uint8Array>
|
|
312
|
+
);
|
|
316
313
|
}
|
|
317
314
|
|
|
318
315
|
/**
|
|
319
316
|
* Progressively inline RSC Flight payload chunks into the HTML stream.
|
|
320
317
|
*
|
|
321
|
-
* Architecture (
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
318
|
+
* Architecture (2 TransformStream pipeline):
|
|
319
|
+
* HTML stream → flightInjection → moveSuffix → output
|
|
320
|
+
*
|
|
321
|
+
* 1. flightInjection wraps each RSC chunk in a `<script>` and interleaves
|
|
322
|
+
* them between HTML chunks.
|
|
323
|
+
* 2. moveSuffix strips `</body></html>` and re-emits at end so injected
|
|
324
|
+
* scripts appear before the closing tags.
|
|
325
325
|
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
326
|
+
* Wrapping happens inside `FlightInjectorCore` (via `flightChunkScript`).
|
|
327
|
+
* The raw RSC stream is passed straight to `createFlightInjectionTransform`
|
|
328
|
+
* — do not pre-wrap with `createInlinedRscStream` (that helper still
|
|
329
|
+
* exists for callers that want a standalone scripted stream).
|
|
329
330
|
*
|
|
330
331
|
* The client reads these script tags via `self.__timber_f` and feeds
|
|
331
|
-
* them to `createFromReadableStream` for progressive hydration.
|
|
332
|
-
*
|
|
333
|
-
*
|
|
332
|
+
* them to `createFromReadableStream` for progressive hydration. Stream
|
|
333
|
+
* completion is signaled by the `DOMContentLoaded` event on the client
|
|
334
|
+
* side — no custom done flag needed.
|
|
334
335
|
*/
|
|
335
336
|
export function injectRscPayload(
|
|
336
337
|
htmlStream: ReadableStream<Uint8Array>,
|
|
337
|
-
rscStream: ReadableStream<Uint8Array> | undefined
|
|
338
|
+
rscStream: ReadableStream<Uint8Array> | undefined,
|
|
339
|
+
renderTimeoutMs?: number,
|
|
340
|
+
errorSignal?: AbortSignal
|
|
338
341
|
): ReadableStream<Uint8Array> {
|
|
339
342
|
if (!rscStream) return htmlStream;
|
|
340
|
-
|
|
341
|
-
//
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
343
|
+
// Pass the raw RSC stream directly to the flight injection transform.
|
|
344
|
+
// The transform's core (FlightInjectorCore) wraps each chunk in a
|
|
345
|
+
// <script> via flightChunkScript itself — do NOT pre-wrap with
|
|
346
|
+
// createInlinedRscStream here, that would double-wrap.
|
|
347
|
+
return htmlStream
|
|
348
|
+
.pipeThrough(createFlightInjectionTransform(rscStream, renderTimeoutMs, errorSignal))
|
|
349
|
+
.pipeThrough(createMoveSuffixStream());
|
|
347
350
|
}
|
|
348
351
|
|
|
352
|
+
// ─── Client Bootstrap Script Resolution ──────────────────────────────────────
|
|
353
|
+
|
|
349
354
|
/**
|
|
350
355
|
* Client bootstrap configuration returned by buildClientScripts.
|
|
351
356
|
*
|
|
@@ -364,7 +369,7 @@ export interface ClientBootstrapConfig {
|
|
|
364
369
|
preloadLinks: string;
|
|
365
370
|
}
|
|
366
371
|
|
|
367
|
-
/** Find a manifest entry by matching the key suffix (e.g. 'client/browser-entry.ts'). */
|
|
372
|
+
/** Find a manifest entry by matching the key suffix (e.g. 'client/browser-entry/index.ts'). */
|
|
368
373
|
function findManifestEntry(map: Record<string, string>, suffix: string): string | undefined {
|
|
369
374
|
for (const [key, value] of Object.entries(map)) {
|
|
370
375
|
if (key.endsWith(suffix)) return value;
|
|
@@ -386,30 +391,38 @@ function findManifestEntryArray(
|
|
|
386
391
|
/**
|
|
387
392
|
* Build client bootstrap configuration based on runtime config.
|
|
388
393
|
*
|
|
389
|
-
* Returns empty strings when client JavaScript is disabled,
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
394
|
+
* Returns empty strings when client JavaScript is disabled, which produces
|
|
395
|
+
* zero-JS output. When `enableHMRInDev` is true and running in dev mode,
|
|
396
|
+
* injects only the Vite HMR client (no app bootstrap) so hot reloading
|
|
397
|
+
* works during development.
|
|
393
398
|
*
|
|
394
399
|
* In production, uses hashed chunk URLs from the build manifest.
|
|
395
400
|
*
|
|
396
401
|
* The bootstrap uses dynamic `import()` inside a regular (non-module)
|
|
397
402
|
* inline script so it executes immediately during HTML parsing. This
|
|
398
|
-
* is critical for streaming: `<script type="module">` is deferred
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
*
|
|
403
|
+
* is critical for streaming: `<script type="module">` is deferred until
|
|
404
|
+
* the document finishes parsing, which blocks hydration behind Suspense
|
|
405
|
+
* boundaries. Dynamic `import()` starts module loading and execution as
|
|
406
|
+
* soon as the shell HTML is parsed.
|
|
402
407
|
*/
|
|
403
408
|
export function buildClientScripts(runtimeConfig: {
|
|
404
409
|
output: string;
|
|
405
410
|
clientJavascript: { disabled: boolean; enableHMRInDev: boolean };
|
|
406
411
|
dev: boolean;
|
|
412
|
+
devBrowserLogs?: string;
|
|
407
413
|
buildManifest?: import('./build-manifest.js').BuildManifest;
|
|
408
414
|
}): ClientBootstrapConfig {
|
|
409
415
|
if (runtimeConfig.clientJavascript.disabled) {
|
|
410
|
-
// When client JS is disabled
|
|
411
|
-
//
|
|
412
|
-
|
|
416
|
+
// When client JS is disabled, import /@vite/client in dev mode if
|
|
417
|
+
// any dev feature needs it: HMR for CSS (enableHMRInDev) or
|
|
418
|
+
// forwardConsole for browser→terminal log forwarding (devBrowserLogs
|
|
419
|
+
// not 'none'). Without /@vite/client, server.forwardConsole's
|
|
420
|
+
// client-side console patching never activates. When both features
|
|
421
|
+
// are off, honor the zero-JS opt-out. See TIM-1152.
|
|
422
|
+
const needsViteClient =
|
|
423
|
+
runtimeConfig.clientJavascript.enableHMRInDev ||
|
|
424
|
+
(runtimeConfig.devBrowserLogs ?? 'warn') !== 'none';
|
|
425
|
+
if (runtimeConfig.dev && needsViteClient) {
|
|
413
426
|
return {
|
|
414
427
|
bootstrapScriptContent: 'import("/@vite/client")',
|
|
415
428
|
preloadLinks: '',
|
|
@@ -445,7 +458,7 @@ export function buildClientScripts(runtimeConfig: {
|
|
|
445
458
|
// a monorepo). Match by suffix to handle both cases.
|
|
446
459
|
const manifest = runtimeConfig.buildManifest;
|
|
447
460
|
const browserEntryUrl = manifest
|
|
448
|
-
? findManifestEntry(manifest.js, 'client/browser-entry.ts')
|
|
461
|
+
? findManifestEntry(manifest.js, 'client/browser-entry/index.ts')
|
|
449
462
|
: undefined;
|
|
450
463
|
|
|
451
464
|
let preloadLinks = '';
|
|
@@ -455,7 +468,7 @@ export function buildClientScripts(runtimeConfig: {
|
|
|
455
468
|
// Modulepreload hints for browser entry dependencies
|
|
456
469
|
const preloads =
|
|
457
470
|
(manifest
|
|
458
|
-
? findManifestEntryArray(manifest.modulepreload, 'client/browser-entry.ts')
|
|
471
|
+
? findManifestEntryArray(manifest.modulepreload, 'client/browser-entry/index.ts')
|
|
459
472
|
: undefined) ?? [];
|
|
460
473
|
for (const url of preloads) {
|
|
461
474
|
preloadLinks += `<link rel="modulepreload" href="${url}">`;
|