@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.150
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -0
- package/README.md +308 -451
- 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 +1844 -237
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.js} +1 -1
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
- 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 +7471 -2057
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +142 -61
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +489 -0
- package/skills/caching/SKILL.md +413 -26
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +278 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +17 -11
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +96 -63
- package/skills/fonts/SKILL.md +7 -5
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -436
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +215 -16
- package/skills/layout/SKILL.md +147 -7
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +629 -55
- package/skills/middleware/SKILL.md +218 -38
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +60 -21
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +296 -4
- package/skills/ppr/SKILL.md +643 -0
- package/skills/prerender/SKILL.md +444 -52
- package/skills/rango/SKILL.md +324 -29
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +264 -122
- package/skills/route/SKILL.md +359 -22
- package/skills/router-setup/SKILL.md +247 -34
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +10 -9
- package/skills/typesafety/SKILL.md +45 -496
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +383 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +275 -29
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +348 -212
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +39 -0
- package/src/browser/merge-segment-loaders.ts +23 -13
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +249 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +230 -124
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +432 -365
- package/src/browser/prefetch/cache.ts +381 -0
- package/src/browser/prefetch/fetch.ts +462 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +284 -67
- package/src/browser/react/NavigationProvider.tsx +267 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +355 -73
- package/src/browser/scroll-restoration.ts +140 -50
- package/src/browser/segment-reconciler.ts +253 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +235 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +252 -161
- package/src/build/generate-route-types.ts +41 -848
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +225 -42
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +89 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +695 -0
- package/src/cache/cache-scope.ts +324 -335
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2602 -156
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +226 -102
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +132 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +446 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +295 -0
- package/src/cache/shell-snapshot.ts +464 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +283 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1201 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +180 -35
- package/src/index.ts +245 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/build-shell-capture.ts +253 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +131 -22
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +120 -145
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +305 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +259 -0
- package/src/router/handler-context.ts +376 -125
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +88 -28
- package/src/router/lazy-includes.ts +260 -0
- package/src/router/loader-resolution.ts +449 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +144 -62
- package/src/router/match-api.ts +224 -256
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +499 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +308 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +143 -52
- package/src/router/metrics.ts +235 -29
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +522 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +568 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +570 -0
- package/src/router/router-options.ts +792 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +812 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +315 -0
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +1340 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +259 -0
- package/src/router/telemetry.ts +385 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +796 -2387
- package/src/rsc/capture-queue.ts +67 -0
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +927 -1139
- package/src/rsc/helpers.ts +275 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +23 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +502 -0
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +822 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-build-manifest.ts +274 -0
- package/src/rsc/shell-capture-constants.ts +27 -0
- package/src/rsc/shell-capture.ts +1705 -0
- package/src/rsc/shell-serve.ts +226 -0
- package/src/rsc/ssr-setup.ts +176 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-fragments.ts +124 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +464 -135
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +616 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +337 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +1041 -155
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +661 -140
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +261 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +418 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +189 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1352
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +416 -0
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +483 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +205 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +31 -2255
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +336 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +271 -0
- package/src/vite/plugins/virtual-entries.ts +267 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +569 -0
- package/src/vite/router-discovery.ts +2011 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +268 -0
- package/src/vite/utils/shared-utils.ts +271 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/segment-system.tsx
CHANGED
|
@@ -1,53 +1,98 @@
|
|
|
1
|
+
import * as React from "react";
|
|
1
2
|
import { createElement, type ReactNode, type ComponentType } from "react";
|
|
2
|
-
import { OutletProvider } from "./
|
|
3
|
+
import { OutletProvider } from "./outlet-provider.js";
|
|
3
4
|
import { MountContextProvider } from "./browser/react/mount-context.js";
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
LoaderDataResult,
|
|
7
|
-
RootLayoutProps,
|
|
8
|
-
} from "./types.js";
|
|
9
|
-
import { isLoaderDataResult } from "./types.js";
|
|
5
|
+
import type { ResolvedSegment, RootLayoutProps } from "./types.js";
|
|
6
|
+
import { decodeLoaderResults } from "./decode-loader-results.js";
|
|
10
7
|
import { invariant } from "./errors.js";
|
|
11
8
|
import {
|
|
12
9
|
RouteContentWrapper,
|
|
13
10
|
LoaderBoundary,
|
|
14
11
|
} from "./route-content-wrapper.js";
|
|
15
12
|
import { RootErrorBoundary } from "./root-error-boundary.js";
|
|
13
|
+
import { INTERNAL_RANGO_DEBUG } from "./internal-debug.js";
|
|
14
|
+
import { getMemoizedContentPromise } from "./segment-content-promise.js";
|
|
15
|
+
import {
|
|
16
|
+
buildLoaderPromise,
|
|
17
|
+
getMemoizedLoaderPromise,
|
|
18
|
+
} from "./segment-loader-promise.js";
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
|
-
*
|
|
21
|
+
* Debug log for the segment tree build, gated on the baked flag. Runs on BOTH
|
|
22
|
+
* sides now, environment-tagged: `[Browser][segments]` lines up with the
|
|
23
|
+
* `[Browser][boot]` sequence around hydrateRoot; `[Server][segments]` exposes
|
|
24
|
+
* the SSR/RSC tree-build stalls (blocking loader awaits during fizz are what
|
|
25
|
+
* dominate MISS TTFB) that used to be invisible because the logs were
|
|
26
|
+
* window-gated. Server lines have no request correlation — segment-system is
|
|
27
|
+
* shared client code and cannot import request-context (node:async_hooks
|
|
28
|
+
* would enter the browser bundle) — so on a busy server, correlate by
|
|
29
|
+
* timestamp + segment ids.
|
|
19
30
|
*/
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
function segDebugLog(msg: string, details?: Record<string, unknown>): void {
|
|
32
|
+
if (!INTERNAL_RANGO_DEBUG) return;
|
|
33
|
+
const env = typeof window === "object" ? "[Browser]" : "[Server]";
|
|
34
|
+
const prefix = `${env}[segments] ${msg} @ ${Math.round(performance.now())}ms`;
|
|
35
|
+
if (details) {
|
|
36
|
+
console.log(prefix, details);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(prefix);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ViewTransition is only available in React experimental.
|
|
43
|
+
// Access via namespace import to avoid compile-time errors on stable React.
|
|
44
|
+
const ReactViewTransition: any =
|
|
45
|
+
"ViewTransition" in React ? (React as any).ViewTransition : null;
|
|
46
|
+
|
|
47
|
+
// A loading skeleton is renderable only when it is a real ReactNode value.
|
|
48
|
+
// `false` is treated as "not renderable" here. This is the three-term gate;
|
|
49
|
+
// the distinct two-term gate at the LoaderBoundary site deliberately treats
|
|
50
|
+
// `false` as "create a boundary without a RouteContentWrapper"
|
|
51
|
+
// (tree-structure.md), so it must NOT use this helper.
|
|
52
|
+
function isRenderableLoading(loading: ReactNode): boolean {
|
|
53
|
+
return loading !== undefined && loading !== null && loading !== false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Exported for unit testing the no-parallel fast path (D6); internal otherwise.
|
|
57
|
+
export function restoreParallelLoaderMarkers(
|
|
58
|
+
segments: ResolvedSegment[],
|
|
59
|
+
): ResolvedSegment[] {
|
|
60
|
+
// Parallel-loading markers only exist when a parallel segment is present, so
|
|
61
|
+
// a list with no parallel slot has nothing to restore. Skip the Map alloc and
|
|
62
|
+
// full scan in that (common) case — this runs on every render.
|
|
63
|
+
if (!segments.some((s) => s.type === "parallel")) return segments;
|
|
64
|
+
|
|
65
|
+
const parallelLoadingByNamespace = new Map<string, ReactNode>();
|
|
66
|
+
let nextSegments: ResolvedSegment[] | null = null;
|
|
67
|
+
|
|
68
|
+
for (let i = 0; i < segments.length; i++) {
|
|
69
|
+
const segment = segments[i];
|
|
70
|
+
|
|
71
|
+
if (segment.type === "parallel") {
|
|
72
|
+
if (segment.namespace && isRenderableLoading(segment.loading)) {
|
|
73
|
+
parallelLoadingByNamespace.set(segment.namespace, segment.loading);
|
|
74
|
+
}
|
|
34
75
|
continue;
|
|
35
76
|
}
|
|
36
77
|
|
|
37
|
-
if (
|
|
38
|
-
loaderData[id] = result.data;
|
|
78
|
+
if (segment.type !== "loader" || segment.parallelLoading !== undefined) {
|
|
39
79
|
continue;
|
|
40
80
|
}
|
|
41
81
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
82
|
+
const parallelLoading = segment.namespace
|
|
83
|
+
? parallelLoadingByNamespace.get(segment.namespace)
|
|
84
|
+
: undefined;
|
|
85
|
+
if (parallelLoading === undefined) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (!nextSegments) {
|
|
90
|
+
nextSegments = segments.slice();
|
|
47
91
|
}
|
|
92
|
+
nextSegments[i] = { ...segment, parallelLoading };
|
|
48
93
|
}
|
|
49
94
|
|
|
50
|
-
return
|
|
95
|
+
return nextSegments ?? segments;
|
|
51
96
|
}
|
|
52
97
|
|
|
53
98
|
/**
|
|
@@ -86,11 +131,61 @@ export interface RenderSegmentsOptions {
|
|
|
86
131
|
rootLayout?: ComponentType<RootLayoutProps>;
|
|
87
132
|
}
|
|
88
133
|
|
|
134
|
+
function createViewTransitionBoundary(
|
|
135
|
+
transition: NonNullable<ResolvedSegment["transition"]>,
|
|
136
|
+
children: ReactNode,
|
|
137
|
+
): ReactNode {
|
|
138
|
+
// `viewTransition` is a router-specific flag (boundary opt-out), not a React
|
|
139
|
+
// <ViewTransition> prop — strip it so it never reaches React.
|
|
140
|
+
const { viewTransition: _viewTransition, ...vtProps } = transition;
|
|
141
|
+
return createElement(ReactViewTransition, {
|
|
142
|
+
...vtProps,
|
|
143
|
+
children,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function wrapDefaultOutletContent(
|
|
148
|
+
content: ReactNode,
|
|
149
|
+
transition: NonNullable<ResolvedSegment["transition"]>,
|
|
150
|
+
): ReactNode {
|
|
151
|
+
if (!React.isValidElement(content)) {
|
|
152
|
+
return createViewTransitionBoundary(transition, content);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const props = content.props as any;
|
|
156
|
+
|
|
157
|
+
if (content.type === MountContextProvider) {
|
|
158
|
+
return React.cloneElement(content, {
|
|
159
|
+
children: wrapDefaultOutletContent(props.children, transition),
|
|
160
|
+
} as any);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (content.type === OutletProvider && props.segment?.type === "layout") {
|
|
164
|
+
return React.cloneElement(content, {
|
|
165
|
+
content: wrapDefaultOutletContent(props.content, transition),
|
|
166
|
+
} as any);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (content.type === LoaderBoundary && props.segment?.type === "layout") {
|
|
170
|
+
return React.cloneElement(content, {
|
|
171
|
+
outletContent: wrapDefaultOutletContent(props.outletContent, transition),
|
|
172
|
+
} as any);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return createViewTransitionBoundary(transition, content);
|
|
176
|
+
}
|
|
177
|
+
|
|
89
178
|
/**
|
|
90
179
|
* Render segments into a React tree with proper layout nesting
|
|
91
180
|
*
|
|
92
|
-
* Layouts nest using OutletProvider
|
|
93
|
-
* render as
|
|
181
|
+
* Layouts nest using OutletProvider; a layout receives the inner content via
|
|
182
|
+
* its `<Outlet />`. Parallel segments do NOT render as inline Fragment siblings
|
|
183
|
+
* — they flow through OutletContext.parallel and are resolved where a layout
|
|
184
|
+
* places `<ParallelOutlet name="@sidebar" />` (or `<Outlet name="@sidebar" />`).
|
|
185
|
+
*
|
|
186
|
+
* The result is always wrapped in RootErrorBoundary so unhandled errors never
|
|
187
|
+
* blank the screen. When `options.rootLayout` is provided it wraps the error
|
|
188
|
+
* boundary at the OUTERMOST level (so the app shell survives errors).
|
|
94
189
|
*
|
|
95
190
|
* Error segments are treated like route segments - they render their fallback
|
|
96
191
|
* component in place of the failed segment. When an error occurs in a handler,
|
|
@@ -102,27 +197,30 @@ export interface RenderSegmentsOptions {
|
|
|
102
197
|
* notFoundBoundary's fallback component.
|
|
103
198
|
*
|
|
104
199
|
* @param segments - Array of resolved segments to render
|
|
105
|
-
* @returns ReactNode
|
|
200
|
+
* @returns Promise resolving to the ReactNode tree (the function is async)
|
|
106
201
|
*
|
|
107
202
|
* @example
|
|
108
203
|
* ```typescript
|
|
109
204
|
* const segments = [
|
|
110
|
-
* { id: 'L0.0', type: 'layout', component: <
|
|
111
|
-
* { id: '
|
|
112
|
-
* { id: '
|
|
113
|
-
* { id: 'P3.0', type: 'parallel', component: <Sidebar />, slot: '@sidebar' }
|
|
205
|
+
* { id: 'L0.0', type: 'layout', component: <BlogLayout /> },
|
|
206
|
+
* { id: 'L0R1', type: 'route', component: <BlogPost /> },
|
|
207
|
+
* { id: 'L0R1.@sidebar', type: 'parallel', component: <Sidebar />, slot: '@sidebar' }
|
|
114
208
|
* ];
|
|
115
209
|
*
|
|
116
|
-
*
|
|
117
|
-
* //
|
|
118
|
-
*
|
|
119
|
-
* //
|
|
120
|
-
* //
|
|
121
|
-
* //
|
|
122
|
-
* //
|
|
210
|
+
* // BlogLayout renders <Outlet /> for the route and
|
|
211
|
+
* // <ParallelOutlet name="@sidebar" /> for the parallel slot.
|
|
212
|
+
* const tree = await renderSegments(segments, { rootLayout: RootLayout });
|
|
213
|
+
* // Results in (outermost first):
|
|
214
|
+
* // <RootLayout>
|
|
215
|
+
* // <RootErrorBoundary>
|
|
216
|
+
* // <OutletProvider segment={BlogLayout} parallel={[Sidebar]}>
|
|
217
|
+
* // <BlogPost />
|
|
218
|
+
* // </OutletProvider>
|
|
219
|
+
* // </RootErrorBoundary>
|
|
220
|
+
* // </RootLayout>
|
|
123
221
|
*
|
|
124
222
|
* // For server actions, pass isAction to await components:
|
|
125
|
-
* const tree = renderSegments(segments, { isAction: true });
|
|
223
|
+
* const tree = await renderSegments(segments, { isAction: true });
|
|
126
224
|
* ```
|
|
127
225
|
*/
|
|
128
226
|
export async function renderSegments(
|
|
@@ -136,7 +234,22 @@ export async function renderSegments(
|
|
|
136
234
|
rootLayout: RootLayout,
|
|
137
235
|
} = options || {};
|
|
138
236
|
|
|
237
|
+
const segDebug = INTERNAL_RANGO_DEBUG;
|
|
238
|
+
const segDebugStart = segDebug ? performance.now() : 0;
|
|
239
|
+
if (segDebug) {
|
|
240
|
+
segDebugLog("renderSegments start", {
|
|
241
|
+
segments: segments.map((s) => `${s.id}:${s.type}`),
|
|
242
|
+
isAction: !!isAction,
|
|
243
|
+
forceAwait: !!forceAwait,
|
|
244
|
+
intercepts: interceptSegments?.length ?? 0,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
139
248
|
const temporalLazyRefs: Promise<any>[] = [];
|
|
249
|
+
const normalizedSegments = restoreParallelLoaderMarkers(segments);
|
|
250
|
+
const normalizedInterceptSegments = interceptSegments
|
|
251
|
+
? restoreParallelLoaderMarkers(interceptSegments)
|
|
252
|
+
: undefined;
|
|
140
253
|
|
|
141
254
|
/**
|
|
142
255
|
* Registers promises from lazy/async components for awaiting.
|
|
@@ -161,7 +274,26 @@ export async function renderSegments(
|
|
|
161
274
|
);
|
|
162
275
|
}
|
|
163
276
|
// Separate segments by type, passing intercept segments for explicit injection
|
|
164
|
-
const tree = segmentTreeWalk(
|
|
277
|
+
const tree = segmentTreeWalk(normalizedSegments, normalizedInterceptSegments);
|
|
278
|
+
|
|
279
|
+
// A route is "in a transition scope" when its own segment OR any layout in
|
|
280
|
+
// its matched chain declares transition(). Both transition() forms land here:
|
|
281
|
+
// the per-route item form sets transition on the route entry, and the block
|
|
282
|
+
// wrapper form sets it on a transparent ancestor layout (dsl-helpers.ts). When
|
|
283
|
+
// in scope, the route and its route-owned layouts use param-agnostic keys so a
|
|
284
|
+
// same-route navigation reconciles (holds content) instead of remounting. The
|
|
285
|
+
// value is a static property of the route's position in the tree, so it is the
|
|
286
|
+
// same on every render of that route (SSR, navigation, action) — the keys
|
|
287
|
+
// never drift. Cross-route navigation still remounts: different routes have
|
|
288
|
+
// different segment ids regardless of transition scope.
|
|
289
|
+
const inTransitionScope = normalizedSegments.some(
|
|
290
|
+
(s) =>
|
|
291
|
+
s.transition != null &&
|
|
292
|
+
(s.type === "layout" ||
|
|
293
|
+
s.type === "route" ||
|
|
294
|
+
s.type === "error" ||
|
|
295
|
+
s.type === "notFound"),
|
|
296
|
+
);
|
|
165
297
|
// Render content segments as siblings
|
|
166
298
|
let content: ReactNode = null;
|
|
167
299
|
for (const node of tree) {
|
|
@@ -173,18 +305,33 @@ export async function renderSegments(
|
|
|
173
305
|
`Expected layout, route, error, or notFound segment, got ${node.segment.type}`,
|
|
174
306
|
);
|
|
175
307
|
const { component, id, params, loading } = node.segment;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// -
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
//
|
|
308
|
+
const segNodeStart = segDebug ? performance.now() : 0;
|
|
309
|
+
|
|
310
|
+
// Param-agnostic keys are opt-in via the transition() DSL (see
|
|
311
|
+
// inTransitionScope above). A route (and its route-owned layouts) inside a
|
|
312
|
+
// transition scope drops the param from its key, so navigating between two
|
|
313
|
+
// param values of the SAME route (e.g. /product/1 -> /product/2) reconciles
|
|
314
|
+
// the route subtree instead of remounting it. Combined with the
|
|
315
|
+
// startTransition wrap that shouldStartViewTransition already applies to
|
|
316
|
+
// transition routes (browser/partial-update.ts), the previous content stays
|
|
317
|
+
// on screen while the new loaders resolve (stale-while-revalidate) instead
|
|
318
|
+
// of flashing the loading skeleton. This works on stable React; experimental
|
|
319
|
+
// React adds the animated <ViewTransition> cross-fade on top.
|
|
320
|
+
//
|
|
321
|
+
// Outside a transition scope the key stays param-bearing and the route
|
|
322
|
+
// remounts on param change (the default: a fresh skeleton and fresh
|
|
323
|
+
// component state).
|
|
324
|
+
//
|
|
325
|
+
// error/notFound always keep param-bearing keys: createErrorSegment reuses
|
|
326
|
+
// the boundary layout's shortCode as the error segment id (router/
|
|
327
|
+
// error-handling.ts), so a param-agnostic error key could collide with that
|
|
328
|
+
// layout's key within the same render.
|
|
183
329
|
const includeParams =
|
|
184
|
-
node.segment.type === "route" ||
|
|
185
330
|
node.segment.type === "error" ||
|
|
186
331
|
node.segment.type === "notFound" ||
|
|
187
|
-
(node.segment.type === "
|
|
332
|
+
((node.segment.type === "route" ||
|
|
333
|
+
(node.segment.type === "layout" && node.segment.belongsToRoute)) &&
|
|
334
|
+
!inTransitionScope);
|
|
188
335
|
|
|
189
336
|
const paramStr =
|
|
190
337
|
includeParams && params && Object.keys(params).length > 0
|
|
@@ -193,60 +340,135 @@ export async function renderSegments(
|
|
|
193
340
|
.map(([k, v]) => `${k}=${v}`)
|
|
194
341
|
.join(",")
|
|
195
342
|
: "";
|
|
196
|
-
const key =
|
|
343
|
+
const key = paramStr ? `${id}-${paramStr}` : id;
|
|
197
344
|
|
|
198
|
-
// Get loader entries for this node
|
|
199
345
|
const loaderEntries = node.loaders.filter(
|
|
200
346
|
(loader) => loader.loaderId && loader.loaderData !== undefined,
|
|
201
347
|
);
|
|
202
348
|
|
|
203
|
-
// Determine the component content (with or without Suspense wrapper)
|
|
204
|
-
// Wrap when loading skeleton defined OR component is Promise (needs Suspense)
|
|
205
|
-
// During actions, await component Promise to prevent Suspense from triggering
|
|
206
|
-
// This keeps existing content visible instead of showing loading skeleton
|
|
207
349
|
let resolvedComponent = component;
|
|
208
350
|
if (isAction && component instanceof Promise) {
|
|
351
|
+
const componentAwaitStart = segDebug ? performance.now() : 0;
|
|
209
352
|
resolvedComponent = await component;
|
|
353
|
+
if (segDebug) {
|
|
354
|
+
segDebugLog(`segment ${id}: component awaited (action)`, {
|
|
355
|
+
ms: Math.round(performance.now() - componentAwaitStart),
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
let nodeContent: ReactNode = null;
|
|
361
|
+
if (isRenderableLoading(loading)) {
|
|
362
|
+
// forceAwait (popstate, stale-revalidation, fully-prefetched nav) renders a
|
|
363
|
+
// loading() route with the route content ALREADY resolved, so its
|
|
364
|
+
// RouteContentWrapper Suspender does not suspend for a microtask and flash
|
|
365
|
+
// the loading() fallback on a NORMAL (non-transition) commit. The router
|
|
366
|
+
// data is known-ready on these paths, so awaiting the content here is free.
|
|
367
|
+
// The wrapper tree is unchanged (RouteContentWrapper is still created with
|
|
368
|
+
// the same key/fallback) — only the `content` prop is a resolved node
|
|
369
|
+
// instead of a pending promise, which Suspender renders synchronously. This
|
|
370
|
+
// mirrors the forceAwait loaderData unwrap above; a CLIENT component that
|
|
371
|
+
// suspends on mount inside the content still reveals a fallback (it is not
|
|
372
|
+
// pre-resolved).
|
|
373
|
+
const contentPromise = getMemoizedContentPromise(resolvedComponent);
|
|
374
|
+
let loadingContent: Promise<ReactNode> | ReactNode = contentPromise;
|
|
375
|
+
if (forceAwait) {
|
|
376
|
+
const contentAwaitStart = segDebug ? performance.now() : 0;
|
|
377
|
+
loadingContent = await contentPromise;
|
|
378
|
+
if (segDebug) {
|
|
379
|
+
segDebugLog(`segment ${id}: content awaited (forceAwait)`, {
|
|
380
|
+
ms: Math.round(performance.now() - contentAwaitStart),
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
nodeContent = createElement(RouteContentWrapper, {
|
|
385
|
+
key: `suspense-loading-${id}`,
|
|
386
|
+
content: loadingContent,
|
|
387
|
+
fallback: loading,
|
|
388
|
+
segmentId: id,
|
|
389
|
+
});
|
|
390
|
+
} else {
|
|
391
|
+
// [VT-DIAG] Gated behind INTERNAL_RANGO_DEBUG. A segment in the no-loading()
|
|
392
|
+
// branch whose component decodes as a Promise/lazy gets registered into
|
|
393
|
+
// temporalLazyRefs and awaited before commit (see below) — which on builds
|
|
394
|
+
// where the segment component arrives deferred defeats client-nav streaming.
|
|
395
|
+
if (INTERNAL_RANGO_DEBUG && typeof window === "object") {
|
|
396
|
+
const c = resolvedComponent as unknown;
|
|
397
|
+
console.log("[VT-DIAG] renderSegments no-loading-branch segment", {
|
|
398
|
+
id,
|
|
399
|
+
type: node.segment.type,
|
|
400
|
+
componentIsPromise: c instanceof Promise,
|
|
401
|
+
componentIsLazy:
|
|
402
|
+
c != null && typeof c === "object" && "_payload" in c,
|
|
403
|
+
componentTypeof: typeof c,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
nodeContent = registerLazyRef(resolvedComponent);
|
|
210
407
|
}
|
|
211
408
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
//
|
|
225
|
-
|
|
409
|
+
// Wrap with <ViewTransition> if transition config exists (React experimental only).
|
|
410
|
+
// An empty config ({}) creates a bare <ViewTransition> boundary that participates
|
|
411
|
+
// in transitions without adding custom animation classes. Named element-level
|
|
412
|
+
// <ViewTransition> components inside (with name/share props) morph independently
|
|
413
|
+
// from the parent's default cross-fade.
|
|
414
|
+
//
|
|
415
|
+
// For layouts, wrap the outlet content (what `<Outlet />` renders) rather
|
|
416
|
+
// than the layout component itself. Parallel slots like `<ParallelOutlet
|
|
417
|
+
// name="@modal" />` read from a separate context channel and end up as
|
|
418
|
+
// siblings of the VT in the rendered tree, so modal mounts don't trigger a
|
|
419
|
+
// subtree update on the layout-level VT — which would otherwise make
|
|
420
|
+
// React's commit walker fire `document.startViewTransition` and apply
|
|
421
|
+
// view-transition-names to the underlying main subtree (cover/title/etc.).
|
|
422
|
+
//
|
|
423
|
+
// `transition.viewTransition === false` opts out of the router-owned
|
|
424
|
+
// boundary only. Driving (the startTransition wrap in browser/partial-update.ts
|
|
425
|
+
// and the param-agnostic key/hold below) keys off transition *presence*, not
|
|
426
|
+
// this flag, so a boundary-less transition still holds content and lets
|
|
427
|
+
// consumer-placed <ViewTransition> elements animate. The global
|
|
428
|
+
// createRouter({ viewTransition }) default is resolved into this field
|
|
429
|
+
// during segment resolution (only `false` is stamped; unset/"auto" is left
|
|
430
|
+
// as-is and means "wrap"), so this gate needs no router-option threading.
|
|
431
|
+
let outletContent: ReactNode =
|
|
226
432
|
node.segment.type === "layout" ? content : null;
|
|
227
433
|
|
|
434
|
+
const transition = node.segment.transition;
|
|
435
|
+
|
|
436
|
+
if (
|
|
437
|
+
ReactViewTransition &&
|
|
438
|
+
transition &&
|
|
439
|
+
transition.viewTransition !== false
|
|
440
|
+
) {
|
|
441
|
+
if (node.segment.type === "layout") {
|
|
442
|
+
outletContent = wrapDefaultOutletContent(outletContent, transition);
|
|
443
|
+
} else {
|
|
444
|
+
nodeContent = createViewTransitionBoundary(transition, nodeContent);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
228
448
|
// Prepare loader data if there are loaders
|
|
229
449
|
const loaderIds = loaderEntries.map((loader) => loader.loaderId!);
|
|
230
|
-
|
|
231
|
-
loaderEntries.length > 0
|
|
232
|
-
? Promise.all(
|
|
233
|
-
loaderEntries.map((loader) =>
|
|
234
|
-
loader.loaderData instanceof Promise
|
|
235
|
-
? loader.loaderData
|
|
236
|
-
: Promise.resolve(loader.loaderData),
|
|
237
|
-
),
|
|
238
|
-
)
|
|
239
|
-
: Promise.resolve([]);
|
|
240
|
-
|
|
241
|
-
// Use LoaderBoundary when loading is defined to maintain consistent tree structure
|
|
242
|
-
// This ensures cached segments (which may not have loader segments) have the same
|
|
243
|
-
// tree structure as fresh segments, preventing React remounts
|
|
244
|
-
// If forceAwait or isAction is set, pre-resolve promises so LoaderBoundary won't suspend
|
|
450
|
+
|
|
245
451
|
if (loading !== undefined && loading !== null) {
|
|
452
|
+
const loaderDataPromise = getMemoizedLoaderPromise(loaderEntries);
|
|
453
|
+
let boundaryLoaderData: Promise<any[]> | any[] = loaderDataPromise;
|
|
454
|
+
if (forceAwait || isAction) {
|
|
455
|
+
const awaitStart = segDebug ? performance.now() : 0;
|
|
456
|
+
boundaryLoaderData = await loaderDataPromise;
|
|
457
|
+
if (segDebug) {
|
|
458
|
+
segDebugLog(`segment ${id}: loaders awaited (forceAwait/action)`, {
|
|
459
|
+
loaderIds,
|
|
460
|
+
ms: Math.round(performance.now() - awaitStart),
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
} else if (segDebug) {
|
|
464
|
+
segDebugLog(
|
|
465
|
+
`segment ${id}: streaming loaders via LoaderBoundary (suspense)`,
|
|
466
|
+
{ loaderIds },
|
|
467
|
+
);
|
|
468
|
+
}
|
|
246
469
|
content = createElement(LoaderBoundary, {
|
|
247
470
|
key: `loader-boundary-${key}`,
|
|
248
|
-
loaderDataPromise:
|
|
249
|
-
forceAwait || isAction ? await loaderDataPromise : loaderDataPromise,
|
|
471
|
+
loaderDataPromise: boundaryLoaderData,
|
|
250
472
|
loaderIds,
|
|
251
473
|
fallback: loading,
|
|
252
474
|
outletKey: key,
|
|
@@ -256,7 +478,6 @@ export async function renderSegments(
|
|
|
256
478
|
children: nodeContent,
|
|
257
479
|
});
|
|
258
480
|
} else if (loaderEntries.length === 0) {
|
|
259
|
-
// No loaders, no loading - simple OutletProvider
|
|
260
481
|
content = createElement(OutletProvider, {
|
|
261
482
|
key,
|
|
262
483
|
content: outletContent,
|
|
@@ -265,12 +486,87 @@ export async function renderSegments(
|
|
|
265
486
|
children: nodeContent,
|
|
266
487
|
});
|
|
267
488
|
} else {
|
|
268
|
-
|
|
269
|
-
const
|
|
270
|
-
|
|
489
|
+
const layoutLoaders = loaderEntries.filter((l) => !l.parallelLoading);
|
|
490
|
+
const parallelOwnedLoaders = loaderEntries.filter(
|
|
491
|
+
(l) => !!l.parallelLoading,
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
const layoutLoaderIds = layoutLoaders.map((l) => l.loaderId!);
|
|
495
|
+
// No loading() on this segment, so its loader data cannot stream behind
|
|
496
|
+
// a Suspense fallback — the tree build BLOCKS here until the data
|
|
497
|
+
// arrives. On the initial document this await runs before hydrateRoot.
|
|
498
|
+
const layoutAwaitStart = segDebug ? performance.now() : 0;
|
|
499
|
+
const resolvedData = await buildLoaderPromise(layoutLoaders);
|
|
500
|
+
if (segDebug) {
|
|
501
|
+
segDebugLog(`segment ${id}: layout loaders awaited (blocking)`, {
|
|
502
|
+
loaderIds: layoutLoaderIds,
|
|
503
|
+
ms: Math.round(performance.now() - layoutAwaitStart),
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
const decodeStart = segDebug ? performance.now() : 0;
|
|
507
|
+
const { loaderData, errorFallback } = decodeLoaderResults(
|
|
271
508
|
resolvedData,
|
|
272
|
-
|
|
509
|
+
layoutLoaderIds,
|
|
273
510
|
);
|
|
511
|
+
if (segDebug) {
|
|
512
|
+
const decodeMs = Math.round(performance.now() - decodeStart);
|
|
513
|
+
if (decodeMs > 0) {
|
|
514
|
+
segDebugLog(`segment ${id}: loader results decoded`, {
|
|
515
|
+
ms: decodeMs,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
if (parallelOwnedLoaders.length > 0) {
|
|
521
|
+
const loadersByParallelNamespace = new Map<string, ResolvedSegment[]>();
|
|
522
|
+
|
|
523
|
+
for (const loader of parallelOwnedLoaders) {
|
|
524
|
+
if (!loader.namespace) {
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
const existing = loadersByParallelNamespace.get(loader.namespace);
|
|
528
|
+
if (existing) {
|
|
529
|
+
existing.push(loader);
|
|
530
|
+
} else {
|
|
531
|
+
loadersByParallelNamespace.set(loader.namespace, [loader]);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
for (const p of node.parallel) {
|
|
536
|
+
if (!p.loading || !p.namespace) {
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
const ownedLoaders = loadersByParallelNamespace.get(p.namespace);
|
|
541
|
+
if (!ownedLoaders || ownedLoaders.length === 0) {
|
|
542
|
+
continue;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
p.loaderIds = ownedLoaders.map((l) => l.loaderId!);
|
|
546
|
+
const aggregated = getMemoizedLoaderPromise(ownedLoaders);
|
|
547
|
+
if ((forceAwait || isAction) && aggregated instanceof Promise) {
|
|
548
|
+
const parallelAwaitStart = segDebug ? performance.now() : 0;
|
|
549
|
+
p.loaderDataPromise = await aggregated;
|
|
550
|
+
if (segDebug) {
|
|
551
|
+
segDebugLog(
|
|
552
|
+
`segment ${id}: parallel ${p.id} loaders awaited (forceAwait/action)`,
|
|
553
|
+
{
|
|
554
|
+
loaderIds: p.loaderIds,
|
|
555
|
+
ms: Math.round(performance.now() - parallelAwaitStart),
|
|
556
|
+
},
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
} else {
|
|
560
|
+
p.loaderDataPromise = aggregated;
|
|
561
|
+
if (segDebug) {
|
|
562
|
+
segDebugLog(
|
|
563
|
+
`segment ${id}: parallel ${p.id} loaders streaming (suspense)`,
|
|
564
|
+
{ loaderIds: p.loaderIds },
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
274
570
|
|
|
275
571
|
content = createElement(OutletProvider, {
|
|
276
572
|
key,
|
|
@@ -292,28 +588,56 @@ export async function renderSegments(
|
|
|
292
588
|
children: content,
|
|
293
589
|
});
|
|
294
590
|
}
|
|
591
|
+
|
|
592
|
+
if (segDebug) {
|
|
593
|
+
segDebugLog(`segment ${id} built`, {
|
|
594
|
+
type: node.segment.type,
|
|
595
|
+
ms: Math.round(performance.now() - segNodeStart),
|
|
596
|
+
loaders: node.loaders.map((l) => l.loaderId).filter(Boolean),
|
|
597
|
+
hasLoading: loading !== undefined && loading !== null,
|
|
598
|
+
parallel: node.parallel.map((p) => p.id),
|
|
599
|
+
});
|
|
600
|
+
}
|
|
295
601
|
}
|
|
296
602
|
|
|
297
|
-
// Always wrap with root error boundary to prevent white screens
|
|
298
|
-
// This catches any unhandled errors that bubble up from the segment tree
|
|
299
603
|
const errorBoundaryWrapped = createElement(RootErrorBoundary, {
|
|
300
604
|
children: content,
|
|
301
605
|
});
|
|
302
606
|
if (typeof window === "object") {
|
|
607
|
+
// [VT-DIAG] Gated behind INTERNAL_RANGO_DEBUG. If this await dominates the
|
|
608
|
+
// navigation time, a deferred/lazy segment component is being fully resolved
|
|
609
|
+
// before commit, which defeats client-nav streaming. The await itself is
|
|
610
|
+
// functional (it preloads lazy chunk refs); only the timing log is gated.
|
|
611
|
+
const vtDebug = INTERNAL_RANGO_DEBUG && temporalLazyRefs.length > 0;
|
|
612
|
+
const vtDebugStart = vtDebug ? performance.now() : 0;
|
|
613
|
+
if (vtDebug) {
|
|
614
|
+
console.log("[VT-DIAG] renderSegments awaiting temporalLazyRefs", {
|
|
615
|
+
count: temporalLazyRefs.length,
|
|
616
|
+
});
|
|
617
|
+
}
|
|
303
618
|
await Promise.allSettled(temporalLazyRefs);
|
|
619
|
+
if (vtDebug) {
|
|
620
|
+
console.log("[VT-DIAG] renderSegments temporalLazyRefs settled", {
|
|
621
|
+
count: temporalLazyRefs.length,
|
|
622
|
+
ms: Math.round(performance.now() - vtDebugStart),
|
|
623
|
+
});
|
|
624
|
+
}
|
|
304
625
|
}
|
|
305
626
|
|
|
306
|
-
// Build the final result, optionally wrapped with root layout
|
|
307
627
|
let result: ReactNode = errorBoundaryWrapped;
|
|
308
628
|
|
|
309
|
-
// If rootLayout is provided, wrap the error boundary with it
|
|
310
|
-
// This ensures the app shell stays mounted even during errors (prevents FOUC)
|
|
311
629
|
if (RootLayout) {
|
|
312
630
|
result = createElement(RootLayout, {
|
|
313
631
|
children: errorBoundaryWrapped,
|
|
314
632
|
});
|
|
315
633
|
}
|
|
316
634
|
|
|
635
|
+
if (segDebug) {
|
|
636
|
+
segDebugLog("renderSegments complete", {
|
|
637
|
+
ms: Math.round(performance.now() - segDebugStart),
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
|
|
317
641
|
return result;
|
|
318
642
|
}
|
|
319
643
|
|
|
@@ -345,6 +669,31 @@ export async function renderSegments(
|
|
|
345
669
|
* @param segments - Main segments from the route tree
|
|
346
670
|
* @param interceptSegments - Optional intercept segments to inject
|
|
347
671
|
*/
|
|
672
|
+
// Loader segment ids have the grammar `${parentId}D${index}.${loaderId}`.
|
|
673
|
+
// parentId is the parent shortCode (M/L/P/R/C + digits, never "D") for normal
|
|
674
|
+
// loaders, or `${shortCode}.${slotName}` for intercept-slot loaders, where the
|
|
675
|
+
// slot name is user-controlled (`@${string}`) and may contain an uppercase "D"
|
|
676
|
+
// (e.g. "@Detail"). Strip from the first `D<index>.` separator so the slot name
|
|
677
|
+
// is preserved; splitting on a bare "D" mis-cut "@Detail" to "@" and silently
|
|
678
|
+
// dropped the loader's data. The first-`D<index>.` strip is only correct because
|
|
679
|
+
// slot names cannot contain "." -- assertValidSlotName (route-definition/
|
|
680
|
+
// dsl-helpers.ts) rejects a "." at definition time, so a name like "@D3.foo"
|
|
681
|
+
// (which WOULD mis-cut here) can never reach this function.
|
|
682
|
+
function loaderParentId(loaderSegmentId: string): string {
|
|
683
|
+
return loaderSegmentId.replace(/D\d+\..*$/, "");
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// Append a value to the array stored under `key`, creating the array on first
|
|
687
|
+
// use. Single Map lookup (vs the has/get!().push double-lookup idiom).
|
|
688
|
+
function pushToGroup<K, V>(map: Map<K, V[]>, key: K, value: V): void {
|
|
689
|
+
const arr = map.get(key);
|
|
690
|
+
if (arr) {
|
|
691
|
+
arr.push(value);
|
|
692
|
+
} else {
|
|
693
|
+
map.set(key, [value]);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
348
697
|
function* segmentTreeWalk(
|
|
349
698
|
segments: ResolvedSegment[],
|
|
350
699
|
interceptSegments?: ResolvedSegment[],
|
|
@@ -365,19 +714,12 @@ function* segmentTreeWalk(
|
|
|
365
714
|
// Extract parent ID from parallel ID
|
|
366
715
|
// Example: "L0R1L0.@sidebar" → "L0R1L0"
|
|
367
716
|
const parentId = segment.id.split(".")[0];
|
|
368
|
-
|
|
369
|
-
parallelsByParent.set(parentId, []);
|
|
370
|
-
}
|
|
371
|
-
parallelsByParent.get(parentId)!.push(segment);
|
|
717
|
+
pushToGroup(parallelsByParent, parentId, segment);
|
|
372
718
|
} else if (segment.type === "loader") {
|
|
373
719
|
// Extract parent ID from loader ID
|
|
374
|
-
// Example: "L0D0.cart" → "L0"
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
if (!loadersByParent.has(parentId)) {
|
|
378
|
-
loadersByParent.set(parentId, []);
|
|
379
|
-
}
|
|
380
|
-
loadersByParent.get(parentId)!.push(segment);
|
|
720
|
+
// Example: "L0D0.cart" → "L0"; "L0.@DetailD0.x" → "L0.@Detail"
|
|
721
|
+
const parentId = loaderParentId(segment.id);
|
|
722
|
+
pushToGroup(loadersByParent, parentId, segment);
|
|
381
723
|
} else {
|
|
382
724
|
// Layout, route, error, and notFound segments are all rendered in the tree
|
|
383
725
|
// Error/notFound segments replace the failed segment with fallback UI
|
|
@@ -392,35 +734,22 @@ function* segmentTreeWalk(
|
|
|
392
734
|
if (intercept.type === "parallel" && intercept.slot) {
|
|
393
735
|
// Extract parent ID from intercept ID (e.g., "M4L0L0L2.@modal" → "M4L0L0L2")
|
|
394
736
|
const parentId = intercept.id.split(".")[0];
|
|
395
|
-
|
|
396
|
-
parallelsByParent.set(parentId, []);
|
|
397
|
-
}
|
|
398
|
-
parallelsByParent.get(parentId)!.push(intercept);
|
|
737
|
+
pushToGroup(parallelsByParent, parentId, intercept);
|
|
399
738
|
} else if (intercept.type === "loader") {
|
|
400
|
-
// Intercept loaders - extract parent from loader ID
|
|
401
|
-
const parentId = intercept.id
|
|
402
|
-
|
|
403
|
-
loadersByParent.set(parentId, []);
|
|
404
|
-
}
|
|
405
|
-
loadersByParent.get(parentId)!.push(intercept);
|
|
739
|
+
// Intercept loaders - extract parent from loader ID (slot name preserved)
|
|
740
|
+
const parentId = loaderParentId(intercept.id);
|
|
741
|
+
pushToGroup(loadersByParent, parentId, intercept);
|
|
406
742
|
}
|
|
407
743
|
}
|
|
408
744
|
}
|
|
409
745
|
|
|
410
|
-
//
|
|
411
|
-
//
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
nonParallels.sort((a, b) => {
|
|
415
|
-
if (a.id.length !== b.id.length) {
|
|
416
|
-
return a.id.length - b.id.length;
|
|
417
|
-
}
|
|
418
|
-
return a.id.localeCompare(b.id);
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
// Iterate bottom-to-top using reverse() to process leaf segments first
|
|
746
|
+
// Segments arrive in root-to-leaf order from the server (resolveSegment
|
|
747
|
+
// and resolveSegmentWithRevalidation push segments in this order).
|
|
748
|
+
// All consumers (reconcileSegments, cache) preserve this order.
|
|
749
|
+
// No sorting needed — iterate bottom-to-top to process leaf segments first.
|
|
422
750
|
// This processes route/leaf layouts first, then parent layouts
|
|
423
751
|
// Note: We reverse the array to iterate from end to start (bottom-to-top)
|
|
752
|
+
|
|
424
753
|
for (let i = nonParallels.length - 1; i >= 0; i--) {
|
|
425
754
|
const segment = nonParallels[i];
|
|
426
755
|
|