@timber-js/app 0.2.0-alpha.7 → 0.2.0-alpha.71
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/{als-registry-B7DbZ2hS.js → als-registry-BJARkOcu.js} +1 -1
- package/dist/_chunks/als-registry-BJARkOcu.js.map +1 -0
- package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
- package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
- package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
- package/dist/_chunks/define-CGuYoRHU.js +199 -0
- package/dist/_chunks/define-CGuYoRHU.js.map +1 -0
- package/dist/_chunks/define-Dz1bqwaS.js +106 -0
- package/dist/_chunks/define-Dz1bqwaS.js.map +1 -0
- package/dist/_chunks/define-cookie-B5mewxwM.js +93 -0
- package/dist/_chunks/define-cookie-B5mewxwM.js.map +1 -0
- package/dist/_chunks/error-boundary-D9hzsveV.js +216 -0
- package/dist/_chunks/error-boundary-D9hzsveV.js.map +1 -0
- package/dist/_chunks/{format-DviM89f0.js → format-Rn922VH2.js} +3 -20
- package/dist/_chunks/format-Rn922VH2.js.map +1 -0
- package/dist/_chunks/{tracing-Cwn7697K.js → handler-store-BVePM7hp.js} +68 -3
- package/dist/_chunks/handler-store-BVePM7hp.js.map +1 -0
- package/dist/_chunks/{interception-BOoWmLUA.js → interception-CEdHHviP.js} +171 -97
- package/dist/_chunks/interception-CEdHHviP.js.map +1 -0
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
- package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
- package/dist/_chunks/{request-context-DIkVh_jG.js → request-context-CywiO4jV.js} +181 -69
- package/dist/_chunks/request-context-CywiO4jV.js.map +1 -0
- package/dist/_chunks/schema-bridge-C4SwjCQD.js +86 -0
- package/dist/_chunks/schema-bridge-C4SwjCQD.js.map +1 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
- package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
- package/dist/_chunks/segment-context-hzuJ048X.js +72 -0
- package/dist/_chunks/segment-context-hzuJ048X.js.map +1 -0
- package/dist/_chunks/stale-reload-BLUC_Pl_.js +64 -0
- package/dist/_chunks/stale-reload-BLUC_Pl_.js.map +1 -0
- package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-DAhgj8Gx.js} +1 -1
- package/dist/_chunks/use-query-states-DAhgj8Gx.js.map +1 -0
- package/dist/_chunks/wrappers-LZbghvn0.js +63 -0
- package/dist/_chunks/wrappers-LZbghvn0.js.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.d.ts +148 -12
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +135 -11
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/adapters/compress-module.d.ts.map +1 -1
- package/dist/adapters/nitro.d.ts +17 -1
- package/dist/adapters/nitro.d.ts.map +1 -1
- package/dist/adapters/nitro.js +56 -13
- package/dist/adapters/nitro.js.map +1 -1
- package/dist/cache/cache-api.d.ts +24 -0
- package/dist/cache/cache-api.d.ts.map +1 -0
- package/dist/cache/fast-hash.d.ts +22 -0
- package/dist/cache/fast-hash.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 +7 -5
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +111 -73
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/singleflight.d.ts +18 -1
- package/dist/cache/singleflight.d.ts.map +1 -1
- package/dist/cache/timber-cache.d.ts +1 -1
- package/dist/cache/timber-cache.d.ts.map +1 -1
- 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 +1 -125
- package/dist/client/error-reconstituter.d.ts +54 -0
- package/dist/client/error-reconstituter.d.ts.map +1 -0
- package/dist/client/form.d.ts +2 -2
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/history.d.ts +19 -4
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/index.d.ts +6 -5
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +537 -166
- package/dist/client/index.js.map +1 -1
- package/dist/client/link-pending-store.d.ts +78 -0
- package/dist/client/link-pending-store.d.ts.map +1 -0
- package/dist/client/link.d.ts +90 -32
- package/dist/client/link.d.ts.map +1 -1
- package/dist/client/nav-link-store.d.ts +36 -0
- package/dist/client/nav-link-store.d.ts.map +1 -0
- 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 +115 -0
- package/dist/client/navigation-api.d.ts.map +1 -0
- package/dist/client/navigation-context.d.ts +13 -2
- package/dist/client/navigation-context.d.ts.map +1 -1
- package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
- package/dist/client/navigation-root.d.ts.map +1 -0
- package/dist/client/nuqs-adapter.d.ts.map +1 -1
- package/dist/client/router.d.ts +70 -4
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/rsc-fetch.d.ts +38 -3
- package/dist/client/rsc-fetch.d.ts.map +1 -1
- package/dist/client/segment-cache.d.ts +1 -1
- package/dist/client/segment-cache.d.ts.map +1 -1
- package/dist/client/segment-context.d.ts +1 -1
- package/dist/client/segment-context.d.ts.map +1 -1
- package/dist/client/segment-merger.d.ts.map +1 -1
- package/dist/client/segment-outlet.d.ts +63 -0
- package/dist/client/segment-outlet.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/stale-reload.d.ts +15 -0
- package/dist/client/stale-reload.d.ts.map +1 -1
- package/dist/client/top-loader.d.ts +3 -3
- package/dist/client/top-loader.d.ts.map +1 -1
- package/dist/client/use-params.d.ts +6 -4
- package/dist/client/use-params.d.ts.map +1 -1
- package/dist/client/use-query-states.d.ts +1 -1
- package/dist/client/use-query-states.d.ts.map +1 -1
- package/dist/codec.d.ts +23 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +2 -0
- package/dist/cookies/define-cookie.d.ts +35 -14
- package/dist/cookies/define-cookie.d.ts.map +1 -1
- package/dist/cookies/index.d.ts +2 -0
- package/dist/cookies/index.d.ts.map +1 -1
- package/dist/cookies/index.js +3 -84
- package/dist/fonts/css.d.ts +1 -0
- package/dist/fonts/css.d.ts.map +1 -1
- package/dist/index.d.ts +154 -38
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12092 -11916
- package/dist/index.js.map +1 -1
- package/dist/plugins/adapter-build.d.ts +1 -1
- package/dist/plugins/adapter-build.d.ts.map +1 -1
- package/dist/plugins/build-manifest.d.ts +2 -2
- package/dist/plugins/build-manifest.d.ts.map +1 -1
- package/dist/plugins/build-report.d.ts +3 -3
- package/dist/plugins/build-report.d.ts.map +1 -1
- package/dist/plugins/client-chunks.d.ts +32 -0
- package/dist/plugins/client-chunks.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-browser-logs.d.ts +84 -0
- package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
- package/dist/plugins/dev-error-overlay.d.ts +26 -1
- package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
- package/dist/plugins/dev-logs.d.ts +1 -1
- package/dist/plugins/dev-logs.d.ts.map +1 -1
- package/dist/plugins/dev-server.d.ts +1 -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 +19 -5
- 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 +6 -5
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/plugins/static-build.d.ts +1 -1
- package/dist/plugins/static-build.d.ts.map +1 -1
- package/dist/routing/codegen.d.ts +2 -2
- package/dist/routing/codegen.d.ts.map +1 -1
- package/dist/routing/index.d.ts +2 -0
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +3 -2
- package/dist/routing/scanner.d.ts.map +1 -1
- package/dist/routing/segment-classify.d.ts +46 -0
- package/dist/routing/segment-classify.d.ts.map +1 -0
- package/dist/routing/status-file-lint.d.ts +2 -1
- package/dist/routing/status-file-lint.d.ts.map +1 -1
- package/dist/routing/types.d.ts +16 -4
- package/dist/routing/types.d.ts.map +1 -1
- 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 +76 -0
- package/dist/schema-bridge.d.ts.map +1 -0
- package/dist/search-params/define.d.ts +139 -0
- package/dist/search-params/define.d.ts.map +1 -0
- package/dist/search-params/index.d.ts +4 -6
- package/dist/search-params/index.d.ts.map +1 -1
- package/dist/search-params/index.js +4 -474
- package/dist/search-params/registry.d.ts +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 +78 -0
- package/dist/segment-params/define.d.ts.map +1 -0
- package/dist/segment-params/index.d.ts +7 -0
- package/dist/segment-params/index.d.ts.map +1 -0
- package/dist/segment-params/index.js +4 -0
- package/dist/server/access-gate.d.ts +4 -0
- package/dist/server/access-gate.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +12 -1
- 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.map +1 -1
- package/dist/server/actions.d.ts +3 -6
- package/dist/server/actions.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +32 -4
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/build-manifest.d.ts +2 -2
- package/dist/server/build-manifest.d.ts.map +1 -1
- package/dist/server/debug.d.ts +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-page-resolver.d.ts +52 -0
- package/dist/server/deny-page-resolver.d.ts.map +1 -0
- package/dist/server/deny-renderer.d.ts.map +1 -1
- package/dist/server/dev-warnings.d.ts +0 -14
- package/dist/server/dev-warnings.d.ts.map +1 -1
- package/dist/server/early-hints.d.ts +13 -5
- 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 +4 -3
- 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/flush.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +29 -0
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/html-injectors.d.ts +51 -11
- package/dist/server/html-injectors.d.ts.map +1 -1
- package/dist/server/index.d.ts +5 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2176 -1663
- package/dist/server/index.js.map +1 -1
- package/dist/server/logger.d.ts +25 -7
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/middleware-runner.d.ts +19 -4
- package/dist/server/middleware-runner.d.ts.map +1 -1
- package/dist/server/node-stream-transforms.d.ts +113 -0
- package/dist/server/node-stream-transforms.d.ts.map +1 -0
- package/dist/server/page-deny-boundary.d.ts +31 -0
- package/dist/server/page-deny-boundary.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.d.ts +32 -10
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/primitives.d.ts +30 -3
- 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/request-context.d.ts +76 -37
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts +27 -1
- 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 +9 -2
- package/dist/server/route-matcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/api-handler.d.ts +2 -2
- 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 +48 -5
- package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts +8 -3
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- 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 +10 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
- package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/safe-load.d.ts +46 -0
- package/dist/server/safe-load.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 +1 -1
- package/dist/server/slot-resolver.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts +22 -0
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-render.d.ts +39 -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/status-code-resolver.d.ts +1 -1
- 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 +10 -0
- package/dist/server/tracing.d.ts.map +1 -1
- package/dist/server/tree-builder.d.ts +22 -19
- package/dist/server/tree-builder.d.ts.map +1 -1
- package/dist/server/types.d.ts +1 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/version-skew.d.ts +61 -0
- package/dist/server/version-skew.d.ts.map +1 -0
- package/dist/server/waituntil-bridge.d.ts.map +1 -1
- package/dist/shared/merge-search-params.d.ts +22 -0
- package/dist/shared/merge-search-params.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/navigation-client.d.ts +1 -1
- package/dist/shims/navigation-client.d.ts.map +1 -1
- package/dist/shims/navigation.d.ts +1 -1
- package/dist/shims/navigation.d.ts.map +1 -1
- package/dist/utils/directive-parser.d.ts +5 -2
- package/dist/utils/directive-parser.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 +37 -17
- package/src/adapters/cloudflare-dev.ts +177 -0
- package/src/adapters/cloudflare.ts +342 -28
- package/src/adapters/compress-module.ts +24 -4
- package/src/adapters/nitro.ts +58 -9
- package/src/adapters/wrangler.d.ts +7 -0
- package/src/cache/cache-api.ts +38 -0
- package/src/cache/fast-hash.ts +34 -0
- package/src/cache/handler-store.ts +68 -0
- package/src/cache/index.ts +9 -5
- package/src/cache/singleflight.ts +62 -4
- package/src/cache/timber-cache.ts +40 -29
- package/src/cli.ts +0 -0
- package/src/client/browser-entry.ts +314 -142
- package/src/client/error-boundary.tsx +48 -16
- package/src/client/error-reconstituter.tsx +65 -0
- package/src/client/form.tsx +2 -2
- package/src/client/history.ts +26 -4
- package/src/client/index.ts +13 -4
- package/src/client/link-pending-store.ts +136 -0
- package/src/client/link.tsx +346 -105
- package/src/client/nav-link-store.ts +47 -0
- package/src/client/navigation-api-types.ts +112 -0
- package/src/client/navigation-api.ts +332 -0
- package/src/client/navigation-context.ts +27 -6
- package/src/client/navigation-root.tsx +346 -0
- package/src/client/nuqs-adapter.tsx +16 -3
- package/src/client/router.ts +302 -77
- package/src/client/rsc-fetch.ts +93 -5
- package/src/client/segment-cache.ts +1 -1
- package/src/client/segment-context.ts +6 -1
- package/src/client/segment-merger.ts +2 -8
- package/src/client/segment-outlet.tsx +86 -0
- package/src/client/ssr-data.ts +13 -5
- package/src/client/stale-reload.ts +73 -6
- package/src/client/top-loader.tsx +22 -13
- package/src/client/use-navigation-pending.ts +1 -1
- package/src/client/use-params.ts +7 -5
- package/src/client/use-query-states.ts +2 -2
- package/src/codec.ts +34 -0
- package/src/cookies/define-cookie.ts +72 -21
- package/src/cookies/index.ts +7 -0
- package/src/fonts/css.ts +2 -1
- package/src/index.ts +328 -92
- package/src/plugins/adapter-build.ts +8 -2
- package/src/plugins/build-manifest.ts +13 -2
- package/src/plugins/build-report.ts +3 -3
- package/src/plugins/client-chunks.ts +65 -0
- package/src/plugins/content.ts +1 -1
- package/src/plugins/dev-browser-logs.ts +288 -0
- package/src/plugins/dev-error-overlay.ts +70 -1
- package/src/plugins/dev-logs.ts +1 -1
- package/src/plugins/dev-server.ts +55 -9
- package/src/plugins/entries.ts +70 -9
- package/src/plugins/fonts.ts +167 -61
- package/src/plugins/mdx.ts +1 -1
- package/src/plugins/routing.ts +57 -17
- package/src/plugins/server-action-exports.ts +1 -1
- package/src/plugins/server-bundle.ts +32 -1
- package/src/plugins/shims.ts +76 -33
- package/src/plugins/static-build.ts +10 -6
- package/src/routing/codegen.ts +165 -105
- package/src/routing/index.ts +2 -0
- package/src/routing/scanner.ts +93 -23
- package/src/routing/segment-classify.ts +89 -0
- package/src/routing/status-file-lint.ts +3 -2
- package/src/routing/types.ts +17 -4
- 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/{search-params/codecs.ts → schema-bridge.ts} +57 -20
- package/src/search-params/define.ts +482 -0
- package/src/search-params/index.ts +13 -19
- package/src/search-params/registry.ts +1 -1
- package/src/search-params/wrappers.ts +85 -0
- package/src/segment-params/define.ts +279 -0
- package/src/segment-params/index.ts +28 -0
- package/src/server/access-gate.tsx +70 -29
- package/src/server/action-client.ts +28 -3
- package/src/server/action-encryption.ts +144 -0
- package/src/server/action-handler.ts +20 -3
- package/src/server/actions.ts +10 -9
- package/src/server/als-registry.ts +32 -4
- package/src/server/build-manifest.ts +10 -4
- package/src/server/compress.ts +25 -7
- package/src/server/debug.ts +1 -1
- package/src/server/default-logger.ts +99 -0
- package/src/server/deny-page-resolver.ts +154 -0
- package/src/server/deny-renderer.ts +24 -38
- package/src/server/dev-warnings.ts +2 -28
- package/src/server/early-hints.ts +36 -15
- package/src/server/error-boundary-wrapper.ts +74 -22
- package/src/server/fallback-error.ts +31 -15
- package/src/server/flight-injection-state.ts +113 -0
- package/src/server/flight-scripts.ts +62 -0
- package/src/server/flush.ts +2 -1
- package/src/server/form-data.ts +76 -0
- package/src/server/html-injectors.ts +277 -117
- package/src/server/index.ts +9 -5
- package/src/server/logger.ts +44 -36
- package/src/server/middleware-runner.ts +31 -4
- package/src/server/node-stream-transforms.ts +509 -0
- package/src/server/page-deny-boundary.tsx +56 -0
- package/src/server/pipeline-interception.ts +17 -16
- package/src/server/pipeline-metadata.ts +13 -0
- package/src/server/pipeline.ts +195 -51
- package/src/server/primitives.ts +47 -5
- package/src/server/render-timeout.ts +108 -0
- package/src/server/request-context.ts +240 -117
- package/src/server/route-element-builder.ts +284 -197
- package/src/server/route-handler.ts +24 -4
- package/src/server/route-matcher.ts +24 -20
- package/src/server/rsc-entry/api-handler.ts +15 -16
- package/src/server/rsc-entry/error-renderer.ts +300 -89
- package/src/server/rsc-entry/helpers.ts +134 -5
- package/src/server/rsc-entry/index.ts +202 -113
- package/src/server/rsc-entry/rsc-payload.ts +100 -21
- package/src/server/rsc-entry/rsc-stream.ts +74 -18
- package/src/server/rsc-entry/ssr-bridge.ts +14 -5
- package/src/server/rsc-entry/ssr-renderer.ts +173 -40
- package/src/server/safe-load.ts +60 -0
- package/src/server/sitemap-generator.ts +338 -0
- package/src/server/sitemap-handler.ts +126 -0
- package/src/server/slot-resolver.ts +243 -228
- package/src/server/ssr-entry.ts +211 -32
- package/src/server/ssr-render.ts +289 -67
- package/src/server/ssr-wrappers.tsx +139 -0
- package/src/server/status-code-resolver.ts +1 -1
- package/src/server/stream-utils.ts +213 -0
- package/src/server/tracing.ts +37 -3
- package/src/server/tree-builder.ts +92 -58
- package/src/server/types.ts +3 -6
- package/src/server/version-skew.ts +104 -0
- package/src/server/waituntil-bridge.ts +4 -1
- package/src/shared/merge-search-params.ts +55 -0
- package/src/shims/font-google.ts +1 -1
- package/src/shims/font-local.ts +34 -0
- package/src/shims/navigation-client.ts +1 -1
- package/src/shims/navigation.ts +2 -1
- package/src/utils/directive-parser.ts +5 -2
- package/src/utils/state-machine.ts +111 -0
- package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
- package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
- package/dist/_chunks/format-DviM89f0.js.map +0 -1
- package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
- package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
- package/dist/_chunks/ssr-data-MjmprTmO.js +0 -88
- package/dist/_chunks/ssr-data-MjmprTmO.js.map +0 -1
- package/dist/_chunks/tracing-Cwn7697K.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/error-boundary.js.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/transition-root.d.ts.map +0 -1
- package/dist/cookies/index.js.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/dynamic-transform.d.ts +0 -72
- package/dist/plugins/dynamic-transform.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/search-params/index.js.map +0 -1
- package/dist/server/prerender.d.ts +0 -77
- package/dist/server/prerender.d.ts.map +0 -1
- package/dist/server/response-cache.d.ts +0 -53
- package/dist/server/response-cache.d.ts.map +0 -1
- package/src/cache/register-cached-function.ts +0 -99
- package/src/client/link-status-provider.tsx +0 -30
- package/src/client/transition-root.tsx +0 -160
- package/src/plugins/cache-transform.ts +0 -199
- package/src/plugins/dynamic-transform.ts +0 -161
- package/src/search-params/analyze.ts +0 -192
- package/src/search-params/builtin-codecs.ts +0 -228
- package/src/search-params/create.ts +0 -321
- package/src/server/prerender.ts +0 -139
- package/src/server/response-cache.ts +0 -277
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
* 16-metadata.md §"Head Elements"
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import type { LayoutEntry } from '
|
|
13
|
-
import { renderDenyPageAsRsc } from '
|
|
14
|
-
import type { RouteMatch } from '
|
|
15
|
-
import type { RedirectSignal } from '
|
|
16
|
-
import type { HeadElement, LayoutComponentEntry } from '
|
|
17
|
-
import type { ManifestSegmentNode } from '
|
|
12
|
+
import type { LayoutEntry } from '../deny-renderer.js';
|
|
13
|
+
import { renderDenyPageAsRsc } from '../deny-renderer.js';
|
|
14
|
+
import type { RouteMatch } from '../pipeline.js';
|
|
15
|
+
import type { RedirectSignal } from '../primitives.js';
|
|
16
|
+
import type { HeadElement, LayoutComponentEntry } from '../route-element-builder.js';
|
|
17
|
+
import type { ManifestSegmentNode } from '../route-matcher.js';
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
20
|
buildRedirectResponse,
|
|
@@ -45,18 +45,60 @@ export async function buildRscPayloadResponse(
|
|
|
45
45
|
skippedSegments?: string[]
|
|
46
46
|
): Promise<Response> {
|
|
47
47
|
// Read the first chunk from the RSC stream before committing headers.
|
|
48
|
+
// Race the first read against signal detection — if an async component
|
|
49
|
+
// throws a RedirectSignal or DenySignal, the onError callback fires
|
|
50
|
+
// signals.onSignal() and we can react immediately without waiting for
|
|
51
|
+
// the full macrotask queue.
|
|
52
|
+
//
|
|
53
|
+
// The rejection chain for an async-wrapped page component:
|
|
54
|
+
// 1. PageComponent throws RedirectSignal
|
|
55
|
+
// 2. withSpan catches and re-throws (microtask 1)
|
|
56
|
+
// 3. TracedPage promise rejects (microtask 2)
|
|
57
|
+
// 4. React Flight rejection handler → onError (microtask 3+)
|
|
58
|
+
//
|
|
59
|
+
// Promise.race reacts the instant onError fires, eliminating the
|
|
60
|
+
// per-request setTimeout(0) macrotask delay for the common case
|
|
61
|
+
// (no signal). A 50ms ceiling timeout guards against edge cases
|
|
62
|
+
// where onError never fires.
|
|
48
63
|
const reader = rscStream.getReader();
|
|
49
|
-
const
|
|
64
|
+
const signalDetected = new Promise<void>((resolve) => {
|
|
65
|
+
signals.onSignal = resolve;
|
|
66
|
+
});
|
|
50
67
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
68
|
+
type RaceResult =
|
|
69
|
+
| { type: 'data'; chunk: ReadableStreamReadResult<Uint8Array> }
|
|
70
|
+
| { type: 'signal' };
|
|
71
|
+
|
|
72
|
+
let first: RaceResult;
|
|
73
|
+
try {
|
|
74
|
+
first = await Promise.race([
|
|
75
|
+
reader.read().then((chunk) => ({ type: 'data' as const, chunk })),
|
|
76
|
+
signalDetected.then(() => ({ type: 'signal' as const })),
|
|
77
|
+
]);
|
|
78
|
+
} catch (_readError) {
|
|
79
|
+
// RSC stream failed on first read — unhandled error in the page component.
|
|
80
|
+
// Return an error response so the client can hard-navigate for the
|
|
81
|
+
// SSR-rendered error page. See design/10-error-handling.md.
|
|
82
|
+
reader.cancel().catch(() => {});
|
|
83
|
+
signals.onSignal = undefined;
|
|
84
|
+
responseHeaders.set('X-Timber-Error', '1');
|
|
85
|
+
responseHeaders.set('content-type', 'application/json; charset=utf-8');
|
|
86
|
+
return new Response(JSON.stringify({ error: true, status: 500 }), {
|
|
87
|
+
status: 500,
|
|
88
|
+
headers: responseHeaders,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// If data arrived first, still check signals — they may have fired
|
|
93
|
+
// concurrently. Also do a final ceiling timeout check for edge cases
|
|
94
|
+
// where the signal fires just after the first read resolves.
|
|
95
|
+
if (first.type === 'data' && !signals.redirectSignal && !signals.denySignal) {
|
|
96
|
+
// Brief yield to let any in-flight microtask rejections complete.
|
|
97
|
+
await new Promise<void>((r) => setTimeout(r, 0));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Detach the callback — no longer needed after this point.
|
|
101
|
+
signals.onSignal = undefined;
|
|
60
102
|
|
|
61
103
|
// Check for redirect/deny signals detected during initial rendering
|
|
62
104
|
const trackedRedirect = signals.redirectSignal as RedirectSignal | null;
|
|
@@ -75,6 +117,37 @@ export async function buildRscPayloadResponse(
|
|
|
75
117
|
);
|
|
76
118
|
}
|
|
77
119
|
|
|
120
|
+
// Check for unhandled errors (RenderError or plain Error).
|
|
121
|
+
// These aren't redirect/deny signals but the RSC stream will be broken.
|
|
122
|
+
// Return an error response so the client can hard-navigate for the
|
|
123
|
+
// SSR-rendered error page. See design/10-error-handling.md
|
|
124
|
+
// §"Error Page Rendering for Client Navigation".
|
|
125
|
+
if (signals.renderError) {
|
|
126
|
+
reader.cancel().catch(() => {});
|
|
127
|
+
responseHeaders.set('X-Timber-Error', '1');
|
|
128
|
+
responseHeaders.set('content-type', 'application/json; charset=utf-8');
|
|
129
|
+
return new Response(
|
|
130
|
+
JSON.stringify({
|
|
131
|
+
error: true,
|
|
132
|
+
status: signals.renderError.status,
|
|
133
|
+
}),
|
|
134
|
+
{ status: signals.renderError.status, headers: responseHeaders }
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Extract the first chunk from the race result.
|
|
139
|
+
// If the signal won the race but neither redirect nor deny was detected
|
|
140
|
+
// (edge case), cancel the reader immediately rather than issuing a bare
|
|
141
|
+
// read() that could hang forever if the RSC stream has stalled.
|
|
142
|
+
// See TIM-519.
|
|
143
|
+
let firstRead: ReadableStreamReadResult<Uint8Array>;
|
|
144
|
+
if (first.type === 'data') {
|
|
145
|
+
firstRead = first.chunk;
|
|
146
|
+
} else {
|
|
147
|
+
await reader.cancel();
|
|
148
|
+
firstRead = { done: true, value: undefined };
|
|
149
|
+
}
|
|
150
|
+
|
|
78
151
|
// Reconstruct the stream: prepend the buffered first chunk,
|
|
79
152
|
// then continue piping from the original reader.
|
|
80
153
|
const patchedStream = new ReadableStream<Uint8Array>({
|
|
@@ -123,14 +196,20 @@ export async function buildRscPayloadResponse(
|
|
|
123
196
|
responseHeaders.set('X-Timber-Skipped-Segments', JSON.stringify(skippedSegments));
|
|
124
197
|
}
|
|
125
198
|
|
|
126
|
-
// Send route params so the client can populate
|
|
127
|
-
// SPA navigation. Without this,
|
|
128
|
-
if (Object.keys(match.
|
|
129
|
-
responseHeaders.set('X-Timber-Params', JSON.stringify(match.
|
|
199
|
+
// Send route params so the client can populate useSegmentParams() after
|
|
200
|
+
// SPA navigation. Without this, useSegmentParams() returns {}.
|
|
201
|
+
if (Object.keys(match.segmentParams).length > 0) {
|
|
202
|
+
responseHeaders.set('X-Timber-Params', JSON.stringify(match.segmentParams));
|
|
130
203
|
}
|
|
131
204
|
|
|
205
|
+
// Check if a DenySignal was caught in-tree by AccessGate or
|
|
206
|
+
// PageDenyBoundary. The deny page is in the Flight stream as a normal
|
|
207
|
+
// element — use the deny status for the HTTP response. See TIM-666.
|
|
208
|
+
const { getDenyStatus } = await import('../deny-page-resolver.js');
|
|
209
|
+
const denyStatus = getDenyStatus();
|
|
210
|
+
|
|
132
211
|
return new Response(patchedStream, {
|
|
133
|
-
status: 200,
|
|
212
|
+
status: denyStatus ?? 200,
|
|
134
213
|
headers: responseHeaders,
|
|
135
214
|
});
|
|
136
215
|
}
|
|
@@ -10,30 +10,46 @@
|
|
|
10
10
|
* 13-security.md §"Errors don't leak"
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { renderToReadableStream } from '
|
|
13
|
+
import { renderToReadableStream } from '../../rsc-runtime/rsc.js';
|
|
14
14
|
|
|
15
|
-
import {
|
|
16
|
-
import { DenySignal, RedirectSignal, RenderError } from '#/server/primitives.js';
|
|
17
|
-
import { checkAndWarnRscPropError } from '#/server/rsc-prop-warnings.js';
|
|
15
|
+
import { randomUUID } from 'node:crypto';
|
|
18
16
|
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
17
|
+
import { logRenderError } from '../logger.js';
|
|
18
|
+
import { DenySignal, RedirectSignal, RenderError } from '../primitives.js';
|
|
19
|
+
import { checkAndWarnRscPropError } from '../rsc-prop-warnings.js';
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
createDebugChannelSink,
|
|
23
|
+
createDebugChannelCollector,
|
|
24
|
+
isAbortError,
|
|
25
|
+
type DebugComponentEntry,
|
|
26
|
+
} from './helpers.js';
|
|
27
|
+
import { isDebug } from '../debug.js';
|
|
28
|
+
import { isDevMode } from '../debug.js';
|
|
21
29
|
|
|
22
30
|
/**
|
|
23
31
|
* Mutable signal state captured during RSC rendering.
|
|
24
32
|
*
|
|
25
33
|
* Signals fire asynchronously via `onError` during stream consumption.
|
|
26
34
|
* The first signal of each type wins — subsequent signals are ignored.
|
|
35
|
+
*
|
|
36
|
+
* `onSignal` is an optional callback fired when a DenySignal or
|
|
37
|
+
* RedirectSignal is captured. Consumers use it with Promise.race to
|
|
38
|
+
* react immediately instead of polling with setTimeout/queueMicrotask.
|
|
27
39
|
*/
|
|
28
40
|
export interface RenderSignals {
|
|
29
41
|
denySignal: DenySignal | null;
|
|
30
42
|
redirectSignal: RedirectSignal | null;
|
|
31
43
|
renderError: { error: unknown; status: number } | null;
|
|
44
|
+
/** Callback fired when a redirect or deny signal is captured in onError. */
|
|
45
|
+
onSignal?: () => void;
|
|
32
46
|
}
|
|
33
47
|
|
|
34
48
|
export interface RscStreamResult {
|
|
35
49
|
rscStream: ReadableStream<Uint8Array> | undefined;
|
|
36
50
|
signals: RenderSignals;
|
|
51
|
+
/** Dev-only: server component debug info from the Flight debug channel. */
|
|
52
|
+
getDebugComponents?: () => DebugComponentEntry[];
|
|
37
53
|
}
|
|
38
54
|
|
|
39
55
|
/**
|
|
@@ -56,6 +72,10 @@ export function renderRscStream(element: React.ReactElement, req: Request): RscS
|
|
|
56
72
|
|
|
57
73
|
let rscStream: ReadableStream<Uint8Array> | undefined;
|
|
58
74
|
|
|
75
|
+
// In dev mode, collect debug channel data for the error overlay.
|
|
76
|
+
// In production, use the discard sink (no overhead).
|
|
77
|
+
const debugChannel = isDevMode() ? createDebugChannelCollector() : createDebugChannelSink();
|
|
78
|
+
|
|
59
79
|
try {
|
|
60
80
|
rscStream = renderToReadableStream(
|
|
61
81
|
element,
|
|
@@ -67,11 +87,13 @@ export function renderRscStream(element: React.ReactElement, req: Request): RscS
|
|
|
67
87
|
if (isAbortError(error) || req.signal?.aborted) return;
|
|
68
88
|
if (error instanceof DenySignal) {
|
|
69
89
|
signals.denySignal = error;
|
|
90
|
+
signals.onSignal?.();
|
|
70
91
|
// Return structured digest for client-side error boundaries
|
|
71
92
|
return JSON.stringify({ type: 'deny', status: error.status, data: error.data });
|
|
72
93
|
}
|
|
73
94
|
if (error instanceof RedirectSignal) {
|
|
74
95
|
signals.redirectSignal = error;
|
|
96
|
+
signals.onSignal?.();
|
|
75
97
|
return JSON.stringify({
|
|
76
98
|
type: 'redirect',
|
|
77
99
|
location: error.location,
|
|
@@ -98,11 +120,7 @@ export function renderRscStream(element: React.ReactElement, req: Request): RscS
|
|
|
98
120
|
// directive isn't at the very top of the file, or the component is
|
|
99
121
|
// re-exported through a barrel file without 'use client'.
|
|
100
122
|
// See LOCAL-297.
|
|
101
|
-
if (
|
|
102
|
-
isDebug() &&
|
|
103
|
-
error instanceof Error &&
|
|
104
|
-
error.message.includes('Invalid hook call')
|
|
105
|
-
) {
|
|
123
|
+
if (isDebug() && error instanceof Error && error.message.includes('Invalid hook call')) {
|
|
106
124
|
console.error(
|
|
107
125
|
'[timber] A React hook was called during RSC rendering. This usually means a ' +
|
|
108
126
|
"'use client' component is being executed as a server component instead of " +
|
|
@@ -122,13 +140,42 @@ export function renderRscStream(element: React.ReactElement, req: Request): RscS
|
|
|
122
140
|
checkAndWarnRscPropError(error, new URL(req.url).pathname);
|
|
123
141
|
}
|
|
124
142
|
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
143
|
+
// Log the error but do NOT track it as a page-level render error.
|
|
144
|
+
// If this error is inside a <Suspense> boundary, React will emit
|
|
145
|
+
// an error row in the Flight stream and the Suspense fallback will
|
|
146
|
+
// render on the client. Tracking it as signals.renderError would
|
|
147
|
+
// cause the pipeline to treat the entire page as a 500, even though
|
|
148
|
+
// the shell rendered successfully. See TIM-524.
|
|
149
|
+
//
|
|
150
|
+
// Only track as renderError if no Suspense boundary contains it —
|
|
151
|
+
// React will call onShellError for truly unrecoverable errors.
|
|
152
|
+
|
|
153
|
+
// Return a digest so React emits a per-row error in the Flight
|
|
154
|
+
// stream instead of leaving the lazy reference unresolved.
|
|
155
|
+
//
|
|
156
|
+
// SECURITY: Never include error.message in the digest — it may
|
|
157
|
+
// contain SQL queries, filesystem paths, secret fragments, or
|
|
158
|
+
// internal IDs. Use a generic message with a correlation ID so
|
|
159
|
+
// the error can be matched to server logs.
|
|
160
|
+
// See design/13-security.md §"Errors don't leak".
|
|
161
|
+
const errorId = randomUUID();
|
|
162
|
+
logRenderError({
|
|
163
|
+
method: req.method,
|
|
164
|
+
path: new URL(req.url).pathname,
|
|
165
|
+
error,
|
|
166
|
+
errorId,
|
|
167
|
+
});
|
|
168
|
+
return JSON.stringify({
|
|
169
|
+
type: 'error',
|
|
170
|
+
message: isDevMode()
|
|
171
|
+
? error instanceof Error
|
|
172
|
+
? error.message
|
|
173
|
+
: String(error)
|
|
174
|
+
: 'An unexpected error occurred.',
|
|
175
|
+
errorId,
|
|
176
|
+
});
|
|
130
177
|
},
|
|
131
|
-
debugChannel
|
|
178
|
+
debugChannel,
|
|
132
179
|
},
|
|
133
180
|
{
|
|
134
181
|
onClientReference(info: { id: string; name: string; deps: unknown }) {
|
|
@@ -156,5 +203,14 @@ export function renderRscStream(element: React.ReactElement, req: Request): RscS
|
|
|
156
203
|
}
|
|
157
204
|
}
|
|
158
205
|
|
|
159
|
-
return {
|
|
206
|
+
return {
|
|
207
|
+
rscStream,
|
|
208
|
+
signals,
|
|
209
|
+
// Expose the debug channel collector's getComponents in dev mode.
|
|
210
|
+
// The caller can retrieve component tree info when handling errors.
|
|
211
|
+
getDebugComponents:
|
|
212
|
+
'getComponents' in debugChannel
|
|
213
|
+
? (debugChannel as { getComponents: () => DebugComponentEntry[] }).getComponents
|
|
214
|
+
: undefined,
|
|
215
|
+
};
|
|
160
216
|
}
|
|
@@ -4,15 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
/// <reference types="@vitejs/plugin-rsc/types" />
|
|
6
6
|
|
|
7
|
-
import type { NavContext } from '
|
|
7
|
+
import type { NavContext } from '../ssr-entry.js';
|
|
8
8
|
|
|
9
9
|
export async function callSsr(
|
|
10
10
|
rscStream: ReadableStream<Uint8Array>,
|
|
11
11
|
navContext: NavContext
|
|
12
12
|
): Promise<Response> {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
let ssrEntry: typeof import('../ssr-entry.js');
|
|
14
|
+
try {
|
|
15
|
+
ssrEntry = await import.meta.viteRsc.import<typeof import('../ssr-entry.js')>(
|
|
16
|
+
'../ssr-entry.js',
|
|
17
|
+
{ environment: 'ssr' }
|
|
18
|
+
);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
const original = error instanceof Error ? error.message : String(error);
|
|
21
|
+
throw new Error(
|
|
22
|
+
`[timber] Failed to load SSR entry from RSC environment.\n ${original}\n This usually means a module evaluation error in the SSR bundle.`,
|
|
23
|
+
{ cause: error }
|
|
24
|
+
);
|
|
25
|
+
}
|
|
17
26
|
return ssrEntry.handleSsr(rscStream, navContext);
|
|
18
27
|
}
|