@timber-js/app 0.2.0-alpha.15 → 0.2.0-alpha.150
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/dist/_chunks/actions-a0RczDnB.js +1106 -0
- package/dist/_chunks/actions-a0RczDnB.js.map +1 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js +102 -0
- package/dist/_chunks/build-output-helper-B20ZuTSA.js.map +1 -0
- package/dist/_chunks/cache-api-Co-yI-gP.js +424 -0
- package/dist/_chunks/cache-api-Co-yI-gP.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-DJDdyEae.js +629 -0
- package/dist/_chunks/cli-schema-sync-DJDdyEae.js.map +1 -0
- package/dist/_chunks/cli-schema-sync-D_IhHEUW.js +2 -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/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-FiA_rToW.js +141 -0
- package/dist/_chunks/href-validation-FiA_rToW.js.map +1 -0
- package/dist/_chunks/logger-CM0clugc.js +645 -0
- package/dist/_chunks/logger-CM0clugc.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-DurqFBuY.js +2 -0
- package/dist/_chunks/plugin-context-GfDWsdd2.js +268 -0
- package/dist/_chunks/plugin-context-GfDWsdd2.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/{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/validation-taUkvA4Q.js +113 -0
- package/dist/_chunks/validation-taUkvA4Q.js.map +1 -0
- package/dist/_chunks/walkers-DvWDj453.js +790 -0
- package/dist/_chunks/walkers-DvWDj453.js.map +1 -0
- package/dist/adapters/build-output-helper.d.ts +28 -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 +142 -20
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +150 -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 +17 -3
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +146 -147
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/adapters/shared.d.ts +16 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/handler-store.d.ts +31 -0
- package/dist/cache/handler-store.d.ts.map +1 -0
- package/dist/cache/index.d.ts +25 -7
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +100 -240
- package/dist/cache/index.js.map +1 -1
- 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 +85 -8
- package/dist/cache/redis-handler.d.ts.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- 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/timber-cache.d.ts +20 -10
- package/dist/cache/timber-cache.d.ts.map +1 -1
- package/dist/cli-schema-sync.d.ts +59 -0
- package/dist/cli-schema-sync.d.ts.map +1 -0
- package/dist/cli.d.ts +26 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +70 -33
- package/dist/cli.js.map +1 -1
- package/dist/client/browser-dev.d.ts +34 -1
- package/dist/client/browser-dev.d.ts.map +1 -1
- package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
- package/dist/client/browser-entry/hmr.d.ts +21 -0
- package/dist/client/browser-entry/hmr.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +46 -0
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
- package/dist/client/browser-entry/index.d.ts +29 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -0
- package/dist/client/browser-entry/post-hydration.d.ts +26 -0
- package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
- package/dist/client/browser-entry/router-init.d.ts +26 -0
- package/dist/client/browser-entry/router-init.d.ts.map +1 -0
- package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
- package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
- package/dist/client/browser-entry/scroll.d.ts +28 -0
- package/dist/client/browser-entry/scroll.d.ts.map +1 -0
- package/dist/client/error-boundary.d.ts +12 -5
- package/dist/client/error-boundary.d.ts.map +1 -1
- package/dist/client/error-boundary.js +47 -10
- package/dist/client/error-boundary.js.map +1 -1
- package/dist/client/error-reconstituter.d.ts +61 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +16 -27
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +11 -3
- 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 +183 -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 +900 -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-types.d.ts +90 -0
- package/dist/client/navigation-api-types.d.ts.map +1 -0
- package/dist/client/navigation-api.d.ts +122 -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 +86 -10
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +46 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +3 -1
- 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 +294 -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 +249 -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 +84 -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 +78 -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 +6432 -13423
- 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 +137 -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 +9 -7
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/cache.d.ts +73 -0
- package/dist/plugins/cache.d.ts.map +1 -0
- package/dist/plugins/client-chunks.d.ts +39 -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/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/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 +9 -30
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +70 -11
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/asset-headers.d.ts +1 -15
- 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 +51 -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 +29 -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 +81 -41
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +10 -46
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +170 -2911
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.d.ts +44 -0
- package/dist/server/internal.d.ts.map +1 -0
- package/dist/server/internal.js +3015 -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/primitives.d.ts +75 -31
- package/dist/server/primitives.d.ts.map +1 -1
- package/dist/server/render-timeout.d.ts +51 -0
- package/dist/server/render-timeout.d.ts.map +1 -0
- package/dist/server/render-utils.d.ts +25 -0
- package/dist/server/render-utils.d.ts.map +1 -0
- package/dist/server/request-context.d.ts +62 -107
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +30 -18
- 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 -23
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +19 -8
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +50 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts +108 -0
- package/dist/server/rsc-entry/revalidate-renderer.d.ts.map +1 -0
- package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
- 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 +36 -0
- package/dist/server/stream-utils.d.ts.map +1 -0
- package/dist/server/tracing.d.ts +7 -6
- 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/shared/head-header.d.ts +54 -0
- package/dist/shared/head-header.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/package.json +63 -24
- package/src/adapters/build-output-helper.ts +139 -0
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare-kv-cache.ts +179 -0
- package/src/adapters/cloudflare.ts +356 -116
- package/src/adapters/compress-module.ts +27 -92
- package/src/adapters/nitro.ts +155 -99
- package/src/adapters/raw-imports.d.ts +5 -0
- package/src/adapters/shared.ts +40 -0
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +47 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +84 -18
- package/src/cache/invalidation-epoch.ts +93 -0
- package/src/cache/redis-handler.ts +110 -15
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/sizeof.ts +33 -0
- package/src/cache/stable-stringify.ts +65 -2
- package/src/cache/timber-cache.ts +132 -36
- package/src/cli-schema-sync.ts +388 -0
- package/src/cli.ts +98 -34
- package/src/client/browser-dev.ts +153 -1
- package/src/client/browser-entry/action-dispatch.ts +119 -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 +104 -0
- package/src/client/browser-entry/router-init.ts +292 -0
- package/src/client/browser-entry/rsc-stream.ts +157 -0
- package/src/client/browser-entry/scroll.ts +50 -0
- package/src/client/error-boundary.tsx +127 -22
- package/src/client/error-reconstituter.tsx +79 -0
- package/src/client/form.tsx +31 -32
- package/src/client/history.ts +11 -3
- 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-types.ts +112 -0
- package/src/client/navigation-api.ts +347 -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 +490 -140
- package/src/client/rsc-fetch.ts +220 -17
- package/src/client/segment-cache.ts +6 -3
- 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 +31 -2
- 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 +292 -0
- package/src/config-validation.ts +311 -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 +291 -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/{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 +183 -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 +7 -3
- 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 +344 -0
- package/src/fonts/types.ts +52 -1
- package/src/fonts/virtual-modules.ts +179 -0
- package/src/index.ts +417 -346
- 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 +325 -0
- package/src/plugins/adapter-build.ts +98 -4
- package/src/plugins/build-manifest.ts +168 -23
- package/src/plugins/build-report.ts +16 -25
- package/src/plugins/cache.ts +285 -0
- package/src/plugins/client-chunks.ts +113 -0
- package/src/plugins/cloudflare-wasm.ts +141 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-server.ts +264 -46
- package/src/plugins/entries.ts +110 -8
- package/src/plugins/fonts.ts +170 -663
- package/src/plugins/mdx.ts +47 -10
- package/src/plugins/routing.ts +237 -241
- package/src/plugins/server-bundle.ts +85 -12
- package/src/plugins/shims.ts +207 -64
- package/src/plugins/static-build.ts +15 -89
- package/src/routing/codegen-shared.ts +115 -0
- package/src/routing/codegen-types.ts +65 -0
- package/src/routing/codegen.ts +380 -178
- package/src/routing/convention-lint.ts +358 -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 +290 -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 +2 -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 +122 -16
- package/src/server/actions.ts +39 -53
- package/src/server/als-registry.ts +108 -20
- package/src/server/asset-headers.ts +8 -34
- 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 +147 -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 +80 -64
- 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 +101 -5
- package/src/server/html-injector-core.ts +437 -0
- package/src/server/html-injectors.ts +256 -251
- package/src/server/index.ts +29 -183
- package/src/server/internal.ts +165 -0
- package/src/server/logger.ts +67 -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 +13 -0
- package/src/server/pipeline-outcome.ts +197 -0
- package/src/server/pipeline-phases.ts +527 -0
- package/src/server/pipeline.ts +213 -382
- package/src/server/port-resolution.ts +215 -0
- package/src/server/primitives.ts +126 -63
- package/src/server/render-timeout.ts +108 -0
- package/src/server/render-utils.ts +31 -0
- package/src/server/request-context.ts +168 -337
- package/src/server/route-element-builder.ts +481 -222
- 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 -59
- package/src/server/rsc-entry/index.ts +299 -329
- package/src/server/rsc-entry/render-route.ts +311 -0
- package/src/server/rsc-entry/revalidate-renderer.ts +344 -0
- package/src/server/rsc-entry/rsc-payload.ts +71 -26
- package/src/server/rsc-entry/rsc-stream.ts +85 -13
- package/src/server/rsc-entry/ssr-bridge.ts +18 -5
- package/src/server/rsc-entry/ssr-renderer.ts +273 -43
- package/src/server/rsc-entry/wrap-action-dispatch.ts +449 -0
- package/src/server/safe-load.ts +60 -0
- package/src/server/sensitive-fields.ts +230 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +148 -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 +213 -0
- package/src/server/tracing.ts +38 -11
- 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/shared/head-header.ts +69 -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/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/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/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/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/dev-fetch-instrumentation.ts +0 -96
- package/src/server/dev-span-processor.ts +0 -78
- package/src/server/dev-warnings.ts +0 -283
- package/src/server/flush.ts +0 -182
- package/src/server/manifest-status-resolver.ts +0 -215
- package/src/server/prerender.ts +0 -139
- package/src/utils/directive-parser.ts +0 -529
- /package/src/{server/dev-logger.ts → dev-tools/logger.ts} +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port resolution for the dev server, Vite preview, and the Node
|
|
3
|
+
* production preview server.
|
|
4
|
+
*
|
|
5
|
+
* Behavior (see TIM-842):
|
|
6
|
+
*
|
|
7
|
+
* 1. Default port is **3000** for both dev and prod.
|
|
8
|
+
* 2. If the user did NOT set an explicit port, auto-bump from 3000
|
|
9
|
+
* until a free port is found (3000 → 3001 → 3002 → …).
|
|
10
|
+
* 3. If the user DID set an explicit port (via `--port`, `PORT` env
|
|
11
|
+
* var, or `vite.config.ts` `server.port`), use it as-is and let
|
|
12
|
+
* the bind fail loudly on conflict (`strictPort: true`).
|
|
13
|
+
*
|
|
14
|
+
* The port-bump probe is performed by binding the **actual** server
|
|
15
|
+
* (e.g. the dev holding server) — not a throwaway probe — so there is
|
|
16
|
+
* no time-of-check / time-of-use race between probing and listening.
|
|
17
|
+
*
|
|
18
|
+
* Design doc: 21-dev-server.md §"Default Port and Auto-Bump".
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** Default port used by `timber dev` and `timber preview`. */
|
|
22
|
+
export const DEFAULT_PORT = 3000;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A function that attempts to bind to a given port.
|
|
26
|
+
*
|
|
27
|
+
* Resolves with the bound port on success. Rejects with an error
|
|
28
|
+
* (typically with `code === 'EADDRINUSE'`) on failure.
|
|
29
|
+
*/
|
|
30
|
+
export type ListenFn = (port: number) => Promise<number>;
|
|
31
|
+
|
|
32
|
+
// ── Pure resolution ────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
export interface ResolvePortInput {
|
|
35
|
+
/**
|
|
36
|
+
* Port read from `vite.config.ts` `server.port` or the `--port` CLI
|
|
37
|
+
* flag (Vite merges `--port` into `userConfig.server.port` before
|
|
38
|
+
* plugins see it).
|
|
39
|
+
*/
|
|
40
|
+
configPort?: number | undefined;
|
|
41
|
+
/** Raw value of `process.env.PORT`. */
|
|
42
|
+
envPort?: string | undefined;
|
|
43
|
+
/** Default port to use when neither `configPort` nor `envPort` is set. */
|
|
44
|
+
defaultPort?: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface ResolvedPortInput {
|
|
48
|
+
/** Port to start binding from. */
|
|
49
|
+
port: number;
|
|
50
|
+
/**
|
|
51
|
+
* `true` if the port came from an explicit user override (config or
|
|
52
|
+
* env). When `true`, callers must NOT auto-bump and must surface
|
|
53
|
+
* `EADDRINUSE` to the user.
|
|
54
|
+
*/
|
|
55
|
+
explicit: boolean;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Pure: compute the starting port from config / env / defaults.
|
|
60
|
+
*
|
|
61
|
+
* Performs no I/O — pair with {@link bindWithBump} to actually listen.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveStartPort(input: ResolvePortInput): ResolvedPortInput {
|
|
64
|
+
const defaultPort = input.defaultPort ?? DEFAULT_PORT;
|
|
65
|
+
|
|
66
|
+
// `configPort` wins over `envPort`. This matches Vite's behavior:
|
|
67
|
+
// `vite --port 4000` overrides `PORT=5000` in the environment.
|
|
68
|
+
if (typeof input.configPort === 'number' && Number.isFinite(input.configPort)) {
|
|
69
|
+
return { port: input.configPort, explicit: true };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (input.envPort != null && input.envPort !== '') {
|
|
73
|
+
const parsed = Number(input.envPort);
|
|
74
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
75
|
+
return { port: parsed, explicit: true };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return { port: defaultPort, explicit: false };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ── Bind with auto-bump ────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
export interface BindWithBumpOptions {
|
|
85
|
+
/** First port to attempt. */
|
|
86
|
+
startPort: number;
|
|
87
|
+
/**
|
|
88
|
+
* If `true`, increment the port and retry on `EADDRINUSE`. If
|
|
89
|
+
* `false`, attempt once and let the error propagate.
|
|
90
|
+
*/
|
|
91
|
+
autoBump: boolean;
|
|
92
|
+
/** Maximum number of port attempts when `autoBump` is `true`. */
|
|
93
|
+
maxAttempts?: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface BindWithBumpResult {
|
|
97
|
+
/** Port that was actually bound. */
|
|
98
|
+
port: number;
|
|
99
|
+
/** `true` if the bound port differs from `startPort`. */
|
|
100
|
+
bumped: boolean;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Bind a server starting at `startPort`, optionally bumping the port
|
|
105
|
+
* on `EADDRINUSE` until a free one is found.
|
|
106
|
+
*
|
|
107
|
+
* Use this with the actual server you intend to keep listening (e.g.
|
|
108
|
+
* the dev holding server). Pairing the probe with the real listen
|
|
109
|
+
* eliminates the TOCTOU race that a throwaway probe would introduce.
|
|
110
|
+
*/
|
|
111
|
+
export async function bindWithBump(
|
|
112
|
+
listen: ListenFn,
|
|
113
|
+
options: BindWithBumpOptions
|
|
114
|
+
): Promise<BindWithBumpResult> {
|
|
115
|
+
const maxAttempts = options.autoBump ? (options.maxAttempts ?? 100) : 1;
|
|
116
|
+
let lastErr: unknown = null;
|
|
117
|
+
|
|
118
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
119
|
+
const port = options.startPort + i;
|
|
120
|
+
try {
|
|
121
|
+
const bound = await listen(port);
|
|
122
|
+
return { port: bound, bumped: i > 0 };
|
|
123
|
+
} catch (err) {
|
|
124
|
+
lastErr = err;
|
|
125
|
+
// Only retry on EADDRINUSE — other errors (EACCES, etc.) are
|
|
126
|
+
// permanent and must surface immediately.
|
|
127
|
+
if (!isAddrInUse(err)) throw err;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw lastErr ?? new Error(`Could not bind to a free port starting at ${options.startPort}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** True if `err` is a Node `EADDRINUSE` error from `server.listen()`. */
|
|
135
|
+
export function isAddrInUse(err: unknown): boolean {
|
|
136
|
+
return (
|
|
137
|
+
typeof err === 'object' && err !== null && (err as { code?: string }).code === 'EADDRINUSE'
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ── High-level helper used by the rootSync plugin ────────────────────
|
|
142
|
+
|
|
143
|
+
export interface StartDevServerPortInput {
|
|
144
|
+
/** Resolved port from `userConfig.server?.port` (or `--port`), or undefined. */
|
|
145
|
+
configPort: number | undefined;
|
|
146
|
+
/** Raw `process.env.PORT` value. */
|
|
147
|
+
envPort: string | undefined;
|
|
148
|
+
/** ListenFn for the holding server (or any pre-bind probe target). */
|
|
149
|
+
listen: ListenFn;
|
|
150
|
+
/** Logger — defaults to `console`. Injected for tests. */
|
|
151
|
+
log?: (msg: string) => void;
|
|
152
|
+
warn?: (msg: string) => void;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface StartDevServerPortResult {
|
|
156
|
+
/** Port chosen for both the holding server and Vite's dev server. */
|
|
157
|
+
port: number;
|
|
158
|
+
/** True if the user explicitly set the port (=> Vite must `strictPort: true`). */
|
|
159
|
+
explicit: boolean;
|
|
160
|
+
/** True if the holding server actually bound the port. */
|
|
161
|
+
bound: boolean;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Run the full dev-server port resolution + holding-server bind sequence.
|
|
166
|
+
*
|
|
167
|
+
* Resolves the port from config / env / default, attempts to bind the
|
|
168
|
+
* holding server (auto-bumping when the port came from the default),
|
|
169
|
+
* and logs the chosen URL. On a clean failure for an explicit port, it
|
|
170
|
+
* warns and falls back to the requested port so Vite can surface the
|
|
171
|
+
* conflict via `strictPort: true`.
|
|
172
|
+
*
|
|
173
|
+
* Extracted from `index.ts` so the rootSync `config()` hook stays
|
|
174
|
+
* focused on plugin assembly.
|
|
175
|
+
*/
|
|
176
|
+
export async function startDevServerPort(
|
|
177
|
+
input: StartDevServerPortInput
|
|
178
|
+
): Promise<StartDevServerPortResult> {
|
|
179
|
+
const log = input.log ?? ((msg: string) => console.log(msg));
|
|
180
|
+
const warn = input.warn ?? ((msg: string) => console.warn(msg));
|
|
181
|
+
|
|
182
|
+
const start = resolveStartPort({
|
|
183
|
+
configPort: input.configPort,
|
|
184
|
+
envPort: input.envPort,
|
|
185
|
+
defaultPort: DEFAULT_PORT,
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
const result = await bindWithBump(input.listen, {
|
|
190
|
+
startPort: start.port,
|
|
191
|
+
autoBump: !start.explicit,
|
|
192
|
+
});
|
|
193
|
+
if (result.bumped) {
|
|
194
|
+
log(`\n \x1b[33m[timber]\x1b[0m Port ${start.port} in use, using ${result.port}\n`);
|
|
195
|
+
}
|
|
196
|
+
log(
|
|
197
|
+
`\n \x1b[2m\u{1FAB5} timber.js dev server starting at\x1b[0m ` +
|
|
198
|
+
`\x1b[36mhttp://localhost:${result.port}\x1b[0m\n`
|
|
199
|
+
);
|
|
200
|
+
return { port: result.port, explicit: start.explicit, bound: true };
|
|
201
|
+
} catch (err) {
|
|
202
|
+
// Holding server failed to bind. For explicit ports we leave the
|
|
203
|
+
// bound state false and let Vite fail loudly via strictPort: true.
|
|
204
|
+
// For implicit ports this is essentially unreachable (auto-bump
|
|
205
|
+
// tries 100 ports), but if we hit it we still want Vite to surface
|
|
206
|
+
// the error.
|
|
207
|
+
if (start.explicit && isAddrInUse(err)) {
|
|
208
|
+
warn(
|
|
209
|
+
`\n \x1b[33m[timber]\x1b[0m Port ${start.port} is already in use. ` +
|
|
210
|
+
`Set PORT (or remove the override) to pick another port.\n`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
return { port: start.port, explicit: start.explicit, bound: false };
|
|
214
|
+
}
|
|
215
|
+
}
|
package/src/server/primitives.ts
CHANGED
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
import type { JsonSerializable } from './types.js';
|
|
7
7
|
import { getWaitUntil as _getWaitUntil } from './waituntil-bridge.js';
|
|
8
8
|
import { isDebug } from './debug.js';
|
|
9
|
+
import { getRequestSearchString } from './request-context.js';
|
|
10
|
+
import { mergePreservedSearchParams } from '../shared/merge-search-params.js';
|
|
11
|
+
import {
|
|
12
|
+
assertRelativeRedirectPath,
|
|
13
|
+
validateExternalRedirectUrl,
|
|
14
|
+
} from '../shared/href-validation.js';
|
|
9
15
|
|
|
10
16
|
// ─── Dev-mode validation ────────────────────────────────────────────────────
|
|
11
17
|
|
|
@@ -143,50 +149,70 @@ export class DenySignal extends Error {
|
|
|
143
149
|
}
|
|
144
150
|
}
|
|
145
151
|
|
|
152
|
+
/** Options for deny() when using the object form. */
|
|
153
|
+
export interface DenyOptions {
|
|
154
|
+
/** HTTP status code (4xx or 5xx). Default: 403. */
|
|
155
|
+
status?: number;
|
|
156
|
+
/** Human-readable message (logged server-side, not sent to client). */
|
|
157
|
+
message?: string;
|
|
158
|
+
/** JSON-serializable data passed as `dangerouslyPassData` prop to status-code files. */
|
|
159
|
+
data?: JsonSerializable;
|
|
160
|
+
}
|
|
161
|
+
|
|
146
162
|
/**
|
|
147
|
-
* Universal denial primitive. Throws a `DenySignal` that the framework catches.
|
|
163
|
+
* Universal denial/error primitive. Throws a `DenySignal` that the framework catches.
|
|
148
164
|
*
|
|
149
165
|
* - In segment context (outside Suspense): produces HTTP status code
|
|
150
166
|
* - In slot context: graceful degradation → denied.tsx → default.tsx → null
|
|
151
167
|
* - Inside Suspense (hold window): promoted to pre-flush behavior
|
|
152
168
|
* - Inside Suspense (after flush): error boundary + noindex meta
|
|
153
169
|
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
170
|
+
* Supports both positional and object signatures:
|
|
171
|
+
* ```ts
|
|
172
|
+
* deny() // 403 (default)
|
|
173
|
+
* deny(404) // 404
|
|
174
|
+
* deny(503, { retry: true }) // 503 with data
|
|
175
|
+
* deny({ status: 503, message: 'Maintenance' }) // object form
|
|
176
|
+
* ```
|
|
177
|
+
*
|
|
178
|
+
* Accepts any 4xx or 5xx status code. This replaces the need for
|
|
179
|
+
* `throw new RenderError(...)` in user code — RenderError is now an
|
|
180
|
+
* internal pipeline detail.
|
|
181
|
+
*
|
|
182
|
+
* @param statusOrOptions - Status code (number) or options object. Default: 403.
|
|
183
|
+
* @param data - Optional JSON-serializable data (positional form only).
|
|
156
184
|
*/
|
|
157
|
-
export function deny(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
185
|
+
export function deny(statusOrOptions?: number | DenyOptions, data?: JsonSerializable): never {
|
|
186
|
+
let status: number;
|
|
187
|
+
let resolvedData: JsonSerializable | undefined;
|
|
188
|
+
|
|
189
|
+
if (typeof statusOrOptions === 'object' && statusOrOptions !== null) {
|
|
190
|
+
status = statusOrOptions.status ?? 403;
|
|
191
|
+
resolvedData = statusOrOptions.data;
|
|
192
|
+
} else {
|
|
193
|
+
status = statusOrOptions ?? 403;
|
|
194
|
+
resolvedData = data;
|
|
163
195
|
}
|
|
164
|
-
|
|
165
|
-
|
|
196
|
+
|
|
197
|
+
if (status < 400 || status > 599) {
|
|
198
|
+
throw new Error(`deny() requires a 4xx or 5xx status code, got ${status}.`);
|
|
199
|
+
}
|
|
200
|
+
warnIfNotSerializable(resolvedData, 'deny()');
|
|
201
|
+
throw new DenySignal(status, resolvedData);
|
|
166
202
|
}
|
|
167
203
|
|
|
168
204
|
/**
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
* call `notFound()` from `next/navigation` get the same behavior as
|
|
173
|
-
* `deny(404)` in timber.
|
|
205
|
+
* @deprecated Use `deny(404)` instead.
|
|
206
|
+
* Kept for internal use by the Next.js shim layer.
|
|
207
|
+
* @internal
|
|
174
208
|
*/
|
|
175
209
|
export function notFound(): never {
|
|
176
|
-
|
|
210
|
+
deny(404);
|
|
177
211
|
}
|
|
178
212
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
* Provided for API compatibility with libraries that import `RedirectType`
|
|
183
|
-
* from `next/navigation`. In timber, `redirect()` always uses `replace`
|
|
184
|
-
* semantics (no history entry for the redirect itself).
|
|
185
|
-
*/
|
|
186
|
-
export const RedirectType = {
|
|
187
|
-
push: 'push',
|
|
188
|
-
replace: 'replace',
|
|
189
|
-
} as const;
|
|
213
|
+
// Single source of truth shared with the client next/navigation shim —
|
|
214
|
+
// see shared/redirect-type.ts.
|
|
215
|
+
export { RedirectType } from '../shared/redirect-type.js';
|
|
190
216
|
|
|
191
217
|
// ─── RedirectSignal ─────────────────────────────────────────────────────────
|
|
192
218
|
|
|
@@ -206,46 +232,96 @@ export class RedirectSignal extends Error {
|
|
|
206
232
|
}
|
|
207
233
|
}
|
|
208
234
|
|
|
209
|
-
/**
|
|
210
|
-
|
|
235
|
+
/**
|
|
236
|
+
* Options for redirect() — alternative to passing a bare status code.
|
|
237
|
+
*/
|
|
238
|
+
export interface RedirectOptions {
|
|
239
|
+
/** HTTP redirect status code (3xx). Defaults to 302 (or 308 when `permanent: true`). */
|
|
240
|
+
status?: number;
|
|
241
|
+
/**
|
|
242
|
+
* When true, defaults the status to 308 (Permanent Redirect, preserves HTTP method).
|
|
243
|
+
* If `status` is also provided, `status` takes precedence.
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* redirect('/new-path', { permanent: true }); // 308
|
|
247
|
+
* redirect('/new-path', { permanent: true, status: 301 }); // 301
|
|
248
|
+
*/
|
|
249
|
+
permanent?: boolean;
|
|
250
|
+
/**
|
|
251
|
+
* Preserve search params from the current request URL on the redirect target.
|
|
252
|
+
*
|
|
253
|
+
* - `true` — preserve ALL current search params (target params take precedence)
|
|
254
|
+
* - `string[]` — preserve only the named params (e.g. `['private', 'token']`)
|
|
255
|
+
*
|
|
256
|
+
* Target path's own query params always take precedence over preserved ones.
|
|
257
|
+
*/
|
|
258
|
+
preserveSearchParams?: true | string[];
|
|
259
|
+
}
|
|
211
260
|
|
|
212
261
|
/**
|
|
213
262
|
* Redirect to a relative path. Rejects absolute and protocol-relative URLs.
|
|
214
263
|
* Use `redirectExternal()` for external redirects with an allow-list.
|
|
215
264
|
*
|
|
216
265
|
* @param path - Relative path (e.g. '/login', 'settings', '/login?returnTo=/dash')
|
|
217
|
-
* @param
|
|
266
|
+
* @param statusOrOptions - HTTP status code (3xx, default 302) or options object.
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* // Simple redirect
|
|
270
|
+
* redirect('/login');
|
|
271
|
+
*
|
|
272
|
+
* // With status code
|
|
273
|
+
* redirect('/login', 301);
|
|
274
|
+
*
|
|
275
|
+
* // With preserved search params
|
|
276
|
+
* redirect(`/docs/${version}/${slug}`, { preserveSearchParams: ['foo'] });
|
|
218
277
|
*/
|
|
219
|
-
export function redirect(path: string,
|
|
278
|
+
export function redirect(path: string, statusOrOptions?: number | RedirectOptions): never {
|
|
279
|
+
let status: number;
|
|
280
|
+
let preserveSearchParams: true | string[] | undefined;
|
|
281
|
+
|
|
282
|
+
if (typeof statusOrOptions === 'number') {
|
|
283
|
+
status = statusOrOptions;
|
|
284
|
+
} else if (statusOrOptions) {
|
|
285
|
+
// Explicit status wins. Otherwise permanent: true → 308, default → 302.
|
|
286
|
+
status = statusOrOptions.status ?? (statusOrOptions.permanent ? 308 : 302);
|
|
287
|
+
preserveSearchParams = statusOrOptions.preserveSearchParams;
|
|
288
|
+
} else {
|
|
289
|
+
status = 302;
|
|
290
|
+
}
|
|
291
|
+
|
|
220
292
|
if (status < 300 || status > 399) {
|
|
221
293
|
throw new Error(`redirect() requires a 3xx status code, got ${status}.`);
|
|
222
294
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
295
|
+
// Relative-only validation shared with the client next/navigation shim —
|
|
296
|
+
// strips C0 controls and normalizes backslashes before the scheme check.
|
|
297
|
+
assertRelativeRedirectPath(path);
|
|
298
|
+
|
|
299
|
+
let resolvedPath = path;
|
|
300
|
+
if (preserveSearchParams) {
|
|
301
|
+
const currentSearch = getRequestSearchString();
|
|
302
|
+
resolvedPath = mergePreservedSearchParams(path, currentSearch, preserveSearchParams);
|
|
228
303
|
}
|
|
229
|
-
|
|
304
|
+
|
|
305
|
+
throw new RedirectSignal(resolvedPath, status);
|
|
230
306
|
}
|
|
231
307
|
|
|
232
308
|
/**
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* will replay POST requests to the new location. This matches Next.js behavior.
|
|
237
|
-
*
|
|
238
|
-
* @param path - Relative path (e.g. '/new-page', '/dashboard')
|
|
309
|
+
* @deprecated Use `redirect(path, { permanent: true })` instead.
|
|
310
|
+
* Kept for internal use by the Next.js shim layer.
|
|
311
|
+
* @internal
|
|
239
312
|
*/
|
|
240
|
-
export function permanentRedirect(path: string): never {
|
|
241
|
-
redirect(path,
|
|
313
|
+
export function permanentRedirect(path: string, options?: Omit<RedirectOptions, 'status'>): never {
|
|
314
|
+
redirect(path, { permanent: true, ...options });
|
|
242
315
|
}
|
|
243
316
|
|
|
244
317
|
/**
|
|
245
|
-
* Redirect to an external URL. The
|
|
318
|
+
* Redirect to an external URL. The origin must be in the provided allow-list.
|
|
319
|
+
*
|
|
320
|
+
* Only http: and https: schemes are permitted. The allow-list is matched
|
|
321
|
+
* against full origins (scheme + host + port), not bare hostnames.
|
|
246
322
|
*
|
|
247
323
|
* @param url - Absolute URL to redirect to.
|
|
248
|
-
* @param allowList - Array of allowed
|
|
324
|
+
* @param allowList - Array of allowed origins (e.g. ['https://example.com', 'https://auth.example.com']).
|
|
249
325
|
* @param status - HTTP redirect status code (3xx). Defaults to 302.
|
|
250
326
|
*/
|
|
251
327
|
export function redirectExternal(url: string, allowList: string[], status: number = 302): never {
|
|
@@ -253,21 +329,8 @@ export function redirectExternal(url: string, allowList: string[], status: numbe
|
|
|
253
329
|
throw new Error(`redirectExternal() requires a 3xx status code, got ${status}.`);
|
|
254
330
|
}
|
|
255
331
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
hostname = new URL(url).hostname;
|
|
259
|
-
} catch {
|
|
260
|
-
throw new Error(`redirectExternal() received an invalid URL: "${url}"`);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (!allowList.includes(hostname)) {
|
|
264
|
-
throw new Error(
|
|
265
|
-
`redirectExternal() target "${hostname}" is not in the allow-list. ` +
|
|
266
|
-
`Allowed: [${allowList.join(', ')}]`
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
throw new RedirectSignal(url, status);
|
|
332
|
+
const canonicalUrl = validateExternalRedirectUrl(url, allowList);
|
|
333
|
+
throw new RedirectSignal(canonicalUrl, status);
|
|
271
334
|
}
|
|
272
335
|
|
|
273
336
|
// ─── RenderError ────────────────────────────────────────────────────────────
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render timeout utilities for SSR streaming pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Provides a RenderTimeoutError class and a helper to create
|
|
5
|
+
* timeout-guarded AbortSignals. Used to defend against hung RSC
|
|
6
|
+
* streams and infinite SSR renders.
|
|
7
|
+
*
|
|
8
|
+
* Design doc: 02-rendering-pipeline.md §"Streaming Constraints"
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error thrown when an SSR render or RSC stream read exceeds the
|
|
13
|
+
* configured timeout. Callers can check `instanceof RenderTimeoutError`
|
|
14
|
+
* to distinguish timeout from other errors and return a 504 or close
|
|
15
|
+
* the connection cleanly.
|
|
16
|
+
*/
|
|
17
|
+
export class RenderTimeoutError extends Error {
|
|
18
|
+
readonly timeoutMs: number;
|
|
19
|
+
|
|
20
|
+
constructor(timeoutMs: number, context?: string) {
|
|
21
|
+
const message = context
|
|
22
|
+
? `Render timeout after ${timeoutMs}ms: ${context}`
|
|
23
|
+
: `Render timeout after ${timeoutMs}ms`;
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'RenderTimeoutError';
|
|
26
|
+
this.timeoutMs = timeoutMs;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Result of createRenderTimeout — an AbortSignal that fires after
|
|
32
|
+
* the given duration, plus a cancel function to clear the timer
|
|
33
|
+
* when the render completes normally.
|
|
34
|
+
*/
|
|
35
|
+
export interface RenderTimeout {
|
|
36
|
+
/** AbortSignal that aborts after timeoutMs. */
|
|
37
|
+
signal: AbortSignal;
|
|
38
|
+
/** Cancel the timeout timer. Call this when the render completes. */
|
|
39
|
+
cancel: () => void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Create a render timeout that aborts after the given duration.
|
|
44
|
+
*
|
|
45
|
+
* Returns an AbortSignal and a cancel function. The signal fires
|
|
46
|
+
* with a RenderTimeoutError as the abort reason after `timeoutMs`.
|
|
47
|
+
* Call `cancel()` when the render completes to prevent the timeout
|
|
48
|
+
* from firing.
|
|
49
|
+
*
|
|
50
|
+
* If an existing `parentSignal` is provided, the returned signal
|
|
51
|
+
* aborts when either the parent signal or the timeout fires —
|
|
52
|
+
* whichever comes first.
|
|
53
|
+
*/
|
|
54
|
+
export function createRenderTimeout(timeoutMs: number, parentSignal?: AbortSignal): RenderTimeout {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const reason = new RenderTimeoutError(timeoutMs, 'RSC stream read timed out');
|
|
57
|
+
|
|
58
|
+
const timer = setTimeout(() => controller.abort(reason), timeoutMs);
|
|
59
|
+
|
|
60
|
+
let onParentAbort: (() => void) | null = null;
|
|
61
|
+
|
|
62
|
+
if (parentSignal) {
|
|
63
|
+
if (parentSignal.aborted) {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
controller.abort(parentSignal.reason);
|
|
66
|
+
} else {
|
|
67
|
+
onParentAbort = () => {
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
controller.abort(parentSignal.reason);
|
|
70
|
+
};
|
|
71
|
+
parentSignal.addEventListener('abort', onParentAbort, { once: true });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
signal: controller.signal,
|
|
77
|
+
cancel: () => {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
if (onParentAbort && parentSignal) {
|
|
80
|
+
parentSignal.removeEventListener('abort', onParentAbort);
|
|
81
|
+
onParentAbort = null;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Race a promise against a timeout. Rejects with RenderTimeoutError
|
|
89
|
+
* if the promise does not resolve within `timeoutMs`.
|
|
90
|
+
*
|
|
91
|
+
* Used to guard individual `rscReader.read()` calls inside pullLoop.
|
|
92
|
+
*/
|
|
93
|
+
export function withTimeout<T>(
|
|
94
|
+
promise: Promise<T>,
|
|
95
|
+
timeoutMs: number,
|
|
96
|
+
context?: string
|
|
97
|
+
): Promise<T> {
|
|
98
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
99
|
+
const timeoutPromise = new Promise<never>((_resolve, reject) => {
|
|
100
|
+
timer = setTimeout(() => {
|
|
101
|
+
reject(new RenderTimeoutError(timeoutMs, context));
|
|
102
|
+
}, timeoutMs);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
return Promise.race([promise, timeoutPromise]).finally(() => {
|
|
106
|
+
clearTimeout(timer!);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared render-phase utilities — used by both the Node.js and Web
|
|
3
|
+
* stream wrappers. Pure functions only; no stream-shape dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Consolidated from duplicated copies in node-stream-transforms.ts,
|
|
6
|
+
* ssr-render.ts, and rsc-entry/helpers.ts. See TIM-1071 item 1.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Check if an error is an abort error (connection closed by client).
|
|
11
|
+
*
|
|
12
|
+
* When the browser aborts a request (page refresh, navigation away),
|
|
13
|
+
* the AbortSignal fires and React/streams throw an AbortError. This
|
|
14
|
+
* is not an application error — suppress it from error boundaries and logs.
|
|
15
|
+
*/
|
|
16
|
+
export function isAbortError(error: unknown): boolean {
|
|
17
|
+
if (error instanceof DOMException && error.name === 'AbortError') return true;
|
|
18
|
+
if (error instanceof Error && error.name === 'AbortError') return true;
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Inline script that adds `<meta name="robots" content="noindex">` to the
|
|
24
|
+
* document head. Injected when a render-phase error replaces the shell so
|
|
25
|
+
* search engines don't index error pages.
|
|
26
|
+
*
|
|
27
|
+
* MUST be byte-identical across all stream wrappers (Node and Web) to
|
|
28
|
+
* ensure consistent Content-Length headers.
|
|
29
|
+
*/
|
|
30
|
+
export const NOINDEX_SCRIPT =
|
|
31
|
+
'<script>document.head.appendChild(Object.assign(document.createElement("meta"),{name:"robots",content:"noindex"}))</script>';
|