@rangojs/router 0.0.0-experimental.125 → 0.0.0-experimental.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- 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/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- 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/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 +307 -26
- 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 +19 -18
- package/skills/breadcrumbs/SKILL.md +60 -0
- package/skills/server-actions/SKILL.md +25 -1
- package/skills/testing/SKILL.md +17 -17
- package/skills/testing/cache-prerender.md +29 -3
- package/skills/testing/flight.md +13 -10
- package/skills/testing/render-handler.md +3 -0
- package/skills/testing/server-tree.md +1 -1
- package/skills/testing/setup.md +1 -1
- package/src/browser/partial-update.ts +22 -1
- package/src/browser/react/use-router.ts +2 -1
- package/src/browser/rsc-router.tsx +8 -1
- package/src/browser/server-action-bridge.ts +51 -3
- package/src/browser/types.ts +23 -4
- package/src/browser/validate-redirect-origin.ts +43 -15
- package/src/build/index.ts +8 -9
- package/src/build/route-trie.ts +43 -11
- package/src/cache/cache-runtime.ts +21 -0
- package/src/cache/document-cache.ts +10 -0
- package/src/cache/profile-registry.ts +6 -34
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +5 -0
- package/src/context-var.ts +12 -0
- package/src/defer.ts +196 -0
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/index.rsc.ts +7 -0
- package/src/index.ts +7 -0
- package/src/redirect-origin.ts +100 -0
- package/src/route-definition/redirect.ts +32 -8
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/router/find-match.ts +0 -1
- package/src/router/loader-resolution.ts +22 -21
- package/src/router/match-middleware/cache-lookup.ts +95 -125
- package/src/router/match-middleware/segment-resolution.ts +0 -1
- package/src/router/middleware-types.ts +0 -1
- package/src/router/middleware.ts +71 -31
- package/src/router/pattern-matching.ts +4 -23
- package/src/router/prerender-match.ts +27 -6
- package/src/router/revalidation.ts +9 -4
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +0 -1
- package/src/router/router-interfaces.ts +10 -0
- package/src/router/segment-resolution/loader-cache.ts +25 -10
- package/src/router/segment-resolution/revalidation.ts +185 -243
- package/src/router/segment-wrappers.ts +0 -3
- package/src/router/trie-matching.ts +3 -5
- package/src/router.ts +4 -9
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +9 -2
- package/src/rsc/helpers.ts +56 -3
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/origin-guard.ts +10 -4
- package/src/rsc/progressive-enhancement.ts +8 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-route-handler.ts +23 -18
- package/src/rsc/server-action.ts +4 -1
- package/src/rsc/types.ts +6 -2
- package/src/server/request-context.ts +22 -13
- package/src/testing/cache-status.ts +44 -1
- package/src/testing/dispatch.ts +43 -6
- package/src/testing/e2e/index.ts +1 -0
- package/src/testing/flight.ts +48 -2
- package/src/testing/index.ts +1 -0
- package/src/testing/render-handler.ts +31 -12
- package/src/testing/render-route.tsx +75 -13
- package/src/types/handler-context.ts +28 -1
- package/src/vite/discovery/discover-routers.ts +22 -11
- package/src/vite/discovery/prerender-collection.ts +2 -4
- package/src/vite/discovery/state.ts +5 -0
- package/src/vite/plugin-types.ts +32 -8
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -10
- package/src/vite/rango.ts +1 -0
- package/src/vite/router-discovery.ts +7 -0
- package/src/router/middleware-cookies.ts +0 -42
package/src/testing/flight.ts
CHANGED
|
@@ -70,6 +70,14 @@ export interface RenderToFlightStringOptions {
|
|
|
70
70
|
params?: Record<string, string>;
|
|
71
71
|
/** Matched route name (drives `ctx.routeName` and scoped reverse). */
|
|
72
72
|
routeName?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Route name -> pattern map enabling a SCOPED `ctx.reverse()` (like
|
|
75
|
+
* `renderHandler`). Without it, a server component that reverses resolves
|
|
76
|
+
* against the GLOBAL route map and is order-dependent on whatever router
|
|
77
|
+
* registered last. Pass the router-under-test's map to make reversing
|
|
78
|
+
* deterministic.
|
|
79
|
+
*/
|
|
80
|
+
routeMap?: Record<string, string>;
|
|
73
81
|
/**
|
|
74
82
|
* Context variables visible to the rendered tree via `ctx.get(...)` — as a
|
|
75
83
|
* prior middleware would have set them. Seeds the SAME way the handler-test
|
|
@@ -82,6 +90,44 @@ export interface RenderToFlightStringOptions {
|
|
|
82
90
|
|
|
83
91
|
const DEFAULT_URL = "http://localhost/";
|
|
84
92
|
|
|
93
|
+
/**
|
|
94
|
+
* True when `error` is the out-of-react-server stub thrown by index.ts's
|
|
95
|
+
* server-only exports (getRequestContext/cookies/headers/...) — i.e. the bare
|
|
96
|
+
* `@rangojs/router` specifier resolved to index.ts, not index.rsc.ts, because
|
|
97
|
+
* the rsc Vitest project is missing the `rangoTestAliases` alias. Matches both
|
|
98
|
+
* substrings of `serverOnlyStubError` (index.ts) so a normal app error cannot
|
|
99
|
+
* over-match. Shared with render-handler.ts so the two Flight primitives report
|
|
100
|
+
* the same misconfiguration identically.
|
|
101
|
+
*/
|
|
102
|
+
export function isServerOnlyStubError(error: unknown): boolean {
|
|
103
|
+
return (
|
|
104
|
+
error instanceof Error &&
|
|
105
|
+
error.message.includes("is only available from") &&
|
|
106
|
+
error.message.includes("react-server")
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Rethrow a server tree render error. When it is the missing-rsc-alias stub
|
|
112
|
+
* (above), rethrow an actionable message naming `rangoTestAliases` instead of
|
|
113
|
+
* the opaque stub text; otherwise rethrow the original unchanged. Classify the
|
|
114
|
+
* ORIGINAL error before constructing the wrapper so the wrapper's `Original: ...`
|
|
115
|
+
* echo (which re-embeds the matched substrings) never re-triggers the predicate.
|
|
116
|
+
*/
|
|
117
|
+
function rethrowFlightRenderError(error: unknown): never {
|
|
118
|
+
if (isServerOnlyStubError(error)) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`The server component called a server-only API ` +
|
|
121
|
+
`(getRequestContext/cookies/headers/...) but "@rangojs/router" resolved to ` +
|
|
122
|
+
`the out-of-react-server stub. Add rangoTestAliases({ preset }) to your ` +
|
|
123
|
+
`vitest.rsc.config.ts \`resolve.alias\` so the bare specifier maps to ` +
|
|
124
|
+
`index.rsc.ts (the real react-server implementations). ` +
|
|
125
|
+
`Original: ${(error as Error).message}`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
|
|
85
131
|
export function assertNoLegacyUrlOption(opts: object, fnName: string): void {
|
|
86
132
|
if ("url" in opts) {
|
|
87
133
|
throw new Error(
|
|
@@ -148,7 +194,7 @@ export async function serializeToFlightString(
|
|
|
148
194
|
});
|
|
149
195
|
|
|
150
196
|
return runWithRequestContext(ctx, () => {
|
|
151
|
-
setRequestContextParams(opts.params ?? {}, opts.routeName);
|
|
197
|
+
setRequestContextParams(opts.params ?? {}, opts.routeName, opts.routeMap);
|
|
152
198
|
return serializeNodeToFlight(element, clientManifest, url.pathname);
|
|
153
199
|
});
|
|
154
200
|
}
|
|
@@ -170,7 +216,7 @@ export async function serializeNodeToFlight(
|
|
|
170
216
|
},
|
|
171
217
|
});
|
|
172
218
|
const text = await new Response(stream).text();
|
|
173
|
-
if (didError)
|
|
219
|
+
if (didError) rethrowFlightRenderError(renderError);
|
|
174
220
|
return text;
|
|
175
221
|
}
|
|
176
222
|
|
package/src/testing/index.ts
CHANGED
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
import { createHandlerContext } from "../router/handler-context.js";
|
|
32
32
|
import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
|
|
33
33
|
import { isHandle, type Handle } from "../handle.js";
|
|
34
|
+
import { withDefer } from "../defer.js";
|
|
34
35
|
import type { HandlerContext } from "../types/handler-context.js";
|
|
35
36
|
import type { LoaderDefinition } from "../types.js";
|
|
36
37
|
import {
|
|
@@ -41,7 +42,13 @@ import {
|
|
|
41
42
|
} from "./internal/seed-vars.js";
|
|
42
43
|
|
|
43
44
|
export type { StateCookieSeed } from "./internal/seed-vars.js";
|
|
44
|
-
import {
|
|
45
|
+
import {
|
|
46
|
+
assertNoLegacyUrlOption,
|
|
47
|
+
serializeNodeToFlight,
|
|
48
|
+
isServerOnlyStubError,
|
|
49
|
+
} from "./flight.js";
|
|
50
|
+
import type { SegmentCacheStore } from "../cache/types.js";
|
|
51
|
+
import type { CacheProfile } from "../cache/profile-registry.js";
|
|
45
52
|
import {
|
|
46
53
|
deserializeFlight,
|
|
47
54
|
makeClientManifest,
|
|
@@ -94,6 +101,19 @@ export interface RenderHandlerOptions<TEnv = any> {
|
|
|
94
101
|
* `result.stateCookieName`.
|
|
95
102
|
*/
|
|
96
103
|
stateCookie?: StateCookieSeed;
|
|
104
|
+
/**
|
|
105
|
+
* Segment cache store backing a `"use cache"` function the handler invokes
|
|
106
|
+
* (e.g. `new MemorySegmentCacheStore()`). Without it, `registerCachedFunction`
|
|
107
|
+
* takes the uncached bypass and the cached path is NOT exercised (the runtime
|
|
108
|
+
* emits a one-time warning under the test runner). Pair with `cacheProfiles`
|
|
109
|
+
* so the profile the directive names resolves.
|
|
110
|
+
*/
|
|
111
|
+
cacheStore?: SegmentCacheStore;
|
|
112
|
+
/**
|
|
113
|
+
* Cache profiles in the `createRouter({ cacheProfiles })` shape, required for
|
|
114
|
+
* `"use cache: profileName"` resolution once a `cacheStore` is wired.
|
|
115
|
+
*/
|
|
116
|
+
cacheProfiles?: Record<string, CacheProfile>;
|
|
97
117
|
}
|
|
98
118
|
|
|
99
119
|
/** Result of {@link renderHandler}. */
|
|
@@ -142,14 +162,6 @@ function headersToObject(headers: Headers): Record<string, string> {
|
|
|
142
162
|
return out;
|
|
143
163
|
}
|
|
144
164
|
|
|
145
|
-
function isServerOnlyStubError(error: unknown): boolean {
|
|
146
|
-
return (
|
|
147
|
-
error instanceof Error &&
|
|
148
|
-
error.message.includes("is only available from") &&
|
|
149
|
-
error.message.includes("react-server")
|
|
150
|
-
);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
165
|
function toRequest(
|
|
154
166
|
request: Request | string | undefined,
|
|
155
167
|
headers?: HeadersInit,
|
|
@@ -211,6 +223,8 @@ export async function renderHandler<TEnv = any>(
|
|
|
211
223
|
variables: seedVariables({}, opts.vars),
|
|
212
224
|
stateCookieName,
|
|
213
225
|
version: opts.stateCookie?.version,
|
|
226
|
+
cacheStore: opts.cacheStore,
|
|
227
|
+
cacheProfiles: opts.cacheProfiles,
|
|
214
228
|
});
|
|
215
229
|
|
|
216
230
|
const loaderSeeds = new Map<unknown, unknown>(opts.loaders ?? []);
|
|
@@ -222,7 +236,11 @@ export async function renderHandler<TEnv = any>(
|
|
|
222
236
|
let didThrow = false;
|
|
223
237
|
|
|
224
238
|
await runWithRequestContext(reqCtx as RequestContext<TEnv>, async () => {
|
|
225
|
-
|
|
239
|
+
// Scope the request-context reverse to opts.routeMap too (not just the
|
|
240
|
+
// handler context built below), so a nested server component reading
|
|
241
|
+
// getRequestContext().reverse() resolves against the same map as the
|
|
242
|
+
// handler's ctx.reverse -- matching renderToFlightString/renderServerTree.
|
|
243
|
+
setRequestContextParams(opts.params ?? {}, opts.routeName, opts.routeMap);
|
|
226
244
|
const hctx = createHandlerContext<TEnv>(
|
|
227
245
|
opts.params ?? {},
|
|
228
246
|
reqCtx.request,
|
|
@@ -236,7 +254,8 @@ export async function renderHandler<TEnv = any>(
|
|
|
236
254
|
(hctx as { use: unknown }).use = (item: unknown) => {
|
|
237
255
|
if (isHandle(item)) {
|
|
238
256
|
const handle = item as Handle<any, any>;
|
|
239
|
-
|
|
257
|
+
// withDefer attaches .defer() so the harness mirrors production's push.
|
|
258
|
+
return withDefer((dataOrFn: unknown) => {
|
|
240
259
|
const value =
|
|
241
260
|
typeof dataOrFn === "function"
|
|
242
261
|
? (dataOrFn as () => unknown)()
|
|
@@ -244,7 +263,7 @@ export async function renderHandler<TEnv = any>(
|
|
|
244
263
|
const pushed = handlePushes.get(handle) ?? [];
|
|
245
264
|
pushed.push(value);
|
|
246
265
|
handlePushes.set(handle, pushed);
|
|
247
|
-
};
|
|
266
|
+
});
|
|
248
267
|
}
|
|
249
268
|
if (loaderSeeds.has(item)) return loaderSeeds.get(item);
|
|
250
269
|
throw new RenderHandlerSetupError(
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
* client context (see the `loaders` / `locationState` / `handles` options) —
|
|
24
24
|
* nothing is executed on the server. This exercises the read path
|
|
25
25
|
* (useLoader / useLocationState / useHandle from context), not the run path.
|
|
26
|
+
* - navigate() commits synchronously, so it does NOT drive the navigation
|
|
27
|
+
* lifecycle: useNavigation().state, useLinkStatus().pending, and
|
|
28
|
+
* useAction().state stay "idle". Assert pending/loading/submitting transition
|
|
29
|
+
* states with renderServerTree / e2e instead (navigate() warns once if used).
|
|
26
30
|
* What it DOES cover: client hooks that read NavigationProvider /
|
|
27
31
|
* OutletContext — useParams, useReverse, useHref, useMount, useNavigation,
|
|
28
32
|
* useRouter, usePathname, useSearchParams, Outlet nesting, useLoader /
|
|
@@ -53,6 +57,7 @@ import type { LocationStateDefinition } from "../browser/react/location-state-sh
|
|
|
53
57
|
import type { Handle } from "../handle.js";
|
|
54
58
|
import type { ThemeConfig } from "../theme/types.js";
|
|
55
59
|
import { resolveThemeConfig } from "../theme/constants.js";
|
|
60
|
+
import { isUnderTestRunner } from "../runtime-env.js";
|
|
56
61
|
|
|
57
62
|
const TEST_ORIGIN = "http://localhost";
|
|
58
63
|
|
|
@@ -160,7 +165,10 @@ export interface RenderRouteOptions {
|
|
|
160
165
|
/**
|
|
161
166
|
* Explicit params. Merged over (and overriding) params extracted from the
|
|
162
167
|
* `request` URL. Use this when the URL alone cannot express the params, or to
|
|
163
|
-
* avoid relying on URL parsing.
|
|
168
|
+
* avoid relying on URL parsing. Supplying params also OPTS OUT of the
|
|
169
|
+
* request/leaf match check: a `request` whose pathname does not resolve the
|
|
170
|
+
* leaf is normally rejected under the test runner, but passing params here
|
|
171
|
+
* tells renderRoute the request is intentionally not the param source.
|
|
164
172
|
*/
|
|
165
173
|
params?: Record<string, string>;
|
|
166
174
|
/**
|
|
@@ -224,6 +232,10 @@ export interface RenderRouteOptions {
|
|
|
224
232
|
* exactly as `renderSegments` does in production (a segment whose `mountPath`
|
|
225
233
|
* is set is wrapped in a MountContextProvider). Normalized like a path prefix
|
|
226
234
|
* (leading slash forced, trailing stripped, bare "/" -> root). Defaults to "/".
|
|
235
|
+
* An explicitly-passed `request` must match the leaf `path` directly (paths are
|
|
236
|
+
* include-RELATIVE; the mount does NOT rewrite the request) — pass the relative
|
|
237
|
+
* path, not the mount-prefixed one, or renderRoute throws rather than silently
|
|
238
|
+
* rendering empty params.
|
|
227
239
|
*
|
|
228
240
|
* @example
|
|
229
241
|
* renderRoute([{ path: "/c/wine", Component: ProductPage }], { mount: "/shop" });
|
|
@@ -404,6 +416,32 @@ export async function renderRoute(
|
|
|
404
416
|
|
|
405
417
|
const historyKey = generateHistoryKey(url.href);
|
|
406
418
|
const mount = normalizeBasename(options.mount);
|
|
419
|
+
// Fail loud on a request that cannot resolve the leaf route (a typo, or the
|
|
420
|
+
// mount-prefixed-vs-relative confusion) instead of silently rendering empty
|
|
421
|
+
// params (matchLeaf -> null -> {}). renderRoute paths are include-RELATIVE and
|
|
422
|
+
// resolve() matches the request against the leaf as-is, so the request must be
|
|
423
|
+
// the relative form — a mount does NOT rewrite it. Only checked when `request`
|
|
424
|
+
// was passed explicitly (a defaulted request is staticPrefix of the leaf and
|
|
425
|
+
// always matches). Skipped when explicit `params` are supplied: those are
|
|
426
|
+
// merged over the URL-extracted params in resolve(), so the request is
|
|
427
|
+
// intentionally not the param source and an empty matchLeaf is not the trap.
|
|
428
|
+
// Gated on the test runner so it can never affect production.
|
|
429
|
+
if (
|
|
430
|
+
options.request !== undefined &&
|
|
431
|
+
Object.keys(options.params ?? {}).length === 0 &&
|
|
432
|
+
isUnderTestRunner() &&
|
|
433
|
+
matchLeaf(leaf.path, url.pathname) === null
|
|
434
|
+
) {
|
|
435
|
+
throw new Error(
|
|
436
|
+
`renderRoute: request "${url.pathname}" does not match the leaf route ` +
|
|
437
|
+
`"${leaf.path}"${mount ? ` (mount "${mount}")` : ""}. renderRoute paths ` +
|
|
438
|
+
`are include-RELATIVE: pass a request that matches "${leaf.path}" ` +
|
|
439
|
+
`(e.g. "${staticPrefix(leaf.path)}"). A mount does NOT auto-rewrite the ` +
|
|
440
|
+
`request — pass the relative path, not the mount-prefixed one. If the ` +
|
|
441
|
+
`request URL intentionally does not carry the params, pass them ` +
|
|
442
|
+
`explicitly via the \`params\` option to bypass this check.`,
|
|
443
|
+
);
|
|
444
|
+
}
|
|
407
445
|
const initialSegments = buildSegments(
|
|
408
446
|
routes,
|
|
409
447
|
initialMatch.params,
|
|
@@ -434,7 +472,23 @@ export async function renderRoute(
|
|
|
434
472
|
initialSegments.map((s) => s.id),
|
|
435
473
|
);
|
|
436
474
|
|
|
475
|
+
let warnedNavLifecycle = false;
|
|
437
476
|
const navigate = async (target: string): Promise<void> => {
|
|
477
|
+
// renderRoute commits navigations synchronously (no server fetch, no Flight
|
|
478
|
+
// stream), so it never drives the navigation lifecycle. The transition state
|
|
479
|
+
// useNavigation()/useLinkStatus()/useAction() read stays "idle" — asserting a
|
|
480
|
+
// pending/loading/submitting state here proves nothing. Warn once (per render)
|
|
481
|
+
// under the test runner so that false-confidence trap is loud, not silent.
|
|
482
|
+
if (isUnderTestRunner() && !warnedNavLifecycle) {
|
|
483
|
+
warnedNavLifecycle = true;
|
|
484
|
+
console.warn(
|
|
485
|
+
"renderRoute: navigate()/useRouter().push commit synchronously and do " +
|
|
486
|
+
"NOT drive the navigation lifecycle. useNavigation().state, " +
|
|
487
|
+
'useLinkStatus().pending, and useAction().state stay "idle" here. ' +
|
|
488
|
+
"Assert params/pathname/content after navigate(); use renderServerTree " +
|
|
489
|
+
"or e2e to assert pending/loading/submitting transition states.",
|
|
490
|
+
);
|
|
491
|
+
}
|
|
438
492
|
const nextUrl = new URL(target, TEST_ORIGIN);
|
|
439
493
|
const match = resolve(nextUrl.pathname);
|
|
440
494
|
const segments = buildSegments(routes, match.params, loaderData, mount);
|
|
@@ -465,18 +519,26 @@ export async function renderRoute(
|
|
|
465
519
|
);
|
|
466
520
|
const initialTree = await renderSegments(initialSegments);
|
|
467
521
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
522
|
+
// Wrap render in an awaited async act so a tree that suspends (async loaders,
|
|
523
|
+
// loading states, deferred handle entries that arrive as a Promise) settles its
|
|
524
|
+
// Suspense within act — otherwise React orphans the resolution ("a component
|
|
525
|
+
// suspended inside an act scope, but the act call was not awaited") and the
|
|
526
|
+
// resolved content never reaches the asserted DOM.
|
|
527
|
+
let result!: Awaited<ReturnType<typeof render>>;
|
|
528
|
+
await act(async () => {
|
|
529
|
+
result = render(
|
|
530
|
+
<NavigationProvider
|
|
531
|
+
store={store}
|
|
532
|
+
eventController={eventController}
|
|
533
|
+
initialPayload={{ root: initialTree, metadata: initialMetadata }}
|
|
534
|
+
bridge={bridge}
|
|
535
|
+
basename={normalizeBasename(options.basename)}
|
|
536
|
+
themeConfig={
|
|
537
|
+
options.theme === undefined ? null : resolveThemeConfig(options.theme)
|
|
538
|
+
}
|
|
539
|
+
/>,
|
|
540
|
+
);
|
|
541
|
+
});
|
|
480
542
|
|
|
481
543
|
const router: TestRouterHandle = {
|
|
482
544
|
navigate,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
2
|
import type { Handle } from "../handle.js";
|
|
3
|
+
import type { HandlePush } from "../defer.js";
|
|
3
4
|
import type { ContextVar } from "../context-var.js";
|
|
4
5
|
import type { MiddlewareFn } from "../router/middleware.js";
|
|
5
6
|
import type { Theme } from "../theme/types.js";
|
|
@@ -274,6 +275,8 @@ export type HandlerContext<
|
|
|
274
275
|
* For handles: Returns a push function to add data for this segment.
|
|
275
276
|
* Handle data accumulates across all matched route segments.
|
|
276
277
|
* Push accepts: direct value, Promise, or async callback (executed immediately).
|
|
278
|
+
* Or call `.defer()` to reserve the slot now and resolve it later (e.g. from a
|
|
279
|
+
* deep async component), with a timeout safety net — see {@link HandlePush}.
|
|
277
280
|
*
|
|
278
281
|
* @example
|
|
279
282
|
* ```typescript
|
|
@@ -307,6 +310,13 @@ export type HandlerContext<
|
|
|
307
310
|
* });
|
|
308
311
|
* return <ProductPage />;
|
|
309
312
|
* });
|
|
313
|
+
*
|
|
314
|
+
* // Handle usage - deferred (reserve the slot now, resolve from a deep component)
|
|
315
|
+
* route("product", (ctx) => {
|
|
316
|
+
* const resolve = ctx.use(Breadcrumbs).defer({ timeoutMs: 5000, else: null });
|
|
317
|
+
* loadCrumb(ctx.params.id).then(resolve); // resolver is push-equal
|
|
318
|
+
* return <ProductPage />; // auto-resolves to `else` on timeout
|
|
319
|
+
* });
|
|
310
320
|
* ```
|
|
311
321
|
*/
|
|
312
322
|
use: {
|
|
@@ -315,7 +325,7 @@ export type HandlerContext<
|
|
|
315
325
|
): Promise<T>;
|
|
316
326
|
<TData, TAccumulated = TData[]>(
|
|
317
327
|
handle: Handle<TData, TAccumulated>,
|
|
318
|
-
):
|
|
328
|
+
): HandlePush<TData>;
|
|
319
329
|
};
|
|
320
330
|
/**
|
|
321
331
|
* Current theme (from cookie or default).
|
|
@@ -422,6 +432,18 @@ export type InternalHandlerContext<
|
|
|
422
432
|
_responseType?: string;
|
|
423
433
|
/** Route name for cache key scoping (prevents cross-route collisions). */
|
|
424
434
|
_routeName?: string;
|
|
435
|
+
/**
|
|
436
|
+
* @internal Loader-cache override table: loaderId -> memoized data promise.
|
|
437
|
+
* A single stable ctx.use interceptor consults this instead of chaining one
|
|
438
|
+
* wrapper per cached loader (avoids O(N) dispatch). See loader-cache.ts.
|
|
439
|
+
*/
|
|
440
|
+
_loaderCacheOverrides?: Map<string, Promise<any>>;
|
|
441
|
+
/**
|
|
442
|
+
* @internal ctx.use captured before the loader-cache interceptor was installed.
|
|
443
|
+
* The cache-miss execute runs the loader through this, bypassing the override
|
|
444
|
+
* table (so a loader cannot await its own in-flight memoized promise).
|
|
445
|
+
*/
|
|
446
|
+
_loaderCacheOriginalUse?: (item: any) => any;
|
|
425
447
|
};
|
|
426
448
|
|
|
427
449
|
/**
|
|
@@ -613,6 +635,10 @@ export type ShouldRevalidateFn<TParams = GenericParams, TEnv = any> = (args: {
|
|
|
613
635
|
* namespace import (`import * as CartActions`), any export of that module —
|
|
614
636
|
* and `false` otherwise (including plain navigation with no action).
|
|
615
637
|
*
|
|
638
|
+
* Called with NO arguments it answers "is this request an action at all?":
|
|
639
|
+
* `true` for any action, `false` on plain navigation. Use the bare form when
|
|
640
|
+
* you want to revalidate on every action regardless of which one fired.
|
|
641
|
+
*
|
|
616
642
|
* Prefer this over hand-written `actionId` substring matches: it resolves the
|
|
617
643
|
* action's stable `path#export` id from the imported reference, so a rename is
|
|
618
644
|
* a type error in one place instead of silent drift across consumers. It
|
|
@@ -627,6 +653,7 @@ export type ShouldRevalidateFn<TParams = GenericParams, TEnv = any> = (args: {
|
|
|
627
653
|
* import { addToCart, removeFromCart } from "./actions/cart";
|
|
628
654
|
* import * as CartActions from "./actions/cart";
|
|
629
655
|
*
|
|
656
|
+
* revalidate((ctx) => ctx.isAction() || undefined); // any action
|
|
630
657
|
* revalidate((ctx) => ctx.isAction(addToCart) || undefined); // one action
|
|
631
658
|
* revalidate((ctx) => ctx.isAction(addToCart, removeFromCart) || undefined); // several
|
|
632
659
|
* revalidate((ctx) => ctx.isAction(CartActions) || undefined); // any in the module
|
|
@@ -11,6 +11,16 @@ import {
|
|
|
11
11
|
formatNestedRouterConflictError,
|
|
12
12
|
findNestedRouterConflict,
|
|
13
13
|
} from "../../build/generate-route-types.js";
|
|
14
|
+
// Pure data transforms over generateManifestFull's output. Imported directly
|
|
15
|
+
// from source (not the public ./build barrel, and not the runner) because they
|
|
16
|
+
// are realm-independent: buildRouteTrie/buildPerRouterTrie operate on plain
|
|
17
|
+
// manifest data, and collectFallbackClientRefs keys on the global-registry
|
|
18
|
+
// Symbol.for("react.client.reference"), so it detects client references in a
|
|
19
|
+
// boundary tree regardless of which realm imported the walker. Only
|
|
20
|
+
// generateManifestFull must stay on the runner (it invokes user handlers via
|
|
21
|
+
// RangoContext from the runner realm) — see the runner.import below.
|
|
22
|
+
import { buildRouteTrie, buildPerRouterTrie } from "../../build/route-trie.js";
|
|
23
|
+
import { collectFallbackClientRefs } from "../../build/collect-fallback-refs.js";
|
|
14
24
|
import {
|
|
15
25
|
flattenLeafEntries,
|
|
16
26
|
buildRouteToStaticPrefix,
|
|
@@ -107,7 +117,10 @@ export async function discoverRouters(
|
|
|
107
117
|
}
|
|
108
118
|
}
|
|
109
119
|
|
|
110
|
-
//
|
|
120
|
+
// generateManifestFull must run in the RSC runner realm: it invokes the
|
|
121
|
+
// user's urlpatterns.handler() via RangoContext, consuming router instances
|
|
122
|
+
// from the runner. The trie/fallback-ref builders are pure transforms over
|
|
123
|
+
// its output and are imported directly from source above.
|
|
111
124
|
const buildMod = await timed(
|
|
112
125
|
debug,
|
|
113
126
|
"inner: import @rangojs/router/build",
|
|
@@ -158,11 +171,12 @@ export async function discoverRouters(
|
|
|
158
171
|
// are NOT in EntryData, so generateManifestFull's walk misses them. Collect any
|
|
159
172
|
// "use client" default boundary directly off the router instance. The value is
|
|
160
173
|
// commonly a handler function wrapping the client boundary in server providers,
|
|
161
|
-
// so collectFallbackClientRefs invokes + walks the tree.
|
|
162
|
-
// so it
|
|
174
|
+
// so collectFallbackClientRefs invokes + walks the tree. The walker keys on the
|
|
175
|
+
// global-registry Symbol.for("react.client.reference"), so it detects client
|
|
176
|
+
// references in a runner-realm boundary tree even when imported here directly.
|
|
163
177
|
const collectFromBoundaryNode = (node: unknown): void => {
|
|
164
|
-
if (collectClientFallbackRef
|
|
165
|
-
|
|
178
|
+
if (collectClientFallbackRef) {
|
|
179
|
+
collectFallbackClientRefs(node, collectClientFallbackRef);
|
|
166
180
|
}
|
|
167
181
|
};
|
|
168
182
|
|
|
@@ -293,8 +307,7 @@ export async function discoverRouters(
|
|
|
293
307
|
let newMergedRouteTrie: any = null;
|
|
294
308
|
const trieStart = debug ? performance.now() : 0;
|
|
295
309
|
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
296
|
-
|
|
297
|
-
if (buildRouteTrie && mergedRouteAncestry) {
|
|
310
|
+
if (mergedRouteAncestry) {
|
|
298
311
|
// Build routeToStaticPrefix from saved manifests
|
|
299
312
|
const routeToStaticPrefix: Record<string, string> = {};
|
|
300
313
|
for (const { manifest } of allManifests) {
|
|
@@ -342,11 +355,9 @@ export async function discoverRouters(
|
|
|
342
355
|
// Build per-router tries for multi-router isolation. Uses the single
|
|
343
356
|
// shared buildPerRouterTrie so the production serialized trie is built by
|
|
344
357
|
// exactly the same code as the dev/HMR runtime rebuild (manifest-init.ts).
|
|
345
|
-
|
|
358
|
+
// Returns null for route-less manifests (route-trie.ts).
|
|
346
359
|
for (const { id, manifest } of allManifests) {
|
|
347
|
-
const perRouterTrie = buildPerRouterTrie
|
|
348
|
-
? buildPerRouterTrie(manifest)
|
|
349
|
-
: null;
|
|
360
|
+
const perRouterTrie = buildPerRouterTrie(manifest);
|
|
350
361
|
if (perRouterTrie) {
|
|
351
362
|
newPerRouterTrieMap.set(id, perRouterTrie);
|
|
352
363
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* generation.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { contextSet } from "../../context-var.js";
|
|
9
|
+
import { contextSet, hasContextVars } from "../../context-var.js";
|
|
10
10
|
import {
|
|
11
11
|
encodePathParam,
|
|
12
12
|
substituteRouteParams,
|
|
@@ -135,9 +135,7 @@ export async function expandPrerenderRoutes(
|
|
|
135
135
|
(performance.now() - getParamsStart).toFixed(1),
|
|
136
136
|
);
|
|
137
137
|
const concurrency = def.options?.concurrency ?? 1;
|
|
138
|
-
const hasBuildVars =
|
|
139
|
-
Object.keys(buildVars).length > 0 ||
|
|
140
|
-
Object.getOwnPropertySymbols(buildVars).length > 0;
|
|
138
|
+
const hasBuildVars = hasContextVars(buildVars);
|
|
141
139
|
for (const params of paramsList) {
|
|
142
140
|
let url = substituteRouteParams(
|
|
143
141
|
pattern,
|
|
@@ -20,6 +20,11 @@ export interface PluginOptions {
|
|
|
20
20
|
buildEnv?: import("../plugin-types.js").BuildEnvOption;
|
|
21
21
|
/** Deployment preset (needed for buildEnv "auto" resolution). */
|
|
22
22
|
preset?: "node" | "cloudflare";
|
|
23
|
+
/**
|
|
24
|
+
* Route-discovery scan filter (glob include/exclude) from rango() config.
|
|
25
|
+
* Compiled into `DiscoveryState.scanFilter` once `projectRoot` is known.
|
|
26
|
+
*/
|
|
27
|
+
discovery?: { include?: string[]; exclude?: string[] };
|
|
23
28
|
/**
|
|
24
29
|
* Shared context the built-in clientChunks strategy reads. Discovery populates
|
|
25
30
|
* it (registered fallback hashes + single-router name) before the client build
|
package/src/vite/plugin-types.ts
CHANGED
|
@@ -127,16 +127,18 @@ interface RangoBaseOptions {
|
|
|
127
127
|
clientChunks?: ClientChunks;
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* This is the build-time env supplied by the Vite plugin, not the live
|
|
135
|
-
* request env. It is shared across all prerender invocations for the build.
|
|
130
|
+
* Filter which files route discovery scans, by glob. Paths are matched
|
|
131
|
+
* root-relative (e.g. `src/routes/**`). `include` restricts discovery to
|
|
132
|
+
* matching files; `exclude` removes matches (the defaults cover tests, dist,
|
|
133
|
+
* coverage, etc.). Mirrors the CLI's `--include`/`--exclude`.
|
|
136
134
|
*
|
|
137
|
-
* @
|
|
135
|
+
* @example
|
|
136
|
+
* rango({ discovery: { include: ["src/routes/**"] } })
|
|
138
137
|
*/
|
|
139
|
-
|
|
138
|
+
discovery?: {
|
|
139
|
+
include?: string[];
|
|
140
|
+
exclude?: string[];
|
|
141
|
+
};
|
|
140
142
|
}
|
|
141
143
|
|
|
142
144
|
/**
|
|
@@ -147,6 +149,17 @@ export interface RangoNodeOptions extends RangoBaseOptions {
|
|
|
147
149
|
* Deployment preset. Defaults to 'node' when not specified.
|
|
148
150
|
*/
|
|
149
151
|
preset?: "node";
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Environment bindings available to Prerender and Static handlers at build
|
|
155
|
+
* time via `ctx.env`. Shared across all prerender invocations for the build.
|
|
156
|
+
*
|
|
157
|
+
* `"auto"` is Cloudflare-only (it resolves the wrangler platform proxy), so it
|
|
158
|
+
* is not accepted on the Node preset — pass an object or a factory instead.
|
|
159
|
+
*
|
|
160
|
+
* @default false
|
|
161
|
+
*/
|
|
162
|
+
buildEnv?: Exclude<BuildEnvOption, "auto">;
|
|
150
163
|
}
|
|
151
164
|
|
|
152
165
|
/**
|
|
@@ -164,6 +177,17 @@ export interface RangoCloudflareOptions extends RangoBaseOptions {
|
|
|
164
177
|
* - Build-time manifest generation is auto-detected from the resolved RSC environment config
|
|
165
178
|
*/
|
|
166
179
|
preset: "cloudflare";
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Environment bindings available to Prerender and Static handlers at build
|
|
183
|
+
* time via `ctx.env`. Shared across all prerender invocations for the build.
|
|
184
|
+
*
|
|
185
|
+
* `"auto"` resolves the Cloudflare platform proxy via wrangler
|
|
186
|
+
* `getPlatformProxy()`.
|
|
187
|
+
*
|
|
188
|
+
* @default false
|
|
189
|
+
*/
|
|
190
|
+
buildEnv?: BuildEnvOption;
|
|
167
191
|
}
|
|
168
192
|
|
|
169
193
|
/**
|
|
@@ -132,7 +132,7 @@ function transformFileLevelUseCache(
|
|
|
132
132
|
isLayoutOrTemplate: boolean,
|
|
133
133
|
transformWrapExport: (typeof import("@vitejs/plugin-rsc/transforms"))["transformWrapExport"],
|
|
134
134
|
) {
|
|
135
|
-
const
|
|
135
|
+
const unconfirmedExports: string[] = [];
|
|
136
136
|
|
|
137
137
|
const { exportNames, output } = transformWrapExport(code, ast, {
|
|
138
138
|
runtime: (value: string, name: string) => {
|
|
@@ -142,22 +142,33 @@ function transformFileLevelUseCache(
|
|
|
142
142
|
rejectNonAsyncFunction: false,
|
|
143
143
|
filter: (name: string, meta: { isFunction?: boolean }) => {
|
|
144
144
|
if (name === "default" && isLayoutOrTemplate) return false;
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
// isFunction is boolean | undefined: true = confirmed function, false =
|
|
146
|
+
// confirmed non-function, undefined = cannot tell statically (e.g. a
|
|
147
|
+
// factory/HOF initializer `const x = makeCached(fn)`). Deliberate policy:
|
|
148
|
+
// require a confirmed function and reject everything else, including
|
|
149
|
+
// indeterminate initializers that may be functions at runtime -- rewrite
|
|
150
|
+
// those as direct async functions. (Pre-#1246 plugin-rsc reported false,
|
|
151
|
+
// not undefined, here, so === false would wrongly wrap them post-bump.)
|
|
152
|
+
if (meta.isFunction !== true) {
|
|
153
|
+
unconfirmedExports.push(name);
|
|
147
154
|
return false;
|
|
148
155
|
}
|
|
149
156
|
return true;
|
|
150
157
|
},
|
|
151
158
|
});
|
|
152
159
|
|
|
153
|
-
if (
|
|
160
|
+
if (unconfirmedExports.length > 0) {
|
|
161
|
+
const plural = unconfirmedExports.length > 1;
|
|
154
162
|
throw new Error(
|
|
155
|
-
`[rango:use-cache] File-level "use cache" in ${sourceId}
|
|
156
|
-
`
|
|
157
|
-
`${
|
|
158
|
-
|
|
159
|
-
`
|
|
160
|
-
`
|
|
163
|
+
`[rango:use-cache] File-level "use cache" in ${sourceId} only wraps ` +
|
|
164
|
+
`exports that are statically-confirmed functions. ` +
|
|
165
|
+
`${plural ? "These exports are" : "This export is"} not: ` +
|
|
166
|
+
`${unconfirmedExports.map((n) => `"${n}"`).join(", ")}. ` +
|
|
167
|
+
`Declare them directly (export async function foo() {} or ` +
|
|
168
|
+
`export const foo = async () => {}). A factory or otherwise ` +
|
|
169
|
+
`statically-indeterminate initializer (export const foo = makeCached(fn)) ` +
|
|
170
|
+
`is rejected even if it returns a function at runtime -- rewrite it as a ` +
|
|
171
|
+
`direct async function, or move non-function exports to a separate module.`,
|
|
161
172
|
);
|
|
162
173
|
}
|
|
163
174
|
|
package/src/vite/rango.ts
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
formatNestedRouterConflictError,
|
|
17
17
|
findNestedRouterConflict,
|
|
18
18
|
findRouterFiles,
|
|
19
|
+
createScanFilter,
|
|
19
20
|
} from "../build/generate-route-types.js";
|
|
20
21
|
import { firstCodeMatchIndex } from "../build/route-types/source-scan.js";
|
|
21
22
|
import { createVersionPlugin } from "./plugins/version-plugin.js";
|
|
@@ -326,6 +327,12 @@ export function createRouterDiscoveryPlugin(
|
|
|
326
327
|
|
|
327
328
|
configResolved(config) {
|
|
328
329
|
s.projectRoot = config.root;
|
|
330
|
+
// Compile the optional discovery scan filter (glob include/exclude) now
|
|
331
|
+
// that the project root is known. findRouterFiles() below — and the
|
|
332
|
+
// build/HMR rediscovery paths — honor s.scanFilter.
|
|
333
|
+
s.scanFilter = opts?.discovery
|
|
334
|
+
? createScanFilter(s.projectRoot, opts.discovery)
|
|
335
|
+
: undefined;
|
|
329
336
|
s.isBuildMode = config.command === "build";
|
|
330
337
|
viteCommand = config.command as "serve" | "build";
|
|
331
338
|
viteMode = config.mode;
|