@rangojs/router 0.0.0-experimental.116 → 0.0.0-experimental.118
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/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.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 +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +8 -10
- 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/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 +18 -17
- package/skills/css/SKILL.md +76 -0
- package/skills/host-router/SKILL.md +21 -0
- package/skills/loader/SKILL.md +17 -17
- package/skills/rango/SKILL.md +1 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/navigation-bridge.ts +2 -51
- package/src/browser/navigation-client.ts +70 -68
- package/src/browser/navigation-store.ts +1 -25
- package/src/browser/partial-update.ts +19 -32
- package/src/browser/prefetch/cache.ts +97 -48
- package/src/browser/prefetch/fetch.ts +101 -33
- package/src/browser/rango-state.ts +6 -22
- package/src/browser/react/NavigationProvider.tsx +12 -9
- package/src/browser/react/use-router.ts +4 -3
- package/src/browser/response-adapter.ts +27 -1
- package/src/browser/rsc-router.tsx +20 -13
- package/src/browser/server-action-bridge.ts +21 -0
- package/src/browser/types.ts +4 -15
- package/src/cache/cache-runtime.ts +17 -5
- package/src/cache/cache-scope.ts +23 -7
- package/src/cache/cf/cf-cache-store.ts +4 -4
- package/src/cache/handle-snapshot.ts +103 -0
- package/src/cache/memory-segment-store.ts +3 -2
- package/src/cache/types.ts +10 -6
- package/src/prerender/store.ts +9 -7
- package/src/router/lazy-includes.ts +1 -1
- package/src/router/loader-resolution.ts +63 -34
- package/src/router/manifest.ts +1 -1
- package/src/router/match-middleware/cache-lookup.ts +13 -4
- package/src/router/prerender-match.ts +39 -14
- package/src/router/request-classification.ts +36 -9
- package/src/router/router-interfaces.ts +6 -7
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/rsc/handler.ts +30 -8
- package/src/rsc/origin-guard.ts +2 -0
- package/src/rsc/response-route-handler.ts +20 -1
- package/src/rsc/rsc-rendering.ts +10 -0
- package/src/rsc/server-action.ts +16 -2
- package/src/server/context.ts +32 -0
- package/src/server/request-context.ts +47 -9
- package/src/types/loader-types.ts +6 -3
- package/src/urls/path-helper-types.ts +6 -0
- package/src/vite/discovery/prerender-collection.ts +5 -5
- package/src/vite/router-discovery.ts +3 -4
|
@@ -27,6 +27,8 @@ import { _getRequestContext } from "../server/request-context.js";
|
|
|
27
27
|
import {
|
|
28
28
|
isInsideLoaderScope,
|
|
29
29
|
runInsideLoaderBodyScope,
|
|
30
|
+
isInsidePushCallbackScope,
|
|
31
|
+
runInsidePushCallbackScope,
|
|
30
32
|
} from "../server/context.js";
|
|
31
33
|
import { debugLog } from "./logging.js";
|
|
32
34
|
|
|
@@ -290,6 +292,12 @@ function createLoaderExecutor<TEnv>(
|
|
|
290
292
|
);
|
|
291
293
|
}
|
|
292
294
|
const segmentOrder = reqCtx._renderBarrierSegmentOrder ?? [];
|
|
295
|
+
// The complete snapshot is cached at barrier resolution for
|
|
296
|
+
// non-streaming trees, and by rendered() after handleStore.settled for
|
|
297
|
+
// streaming trees (where the eager snapshot would have been incomplete
|
|
298
|
+
// because loading() handlers were still in flight). Either way it is
|
|
299
|
+
// present by the time a loader reads a handle; the fresh build is only
|
|
300
|
+
// a defensive fallback.
|
|
293
301
|
const snapshot =
|
|
294
302
|
reqCtx._renderBarrierHandleSnapshot ??
|
|
295
303
|
buildHandleSnapshot(reqCtx._handleStore, segmentOrder);
|
|
@@ -311,15 +319,7 @@ function createLoaderExecutor<TEnv>(
|
|
|
311
319
|
);
|
|
312
320
|
}
|
|
313
321
|
|
|
314
|
-
// Guard: reject streaming trees
|
|
315
322
|
const reqCtx = reqCtxRef ?? _getRequestContext();
|
|
316
|
-
if (reqCtx?._treeHasStreaming) {
|
|
317
|
-
throw new Error(
|
|
318
|
-
`ctx.rendered() is not supported when the matched route tree uses loading(). ` +
|
|
319
|
-
`Streaming handlers may not have settled when rendered() resolves. ` +
|
|
320
|
-
`Remove loading() from the route tree or restructure to avoid rendered().`,
|
|
321
|
-
);
|
|
322
|
-
}
|
|
323
323
|
|
|
324
324
|
if (renderedPromise) return renderedPromise;
|
|
325
325
|
|
|
@@ -330,7 +330,10 @@ function createLoaderExecutor<TEnv>(
|
|
|
330
330
|
}
|
|
331
331
|
|
|
332
332
|
// Bidirectional deadlock check: if a handler already started
|
|
333
|
-
// awaiting this loader, calling rendered() would deadlock.
|
|
333
|
+
// awaiting this loader, calling rendered() would deadlock. This is the
|
|
334
|
+
// real cycle guard (it holds for both streaming and non-streaming): the
|
|
335
|
+
// handler blocks segment resolution, which blocks the barrier, which
|
|
336
|
+
// blocks this loader.
|
|
334
337
|
if (reqCtx._handlerLoaderDeps?.has(currentLoaderId)) {
|
|
335
338
|
throw new Error(
|
|
336
339
|
`Deadlock: loader "${currentLoaderId}" called ctx.rendered() but a handler ` +
|
|
@@ -348,7 +351,29 @@ function createLoaderExecutor<TEnv>(
|
|
|
348
351
|
}
|
|
349
352
|
reqCtx._renderBarrierWaiters.add(currentLoaderId);
|
|
350
353
|
|
|
351
|
-
|
|
354
|
+
// Streaming trees (loading()): the barrier resolves once the segment
|
|
355
|
+
// tree is resolved, but loading() handlers stream behind Suspense and
|
|
356
|
+
// their handle pushes are still in flight then. Their async execution
|
|
357
|
+
// IS tracked in the handle store (trackHandler -> store.track), so after
|
|
358
|
+
// the barrier we seal (no further handlers register once the tree is
|
|
359
|
+
// resolved) and wait for settled — every tracked handler, streaming
|
|
360
|
+
// included, has finished pushing. The loader's own segment streams in
|
|
361
|
+
// after, so this does not block the shell; the deadlock guard above
|
|
362
|
+
// keeps a handler from depending on this loader.
|
|
363
|
+
const streaming = reqCtx._treeHasStreaming === true;
|
|
364
|
+
renderedPromise = reqCtx._renderBarrier.then(async () => {
|
|
365
|
+
if (streaming) {
|
|
366
|
+
reqCtx._handleStore.seal();
|
|
367
|
+
await reqCtx._handleStore.settled;
|
|
368
|
+
// The eager snapshot was intentionally left unbuilt for streaming
|
|
369
|
+
// (it would have been incomplete). Build the complete one once, now
|
|
370
|
+
// that the store has settled, so every ctx.use(handle) reads the
|
|
371
|
+
// cached snapshot instead of rebuilding it per call.
|
|
372
|
+
reqCtx._renderBarrierHandleSnapshot ??= buildHandleSnapshot(
|
|
373
|
+
reqCtx._handleStore,
|
|
374
|
+
reqCtx._renderBarrierSegmentOrder ?? [],
|
|
375
|
+
);
|
|
376
|
+
}
|
|
352
377
|
renderedResolved = true;
|
|
353
378
|
});
|
|
354
379
|
return renderedPromise;
|
|
@@ -404,12 +429,6 @@ export function setupLoaderAccess<TEnv>(
|
|
|
404
429
|
|
|
405
430
|
const useLoader = createLoaderExecutor(ctx, loaderPromises);
|
|
406
431
|
|
|
407
|
-
// Track whether we're inside a handle push callback. Loaders started
|
|
408
|
-
// from push callbacks (e.g. push(async () => ctx.use(Loader))) do NOT
|
|
409
|
-
// block segment resolution, so they must not be registered as handler
|
|
410
|
-
// dependencies for deadlock detection.
|
|
411
|
-
let insideHandlePush = false;
|
|
412
|
-
|
|
413
432
|
ctx.use = ((item: LoaderDefinition<any, any> | Handle<any, any>) => {
|
|
414
433
|
if (isHandle(item)) {
|
|
415
434
|
const handle = item;
|
|
@@ -430,15 +449,17 @@ export function setupLoaderAccess<TEnv>(
|
|
|
430
449
|
if (!store) return;
|
|
431
450
|
|
|
432
451
|
if (typeof dataOrFn === "function") {
|
|
433
|
-
//
|
|
434
|
-
//
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
452
|
+
// Run the callback inside the push-callback scope so ctx.use(loader)
|
|
453
|
+
// calls it makes — including after its own awaits, for an async
|
|
454
|
+
// callback — are not registered as handler-to-loader deps and do not
|
|
455
|
+
// trip the deadlock guard. A pushed promise value is not tracked by
|
|
456
|
+
// handleStore.settled and does not block segment resolution, so it
|
|
457
|
+
// cannot form a rendered() deadlock. The ALS scope (not a plain
|
|
458
|
+
// boolean) is what survives the callback's awaits.
|
|
459
|
+
const result = runInsidePushCallbackScope(() =>
|
|
460
|
+
(dataOrFn as () => Promise<unknown>)(),
|
|
461
|
+
);
|
|
462
|
+
store.push(handle.$$id, segmentId, result);
|
|
442
463
|
return;
|
|
443
464
|
}
|
|
444
465
|
|
|
@@ -450,9 +471,12 @@ export function setupLoaderAccess<TEnv>(
|
|
|
450
471
|
// Skip when inside a DSL loader scope (resolveLoaderData also calls
|
|
451
472
|
// ctx.use() but that's DSL-to-DSL, not handler-to-loader) or when
|
|
452
473
|
// inside a handle push callback (push callbacks don't block segment
|
|
453
|
-
// resolution so they can't cause rendered() deadlocks).
|
|
474
|
+
// resolution so they can't cause rendered() deadlocks). The push-callback
|
|
475
|
+
// check is an ALS scope so it also exempts an ASYNC callback's continuation
|
|
476
|
+
// after its first await — relevant on streaming trees, where the guard
|
|
477
|
+
// state now stays live until handleStore.settled.
|
|
454
478
|
const loader = item as LoaderDefinition<any, any>;
|
|
455
|
-
if (!isInsideLoaderScope() && !
|
|
479
|
+
if (!isInsideLoaderScope() && !isInsidePushCallbackScope()) {
|
|
456
480
|
const reqCtx = reqCtxRef ?? _getRequestContext();
|
|
457
481
|
if (reqCtx) {
|
|
458
482
|
// Direction 1: handler awaits loader that already called rendered()
|
|
@@ -466,13 +490,18 @@ export function setupLoaderAccess<TEnv>(
|
|
|
466
490
|
`Move the data dependency to a loader-to-loader pattern instead.`,
|
|
467
491
|
);
|
|
468
492
|
}
|
|
469
|
-
// Direction 2: track dep so rendered() can detect the deadlock
|
|
470
|
-
//
|
|
471
|
-
//
|
|
472
|
-
//
|
|
473
|
-
//
|
|
474
|
-
//
|
|
475
|
-
|
|
493
|
+
// Direction 2: track dep so rendered() can detect the deadlock if the
|
|
494
|
+
// loader calls it later. Skip once the guard window is CLOSED — for a
|
|
495
|
+
// non-streaming tree that is when the barrier resolves (rendered()
|
|
496
|
+
// resolves immediately), and for a streaming tree it is when
|
|
497
|
+
// handleStore.settled completes (rendered() keeps waiting until then, so
|
|
498
|
+
// a loading() handler resuming after the barrier can still form a
|
|
499
|
+
// cycle). Using the explicit guard-closed flag rather than
|
|
500
|
+
// _renderBarrierSegmentOrder keeps tracking live across the streaming
|
|
501
|
+
// settle wait. (Handle push callbacks are already excluded above via
|
|
502
|
+
// isInsidePushCallbackScope(), so they cannot produce false positives
|
|
503
|
+
// here.)
|
|
504
|
+
if (!reqCtx._renderBarrierGuardClosed) {
|
|
476
505
|
if (!reqCtx._handlerLoaderDeps) reqCtx._handlerLoaderDeps = new Set();
|
|
477
506
|
reqCtx._handlerLoaderDeps.add(loader.$$id);
|
|
478
507
|
}
|
package/src/router/manifest.ts
CHANGED
|
@@ -32,7 +32,7 @@ import { VERSION } from "@rangojs/router:version";
|
|
|
32
32
|
// own pruned manifest, so alternating sibling requests would thrash (re-run the
|
|
33
33
|
// handler every time). Running the include handler once per isolate instead of once
|
|
34
34
|
// per route is possible but needs an unpruned manifest cache with prune-on-read — see
|
|
35
|
-
// LP1 in docs/internal/matching-
|
|
35
|
+
// LP1 in docs/internal/matching-and-lazy-discovery.md. VERSION comes from the
|
|
36
36
|
// @rangojs/router:version virtual module which Vite invalidates on RSC module HMR.
|
|
37
37
|
// When VERSION changes, this module re-evaluates and the cache is recreated empty.
|
|
38
38
|
const manifestModuleCache = new Map<string, Map<string, EntryData>>();
|
|
@@ -114,6 +114,9 @@ let _deserializeSegments:
|
|
|
114
114
|
let _restoreHandles:
|
|
115
115
|
| typeof import("../../cache/handle-snapshot.js").restoreHandles
|
|
116
116
|
| undefined;
|
|
117
|
+
let _decodeHandles:
|
|
118
|
+
| typeof import("../../cache/handle-snapshot.js").decodeHandles
|
|
119
|
+
| undefined;
|
|
117
120
|
let _hashParams:
|
|
118
121
|
| typeof import("../../prerender/param-hash.js").hashParams
|
|
119
122
|
| undefined;
|
|
@@ -148,6 +151,7 @@ async function ensurePrerenderDeps() {
|
|
|
148
151
|
]);
|
|
149
152
|
_deserializeSegments = codec.deserializeSegments;
|
|
150
153
|
_restoreHandles = snapshot.restoreHandles;
|
|
154
|
+
_decodeHandles = snapshot.decodeHandles;
|
|
151
155
|
_hashParams = paramHash.hashParams;
|
|
152
156
|
_lazyGetRequestContext = reqCtx.getRequestContext;
|
|
153
157
|
if (prerenderStoreInstance === undefined) {
|
|
@@ -174,6 +178,7 @@ async function* yieldFromStore<TEnv>(
|
|
|
174
178
|
if (
|
|
175
179
|
!_deserializeSegments ||
|
|
176
180
|
!_restoreHandles ||
|
|
181
|
+
!_decodeHandles ||
|
|
177
182
|
!_hashParams ||
|
|
178
183
|
!_lazyGetRequestContext
|
|
179
184
|
) {
|
|
@@ -182,11 +187,15 @@ async function* yieldFromStore<TEnv>(
|
|
|
182
187
|
|
|
183
188
|
const segments = await _deserializeSegments(entry.segments);
|
|
184
189
|
|
|
185
|
-
// Replay handle data (same as runtime cache hit path).
|
|
186
|
-
//
|
|
190
|
+
// Replay handle data (same as runtime cache hit path). entry.handles is a
|
|
191
|
+
// Flight-encoded string ("" when none) — decode before restore so
|
|
192
|
+
// Promise/ReactNode handle values are revived, not the corrupted JSON form.
|
|
187
193
|
const handleStore = handleStoreRef ?? _lazyGetRequestContext()?._handleStore;
|
|
188
|
-
if (handleStore) {
|
|
189
|
-
|
|
194
|
+
if (handleStore && entry.handles) {
|
|
195
|
+
const handlesRecord = await _decodeHandles(entry.handles);
|
|
196
|
+
if (handlesRecord) {
|
|
197
|
+
_restoreHandles(handlesRecord, handleStore);
|
|
198
|
+
}
|
|
190
199
|
}
|
|
191
200
|
|
|
192
201
|
state.cacheHit = true;
|
|
@@ -59,11 +59,16 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
59
59
|
devMode?: boolean,
|
|
60
60
|
): Promise<{
|
|
61
61
|
segments: SerializedSegmentData[];
|
|
62
|
-
|
|
62
|
+
/** RSC-encoded handle map ("" when none) — see handle-snapshot.ts. Encoded in
|
|
63
|
+
* the producer (where the Flight codec resolves) so the node-side build/dev
|
|
64
|
+
* sinks can persist it without touching the codec. */
|
|
65
|
+
handles: string;
|
|
63
66
|
routeName: string;
|
|
64
67
|
params: Record<string, string>;
|
|
65
68
|
interceptSegments?: SerializedSegmentData[];
|
|
66
|
-
|
|
69
|
+
/** RSC-encoded MERGED (main + intercept) handle map for the intercept artifact;
|
|
70
|
+
* the sinks store it as-is (no longer merge raw records). */
|
|
71
|
+
interceptHandles?: string;
|
|
67
72
|
passthrough?: true;
|
|
68
73
|
} | null> {
|
|
69
74
|
// 1. Find the matching route entry
|
|
@@ -142,7 +147,7 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
142
147
|
if (!isKnown) {
|
|
143
148
|
return {
|
|
144
149
|
segments: [],
|
|
145
|
-
handles:
|
|
150
|
+
handles: "",
|
|
146
151
|
routeName: matched.routeKey,
|
|
147
152
|
params: matchedParams,
|
|
148
153
|
passthrough: true as const,
|
|
@@ -162,7 +167,7 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
162
167
|
if (err?.name === "Skip") {
|
|
163
168
|
return {
|
|
164
169
|
segments: [],
|
|
165
|
-
handles:
|
|
170
|
+
handles: "",
|
|
166
171
|
routeName: matched.routeKey,
|
|
167
172
|
params: matchedParams,
|
|
168
173
|
passthrough: true as const,
|
|
@@ -261,7 +266,7 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
261
266
|
if (isPrerenderPassthrough(seg.component)) {
|
|
262
267
|
return {
|
|
263
268
|
segments: [],
|
|
264
|
-
handles:
|
|
269
|
+
handles: "",
|
|
265
270
|
routeName: matched.routeKey,
|
|
266
271
|
params: matchedParams,
|
|
267
272
|
passthrough: true as const,
|
|
@@ -278,16 +283,22 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
278
283
|
|
|
279
284
|
// 12. Serialize segments using the cache serializer
|
|
280
285
|
const { serializeSegments } = await import("../cache/segment-codec.js");
|
|
286
|
+
const { encodeHandles } = await import("../cache/handle-snapshot.js");
|
|
281
287
|
const serializedSegments = await serializeSegments(nonLoaderSegments);
|
|
282
288
|
|
|
283
|
-
// 13. Collect handle data per segment (skip segments with no handle data)
|
|
284
|
-
|
|
289
|
+
// 13. Collect handle data per segment (skip segments with no handle data).
|
|
290
|
+
// Encoded through the Flight codec (not stored raw) so Promise/ReactNode
|
|
291
|
+
// handle values survive the JSON-serialized build artifact / dev wire —
|
|
292
|
+
// the same fix the runtime cache uses. Encode happens here, in the RSC
|
|
293
|
+
// environment where the codec resolves; the node-side sinks only persist.
|
|
294
|
+
const handlesRecord: Record<string, SegmentHandleData> = {};
|
|
285
295
|
for (const seg of nonLoaderSegments) {
|
|
286
296
|
const segHandles = handleStore.getDataForSegment(seg.id);
|
|
287
297
|
if (Object.keys(segHandles).length > 0) {
|
|
288
|
-
|
|
298
|
+
handlesRecord[seg.id] = segHandles;
|
|
289
299
|
}
|
|
290
300
|
}
|
|
301
|
+
const handles = await encodeHandles(handlesRecord);
|
|
291
302
|
|
|
292
303
|
// Use the trie-level route key (e.g., "docs", "docs.article")
|
|
293
304
|
const routeName = matched.routeKey;
|
|
@@ -297,7 +308,7 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
297
308
|
// evaluation -- we pre-render all intercepts unconditionally and let
|
|
298
309
|
// runtime matching decide which to serve.
|
|
299
310
|
let interceptSegments: SerializedSegmentData[] | undefined;
|
|
300
|
-
let interceptHandles:
|
|
311
|
+
let interceptHandles: string | undefined;
|
|
301
312
|
|
|
302
313
|
const foundIntercepts: {
|
|
303
314
|
intercept: InterceptEntry;
|
|
@@ -379,13 +390,20 @@ export async function matchForPrerender<TEnv = any>(
|
|
|
379
390
|
interceptSegments = await serializeSegments(
|
|
380
391
|
interceptResolvedSegments,
|
|
381
392
|
);
|
|
382
|
-
|
|
393
|
+
const interceptHandlesRecord: Record<string, SegmentHandleData> = {};
|
|
383
394
|
for (const seg of interceptResolvedSegments) {
|
|
384
395
|
const segHandles = handleStore.getDataForSegment(seg.id);
|
|
385
396
|
if (Object.keys(segHandles).length > 0) {
|
|
386
|
-
|
|
397
|
+
interceptHandlesRecord[seg.id] = segHandles;
|
|
387
398
|
}
|
|
388
399
|
}
|
|
400
|
+
// The intercept artifact serves main + intercept segments together, so
|
|
401
|
+
// encode the MERGED handle map here (the sinks no longer merge raw
|
|
402
|
+
// records — they store this pre-encoded string as-is).
|
|
403
|
+
interceptHandles = await encodeHandles({
|
|
404
|
+
...handlesRecord,
|
|
405
|
+
...interceptHandlesRecord,
|
|
406
|
+
});
|
|
389
407
|
}
|
|
390
408
|
}
|
|
391
409
|
|
|
@@ -414,7 +432,7 @@ export async function renderStaticSegment<TEnv = any>(
|
|
|
414
432
|
routeName?: string,
|
|
415
433
|
buildEnv?: TEnv,
|
|
416
434
|
devMode?: boolean,
|
|
417
|
-
): Promise<{ encoded: string; handles:
|
|
435
|
+
): Promise<{ encoded: string; handles: string } | null> {
|
|
418
436
|
const syntheticUrl = new URL("http://prerender/");
|
|
419
437
|
const syntheticRequest = new Request(syntheticUrl);
|
|
420
438
|
|
|
@@ -492,10 +510,17 @@ export async function renderStaticSegment<TEnv = any>(
|
|
|
492
510
|
};
|
|
493
511
|
|
|
494
512
|
const { serializeSegments } = await import("../cache/segment-codec.js");
|
|
513
|
+
const { encodeHandleValue } = await import("../cache/handle-snapshot.js");
|
|
495
514
|
const [serialized] = await serializeSegments([segment]);
|
|
496
515
|
|
|
497
|
-
// Collect handle data pushed during rendering
|
|
498
|
-
|
|
516
|
+
// Collect handle data pushed during rendering and Flight-encode it (so
|
|
517
|
+
// Promise/ReactNode handle values survive the JSON build artifact). "" when
|
|
518
|
+
// nothing was pushed.
|
|
519
|
+
const segHandles = handleStore.getDataForSegment(handlerId);
|
|
520
|
+
const handles =
|
|
521
|
+
Object.keys(segHandles).length > 0
|
|
522
|
+
? await encodeHandleValue(segHandles)
|
|
523
|
+
: "";
|
|
499
524
|
|
|
500
525
|
return { encoded: serialized.encoded, handles };
|
|
501
526
|
});
|
|
@@ -40,6 +40,12 @@ interface VersionMismatchPlan<TEnv = any> {
|
|
|
40
40
|
reloadUrl: string;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
interface AppSwitchReloadPlan {
|
|
44
|
+
mode: "app-switch";
|
|
45
|
+
/** Clean target URL (internal _rsc_* params stripped) to navigate to. */
|
|
46
|
+
reloadUrl: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
43
49
|
interface ResponseRoutePlan<TEnv = any> {
|
|
44
50
|
mode: "response";
|
|
45
51
|
route: RouteSnapshot<TEnv>;
|
|
@@ -86,6 +92,7 @@ interface PartialRenderPlan<TEnv = any> {
|
|
|
86
92
|
export type RequestPlan<TEnv = any> =
|
|
87
93
|
| RedirectPlan<TEnv>
|
|
88
94
|
| VersionMismatchPlan<TEnv>
|
|
95
|
+
| AppSwitchReloadPlan
|
|
89
96
|
| ResponseRoutePlan<TEnv>
|
|
90
97
|
| LoaderFetchPlan<TEnv>
|
|
91
98
|
| PeRenderPlan<TEnv>
|
|
@@ -94,12 +101,13 @@ export type RequestPlan<TEnv = any> =
|
|
|
94
101
|
| PartialRenderPlan<TEnv>;
|
|
95
102
|
|
|
96
103
|
/**
|
|
97
|
-
* Plans that have passed the terminal-check gate (version-mismatch
|
|
98
|
-
* and are ready for execution. Always have a
|
|
104
|
+
* Plans that have passed the terminal-check gate (version-mismatch and
|
|
105
|
+
* app-switch reloads handled) and are ready for execution. Always have a
|
|
106
|
+
* `route` field.
|
|
99
107
|
*/
|
|
100
108
|
export type ExecutableRequestPlan<TEnv = any> = Exclude<
|
|
101
109
|
RequestPlan<TEnv>,
|
|
102
|
-
VersionMismatchPlan<TEnv>
|
|
110
|
+
VersionMismatchPlan<TEnv> | AppSwitchReloadPlan
|
|
103
111
|
>;
|
|
104
112
|
|
|
105
113
|
/**
|
|
@@ -179,6 +187,30 @@ export async function classifyRequest<TEnv = any>(
|
|
|
179
187
|
};
|
|
180
188
|
}
|
|
181
189
|
|
|
190
|
+
// App switch — also runs BEFORE route resolution (like version-mismatch
|
|
191
|
+
// above), and for the same reason: a cross-app SPA navigation must reload
|
|
192
|
+
// even when the target route does NOT exist in the target app. If we resolved
|
|
193
|
+
// first, a missing route would throw RouteNotFoundError and the 404 would
|
|
194
|
+
// render in-place under the SOURCE app's document — violating the invariant
|
|
195
|
+
// that crossing a host-router app boundary is always a full document load.
|
|
196
|
+
// A mismatched routerId (_rsc_rid) means the navigation crossed an app
|
|
197
|
+
// boundary; force a real document navigation. A soft swap can't faithfully
|
|
198
|
+
// re-establish the target app's document (stylesheets shared across apps are
|
|
199
|
+
// dropped by React 19's by-href dedup; theme/warmup/prefetch-TTL are
|
|
200
|
+
// document-lifetime — see browser/app-shell.ts). Only SPA (`_rsc_partial`)
|
|
201
|
+
// requests need this; a direct full load already IS the document navigation.
|
|
202
|
+
const clientRouterId = url.searchParams.get("_rsc_rid");
|
|
203
|
+
if (
|
|
204
|
+
clientRouterId &&
|
|
205
|
+
clientRouterId !== deps.routerId &&
|
|
206
|
+
url.searchParams.has("_rsc_partial")
|
|
207
|
+
) {
|
|
208
|
+
return {
|
|
209
|
+
mode: "app-switch",
|
|
210
|
+
reloadUrl: stripInternalParams(url).toString(),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
182
214
|
// No metricsStore — classification is a lightweight gating step.
|
|
183
215
|
// Route-matching and manifest-loading metrics belong in the match path
|
|
184
216
|
// (createMatchContextForFull/Partial) which runs the authoritative resolution.
|
|
@@ -252,12 +284,7 @@ export async function classifyRequest<TEnv = any>(
|
|
|
252
284
|
return { mode: "pe-render", route: snapshot };
|
|
253
285
|
}
|
|
254
286
|
|
|
255
|
-
|
|
256
|
-
const clientRouterId = url.searchParams.get("_rsc_rid");
|
|
257
|
-
const isAppSwitch = !!(clientRouterId && clientRouterId !== deps.routerId);
|
|
258
|
-
const isPartial = url.searchParams.has("_rsc_partial") && !isAppSwitch;
|
|
259
|
-
|
|
260
|
-
if (isPartial) {
|
|
287
|
+
if (url.searchParams.has("_rsc_partial")) {
|
|
261
288
|
return { mode: "partial-render", route: snapshot, negotiated };
|
|
262
289
|
}
|
|
263
290
|
|
|
@@ -7,10 +7,7 @@ import type { EntryData } from "../server/context";
|
|
|
7
7
|
import type { ErrorInfo, MatchResult } from "../types";
|
|
8
8
|
import type { NonceProvider } from "../rsc/types.js";
|
|
9
9
|
import type { ExecutionContext } from "../server/request-context.js";
|
|
10
|
-
import type {
|
|
11
|
-
SerializedSegmentData,
|
|
12
|
-
SegmentHandleData,
|
|
13
|
-
} from "../cache/types.js";
|
|
10
|
+
import type { SerializedSegmentData } from "../cache/types.js";
|
|
14
11
|
import type { MiddlewareEntry, MiddlewareFn } from "./middleware.js";
|
|
15
12
|
import { RSC_ROUTER_BRAND } from "./router-registry.js";
|
|
16
13
|
import type { RangoOptions, RootLayoutProps } from "./router-options.js";
|
|
@@ -395,11 +392,13 @@ export interface RangoInternal<
|
|
|
395
392
|
devMode?: boolean,
|
|
396
393
|
): Promise<{
|
|
397
394
|
segments: SerializedSegmentData[];
|
|
398
|
-
|
|
395
|
+
/** RSC-encoded handle map ("" when none) — see handle-snapshot.ts. */
|
|
396
|
+
handles: string;
|
|
399
397
|
routeName: string;
|
|
400
398
|
params: Record<string, string>;
|
|
401
399
|
interceptSegments?: SerializedSegmentData[];
|
|
402
|
-
|
|
400
|
+
/** RSC-encoded MERGED (main + intercept) handle map for the intercept artifact. */
|
|
401
|
+
interceptHandles?: string;
|
|
403
402
|
passthrough?: true;
|
|
404
403
|
} | null>;
|
|
405
404
|
|
|
@@ -413,7 +412,7 @@ export interface RangoInternal<
|
|
|
413
412
|
routeName?: string,
|
|
414
413
|
buildEnv?: any,
|
|
415
414
|
devMode?: boolean,
|
|
416
|
-
): Promise<{ encoded: string; handles:
|
|
415
|
+
): Promise<{ encoded: string; handles: string } | null>;
|
|
417
416
|
|
|
418
417
|
/**
|
|
419
418
|
* Preview match - returns route middleware without segment resolution.
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import type { ReactNode } from "react";
|
|
9
9
|
import { _getRequestContext } from "../../server/request-context.js";
|
|
10
10
|
import type { StaticStore } from "../../prerender/store.js";
|
|
11
|
+
import type { SegmentHandleData } from "../../cache/types.js";
|
|
11
12
|
|
|
12
13
|
// Lazy-initialized static store for production Static handler interception.
|
|
13
14
|
// Remains undefined until first check; null means checked but no manifest.
|
|
@@ -19,6 +20,9 @@ let _staticStore: StaticStore | null | undefined =
|
|
|
19
20
|
? undefined
|
|
20
21
|
: null;
|
|
21
22
|
let _deserializeComponent: ((encoded: string) => Promise<unknown>) | undefined;
|
|
23
|
+
let _decodeHandleValue:
|
|
24
|
+
| typeof import("../../cache/handle-snapshot.js").decodeHandleValue
|
|
25
|
+
| undefined;
|
|
22
26
|
|
|
23
27
|
async function ensureStaticDeps(): Promise<void> {
|
|
24
28
|
if (_staticStore === undefined) {
|
|
@@ -29,6 +33,9 @@ async function ensureStaticDeps(): Promise<void> {
|
|
|
29
33
|
const { deserializeComponent } =
|
|
30
34
|
await import("../../cache/segment-codec.js");
|
|
31
35
|
_deserializeComponent = deserializeComponent;
|
|
36
|
+
const { decodeHandleValue } =
|
|
37
|
+
await import("../../cache/handle-snapshot.js");
|
|
38
|
+
_decodeHandleValue = decodeHandleValue;
|
|
32
39
|
}
|
|
33
40
|
}
|
|
34
41
|
|
|
@@ -53,13 +60,20 @@ export async function tryStaticLookup(
|
|
|
53
60
|
const entry = await _staticStore.get(handlerId);
|
|
54
61
|
if (!entry) return undefined;
|
|
55
62
|
|
|
56
|
-
// Replay handle data captured during build-time rendering.
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
|
|
63
|
+
// Replay handle data captured during build-time rendering. entry.handles is a
|
|
64
|
+
// Flight-encoded string ("" when none) — decode before replay so
|
|
65
|
+
// Promise/ReactNode handle values are revived. The data was keyed by handlerId
|
|
66
|
+
// at build time; replay under segmentId so it matches the segment order used
|
|
67
|
+
// by useHandle on the client.
|
|
68
|
+
if (entry.handles && _decodeHandleValue) {
|
|
60
69
|
const handleStore = _getRequestContext()?._handleStore;
|
|
61
70
|
if (handleStore) {
|
|
62
|
-
|
|
71
|
+
const segHandles = await _decodeHandleValue<SegmentHandleData>(
|
|
72
|
+
entry.handles,
|
|
73
|
+
);
|
|
74
|
+
if (segHandles) {
|
|
75
|
+
handleStore.replaySegmentData(segmentId, segHandles);
|
|
76
|
+
}
|
|
63
77
|
}
|
|
64
78
|
}
|
|
65
79
|
|
package/src/rsc/handler.ts
CHANGED
|
@@ -128,6 +128,22 @@ import {
|
|
|
128
128
|
* });
|
|
129
129
|
* ```
|
|
130
130
|
*/
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Response that tells the client to do a full document navigation. Shared by
|
|
134
|
+
* the terminal reload plans (version-mismatch and app-switch): an empty 200
|
|
135
|
+
* carrying X-RSC-Reload, which the client turns into window.location.href.
|
|
136
|
+
*/
|
|
137
|
+
function createReloadResponse(reloadUrl: string) {
|
|
138
|
+
return createResponseWithMergedHeaders(null, {
|
|
139
|
+
status: 200,
|
|
140
|
+
headers: {
|
|
141
|
+
"X-RSC-Reload": reloadUrl,
|
|
142
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
131
147
|
export function createRSCHandler<
|
|
132
148
|
TEnv = unknown,
|
|
133
149
|
TRoutes extends Record<string, string> = Record<string, string>,
|
|
@@ -642,13 +658,14 @@ export function createRSCHandler<
|
|
|
642
658
|
console.log(
|
|
643
659
|
`[RSC] Version mismatch: client=${url.searchParams.get("_rsc_v")}, server=${version}. Forcing reload.`,
|
|
644
660
|
);
|
|
645
|
-
return
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
661
|
+
return createReloadResponse(plan.reloadUrl);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
if (plan.mode === "app-switch") {
|
|
665
|
+
// Cross-app SPA navigation crossed a host-router app boundary. Force a
|
|
666
|
+
// real document navigation so the target app's document is re-established
|
|
667
|
+
// (stylesheets, theme, warmup, prefetch-TTL). See request-classification.
|
|
668
|
+
return createReloadResponse(plan.reloadUrl);
|
|
652
669
|
}
|
|
653
670
|
|
|
654
671
|
// ---- 3. Origin guard (gate for action/loader/PE modes) ----
|
|
@@ -1068,7 +1085,12 @@ export function createRSCHandler<
|
|
|
1068
1085
|
if (isRscRequest(request, url, isPartial)) {
|
|
1069
1086
|
return createResponseWithMergedHeaders(rscStream, {
|
|
1070
1087
|
status: 404,
|
|
1071
|
-
headers: {
|
|
1088
|
+
headers: {
|
|
1089
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
1090
|
+
// Router identity for the client's pre-decode integrity check; a
|
|
1091
|
+
// same-app 404 matches and applies in place. See response-adapter.
|
|
1092
|
+
"X-RSC-Router-Id": router.id,
|
|
1093
|
+
},
|
|
1072
1094
|
});
|
|
1073
1095
|
}
|
|
1074
1096
|
|
package/src/rsc/origin-guard.ts
CHANGED
|
@@ -131,7 +131,26 @@ export async function handleResponseRoute<TEnv>(
|
|
|
131
131
|
|
|
132
132
|
// Handled before the MIME lookup (json is also a RESPONSE_TYPE_MIME key).
|
|
133
133
|
if (preview.responseType === "json") {
|
|
134
|
-
|
|
134
|
+
// Runtime guard: the json() return type rejects nested Promises at
|
|
135
|
+
// compile time, but an `as`-cast or untyped (JS) handler can still slip
|
|
136
|
+
// one through. JSON.stringify would silently emit {} for it (the
|
|
137
|
+
// forgotten-await footgun — the RSC pipeline awaits nested promises, this
|
|
138
|
+
// path does not). Throw a clear error instead of shipping empty data.
|
|
139
|
+
const body = JSON.stringify(result, (_key, value) => {
|
|
140
|
+
if (
|
|
141
|
+
value != null &&
|
|
142
|
+
typeof (value as { then?: unknown }).then === "function"
|
|
143
|
+
) {
|
|
144
|
+
throw new RouterError(
|
|
145
|
+
"RESPONSE_NOT_SERIALIZABLE",
|
|
146
|
+
"A json() response route returned a Promise (likely a forgotten " +
|
|
147
|
+
"await). Await async values before returning so they serialize, " +
|
|
148
|
+
"instead of emitting an empty {}.",
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
});
|
|
153
|
+
return createResponseWithMergedHeaders(body, {
|
|
135
154
|
status: 200,
|
|
136
155
|
headers: { "content-type": "application/json;charset=utf-8" },
|
|
137
156
|
});
|
package/src/rsc/rsc-rendering.ts
CHANGED
|
@@ -83,6 +83,11 @@ export async function handleRscRendering<TEnv>(
|
|
|
83
83
|
payload = {
|
|
84
84
|
metadata: {
|
|
85
85
|
pathname: url.pathname,
|
|
86
|
+
// routerId is serialized on every payload (including within-session
|
|
87
|
+
// ones) so the frontend can read the current app/router identity. It
|
|
88
|
+
// always equals the current app's id: a cross-app navigation is
|
|
89
|
+
// intercepted server-side (X-RSC-Reload) and never delivers a
|
|
90
|
+
// different-router payload to the client.
|
|
86
91
|
routerId: ctx.router.id,
|
|
87
92
|
segments: result.segments,
|
|
88
93
|
matched: result.matched,
|
|
@@ -180,6 +185,11 @@ export async function handleRscRendering<TEnv>(
|
|
|
180
185
|
const rscHeaders: Record<string, string> = {
|
|
181
186
|
"content-type": "text/x-component;charset=utf-8",
|
|
182
187
|
vary: "accept, X-Rango-State, X-RSC-Router-Client-Path",
|
|
188
|
+
// Router identity, so the client can verify pre-decode (before importing
|
|
189
|
+
// chunks) that this content payload belongs to its app and refuse a
|
|
190
|
+
// foreign one (cache/proxy/bug). Control-only reload/redirect responses
|
|
191
|
+
// are deliberately NOT stamped. See browser/response-adapter.ts.
|
|
192
|
+
"X-RSC-Router-Id": ctx.router.id,
|
|
183
193
|
};
|
|
184
194
|
// Tell the client's prefetch cache to scope this response to its source
|
|
185
195
|
// URL (instead of the default source-agnostic wildcard). Intercept
|