@rangojs/router 0.0.0-experimental.debug-cache-fix → 0.0.0-experimental.df410dd5
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/README.md +196 -43
- 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 +269 -96
- 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/dist/browser/react/use-client-cache.js +39 -0
- 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/dist/handles/index.js +6 -0
- 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/dist/network-error-thrower.d.ts +17 -0
- 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 +48 -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 +2659 -883
- 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 +57 -11
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +243 -21
- package/skills/caching/SKILL.md +118 -2
- package/skills/composability/SKILL.md +27 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +229 -20
- package/skills/host-router/SKILL.md +45 -20
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +46 -4
- package/skills/layout/SKILL.md +28 -7
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +273 -53
- package/skills/middleware/SKILL.md +49 -12
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +71 -6
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +242 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +66 -9
- package/skills/route/SKILL.md +88 -4
- package/skills/router-setup/SKILL.md +90 -5
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/testing/SKILL.md +776 -0
- package/skills/typesafety/SKILL.md +329 -27
- package/skills/use-cache/SKILL.md +34 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +117 -0
- package/src/__internal.ts +1 -1
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +86 -70
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/navigation-bridge.ts +101 -13
- package/src/browser/navigation-client.ts +125 -53
- package/src/browser/navigation-store.ts +75 -17
- package/src/browser/navigation-transaction.ts +10 -28
- package/src/browser/partial-update.ts +90 -30
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +156 -18
- package/src/browser/prefetch/queue.ts +92 -29
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +72 -8
- package/src/browser/react/NavigationProvider.tsx +83 -33
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +51 -7
- package/src/browser/react/index.ts +3 -0
- package/src/browser/react/location-state-shared.ts +175 -4
- package/src/browser/react/location-state.ts +39 -13
- package/src/browser/react/use-handle.ts +23 -64
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +20 -8
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +43 -10
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/response-adapter.ts +25 -0
- package/src/browser/rsc-router.tsx +87 -22
- package/src/browser/scroll-restoration.ts +29 -19
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +31 -36
- package/src/browser/types.ts +48 -5
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/index.ts +2 -0
- package/src/build/route-trie.ts +52 -25
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +266 -86
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-scope.ts +40 -56
- package/src/cache/cf/cf-cache-store.ts +54 -13
- package/src/cache/taint.ts +55 -0
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +94 -238
- package/src/context-var.ts +72 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +30 -1
- package/src/handle.ts +65 -12
- package/src/host/index.ts +2 -2
- package/src/host/router.ts +129 -57
- package/src/host/types.ts +31 -2
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +140 -20
- package/src/index.rsc.ts +12 -5
- package/src/index.ts +61 -11
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +21 -6
- package/src/loader.ts +3 -10
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +5 -4
- package/src/prerender.ts +141 -80
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/route-content-wrapper.tsx +6 -28
- package/src/route-definition/dsl-helpers.ts +411 -261
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +110 -34
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +9 -1
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +113 -1
- package/src/router/error-handling.ts +1 -1
- package/src/router/handler-context.ts +77 -38
- package/src/router/intercept-resolution.ts +13 -22
- package/src/router/lazy-includes.ts +8 -8
- package/src/router/loader-resolution.ts +174 -22
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +128 -192
- package/src/router/match-handlers.ts +63 -20
- package/src/router/match-middleware/cache-lookup.ts +70 -97
- package/src/router/match-middleware/cache-store.ts +3 -2
- package/src/router/match-middleware/segment-resolution.ts +53 -0
- package/src/router/match-result.ts +103 -4
- package/src/router/metrics.ts +1 -1
- package/src/router/middleware-types.ts +21 -34
- package/src/router/middleware.ts +101 -89
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +101 -17
- package/src/router/prerender-match.ts +110 -10
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +286 -0
- package/src/router/revalidation.ts +58 -2
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-interfaces.ts +77 -28
- package/src/router/router-options.ts +76 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +105 -13
- package/src/router/segment-resolution/helpers.ts +29 -24
- package/src/router/segment-resolution/revalidation.ts +236 -112
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry.ts +99 -0
- package/src/router/trie-matching.ts +18 -13
- package/src/router/types.ts +9 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +86 -22
- package/src/rsc/handler-context.ts +2 -2
- package/src/rsc/handler.ts +440 -381
- package/src/rsc/helpers.ts +91 -43
- package/src/rsc/index.ts +1 -1
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/origin-guard.ts +28 -10
- package/src/rsc/progressive-enhancement.ts +18 -2
- package/src/rsc/response-route-handler.ts +46 -53
- package/src/rsc/rsc-rendering.ts +41 -48
- package/src/rsc/runtime-warnings.ts +9 -10
- package/src/rsc/server-action.ts +25 -37
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +17 -3
- package/src/search-params.ts +4 -4
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +132 -116
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +190 -51
- package/src/server/cookie-store.ts +28 -4
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +195 -57
- package/src/ssr/index.tsx +8 -1
- package/src/static-handler.ts +19 -7
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +440 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +154 -0
- package/src/testing/e2e/index.ts +149 -0
- package/src/testing/e2e/matchers.ts +51 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +306 -0
- package/src/testing/e2e/server.ts +183 -0
- package/src/testing/flight-matchers.ts +104 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +309 -0
- package/src/testing/flight.entry.ts +39 -0
- package/src/testing/flight.ts +197 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +106 -0
- package/src/testing/internal/context.ts +304 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/render-route.tsx +565 -0
- package/src/testing/run-loader.ts +341 -0
- package/src/testing/run-middleware.ts +179 -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 +185 -0
- package/src/types/cache-types.ts +4 -4
- package/src/types/global-namespace.ts +39 -26
- package/src/types/handler-context.ts +103 -67
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +41 -15
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +12 -1
- package/src/types/segments.ts +36 -2
- package/src/urls/include-helper.ts +34 -67
- package/src/urls/index.ts +0 -3
- package/src/urls/path-helper-types.ts +50 -9
- package/src/urls/path-helper.ts +63 -63
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +26 -116
- package/src/urls/urls-function.ts +1 -5
- package/src/use-loader.tsx +487 -44
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +34 -37
- package/src/vite/discovery/discover-routers.ts +105 -51
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +188 -93
- 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 +46 -4
- package/src/vite/discovery/virtual-module-codegen.ts +13 -23
- package/src/vite/index.ts +6 -0
- package/src/vite/plugin-types.ts +126 -4
- package/src/vite/plugins/cjs-to-esm.ts +8 -7
- package/src/vite/plugins/client-ref-dedup.ts +16 -0
- package/src/vite/plugins/client-ref-hashing.ts +28 -5
- 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 +214 -0
- package/src/vite/plugins/expose-action-id.ts +54 -30
- package/src/vite/plugins/expose-id-utils.ts +24 -8
- package/src/vite/plugins/expose-ids/export-analysis.ts +100 -20
- package/src/vite/plugins/expose-ids/handler-transform.ts +12 -35
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -5
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +544 -317
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +88 -26
- package/src/vite/plugins/use-cache-transform.ts +65 -50
- package/src/vite/plugins/version-injector.ts +39 -23
- package/src/vite/plugins/version-plugin.ts +59 -2
- package/src/vite/plugins/virtual-entries.ts +2 -2
- package/src/vite/rango.ts +130 -26
- package/src/vite/router-discovery.ts +920 -129
- package/src/vite/utils/ast-handler-extract.ts +15 -15
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +4 -2
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +21 -5
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +38 -5
- package/src/vite/utils/shared-utils.ts +109 -27
- package/src/browser/action-response-classifier.ts +0 -99
package/src/rsc/handler.ts
CHANGED
|
@@ -8,16 +8,17 @@
|
|
|
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
|
requireRequestContext,
|
|
17
|
+
getRequestContext,
|
|
18
|
+
_getRequestContext,
|
|
17
19
|
createRequestContext,
|
|
18
20
|
} from "../server/request-context.js";
|
|
19
21
|
import * as rscDeps from "@vitejs/plugin-rsc/rsc";
|
|
20
|
-
|
|
21
22
|
import type {
|
|
22
23
|
RscPayload,
|
|
23
24
|
CreateRSCHandlerOptions,
|
|
@@ -30,6 +31,7 @@ import {
|
|
|
30
31
|
interceptRedirectForPartial,
|
|
31
32
|
buildRouteMiddlewareEntries,
|
|
32
33
|
} from "./helpers.js";
|
|
34
|
+
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
33
35
|
import {
|
|
34
36
|
handleResponseRoute,
|
|
35
37
|
type ResponseRouteMatch,
|
|
@@ -55,6 +57,7 @@ import {
|
|
|
55
57
|
getRouterTrie,
|
|
56
58
|
} from "../route-map-builder.js";
|
|
57
59
|
import type { HandlerContext } from "./handler-context.js";
|
|
60
|
+
import type { SegmentCacheStore } from "../cache/types.js";
|
|
58
61
|
import { buildRouterTrieFromUrlpatterns } from "./manifest-init.js";
|
|
59
62
|
import { handleProgressiveEnhancement } from "./progressive-enhancement.js";
|
|
60
63
|
import {
|
|
@@ -63,7 +66,10 @@ import {
|
|
|
63
66
|
type ActionContinuation,
|
|
64
67
|
} from "./server-action.js";
|
|
65
68
|
import { handleLoaderFetch } from "./loader-fetch.js";
|
|
66
|
-
import {
|
|
69
|
+
import {
|
|
70
|
+
checkRequestOrigin,
|
|
71
|
+
ORIGIN_CHECK_PHASE_BY_MODE,
|
|
72
|
+
} from "./origin-guard.js";
|
|
67
73
|
import { handleRscRendering } from "./rsc-rendering.js";
|
|
68
74
|
import {
|
|
69
75
|
withTimeout,
|
|
@@ -80,8 +86,14 @@ import {
|
|
|
80
86
|
startSSRSetup,
|
|
81
87
|
getSSRSetup,
|
|
82
88
|
mayNeedSSR,
|
|
89
|
+
isRscRequest,
|
|
83
90
|
SSR_SETUP_VAR,
|
|
84
91
|
} from "./ssr-setup.js";
|
|
92
|
+
import {
|
|
93
|
+
classifyRequest,
|
|
94
|
+
type RequestPlan,
|
|
95
|
+
type ExecutableRequestPlan,
|
|
96
|
+
} from "../router/request-classification.js";
|
|
85
97
|
|
|
86
98
|
/**
|
|
87
99
|
* Create an RSC request handler.
|
|
@@ -161,10 +173,13 @@ export function createRSCHandler<
|
|
|
161
173
|
phase: ErrorPhase,
|
|
162
174
|
context: Parameters<typeof invokeOnError<TEnv>>[3],
|
|
163
175
|
): void {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
176
|
+
// Guard: abort signal handlers fire asynchronously outside the ALS
|
|
177
|
+
// request scope, so the context may be gone. Skip dedup in that
|
|
178
|
+
// case — the error is from a cancelled stream, not a real failure.
|
|
179
|
+
const reqCtx = _getRequestContext();
|
|
180
|
+
if (error != null && typeof error === "object" && reqCtx) {
|
|
181
|
+
if (reqCtx._reportedErrors.has(error)) return;
|
|
182
|
+
reqCtx._reportedErrors.add(error);
|
|
168
183
|
}
|
|
169
184
|
invokeOnError(router.onError, error, phase, context, "RSC");
|
|
170
185
|
}
|
|
@@ -343,7 +358,7 @@ export function createRSCHandler<
|
|
|
343
358
|
// Resolve cache store configuration
|
|
344
359
|
// Priority: options.cache (handler override) > router.cache (router default)
|
|
345
360
|
// Store is enabled only if: config provided, enabled, and no ?__no_cache query param
|
|
346
|
-
let cacheStore
|
|
361
|
+
let cacheStore: SegmentCacheStore | undefined;
|
|
347
362
|
const cacheOption = options.cache ?? router.cache;
|
|
348
363
|
if (cacheOption && !url.searchParams.has("__no_cache")) {
|
|
349
364
|
const cacheConfig =
|
|
@@ -452,6 +467,9 @@ export function createRSCHandler<
|
|
|
452
467
|
// - Server components during rendering
|
|
453
468
|
// - Error boundaries
|
|
454
469
|
// - Streaming
|
|
470
|
+
// Store basename on request context (scoped per-request via existing ALS)
|
|
471
|
+
requestContext._basename = router.basename;
|
|
472
|
+
|
|
455
473
|
return runWithRequestContext(requestContext, async () => {
|
|
456
474
|
// Core handler logic (wrapped by middleware)
|
|
457
475
|
const coreHandler = async (): Promise<Response> => {
|
|
@@ -521,13 +539,17 @@ export function createRSCHandler<
|
|
|
521
539
|
}
|
|
522
540
|
|
|
523
541
|
const fullTiming = timingParts.join(", ");
|
|
524
|
-
if (fullTiming
|
|
542
|
+
if (fullTiming && !isWebSocketUpgradeResponse(response)) {
|
|
543
|
+
response.headers.set("Server-Timing", fullTiming);
|
|
544
|
+
}
|
|
525
545
|
|
|
526
546
|
return response;
|
|
527
547
|
});
|
|
528
548
|
};
|
|
529
549
|
|
|
530
|
-
// Core request handling logic (separated for middleware wrapping)
|
|
550
|
+
// Core request handling logic (separated for middleware wrapping).
|
|
551
|
+
// Uses the classify → execute model: classifyRequest produces a RequestPlan,
|
|
552
|
+
// then execution dispatches on the plan mode.
|
|
531
553
|
async function coreRequestHandler(
|
|
532
554
|
request: Request,
|
|
533
555
|
env: TEnv,
|
|
@@ -535,71 +557,102 @@ export function createRSCHandler<
|
|
|
535
557
|
variables: Record<string, any>,
|
|
536
558
|
nonce: string | undefined,
|
|
537
559
|
): Promise<Response> {
|
|
538
|
-
const previewStart = performance.now();
|
|
539
|
-
const preview = await router.previewMatch(request, { env });
|
|
540
|
-
const previewDur = performance.now() - previewStart;
|
|
541
560
|
const handlerTiming: string[] = variables.__handlerTiming || [];
|
|
542
|
-
|
|
543
|
-
//
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
561
|
+
|
|
562
|
+
// Debug manifest endpoint: handled before classification since it
|
|
563
|
+
// doesn't need a route match and needs trie access from the closure.
|
|
564
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
565
|
+
if (
|
|
566
|
+
url.searchParams.has("__debug_manifest") &&
|
|
567
|
+
(isDev || router.allowDebugManifest)
|
|
568
|
+
) {
|
|
569
|
+
const trie = getRouterTrie(router.id) ?? getRouteTrie();
|
|
570
|
+
const routeManifest = getRequiredRouteMap();
|
|
571
|
+
const { extractAncestryFromTrie } =
|
|
572
|
+
await import("../build/route-trie.js");
|
|
573
|
+
return new Response(
|
|
574
|
+
JSON.stringify(
|
|
575
|
+
{
|
|
576
|
+
routerId: router.id,
|
|
577
|
+
routeManifest,
|
|
578
|
+
routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
|
|
579
|
+
routeTrie: trie,
|
|
580
|
+
precomputedEntries: getPrecomputedEntries(),
|
|
581
|
+
},
|
|
582
|
+
null,
|
|
583
|
+
2,
|
|
553
584
|
),
|
|
554
|
-
|
|
555
|
-
|
|
585
|
+
{
|
|
586
|
+
headers: { "Content-Type": "application/json" },
|
|
587
|
+
},
|
|
556
588
|
);
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// ---- 1. Classify ----
|
|
592
|
+
// classifyRequest may throw RouteNotFoundError for unknown routes.
|
|
593
|
+
// In that case, fall through to a full-render plan so the pipeline
|
|
594
|
+
// can render the 404 page via the existing error handling path.
|
|
595
|
+
const classifyStart = performance.now();
|
|
596
|
+
let plan: RequestPlan<TEnv>;
|
|
597
|
+
try {
|
|
598
|
+
plan = await classifyRequest<TEnv>(request, url, {
|
|
599
|
+
findMatch: router.findMatch,
|
|
600
|
+
routerVersion: version,
|
|
601
|
+
routerId: router.id,
|
|
602
|
+
});
|
|
603
|
+
} catch (error) {
|
|
604
|
+
if (isRouteNotFoundError(error)) {
|
|
605
|
+
// Let the render path handle 404 — match()/matchPartial() will
|
|
606
|
+
// re-throw RouteNotFoundError and the catch block in
|
|
607
|
+
// executeRenderWithMiddleware renders the not-found page.
|
|
608
|
+
plan = {
|
|
609
|
+
mode: "full-render",
|
|
610
|
+
route: {
|
|
611
|
+
matched: null as any,
|
|
612
|
+
manifestEntry: null as any,
|
|
613
|
+
entries: [],
|
|
614
|
+
routeKey: "",
|
|
615
|
+
localRouteName: "",
|
|
616
|
+
params: {},
|
|
617
|
+
routeMiddleware: [],
|
|
618
|
+
cacheScope: null,
|
|
619
|
+
isPassthrough: false,
|
|
620
|
+
},
|
|
621
|
+
negotiated: false,
|
|
622
|
+
};
|
|
623
|
+
} else {
|
|
624
|
+
throw error;
|
|
566
625
|
}
|
|
567
|
-
|
|
626
|
+
}
|
|
627
|
+
const classifyDur = performance.now() - classifyStart;
|
|
628
|
+
handlerTiming.push(`handler-classify;dur=${classifyDur.toFixed(2)}`);
|
|
629
|
+
|
|
630
|
+
// ---- 2. Terminal plans (no execution needed) ----
|
|
631
|
+
if (plan.mode === "redirect") {
|
|
632
|
+
// Redirects are handled by the pipeline (match/matchPartial),
|
|
633
|
+
// but for partial requests we short-circuit with a Flight redirect.
|
|
634
|
+
if (url.searchParams.has("_rsc_partial")) {
|
|
635
|
+
return createRedirectFlightResponse(plan.redirectUrl);
|
|
636
|
+
}
|
|
637
|
+
// Full requests: let the pipeline handle the redirect via match()
|
|
638
|
+
// which returns { redirect: url }. Fall through to full-render.
|
|
568
639
|
}
|
|
569
640
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
if (mayNeedSSR(request, url)) {
|
|
574
|
-
variables[SSR_SETUP_VAR] = startSSRSetup(
|
|
575
|
-
handlerCtx,
|
|
576
|
-
request,
|
|
577
|
-
env,
|
|
578
|
-
url,
|
|
579
|
-
router.debugPerformance
|
|
580
|
-
? () => requireRequestContext()._metricsStore
|
|
581
|
-
: undefined,
|
|
641
|
+
if (plan.mode === "version-mismatch") {
|
|
642
|
+
console.log(
|
|
643
|
+
`[RSC] Version mismatch: client=${url.searchParams.get("_rsc_v")}, server=${version}. Forcing reload.`,
|
|
582
644
|
);
|
|
645
|
+
return createResponseWithMergedHeaders(null, {
|
|
646
|
+
status: 200,
|
|
647
|
+
headers: {
|
|
648
|
+
"X-RSC-Reload": plan.reloadUrl,
|
|
649
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
650
|
+
},
|
|
651
|
+
});
|
|
583
652
|
}
|
|
584
653
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
const isAction =
|
|
588
|
-
request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
|
|
589
|
-
const isLoaderFetch = url.searchParams.has("_rsc_loader");
|
|
590
|
-
const actionId =
|
|
591
|
-
request.headers.get("rsc-action") || url.searchParams.get("_rsc_action");
|
|
592
|
-
|
|
593
|
-
// Origin guard: reject cross-origin actions, loader fetches, and
|
|
594
|
-
// PE form submissions before any execution. Regular page navigations
|
|
595
|
-
// (GET without _rsc_loader/_rsc_action) are not affected.
|
|
596
|
-
const originPhase: OriginCheckPhase | null = isAction
|
|
597
|
-
? "action"
|
|
598
|
-
: isLoaderFetch
|
|
599
|
-
? "loader"
|
|
600
|
-
: request.method === "POST"
|
|
601
|
-
? "pe-form"
|
|
602
|
-
: null;
|
|
654
|
+
// ---- 3. Origin guard (gate for action/loader/PE modes) ----
|
|
655
|
+
const originPhase = ORIGIN_CHECK_PHASE_BY_MODE[plan.mode];
|
|
603
656
|
if (originPhase) {
|
|
604
657
|
const originResult = await checkRequestOrigin(
|
|
605
658
|
request,
|
|
@@ -649,13 +702,33 @@ export function createRSCHandler<
|
|
|
649
702
|
}
|
|
650
703
|
}
|
|
651
704
|
|
|
652
|
-
//
|
|
705
|
+
// ---- 4. Execute ----
|
|
706
|
+
return executeRequest(
|
|
707
|
+
plan as ExecutableRequestPlan<TEnv>,
|
|
708
|
+
request,
|
|
709
|
+
env,
|
|
710
|
+
url,
|
|
711
|
+
variables,
|
|
712
|
+
nonce,
|
|
713
|
+
);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// Execute a classified request plan. Dispatches to the appropriate handler
|
|
717
|
+
// based on plan.mode. Lives in the createRSCHandler closure for access to
|
|
718
|
+
// handlerCtx, router, callOnError, etc.
|
|
719
|
+
// Only receives executable plans (version-mismatch is handled above).
|
|
720
|
+
async function executeRequest(
|
|
721
|
+
plan: ExecutableRequestPlan<TEnv>,
|
|
722
|
+
request: Request,
|
|
723
|
+
env: TEnv,
|
|
724
|
+
url: URL,
|
|
725
|
+
variables: Record<string, any>,
|
|
726
|
+
nonce: string | undefined,
|
|
727
|
+
): Promise<Response> {
|
|
728
|
+
// Common setup
|
|
653
729
|
const handleStore = requireRequestContext()._handleStore;
|
|
654
730
|
|
|
655
731
|
// Wire up error reporting for late streaming-handle failures
|
|
656
|
-
// (LateHandlePushError: handle pushed after stream completion).
|
|
657
|
-
// Without this, these errors are only caught by React's error boundary
|
|
658
|
-
// and never reach the router's onError callback or telemetry.
|
|
659
732
|
handleStore.onError = (error: Error) => {
|
|
660
733
|
const reqCtx = requireRequestContext();
|
|
661
734
|
callOnError(error, "handler", {
|
|
@@ -685,37 +758,106 @@ export function createRSCHandler<
|
|
|
685
758
|
};
|
|
686
759
|
|
|
687
760
|
// Set route params early so all execution paths can access ctx.params.
|
|
688
|
-
|
|
689
|
-
|
|
761
|
+
// Also store the classified snapshot so match/matchPartial can reuse it
|
|
762
|
+
// instead of calling resolveRoute again.
|
|
763
|
+
if (plan.mode !== "redirect") {
|
|
764
|
+
setRequestContextParams(plan.route.params, plan.route.routeKey);
|
|
765
|
+
requireRequestContext()._classifiedRoute = plan.route;
|
|
690
766
|
}
|
|
691
767
|
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
//
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
routeMiddleware:
|
|
768
|
+
const routeReverse = createReverseFunction(getRequiredRouteMap());
|
|
769
|
+
|
|
770
|
+
// ---- Response route: skip entire RSC pipeline ----
|
|
771
|
+
if (plan.mode === "response") {
|
|
772
|
+
// Build ResponseRouteMatch from plan fields. handleResponseRoute
|
|
773
|
+
// expects a flat object with params at the top level.
|
|
774
|
+
const responseMatch: ResponseRouteMatch = {
|
|
775
|
+
responseType: plan.responseType,
|
|
776
|
+
handler: plan.handler,
|
|
777
|
+
params: plan.route.params,
|
|
778
|
+
negotiated: plan.negotiated,
|
|
779
|
+
manifestEntry: plan.manifestEntry,
|
|
780
|
+
routeMiddleware: plan.routeMiddleware,
|
|
781
|
+
};
|
|
782
|
+
const responseOutcome = await withTimeout(
|
|
783
|
+
handleResponseRoute(
|
|
784
|
+
handlerCtx,
|
|
785
|
+
responseMatch,
|
|
786
|
+
request,
|
|
787
|
+
env,
|
|
788
|
+
url,
|
|
789
|
+
variables,
|
|
790
|
+
),
|
|
791
|
+
router.timeouts.renderStartMs,
|
|
792
|
+
"render-start",
|
|
793
|
+
);
|
|
794
|
+
if (responseOutcome.timedOut) {
|
|
795
|
+
return handleTimeoutResponse(
|
|
796
|
+
request,
|
|
797
|
+
env,
|
|
798
|
+
url,
|
|
799
|
+
"render-start",
|
|
800
|
+
responseOutcome.durationMs,
|
|
801
|
+
plan.route.routeKey,
|
|
802
|
+
);
|
|
803
|
+
}
|
|
804
|
+
const response = responseOutcome.result;
|
|
805
|
+
if (plan.negotiated && !isWebSocketUpgradeResponse(response)) {
|
|
806
|
+
response.headers.append("Vary", "Accept");
|
|
807
|
+
}
|
|
808
|
+
return response;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
// SSR setup: kick off in parallel for modes that need HTML rendering.
|
|
812
|
+
// Placed after response-route short-circuit so response/mime routes
|
|
813
|
+
// never pay for SSR work.
|
|
814
|
+
if (plan.mode !== "loader" && mayNeedSSR(request, url)) {
|
|
815
|
+
variables[SSR_SETUP_VAR] = startSSRSetup(
|
|
816
|
+
handlerCtx,
|
|
817
|
+
request,
|
|
818
|
+
env,
|
|
819
|
+
url,
|
|
820
|
+
router.debugPerformance
|
|
821
|
+
? () => requireRequestContext()._metricsStore
|
|
822
|
+
: undefined,
|
|
823
|
+
);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
// ---- Loader fetch ----
|
|
827
|
+
if (plan.mode === "loader") {
|
|
828
|
+
return handleLoaderFetch(
|
|
829
|
+
handlerCtx,
|
|
830
|
+
request,
|
|
831
|
+
env,
|
|
832
|
+
url,
|
|
705
833
|
variables,
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
);
|
|
709
|
-
if (progressiveResult) {
|
|
710
|
-
return progressiveResult;
|
|
834
|
+
plan.route.params,
|
|
835
|
+
);
|
|
711
836
|
}
|
|
712
837
|
|
|
713
|
-
//
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
838
|
+
// ---- Progressive enhancement ----
|
|
839
|
+
if (plan.mode === "pe-render") {
|
|
840
|
+
const peResult = await handleProgressiveEnhancement(
|
|
841
|
+
handlerCtx,
|
|
842
|
+
request,
|
|
843
|
+
env,
|
|
844
|
+
url,
|
|
845
|
+
false, // isAction = false for PE
|
|
846
|
+
handleStore,
|
|
847
|
+
nonce,
|
|
848
|
+
{
|
|
849
|
+
routeMiddleware: plan.route.routeMiddleware,
|
|
850
|
+
variables,
|
|
851
|
+
routeReverse,
|
|
852
|
+
},
|
|
853
|
+
);
|
|
854
|
+
if (peResult) return peResult;
|
|
855
|
+
// PE handler returned null (not a PE form) — fall through to render
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// ---- Action: execute action, then revalidate wrapped in route middleware ----
|
|
859
|
+
if (plan.mode === "action") {
|
|
860
|
+
let actionContinuation: ActionContinuation | undefined;
|
|
719
861
|
try {
|
|
720
862
|
const actionOutcome = await withTimeout(
|
|
721
863
|
executeServerAction(
|
|
@@ -723,7 +865,7 @@ export function createRSCHandler<
|
|
|
723
865
|
request,
|
|
724
866
|
env,
|
|
725
867
|
url,
|
|
726
|
-
actionId,
|
|
868
|
+
plan.actionId,
|
|
727
869
|
handleStore,
|
|
728
870
|
),
|
|
729
871
|
router.timeouts.actionMs,
|
|
@@ -736,8 +878,8 @@ export function createRSCHandler<
|
|
|
736
878
|
url,
|
|
737
879
|
"action",
|
|
738
880
|
actionOutcome.durationMs,
|
|
739
|
-
|
|
740
|
-
actionId,
|
|
881
|
+
plan.route.routeKey,
|
|
882
|
+
plan.actionId,
|
|
741
883
|
);
|
|
742
884
|
}
|
|
743
885
|
const result = actionOutcome.result;
|
|
@@ -749,40 +891,222 @@ export function createRSCHandler<
|
|
|
749
891
|
request,
|
|
750
892
|
url,
|
|
751
893
|
env,
|
|
752
|
-
actionId,
|
|
894
|
+
actionId: plan.actionId,
|
|
753
895
|
handledByBoundary: false,
|
|
754
896
|
});
|
|
755
897
|
console.error(`[RSC] Action error:`, error);
|
|
756
898
|
throw error;
|
|
757
899
|
}
|
|
758
|
-
}
|
|
759
900
|
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
901
|
+
// Revalidation render wrapped in route middleware.
|
|
902
|
+
// Actions from client-side navigation include _rsc_partial — preserve
|
|
903
|
+
// the partial flag so the revalidation returns a Flight stream, not HTML.
|
|
904
|
+
// App-switch is already excluded by classifyRequest (would be full-render).
|
|
905
|
+
const isPartialAction = url.searchParams.has("_rsc_partial");
|
|
906
|
+
return executeRenderWithMiddleware(
|
|
907
|
+
plan.route.routeMiddleware,
|
|
908
|
+
plan.negotiated,
|
|
909
|
+
plan.route.routeKey,
|
|
910
|
+
routeReverse,
|
|
764
911
|
request,
|
|
765
912
|
env,
|
|
766
913
|
url,
|
|
767
914
|
variables,
|
|
768
915
|
nonce,
|
|
769
|
-
preview?.params,
|
|
770
|
-
preview?.routeKey,
|
|
771
916
|
handleStore,
|
|
917
|
+
isPartialAction,
|
|
772
918
|
actionContinuation,
|
|
773
919
|
);
|
|
774
|
-
|
|
775
|
-
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
// Full render, partial render, fallen-through PE, and full-page redirect all
|
|
923
|
+
// render through the same middleware-wrapped path. Only full/partial-render
|
|
924
|
+
// carry negotiation + the partial flag; pe/redirect render plainly.
|
|
925
|
+
const isPartial = plan.mode === "partial-render";
|
|
926
|
+
const negotiated =
|
|
927
|
+
plan.mode === "full-render" || plan.mode === "partial-render"
|
|
928
|
+
? plan.negotiated
|
|
929
|
+
: false;
|
|
930
|
+
return executeRenderWithMiddleware(
|
|
931
|
+
plan.route.routeMiddleware,
|
|
932
|
+
negotiated,
|
|
933
|
+
plan.route.routeKey,
|
|
934
|
+
routeReverse,
|
|
935
|
+
request,
|
|
936
|
+
env,
|
|
937
|
+
url,
|
|
938
|
+
variables,
|
|
939
|
+
nonce,
|
|
940
|
+
handleStore,
|
|
941
|
+
isPartial,
|
|
942
|
+
);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// Shared render execution: wraps handleRscRendering (or revalidateAfterAction)
|
|
946
|
+
// in route middleware and timeout handling. Consolidates the pattern used by
|
|
947
|
+
// action-revalidate, full-render, and partial-render modes.
|
|
948
|
+
async function executeRenderWithMiddleware(
|
|
949
|
+
routeMiddleware: import("../router/middleware-types.js").CollectedMiddleware[],
|
|
950
|
+
negotiated: boolean,
|
|
951
|
+
routeKey: string,
|
|
952
|
+
routeReverse: ReturnType<typeof createReverseFunction>,
|
|
953
|
+
request: Request,
|
|
954
|
+
env: TEnv,
|
|
955
|
+
url: URL,
|
|
956
|
+
variables: Record<string, any>,
|
|
957
|
+
nonce: string | undefined,
|
|
958
|
+
handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
959
|
+
isPartial: boolean,
|
|
960
|
+
actionContinuation?: ActionContinuation,
|
|
961
|
+
): Promise<Response> {
|
|
962
|
+
const renderHandler = async (): Promise<Response> => {
|
|
963
|
+
try {
|
|
964
|
+
let response: Response;
|
|
965
|
+
if (actionContinuation) {
|
|
966
|
+
response = await revalidateAfterAction(
|
|
967
|
+
handlerCtx,
|
|
968
|
+
request,
|
|
969
|
+
env,
|
|
970
|
+
url,
|
|
971
|
+
handleStore,
|
|
972
|
+
actionContinuation,
|
|
973
|
+
);
|
|
974
|
+
} else {
|
|
975
|
+
response = await handleRscRendering(
|
|
976
|
+
handlerCtx,
|
|
977
|
+
request,
|
|
978
|
+
env,
|
|
979
|
+
url,
|
|
980
|
+
isPartial,
|
|
981
|
+
handleStore,
|
|
982
|
+
nonce,
|
|
983
|
+
);
|
|
984
|
+
}
|
|
985
|
+
if (negotiated && !isWebSocketUpgradeResponse(response)) {
|
|
986
|
+
response.headers.append("Vary", "Accept");
|
|
987
|
+
}
|
|
988
|
+
return response;
|
|
989
|
+
} catch (error) {
|
|
990
|
+
// Check if middleware/handler returned Response
|
|
991
|
+
if (error instanceof Response) {
|
|
992
|
+
// During partial (client-side navigation), a 200 Response from a handler
|
|
993
|
+
// means the route serves raw content (JSON, text, etc.), not JSX.
|
|
994
|
+
// Signal the browser to hard-navigate so it renders the raw response.
|
|
995
|
+
if (isPartial && error.status === 200) {
|
|
996
|
+
console.warn(
|
|
997
|
+
`[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
|
|
998
|
+
`Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
|
|
999
|
+
);
|
|
1000
|
+
return createResponseWithMergedHeaders(null, {
|
|
1001
|
+
status: 200,
|
|
1002
|
+
headers: {
|
|
1003
|
+
"X-RSC-Reload": stripInternalParams(url).toString(),
|
|
1004
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
1005
|
+
},
|
|
1006
|
+
});
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
if (isPartial) {
|
|
1010
|
+
const intercepted = interceptRedirectForPartial(
|
|
1011
|
+
error,
|
|
1012
|
+
createRedirectFlightResponse,
|
|
1013
|
+
);
|
|
1014
|
+
if (intercepted) return intercepted;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
return error;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
// Render 404 page for unmatched routes
|
|
1021
|
+
if (isRouteNotFoundError(error)) {
|
|
1022
|
+
callOnError(error, "routing", {
|
|
1023
|
+
request,
|
|
1024
|
+
url,
|
|
1025
|
+
env,
|
|
1026
|
+
handledByBoundary: true,
|
|
1027
|
+
});
|
|
1028
|
+
|
|
1029
|
+
const notFoundOption = router.notFound;
|
|
1030
|
+
const notFoundComponent =
|
|
1031
|
+
typeof notFoundOption === "function"
|
|
1032
|
+
? notFoundOption({ pathname: url.pathname })
|
|
1033
|
+
: (notFoundOption ?? createElement("h1", null, "Not Found"));
|
|
1034
|
+
|
|
1035
|
+
const notFoundSegment = {
|
|
1036
|
+
id: "notFound",
|
|
1037
|
+
namespace: "notFound",
|
|
1038
|
+
type: "route" as const,
|
|
1039
|
+
index: 0,
|
|
1040
|
+
component: notFoundComponent,
|
|
1041
|
+
params: {},
|
|
1042
|
+
};
|
|
1043
|
+
|
|
1044
|
+
const payload: RscPayload = {
|
|
1045
|
+
metadata: {
|
|
1046
|
+
pathname: url.pathname,
|
|
1047
|
+
routerId: router.id,
|
|
1048
|
+
basename: router.basename,
|
|
1049
|
+
segments: [notFoundSegment],
|
|
1050
|
+
matched: [],
|
|
1051
|
+
diff: [],
|
|
1052
|
+
isPartial: false,
|
|
1053
|
+
rootLayout: router.rootLayout,
|
|
1054
|
+
handles: handleStore.stream(),
|
|
1055
|
+
version,
|
|
1056
|
+
themeConfig: router.themeConfig,
|
|
1057
|
+
warmupEnabled: router.warmupEnabled,
|
|
1058
|
+
initialTheme: requireRequestContext().theme,
|
|
1059
|
+
},
|
|
1060
|
+
};
|
|
1061
|
+
|
|
1062
|
+
const rscStream = renderToReadableStream(payload, {
|
|
1063
|
+
onError: (error: unknown) => {
|
|
1064
|
+
callOnError(error, "rendering", { request, url, env });
|
|
1065
|
+
},
|
|
1066
|
+
});
|
|
1067
|
+
|
|
1068
|
+
if (isRscRequest(request, url, isPartial)) {
|
|
1069
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
1070
|
+
status: 404,
|
|
1071
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
1072
|
+
});
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
1076
|
+
handlerCtx,
|
|
1077
|
+
request,
|
|
1078
|
+
env,
|
|
1079
|
+
url,
|
|
1080
|
+
requireRequestContext()._metricsStore,
|
|
1081
|
+
);
|
|
1082
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
1083
|
+
nonce,
|
|
1084
|
+
streamMode,
|
|
1085
|
+
});
|
|
1086
|
+
|
|
1087
|
+
return createResponseWithMergedHeaders(htmlStream, {
|
|
1088
|
+
status: 404,
|
|
1089
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
1090
|
+
});
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// Report unhandled errors
|
|
1094
|
+
callOnError(error, "routing", {
|
|
1095
|
+
request,
|
|
1096
|
+
url,
|
|
1097
|
+
env,
|
|
1098
|
+
handledByBoundary: false,
|
|
1099
|
+
});
|
|
1100
|
+
console.error(`[RSC] Error:`, error);
|
|
1101
|
+
throw error;
|
|
776
1102
|
}
|
|
777
|
-
return response;
|
|
778
1103
|
};
|
|
779
1104
|
|
|
780
|
-
// Wrap the render path
|
|
781
|
-
// renderStartMs timeout so slow renders are caught before output.
|
|
1105
|
+
// Wrap the render path in a renderStartMs timeout
|
|
782
1106
|
const executeRender = async (): Promise<Response> => {
|
|
783
|
-
if (
|
|
1107
|
+
if (routeMiddleware.length > 0) {
|
|
784
1108
|
const mwResponse = await executeMiddleware(
|
|
785
|
-
buildRouteMiddlewareEntries<TEnv>(
|
|
1109
|
+
buildRouteMiddlewareEntries<TEnv>(routeMiddleware),
|
|
786
1110
|
request,
|
|
787
1111
|
env,
|
|
788
1112
|
variables,
|
|
@@ -790,10 +1114,7 @@ export function createRSCHandler<
|
|
|
790
1114
|
routeReverse,
|
|
791
1115
|
);
|
|
792
1116
|
|
|
793
|
-
if (
|
|
794
|
-
url.searchParams.has("_rsc_partial") ||
|
|
795
|
-
url.searchParams.has("_rsc_action")
|
|
796
|
-
) {
|
|
1117
|
+
if (isPartial || actionContinuation) {
|
|
797
1118
|
const intercepted = interceptRedirectForPartial(
|
|
798
1119
|
mwResponse,
|
|
799
1120
|
createRedirectFlightResponse,
|
|
@@ -804,7 +1125,6 @@ export function createRSCHandler<
|
|
|
804
1125
|
return finalizeResponse(mwResponse);
|
|
805
1126
|
}
|
|
806
1127
|
|
|
807
|
-
// No route middleware, proceed directly
|
|
808
1128
|
return renderHandler();
|
|
809
1129
|
};
|
|
810
1130
|
|
|
@@ -820,270 +1140,9 @@ export function createRSCHandler<
|
|
|
820
1140
|
url,
|
|
821
1141
|
"render-start",
|
|
822
1142
|
renderOutcome.durationMs,
|
|
823
|
-
|
|
1143
|
+
routeKey,
|
|
824
1144
|
);
|
|
825
1145
|
}
|
|
826
1146
|
return renderOutcome.result;
|
|
827
1147
|
}
|
|
828
|
-
|
|
829
|
-
// Inner request handler: rendering logic wrapped by route middleware.
|
|
830
|
-
// Handles action revalidation (when actionContinuation is present),
|
|
831
|
-
// loader fetches, and regular RSC rendering.
|
|
832
|
-
async function coreRequestHandlerInner(
|
|
833
|
-
request: Request,
|
|
834
|
-
env: TEnv,
|
|
835
|
-
url: URL,
|
|
836
|
-
variables: Record<string, any>,
|
|
837
|
-
nonce: string | undefined,
|
|
838
|
-
routeParams?: Record<string, string>,
|
|
839
|
-
routeKey?: string,
|
|
840
|
-
handleStore?: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
841
|
-
actionContinuation?: ActionContinuation,
|
|
842
|
-
): Promise<Response> {
|
|
843
|
-
const isPartial = url.searchParams.has("_rsc_partial");
|
|
844
|
-
const isAction =
|
|
845
|
-
request.headers.has("rsc-action") || url.searchParams.has("_rsc_action");
|
|
846
|
-
|
|
847
|
-
// Version mismatch detection - client may have stale code after HMR/deployment
|
|
848
|
-
// If versions don't match, tell the client to reload
|
|
849
|
-
const clientVersion = url.searchParams.get("_rsc_v");
|
|
850
|
-
if (version && clientVersion && clientVersion !== version) {
|
|
851
|
-
console.log(
|
|
852
|
-
`[RSC] Version mismatch: client=${clientVersion}, server=${version}. Forcing reload.`,
|
|
853
|
-
);
|
|
854
|
-
|
|
855
|
-
// For actions, reload current page (referer) if same origin.
|
|
856
|
-
// For navigation, load the target URL.
|
|
857
|
-
// Validate referer origin to prevent open redirect via crafted header.
|
|
858
|
-
let reloadUrl = stripInternalParams(url).toString();
|
|
859
|
-
if (isAction) {
|
|
860
|
-
const referer = request.headers.get("referer");
|
|
861
|
-
if (referer) {
|
|
862
|
-
try {
|
|
863
|
-
const refererUrl = new URL(referer);
|
|
864
|
-
if (refererUrl.origin === url.origin) {
|
|
865
|
-
reloadUrl = referer;
|
|
866
|
-
}
|
|
867
|
-
} catch {
|
|
868
|
-
// Malformed referer, fall back to cleanUrl
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
// Return special response that tells client to reload
|
|
874
|
-
return createResponseWithMergedHeaders(null, {
|
|
875
|
-
status: 200,
|
|
876
|
-
headers: {
|
|
877
|
-
"X-RSC-Reload": reloadUrl,
|
|
878
|
-
"content-type": "text/x-component;charset=utf-8",
|
|
879
|
-
},
|
|
880
|
-
});
|
|
881
|
-
}
|
|
882
|
-
// Debug manifest endpoint: ?__debug_manifest on any route.
|
|
883
|
-
// Always available in dev, requires allowDebugManifest option in production.
|
|
884
|
-
const isDev = process.env.NODE_ENV !== "production";
|
|
885
|
-
if (
|
|
886
|
-
url.searchParams.has("__debug_manifest") &&
|
|
887
|
-
(isDev || router.allowDebugManifest)
|
|
888
|
-
) {
|
|
889
|
-
const trie = getRouterTrie(router.id) ?? getRouteTrie();
|
|
890
|
-
const routeManifest = getRequiredRouteMap();
|
|
891
|
-
const { extractAncestryFromTrie } =
|
|
892
|
-
await import("../build/route-trie.js");
|
|
893
|
-
return new Response(
|
|
894
|
-
JSON.stringify(
|
|
895
|
-
{
|
|
896
|
-
routerId: router.id,
|
|
897
|
-
routeManifest,
|
|
898
|
-
routeAncestry: trie ? extractAncestryFromTrie(trie) : {},
|
|
899
|
-
routeTrie: trie,
|
|
900
|
-
precomputedEntries: getPrecomputedEntries(),
|
|
901
|
-
},
|
|
902
|
-
null,
|
|
903
|
-
2,
|
|
904
|
-
),
|
|
905
|
-
{
|
|
906
|
-
headers: { "Content-Type": "application/json" },
|
|
907
|
-
},
|
|
908
|
-
);
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
const store = handleStore ?? requireRequestContext()._handleStore;
|
|
912
|
-
|
|
913
|
-
try {
|
|
914
|
-
// Route params were already set in coreRequestHandler, but set again
|
|
915
|
-
// for callers that enter coreRequestHandlerInner directly.
|
|
916
|
-
if (routeParams) {
|
|
917
|
-
setRequestContextParams(routeParams, routeKey);
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
// ============================================================================
|
|
921
|
-
// ACTION REVALIDATION (action already executed, revalidate segments)
|
|
922
|
-
// ============================================================================
|
|
923
|
-
if (actionContinuation) {
|
|
924
|
-
return await revalidateAfterAction(
|
|
925
|
-
handlerCtx,
|
|
926
|
-
request,
|
|
927
|
-
env,
|
|
928
|
-
url,
|
|
929
|
-
store,
|
|
930
|
-
actionContinuation,
|
|
931
|
-
);
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
// ============================================================================
|
|
935
|
-
// LOADER FETCH EXECUTION (data fetching with RSC serialization)
|
|
936
|
-
// ============================================================================
|
|
937
|
-
const isLoaderRequest = url.searchParams.has("_rsc_loader");
|
|
938
|
-
if (isLoaderRequest) {
|
|
939
|
-
return handleLoaderFetch(
|
|
940
|
-
handlerCtx,
|
|
941
|
-
request,
|
|
942
|
-
env,
|
|
943
|
-
url,
|
|
944
|
-
variables,
|
|
945
|
-
routeParams,
|
|
946
|
-
);
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
// ============================================================================
|
|
950
|
-
// REGULAR RSC RENDERING (Navigation)
|
|
951
|
-
// ============================================================================
|
|
952
|
-
// Note: Must use "return await" for try/catch to catch async rejections
|
|
953
|
-
return await handleRscRendering(
|
|
954
|
-
handlerCtx,
|
|
955
|
-
request,
|
|
956
|
-
env,
|
|
957
|
-
url,
|
|
958
|
-
isPartial,
|
|
959
|
-
store,
|
|
960
|
-
nonce,
|
|
961
|
-
);
|
|
962
|
-
} catch (error) {
|
|
963
|
-
// Check if middleware/handler returned Response
|
|
964
|
-
if (error instanceof Response) {
|
|
965
|
-
// During partial (client-side navigation), a 200 Response from a handler
|
|
966
|
-
// means the route serves raw content (JSON, text, etc.), not JSX.
|
|
967
|
-
// Signal the browser to hard-navigate so it renders the raw response.
|
|
968
|
-
// Only for 200 — redirects (3xx) work already because the browser follows
|
|
969
|
-
// them automatically to a URL that serves Flight data.
|
|
970
|
-
if (isPartial && error.status === 200) {
|
|
971
|
-
console.warn(
|
|
972
|
-
`[RSC] Route handler at ${url.pathname} returned a Response during client-side navigation. ` +
|
|
973
|
-
`Falling back to hard navigation. Use data-external on the <Link> to avoid the extra round-trip.`,
|
|
974
|
-
);
|
|
975
|
-
return createResponseWithMergedHeaders(null, {
|
|
976
|
-
status: 200,
|
|
977
|
-
headers: {
|
|
978
|
-
"X-RSC-Reload": stripInternalParams(url).toString(),
|
|
979
|
-
"content-type": "text/x-component;charset=utf-8",
|
|
980
|
-
},
|
|
981
|
-
});
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
if (isPartial) {
|
|
985
|
-
const intercepted = interceptRedirectForPartial(
|
|
986
|
-
error,
|
|
987
|
-
createRedirectFlightResponse,
|
|
988
|
-
);
|
|
989
|
-
if (intercepted) return intercepted;
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
return error;
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
// Render 404 page for unmatched routes
|
|
996
|
-
// Check both instanceof and error.name for cross-bundle compatibility
|
|
997
|
-
const isRouteNotFound =
|
|
998
|
-
error instanceof RouteNotFoundError ||
|
|
999
|
-
(error instanceof Error && error.name === "RouteNotFoundError");
|
|
1000
|
-
if (isRouteNotFound) {
|
|
1001
|
-
callOnError(error, "routing", {
|
|
1002
|
-
request,
|
|
1003
|
-
url,
|
|
1004
|
-
env,
|
|
1005
|
-
handledByBoundary: true, // Handled by notFound component
|
|
1006
|
-
});
|
|
1007
|
-
|
|
1008
|
-
// Get notFound component from router options or use default
|
|
1009
|
-
const notFoundOption = router.notFound;
|
|
1010
|
-
const notFoundComponent =
|
|
1011
|
-
typeof notFoundOption === "function"
|
|
1012
|
-
? notFoundOption({ pathname: url.pathname })
|
|
1013
|
-
: (notFoundOption ?? createElement("h1", null, "Not Found"));
|
|
1014
|
-
|
|
1015
|
-
// Create a simple segment for the 404 page
|
|
1016
|
-
const notFoundSegment = {
|
|
1017
|
-
id: "notFound",
|
|
1018
|
-
namespace: "notFound",
|
|
1019
|
-
type: "route" as const,
|
|
1020
|
-
index: 0,
|
|
1021
|
-
component: notFoundComponent,
|
|
1022
|
-
params: {},
|
|
1023
|
-
};
|
|
1024
|
-
|
|
1025
|
-
const payload: RscPayload = {
|
|
1026
|
-
metadata: {
|
|
1027
|
-
pathname: url.pathname,
|
|
1028
|
-
segments: [notFoundSegment],
|
|
1029
|
-
matched: [],
|
|
1030
|
-
diff: [],
|
|
1031
|
-
isPartial: false,
|
|
1032
|
-
rootLayout: router.rootLayout,
|
|
1033
|
-
handles: store.stream(),
|
|
1034
|
-
version,
|
|
1035
|
-
themeConfig: router.themeConfig,
|
|
1036
|
-
warmupEnabled: router.warmupEnabled,
|
|
1037
|
-
initialTheme: requireRequestContext().theme,
|
|
1038
|
-
// No routeName for not-found routes
|
|
1039
|
-
},
|
|
1040
|
-
};
|
|
1041
|
-
|
|
1042
|
-
const rscStream = renderToReadableStream(payload);
|
|
1043
|
-
|
|
1044
|
-
// Determine if this is an RSC request or HTML request.
|
|
1045
|
-
// Partial requests are always RSC (see main isRscRequest comment).
|
|
1046
|
-
const isRscRequest =
|
|
1047
|
-
isPartial ||
|
|
1048
|
-
(!request.headers.get("accept")?.includes("text/html") &&
|
|
1049
|
-
!url.searchParams.has("__html")) ||
|
|
1050
|
-
url.searchParams.has("__rsc");
|
|
1051
|
-
|
|
1052
|
-
if (isRscRequest) {
|
|
1053
|
-
return createResponseWithMergedHeaders(rscStream, {
|
|
1054
|
-
status: 404,
|
|
1055
|
-
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
1056
|
-
});
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1059
|
-
// Delegate to SSR for HTML response (reuse early setup if available)
|
|
1060
|
-
const [ssrModule, streamMode] = await getSSRSetup(
|
|
1061
|
-
handlerCtx,
|
|
1062
|
-
request,
|
|
1063
|
-
env,
|
|
1064
|
-
url,
|
|
1065
|
-
requireRequestContext()._metricsStore,
|
|
1066
|
-
);
|
|
1067
|
-
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
1068
|
-
nonce,
|
|
1069
|
-
streamMode,
|
|
1070
|
-
});
|
|
1071
|
-
|
|
1072
|
-
return createResponseWithMergedHeaders(htmlStream, {
|
|
1073
|
-
status: 404,
|
|
1074
|
-
headers: { "content-type": "text/html;charset=utf-8" },
|
|
1075
|
-
});
|
|
1076
|
-
}
|
|
1077
|
-
|
|
1078
|
-
// Report unhandled errors
|
|
1079
|
-
callOnError(error, "routing", {
|
|
1080
|
-
request,
|
|
1081
|
-
url,
|
|
1082
|
-
env,
|
|
1083
|
-
handledByBoundary: false,
|
|
1084
|
-
});
|
|
1085
|
-
console.error(`[RSC] Error:`, error);
|
|
1086
|
-
throw error;
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
1148
|
}
|