@rangojs/router 0.0.0-experimental.18 → 0.0.0-experimental.1878aa49
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/{CLAUDE.md → AGENTS.md} +4 -0
- package/README.md +91 -19
- 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 +348 -80
- 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/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- 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/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 +883 -444
- 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/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 +17 -16
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +32 -0
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/hooks/SKILL.md +34 -32
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +79 -0
- package/skills/layout/SKILL.md +62 -2
- package/skills/links/SKILL.md +3 -1
- package/skills/loader/SKILL.md +166 -23
- package/skills/middleware/SKILL.md +83 -0
- package/skills/parallel/SKILL.md +183 -2
- package/skills/prerender/SKILL.md +189 -19
- package/skills/rango/SKILL.md +0 -1
- package/skills/route/SKILL.md +76 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/typesafety/SKILL.md +35 -23
- package/src/__internal.ts +93 -1
- package/src/bin/rango.ts +56 -19
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +30 -27
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +4 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +160 -31
- package/src/browser/navigation-client.ts +141 -88
- package/src/browser/navigation-store.ts +44 -39
- package/src/browser/navigation-transaction.ts +55 -214
- package/src/browser/partial-update.ts +181 -164
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +150 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +160 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/react/Link.tsx +97 -36
- package/src/browser/react/NavigationProvider.tsx +49 -5
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +1 -1
- package/src/browser/react/location-state.ts +2 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/use-action.ts +9 -1
- package/src/browser/react/use-handle.ts +3 -25
- package/src/browser/react/use-params.ts +2 -4
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +22 -9
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +7 -60
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +154 -64
- package/src/browser/scroll-restoration.ts +37 -37
- package/src/browser/segment-reconciler.ts +6 -1
- package/src/browser/server-action-bridge.ts +463 -426
- package/src/browser/types.ts +61 -36
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +8 -0
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/route-trie.ts +19 -3
- package/src/build/route-types/codegen.ts +13 -4
- package/src/build/route-types/include-resolution.ts +21 -1
- package/src/build/route-types/per-module-writer.ts +15 -3
- package/src/build/route-types/router-processing.ts +391 -90
- package/src/build/runtime-discovery.ts +13 -1
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +136 -96
- package/src/cache/cache-scope.ts +119 -80
- package/src/cache/cf/cf-cache-store.ts +462 -15
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +88 -53
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -0
- package/src/cache/memory-segment-store.ts +18 -7
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +101 -112
- package/src/cache/taint.ts +81 -0
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +54 -76
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +1 -1
- package/src/handles/MetaTags.tsx +5 -2
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/cookie-handler.ts +8 -3
- package/src/host/index.ts +0 -3
- package/src/host/router.ts +14 -1
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +24 -23
- package/src/index.ts +45 -52
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/prerender/store.ts +60 -18
- package/src/prerender.ts +76 -18
- package/src/reverse.ts +11 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +41 -13
- package/src/route-definition/helpers-types.ts +6 -5
- package/src/route-definition/index.ts +0 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +7 -0
- package/src/router/content-negotiation.ts +1 -1
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +159 -34
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +8 -1
- package/src/router/loader-resolution.ts +11 -3
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +45 -7
- package/src/router/match-api.ts +62 -8
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +185 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +138 -13
- package/src/router/match-middleware/cache-store.ts +55 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +8 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +22 -15
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +60 -12
- package/src/router/middleware.ts +214 -42
- package/src/router/pattern-matching.ts +61 -10
- package/src/router/prerender-match.ts +40 -8
- package/src/router/preview-match.ts +7 -1
- package/src/router/revalidation.ts +87 -8
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +73 -5
- package/src/router/router-options.ts +250 -19
- package/src/router/segment-resolution/fresh.ts +277 -45
- package/src/router/segment-resolution/helpers.ts +49 -25
- package/src/router/segment-resolution/loader-cache.ts +38 -146
- package/src/router/segment-resolution/revalidation.ts +619 -275
- package/src/router/segment-wrappers.ts +5 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +20 -2
- package/src/router/types.ts +8 -1
- package/src/router.ts +230 -25
- package/src/rsc/handler-context.ts +11 -0
- package/src/rsc/handler.ts +492 -96
- package/src/rsc/helpers.ts +25 -16
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +84 -42
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +249 -19
- package/src/rsc/response-route-handler.ts +37 -26
- package/src/rsc/rsc-rendering.ts +40 -41
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +150 -68
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +18 -1
- package/src/search-params.ts +38 -23
- package/src/segment-system.tsx +140 -4
- package/src/server/context.ts +187 -20
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +66 -9
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +188 -41
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +66 -26
- package/src/static-handler.ts +7 -0
- package/src/theme/ThemeProvider.tsx +6 -1
- package/src/theme/index.ts +4 -18
- package/src/theme/theme-context.ts +1 -28
- package/src/theme/theme-script.ts +2 -1
- package/src/types/cache-types.ts +9 -4
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +9 -0
- package/src/types/handler-context.ts +167 -55
- package/src/types/loader-types.ts +11 -5
- package/src/types/route-config.ts +17 -8
- package/src/types/route-entry.ts +35 -0
- package/src/types/segments.ts +2 -5
- package/src/urls/include-helper.ts +49 -8
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +30 -12
- package/src/urls/path-helper.ts +18 -3
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +27 -2
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +12 -4
- package/src/vite/discovery/bundle-postprocess.ts +32 -52
- package/src/vite/discovery/discover-routers.ts +53 -23
- package/src/vite/discovery/prerender-collection.ts +58 -41
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/state.ts +4 -9
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +4 -3
- package/src/vite/plugin-types.ts +0 -83
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +3 -3
- package/src/vite/plugins/expose-action-id.ts +1 -3
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +91 -3
- package/src/vite/plugins/version-plugin.ts +13 -1
- package/src/vite/rango.ts +172 -210
- package/src/vite/router-discovery.ts +115 -44
- package/src/vite/utils/banner.ts +3 -3
- package/src/vite/utils/prerender-utils.ts +81 -0
- package/src/vite/utils/shared-utils.ts +6 -3
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/prefetch-cache.ts +0 -48
- package/src/browser/prefetch-fetch.ts +0 -109
- package/src/browser/prefetch-queue.ts +0 -81
- package/src/browser/request-controller.ts +0 -164
- package/src/route-definition/route-function.ts +0 -119
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- /package/src/browser/{prefetch-observer.ts → prefetch/observer.ts} +0 -0
|
@@ -10,9 +10,33 @@ import {
|
|
|
10
10
|
requireRequestContext,
|
|
11
11
|
setRequestContextParams,
|
|
12
12
|
} from "../server/request-context.js";
|
|
13
|
+
import { getSSRSetup } from "./ssr-setup.js";
|
|
14
|
+
import type { MiddlewareFn } from "../router/middleware.js";
|
|
15
|
+
import { executeMiddleware } from "../router/middleware.js";
|
|
13
16
|
import type { RscPayload, ReactFormState } from "./types.js";
|
|
14
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
createResponseWithMergedHeaders,
|
|
19
|
+
finalizeResponse,
|
|
20
|
+
buildRouteMiddlewareEntries,
|
|
21
|
+
} from "./helpers.js";
|
|
15
22
|
import type { HandlerContext } from "./handler-context.js";
|
|
23
|
+
import {
|
|
24
|
+
extractRedirectResponse,
|
|
25
|
+
warnNonRedirectPeResponse,
|
|
26
|
+
} from "./runtime-warnings.js";
|
|
27
|
+
|
|
28
|
+
export interface PeRouteMiddlewareInfo {
|
|
29
|
+
routeMiddleware?: Array<{
|
|
30
|
+
handler: MiddlewareFn;
|
|
31
|
+
params: Record<string, string>;
|
|
32
|
+
}>;
|
|
33
|
+
variables: Record<string, any>;
|
|
34
|
+
routeReverse?: (
|
|
35
|
+
name: string,
|
|
36
|
+
params?: Record<string, string>,
|
|
37
|
+
search?: Record<string, unknown>,
|
|
38
|
+
) => string;
|
|
39
|
+
}
|
|
16
40
|
|
|
17
41
|
export async function handleProgressiveEnhancement<TEnv>(
|
|
18
42
|
ctx: HandlerContext<TEnv>,
|
|
@@ -22,6 +46,7 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
22
46
|
isAction: boolean,
|
|
23
47
|
handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
24
48
|
nonce: string | undefined,
|
|
49
|
+
routeMwInfo?: PeRouteMiddlewareInfo,
|
|
25
50
|
): Promise<Response | null> {
|
|
26
51
|
const contentType = request.headers.get("content-type") || "";
|
|
27
52
|
const isFormSubmission =
|
|
@@ -32,8 +57,42 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
32
57
|
return null;
|
|
33
58
|
}
|
|
34
59
|
|
|
35
|
-
// Clone the request to read FormData without consuming it
|
|
36
|
-
|
|
60
|
+
// Clone the request to read FormData without consuming it.
|
|
61
|
+
// Wrap in try-catch so malformed POST bodies are reported as action
|
|
62
|
+
// errors, not routing errors from the outer catch in handler.ts.
|
|
63
|
+
let formData: FormData;
|
|
64
|
+
try {
|
|
65
|
+
formData = await request.clone().formData();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// Attempt error boundary rendering so the user sees a meaningful page.
|
|
68
|
+
const errorHtml = await renderPeErrorBoundary(
|
|
69
|
+
ctx,
|
|
70
|
+
request,
|
|
71
|
+
env,
|
|
72
|
+
url,
|
|
73
|
+
error,
|
|
74
|
+
handleStore,
|
|
75
|
+
nonce,
|
|
76
|
+
);
|
|
77
|
+
if (errorHtml) {
|
|
78
|
+
ctx.callOnError(error, "action", {
|
|
79
|
+
request,
|
|
80
|
+
url,
|
|
81
|
+
env,
|
|
82
|
+
handledByBoundary: true,
|
|
83
|
+
});
|
|
84
|
+
return errorHtml;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
ctx.callOnError(error, "action", {
|
|
88
|
+
request,
|
|
89
|
+
url,
|
|
90
|
+
env,
|
|
91
|
+
handledByBoundary: false,
|
|
92
|
+
});
|
|
93
|
+
console.error("[RSC] Progressive enhancement form parse error:", error);
|
|
94
|
+
return createResponseWithMergedHeaders(null, { status: 400 });
|
|
95
|
+
}
|
|
37
96
|
|
|
38
97
|
// Look for React's progressive enhancement hidden fields
|
|
39
98
|
let isDirectAction = false;
|
|
@@ -58,14 +117,37 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
58
117
|
let reactFormState: ReactFormState | null = null;
|
|
59
118
|
|
|
60
119
|
if (isUseActionState) {
|
|
120
|
+
// Decode and extract action identity before execution so error
|
|
121
|
+
// handlers can report actionId even when the action throws.
|
|
122
|
+
let useActionStateId: string | undefined;
|
|
61
123
|
try {
|
|
62
124
|
const boundAction = await ctx.decodeAction(formData);
|
|
125
|
+
// React's custom .bind() preserves $$id on server references.
|
|
126
|
+
useActionStateId = (boundAction as { $$id?: string }).$$id ?? undefined;
|
|
63
127
|
actionResult = await boundAction();
|
|
64
128
|
} catch (error) {
|
|
129
|
+
// Handle thrown redirect (e.g., throw redirect('/path'))
|
|
130
|
+
const redirectResponse = extractRedirectResponse(error);
|
|
131
|
+
if (redirectResponse) return redirectResponse;
|
|
132
|
+
|
|
133
|
+
// Attempt error boundary rendering for the PE path
|
|
134
|
+
const errorHtml = await renderPeErrorBoundary(
|
|
135
|
+
ctx,
|
|
136
|
+
request,
|
|
137
|
+
env,
|
|
138
|
+
url,
|
|
139
|
+
error,
|
|
140
|
+
handleStore,
|
|
141
|
+
nonce,
|
|
142
|
+
useActionStateId,
|
|
143
|
+
);
|
|
144
|
+
if (errorHtml) return errorHtml;
|
|
145
|
+
|
|
65
146
|
ctx.callOnError(error, "action", {
|
|
66
147
|
request,
|
|
67
148
|
url,
|
|
68
149
|
env,
|
|
150
|
+
actionId: useActionStateId,
|
|
69
151
|
handledByBoundary: false,
|
|
70
152
|
});
|
|
71
153
|
console.error("[RSC] Progressive enhancement action error:", error);
|
|
@@ -84,6 +166,23 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
84
166
|
const loadedAction = await ctx.loadServerAction(directActionId);
|
|
85
167
|
actionResult = await loadedAction.apply(null, args);
|
|
86
168
|
} catch (error) {
|
|
169
|
+
// Handle thrown redirect (e.g., throw redirect('/path'))
|
|
170
|
+
const redirectResponse = extractRedirectResponse(error);
|
|
171
|
+
if (redirectResponse) return redirectResponse;
|
|
172
|
+
|
|
173
|
+
// Attempt error boundary rendering for the PE path
|
|
174
|
+
const errorHtml = await renderPeErrorBoundary(
|
|
175
|
+
ctx,
|
|
176
|
+
request,
|
|
177
|
+
env,
|
|
178
|
+
url,
|
|
179
|
+
error,
|
|
180
|
+
handleStore,
|
|
181
|
+
nonce,
|
|
182
|
+
directActionId,
|
|
183
|
+
);
|
|
184
|
+
if (errorHtml) return errorHtml;
|
|
185
|
+
|
|
87
186
|
ctx.callOnError(error, "action", {
|
|
88
187
|
request,
|
|
89
188
|
url,
|
|
@@ -95,6 +194,20 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
95
194
|
}
|
|
96
195
|
}
|
|
97
196
|
|
|
197
|
+
// Handle Response returned from action during PE.
|
|
198
|
+
// In the JS path, executeServerAction intercepts redirect Responses and
|
|
199
|
+
// short-circuits. The PE path must handle them too.
|
|
200
|
+
if (actionResult instanceof Response) {
|
|
201
|
+
const redirectResponse = extractRedirectResponse(actionResult);
|
|
202
|
+
if (redirectResponse) return redirectResponse;
|
|
203
|
+
// W3: Non-redirect Response — discard it so it doesn't flow into
|
|
204
|
+
// decodeFormState or the re-render payload.
|
|
205
|
+
if (process.env.NODE_ENV !== "production") {
|
|
206
|
+
warnNonRedirectPeResponse();
|
|
207
|
+
}
|
|
208
|
+
actionResult = undefined;
|
|
209
|
+
}
|
|
210
|
+
|
|
98
211
|
// Decode form state for useActionState progressive enhancement
|
|
99
212
|
try {
|
|
100
213
|
reactFormState = await ctx.decodeFormState(actionResult, formData);
|
|
@@ -108,28 +221,136 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
108
221
|
console.error("[RSC] Failed to decode form state:", error);
|
|
109
222
|
}
|
|
110
223
|
|
|
111
|
-
// Re-render the page and return HTML
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
224
|
+
// Re-render the page and return HTML.
|
|
225
|
+
// Route middleware wraps the render so context variables, headers, and
|
|
226
|
+
// cookies set by route middleware are available during re-render — matching
|
|
227
|
+
// the behavior of JS-enabled requests.
|
|
228
|
+
const renderPage = async (): Promise<Response> => {
|
|
229
|
+
const renderRequest = new Request(url.toString(), {
|
|
230
|
+
method: "GET",
|
|
231
|
+
headers: new Headers({ accept: "text/html" }),
|
|
232
|
+
});
|
|
116
233
|
|
|
117
|
-
|
|
234
|
+
const match = await ctx.router.match(renderRequest, { env });
|
|
118
235
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
236
|
+
if (match.redirect) {
|
|
237
|
+
return createResponseWithMergedHeaders(null, {
|
|
238
|
+
status: 308,
|
|
239
|
+
headers: { Location: match.redirect },
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const payload: RscPayload = {
|
|
244
|
+
metadata: {
|
|
245
|
+
pathname: url.pathname,
|
|
246
|
+
routerId: ctx.router.id,
|
|
247
|
+
basename: ctx.router.basename,
|
|
248
|
+
segments: match.segments,
|
|
249
|
+
matched: match.matched,
|
|
250
|
+
diff: match.diff,
|
|
251
|
+
isPartial: false,
|
|
252
|
+
rootLayout: ctx.router.rootLayout,
|
|
253
|
+
handles: handleStore.stream(),
|
|
254
|
+
version: ctx.version,
|
|
255
|
+
themeConfig: ctx.router.themeConfig,
|
|
256
|
+
warmupEnabled: ctx.router.warmupEnabled,
|
|
257
|
+
initialTheme: requireRequestContext().theme,
|
|
258
|
+
},
|
|
259
|
+
formState: actionResult,
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const rscStream = ctx.renderToReadableStream<RscPayload>(payload);
|
|
263
|
+
// metricsStore=undefined is safe: the handler already stashed the early
|
|
264
|
+
// SSR setup promise on request variables, so getSSRSetup returns it
|
|
265
|
+
// without falling back to a fresh startSSRSetup.
|
|
266
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
267
|
+
ctx,
|
|
268
|
+
request,
|
|
269
|
+
env,
|
|
270
|
+
url,
|
|
271
|
+
undefined,
|
|
272
|
+
);
|
|
273
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
274
|
+
formState: reactFormState,
|
|
275
|
+
nonce,
|
|
276
|
+
streamMode,
|
|
123
277
|
});
|
|
278
|
+
|
|
279
|
+
return createResponseWithMergedHeaders(htmlStream, {
|
|
280
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
281
|
+
});
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
// Execute route middleware wrapping the render, if any.
|
|
285
|
+
// finalizeResponse drains onResponse callbacks that middleware short-circuits
|
|
286
|
+
// may leave behind (executeMiddleware does not finalize them itself).
|
|
287
|
+
if (routeMwInfo?.routeMiddleware && routeMwInfo.routeMiddleware.length > 0) {
|
|
288
|
+
return finalizeResponse(
|
|
289
|
+
await executeMiddleware(
|
|
290
|
+
buildRouteMiddlewareEntries(routeMwInfo.routeMiddleware),
|
|
291
|
+
request,
|
|
292
|
+
env,
|
|
293
|
+
routeMwInfo.variables,
|
|
294
|
+
renderPage,
|
|
295
|
+
routeMwInfo.routeReverse,
|
|
296
|
+
),
|
|
297
|
+
);
|
|
124
298
|
}
|
|
125
299
|
|
|
300
|
+
return renderPage();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Attempt to render an error boundary as full HTML for the PE path.
|
|
305
|
+
* Returns null if no error boundary is found (caller falls through to
|
|
306
|
+
* normal page re-render).
|
|
307
|
+
*/
|
|
308
|
+
async function renderPeErrorBoundary<TEnv>(
|
|
309
|
+
ctx: HandlerContext<TEnv>,
|
|
310
|
+
request: Request,
|
|
311
|
+
env: TEnv,
|
|
312
|
+
url: URL,
|
|
313
|
+
error: unknown,
|
|
314
|
+
handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
315
|
+
nonce: string | undefined,
|
|
316
|
+
actionId?: string | null,
|
|
317
|
+
): Promise<Response | null> {
|
|
318
|
+
let errorResult;
|
|
319
|
+
try {
|
|
320
|
+
errorResult = await ctx.router.matchError(request, { env }, error, "route");
|
|
321
|
+
} catch (matchErr) {
|
|
322
|
+
ctx.callOnError(error, "action", {
|
|
323
|
+
request,
|
|
324
|
+
url,
|
|
325
|
+
env,
|
|
326
|
+
actionId: actionId ?? undefined,
|
|
327
|
+
handledByBoundary: false,
|
|
328
|
+
});
|
|
329
|
+
throw matchErr;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if (!errorResult) return null;
|
|
333
|
+
|
|
334
|
+
ctx.callOnError(error, "action", {
|
|
335
|
+
request,
|
|
336
|
+
url,
|
|
337
|
+
env,
|
|
338
|
+
actionId: actionId ?? undefined,
|
|
339
|
+
handledByBoundary: true,
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
setRequestContextParams(errorResult.params, errorResult.routeName);
|
|
343
|
+
|
|
126
344
|
const payload: RscPayload = {
|
|
127
345
|
metadata: {
|
|
128
346
|
pathname: url.pathname,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
347
|
+
routerId: ctx.router.id,
|
|
348
|
+
basename: ctx.router.basename,
|
|
349
|
+
segments: errorResult.segments,
|
|
350
|
+
matched: errorResult.matched,
|
|
351
|
+
diff: errorResult.diff,
|
|
132
352
|
isPartial: false,
|
|
353
|
+
isError: true,
|
|
133
354
|
rootLayout: ctx.router.rootLayout,
|
|
134
355
|
handles: handleStore.stream(),
|
|
135
356
|
version: ctx.version,
|
|
@@ -137,17 +358,26 @@ export async function handleProgressiveEnhancement<TEnv>(
|
|
|
137
358
|
warmupEnabled: ctx.router.warmupEnabled,
|
|
138
359
|
initialTheme: requireRequestContext().theme,
|
|
139
360
|
},
|
|
140
|
-
formState: actionResult,
|
|
141
361
|
};
|
|
142
362
|
|
|
143
363
|
const rscStream = ctx.renderToReadableStream<RscPayload>(payload);
|
|
144
|
-
|
|
364
|
+
// metricsStore=undefined is safe: the handler already stashed the early
|
|
365
|
+
// SSR setup promise on request variables, so getSSRSetup returns it
|
|
366
|
+
// without falling back to a fresh startSSRSetup.
|
|
367
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
368
|
+
ctx,
|
|
369
|
+
request,
|
|
370
|
+
env,
|
|
371
|
+
url,
|
|
372
|
+
undefined,
|
|
373
|
+
);
|
|
145
374
|
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
146
|
-
formState: reactFormState,
|
|
147
375
|
nonce,
|
|
376
|
+
streamMode,
|
|
148
377
|
});
|
|
149
378
|
|
|
150
379
|
return createResponseWithMergedHeaders(htmlStream, {
|
|
380
|
+
status: 500,
|
|
151
381
|
headers: { "content-type": "text/html;charset=utf-8" },
|
|
152
382
|
});
|
|
153
383
|
}
|
|
@@ -23,6 +23,7 @@ import type { HandlerContext } from "./handler-context.js";
|
|
|
23
23
|
import { createResponseErrorPayload } from "./response-error.js";
|
|
24
24
|
import {
|
|
25
25
|
createResponseWithMergedHeaders,
|
|
26
|
+
finalizeResponse,
|
|
26
27
|
isCacheableStatus,
|
|
27
28
|
buildRouteMiddlewareEntries,
|
|
28
29
|
} from "./helpers.js";
|
|
@@ -70,25 +71,15 @@ export async function handleResponseRoute<TEnv>(
|
|
|
70
71
|
|
|
71
72
|
// Build lightweight context for response handler
|
|
72
73
|
const reqCtx = requireRequestContext();
|
|
74
|
+
const cleanUrl = stripInternalParams(url);
|
|
73
75
|
const responseHandlerCtx = {
|
|
74
76
|
request,
|
|
75
77
|
params: preview.params || {},
|
|
76
78
|
env,
|
|
77
|
-
searchParams:
|
|
78
|
-
url,
|
|
79
|
+
searchParams: cleanUrl.searchParams,
|
|
80
|
+
url: cleanUrl,
|
|
79
81
|
pathname: url.pathname,
|
|
80
|
-
|
|
81
|
-
if (name.startsWith("/")) {
|
|
82
|
-
if (!hrefParams) return name;
|
|
83
|
-
return name.replace(/:([^/]+)/g, (_, key) => {
|
|
84
|
-
const value = hrefParams[key];
|
|
85
|
-
if (value === undefined)
|
|
86
|
-
throw new Error(`Missing param "${key}" for path "${name}"`);
|
|
87
|
-
return encodeURIComponent(value);
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
return name;
|
|
91
|
-
},
|
|
82
|
+
reverse: createReverseFunction(handlerCtx.getRequiredRouteMap()),
|
|
92
83
|
get: ((keyOrVar: any) => contextGet(variables, keyOrVar)) as any,
|
|
93
84
|
header: (name: string, value: string) => reqCtx.header(name, value),
|
|
94
85
|
_responseType: preview.responseType,
|
|
@@ -103,10 +94,15 @@ export async function handleResponseRoute<TEnv>(
|
|
|
103
94
|
|
|
104
95
|
// Re-wrap a handler-returned Response through createResponseWithMergedHeaders
|
|
105
96
|
// so that stub headers (cookies, custom headers set via ctx.header()) are included.
|
|
97
|
+
// Use Headers (not Record<string, string>) to preserve duplicate entries like Set-Cookie.
|
|
106
98
|
const rewrapResponse = (result: Response) => {
|
|
107
|
-
const headers
|
|
99
|
+
const headers = new Headers();
|
|
108
100
|
result.headers.forEach((value, key) => {
|
|
109
|
-
|
|
101
|
+
if (key.toLowerCase() === "set-cookie") {
|
|
102
|
+
headers.append(key, value);
|
|
103
|
+
} else {
|
|
104
|
+
headers.set(key, value);
|
|
105
|
+
}
|
|
110
106
|
});
|
|
111
107
|
return createResponseWithMergedHeaders(result.body, {
|
|
112
108
|
status: result.status,
|
|
@@ -231,12 +227,23 @@ export async function handleResponseRoute<TEnv>(
|
|
|
231
227
|
}
|
|
232
228
|
|
|
233
229
|
if (cacheScope?.enabled) {
|
|
230
|
+
// Evaluate condition — skip response cache when condition returns false
|
|
231
|
+
let conditionPassed = true;
|
|
232
|
+
if (cacheScope.config !== false && cacheScope.config.condition) {
|
|
233
|
+
try {
|
|
234
|
+
conditionPassed = !!cacheScope.config.condition(reqCtx);
|
|
235
|
+
} catch {
|
|
236
|
+
conditionPassed = false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
234
240
|
const store = cacheScope.getStore() ?? reqCtx._cacheStore;
|
|
235
|
-
if (store?.getResponse && store?.putResponse) {
|
|
241
|
+
if (conditionPassed && store?.getResponse && store?.putResponse) {
|
|
236
242
|
// Build cache key with response:{type}: prefix to avoid collision
|
|
237
243
|
// with segment keys and differentiate between response types.
|
|
238
|
-
// Include url.search so query-driven
|
|
239
|
-
|
|
244
|
+
// Include host and url.search so query-driven and multi-host
|
|
245
|
+
// responses cache separately.
|
|
246
|
+
let cacheKey = `response:${preview.responseType}:${url.host}${url.pathname}${url.search}`;
|
|
240
247
|
|
|
241
248
|
// Priority 1: Route-level key function (full override)
|
|
242
249
|
if (cacheScope.config !== false && cacheScope.config.key) {
|
|
@@ -286,11 +293,14 @@ export async function handleResponseRoute<TEnv>(
|
|
|
286
293
|
// Stale hit (SWR) - return cached, revalidate in background
|
|
287
294
|
reqCtx.waitUntil(async () => {
|
|
288
295
|
try {
|
|
289
|
-
|
|
296
|
+
// finalizeResponse drains any onResponse callbacks registered
|
|
297
|
+
// during middleware execution (e.g. middleware short-circuit)
|
|
298
|
+
// that createResponseWithMergedHeaders didn't reach.
|
|
299
|
+
const fresh = finalizeResponse(await executeHandler());
|
|
290
300
|
if (isCacheableStatus(fresh.status)) {
|
|
291
301
|
await store.putResponse!(
|
|
292
302
|
cacheKey,
|
|
293
|
-
fresh,
|
|
303
|
+
fresh.clone(),
|
|
294
304
|
cacheScope!.ttl,
|
|
295
305
|
cacheScope!.swr,
|
|
296
306
|
);
|
|
@@ -307,10 +317,11 @@ export async function handleResponseRoute<TEnv>(
|
|
|
307
317
|
}
|
|
308
318
|
|
|
309
319
|
// Cache miss - execute handler and cache the result.
|
|
310
|
-
// createResponseWithMergedHeaders inside the handler
|
|
311
|
-
//
|
|
312
|
-
// (
|
|
313
|
-
|
|
320
|
+
// createResponseWithMergedHeaders inside the handler drains callbacks
|
|
321
|
+
// registered during handler execution. finalizeResponse catches any
|
|
322
|
+
// remaining callbacks (e.g. from middleware short-circuit where the
|
|
323
|
+
// handler never ran) so the cached artifact includes all transforms.
|
|
324
|
+
const response = finalizeResponse(await executeHandler());
|
|
314
325
|
|
|
315
326
|
if (isCacheableStatus(response.status)) {
|
|
316
327
|
reqCtx.waitUntil(async () => {
|
|
@@ -332,5 +343,5 @@ export async function handleResponseRoute<TEnv>(
|
|
|
332
343
|
}
|
|
333
344
|
}
|
|
334
345
|
|
|
335
|
-
return executeHandler();
|
|
346
|
+
return executeHandler().then(finalizeResponse);
|
|
336
347
|
}
|
package/src/rsc/rsc-rendering.ts
CHANGED
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
getLocationState,
|
|
13
13
|
} from "../server/request-context.js";
|
|
14
14
|
import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
|
|
15
|
+
import { appendMetric } from "../router/metrics.js";
|
|
16
|
+
import { getSSRSetup } from "./ssr-setup.js";
|
|
15
17
|
import type { RscPayload } from "./types.js";
|
|
16
18
|
import {
|
|
17
19
|
createResponseWithMergedHeaders,
|
|
@@ -28,13 +30,9 @@ export async function handleRscRendering<TEnv>(
|
|
|
28
30
|
handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
29
31
|
nonce: string | undefined,
|
|
30
32
|
): Promise<Response> {
|
|
31
|
-
// Retrieve handler-level timing from variables
|
|
32
33
|
const reqCtx = requireRequestContext();
|
|
33
|
-
const handlerTimingArr: string[] = reqCtx.var.__handlerTiming || [];
|
|
34
|
-
const handlerStart: number = reqCtx.var.__handlerStart || 0;
|
|
35
34
|
|
|
36
35
|
let payload: RscPayload;
|
|
37
|
-
let serverTiming: string | undefined;
|
|
38
36
|
let hasInterceptSlots = false;
|
|
39
37
|
|
|
40
38
|
if (isPartial) {
|
|
@@ -53,11 +51,11 @@ export async function handleRscRendering<TEnv>(
|
|
|
53
51
|
return createSimpleRedirectResponse(match.redirect);
|
|
54
52
|
}
|
|
55
53
|
|
|
56
|
-
serverTiming = match.serverTiming;
|
|
57
|
-
|
|
58
54
|
payload = {
|
|
59
55
|
metadata: {
|
|
60
56
|
pathname: url.pathname,
|
|
57
|
+
routerId: ctx.router.id,
|
|
58
|
+
basename: ctx.router.basename,
|
|
61
59
|
segments: match.segments,
|
|
62
60
|
matched: match.matched,
|
|
63
61
|
diff: match.diff,
|
|
@@ -66,18 +64,20 @@ export async function handleRscRendering<TEnv>(
|
|
|
66
64
|
rootLayout: ctx.router.rootLayout,
|
|
67
65
|
handles: handleStore.stream(),
|
|
68
66
|
version: ctx.version,
|
|
67
|
+
prefetchCacheTTL: ctx.router.prefetchCacheTTL,
|
|
69
68
|
themeConfig: ctx.router.themeConfig,
|
|
70
69
|
initialTheme: reqCtx.theme,
|
|
71
70
|
},
|
|
72
71
|
};
|
|
73
72
|
} else {
|
|
74
73
|
setRequestContextParams(result.params, result.routeName);
|
|
75
|
-
|
|
74
|
+
|
|
76
75
|
hasInterceptSlots = !!result.slots;
|
|
77
76
|
|
|
78
77
|
payload = {
|
|
79
78
|
metadata: {
|
|
80
79
|
pathname: url.pathname,
|
|
80
|
+
routerId: ctx.router.id,
|
|
81
81
|
segments: result.segments,
|
|
82
82
|
matched: result.matched,
|
|
83
83
|
diff: result.diff,
|
|
@@ -86,6 +86,7 @@ export async function handleRscRendering<TEnv>(
|
|
|
86
86
|
slots: result.slots,
|
|
87
87
|
handles: handleStore.stream(),
|
|
88
88
|
version: ctx.version,
|
|
89
|
+
prefetchCacheTTL: ctx.router.prefetchCacheTTL,
|
|
89
90
|
},
|
|
90
91
|
};
|
|
91
92
|
}
|
|
@@ -111,6 +112,7 @@ export async function handleRscRendering<TEnv>(
|
|
|
111
112
|
const nonLoaderSegments = match.segments.filter(
|
|
112
113
|
(s) => s.type !== "loader",
|
|
113
114
|
);
|
|
115
|
+
handleStore.seal();
|
|
114
116
|
await handleStore.settled;
|
|
115
117
|
const { serializeSegments } = await import("../cache/segment-codec.js");
|
|
116
118
|
const serializedSegments = await serializeSegments(nonLoaderSegments);
|
|
@@ -131,14 +133,14 @@ export async function handleRscRendering<TEnv>(
|
|
|
131
133
|
{ headers: { "Content-Type": "application/json" } },
|
|
132
134
|
);
|
|
133
135
|
} else {
|
|
134
|
-
serverTiming = match.serverTiming;
|
|
135
|
-
|
|
136
136
|
payload = {
|
|
137
137
|
// Initial SSR can reconstruct the tree from segments + rootLayout,
|
|
138
138
|
// so we omit root to avoid sending the same structure twice.
|
|
139
139
|
|
|
140
140
|
metadata: {
|
|
141
141
|
pathname: url.pathname,
|
|
142
|
+
routerId: ctx.router.id,
|
|
143
|
+
basename: ctx.router.basename,
|
|
142
144
|
segments: match.segments,
|
|
143
145
|
matched: match.matched,
|
|
144
146
|
diff: match.diff,
|
|
@@ -147,6 +149,7 @@ export async function handleRscRendering<TEnv>(
|
|
|
147
149
|
rootLayout: ctx.router.rootLayout,
|
|
148
150
|
handles: handleStore.stream(),
|
|
149
151
|
version: ctx.version,
|
|
152
|
+
prefetchCacheTTL: ctx.router.prefetchCacheTTL,
|
|
150
153
|
themeConfig: ctx.router.themeConfig,
|
|
151
154
|
initialTheme: reqCtx.theme,
|
|
152
155
|
},
|
|
@@ -165,10 +168,20 @@ export async function handleRscRendering<TEnv>(
|
|
|
165
168
|
}
|
|
166
169
|
}
|
|
167
170
|
|
|
171
|
+
const metricsStore = reqCtx._metricsStore;
|
|
172
|
+
const renderStart = performance.now();
|
|
173
|
+
|
|
168
174
|
// Serialize to RSC stream
|
|
169
175
|
const rscSerializeStart = performance.now();
|
|
170
176
|
const rscStream = ctx.renderToReadableStream<RscPayload>(payload);
|
|
171
177
|
const rscSerializeDur = performance.now() - rscSerializeStart;
|
|
178
|
+
// This measures synchronous stream creation, not end-to-end stream consumption.
|
|
179
|
+
appendMetric(
|
|
180
|
+
metricsStore,
|
|
181
|
+
"rsc-serialize",
|
|
182
|
+
rscSerializeStart,
|
|
183
|
+
rscSerializeDur,
|
|
184
|
+
);
|
|
172
185
|
|
|
173
186
|
// Determine if this is an RSC request or HTML request.
|
|
174
187
|
// Partial requests (_rsc_partial) are always RSC -- they come from client-side
|
|
@@ -180,15 +193,9 @@ export async function handleRscRendering<TEnv>(
|
|
|
180
193
|
!url.searchParams.has("__html")) ||
|
|
181
194
|
url.searchParams.has("__rsc");
|
|
182
195
|
|
|
183
|
-
// Build complete Server-Timing: handler phases + match/manifest + RSC serialize
|
|
184
|
-
const timingParts: string[] = [...handlerTimingArr];
|
|
185
|
-
if (serverTiming) {
|
|
186
|
-
timingParts.push(serverTiming);
|
|
187
|
-
}
|
|
188
|
-
timingParts.push(`rsc-serialize;dur=${rscSerializeDur.toFixed(2)}`);
|
|
189
|
-
|
|
190
196
|
if (isRscRequest) {
|
|
191
|
-
const
|
|
197
|
+
const renderDur = performance.now() - renderStart;
|
|
198
|
+
appendMetric(metricsStore, "render:total", renderStart, renderDur);
|
|
192
199
|
const rscHeaders: Record<string, string> = {
|
|
193
200
|
"content-type": "text/x-component;charset=utf-8",
|
|
194
201
|
vary: "accept, X-Rango-State, X-RSC-Router-Client-Path",
|
|
@@ -204,40 +211,32 @@ export async function handleRscRendering<TEnv>(
|
|
|
204
211
|
rscHeaders["cache-control"] = cc;
|
|
205
212
|
}
|
|
206
213
|
}
|
|
207
|
-
if (fullTiming) {
|
|
208
|
-
rscHeaders["Server-Timing"] = fullTiming;
|
|
209
|
-
}
|
|
210
214
|
return createResponseWithMergedHeaders(rscStream, {
|
|
211
215
|
headers: rscHeaders,
|
|
212
216
|
});
|
|
213
217
|
}
|
|
214
218
|
|
|
215
|
-
// Delegate to SSR for HTML response
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
219
|
+
// Delegate to SSR for HTML response (reuse early setup if available)
|
|
220
|
+
const [ssrModule, streamMode] = await getSSRSetup(
|
|
221
|
+
ctx,
|
|
222
|
+
request,
|
|
223
|
+
env,
|
|
224
|
+
url,
|
|
225
|
+
metricsStore,
|
|
226
|
+
);
|
|
220
227
|
|
|
221
228
|
const ssrRenderStart = performance.now();
|
|
222
|
-
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
229
|
+
const htmlStream = await ssrModule.renderHTML(rscStream, {
|
|
230
|
+
nonce,
|
|
231
|
+
streamMode,
|
|
232
|
+
});
|
|
223
233
|
const ssrRenderDur = performance.now() - ssrRenderStart;
|
|
224
|
-
|
|
234
|
+
appendMetric(metricsStore, "ssr-render-html", ssrRenderStart, ssrRenderDur);
|
|
225
235
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const totalHandler = performance.now() - handlerStart;
|
|
229
|
-
timingParts.push(`handler-total;dur=${totalHandler.toFixed(2)}`);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const fullTiming = timingParts.join(", ");
|
|
233
|
-
const htmlHeaders: Record<string, string> = {
|
|
234
|
-
"content-type": "text/html;charset=utf-8",
|
|
235
|
-
};
|
|
236
|
-
if (fullTiming) {
|
|
237
|
-
htmlHeaders["Server-Timing"] = fullTiming;
|
|
238
|
-
}
|
|
236
|
+
const renderDur = performance.now() - renderStart;
|
|
237
|
+
appendMetric(metricsStore, "render:total", renderStart, renderDur);
|
|
239
238
|
|
|
240
239
|
return createResponseWithMergedHeaders(htmlStream, {
|
|
241
|
-
headers:
|
|
240
|
+
headers: { "content-type": "text/html;charset=utf-8" },
|
|
242
241
|
});
|
|
243
242
|
}
|