@rangojs/router 0.0.0-experimental.9eb4192e → 0.0.0-experimental.a014d2b7
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 +8 -0
- package/README.md +123 -15
- 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 +319 -95
- 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 -28
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -10
- 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 +2011 -783
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +67 -15
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +61 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +224 -32
- package/skills/caching/SKILL.md +279 -17
- package/skills/composability/SKILL.md +27 -3
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +4 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +11 -9
- package/skills/hooks/SKILL.md +240 -28
- package/skills/host-router/SKILL.md +83 -23
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +68 -19
- package/skills/layout/SKILL.md +13 -9
- package/skills/links/SKILL.md +175 -17
- package/skills/loader/SKILL.md +217 -24
- package/skills/middleware/SKILL.md +18 -10
- package/skills/migrate-nextjs/SKILL.md +43 -19
- package/skills/migrate-react-router/SKILL.md +8 -2
- package/skills/mime-routes/SKILL.md +28 -1
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +18 -7
- package/skills/prerender/SKILL.md +65 -60
- package/skills/rango/SKILL.md +251 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +115 -48
- package/skills/route/SKILL.md +46 -5
- package/skills/router-setup/SKILL.md +30 -8
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +130 -0
- 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 +129 -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 +84 -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/typesafety/SKILL.md +319 -28
- package/skills/use-cache/SKILL.md +57 -14
- 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 +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +192 -150
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/navigation-bridge.ts +95 -75
- package/src/browser/navigation-client.ts +110 -84
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +114 -90
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +147 -147
- package/src/browser/prefetch/cache.ts +107 -72
- package/src/browser/prefetch/fetch.ts +204 -34
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +30 -7
- package/src/browser/react/NavigationProvider.tsx +272 -142
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/deferred-handle-resolution.ts +75 -0
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +17 -14
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +10 -5
- package/src/browser/react/use-params.ts +11 -11
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +20 -5
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +73 -34
- package/src/browser/scroll-restoration.ts +30 -17
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +214 -55
- package/src/browser/types.ts +80 -22
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +2 -1
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +117 -14
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +117 -23
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +55 -28
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +29 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +224 -41
- package/src/cache/cache-scope.ts +188 -82
- package/src/cache/cache-tag.ts +103 -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 +1990 -377
- 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 +6 -16
- package/src/cache/document-cache.ts +89 -21
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +10 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +9 -17
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +37 -100
- package/src/client.rsc.tsx +44 -21
- package/src/client.tsx +36 -61
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +18 -6
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +31 -23
- package/src/handles/MetaTags.tsx +62 -19
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +37 -8
- package/src/handles/is-thenable.ts +19 -0
- package/src/handles/meta.ts +51 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +93 -12
- package/src/index.ts +91 -14
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +61 -6
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +34 -0
- package/src/reverse.ts +65 -40
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +293 -311
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +82 -55
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -1
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +19 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +73 -25
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +10 -42
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +39 -20
- package/src/router/lazy-includes.ts +9 -46
- package/src/router/loader-resolution.ts +152 -72
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +6 -21
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +159 -285
- package/src/router/match-middleware/cache-store.ts +64 -52
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +44 -74
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +5 -112
- package/src/router/middleware.ts +237 -165
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +85 -94
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prerender-match.ts +104 -65
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +28 -62
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +3 -28
- package/src/router/router-interfaces.ts +83 -35
- package/src/router/router-options.ts +136 -5
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +97 -84
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +76 -39
- package/src/router/segment-resolution/revalidation.ts +272 -320
- package/src/router/segment-resolution/static-store.ts +19 -5
- 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 +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +161 -199
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +162 -64
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +109 -53
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +262 -219
- package/src/rsc/helpers.ts +100 -6
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +117 -11
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +85 -188
- package/src/rsc/rsc-rendering.ts +98 -76
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +281 -117
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +23 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-loader-promise.ts +31 -4
- package/src/segment-system.tsx +227 -143
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +163 -51
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +277 -136
- package/src/ssr/index.tsx +21 -16
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +701 -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 +183 -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 +581 -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 +20 -58
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +108 -28
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +135 -14
- package/src/urls/include-helper.ts +9 -56
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +29 -12
- package/src/urls/path-helper.ts +17 -106
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +20 -19
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +292 -107
- package/src/vite/debug.ts +58 -13
- package/src/vite/discovery/bundle-postprocess.ts +8 -7
- package/src/vite/discovery/discover-routers.ts +97 -84
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +50 -69
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +44 -0
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +2 -0
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +126 -8
- package/src/vite/plugins/cjs-to-esm.ts +14 -28
- package/src/vite/plugins/client-ref-dedup.ts +5 -21
- package/src/vite/plugins/client-ref-hashing.ts +14 -13
- package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
- package/src/vite/plugins/expose-action-id.ts +6 -77
- package/src/vite/plugins/expose-id-utils.ts +88 -55
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +100 -28
- package/src/vite/plugins/expose-internal-ids.ts +59 -70
- package/src/vite/plugins/performance-tracks.ts +11 -18
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +28 -52
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +37 -40
- package/src/vite/plugins/virtual-entries.ts +39 -25
- package/src/vite/rango.ts +62 -106
- package/src/vite/router-discovery.ts +591 -122
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/bundle-analysis.ts +10 -15
- 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 +4 -59
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +54 -39
- package/src/vite/utils/shared-utils.ts +90 -41
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -11,12 +11,18 @@ import {
|
|
|
11
11
|
getContext,
|
|
12
12
|
getNamePrefix,
|
|
13
13
|
getUrlPrefix,
|
|
14
|
+
requireDslContext,
|
|
14
15
|
type EntryData,
|
|
16
|
+
type EntryPropDatas,
|
|
17
|
+
type EntryPropSegments,
|
|
18
|
+
type HelperContext,
|
|
15
19
|
type InterceptEntry,
|
|
20
|
+
type InterceptConfig,
|
|
16
21
|
} from "../server/context";
|
|
17
22
|
import { invariant } from "../errors";
|
|
23
|
+
import { validateUserRouteName } from "../route-name.js";
|
|
18
24
|
import { isCachedFunction } from "../cache/taint.js";
|
|
19
|
-
import {
|
|
25
|
+
import { RangoContext } from "../server/context";
|
|
20
26
|
import { isStaticHandler } from "../static-handler.js";
|
|
21
27
|
import RootLayout from "../server/root-layout";
|
|
22
28
|
import type {
|
|
@@ -31,13 +37,13 @@ import type {
|
|
|
31
37
|
ErrorBoundaryItem,
|
|
32
38
|
NotFoundBoundaryItem,
|
|
33
39
|
LayoutItem,
|
|
34
|
-
WhenItem,
|
|
35
40
|
CacheItem,
|
|
36
41
|
TransitionItem,
|
|
37
42
|
UseItems,
|
|
38
43
|
} from "../route-types.js";
|
|
39
44
|
import type { RouteHelpers } from "./helpers-types.js";
|
|
40
45
|
import { resolveHandlerUse, mergeHandlerUse } from "./resolve-handler-use.js";
|
|
46
|
+
import { ALL_USE_ITEM_TYPES } from "./use-item-types.js";
|
|
41
47
|
|
|
42
48
|
/**
|
|
43
49
|
* Check if an item contains routes (directly or inside nested structures like cache).
|
|
@@ -61,16 +67,105 @@ const hasRoutesInItem = (item: AllUseItems): boolean => {
|
|
|
61
67
|
return false;
|
|
62
68
|
};
|
|
63
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Fresh empty collections shared by every from-scratch segment entry. Returns
|
|
72
|
+
* new arrays/objects per call so no two entries share mutable references.
|
|
73
|
+
* mountPath is intentionally NOT included here — each call site adds it from
|
|
74
|
+
* getUrlPrefix() where applicable: the route() and transition() helpers add
|
|
75
|
+
* none, while path() (which also builds a `type: "route"` entry) and the
|
|
76
|
+
* structural helpers (layout/cache/middleware/parallel) do.
|
|
77
|
+
*/
|
|
78
|
+
const emptySegmentBase = (): EntryPropDatas &
|
|
79
|
+
EntryPropSegments & { loading: undefined } => ({
|
|
80
|
+
loading: undefined,
|
|
81
|
+
middleware: [],
|
|
82
|
+
revalidate: [],
|
|
83
|
+
errorBoundary: [],
|
|
84
|
+
notFoundBoundary: [],
|
|
85
|
+
layout: [],
|
|
86
|
+
parallel: {},
|
|
87
|
+
intercept: [],
|
|
88
|
+
loader: [],
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Run a children/use callback as a nested scope, flatten the result, and assert
|
|
93
|
+
* every item is a valid use item. `kind` preserves the existing error wording
|
|
94
|
+
* ("use()" vs "children" callback).
|
|
95
|
+
*/
|
|
96
|
+
function runAndValidateUseItems(
|
|
97
|
+
store: ReturnType<typeof getContext>,
|
|
98
|
+
namespace: string,
|
|
99
|
+
entry: EntryData,
|
|
100
|
+
cb: () => any,
|
|
101
|
+
label: string,
|
|
102
|
+
kind: "use" | "children",
|
|
103
|
+
): AllUseItems[] {
|
|
104
|
+
const result = store.run(namespace, entry, cb)?.flat(3);
|
|
105
|
+
return validateUseItems(result, namespace, label, kind);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Assert an already-invoked, flattened callback result is a use-item array. */
|
|
109
|
+
function validateUseItems(
|
|
110
|
+
result: any,
|
|
111
|
+
namespace: string,
|
|
112
|
+
label: string,
|
|
113
|
+
kind: "use" | "children",
|
|
114
|
+
): AllUseItems[] {
|
|
115
|
+
invariant(
|
|
116
|
+
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
117
|
+
`${label}() ${kind === "use" ? "use()" : "children"} callback must return an array of use items [${namespace}]`,
|
|
118
|
+
);
|
|
119
|
+
return result as AllUseItems[];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** True when a children/use result contains no routes (directly or nested). */
|
|
123
|
+
const isOrphan = (result: AllUseItems[]): boolean =>
|
|
124
|
+
!result.some((item) => item != null && hasRoutesInItem(item));
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Register a routeless structural entry as an orphan sibling: clear its parent
|
|
128
|
+
* pointer so it leaves the middleware/parent-pointer chain (LOAD-BEARING — see
|
|
129
|
+
* docs/tree-structure.md) and push it onto the parent's layout[] so it renders
|
|
130
|
+
* as a wrapper. Used by cache()/middleware()/transition(); layout() runs extra
|
|
131
|
+
* validation and registers inline.
|
|
132
|
+
*/
|
|
133
|
+
const attachOrphanSibling = (
|
|
134
|
+
parent: EntryData | null,
|
|
135
|
+
entry: EntryData,
|
|
136
|
+
): void => {
|
|
137
|
+
entry.parent = null;
|
|
138
|
+
if (parent && "layout" in parent) parent.layout.push(entry);
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Run `fn` with `ctx.parent` temporarily redirected to `temp` — a satellite
|
|
143
|
+
* entry that captures the attachments declared by a use() callback — restoring
|
|
144
|
+
* the original parent afterward, including on throw. loader()/intercept() each
|
|
145
|
+
* build their own tempParent shape (intercept keeps a loading get/set accessor
|
|
146
|
+
* and a captured-layouts array); this only centralizes the save/restore.
|
|
147
|
+
*/
|
|
148
|
+
function withParent<T>(ctx: HelperContext, temp: EntryData, fn: () => T): T {
|
|
149
|
+
const original = ctx.parent;
|
|
150
|
+
ctx.parent = temp;
|
|
151
|
+
try {
|
|
152
|
+
return fn();
|
|
153
|
+
} finally {
|
|
154
|
+
ctx.parent = original;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
64
158
|
const revalidate: RouteHelpers<any, any>["revalidate"] = (fn) => {
|
|
65
|
-
const ctx =
|
|
66
|
-
|
|
159
|
+
const { store, ctx } = requireDslContext(
|
|
160
|
+
"revalidate() must be called inside urls()",
|
|
161
|
+
);
|
|
67
162
|
|
|
68
163
|
// Attach to last entry in stack
|
|
69
164
|
const parent = ctx.parent;
|
|
70
165
|
if (!parent || !("revalidate" in parent)) {
|
|
71
166
|
invariant(false, "No parent entry available for revalidate()");
|
|
72
167
|
}
|
|
73
|
-
const name = `$${
|
|
168
|
+
const name = `$${store.getNextIndex("revalidate")}`;
|
|
74
169
|
parent.revalidate.push(fn);
|
|
75
170
|
return { name, type: "revalidate" } as RevalidateItem;
|
|
76
171
|
};
|
|
@@ -108,15 +203,16 @@ const revalidate: RouteHelpers<any, any>["revalidate"] = (fn) => {
|
|
|
108
203
|
* ```
|
|
109
204
|
*/
|
|
110
205
|
const errorBoundary: RouteHelpers<any, any>["errorBoundary"] = (fallback) => {
|
|
111
|
-
const ctx =
|
|
112
|
-
|
|
206
|
+
const { store, ctx } = requireDslContext(
|
|
207
|
+
"errorBoundary() must be called inside urls()",
|
|
208
|
+
);
|
|
113
209
|
|
|
114
210
|
// Attach to parent entry in stack
|
|
115
211
|
const parent = ctx.parent;
|
|
116
212
|
if (!parent || !("errorBoundary" in parent)) {
|
|
117
213
|
invariant(false, "No parent entry available for errorBoundary()");
|
|
118
214
|
}
|
|
119
|
-
const name = `$${
|
|
215
|
+
const name = `$${store.getNextIndex("errorBoundary")}`;
|
|
120
216
|
parent.errorBoundary.push(fallback);
|
|
121
217
|
return { name, type: "errorBoundary" } as ErrorBoundaryItem;
|
|
122
218
|
};
|
|
@@ -155,46 +251,20 @@ const errorBoundary: RouteHelpers<any, any>["errorBoundary"] = (fallback) => {
|
|
|
155
251
|
const notFoundBoundary: RouteHelpers<any, any>["notFoundBoundary"] = (
|
|
156
252
|
fallback,
|
|
157
253
|
) => {
|
|
158
|
-
const ctx =
|
|
159
|
-
|
|
254
|
+
const { store, ctx } = requireDslContext(
|
|
255
|
+
"notFoundBoundary() must be called inside urls()",
|
|
256
|
+
);
|
|
160
257
|
|
|
161
258
|
// Attach to parent entry in stack
|
|
162
259
|
const parent = ctx.parent;
|
|
163
260
|
if (!parent || !("notFoundBoundary" in parent)) {
|
|
164
261
|
invariant(false, "No parent entry available for notFoundBoundary()");
|
|
165
262
|
}
|
|
166
|
-
const name = `$${
|
|
263
|
+
const name = `$${store.getNextIndex("notFoundBoundary")}`;
|
|
167
264
|
parent.notFoundBoundary.push(fallback);
|
|
168
265
|
return { name, type: "notFoundBoundary" } as NotFoundBoundaryItem;
|
|
169
266
|
};
|
|
170
267
|
|
|
171
|
-
/**
|
|
172
|
-
* When helper - defines a condition for intercept activation
|
|
173
|
-
*
|
|
174
|
-
* Only valid inside intercept() use() callback. The when() function
|
|
175
|
-
* is captured by the intercept and stored in its `when` array.
|
|
176
|
-
* During soft navigation, all when() conditions must return true
|
|
177
|
-
* for the intercept to activate.
|
|
178
|
-
*/
|
|
179
|
-
const when: RouteHelpers<any, any>["when"] = (fn) => {
|
|
180
|
-
const ctx = getContext().getStore();
|
|
181
|
-
if (!ctx) throw new Error("when() must be called inside intercept()");
|
|
182
|
-
|
|
183
|
-
// The when() function needs to be captured by the intercept's tempParent
|
|
184
|
-
// which should have a `when` array. If not present, we're not inside intercept()
|
|
185
|
-
const parent = ctx.parent as any;
|
|
186
|
-
if (!parent || !("when" in parent)) {
|
|
187
|
-
invariant(
|
|
188
|
-
false,
|
|
189
|
-
"when() can only be used inside intercept() use() callback",
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const name = `$${getContext().getNextIndex("when")}`;
|
|
194
|
-
parent.when.push(fn);
|
|
195
|
-
return { name, type: "when" } as WhenItem;
|
|
196
|
-
};
|
|
197
|
-
|
|
198
268
|
/**
|
|
199
269
|
* Cache helper - defines caching configuration for segments
|
|
200
270
|
*
|
|
@@ -205,21 +275,21 @@ const when: RouteHelpers<any, any>["when"] = (fn) => {
|
|
|
205
275
|
* Supports these call signatures:
|
|
206
276
|
* - cache() - no args, uses app-level defaults (for loader caching)
|
|
207
277
|
* - cache(() => [...]) - wraps children with app-level defaults
|
|
208
|
-
* - cache('profileName') - uses a named cache profile
|
|
209
|
-
* - cache('profileName', () => [...]) - named profile with children
|
|
210
278
|
* - cache({ ttl: 60 }, () => [...]) - with explicit options
|
|
279
|
+
*
|
|
280
|
+
* Named cache profiles are applied via the `"use cache: <profile>"` directive,
|
|
281
|
+
* not a `cache("profileName")` form in the route tree.
|
|
211
282
|
*/
|
|
212
283
|
const cache: RouteHelpers<any, any>["cache"] = (
|
|
213
284
|
optionsOrChildren?:
|
|
214
285
|
| PartialCacheOptions
|
|
215
286
|
| false
|
|
216
|
-
| string
|
|
217
287
|
| (() => UseItems<AllUseItems>),
|
|
218
288
|
maybeChildren?: () => UseItems<AllUseItems>,
|
|
219
289
|
) => {
|
|
220
|
-
const store =
|
|
221
|
-
|
|
222
|
-
|
|
290
|
+
const { store, ctx } = requireDslContext(
|
|
291
|
+
"cache() must be called inside urls()",
|
|
292
|
+
);
|
|
223
293
|
|
|
224
294
|
// Handle overloaded signature
|
|
225
295
|
let options: PartialCacheOptions | false;
|
|
@@ -229,18 +299,6 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
229
299
|
// cache() - no args, use defaults
|
|
230
300
|
options = {};
|
|
231
301
|
children = undefined;
|
|
232
|
-
} else if (typeof optionsOrChildren === "string") {
|
|
233
|
-
// cache('profileName') or cache('profileName', () => [...])
|
|
234
|
-
// Resolve from context-scoped profiles (set per-router via HelperContext).
|
|
235
|
-
const ctxStore = RSCRouterContext.getStore();
|
|
236
|
-
const profile = ctxStore?.cacheProfiles?.[optionsOrChildren];
|
|
237
|
-
invariant(
|
|
238
|
-
profile,
|
|
239
|
-
`cache("${optionsOrChildren}"): unknown cache profile. ` +
|
|
240
|
-
`Define it in createRouter({ cacheProfiles: { "${optionsOrChildren}": { ttl: ... } } }).`,
|
|
241
|
-
);
|
|
242
|
-
options = { ttl: profile.ttl, swr: profile.swr, tags: profile.tags };
|
|
243
|
-
children = maybeChildren;
|
|
244
302
|
} else if (typeof optionsOrChildren === "function") {
|
|
245
303
|
// cache(() => [...]) - use empty options (will use defaults)
|
|
246
304
|
options = {};
|
|
@@ -271,26 +329,18 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
271
329
|
// Create orphan cache entry (like orphan layout)
|
|
272
330
|
// Subsequent siblings in the same array will attach to this entry
|
|
273
331
|
const namespace = `${ctx.namespace}.${cacheIndex}`;
|
|
274
|
-
const
|
|
332
|
+
const urlPrefix = getUrlPrefix();
|
|
275
333
|
|
|
276
334
|
const entry = {
|
|
335
|
+
...emptySegmentBase(),
|
|
277
336
|
id: namespace,
|
|
278
337
|
shortCode: store.getShortCode("cache"),
|
|
279
338
|
type: "cache",
|
|
280
339
|
parent: parent, // link to current parent for hierarchy
|
|
281
340
|
cache: cacheConfig,
|
|
282
341
|
handler: RootLayout,
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
revalidate: [],
|
|
286
|
-
errorBoundary: [],
|
|
287
|
-
notFoundBoundary: [],
|
|
288
|
-
layout: [],
|
|
289
|
-
parallel: {},
|
|
290
|
-
intercept: [],
|
|
291
|
-
loader: [],
|
|
292
|
-
...(cacheUrlPrefix ? { mountPath: cacheUrlPrefix } : {}),
|
|
293
|
-
} as EntryData;
|
|
342
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
343
|
+
} satisfies EntryData;
|
|
294
344
|
|
|
295
345
|
// Attach to parent's layout array (cache entries are structural like layouts)
|
|
296
346
|
if (parent && "layout" in parent) {
|
|
@@ -304,10 +354,10 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
304
354
|
return { name: namespace, type: "cache" } as CacheItem;
|
|
305
355
|
}
|
|
306
356
|
|
|
307
|
-
// Inside a loader() use() callback, only the direct form — cache()/cache(opts)
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
//
|
|
357
|
+
// Inside a loader() use() callback, only the direct form — cache()/cache(opts)
|
|
358
|
+
// — writes cache config to the loader entry. The wrapper form creates a
|
|
359
|
+
// structural cache boundary with its own children scope, which has no effect
|
|
360
|
+
// on the loader and would silently no-op.
|
|
311
361
|
invariant(
|
|
312
362
|
!(ctx.parent && (ctx.parent as any).type === "loader"),
|
|
313
363
|
"cache() wrapper form is not valid inside loader() use(). Use cache({...}) without children to configure the loader's cache.",
|
|
@@ -317,9 +367,10 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
317
367
|
const namespace = `${ctx.namespace}.${cacheIndex}`;
|
|
318
368
|
const cacheShortCode = store.getShortCode("cache");
|
|
319
369
|
|
|
320
|
-
const
|
|
370
|
+
const urlPrefix = getUrlPrefix();
|
|
321
371
|
|
|
322
372
|
const entry = {
|
|
373
|
+
...emptySegmentBase(),
|
|
323
374
|
id: namespace,
|
|
324
375
|
shortCode: cacheShortCode,
|
|
325
376
|
type: "cache",
|
|
@@ -327,40 +378,22 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
327
378
|
cache: cacheConfig,
|
|
328
379
|
// Cache entries render like layouts (with Outlet as default handler)
|
|
329
380
|
handler: RootLayout, // RootLayout just renders <Outlet />
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
revalidate: [],
|
|
333
|
-
errorBoundary: [],
|
|
334
|
-
notFoundBoundary: [],
|
|
335
|
-
layout: [],
|
|
336
|
-
parallel: {},
|
|
337
|
-
intercept: [],
|
|
338
|
-
loader: [],
|
|
339
|
-
...(cacheUrlPrefix2 ? { mountPath: cacheUrlPrefix2 } : {}),
|
|
340
|
-
} as EntryData;
|
|
381
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
382
|
+
} satisfies EntryData;
|
|
341
383
|
|
|
342
384
|
// Run children with cache entry as parent
|
|
343
|
-
const result =
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
385
|
+
const result = runAndValidateUseItems(
|
|
386
|
+
store,
|
|
387
|
+
namespace,
|
|
388
|
+
entry,
|
|
389
|
+
children,
|
|
390
|
+
"cache",
|
|
391
|
+
"children",
|
|
348
392
|
);
|
|
349
393
|
|
|
350
|
-
//
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
Array.isArray(result) &&
|
|
354
|
-
result.some((item) => hasRoutesInItem(item));
|
|
355
|
-
|
|
356
|
-
if (!hasRoutes) {
|
|
357
|
-
const parent = ctx.parent;
|
|
358
|
-
if (parent && "layout" in parent) {
|
|
359
|
-
// Attach to parent's layout array (cache entries are structural like layouts)
|
|
360
|
-
entry.parent = null;
|
|
361
|
-
parent.layout.push(entry);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
394
|
+
// Cache entries are structural like layouts: with no routes inside, register
|
|
395
|
+
// as an orphan sibling.
|
|
396
|
+
if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
|
|
364
397
|
|
|
365
398
|
return { name: namespace, type: "cache", uses: result } as CacheItem;
|
|
366
399
|
};
|
|
@@ -406,9 +439,9 @@ const middleware: RouteHelpers<any, any>["middleware"] = (...args: any[]) => {
|
|
|
406
439
|
}
|
|
407
440
|
}
|
|
408
441
|
|
|
409
|
-
const store =
|
|
410
|
-
|
|
411
|
-
|
|
442
|
+
const { store, ctx } = requireDslContext(
|
|
443
|
+
"middleware() must be called inside urls()",
|
|
444
|
+
);
|
|
412
445
|
|
|
413
446
|
if (!children) {
|
|
414
447
|
// Sibling mode: attach to parent entry
|
|
@@ -427,22 +460,15 @@ const middleware: RouteHelpers<any, any>["middleware"] = (...args: any[]) => {
|
|
|
427
460
|
|
|
428
461
|
const urlPrefix = getUrlPrefix();
|
|
429
462
|
const entry = {
|
|
463
|
+
...emptySegmentBase(),
|
|
430
464
|
id: namespace,
|
|
431
465
|
shortCode: store.getShortCode("layout"),
|
|
432
466
|
type: "layout",
|
|
433
467
|
parent: ctx.parent,
|
|
434
468
|
handler: RootLayout,
|
|
435
|
-
loading: undefined,
|
|
436
469
|
middleware: [...fns],
|
|
437
|
-
revalidate: [],
|
|
438
|
-
errorBoundary: [],
|
|
439
|
-
notFoundBoundary: [],
|
|
440
|
-
layout: [],
|
|
441
|
-
parallel: {},
|
|
442
|
-
intercept: [],
|
|
443
|
-
loader: [],
|
|
444
470
|
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
445
|
-
}
|
|
471
|
+
} satisfies EntryData;
|
|
446
472
|
|
|
447
473
|
// Run children callback. If the second arg was actually a middleware fn
|
|
448
474
|
// (old variadic form: middleware(mw1, mw2)), this will return a non-array
|
|
@@ -455,25 +481,14 @@ const middleware: RouteHelpers<any, any>["middleware"] = (...args: any[]) => {
|
|
|
455
481
|
"To pass multiple middleware, use middleware([fn1, fn2]).",
|
|
456
482
|
);
|
|
457
483
|
|
|
458
|
-
const result =
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
484
|
+
const result = validateUseItems(
|
|
485
|
+
rawResult.flat(3),
|
|
486
|
+
namespace,
|
|
487
|
+
"middleware",
|
|
488
|
+
"children",
|
|
463
489
|
);
|
|
464
490
|
|
|
465
|
-
|
|
466
|
-
result &&
|
|
467
|
-
Array.isArray(result) &&
|
|
468
|
-
result.some((item) => item != null && hasRoutesInItem(item));
|
|
469
|
-
|
|
470
|
-
if (!hasRoutes) {
|
|
471
|
-
const parent = ctx.parent;
|
|
472
|
-
if (parent && "layout" in parent) {
|
|
473
|
-
entry.parent = null;
|
|
474
|
-
parent.layout.push(entry);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
491
|
+
if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
|
|
477
492
|
|
|
478
493
|
return {
|
|
479
494
|
name: namespace,
|
|
@@ -482,10 +497,26 @@ const middleware: RouteHelpers<any, any>["middleware"] = (...args: any[]) => {
|
|
|
482
497
|
} as MiddlewareItem;
|
|
483
498
|
};
|
|
484
499
|
|
|
500
|
+
// Slot names become part of segment ids: a parallel/intercept slot is encoded
|
|
501
|
+
// as `${shortCode}.${slotName}`, and loader segments append `D${index}.${loaderId}`.
|
|
502
|
+
// A "." in the slot name collides with that separator -- loaderParentId
|
|
503
|
+
// (segment-system.tsx) strips from the FIRST `D<index>.`, so a name like
|
|
504
|
+
// "@D3.foo" is mis-cut to "@" and the loader's data is silently dropped. Reject
|
|
505
|
+
// the dot at definition time so the failure is loud, not a corrupted tree at
|
|
506
|
+
// runtime. (A bare "D" without a trailing dot -- e.g. "@Detail" -- is fine.)
|
|
507
|
+
function assertValidSlotName(slotName: string): void {
|
|
508
|
+
invariant(
|
|
509
|
+
!slotName.includes("."),
|
|
510
|
+
`Slot name "${slotName}" must not contain ".". The dot is a reserved ` +
|
|
511
|
+
`segment-id separator; a name like "@D3.foo" corrupts loader segment-id ` +
|
|
512
|
+
`parsing and silently drops the loader's data. Rename the slot.`,
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
|
|
485
516
|
const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
486
|
-
const store =
|
|
487
|
-
|
|
488
|
-
|
|
517
|
+
const { store, ctx } = requireDslContext(
|
|
518
|
+
"parallel() must be called inside urls()",
|
|
519
|
+
);
|
|
489
520
|
|
|
490
521
|
if (!ctx.parent || !ctx.parent?.parallel) {
|
|
491
522
|
invariant(false, "No parent entry available for parallel()");
|
|
@@ -497,6 +528,7 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
497
528
|
);
|
|
498
529
|
|
|
499
530
|
const slotNames = Object.keys(slots as Record<string, any>) as `@${string}`[];
|
|
531
|
+
for (const slotName of slotNames) assertValidSlotName(slotName);
|
|
500
532
|
|
|
501
533
|
const namespace = `${ctx.namespace}.$${store.getNextIndex("parallel")}`;
|
|
502
534
|
|
|
@@ -537,20 +569,12 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
537
569
|
// Create full EntryData for parallel with its own loaders/revalidate/loading
|
|
538
570
|
const parallelUrlPrefix = getUrlPrefix();
|
|
539
571
|
const entry = {
|
|
572
|
+
...emptySegmentBase(),
|
|
540
573
|
id: namespace,
|
|
541
574
|
shortCode: store.getShortCode("parallel"),
|
|
542
575
|
type: "parallel",
|
|
543
576
|
parent: null, // Parallels don't participate in parent chain traversal
|
|
544
577
|
handler: unwrappedSlots,
|
|
545
|
-
loading: undefined, // Allow loading() to attach loading state
|
|
546
|
-
middleware: [],
|
|
547
|
-
revalidate: [],
|
|
548
|
-
errorBoundary: [],
|
|
549
|
-
notFoundBoundary: [],
|
|
550
|
-
layout: [],
|
|
551
|
-
parallel: {},
|
|
552
|
-
intercept: [],
|
|
553
|
-
loader: [],
|
|
554
578
|
...(parallelUrlPrefix ? { mountPath: parallelUrlPrefix } : {}),
|
|
555
579
|
...(hasStaticSlot
|
|
556
580
|
? {
|
|
@@ -605,10 +629,13 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
605
629
|
"parallel",
|
|
606
630
|
);
|
|
607
631
|
if (slotMergedUse) {
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
632
|
+
runAndValidateUseItems(
|
|
633
|
+
store,
|
|
634
|
+
namespace,
|
|
635
|
+
slotEntry,
|
|
636
|
+
slotMergedUse,
|
|
637
|
+
"parallel",
|
|
638
|
+
"use",
|
|
612
639
|
);
|
|
613
640
|
}
|
|
614
641
|
|
|
@@ -646,11 +673,22 @@ const intercept = (
|
|
|
646
673
|
slotName: `@${string}`,
|
|
647
674
|
routeName: string,
|
|
648
675
|
handler: any,
|
|
676
|
+
configOrUse?: InterceptConfig | (() => any[]),
|
|
649
677
|
use?: () => any[],
|
|
650
678
|
) => {
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
679
|
+
// arg4 discrimination: a function is the use() callback (no config); an object
|
|
680
|
+
// is the config carrying `when`. With config given, the use() callback is
|
|
681
|
+
// arg5. Keeps the no-config form intercept(slot, route, handler, () => [...])
|
|
682
|
+
// working unchanged.
|
|
683
|
+
const config: InterceptConfig | undefined =
|
|
684
|
+
typeof configOrUse === "function" || configOrUse == null
|
|
685
|
+
? undefined
|
|
686
|
+
: configOrUse;
|
|
687
|
+
const useFn = typeof configOrUse === "function" ? configOrUse : use;
|
|
688
|
+
|
|
689
|
+
const { store, ctx } = requireDslContext(
|
|
690
|
+
"intercept() must be called inside urls()",
|
|
691
|
+
);
|
|
654
692
|
|
|
655
693
|
if (!ctx.parent || !ctx.parent?.intercept) {
|
|
656
694
|
invariant(false, "No parent entry available for intercept()");
|
|
@@ -661,6 +699,8 @@ const intercept = (
|
|
|
661
699
|
"intercept() cannot be used inside parallel()",
|
|
662
700
|
);
|
|
663
701
|
|
|
702
|
+
assertValidSlotName(slotName);
|
|
703
|
+
|
|
664
704
|
const namespace = `${ctx.namespace}.$${store.getNextIndex("intercept")}.${slotName}`;
|
|
665
705
|
|
|
666
706
|
// Dot-prefixed = local (add include prefix), unprefixed = global (use as-is)
|
|
@@ -683,29 +723,33 @@ const intercept = (
|
|
|
683
723
|
when: [], // Selector conditions for conditional interception
|
|
684
724
|
};
|
|
685
725
|
|
|
726
|
+
// Conditional interception: `when` from the config object — a single selector
|
|
727
|
+
// or an array (ALL must return true to activate). Replaces the former when()
|
|
728
|
+
// use-item captured inside the callback.
|
|
729
|
+
if (config?.when) {
|
|
730
|
+
const selectors = Array.isArray(config.when) ? config.when : [config.when];
|
|
731
|
+
entry.when.push(...selectors);
|
|
732
|
+
}
|
|
733
|
+
|
|
686
734
|
// Merge handler.use defaults with explicit use
|
|
687
735
|
const handlerUseFn = resolveHandlerUse(handler);
|
|
688
|
-
const mergedUse = mergeHandlerUse(handlerUseFn,
|
|
736
|
+
const mergedUse = mergeHandlerUse(handlerUseFn, useFn, "intercept");
|
|
689
737
|
|
|
690
738
|
// Run merged use callback to collect loaders, revalidate, middleware, etc.
|
|
691
739
|
if (mergedUse) {
|
|
692
|
-
//
|
|
693
|
-
// so that middleware, loader, revalidate attach to the intercept entry
|
|
694
|
-
const originalParent = ctx.parent;
|
|
695
|
-
|
|
696
|
-
// Capture layouts in a temporary array
|
|
740
|
+
// Capture layout() calls into a temporary array
|
|
697
741
|
const capturedLayouts: EntryData[] = [];
|
|
698
742
|
|
|
743
|
+
// Temporary parent so middleware/loader/revalidate/when attach to the
|
|
744
|
+
// intercept entry; the loading get/set accessor mirrors writes onto `entry`.
|
|
699
745
|
const tempParent = {
|
|
700
|
-
...
|
|
746
|
+
...ctx.parent,
|
|
701
747
|
middleware: entry.middleware,
|
|
702
748
|
revalidate: entry.revalidate,
|
|
703
749
|
errorBoundary: entry.errorBoundary,
|
|
704
750
|
notFoundBoundary: entry.notFoundBoundary,
|
|
705
751
|
loader: entry.loader,
|
|
706
752
|
layout: capturedLayouts, // Capture layout() calls
|
|
707
|
-
when: entry.when, // Capture when() conditions
|
|
708
|
-
// Use getter/setter to capture loading on the entry
|
|
709
753
|
get loading() {
|
|
710
754
|
return entry.loading;
|
|
711
755
|
},
|
|
@@ -713,12 +757,10 @@ const intercept = (
|
|
|
713
757
|
entry.loading = value;
|
|
714
758
|
},
|
|
715
759
|
};
|
|
716
|
-
ctx.parent = tempParent as EntryData;
|
|
717
|
-
|
|
718
|
-
const result = mergedUse()?.flat(3);
|
|
719
760
|
|
|
720
|
-
|
|
721
|
-
|
|
761
|
+
const result = withParent(ctx, tempParent as EntryData, () =>
|
|
762
|
+
mergedUse()?.flat(3),
|
|
763
|
+
);
|
|
722
764
|
|
|
723
765
|
// Extract layout from captured layouts (use first one if multiple)
|
|
724
766
|
// Layout inside intercept should always be ReactNode or Handler, not Record slots
|
|
@@ -728,10 +770,7 @@ const intercept = (
|
|
|
728
770
|
| Handler<any, any, any>;
|
|
729
771
|
}
|
|
730
772
|
|
|
731
|
-
|
|
732
|
-
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
733
|
-
`intercept() use() callback must return an array of use items [${namespace}]`,
|
|
734
|
-
);
|
|
773
|
+
validateUseItems(result, namespace, "intercept", "use");
|
|
735
774
|
}
|
|
736
775
|
|
|
737
776
|
ctx.parent.intercept.push(entry);
|
|
@@ -741,10 +780,10 @@ const intercept = (
|
|
|
741
780
|
/**
|
|
742
781
|
* Loader helper - attaches a loader to the current entry
|
|
743
782
|
*/
|
|
744
|
-
const
|
|
745
|
-
const store =
|
|
746
|
-
|
|
747
|
-
|
|
783
|
+
const loader: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
784
|
+
const { store, ctx } = requireDslContext(
|
|
785
|
+
"loader() must be called inside urls()",
|
|
786
|
+
);
|
|
748
787
|
|
|
749
788
|
// Attach to last entry in stack
|
|
750
789
|
if (!ctx.parent || !ctx.parent?.loader) {
|
|
@@ -765,23 +804,22 @@ const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
|
765
804
|
|
|
766
805
|
// If any use callback is in effect, run it to collect revalidation rules and cache config
|
|
767
806
|
if (mergedUse) {
|
|
768
|
-
// Temporarily set context for revalidate()/cache() calls to target this loader
|
|
769
|
-
const originalParent = ctx.parent;
|
|
770
807
|
// Create a temporary "parent" with type "loader" so cache() can detect it.
|
|
771
808
|
// Save existing .cache to distinguish inherited config from newly set config.
|
|
772
|
-
const parentCache = (
|
|
809
|
+
const parentCache = (ctx.parent as any).cache;
|
|
773
810
|
const tempParent = {
|
|
774
|
-
...
|
|
811
|
+
...ctx.parent,
|
|
775
812
|
type: "loader",
|
|
776
813
|
revalidate: loaderEntry.revalidate,
|
|
777
814
|
};
|
|
778
|
-
ctx.parent = tempParent as EntryData;
|
|
779
815
|
|
|
780
|
-
const result =
|
|
816
|
+
const result = withParent(ctx, tempParent as EntryData, () =>
|
|
817
|
+
mergedUse()?.flat(3),
|
|
818
|
+
);
|
|
781
819
|
|
|
782
820
|
// Copy cache config only if cache() was called during the use() callback.
|
|
783
|
-
// The spread
|
|
784
|
-
//
|
|
821
|
+
// The spread may carry an inherited .cache from a parent cache() boundary —
|
|
822
|
+
// only copy if it was newly set.
|
|
785
823
|
if (
|
|
786
824
|
(tempParent as any).cache &&
|
|
787
825
|
(tempParent as any).cache !== parentCache
|
|
@@ -789,13 +827,7 @@ const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
|
789
827
|
(loaderEntry as any).cache = (tempParent as any).cache;
|
|
790
828
|
}
|
|
791
829
|
|
|
792
|
-
|
|
793
|
-
ctx.parent = originalParent;
|
|
794
|
-
|
|
795
|
-
invariant(
|
|
796
|
-
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
797
|
-
`loader() use() callback must return an array of use items [${name}]`,
|
|
798
|
-
);
|
|
830
|
+
validateUseItems(result, name, "loader", "use");
|
|
799
831
|
}
|
|
800
832
|
|
|
801
833
|
ctx.parent.loader.push(loaderEntry);
|
|
@@ -806,10 +838,10 @@ const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
|
806
838
|
* Loading helper - attaches a loading component to the current entry
|
|
807
839
|
* Loading components are static (no context) and shown during navigation
|
|
808
840
|
*/
|
|
809
|
-
const
|
|
810
|
-
const store =
|
|
811
|
-
|
|
812
|
-
|
|
841
|
+
const loading: RouteHelpers<any, any>["loading"] = (component, options) => {
|
|
842
|
+
const { store, ctx } = requireDslContext(
|
|
843
|
+
"loading() must be called inside urls()",
|
|
844
|
+
);
|
|
813
845
|
|
|
814
846
|
const parent = ctx.parent;
|
|
815
847
|
if (!parent || !("loading" in parent)) {
|
|
@@ -832,10 +864,13 @@ const loadingFn: RouteHelpers<any, any>["loading"] = (component, options) => {
|
|
|
832
864
|
};
|
|
833
865
|
|
|
834
866
|
/**
|
|
835
|
-
* Transition helper -
|
|
836
|
-
*
|
|
867
|
+
* Transition helper - opts the entry (or a wrapped group of routes) into
|
|
868
|
+
* transition-driven navigation by attaching a TransitionConfig. This drives the
|
|
869
|
+
* commit through startTransition (content hold on all React versions) and, on
|
|
870
|
+
* experimental React, places a `<ViewTransition>` boundary unless
|
|
871
|
+
* `viewTransition: false`. See skills/view-transitions for the matrix.
|
|
837
872
|
*/
|
|
838
|
-
const
|
|
873
|
+
const transition = (
|
|
839
874
|
configOrChildren?: TransitionConfig | (() => UseItems<AllUseItems>),
|
|
840
875
|
maybeChildren?: () => UseItems<AllUseItems>,
|
|
841
876
|
): TransitionItem => {
|
|
@@ -849,11 +884,15 @@ const transitionFn = (
|
|
|
849
884
|
const children: (() => UseItems<AllUseItems>) | undefined =
|
|
850
885
|
typeof configOrChildren === "function" ? configOrChildren : maybeChildren;
|
|
851
886
|
|
|
852
|
-
const store =
|
|
853
|
-
|
|
854
|
-
|
|
887
|
+
const { store, ctx } = requireDslContext(
|
|
888
|
+
"transition() must be called inside urls()",
|
|
889
|
+
);
|
|
855
890
|
|
|
856
|
-
|
|
891
|
+
// Allocate a single index for this transition() call (used in all paths),
|
|
892
|
+
// mirroring cache() — the child form uses it for the name, the wrapper form
|
|
893
|
+
// reuses it for the namespace, so no index is burned.
|
|
894
|
+
const transitionIndex = store.getNextIndex("transition");
|
|
895
|
+
const name = `$${transitionIndex}`;
|
|
857
896
|
|
|
858
897
|
if (!children) {
|
|
859
898
|
// Position 1: child of path() — attach to parent entry
|
|
@@ -866,70 +905,51 @@ const transitionFn = (
|
|
|
866
905
|
}
|
|
867
906
|
|
|
868
907
|
// Position 2: wrapper — create a transparent layout with transition config
|
|
869
|
-
const namespace = `${ctx.namespace}.${
|
|
908
|
+
const namespace = `${ctx.namespace}.${transitionIndex}`;
|
|
870
909
|
const entry = {
|
|
910
|
+
...emptySegmentBase(),
|
|
871
911
|
id: namespace,
|
|
872
912
|
shortCode: store.getShortCode("layout"),
|
|
873
913
|
type: "layout",
|
|
874
914
|
parent: ctx.parent,
|
|
875
915
|
handler: RootLayout,
|
|
876
|
-
loading: undefined,
|
|
877
916
|
transition: config,
|
|
878
|
-
|
|
879
|
-
revalidate: [],
|
|
880
|
-
errorBoundary: [],
|
|
881
|
-
notFoundBoundary: [],
|
|
882
|
-
layout: [],
|
|
883
|
-
parallel: {},
|
|
884
|
-
intercept: [],
|
|
885
|
-
loader: [],
|
|
886
|
-
} as EntryData;
|
|
887
|
-
|
|
888
|
-
const result = store.run(namespace, entry, children)?.flat(3);
|
|
917
|
+
} satisfies EntryData;
|
|
889
918
|
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
919
|
+
const result = runAndValidateUseItems(
|
|
920
|
+
store,
|
|
921
|
+
namespace,
|
|
922
|
+
entry,
|
|
923
|
+
children,
|
|
924
|
+
"transition",
|
|
925
|
+
"children",
|
|
893
926
|
);
|
|
894
927
|
|
|
895
|
-
|
|
896
|
-
result &&
|
|
897
|
-
Array.isArray(result) &&
|
|
898
|
-
result.some((item) => hasRoutesInItem(item));
|
|
899
|
-
|
|
900
|
-
if (!hasRoutes) {
|
|
901
|
-
const parent = ctx.parent;
|
|
902
|
-
if (parent && "layout" in parent) {
|
|
903
|
-
entry.parent = null;
|
|
904
|
-
parent.layout.push(entry);
|
|
905
|
-
}
|
|
906
|
-
}
|
|
928
|
+
if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
|
|
907
929
|
|
|
908
930
|
return { name: namespace, type: "transition" } as TransitionItem;
|
|
909
931
|
};
|
|
910
932
|
|
|
911
|
-
const
|
|
912
|
-
const store =
|
|
913
|
-
|
|
914
|
-
|
|
933
|
+
const route: RouteHelpers<any, any>["route"] = (name, handler, use) => {
|
|
934
|
+
const { store, ctx } = requireDslContext(
|
|
935
|
+
"route() must be called inside urls()",
|
|
936
|
+
);
|
|
937
|
+
|
|
938
|
+
// Reject names colliding with reserved internal prefixes ($path_, $prefix_),
|
|
939
|
+
// the same guard path() and include() enforce. Without it such a name
|
|
940
|
+
// type-checks on an untyped router, then silently vanishes from generated
|
|
941
|
+
// route-types and public reverse() (isAutoGeneratedRouteName filters it out).
|
|
942
|
+
validateUserRouteName(name);
|
|
915
943
|
|
|
916
944
|
const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${name}`;
|
|
917
945
|
|
|
918
946
|
const entry = {
|
|
947
|
+
...emptySegmentBase(),
|
|
919
948
|
id: namespace,
|
|
920
949
|
shortCode: store.getShortCode("route"),
|
|
921
950
|
type: "route",
|
|
922
951
|
parent: ctx.parent,
|
|
923
952
|
handler: handler as unknown as Handler<any, any, any>,
|
|
924
|
-
loading: undefined, // Allow loading() to attach loading state
|
|
925
|
-
middleware: [],
|
|
926
|
-
revalidate: [],
|
|
927
|
-
errorBoundary: [],
|
|
928
|
-
notFoundBoundary: [],
|
|
929
|
-
layout: [],
|
|
930
|
-
parallel: {},
|
|
931
|
-
intercept: [],
|
|
932
|
-
loader: [],
|
|
933
953
|
} satisfies EntryData;
|
|
934
954
|
|
|
935
955
|
/* We will throw if user is registring same route name twice */
|
|
@@ -944,10 +964,13 @@ const routeFn: RouteHelpers<any, any>["route"] = (name, handler, use) => {
|
|
|
944
964
|
const mergedUse = mergeHandlerUse(handlerUseFn, use, "route");
|
|
945
965
|
/* Run use and attach handlers */
|
|
946
966
|
if (mergedUse) {
|
|
947
|
-
const result =
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
967
|
+
const result = runAndValidateUseItems(
|
|
968
|
+
store,
|
|
969
|
+
namespace,
|
|
970
|
+
entry,
|
|
971
|
+
mergedUse,
|
|
972
|
+
"route",
|
|
973
|
+
"use",
|
|
951
974
|
);
|
|
952
975
|
return { name: namespace, type: "route", uses: result } as RouteItem;
|
|
953
976
|
}
|
|
@@ -957,9 +980,9 @@ const routeFn: RouteHelpers<any, any>["route"] = (name, handler, use) => {
|
|
|
957
980
|
};
|
|
958
981
|
|
|
959
982
|
const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
960
|
-
const store =
|
|
961
|
-
|
|
962
|
-
|
|
983
|
+
const { store, ctx } = requireDslContext(
|
|
984
|
+
"layout() must be called inside urls()",
|
|
985
|
+
);
|
|
963
986
|
|
|
964
987
|
invariant(
|
|
965
988
|
!ctx.parent || ctx.parent.type !== "parallel",
|
|
@@ -977,20 +1000,12 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
977
1000
|
|
|
978
1001
|
const urlPrefix = getUrlPrefix();
|
|
979
1002
|
const entry = {
|
|
1003
|
+
...emptySegmentBase(),
|
|
980
1004
|
id: namespace,
|
|
981
1005
|
shortCode,
|
|
982
1006
|
type: "layout",
|
|
983
1007
|
parent: ctx.parent,
|
|
984
1008
|
handler: unwrappedHandler,
|
|
985
|
-
loading: undefined, // Allow loading() to attach loading state
|
|
986
|
-
middleware: [],
|
|
987
|
-
revalidate: [],
|
|
988
|
-
errorBoundary: [],
|
|
989
|
-
notFoundBoundary: [],
|
|
990
|
-
parallel: {},
|
|
991
|
-
intercept: [],
|
|
992
|
-
layout: [],
|
|
993
|
-
loader: [],
|
|
994
1009
|
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
995
1010
|
...(isStatic
|
|
996
1011
|
? {
|
|
@@ -1012,11 +1027,13 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
1012
1027
|
// Run merged use callback if present
|
|
1013
1028
|
let result: AllUseItems[] | undefined;
|
|
1014
1029
|
if (mergedUse) {
|
|
1015
|
-
result =
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1030
|
+
result = runAndValidateUseItems(
|
|
1031
|
+
store,
|
|
1032
|
+
namespace,
|
|
1033
|
+
entry,
|
|
1034
|
+
mergedUse,
|
|
1035
|
+
"layout",
|
|
1036
|
+
"use",
|
|
1020
1037
|
);
|
|
1021
1038
|
}
|
|
1022
1039
|
|
|
@@ -1058,9 +1075,7 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
1058
1075
|
`Orphan layouts can only be defined inside route or layout > check [${namespace}]`,
|
|
1059
1076
|
);
|
|
1060
1077
|
|
|
1061
|
-
|
|
1062
|
-
entry.parent = null;
|
|
1063
|
-
parent.layout.push(entry);
|
|
1078
|
+
attachOrphanSibling(parent, entry);
|
|
1064
1079
|
}
|
|
1065
1080
|
}
|
|
1066
1081
|
|
|
@@ -1073,33 +1088,15 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
1073
1088
|
} as LayoutItem;
|
|
1074
1089
|
};
|
|
1075
1090
|
|
|
1076
|
-
const isValidUseItem = (item: any): item is AllUseItems | undefined | null =>
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
(item
|
|
1081
|
-
typeof item === "object" &&
|
|
1082
|
-
"type" in item &&
|
|
1083
|
-
[
|
|
1084
|
-
"layout",
|
|
1085
|
-
"route",
|
|
1086
|
-
"middleware",
|
|
1087
|
-
"revalidate",
|
|
1088
|
-
"parallel",
|
|
1089
|
-
"intercept",
|
|
1090
|
-
"loader",
|
|
1091
|
-
"loading",
|
|
1092
|
-
"errorBoundary",
|
|
1093
|
-
"notFoundBoundary",
|
|
1094
|
-
"when",
|
|
1095
|
-
"cache",
|
|
1096
|
-
"transition",
|
|
1097
|
-
"include", // For urls() include() helper
|
|
1098
|
-
].includes(item.type))
|
|
1099
|
-
);
|
|
1100
|
-
};
|
|
1091
|
+
const isValidUseItem = (item: any): item is AllUseItems | undefined | null =>
|
|
1092
|
+
item == null ||
|
|
1093
|
+
(typeof item === "object" &&
|
|
1094
|
+
"type" in item &&
|
|
1095
|
+
ALL_USE_ITEM_TYPES.has(item.type));
|
|
1101
1096
|
|
|
1102
|
-
//
|
|
1097
|
+
// DSL helpers exported for direct import from @rangojs/router and for
|
|
1098
|
+
// assembly into the RouteHelpers object in helper-factories.ts. The route-item
|
|
1099
|
+
// types are discriminated by their `type` literal, so the helpers carry no brand.
|
|
1103
1100
|
export {
|
|
1104
1101
|
layout,
|
|
1105
1102
|
cache,
|
|
@@ -1107,28 +1104,13 @@ export {
|
|
|
1107
1104
|
revalidate,
|
|
1108
1105
|
parallel,
|
|
1109
1106
|
intercept,
|
|
1110
|
-
when,
|
|
1111
1107
|
errorBoundary,
|
|
1112
1108
|
notFoundBoundary,
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
const isOrphanLayout = (item: AllUseItems): boolean => {
|
|
1119
|
-
return (
|
|
1120
|
-
item.type === "layout" &&
|
|
1121
|
-
!item.uses?.some((child) => hasRoutesInItem(child))
|
|
1122
|
-
);
|
|
1123
|
-
};
|
|
1124
|
-
|
|
1125
|
-
// Internal exports used by helper-factories.ts
|
|
1126
|
-
export {
|
|
1127
|
-
routeFn,
|
|
1128
|
-
loaderFn,
|
|
1129
|
-
loadingFn,
|
|
1130
|
-
transitionFn,
|
|
1131
|
-
hasRoutesInItem,
|
|
1109
|
+
route,
|
|
1110
|
+
loader,
|
|
1111
|
+
loading,
|
|
1112
|
+
transition,
|
|
1132
1113
|
isValidUseItem,
|
|
1133
|
-
|
|
1114
|
+
emptySegmentBase,
|
|
1115
|
+
runAndValidateUseItems,
|
|
1134
1116
|
};
|