@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.190fb30d
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/AGENTS.md +13 -0
- package/README.md +304 -708
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +822 -182
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +4644 -1433
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +87 -16
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +251 -24
- package/skills/caching/SKILL.md +379 -21
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -692
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +320 -32
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +225 -10
- package/skills/ppr/SKILL.md +618 -0
- package/skills/prerender/SKILL.md +180 -126
- package/skills/rango/SKILL.md +318 -25
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +175 -13
- package/skills/router-setup/SKILL.md +139 -14
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -614
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +67 -40
- package/src/bin/rango.ts +18 -0
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +257 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +222 -38
- package/src/browser/navigation-client.ts +233 -58
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +242 -126
- package/src/browser/prefetch/cache.ts +344 -30
- package/src/browser/prefetch/fetch.ts +373 -48
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +135 -18
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +276 -75
- package/src/browser/scroll-restoration.ts +61 -47
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +631 -442
- package/src/browser/types.ts +160 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +8 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +215 -42
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +464 -63
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +442 -106
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +454 -97
- package/src/cache/cache-scope.ts +235 -103
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2446 -170
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +42 -21
- package/src/client.tsx +117 -336
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +104 -34
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -5
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +86 -30
- package/src/index.ts +158 -68
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +63 -26
- package/src/prerender.ts +215 -86
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -5
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +110 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +179 -219
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +127 -52
- package/src/router/metrics.ts +217 -26
- package/src/router/middleware-types.ts +24 -110
- package/src/router/middleware.ts +412 -199
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +183 -137
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +207 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +144 -74
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +160 -36
- package/src/router/router-options.ts +215 -23
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +318 -77
- package/src/router/segment-resolution/helpers.ts +116 -31
- package/src/router/segment-resolution/loader-cache.ts +156 -39
- package/src/router/segment-resolution/loader-mask.ts +67 -0
- package/src/router/segment-resolution/loader-snapshot.ts +308 -0
- package/src/router/segment-resolution/revalidation.ts +496 -391
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +8 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +188 -58
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +224 -65
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +726 -457
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +159 -23
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +516 -104
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +293 -115
- package/src/rsc/shell-capture.ts +1166 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +64 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +49 -41
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +418 -131
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +375 -63
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +585 -178
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +467 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +3 -19
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +237 -89
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +23 -46
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -19
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +64 -91
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +147 -88
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +247 -145
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +61 -13
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +19 -3
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +356 -295
- package/src/vite/router-discovery.ts +1106 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +158 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- package/CLAUDE.md +0 -5
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/route-definition/route-function.ts +0 -119
- package/src/router/middleware-cookies.ts +0 -55
package/src/rsc/handler.ts
CHANGED
|
@@ -8,23 +8,34 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { createElement } from "react";
|
|
11
|
-
import {
|
|
11
|
+
import { isRouteNotFoundError } from "../errors.js";
|
|
12
12
|
import { matchMiddleware, executeMiddleware } from "../router/middleware.js";
|
|
13
13
|
import {
|
|
14
14
|
runWithRequestContext,
|
|
15
15
|
setRequestContextParams,
|
|
16
|
-
|
|
16
|
+
getRequestContext,
|
|
17
|
+
_getRequestContext,
|
|
17
18
|
createRequestContext,
|
|
18
19
|
} from "../server/request-context.js";
|
|
19
20
|
import * as rscDeps from "@vitejs/plugin-rsc/rsc";
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
import type {
|
|
22
|
+
RscPayload,
|
|
23
|
+
CreateRSCHandlerOptions,
|
|
24
|
+
LoadSSRModule,
|
|
25
|
+
SSRModule,
|
|
26
|
+
} from "./types.js";
|
|
22
27
|
import {
|
|
23
28
|
createResponseWithMergedHeaders,
|
|
24
29
|
finalizeResponse,
|
|
25
30
|
interceptRedirectForPartial,
|
|
26
31
|
buildRouteMiddlewareEntries,
|
|
27
32
|
} from "./helpers.js";
|
|
33
|
+
import { guardOutgoingRedirect } from "./redirect-guard.js";
|
|
34
|
+
import { resolvedHandleStream } from "../handles/deferred-resolution.js";
|
|
35
|
+
import {
|
|
36
|
+
isWebSocketUpgradeResponse,
|
|
37
|
+
appendVaryAccept,
|
|
38
|
+
} from "../response-utils.js";
|
|
28
39
|
import {
|
|
29
40
|
handleResponseRoute,
|
|
30
41
|
type ResponseRouteMatch,
|
|
@@ -38,8 +49,6 @@ import {
|
|
|
38
49
|
createReverseFunction,
|
|
39
50
|
stripInternalParams,
|
|
40
51
|
} from "../router/handler-context.js";
|
|
41
|
-
import { getRouterContext } from "../router/router-context.js";
|
|
42
|
-
import { resolveSink, safeEmit } from "../router/telemetry.js";
|
|
43
52
|
import { contextSet } from "../context-var.js";
|
|
44
53
|
import {
|
|
45
54
|
hasCachedManifest,
|
|
@@ -50,6 +59,8 @@ import {
|
|
|
50
59
|
getRouterTrie,
|
|
51
60
|
} from "../route-map-builder.js";
|
|
52
61
|
import type { HandlerContext } from "./handler-context.js";
|
|
62
|
+
import type { CacheErrorCategory } from "../cache/cache-error.js";
|
|
63
|
+
import type { SegmentCacheStore } from "../cache/types.js";
|
|
53
64
|
import { buildRouterTrieFromUrlpatterns } from "./manifest-init.js";
|
|
54
65
|
import { handleProgressiveEnhancement } from "./progressive-enhancement.js";
|
|
55
66
|
import {
|
|
@@ -58,7 +69,10 @@ import {
|
|
|
58
69
|
type ActionContinuation,
|
|
59
70
|
} from "./server-action.js";
|
|
60
71
|
import { handleLoaderFetch } from "./loader-fetch.js";
|
|
61
|
-
import {
|
|
72
|
+
import {
|
|
73
|
+
checkRequestOrigin,
|
|
74
|
+
ORIGIN_CHECK_PHASE_BY_MODE,
|
|
75
|
+
} from "./origin-guard.js";
|
|
62
76
|
import { handleRscRendering } from "./rsc-rendering.js";
|
|
63
77
|
import {
|
|
64
78
|
withTimeout,
|
|
@@ -66,6 +80,25 @@ import {
|
|
|
66
80
|
createDefaultTimeoutResponse,
|
|
67
81
|
type TimeoutPhase,
|
|
68
82
|
} from "../router/timeout.js";
|
|
83
|
+
import {
|
|
84
|
+
createMetricsStore,
|
|
85
|
+
appendMetric,
|
|
86
|
+
buildMetricsTiming,
|
|
87
|
+
} from "../router/metrics.js";
|
|
88
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
89
|
+
import { safeEmit, resolveSink, getRequestId } from "../router/telemetry.js";
|
|
90
|
+
import {
|
|
91
|
+
startSSRSetup,
|
|
92
|
+
getSSRSetup,
|
|
93
|
+
mayNeedSSR,
|
|
94
|
+
isRscRequest,
|
|
95
|
+
SSR_SETUP_VAR,
|
|
96
|
+
} from "./ssr-setup.js";
|
|
97
|
+
import {
|
|
98
|
+
classifyRequest,
|
|
99
|
+
type RequestPlan,
|
|
100
|
+
type ExecutableRequestPlan,
|
|
101
|
+
} from "../router/request-classification.js";
|
|
69
102
|
|
|
70
103
|
/**
|
|
71
104
|
* Create an RSC request handler.
|
|
@@ -100,12 +133,35 @@ import {
|
|
|
100
133
|
* });
|
|
101
134
|
* ```
|
|
102
135
|
*/
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Response that tells the client to do a full document navigation. Shared by
|
|
139
|
+
* the terminal reload plans (version-mismatch and app-switch): an empty 200
|
|
140
|
+
* carrying X-RSC-Reload, which the client turns into window.location.href.
|
|
141
|
+
*/
|
|
142
|
+
function createReloadResponse(reloadUrl: string) {
|
|
143
|
+
return createResponseWithMergedHeaders(null, {
|
|
144
|
+
status: 200,
|
|
145
|
+
headers: {
|
|
146
|
+
"X-RSC-Reload": reloadUrl,
|
|
147
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
103
152
|
export function createRSCHandler<
|
|
104
153
|
TEnv = unknown,
|
|
105
154
|
TRoutes extends Record<string, string> = Record<string, string>,
|
|
106
155
|
>(options: CreateRSCHandlerOptions<TEnv, TRoutes>) {
|
|
107
156
|
const { router, version = VERSION, nonce: nonceProvider } = options;
|
|
108
157
|
|
|
158
|
+
// Handler-owned registry of explicit per-scope stores from cache({ store }).
|
|
159
|
+
// Lives in the closure so it is scoped per handler (multi-router deployments
|
|
160
|
+
// get separate registries) and accumulates every explicit store this handler
|
|
161
|
+
// resolves across requests. updateTag()/revalidateTag() iterate it to reach
|
|
162
|
+
// stores not covered by the app-level ctx._cacheStore.
|
|
163
|
+
const explicitTaggedStores = new Set<SegmentCacheStore>();
|
|
164
|
+
|
|
109
165
|
// Use provided deps or default to @vitejs/plugin-rsc/rsc exports
|
|
110
166
|
const deps = options.deps ?? rscDeps;
|
|
111
167
|
const {
|
|
@@ -117,10 +173,22 @@ export function createRSCHandler<
|
|
|
117
173
|
decodeFormState,
|
|
118
174
|
} = deps;
|
|
119
175
|
|
|
120
|
-
// Use provided loadSSRModule or default to vite RSC module loader
|
|
121
|
-
|
|
176
|
+
// Use provided loadSSRModule or default to vite RSC module loader.
|
|
177
|
+
// In production the SSR module is stable across requests, so memoize
|
|
178
|
+
// the dynamic import to avoid repeated module resolution overhead.
|
|
179
|
+
// In dev mode Vite may hot-reload the module, so skip memoization.
|
|
180
|
+
const rawLoadSSRModule: LoadSSRModule =
|
|
122
181
|
options.loadSSRModule ??
|
|
123
182
|
(() => import.meta.viteRsc.loadModule("ssr", "index"));
|
|
183
|
+
let _ssrModulePromise: Promise<SSRModule> | undefined;
|
|
184
|
+
const loadSSRModule: LoadSSRModule =
|
|
185
|
+
process.env.NODE_ENV === "production"
|
|
186
|
+
? () =>
|
|
187
|
+
(_ssrModulePromise ??= rawLoadSSRModule().catch((err) => {
|
|
188
|
+
_ssrModulePromise = undefined;
|
|
189
|
+
throw err;
|
|
190
|
+
}))
|
|
191
|
+
: rawLoadSSRModule;
|
|
124
192
|
|
|
125
193
|
/**
|
|
126
194
|
* Per-request error reporter that deduplicates via the ALS request context.
|
|
@@ -133,10 +201,13 @@ export function createRSCHandler<
|
|
|
133
201
|
phase: ErrorPhase,
|
|
134
202
|
context: Parameters<typeof invokeOnError<TEnv>>[3],
|
|
135
203
|
): void {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
204
|
+
// Guard: abort signal handlers fire asynchronously outside the ALS
|
|
205
|
+
// request scope, so the context may be gone. Skip dedup in that
|
|
206
|
+
// case — the error is from a cancelled stream, not a real failure.
|
|
207
|
+
const reqCtx = _getRequestContext();
|
|
208
|
+
if (error != null && typeof error === "object" && reqCtx) {
|
|
209
|
+
if (reqCtx._reportedErrors.has(error)) return;
|
|
210
|
+
reqCtx._reportedErrors.add(error);
|
|
140
211
|
}
|
|
141
212
|
invokeOnError(router.onError, error, phase, context, "RSC");
|
|
142
213
|
}
|
|
@@ -176,23 +247,18 @@ export function createRSCHandler<
|
|
|
176
247
|
metadata: { timeout: true, phase, durationMs },
|
|
177
248
|
});
|
|
178
249
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
customHandler: !!router.onTimeout,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
} catch {
|
|
195
|
-
// Router context may not be available
|
|
250
|
+
if (router.telemetry) {
|
|
251
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
252
|
+
type: "request.timeout",
|
|
253
|
+
timestamp: performance.now(),
|
|
254
|
+
requestId: getRequestId(request),
|
|
255
|
+
phase,
|
|
256
|
+
pathname: url.pathname,
|
|
257
|
+
routeKey,
|
|
258
|
+
actionId,
|
|
259
|
+
durationMs,
|
|
260
|
+
customHandler: !!router.onTimeout,
|
|
261
|
+
});
|
|
196
262
|
}
|
|
197
263
|
|
|
198
264
|
if (router.onTimeout) {
|
|
@@ -225,16 +291,27 @@ export function createRSCHandler<
|
|
|
225
291
|
function createRedirectFlightResponse(
|
|
226
292
|
redirectUrl: string,
|
|
227
293
|
locationState?: Record<string, unknown>,
|
|
294
|
+
external?: boolean,
|
|
228
295
|
): Response {
|
|
229
296
|
const redirectPayload: RscPayload = {
|
|
230
297
|
metadata: {
|
|
231
298
|
pathname: redirectUrl,
|
|
232
299
|
segments: [],
|
|
233
|
-
redirect: { url: redirectUrl },
|
|
300
|
+
redirect: { url: redirectUrl, ...(external && { external: true }) },
|
|
234
301
|
...(locationState && { locationState }),
|
|
235
302
|
},
|
|
236
303
|
};
|
|
237
|
-
const rscStream = renderToReadableStream<RscPayload>(redirectPayload
|
|
304
|
+
const rscStream = renderToReadableStream<RscPayload>(redirectPayload, {
|
|
305
|
+
onError: (error: unknown) => {
|
|
306
|
+
const reqCtx = _getRequestContext<TEnv>();
|
|
307
|
+
if (!reqCtx) return;
|
|
308
|
+
callOnError(error, "rendering", {
|
|
309
|
+
request: reqCtx.request,
|
|
310
|
+
url: reqCtx.url,
|
|
311
|
+
env: reqCtx.env,
|
|
312
|
+
});
|
|
313
|
+
},
|
|
314
|
+
});
|
|
238
315
|
return createResponseWithMergedHeaders(rscStream, {
|
|
239
316
|
status: 200,
|
|
240
317
|
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
@@ -268,6 +345,11 @@ export function createRSCHandler<
|
|
|
268
345
|
input: RouterRequestInput<TEnv> = {},
|
|
269
346
|
): Promise<Response> {
|
|
270
347
|
const handlerStart = performance.now();
|
|
348
|
+
// Create the metrics store at handler start so handler:total has startTime=0
|
|
349
|
+
// and all metrics are relative to the request entry point.
|
|
350
|
+
const earlyMetricsStore = router.debugPerformance
|
|
351
|
+
? createMetricsStore(true, handlerStart)
|
|
352
|
+
: undefined;
|
|
271
353
|
|
|
272
354
|
const { env = {} as TEnv, vars: initialVars, ctx: executionCtx } = input;
|
|
273
355
|
|
|
@@ -310,7 +392,7 @@ export function createRSCHandler<
|
|
|
310
392
|
// Resolve cache store configuration
|
|
311
393
|
// Priority: options.cache (handler override) > router.cache (router default)
|
|
312
394
|
// Store is enabled only if: config provided, enabled, and no ?__no_cache query param
|
|
313
|
-
let cacheStore
|
|
395
|
+
let cacheStore: SegmentCacheStore | undefined;
|
|
314
396
|
const cacheOption = options.cache ?? router.cache;
|
|
315
397
|
if (cacheOption && !url.searchParams.has("__no_cache")) {
|
|
316
398
|
const cacheConfig =
|
|
@@ -377,15 +459,27 @@ export function createRSCHandler<
|
|
|
377
459
|
url,
|
|
378
460
|
variables,
|
|
379
461
|
cacheStore,
|
|
462
|
+
explicitTaggedStores,
|
|
380
463
|
cacheProfiles: router.cacheProfiles,
|
|
381
464
|
executionContext: executionCtx,
|
|
382
465
|
themeConfig: router.themeConfig,
|
|
466
|
+
stateCookieName: router.resolvedStateCookieName,
|
|
467
|
+
version,
|
|
383
468
|
});
|
|
469
|
+
// Thread the true request entry timestamp onto the context so a metrics
|
|
470
|
+
// store created MID-request (ctx.debugPerformance() / getMetricsStore) anchors
|
|
471
|
+
// to the real start, not the opt-in moment — phases that began earlier then
|
|
472
|
+
// report non-negative offsets. Set unconditionally: debug may be enabled later.
|
|
473
|
+
requestContext._handlerStart = handlerStart;
|
|
474
|
+
if (earlyMetricsStore) {
|
|
475
|
+
requestContext._debugPerformance = true;
|
|
476
|
+
requestContext._metricsStore = earlyMetricsStore;
|
|
477
|
+
}
|
|
384
478
|
// Wire background error reporting so "use cache" and other subsystems
|
|
385
479
|
// can surface non-fatal errors through the router's onError callback.
|
|
386
480
|
requestContext._reportBackgroundError = (
|
|
387
481
|
error: unknown,
|
|
388
|
-
category:
|
|
482
|
+
category: CacheErrorCategory,
|
|
389
483
|
) => {
|
|
390
484
|
callOnError(error, "cache", {
|
|
391
485
|
request,
|
|
@@ -415,42 +509,120 @@ export function createRSCHandler<
|
|
|
415
509
|
// - Server components during rendering
|
|
416
510
|
// - Error boundaries
|
|
417
511
|
// - Streaming
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
512
|
+
// Store basename on request context (scoped per-request via existing ALS)
|
|
513
|
+
requestContext._basename = router.basename;
|
|
514
|
+
|
|
515
|
+
// Resolved span tracing for this request (read at each traced phase).
|
|
516
|
+
requestContext._tracing = router.tracing;
|
|
517
|
+
|
|
518
|
+
// The "rango.request" span is opened inside the request context so the
|
|
519
|
+
// Cloudflare runner can read executionContext.tracing, and so every nested
|
|
520
|
+
// phase span (and the platform's automatic KV/D1/fetch spans) nests under
|
|
521
|
+
// it. Construction-bound: the span ends when the Response is built, never
|
|
522
|
+
// wrapping the streamed body. metric:false — handler:total is metered
|
|
523
|
+
// directly below (a grand total incl. the pre-context bootstrap timings).
|
|
524
|
+
// When tracing is off this is a direct pass-through.
|
|
525
|
+
return runWithRequestContext(requestContext, () =>
|
|
526
|
+
observePhase(PHASES.request, async (span) => {
|
|
527
|
+
span.setAttribute("http.method", request.method);
|
|
528
|
+
// The matched route template is not known until match() runs later, so
|
|
529
|
+
// emit the concrete path as url.path (low-level), NOT http.route — the
|
|
530
|
+
// latter is reserved for the low-cardinality template (OTel convention).
|
|
531
|
+
span.setAttribute("url.path", url.pathname);
|
|
532
|
+
|
|
533
|
+
// Core handler logic (wrapped by middleware)
|
|
534
|
+
const coreHandler = async (): Promise<Response> => {
|
|
535
|
+
return coreRequestHandler(request, env, url, variables, nonce);
|
|
536
|
+
};
|
|
423
537
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
538
|
+
// Execute middleware chain if any, otherwise call core handler directly
|
|
539
|
+
let response: Response;
|
|
540
|
+
if (matchedMiddleware.length > 0) {
|
|
541
|
+
const mwResponse = await executeMiddleware(
|
|
542
|
+
matchedMiddleware,
|
|
543
|
+
request,
|
|
544
|
+
env,
|
|
545
|
+
variables,
|
|
546
|
+
coreHandler,
|
|
547
|
+
createReverseFunction(getRequiredRouteMap()),
|
|
548
|
+
);
|
|
434
549
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
550
|
+
if (
|
|
551
|
+
url.searchParams.has("_rsc_partial") ||
|
|
552
|
+
url.searchParams.has("_rsc_action")
|
|
553
|
+
) {
|
|
554
|
+
const intercepted = interceptRedirectForPartial(
|
|
555
|
+
mwResponse,
|
|
556
|
+
createRedirectFlightResponse,
|
|
557
|
+
);
|
|
558
|
+
response = intercepted ?? finalizeResponse(mwResponse);
|
|
559
|
+
} else {
|
|
560
|
+
response = finalizeResponse(mwResponse);
|
|
561
|
+
}
|
|
562
|
+
} else {
|
|
563
|
+
response = await coreHandler();
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Finalize metrics after all middleware (including post-next work)
|
|
567
|
+
// has completed so :post spans are captured in the timeline.
|
|
568
|
+
// Handler timing parts are always emitted (even without debug metrics)
|
|
569
|
+
// so non-debug requests still get bootstrap Server-Timing entries.
|
|
570
|
+
const handlerTimingArr: string[] = variables.__handlerTiming || [];
|
|
571
|
+
// Preserve any existing Server-Timing set by response routes or middleware
|
|
572
|
+
const existingTiming = response.headers.get("Server-Timing");
|
|
573
|
+
const timingParts = existingTiming
|
|
574
|
+
? [existingTiming, ...handlerTimingArr]
|
|
575
|
+
: [...handlerTimingArr];
|
|
576
|
+
|
|
577
|
+
const metricsStore = requestContext._metricsStore;
|
|
578
|
+
if (metricsStore) {
|
|
579
|
+
// When the store was created at handler start (earlyMetricsStore),
|
|
580
|
+
// handler:total covers the full request. When ctx.debugPerformance()
|
|
581
|
+
// created the store mid-request its requestStart is now the threaded
|
|
582
|
+
// _handlerStart (== handlerStart), so both branches yield the true
|
|
583
|
+
// request entry; reading the store's own anchor keeps this correct even
|
|
584
|
+
// if a store ever lands without the threading (falls back to its start).
|
|
585
|
+
const totalStart = earlyMetricsStore
|
|
586
|
+
? handlerStart
|
|
587
|
+
: metricsStore.requestStart;
|
|
588
|
+
appendMetric(
|
|
589
|
+
metricsStore,
|
|
590
|
+
"handler:total",
|
|
591
|
+
totalStart,
|
|
592
|
+
performance.now() - totalStart,
|
|
442
593
|
);
|
|
443
|
-
|
|
594
|
+
const metricsTiming = buildMetricsTiming(
|
|
595
|
+
request.method,
|
|
596
|
+
url.pathname,
|
|
597
|
+
metricsStore,
|
|
598
|
+
);
|
|
599
|
+
if (metricsTiming) timingParts.push(metricsTiming);
|
|
444
600
|
}
|
|
445
601
|
|
|
446
|
-
|
|
447
|
-
|
|
602
|
+
const fullTiming = timingParts.join(", ");
|
|
603
|
+
if (fullTiming && !isWebSocketUpgradeResponse(response)) {
|
|
604
|
+
try {
|
|
605
|
+
response.headers.set("Server-Timing", fullTiming);
|
|
606
|
+
} catch {
|
|
607
|
+
// Immutable headers (e.g. a passed-through platform Response) — drop
|
|
608
|
+
// the timing header, never the response. Instrumentation must not
|
|
609
|
+
// 500 a request.
|
|
610
|
+
}
|
|
611
|
+
}
|
|
448
612
|
|
|
449
|
-
|
|
450
|
-
|
|
613
|
+
// Single open-redirect chokepoint: every response (PE, full-page,
|
|
614
|
+
// middleware short-circuit, response-route) funnels through here, so
|
|
615
|
+
// guarding browser-followed (3xx) redirects once covers them all and any
|
|
616
|
+
// future redirect exit. Soft SPA/Flight redirects are 200/204 and pass
|
|
617
|
+
// through untouched (validated client-side instead).
|
|
618
|
+
return guardOutgoingRedirect(response, url.origin, router.basename);
|
|
619
|
+
}),
|
|
620
|
+
);
|
|
451
621
|
};
|
|
452
622
|
|
|
453
|
-
// Core request handling logic (separated for middleware wrapping)
|
|
623
|
+
// Core request handling logic (separated for middleware wrapping).
|
|
624
|
+
// Uses the classify → execute model: classifyRequest produces a RequestPlan,
|
|
625
|
+
// then execution dispatches on the plan mode.
|
|
454
626
|
async function coreRequestHandler(
|
|
455
627
|
request: Request,
|
|
456
628
|
env: TEnv,
|
|
@@ -458,56 +630,103 @@ export function createRSCHandler<
|
|
|
458
630
|
variables: Record<string, any>,
|
|
459
631
|
nonce: string | undefined,
|
|
460
632
|
): Promise<Response> {
|
|
461
|
-
const previewStart = performance.now();
|
|
462
|
-
const preview = await router.previewMatch(request, { env });
|
|
463
|
-
const previewDur = performance.now() - previewStart;
|
|
464
633
|
const handlerTiming: string[] = variables.__handlerTiming || [];
|
|
465
|
-
|
|
466
|
-
//
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
634
|
+
|
|
635
|
+
// Debug manifest endpoint: handled before classification since it
|
|
636
|
+
// doesn't need a route match and needs trie access from the closure.
|
|
637
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
638
|
+
if (
|
|
639
|
+
url.searchParams.has("__debug_manifest") &&
|
|
640
|
+
(isDev || router.allowDebugManifest)
|
|
641
|
+
) {
|
|
642
|
+
const trie = getRouterTrie(router.id) ?? getRouteTrie();
|
|
643
|
+
const routeManifest = getRequiredRouteMap();
|
|
644
|
+
const { extractAncestryFromTrie } =
|
|
645
|
+
await import("../build/route-trie.js");
|
|
646
|
+
return new Response(
|
|
647
|
+
JSON.stringify(
|
|
648
|
+
{
|
|
649
|
+
routerId: router.id,
|
|
650
|
+
routeManifest,
|
|
651
|
+
routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
|
|
652
|
+
routeTrie: trie,
|
|
653
|
+
precomputedEntries: getPrecomputedEntries(),
|
|
654
|
+
},
|
|
655
|
+
null,
|
|
656
|
+
2,
|
|
476
657
|
),
|
|
477
|
-
|
|
478
|
-
|
|
658
|
+
{
|
|
659
|
+
headers: { "Content-Type": "application/json" },
|
|
660
|
+
},
|
|
479
661
|
);
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// ---- 1. Classify ----
|
|
665
|
+
// classifyRequest may throw RouteNotFoundError for unknown routes.
|
|
666
|
+
// In that case, fall through to a full-render plan so the pipeline
|
|
667
|
+
// can render the 404 page via the existing error handling path.
|
|
668
|
+
const classifyStart = performance.now();
|
|
669
|
+
let plan: RequestPlan<TEnv>;
|
|
670
|
+
try {
|
|
671
|
+
plan = await classifyRequest<TEnv>(request, url, {
|
|
672
|
+
findMatch: router.findMatch,
|
|
673
|
+
routerVersion: version,
|
|
674
|
+
routerId: router.id,
|
|
675
|
+
});
|
|
676
|
+
} catch (error) {
|
|
677
|
+
if (isRouteNotFoundError(error)) {
|
|
678
|
+
// Let the render path handle 404 — match()/matchPartial() will
|
|
679
|
+
// re-throw RouteNotFoundError and the catch block in
|
|
680
|
+
// executeRenderWithMiddleware renders the not-found page.
|
|
681
|
+
plan = {
|
|
682
|
+
mode: "full-render",
|
|
683
|
+
route: {
|
|
684
|
+
matched: null as any,
|
|
685
|
+
manifestEntry: null as any,
|
|
686
|
+
entries: [],
|
|
687
|
+
routeKey: "",
|
|
688
|
+
localRouteName: "",
|
|
689
|
+
params: {},
|
|
690
|
+
routeMiddleware: [],
|
|
691
|
+
cacheScope: null,
|
|
692
|
+
isPassthrough: false,
|
|
693
|
+
},
|
|
694
|
+
negotiated: false,
|
|
695
|
+
};
|
|
696
|
+
} else {
|
|
697
|
+
throw error;
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
const classifyDur = performance.now() - classifyStart;
|
|
701
|
+
handlerTiming.push(`handler-classify;dur=${classifyDur.toFixed(2)}`);
|
|
702
|
+
|
|
703
|
+
// ---- 2. Terminal plans (no execution needed) ----
|
|
704
|
+
if (plan.mode === "redirect") {
|
|
705
|
+
// Redirects are handled by the pipeline (match/matchPartial),
|
|
706
|
+
// but for partial requests we short-circuit with a Flight redirect.
|
|
707
|
+
if (url.searchParams.has("_rsc_partial")) {
|
|
708
|
+
return createRedirectFlightResponse(plan.redirectUrl);
|
|
489
709
|
}
|
|
490
|
-
|
|
710
|
+
// Full requests: let the pipeline handle the redirect via match()
|
|
711
|
+
// which returns { redirect: url }. Fall through to full-render.
|
|
491
712
|
}
|
|
492
713
|
|
|
493
|
-
|
|
714
|
+
if (plan.mode === "version-mismatch") {
|
|
715
|
+
console.log(
|
|
716
|
+
`[RSC] Version mismatch: client=${url.searchParams.get("_rsc_v")}, server=${version}. Forcing reload.`,
|
|
717
|
+
);
|
|
718
|
+
return createReloadResponse(plan.reloadUrl);
|
|
719
|
+
}
|
|
494
720
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
//
|
|
503
|
-
|
|
504
|
-
const originPhase: OriginCheckPhase | null = isAction
|
|
505
|
-
? "action"
|
|
506
|
-
: isLoaderFetch
|
|
507
|
-
? "loader"
|
|
508
|
-
: request.method === "POST"
|
|
509
|
-
? "pe-form"
|
|
510
|
-
: null;
|
|
721
|
+
if (plan.mode === "app-switch") {
|
|
722
|
+
// Cross-app SPA navigation crossed a host-router app boundary. Force a
|
|
723
|
+
// real document navigation so the target app's document is re-established
|
|
724
|
+
// (stylesheets, theme, warmup, prefetch-TTL). See request-classification.
|
|
725
|
+
return createReloadResponse(plan.reloadUrl);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// ---- 3. Origin guard (gate for action/loader/PE modes) ----
|
|
729
|
+
const originPhase = ORIGIN_CHECK_PHASE_BY_MODE[plan.mode];
|
|
511
730
|
if (originPhase) {
|
|
512
731
|
const originResult = await checkRequestOrigin(
|
|
513
732
|
request,
|
|
@@ -535,37 +754,52 @@ export function createRSCHandler<
|
|
|
535
754
|
},
|
|
536
755
|
});
|
|
537
756
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
host: request.headers.get("host"),
|
|
550
|
-
});
|
|
551
|
-
}
|
|
552
|
-
} catch {
|
|
553
|
-
// Router context may not be available
|
|
757
|
+
if (router.telemetry) {
|
|
758
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
759
|
+
type: "request.origin-rejected",
|
|
760
|
+
timestamp: performance.now(),
|
|
761
|
+
requestId: getRequestId(request),
|
|
762
|
+
method: request.method,
|
|
763
|
+
pathname: url.pathname,
|
|
764
|
+
phase: originPhase,
|
|
765
|
+
origin: request.headers.get("origin"),
|
|
766
|
+
host: request.headers.get("host"),
|
|
767
|
+
});
|
|
554
768
|
}
|
|
555
769
|
|
|
556
770
|
return originResult;
|
|
557
771
|
}
|
|
558
772
|
}
|
|
559
773
|
|
|
560
|
-
//
|
|
561
|
-
|
|
774
|
+
// ---- 4. Execute ----
|
|
775
|
+
return executeRequest(
|
|
776
|
+
plan as ExecutableRequestPlan<TEnv>,
|
|
777
|
+
request,
|
|
778
|
+
env,
|
|
779
|
+
url,
|
|
780
|
+
variables,
|
|
781
|
+
nonce,
|
|
782
|
+
);
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
// Execute a classified request plan. Dispatches to the appropriate handler
|
|
786
|
+
// based on plan.mode. Lives in the createRSCHandler closure for access to
|
|
787
|
+
// handlerCtx, router, callOnError, etc.
|
|
788
|
+
// Only receives executable plans (version-mismatch is handled above).
|
|
789
|
+
async function executeRequest(
|
|
790
|
+
plan: ExecutableRequestPlan<TEnv>,
|
|
791
|
+
request: Request,
|
|
792
|
+
env: TEnv,
|
|
793
|
+
url: URL,
|
|
794
|
+
variables: Record<string, any>,
|
|
795
|
+
nonce: string | undefined,
|
|
796
|
+
): Promise<Response> {
|
|
797
|
+
// Common setup
|
|
798
|
+
const handleStore = getRequestContext()._handleStore;
|
|
562
799
|
|
|
563
800
|
// Wire up error reporting for late streaming-handle failures
|
|
564
|
-
// (LateHandlePushError: handle pushed after stream completion).
|
|
565
|
-
// Without this, these errors are only caught by React's error boundary
|
|
566
|
-
// and never reach the router's onError callback or telemetry.
|
|
567
801
|
handleStore.onError = (error: Error) => {
|
|
568
|
-
const reqCtx =
|
|
802
|
+
const reqCtx = getRequestContext();
|
|
569
803
|
callOnError(error, "handler", {
|
|
570
804
|
request,
|
|
571
805
|
url,
|
|
@@ -573,66 +807,152 @@ export function createRSCHandler<
|
|
|
573
807
|
params: reqCtx.params as Record<string, string>,
|
|
574
808
|
handledByBoundary: true,
|
|
575
809
|
});
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
params: reqCtx.params as Record<string, string>,
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
} catch {
|
|
591
|
-
// Router context may not be available (e.g. prerender path)
|
|
810
|
+
if (router.telemetry) {
|
|
811
|
+
safeEmit(resolveSink(router.telemetry), {
|
|
812
|
+
type: "handler.error",
|
|
813
|
+
timestamp: performance.now(),
|
|
814
|
+
requestId: getRequestId(request),
|
|
815
|
+
error,
|
|
816
|
+
handledByBoundary: true,
|
|
817
|
+
pathname: url.pathname,
|
|
818
|
+
routeKey: reqCtx._routeName,
|
|
819
|
+
params: reqCtx.params as Record<string, string>,
|
|
820
|
+
});
|
|
592
821
|
}
|
|
593
822
|
};
|
|
594
823
|
|
|
595
824
|
// Set route params early so all execution paths can access ctx.params.
|
|
596
|
-
|
|
597
|
-
|
|
825
|
+
// Also store the classified snapshot so match/matchPartial can reuse it
|
|
826
|
+
// instead of calling resolveRoute again.
|
|
827
|
+
if (plan.mode !== "redirect") {
|
|
828
|
+
setRequestContextParams(plan.route.params, plan.route.routeKey);
|
|
829
|
+
getRequestContext()._classifiedRoute = plan.route;
|
|
598
830
|
}
|
|
599
831
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
//
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
routeMiddleware:
|
|
832
|
+
const routeReverse = createReverseFunction(getRequiredRouteMap());
|
|
833
|
+
|
|
834
|
+
// ---- Response route: skip entire RSC pipeline ----
|
|
835
|
+
if (plan.mode === "response") {
|
|
836
|
+
// Build ResponseRouteMatch from plan fields. handleResponseRoute
|
|
837
|
+
// expects a flat object with params at the top level.
|
|
838
|
+
const responseMatch: ResponseRouteMatch = {
|
|
839
|
+
responseType: plan.responseType,
|
|
840
|
+
handler: plan.handler,
|
|
841
|
+
params: plan.route.params,
|
|
842
|
+
negotiated: plan.negotiated,
|
|
843
|
+
manifestEntry: plan.manifestEntry,
|
|
844
|
+
routeMiddleware: plan.routeMiddleware,
|
|
845
|
+
};
|
|
846
|
+
const responseOutcome = await withTimeout(
|
|
847
|
+
handleResponseRoute(
|
|
848
|
+
handlerCtx,
|
|
849
|
+
responseMatch,
|
|
850
|
+
request,
|
|
851
|
+
env,
|
|
852
|
+
url,
|
|
853
|
+
variables,
|
|
854
|
+
),
|
|
855
|
+
router.timeouts.renderStartMs,
|
|
856
|
+
"render-start",
|
|
857
|
+
);
|
|
858
|
+
if (responseOutcome.timedOut) {
|
|
859
|
+
return handleTimeoutResponse(
|
|
860
|
+
request,
|
|
861
|
+
env,
|
|
862
|
+
url,
|
|
863
|
+
"render-start",
|
|
864
|
+
responseOutcome.durationMs,
|
|
865
|
+
plan.route.routeKey,
|
|
866
|
+
);
|
|
867
|
+
}
|
|
868
|
+
const response = responseOutcome.result;
|
|
869
|
+
if (plan.negotiated && !isWebSocketUpgradeResponse(response)) {
|
|
870
|
+
// handleResponseRoute (callHandlerWithVary) already appends Vary: Accept
|
|
871
|
+
// for negotiated responses; dedup so we don't emit Vary: Accept, Accept.
|
|
872
|
+
appendVaryAccept(response);
|
|
873
|
+
}
|
|
874
|
+
return response;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// SSR setup: kick off in parallel for modes that need HTML rendering.
|
|
878
|
+
// Placed after response-route short-circuit so response/mime routes
|
|
879
|
+
// never pay for SSR work.
|
|
880
|
+
//
|
|
881
|
+
// Only kick off when the request will actually render HTML, so the
|
|
882
|
+
// eager loadSSRModule() + user resolveStreaming() are not started (and
|
|
883
|
+
// never consumed) for a request that returns an RSC stream — that wasted
|
|
884
|
+
// work also leaves an orphaned Promise.all that can reject (D7). PE form
|
|
885
|
+
// submissions always render HTML (handleProgressiveEnhancement renders via
|
|
886
|
+
// getSSRSetup regardless of Accept). For full/partial-render and action,
|
|
887
|
+
// the render-time HTML decision is exactly !isRscRequest — mayNeedSSR is
|
|
888
|
+
// the coarse transport pre-filter, isRscRequest is the precise Accept call
|
|
889
|
+
// (it, unlike mayNeedSSR, treats a MISSING Accept as RSC). Both must pass.
|
|
890
|
+
const willRenderHtml =
|
|
891
|
+
plan.mode === "pe-render" ||
|
|
892
|
+
(mayNeedSSR(request, url) &&
|
|
893
|
+
!isRscRequest(request, url, plan.mode === "partial-render"));
|
|
894
|
+
if (plan.mode !== "loader" && willRenderHtml) {
|
|
895
|
+
variables[SSR_SETUP_VAR] = startSSRSetup(
|
|
896
|
+
handlerCtx,
|
|
897
|
+
request,
|
|
898
|
+
env,
|
|
899
|
+
url,
|
|
900
|
+
router.debugPerformance
|
|
901
|
+
? () => getRequestContext()._metricsStore
|
|
902
|
+
: undefined,
|
|
903
|
+
);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// ---- Loader fetch ----
|
|
907
|
+
if (plan.mode === "loader") {
|
|
908
|
+
return handleLoaderFetch(
|
|
909
|
+
handlerCtx,
|
|
910
|
+
request,
|
|
911
|
+
env,
|
|
912
|
+
url,
|
|
613
913
|
variables,
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
);
|
|
617
|
-
if (progressiveResult) {
|
|
618
|
-
return progressiveResult;
|
|
914
|
+
plan.route.params,
|
|
915
|
+
);
|
|
619
916
|
}
|
|
620
917
|
|
|
621
|
-
//
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
918
|
+
// ---- Progressive enhancement ----
|
|
919
|
+
if (plan.mode === "pe-render") {
|
|
920
|
+
const peResult = await handleProgressiveEnhancement(
|
|
921
|
+
handlerCtx,
|
|
922
|
+
request,
|
|
923
|
+
env,
|
|
924
|
+
url,
|
|
925
|
+
false, // isAction = false for PE
|
|
926
|
+
handleStore,
|
|
927
|
+
nonce,
|
|
928
|
+
{
|
|
929
|
+
routeMiddleware: plan.route.routeMiddleware,
|
|
930
|
+
variables,
|
|
931
|
+
routeReverse,
|
|
932
|
+
},
|
|
933
|
+
);
|
|
934
|
+
if (peResult) return peResult;
|
|
935
|
+
// PE handler returned null (not a PE form) — fall through to render
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// ---- Action: execute action, then revalidate wrapped in route middleware ----
|
|
939
|
+
if (plan.mode === "action") {
|
|
940
|
+
let actionContinuation: ActionContinuation | undefined;
|
|
627
941
|
try {
|
|
942
|
+
// Instrument the action execution as its own phase (action:<actionId> +
|
|
943
|
+
// rango.action), so a POST shows the mutation time AND which action ran,
|
|
944
|
+
// not just the downstream revalidation render. The action's own
|
|
945
|
+
// loaders/fetches nest under rango.action.
|
|
628
946
|
const actionOutcome = await withTimeout(
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
947
|
+
observePhase(PHASES.action(plan.actionId), () =>
|
|
948
|
+
executeServerAction(
|
|
949
|
+
handlerCtx,
|
|
950
|
+
request,
|
|
951
|
+
env,
|
|
952
|
+
url,
|
|
953
|
+
plan.actionId,
|
|
954
|
+
handleStore,
|
|
955
|
+
),
|
|
636
956
|
),
|
|
637
957
|
router.timeouts.actionMs,
|
|
638
958
|
"action",
|
|
@@ -644,8 +964,8 @@ export function createRSCHandler<
|
|
|
644
964
|
url,
|
|
645
965
|
"action",
|
|
646
966
|
actionOutcome.durationMs,
|
|
647
|
-
|
|
648
|
-
actionId,
|
|
967
|
+
plan.route.routeKey,
|
|
968
|
+
plan.actionId,
|
|
649
969
|
);
|
|
650
970
|
}
|
|
651
971
|
const result = actionOutcome.result;
|
|
@@ -657,40 +977,251 @@ export function createRSCHandler<
|
|
|
657
977
|
request,
|
|
658
978
|
url,
|
|
659
979
|
env,
|
|
660
|
-
actionId,
|
|
980
|
+
actionId: plan.actionId,
|
|
661
981
|
handledByBoundary: false,
|
|
662
982
|
});
|
|
663
983
|
console.error(`[RSC] Action error:`, error);
|
|
664
984
|
throw error;
|
|
665
985
|
}
|
|
666
|
-
}
|
|
667
986
|
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
987
|
+
// Revalidation render wrapped in route middleware.
|
|
988
|
+
// Actions from client-side navigation include _rsc_partial — preserve
|
|
989
|
+
// the partial flag so the revalidation returns a Flight stream, not HTML.
|
|
990
|
+
// App-switch is already excluded by classifyRequest (would be full-render).
|
|
991
|
+
const isPartialAction = url.searchParams.has("_rsc_partial");
|
|
992
|
+
return executeRenderWithMiddleware(
|
|
993
|
+
plan.route.routeMiddleware,
|
|
994
|
+
plan.negotiated,
|
|
995
|
+
plan.route.routeKey,
|
|
996
|
+
routeReverse,
|
|
672
997
|
request,
|
|
673
998
|
env,
|
|
674
999
|
url,
|
|
675
1000
|
variables,
|
|
676
1001
|
nonce,
|
|
677
|
-
preview?.params,
|
|
678
|
-
preview?.routeKey,
|
|
679
1002
|
handleStore,
|
|
1003
|
+
isPartialAction,
|
|
680
1004
|
actionContinuation,
|
|
681
1005
|
);
|
|
682
|
-
|
|
683
|
-
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
// Full render, partial render, fallen-through PE, and full-page redirect all
|
|
1009
|
+
// render through the same middleware-wrapped path. Only full/partial-render
|
|
1010
|
+
// carry negotiation + the partial flag; pe/redirect render plainly.
|
|
1011
|
+
const isPartial = plan.mode === "partial-render";
|
|
1012
|
+
const negotiated =
|
|
1013
|
+
plan.mode === "full-render" || plan.mode === "partial-render"
|
|
1014
|
+
? plan.negotiated
|
|
1015
|
+
: false;
|
|
1016
|
+
return executeRenderWithMiddleware(
|
|
1017
|
+
plan.route.routeMiddleware,
|
|
1018
|
+
negotiated,
|
|
1019
|
+
plan.route.routeKey,
|
|
1020
|
+
routeReverse,
|
|
1021
|
+
request,
|
|
1022
|
+
env,
|
|
1023
|
+
url,
|
|
1024
|
+
variables,
|
|
1025
|
+
nonce,
|
|
1026
|
+
handleStore,
|
|
1027
|
+
isPartial,
|
|
1028
|
+
);
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
// Shared render execution: wraps handleRscRendering (or revalidateAfterAction)
|
|
1032
|
+
// in route middleware and timeout handling. Consolidates the pattern used by
|
|
1033
|
+
// action-revalidate, full-render, and partial-render modes.
|
|
1034
|
+
async function executeRenderWithMiddleware(
|
|
1035
|
+
routeMiddleware: import("../router/middleware-types.js").CollectedMiddleware[],
|
|
1036
|
+
negotiated: boolean,
|
|
1037
|
+
routeKey: string,
|
|
1038
|
+
routeReverse: ReturnType<typeof createReverseFunction>,
|
|
1039
|
+
request: Request,
|
|
1040
|
+
env: TEnv,
|
|
1041
|
+
url: URL,
|
|
1042
|
+
variables: Record<string, any>,
|
|
1043
|
+
nonce: string | undefined,
|
|
1044
|
+
handleStore: ReturnType<typeof getRequestContext>["_handleStore"],
|
|
1045
|
+
isPartial: boolean,
|
|
1046
|
+
actionContinuation?: ActionContinuation,
|
|
1047
|
+
): Promise<Response> {
|
|
1048
|
+
const renderHandler = async (): Promise<Response> => {
|
|
1049
|
+
try {
|
|
1050
|
+
let response: Response;
|
|
1051
|
+
if (actionContinuation) {
|
|
1052
|
+
response = await revalidateAfterAction(
|
|
1053
|
+
handlerCtx,
|
|
1054
|
+
request,
|
|
1055
|
+
env,
|
|
1056
|
+
url,
|
|
1057
|
+
handleStore,
|
|
1058
|
+
actionContinuation,
|
|
1059
|
+
);
|
|
1060
|
+
} else {
|
|
1061
|
+
response = await handleRscRendering(
|
|
1062
|
+
handlerCtx,
|
|
1063
|
+
request,
|
|
1064
|
+
env,
|
|
1065
|
+
url,
|
|
1066
|
+
isPartial,
|
|
1067
|
+
handleStore,
|
|
1068
|
+
nonce,
|
|
1069
|
+
);
|
|
1070
|
+
}
|
|
1071
|
+
if (negotiated && !isWebSocketUpgradeResponse(response)) {
|
|
1072
|
+
// handleRscRendering bakes `accept` into the RSC response's Vary list;
|
|
1073
|
+
// dedup so the negotiated append does not list accept twice.
|
|
1074
|
+
appendVaryAccept(response);
|
|
1075
|
+
}
|
|
1076
|
+
return response;
|
|
1077
|
+
} catch (error) {
|
|
1078
|
+
// Check if middleware/handler returned Response
|
|
1079
|
+
if (error instanceof Response) {
|
|
1080
|
+
// An action revalidation render is delivered to the client over the
|
|
1081
|
+
// same Flight-parsing path as a partial navigation, so a Response
|
|
1082
|
+
// thrown during it must be converted exactly like a partial one
|
|
1083
|
+
// (raw 200 -> hard-nav hint, 3xx -> Flight redirect). Without this,
|
|
1084
|
+
// the no-middleware path returns the raw Response (the with-middleware
|
|
1085
|
+
// path is already covered by the isPartial || actionContinuation
|
|
1086
|
+
// guard below).
|
|
1087
|
+
const treatAsPartial = isPartial || actionContinuation != null;
|
|
1088
|
+
|
|
1089
|
+
// During partial (client-side navigation), a 200 Response from a handler
|
|
1090
|
+
// means the route serves raw content (JSON, text, etc.), not JSX.
|
|
1091
|
+
// Signal the browser to hard-navigate so it renders the raw response.
|
|
1092
|
+
if (treatAsPartial && error.status === 200) {
|
|
1093
|
+
console.warn(
|
|
1094
|
+
`[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
|
|
1095
|
+
`Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
|
|
1096
|
+
);
|
|
1097
|
+
return createResponseWithMergedHeaders(null, {
|
|
1098
|
+
status: 200,
|
|
1099
|
+
headers: {
|
|
1100
|
+
"X-RSC-Reload": stripInternalParams(url).toString(),
|
|
1101
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
1102
|
+
},
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
if (treatAsPartial) {
|
|
1107
|
+
const intercepted = interceptRedirectForPartial(
|
|
1108
|
+
error,
|
|
1109
|
+
createRedirectFlightResponse,
|
|
1110
|
+
);
|
|
1111
|
+
if (intercepted) return intercepted;
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
return error;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
// Render 404 page for unmatched routes
|
|
1118
|
+
if (isRouteNotFoundError(error)) {
|
|
1119
|
+
callOnError(error, "routing", {
|
|
1120
|
+
request,
|
|
1121
|
+
url,
|
|
1122
|
+
env,
|
|
1123
|
+
handledByBoundary: true,
|
|
1124
|
+
});
|
|
1125
|
+
|
|
1126
|
+
const notFoundOption = router.notFound;
|
|
1127
|
+
const notFoundComponent =
|
|
1128
|
+
typeof notFoundOption === "function"
|
|
1129
|
+
? notFoundOption({ pathname: url.pathname })
|
|
1130
|
+
: (notFoundOption ?? createElement("h1", null, "Not Found"));
|
|
1131
|
+
|
|
1132
|
+
const notFoundSegment = {
|
|
1133
|
+
id: "notFound",
|
|
1134
|
+
namespace: "notFound",
|
|
1135
|
+
type: "route" as const,
|
|
1136
|
+
index: 0,
|
|
1137
|
+
component: notFoundComponent,
|
|
1138
|
+
params: {},
|
|
1139
|
+
};
|
|
1140
|
+
|
|
1141
|
+
const payload: RscPayload = {
|
|
1142
|
+
metadata: {
|
|
1143
|
+
pathname: url.pathname,
|
|
1144
|
+
routerId: router.id,
|
|
1145
|
+
basename: router.basename,
|
|
1146
|
+
segments: [notFoundSegment],
|
|
1147
|
+
matched: [],
|
|
1148
|
+
diff: [],
|
|
1149
|
+
// Shape parity with buildFullPayload (rsc-rendering.ts): the 404
|
|
1150
|
+
// payload carries params/resolvedIds/prefetchCacheTTL the same way a
|
|
1151
|
+
// matched full render does. resolvedIds mirrors the rendered segment
|
|
1152
|
+
// list (the single notFound segment) like the error-boundary path
|
|
1153
|
+
// (match-api.ts) does for its boundary segment.
|
|
1154
|
+
resolvedIds: [notFoundSegment.id],
|
|
1155
|
+
params: {},
|
|
1156
|
+
isPartial: false,
|
|
1157
|
+
rootLayout: router.rootLayout,
|
|
1158
|
+
// Full (404) render: resolve deferred handle values server-side.
|
|
1159
|
+
handles: resolvedHandleStream(handleStore),
|
|
1160
|
+
version,
|
|
1161
|
+
prefetchCacheTTL: router.prefetchCacheTTL,
|
|
1162
|
+
prefetchCacheSize: router.prefetchCacheSize,
|
|
1163
|
+
prefetchConcurrency: router.prefetchConcurrency,
|
|
1164
|
+
stateCookieName: router.resolvedStateCookieName,
|
|
1165
|
+
themeConfig: router.themeConfig,
|
|
1166
|
+
warmupEnabled: router.warmupEnabled,
|
|
1167
|
+
strictMode: router.strictMode,
|
|
1168
|
+
initialTheme: getRequestContext().theme,
|
|
1169
|
+
},
|
|
1170
|
+
};
|
|
1171
|
+
|
|
1172
|
+
const rscStream = renderToReadableStream(payload, {
|
|
1173
|
+
onError: (error: unknown) => {
|
|
1174
|
+
callOnError(error, "rendering", { request, url, env });
|
|
1175
|
+
},
|
|
1176
|
+
});
|
|
1177
|
+
|
|
1178
|
+
if (isRscRequest(request, url, isPartial)) {
|
|
1179
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
1180
|
+
status: 404,
|
|
1181
|
+
headers: {
|
|
1182
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
1183
|
+
// Router identity for the client's pre-decode integrity check; a
|
|
1184
|
+
// same-app 404 matches and applies in place. See response-adapter.
|
|
1185
|
+
"X-RSC-Router-Id": router.id,
|
|
1186
|
+
},
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
1191
|
+
handlerCtx,
|
|
1192
|
+
request,
|
|
1193
|
+
env,
|
|
1194
|
+
url,
|
|
1195
|
+
getRequestContext()._metricsStore,
|
|
1196
|
+
);
|
|
1197
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
1198
|
+
nonce,
|
|
1199
|
+
streamMode,
|
|
1200
|
+
});
|
|
1201
|
+
|
|
1202
|
+
return createResponseWithMergedHeaders(htmlStream, {
|
|
1203
|
+
status: 404,
|
|
1204
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
1205
|
+
});
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
// Report unhandled errors
|
|
1209
|
+
callOnError(error, "routing", {
|
|
1210
|
+
request,
|
|
1211
|
+
url,
|
|
1212
|
+
env,
|
|
1213
|
+
handledByBoundary: false,
|
|
1214
|
+
});
|
|
1215
|
+
console.error(`[RSC] Error:`, error);
|
|
1216
|
+
throw error;
|
|
684
1217
|
}
|
|
685
|
-
return response;
|
|
686
1218
|
};
|
|
687
1219
|
|
|
688
|
-
// Wrap the render path
|
|
689
|
-
// renderStartMs timeout so slow renders are caught before output.
|
|
1220
|
+
// Wrap the render path in a renderStartMs timeout
|
|
690
1221
|
const executeRender = async (): Promise<Response> => {
|
|
691
|
-
if (
|
|
1222
|
+
if (routeMiddleware.length > 0) {
|
|
692
1223
|
const mwResponse = await executeMiddleware(
|
|
693
|
-
buildRouteMiddlewareEntries<TEnv>(
|
|
1224
|
+
buildRouteMiddlewareEntries<TEnv>(routeMiddleware),
|
|
694
1225
|
request,
|
|
695
1226
|
env,
|
|
696
1227
|
variables,
|
|
@@ -698,10 +1229,7 @@ export function createRSCHandler<
|
|
|
698
1229
|
routeReverse,
|
|
699
1230
|
);
|
|
700
1231
|
|
|
701
|
-
if (
|
|
702
|
-
url.searchParams.has("_rsc_partial") ||
|
|
703
|
-
url.searchParams.has("_rsc_action")
|
|
704
|
-
) {
|
|
1232
|
+
if (isPartial || actionContinuation) {
|
|
705
1233
|
const intercepted = interceptRedirectForPartial(
|
|
706
1234
|
mwResponse,
|
|
707
1235
|
createRedirectFlightResponse,
|
|
@@ -712,7 +1240,6 @@ export function createRSCHandler<
|
|
|
712
1240
|
return finalizeResponse(mwResponse);
|
|
713
1241
|
}
|
|
714
1242
|
|
|
715
|
-
// No route middleware, proceed directly
|
|
716
1243
|
return renderHandler();
|
|
717
1244
|
};
|
|
718
1245
|
|
|
@@ -728,267 +1255,9 @@ export function createRSCHandler<
|
|
|
728
1255
|
url,
|
|
729
1256
|
"render-start",
|
|
730
1257
|
renderOutcome.durationMs,
|
|
731
|
-
|
|
1258
|
+
routeKey,
|
|
732
1259
|
);
|
|
733
1260
|
}
|
|
734
1261
|
return renderOutcome.result;
|
|
735
1262
|
}
|
|
736
|
-
|
|
737
|
-
// Inner request handler: rendering logic wrapped by route middleware.
|
|
738
|
-
// Handles action revalidation (when actionContinuation is present),
|
|
739
|
-
// loader fetches, and regular RSC rendering.
|
|
740
|
-
async function coreRequestHandlerInner(
|
|
741
|
-
request: Request,
|
|
742
|
-
env: TEnv,
|
|
743
|
-
url: URL,
|
|
744
|
-
variables: Record<string, any>,
|
|
745
|
-
nonce: string | undefined,
|
|
746
|
-
routeParams?: Record<string, string>,
|
|
747
|
-
routeKey?: string,
|
|
748
|
-
handleStore?: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
749
|
-
actionContinuation?: ActionContinuation,
|
|
750
|
-
): Promise<Response> {
|
|
751
|
-
const isPartial = url.searchParams.has("_rsc_partial");
|
|
752
|
-
const isAction =
|
|
753
|
-
request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
|
|
754
|
-
|
|
755
|
-
// Version mismatch detection - client may have stale code after HMR/deployment
|
|
756
|
-
// If versions don't match, tell the client to reload
|
|
757
|
-
const clientVersion = url.searchParams.get("_rsc_v");
|
|
758
|
-
if (version && clientVersion && clientVersion !== version) {
|
|
759
|
-
console.log(
|
|
760
|
-
`[RSC] Version mismatch: client=${clientVersion}, server=${version}. Forcing reload.`,
|
|
761
|
-
);
|
|
762
|
-
|
|
763
|
-
// For actions, reload current page (referer) if same origin.
|
|
764
|
-
// For navigation, load the target URL.
|
|
765
|
-
// Validate referer origin to prevent open redirect via crafted header.
|
|
766
|
-
let reloadUrl = stripInternalParams(url).toString();
|
|
767
|
-
if (isAction) {
|
|
768
|
-
const referer = request.headers.get("referer");
|
|
769
|
-
if (referer) {
|
|
770
|
-
try {
|
|
771
|
-
const refererUrl = new URL(referer);
|
|
772
|
-
if (refererUrl.origin === url.origin) {
|
|
773
|
-
reloadUrl = referer;
|
|
774
|
-
}
|
|
775
|
-
} catch {
|
|
776
|
-
// Malformed referer, fall back to cleanUrl
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
// Return special response that tells client to reload
|
|
782
|
-
return createResponseWithMergedHeaders(null, {
|
|
783
|
-
status: 200,
|
|
784
|
-
headers: {
|
|
785
|
-
"X-RSC-Reload": reloadUrl,
|
|
786
|
-
"content-type": "text/x-component;charset=utf-8",
|
|
787
|
-
},
|
|
788
|
-
});
|
|
789
|
-
}
|
|
790
|
-
// Debug manifest endpoint: ?__debug_manifest on any route.
|
|
791
|
-
// Always available in dev, requires allowDebugManifest option in production.
|
|
792
|
-
const isDev = process.env.NODE_ENV !== "production";
|
|
793
|
-
if (
|
|
794
|
-
url.searchParams.has("__debug_manifest") &&
|
|
795
|
-
(isDev || router.allowDebugManifest)
|
|
796
|
-
) {
|
|
797
|
-
const trie = getRouterTrie(router.id) ?? getRouteTrie();
|
|
798
|
-
const routeManifest = getRequiredRouteMap();
|
|
799
|
-
const { extractAncestryFromTrie } =
|
|
800
|
-
await import("../build/route-trie.js");
|
|
801
|
-
return new Response(
|
|
802
|
-
JSON.stringify(
|
|
803
|
-
{
|
|
804
|
-
routerId: router.id,
|
|
805
|
-
routeManifest,
|
|
806
|
-
routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
|
|
807
|
-
routeTrie: trie,
|
|
808
|
-
precomputedEntries: getPrecomputedEntries(),
|
|
809
|
-
},
|
|
810
|
-
null,
|
|
811
|
-
2,
|
|
812
|
-
),
|
|
813
|
-
{
|
|
814
|
-
headers: { "Content-Type": "application/json" },
|
|
815
|
-
},
|
|
816
|
-
);
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
const store = handleStore ?? requireRequestContext()._handleStore;
|
|
820
|
-
|
|
821
|
-
try {
|
|
822
|
-
// Route params were already set in coreRequestHandler, but set again
|
|
823
|
-
// for callers that enter coreRequestHandlerInner directly.
|
|
824
|
-
if (routeParams) {
|
|
825
|
-
setRequestContextParams(routeParams, routeKey);
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
// ============================================================================
|
|
829
|
-
// ACTION REVALIDATION (action already executed, revalidate segments)
|
|
830
|
-
// ============================================================================
|
|
831
|
-
if (actionContinuation) {
|
|
832
|
-
return await revalidateAfterAction(
|
|
833
|
-
handlerCtx,
|
|
834
|
-
request,
|
|
835
|
-
env,
|
|
836
|
-
url,
|
|
837
|
-
store,
|
|
838
|
-
actionContinuation,
|
|
839
|
-
);
|
|
840
|
-
}
|
|
841
|
-
|
|
842
|
-
// ============================================================================
|
|
843
|
-
// LOADER FETCH EXECUTION (data fetching with RSC serialization)
|
|
844
|
-
// ============================================================================
|
|
845
|
-
const isLoaderRequest = url.searchParams.has("_rsc_loader");
|
|
846
|
-
if (isLoaderRequest) {
|
|
847
|
-
return handleLoaderFetch(
|
|
848
|
-
handlerCtx,
|
|
849
|
-
request,
|
|
850
|
-
env,
|
|
851
|
-
url,
|
|
852
|
-
variables,
|
|
853
|
-
routeParams,
|
|
854
|
-
);
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
// ============================================================================
|
|
858
|
-
// REGULAR RSC RENDERING (Navigation)
|
|
859
|
-
// ============================================================================
|
|
860
|
-
// Note: Must use "return await" for try/catch to catch async rejections
|
|
861
|
-
return await handleRscRendering(
|
|
862
|
-
handlerCtx,
|
|
863
|
-
request,
|
|
864
|
-
env,
|
|
865
|
-
url,
|
|
866
|
-
isPartial,
|
|
867
|
-
store,
|
|
868
|
-
nonce,
|
|
869
|
-
);
|
|
870
|
-
} catch (error) {
|
|
871
|
-
// Check if middleware/handler returned Response
|
|
872
|
-
if (error instanceof Response) {
|
|
873
|
-
// During partial (client-side navigation), a 200 Response from a handler
|
|
874
|
-
// means the route serves raw content (JSON, text, etc.), not JSX.
|
|
875
|
-
// Signal the browser to hard-navigate so it renders the raw response.
|
|
876
|
-
// Only for 200 — redirects (3xx) work already because the browser follows
|
|
877
|
-
// them automatically to a URL that serves Flight data.
|
|
878
|
-
if (isPartial && error.status === 200) {
|
|
879
|
-
console.warn(
|
|
880
|
-
`[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
|
|
881
|
-
`Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
|
|
882
|
-
);
|
|
883
|
-
return createResponseWithMergedHeaders(null, {
|
|
884
|
-
status: 200,
|
|
885
|
-
headers: {
|
|
886
|
-
"X-RSC-Reload": stripInternalParams(url).toString(),
|
|
887
|
-
"content-type": "text/x-component;charset=utf-8",
|
|
888
|
-
},
|
|
889
|
-
});
|
|
890
|
-
}
|
|
891
|
-
|
|
892
|
-
if (isPartial) {
|
|
893
|
-
const intercepted = interceptRedirectForPartial(
|
|
894
|
-
error,
|
|
895
|
-
createRedirectFlightResponse,
|
|
896
|
-
);
|
|
897
|
-
if (intercepted) return intercepted;
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
return error;
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
// Render 404 page for unmatched routes
|
|
904
|
-
// Check both instanceof and error.name for cross-bundle compatibility
|
|
905
|
-
const isRouteNotFound =
|
|
906
|
-
error instanceof RouteNotFoundError ||
|
|
907
|
-
(error instanceof Error && error.name === "RouteNotFoundError");
|
|
908
|
-
if (isRouteNotFound) {
|
|
909
|
-
callOnError(error, "routing", {
|
|
910
|
-
request,
|
|
911
|
-
url,
|
|
912
|
-
env,
|
|
913
|
-
handledByBoundary: true, // Handled by notFound component
|
|
914
|
-
});
|
|
915
|
-
|
|
916
|
-
// Get notFound component from router options or use default
|
|
917
|
-
const notFoundOption = router.notFound;
|
|
918
|
-
const notFoundComponent =
|
|
919
|
-
typeof notFoundOption === "function"
|
|
920
|
-
? notFoundOption({ pathname: url.pathname })
|
|
921
|
-
: (notFoundOption ?? createElement("h1", null, "Not Found"));
|
|
922
|
-
|
|
923
|
-
// Create a simple segment for the 404 page
|
|
924
|
-
const notFoundSegment = {
|
|
925
|
-
id: "notFound",
|
|
926
|
-
namespace: "notFound",
|
|
927
|
-
type: "route" as const,
|
|
928
|
-
index: 0,
|
|
929
|
-
component: notFoundComponent,
|
|
930
|
-
params: {},
|
|
931
|
-
};
|
|
932
|
-
|
|
933
|
-
const payload: RscPayload = {
|
|
934
|
-
metadata: {
|
|
935
|
-
pathname: url.pathname,
|
|
936
|
-
segments: [notFoundSegment],
|
|
937
|
-
matched: [],
|
|
938
|
-
diff: [],
|
|
939
|
-
isPartial: false,
|
|
940
|
-
rootLayout: router.rootLayout,
|
|
941
|
-
handles: store.stream(),
|
|
942
|
-
version,
|
|
943
|
-
themeConfig: router.themeConfig,
|
|
944
|
-
warmupEnabled: router.warmupEnabled,
|
|
945
|
-
initialTheme: requireRequestContext().theme,
|
|
946
|
-
// No routeName for not-found routes
|
|
947
|
-
},
|
|
948
|
-
};
|
|
949
|
-
|
|
950
|
-
const rscStream = renderToReadableStream(payload);
|
|
951
|
-
|
|
952
|
-
// Determine if this is an RSC request or HTML request.
|
|
953
|
-
// Partial requests are always RSC (see main isRscRequest comment).
|
|
954
|
-
const isRscRequest =
|
|
955
|
-
isPartial ||
|
|
956
|
-
(!request.headers.get("accept")?.includes("text/html") &&
|
|
957
|
-
!url.searchParams.has("__html")) ||
|
|
958
|
-
url.searchParams.has("__rsc");
|
|
959
|
-
|
|
960
|
-
if (isRscRequest) {
|
|
961
|
-
return createResponseWithMergedHeaders(rscStream, {
|
|
962
|
-
status: 404,
|
|
963
|
-
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
// Delegate to SSR for HTML response
|
|
968
|
-
const [ssrModule, streamMode] = await Promise.all([
|
|
969
|
-
loadSSRModule(),
|
|
970
|
-
handlerCtx.resolveStreamMode(request, env, url),
|
|
971
|
-
]);
|
|
972
|
-
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
973
|
-
nonce,
|
|
974
|
-
streamMode,
|
|
975
|
-
});
|
|
976
|
-
|
|
977
|
-
return createResponseWithMergedHeaders(htmlStream, {
|
|
978
|
-
status: 404,
|
|
979
|
-
headers: { "content-type": "text/html;charset=utf-8" },
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
// Report unhandled errors
|
|
984
|
-
callOnError(error, "routing", {
|
|
985
|
-
request,
|
|
986
|
-
url,
|
|
987
|
-
env,
|
|
988
|
-
handledByBoundary: false,
|
|
989
|
-
});
|
|
990
|
-
console.error(`[RSC] Error:`, error);
|
|
991
|
-
throw error;
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
1263
|
}
|