@rangojs/router 0.0.0-experimental.debug-cache-fix → 0.0.0-experimental.df410dd5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -43
- 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 +269 -96
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/testing/vitest.js +48 -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 +2659 -883
- 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/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +57 -11
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +243 -21
- package/skills/caching/SKILL.md +118 -2
- package/skills/composability/SKILL.md +27 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +229 -20
- package/skills/host-router/SKILL.md +45 -20
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +46 -4
- package/skills/layout/SKILL.md +28 -7
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +273 -53
- package/skills/middleware/SKILL.md +49 -12
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +71 -6
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +242 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +66 -9
- package/skills/route/SKILL.md +88 -4
- package/skills/router-setup/SKILL.md +90 -5
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/testing/SKILL.md +776 -0
- package/skills/typesafety/SKILL.md +329 -27
- package/skills/use-cache/SKILL.md +34 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +117 -0
- package/src/__internal.ts +1 -1
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +86 -70
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/navigation-bridge.ts +101 -13
- package/src/browser/navigation-client.ts +125 -53
- package/src/browser/navigation-store.ts +75 -17
- package/src/browser/navigation-transaction.ts +10 -28
- package/src/browser/partial-update.ts +90 -30
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +156 -18
- package/src/browser/prefetch/queue.ts +92 -29
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +72 -8
- package/src/browser/react/NavigationProvider.tsx +83 -33
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +51 -7
- package/src/browser/react/index.ts +3 -0
- package/src/browser/react/location-state-shared.ts +175 -4
- package/src/browser/react/location-state.ts +39 -13
- package/src/browser/react/use-handle.ts +23 -64
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +20 -8
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +43 -10
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/response-adapter.ts +25 -0
- package/src/browser/rsc-router.tsx +87 -22
- package/src/browser/scroll-restoration.ts +29 -19
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +31 -36
- package/src/browser/types.ts +48 -5
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/index.ts +2 -0
- package/src/build/route-trie.ts +52 -25
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +266 -86
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-scope.ts +40 -56
- package/src/cache/cf/cf-cache-store.ts +54 -13
- package/src/cache/taint.ts +55 -0
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +94 -238
- package/src/context-var.ts +72 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +30 -1
- package/src/handle.ts +65 -12
- package/src/host/index.ts +2 -2
- package/src/host/router.ts +129 -57
- package/src/host/types.ts +31 -2
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +140 -20
- package/src/index.rsc.ts +12 -5
- package/src/index.ts +61 -11
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +21 -6
- package/src/loader.ts +3 -10
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +5 -4
- package/src/prerender.ts +141 -80
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/route-content-wrapper.tsx +6 -28
- package/src/route-definition/dsl-helpers.ts +411 -261
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +110 -34
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +9 -1
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +113 -1
- package/src/router/error-handling.ts +1 -1
- package/src/router/handler-context.ts +77 -38
- package/src/router/intercept-resolution.ts +13 -22
- package/src/router/lazy-includes.ts +8 -8
- package/src/router/loader-resolution.ts +174 -22
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +128 -192
- package/src/router/match-handlers.ts +63 -20
- package/src/router/match-middleware/cache-lookup.ts +70 -97
- package/src/router/match-middleware/cache-store.ts +3 -2
- package/src/router/match-middleware/segment-resolution.ts +53 -0
- package/src/router/match-result.ts +103 -4
- package/src/router/metrics.ts +1 -1
- package/src/router/middleware-types.ts +21 -34
- package/src/router/middleware.ts +101 -89
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +101 -17
- package/src/router/prerender-match.ts +110 -10
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +286 -0
- package/src/router/revalidation.ts +58 -2
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-interfaces.ts +77 -28
- package/src/router/router-options.ts +76 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +105 -13
- package/src/router/segment-resolution/helpers.ts +29 -24
- package/src/router/segment-resolution/revalidation.ts +236 -112
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry.ts +99 -0
- package/src/router/trie-matching.ts +18 -13
- package/src/router/types.ts +9 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +86 -22
- package/src/rsc/handler-context.ts +2 -2
- package/src/rsc/handler.ts +440 -381
- package/src/rsc/helpers.ts +91 -43
- package/src/rsc/index.ts +1 -1
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/origin-guard.ts +28 -10
- package/src/rsc/progressive-enhancement.ts +18 -2
- package/src/rsc/response-route-handler.ts +46 -53
- package/src/rsc/rsc-rendering.ts +41 -48
- package/src/rsc/runtime-warnings.ts +9 -10
- package/src/rsc/server-action.ts +25 -37
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +17 -3
- package/src/search-params.ts +4 -4
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +132 -116
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +190 -51
- package/src/server/cookie-store.ts +28 -4
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +195 -57
- package/src/ssr/index.tsx +8 -1
- package/src/static-handler.ts +19 -7
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +440 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +154 -0
- package/src/testing/e2e/index.ts +149 -0
- package/src/testing/e2e/matchers.ts +51 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +306 -0
- package/src/testing/e2e/server.ts +183 -0
- package/src/testing/flight-matchers.ts +104 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +309 -0
- package/src/testing/flight.entry.ts +39 -0
- package/src/testing/flight.ts +197 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +106 -0
- package/src/testing/internal/context.ts +304 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/render-route.tsx +565 -0
- package/src/testing/run-loader.ts +341 -0
- package/src/testing/run-middleware.ts +179 -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 +185 -0
- package/src/types/cache-types.ts +4 -4
- package/src/types/global-namespace.ts +39 -26
- package/src/types/handler-context.ts +103 -67
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +41 -15
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +12 -1
- package/src/types/segments.ts +36 -2
- package/src/urls/include-helper.ts +34 -67
- package/src/urls/index.ts +0 -3
- package/src/urls/path-helper-types.ts +50 -9
- package/src/urls/path-helper.ts +63 -63
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +26 -116
- package/src/urls/urls-function.ts +1 -5
- package/src/use-loader.tsx +487 -44
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +34 -37
- package/src/vite/discovery/discover-routers.ts +105 -51
- 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 +188 -93
- 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 +46 -4
- package/src/vite/discovery/virtual-module-codegen.ts +13 -23
- package/src/vite/index.ts +6 -0
- package/src/vite/plugin-types.ts +126 -4
- package/src/vite/plugins/cjs-to-esm.ts +8 -7
- package/src/vite/plugins/client-ref-dedup.ts +16 -0
- package/src/vite/plugins/client-ref-hashing.ts +28 -5
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/plugins/expose-action-id.ts +54 -30
- package/src/vite/plugins/expose-id-utils.ts +24 -8
- package/src/vite/plugins/expose-ids/export-analysis.ts +100 -20
- package/src/vite/plugins/expose-ids/handler-transform.ts +12 -35
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -5
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +544 -317
- package/src/vite/plugins/performance-tracks.ts +92 -0
- package/src/vite/plugins/refresh-cmd.ts +88 -26
- package/src/vite/plugins/use-cache-transform.ts +65 -50
- package/src/vite/plugins/version-injector.ts +39 -23
- package/src/vite/plugins/version-plugin.ts +59 -2
- package/src/vite/plugins/virtual-entries.ts +2 -2
- package/src/vite/rango.ts +130 -26
- package/src/vite/router-discovery.ts +920 -129
- package/src/vite/utils/ast-handler-extract.ts +15 -15
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +4 -2
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +21 -5
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +38 -5
- package/src/vite/utils/shared-utils.ts +109 -27
- package/src/browser/action-response-classifier.ts +0 -99
|
@@ -11,12 +11,16 @@ 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,
|
|
16
20
|
} from "../server/context";
|
|
17
21
|
import { invariant } from "../errors";
|
|
18
22
|
import { isCachedFunction } from "../cache/taint.js";
|
|
19
|
-
import {
|
|
23
|
+
import { RangoContext } from "../server/context";
|
|
20
24
|
import { isStaticHandler } from "../static-handler.js";
|
|
21
25
|
import RootLayout from "../server/root-layout";
|
|
22
26
|
import type {
|
|
@@ -37,6 +41,8 @@ import type {
|
|
|
37
41
|
UseItems,
|
|
38
42
|
} from "../route-types.js";
|
|
39
43
|
import type { RouteHelpers } from "./helpers-types.js";
|
|
44
|
+
import { resolveHandlerUse, mergeHandlerUse } from "./resolve-handler-use.js";
|
|
45
|
+
import { ALL_USE_ITEM_TYPES } from "./use-item-types.js";
|
|
40
46
|
|
|
41
47
|
/**
|
|
42
48
|
* Check if an item contains routes (directly or inside nested structures like cache).
|
|
@@ -54,19 +60,111 @@ const hasRoutesInItem = (item: AllUseItems): boolean => {
|
|
|
54
60
|
if (item.type === "layout" && item.uses) {
|
|
55
61
|
return item.uses.some((child) => hasRoutesInItem(child));
|
|
56
62
|
}
|
|
63
|
+
if (item.type === "middleware" && item.uses) {
|
|
64
|
+
return item.uses.some((child) => hasRoutesInItem(child));
|
|
65
|
+
}
|
|
57
66
|
return false;
|
|
58
67
|
};
|
|
59
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Fresh empty collections shared by every from-scratch segment entry. Returns
|
|
71
|
+
* new arrays/objects per call so no two entries share mutable references.
|
|
72
|
+
* mountPath is intentionally NOT included here — each call site adds it from
|
|
73
|
+
* getUrlPrefix() where applicable: the route() and transition() helpers add
|
|
74
|
+
* none, while path() (which also builds a `type: "route"` entry) and the
|
|
75
|
+
* structural helpers (layout/cache/middleware/parallel) do.
|
|
76
|
+
*/
|
|
77
|
+
const emptySegmentBase = (): EntryPropDatas &
|
|
78
|
+
EntryPropSegments & { loading: undefined } => ({
|
|
79
|
+
loading: undefined,
|
|
80
|
+
middleware: [],
|
|
81
|
+
revalidate: [],
|
|
82
|
+
errorBoundary: [],
|
|
83
|
+
notFoundBoundary: [],
|
|
84
|
+
layout: [],
|
|
85
|
+
parallel: {},
|
|
86
|
+
intercept: [],
|
|
87
|
+
loader: [],
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Run a children/use callback as a nested scope, flatten the result, and assert
|
|
92
|
+
* every item is a valid use item. `kind` preserves the existing error wording
|
|
93
|
+
* ("use()" vs "children" callback).
|
|
94
|
+
*/
|
|
95
|
+
function runAndValidateUseItems(
|
|
96
|
+
store: ReturnType<typeof getContext>,
|
|
97
|
+
namespace: string,
|
|
98
|
+
entry: EntryData,
|
|
99
|
+
cb: () => any,
|
|
100
|
+
label: string,
|
|
101
|
+
kind: "use" | "children",
|
|
102
|
+
): AllUseItems[] {
|
|
103
|
+
const result = store.run(namespace, entry, cb)?.flat(3);
|
|
104
|
+
return validateUseItems(result, namespace, label, kind);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Assert an already-invoked, flattened callback result is a use-item array. */
|
|
108
|
+
function validateUseItems(
|
|
109
|
+
result: any,
|
|
110
|
+
namespace: string,
|
|
111
|
+
label: string,
|
|
112
|
+
kind: "use" | "children",
|
|
113
|
+
): AllUseItems[] {
|
|
114
|
+
invariant(
|
|
115
|
+
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
116
|
+
`${label}() ${kind === "use" ? "use()" : "children"} callback must return an array of use items [${namespace}]`,
|
|
117
|
+
);
|
|
118
|
+
return result as AllUseItems[];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** True when a children/use result contains no routes (directly or nested). */
|
|
122
|
+
const isOrphan = (result: AllUseItems[]): boolean =>
|
|
123
|
+
!result.some((item) => item != null && hasRoutesInItem(item));
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Register a routeless structural entry as an orphan sibling: clear its parent
|
|
127
|
+
* pointer so it leaves the middleware/parent-pointer chain (LOAD-BEARING — see
|
|
128
|
+
* docs/tree-structure.md) and push it onto the parent's layout[] so it renders
|
|
129
|
+
* as a wrapper. Used by cache()/middleware()/transition(); layout() runs extra
|
|
130
|
+
* validation and registers inline.
|
|
131
|
+
*/
|
|
132
|
+
const attachOrphanSibling = (
|
|
133
|
+
parent: EntryData | null,
|
|
134
|
+
entry: EntryData,
|
|
135
|
+
): void => {
|
|
136
|
+
entry.parent = null;
|
|
137
|
+
if (parent && "layout" in parent) parent.layout.push(entry);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Run `fn` with `ctx.parent` temporarily redirected to `temp` — a satellite
|
|
142
|
+
* entry that captures the attachments declared by a use() callback — restoring
|
|
143
|
+
* the original parent afterward, including on throw. loader()/intercept() each
|
|
144
|
+
* build their own tempParent shape (intercept keeps a loading get/set accessor
|
|
145
|
+
* and a captured-layouts array); this only centralizes the save/restore.
|
|
146
|
+
*/
|
|
147
|
+
function withParent<T>(ctx: HelperContext, temp: EntryData, fn: () => T): T {
|
|
148
|
+
const original = ctx.parent;
|
|
149
|
+
ctx.parent = temp;
|
|
150
|
+
try {
|
|
151
|
+
return fn();
|
|
152
|
+
} finally {
|
|
153
|
+
ctx.parent = original;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
60
157
|
const revalidate: RouteHelpers<any, any>["revalidate"] = (fn) => {
|
|
61
|
-
const ctx =
|
|
62
|
-
|
|
158
|
+
const { store, ctx } = requireDslContext(
|
|
159
|
+
"revalidate() must be called inside urls()",
|
|
160
|
+
);
|
|
63
161
|
|
|
64
162
|
// Attach to last entry in stack
|
|
65
163
|
const parent = ctx.parent;
|
|
66
164
|
if (!parent || !("revalidate" in parent)) {
|
|
67
165
|
invariant(false, "No parent entry available for revalidate()");
|
|
68
166
|
}
|
|
69
|
-
const name = `$${
|
|
167
|
+
const name = `$${store.getNextIndex("revalidate")}`;
|
|
70
168
|
parent.revalidate.push(fn);
|
|
71
169
|
return { name, type: "revalidate" } as RevalidateItem;
|
|
72
170
|
};
|
|
@@ -104,15 +202,16 @@ const revalidate: RouteHelpers<any, any>["revalidate"] = (fn) => {
|
|
|
104
202
|
* ```
|
|
105
203
|
*/
|
|
106
204
|
const errorBoundary: RouteHelpers<any, any>["errorBoundary"] = (fallback) => {
|
|
107
|
-
const ctx =
|
|
108
|
-
|
|
205
|
+
const { store, ctx } = requireDslContext(
|
|
206
|
+
"errorBoundary() must be called inside urls()",
|
|
207
|
+
);
|
|
109
208
|
|
|
110
209
|
// Attach to parent entry in stack
|
|
111
210
|
const parent = ctx.parent;
|
|
112
211
|
if (!parent || !("errorBoundary" in parent)) {
|
|
113
212
|
invariant(false, "No parent entry available for errorBoundary()");
|
|
114
213
|
}
|
|
115
|
-
const name = `$${
|
|
214
|
+
const name = `$${store.getNextIndex("errorBoundary")}`;
|
|
116
215
|
parent.errorBoundary.push(fallback);
|
|
117
216
|
return { name, type: "errorBoundary" } as ErrorBoundaryItem;
|
|
118
217
|
};
|
|
@@ -151,15 +250,16 @@ const errorBoundary: RouteHelpers<any, any>["errorBoundary"] = (fallback) => {
|
|
|
151
250
|
const notFoundBoundary: RouteHelpers<any, any>["notFoundBoundary"] = (
|
|
152
251
|
fallback,
|
|
153
252
|
) => {
|
|
154
|
-
const ctx =
|
|
155
|
-
|
|
253
|
+
const { store, ctx } = requireDslContext(
|
|
254
|
+
"notFoundBoundary() must be called inside urls()",
|
|
255
|
+
);
|
|
156
256
|
|
|
157
257
|
// Attach to parent entry in stack
|
|
158
258
|
const parent = ctx.parent;
|
|
159
259
|
if (!parent || !("notFoundBoundary" in parent)) {
|
|
160
260
|
invariant(false, "No parent entry available for notFoundBoundary()");
|
|
161
261
|
}
|
|
162
|
-
const name = `$${
|
|
262
|
+
const name = `$${store.getNextIndex("notFoundBoundary")}`;
|
|
163
263
|
parent.notFoundBoundary.push(fallback);
|
|
164
264
|
return { name, type: "notFoundBoundary" } as NotFoundBoundaryItem;
|
|
165
265
|
};
|
|
@@ -173,8 +273,9 @@ const notFoundBoundary: RouteHelpers<any, any>["notFoundBoundary"] = (
|
|
|
173
273
|
* for the intercept to activate.
|
|
174
274
|
*/
|
|
175
275
|
const when: RouteHelpers<any, any>["when"] = (fn) => {
|
|
176
|
-
const ctx =
|
|
177
|
-
|
|
276
|
+
const { store, ctx } = requireDslContext(
|
|
277
|
+
"when() must be called inside intercept()",
|
|
278
|
+
);
|
|
178
279
|
|
|
179
280
|
// The when() function needs to be captured by the intercept's tempParent
|
|
180
281
|
// which should have a `when` array. If not present, we're not inside intercept()
|
|
@@ -186,7 +287,7 @@ const when: RouteHelpers<any, any>["when"] = (fn) => {
|
|
|
186
287
|
);
|
|
187
288
|
}
|
|
188
289
|
|
|
189
|
-
const name = `$${
|
|
290
|
+
const name = `$${store.getNextIndex("when")}`;
|
|
190
291
|
parent.when.push(fn);
|
|
191
292
|
return { name, type: "when" } as WhenItem;
|
|
192
293
|
};
|
|
@@ -213,9 +314,9 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
213
314
|
| (() => UseItems<AllUseItems>),
|
|
214
315
|
maybeChildren?: () => UseItems<AllUseItems>,
|
|
215
316
|
) => {
|
|
216
|
-
const store =
|
|
217
|
-
|
|
218
|
-
|
|
317
|
+
const { store, ctx } = requireDslContext(
|
|
318
|
+
"cache() must be called inside urls()",
|
|
319
|
+
);
|
|
219
320
|
|
|
220
321
|
// Handle overloaded signature
|
|
221
322
|
let options: PartialCacheOptions | false;
|
|
@@ -228,7 +329,7 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
228
329
|
} else if (typeof optionsOrChildren === "string") {
|
|
229
330
|
// cache('profileName') or cache('profileName', () => [...])
|
|
230
331
|
// Resolve from context-scoped profiles (set per-router via HelperContext).
|
|
231
|
-
const ctxStore =
|
|
332
|
+
const ctxStore = RangoContext.getStore();
|
|
232
333
|
const profile = ctxStore?.cacheProfiles?.[optionsOrChildren];
|
|
233
334
|
invariant(
|
|
234
335
|
profile,
|
|
@@ -267,26 +368,18 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
267
368
|
// Create orphan cache entry (like orphan layout)
|
|
268
369
|
// Subsequent siblings in the same array will attach to this entry
|
|
269
370
|
const namespace = `${ctx.namespace}.${cacheIndex}`;
|
|
270
|
-
const
|
|
371
|
+
const urlPrefix = getUrlPrefix();
|
|
271
372
|
|
|
272
373
|
const entry = {
|
|
374
|
+
...emptySegmentBase(),
|
|
273
375
|
id: namespace,
|
|
274
376
|
shortCode: store.getShortCode("cache"),
|
|
275
377
|
type: "cache",
|
|
276
378
|
parent: parent, // link to current parent for hierarchy
|
|
277
379
|
cache: cacheConfig,
|
|
278
380
|
handler: RootLayout,
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
revalidate: [],
|
|
282
|
-
errorBoundary: [],
|
|
283
|
-
notFoundBoundary: [],
|
|
284
|
-
layout: [],
|
|
285
|
-
parallel: {},
|
|
286
|
-
intercept: [],
|
|
287
|
-
loader: [],
|
|
288
|
-
...(cacheUrlPrefix ? { mountPath: cacheUrlPrefix } : {}),
|
|
289
|
-
} as EntryData;
|
|
381
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
382
|
+
} satisfies EntryData;
|
|
290
383
|
|
|
291
384
|
// Attach to parent's layout array (cache entries are structural like layouts)
|
|
292
385
|
if (parent && "layout" in parent) {
|
|
@@ -300,13 +393,23 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
300
393
|
return { name: namespace, type: "cache" } as CacheItem;
|
|
301
394
|
}
|
|
302
395
|
|
|
396
|
+
// Inside a loader() use() callback, only the direct form — cache()/cache(opts)/
|
|
397
|
+
// cache("profile") — writes cache config to the loader entry. The wrapper
|
|
398
|
+
// form creates a structural cache boundary with its own children scope, which
|
|
399
|
+
// has no effect on the loader and would silently no-op.
|
|
400
|
+
invariant(
|
|
401
|
+
!(ctx.parent && (ctx.parent as any).type === "loader"),
|
|
402
|
+
"cache() wrapper form is not valid inside loader() use(). Use cache({...}) without children to configure the loader's cache.",
|
|
403
|
+
);
|
|
404
|
+
|
|
303
405
|
// With children: create a cache entry (like layout with caching semantics)
|
|
304
406
|
const namespace = `${ctx.namespace}.${cacheIndex}`;
|
|
305
407
|
const cacheShortCode = store.getShortCode("cache");
|
|
306
408
|
|
|
307
|
-
const
|
|
409
|
+
const urlPrefix = getUrlPrefix();
|
|
308
410
|
|
|
309
411
|
const entry = {
|
|
412
|
+
...emptySegmentBase(),
|
|
310
413
|
id: namespace,
|
|
311
414
|
shortCode: cacheShortCode,
|
|
312
415
|
type: "cache",
|
|
@@ -314,48 +417,57 @@ const cache: RouteHelpers<any, any>["cache"] = (
|
|
|
314
417
|
cache: cacheConfig,
|
|
315
418
|
// Cache entries render like layouts (with Outlet as default handler)
|
|
316
419
|
handler: RootLayout, // RootLayout just renders <Outlet />
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
revalidate: [],
|
|
320
|
-
errorBoundary: [],
|
|
321
|
-
notFoundBoundary: [],
|
|
322
|
-
layout: [],
|
|
323
|
-
parallel: {},
|
|
324
|
-
intercept: [],
|
|
325
|
-
loader: [],
|
|
326
|
-
...(cacheUrlPrefix2 ? { mountPath: cacheUrlPrefix2 } : {}),
|
|
327
|
-
} as EntryData;
|
|
420
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
421
|
+
} satisfies EntryData;
|
|
328
422
|
|
|
329
423
|
// Run children with cache entry as parent
|
|
330
|
-
const result =
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
424
|
+
const result = runAndValidateUseItems(
|
|
425
|
+
store,
|
|
426
|
+
namespace,
|
|
427
|
+
entry,
|
|
428
|
+
children,
|
|
429
|
+
"cache",
|
|
430
|
+
"children",
|
|
335
431
|
);
|
|
336
432
|
|
|
337
|
-
//
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
Array.isArray(result) &&
|
|
341
|
-
result.some((item) => hasRoutesInItem(item));
|
|
342
|
-
|
|
343
|
-
if (!hasRoutes) {
|
|
344
|
-
const parent = ctx.parent;
|
|
345
|
-
if (parent && "layout" in parent) {
|
|
346
|
-
// Attach to parent's layout array (cache entries are structural like layouts)
|
|
347
|
-
entry.parent = null;
|
|
348
|
-
parent.layout.push(entry);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
433
|
+
// Cache entries are structural like layouts: with no routes inside, register
|
|
434
|
+
// as an orphan sibling.
|
|
435
|
+
if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
|
|
351
436
|
|
|
352
437
|
return { name: namespace, type: "cache", uses: result } as CacheItem;
|
|
353
438
|
};
|
|
354
439
|
|
|
355
|
-
const middleware: RouteHelpers<any, any>["middleware"] = (...
|
|
440
|
+
const middleware: RouteHelpers<any, any>["middleware"] = (...args: any[]) => {
|
|
441
|
+
// Four call forms:
|
|
442
|
+
// middleware(fn) — single fn, sibling
|
|
443
|
+
// middleware(fn, () => [...]) — single fn, wrapping
|
|
444
|
+
// middleware([fn1, fn2]) — array, sibling
|
|
445
|
+
// middleware([fn1, fn2], () => [...]) — array, wrapping
|
|
446
|
+
const isArray = Array.isArray(args[0]);
|
|
447
|
+
|
|
448
|
+
// Reject the removed variadic form before executing anything.
|
|
449
|
+
// middleware(fn1, fn2, fn3) — 3+ args, always wrong.
|
|
450
|
+
// middleware(fn1, fn2) where fn2 is a middleware fn (length >= 1), not a
|
|
451
|
+
// children callback (length === 0) — legacy two-fn form, reject early.
|
|
452
|
+
if (
|
|
453
|
+
args.length > 2 ||
|
|
454
|
+
(!isArray &&
|
|
455
|
+
args.length === 2 &&
|
|
456
|
+
typeof args[1] === "function" &&
|
|
457
|
+
args[1].length > 0)
|
|
458
|
+
) {
|
|
459
|
+
throw new Error(
|
|
460
|
+
"middleware() no longer accepts variadic arguments. " +
|
|
461
|
+
"Use middleware([fn1, fn2, ...]) instead of middleware(fn1, fn2, ...).",
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
const fns: MiddlewareFn<any>[] = isArray ? args[0] : [args[0]];
|
|
466
|
+
const children: (() => any[]) | undefined =
|
|
467
|
+
typeof args[1] === "function" ? args[1] : undefined;
|
|
468
|
+
|
|
356
469
|
// Prevent "use cache" functions from being used as middleware.
|
|
357
|
-
|
|
358
|
-
for (const f of fn) {
|
|
470
|
+
for (const f of fns) {
|
|
359
471
|
if (isCachedFunction(f)) {
|
|
360
472
|
throw new Error(
|
|
361
473
|
`A "use cache" function cannot be used as middleware. ` +
|
|
@@ -366,23 +478,68 @@ const middleware: RouteHelpers<any, any>["middleware"] = (...fn) => {
|
|
|
366
478
|
}
|
|
367
479
|
}
|
|
368
480
|
|
|
369
|
-
const ctx =
|
|
370
|
-
|
|
481
|
+
const { store, ctx } = requireDslContext(
|
|
482
|
+
"middleware() must be called inside urls()",
|
|
483
|
+
);
|
|
371
484
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
485
|
+
if (!children) {
|
|
486
|
+
// Sibling mode: attach to parent entry
|
|
487
|
+
const parent = ctx.parent;
|
|
488
|
+
if (!parent || !("middleware" in parent)) {
|
|
489
|
+
invariant(false, "No parent entry available for middleware()");
|
|
490
|
+
}
|
|
491
|
+
const name = `$${store.getNextIndex("middleware")}`;
|
|
492
|
+
parent.middleware.push(...fns);
|
|
493
|
+
return { name, type: "middleware" } as MiddlewareItem;
|
|
376
494
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
495
|
+
|
|
496
|
+
// Wrapping mode: create a transparent layout that carries the middleware
|
|
497
|
+
const mwIndex = store.getNextIndex("middleware");
|
|
498
|
+
const namespace = `${ctx.namespace}.${mwIndex}`;
|
|
499
|
+
|
|
500
|
+
const urlPrefix = getUrlPrefix();
|
|
501
|
+
const entry = {
|
|
502
|
+
...emptySegmentBase(),
|
|
503
|
+
id: namespace,
|
|
504
|
+
shortCode: store.getShortCode("layout"),
|
|
505
|
+
type: "layout",
|
|
506
|
+
parent: ctx.parent,
|
|
507
|
+
handler: RootLayout,
|
|
508
|
+
middleware: [...fns],
|
|
509
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
510
|
+
} satisfies EntryData;
|
|
511
|
+
|
|
512
|
+
// Run children callback. If the second arg was actually a middleware fn
|
|
513
|
+
// (old variadic form: middleware(mw1, mw2)), this will return a non-array
|
|
514
|
+
// and the invariant below gives a clear migration error.
|
|
515
|
+
const rawResult = store.run(namespace, entry, children);
|
|
516
|
+
|
|
517
|
+
invariant(
|
|
518
|
+
Array.isArray(rawResult),
|
|
519
|
+
"middleware(fn, children) expects the second argument to return an array of use items. " +
|
|
520
|
+
"To pass multiple middleware, use middleware([fn1, fn2]).",
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
const result = validateUseItems(
|
|
524
|
+
rawResult.flat(3),
|
|
525
|
+
namespace,
|
|
526
|
+
"middleware",
|
|
527
|
+
"children",
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
|
|
531
|
+
|
|
532
|
+
return {
|
|
533
|
+
name: namespace,
|
|
534
|
+
type: "middleware",
|
|
535
|
+
uses: result,
|
|
536
|
+
} as MiddlewareItem;
|
|
380
537
|
};
|
|
381
538
|
|
|
382
539
|
const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
383
|
-
const store =
|
|
384
|
-
|
|
385
|
-
|
|
540
|
+
const { store, ctx } = requireDslContext(
|
|
541
|
+
"parallel() must be called inside urls()",
|
|
542
|
+
);
|
|
386
543
|
|
|
387
544
|
if (!ctx.parent || !ctx.parent?.parallel) {
|
|
388
545
|
invariant(false, "No parent entry available for parallel()");
|
|
@@ -397,13 +554,25 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
397
554
|
|
|
398
555
|
const namespace = `${ctx.namespace}.$${store.getNextIndex("parallel")}`;
|
|
399
556
|
|
|
400
|
-
// Unwrap
|
|
557
|
+
// Unwrap slot values. A slot value can be:
|
|
558
|
+
// - a Handler / ReactNode (legacy form)
|
|
559
|
+
// - a Static() definition (build-time only)
|
|
560
|
+
// - a slot descriptor `{ handler, use? }` for slot-local overrides
|
|
561
|
+
// The descriptor's `use` runs after the broadcast `use` for that slot,
|
|
562
|
+
// so single-assignment items like `loading()` placed there win without
|
|
563
|
+
// affecting siblings.
|
|
401
564
|
const unwrappedSlots: Record<string, any> = {};
|
|
565
|
+
const slotLocalUses: Record<string, (() => any[]) | undefined> = {};
|
|
402
566
|
let hasStaticSlot = false;
|
|
403
567
|
const staticSlotIds: Record<string, string> = {};
|
|
404
|
-
for (const [slotName,
|
|
568
|
+
for (const [slotName, rawSlot] of Object.entries(
|
|
405
569
|
slots as Record<string, any>,
|
|
406
570
|
)) {
|
|
571
|
+
let slotHandler: any = rawSlot;
|
|
572
|
+
if (isSlotDescriptor(rawSlot)) {
|
|
573
|
+
slotHandler = rawSlot.handler;
|
|
574
|
+
slotLocalUses[slotName] = rawSlot.use;
|
|
575
|
+
}
|
|
407
576
|
if (isStaticHandler(slotHandler)) {
|
|
408
577
|
hasStaticSlot = true;
|
|
409
578
|
unwrappedSlots[slotName] = slotHandler.handler;
|
|
@@ -422,20 +591,12 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
422
591
|
// Create full EntryData for parallel with its own loaders/revalidate/loading
|
|
423
592
|
const parallelUrlPrefix = getUrlPrefix();
|
|
424
593
|
const entry = {
|
|
594
|
+
...emptySegmentBase(),
|
|
425
595
|
id: namespace,
|
|
426
596
|
shortCode: store.getShortCode("parallel"),
|
|
427
597
|
type: "parallel",
|
|
428
598
|
parent: null, // Parallels don't participate in parent chain traversal
|
|
429
599
|
handler: unwrappedSlots,
|
|
430
|
-
loading: undefined, // Allow loading() to attach loading state
|
|
431
|
-
middleware: [],
|
|
432
|
-
revalidate: [],
|
|
433
|
-
errorBoundary: [],
|
|
434
|
-
notFoundBoundary: [],
|
|
435
|
-
layout: [],
|
|
436
|
-
parallel: {},
|
|
437
|
-
intercept: [],
|
|
438
|
-
loader: [],
|
|
439
600
|
...(parallelUrlPrefix ? { mountPath: parallelUrlPrefix } : {}),
|
|
440
601
|
...(hasStaticSlot
|
|
441
602
|
? {
|
|
@@ -447,15 +608,6 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
447
608
|
: {}),
|
|
448
609
|
} satisfies EntryData;
|
|
449
610
|
|
|
450
|
-
// Run use callback if provided to collect loaders, revalidate, loading
|
|
451
|
-
if (use && typeof use === "function") {
|
|
452
|
-
const result = store.run(namespace, entry, use)?.flat(3);
|
|
453
|
-
invariant(
|
|
454
|
-
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
455
|
-
`parallel() use() callback must return an array of use items [${namespace}]`,
|
|
456
|
-
);
|
|
457
|
-
}
|
|
458
|
-
|
|
459
611
|
for (const slotName of slotNames) {
|
|
460
612
|
const slotEntry = {
|
|
461
613
|
...entry,
|
|
@@ -478,11 +630,64 @@ const parallel: RouteHelpers<any, any>["parallel"] = (slots, use) => {
|
|
|
478
630
|
staticHandlerIds: undefined,
|
|
479
631
|
}),
|
|
480
632
|
} satisfies EntryData;
|
|
633
|
+
|
|
634
|
+
// Per-slot merge order (narrowest-scope-wins for single-assignment items
|
|
635
|
+
// like loading()):
|
|
636
|
+
// 1. handler.use — defaults baked into the handler
|
|
637
|
+
// 2. shared `use` — broadcast at the parallel() call site
|
|
638
|
+
// 3. slot-local `use` — per-slot override via `{ handler, use }` descriptor
|
|
639
|
+
// Items that accumulate (loader, middleware, revalidate, …) compose
|
|
640
|
+
// across all three layers regardless of order.
|
|
641
|
+
const rawSlot = (slots as Record<string, any>)[slotName];
|
|
642
|
+
const slotHandlerForUse = isSlotDescriptor(rawSlot)
|
|
643
|
+
? rawSlot.handler
|
|
644
|
+
: rawSlot;
|
|
645
|
+
const slotHandlerUse = resolveHandlerUse(slotHandlerForUse);
|
|
646
|
+
const slotLocalUse = slotLocalUses[slotName];
|
|
647
|
+
const explicitUse = combineExplicitUses(use, slotLocalUse);
|
|
648
|
+
const slotMergedUse = mergeHandlerUse(
|
|
649
|
+
slotHandlerUse,
|
|
650
|
+
explicitUse,
|
|
651
|
+
"parallel",
|
|
652
|
+
);
|
|
653
|
+
if (slotMergedUse) {
|
|
654
|
+
runAndValidateUseItems(
|
|
655
|
+
store,
|
|
656
|
+
namespace,
|
|
657
|
+
slotEntry,
|
|
658
|
+
slotMergedUse,
|
|
659
|
+
"parallel",
|
|
660
|
+
"use",
|
|
661
|
+
);
|
|
662
|
+
}
|
|
663
|
+
|
|
481
664
|
ctx.parent.parallel[slotName] = slotEntry;
|
|
482
665
|
}
|
|
483
666
|
return { name: namespace, type: "parallel" } as ParallelItem;
|
|
484
667
|
};
|
|
485
668
|
|
|
669
|
+
function isSlotDescriptor(
|
|
670
|
+
value: unknown,
|
|
671
|
+
): value is { handler: unknown; use?: () => any[] } {
|
|
672
|
+
return (
|
|
673
|
+
typeof value === "object" &&
|
|
674
|
+
value !== null &&
|
|
675
|
+
!("__brand" in value) &&
|
|
676
|
+
"handler" in value &&
|
|
677
|
+
typeof (value as any).handler !== "undefined"
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
function combineExplicitUses(
|
|
682
|
+
sharedUse: (() => any[]) | undefined,
|
|
683
|
+
slotLocalUse: (() => any[]) | undefined,
|
|
684
|
+
): (() => any[]) | undefined {
|
|
685
|
+
if (!sharedUse && !slotLocalUse) return undefined;
|
|
686
|
+
if (!slotLocalUse) return sharedUse;
|
|
687
|
+
if (!sharedUse) return slotLocalUse;
|
|
688
|
+
return () => [...sharedUse(), ...slotLocalUse()];
|
|
689
|
+
}
|
|
690
|
+
|
|
486
691
|
/**
|
|
487
692
|
* Intercept helper - defines an intercepting route for soft navigation
|
|
488
693
|
*/
|
|
@@ -492,9 +697,9 @@ const intercept = (
|
|
|
492
697
|
handler: any,
|
|
493
698
|
use?: () => any[],
|
|
494
699
|
) => {
|
|
495
|
-
const store =
|
|
496
|
-
|
|
497
|
-
|
|
700
|
+
const { store, ctx } = requireDslContext(
|
|
701
|
+
"intercept() must be called inside urls()",
|
|
702
|
+
);
|
|
498
703
|
|
|
499
704
|
if (!ctx.parent || !ctx.parent?.intercept) {
|
|
500
705
|
invariant(false, "No parent entry available for intercept()");
|
|
@@ -527,17 +732,19 @@ const intercept = (
|
|
|
527
732
|
when: [], // Selector conditions for conditional interception
|
|
528
733
|
};
|
|
529
734
|
|
|
530
|
-
//
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
// so that middleware, loader, revalidate attach to the intercept entry
|
|
534
|
-
const originalParent = ctx.parent;
|
|
735
|
+
// Merge handler.use defaults with explicit use
|
|
736
|
+
const handlerUseFn = resolveHandlerUse(handler);
|
|
737
|
+
const mergedUse = mergeHandlerUse(handlerUseFn, use, "intercept");
|
|
535
738
|
|
|
536
|
-
|
|
739
|
+
// Run merged use callback to collect loaders, revalidate, middleware, etc.
|
|
740
|
+
if (mergedUse) {
|
|
741
|
+
// Capture layout() calls into a temporary array
|
|
537
742
|
const capturedLayouts: EntryData[] = [];
|
|
538
743
|
|
|
744
|
+
// Temporary parent so middleware/loader/revalidate/when attach to the
|
|
745
|
+
// intercept entry; the loading get/set accessor mirrors writes onto `entry`.
|
|
539
746
|
const tempParent = {
|
|
540
|
-
...
|
|
747
|
+
...ctx.parent,
|
|
541
748
|
middleware: entry.middleware,
|
|
542
749
|
revalidate: entry.revalidate,
|
|
543
750
|
errorBoundary: entry.errorBoundary,
|
|
@@ -545,7 +752,6 @@ const intercept = (
|
|
|
545
752
|
loader: entry.loader,
|
|
546
753
|
layout: capturedLayouts, // Capture layout() calls
|
|
547
754
|
when: entry.when, // Capture when() conditions
|
|
548
|
-
// Use getter/setter to capture loading on the entry
|
|
549
755
|
get loading() {
|
|
550
756
|
return entry.loading;
|
|
551
757
|
},
|
|
@@ -553,12 +759,10 @@ const intercept = (
|
|
|
553
759
|
entry.loading = value;
|
|
554
760
|
},
|
|
555
761
|
};
|
|
556
|
-
ctx.parent = tempParent as EntryData;
|
|
557
|
-
|
|
558
|
-
const result = use()?.flat(3);
|
|
559
762
|
|
|
560
|
-
|
|
561
|
-
|
|
763
|
+
const result = withParent(ctx, tempParent as EntryData, () =>
|
|
764
|
+
mergedUse()?.flat(3),
|
|
765
|
+
);
|
|
562
766
|
|
|
563
767
|
// Extract layout from captured layouts (use first one if multiple)
|
|
564
768
|
// Layout inside intercept should always be ReactNode or Handler, not Record slots
|
|
@@ -568,10 +772,7 @@ const intercept = (
|
|
|
568
772
|
| Handler<any, any, any>;
|
|
569
773
|
}
|
|
570
774
|
|
|
571
|
-
|
|
572
|
-
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
573
|
-
`intercept() use() callback must return an array of use items [${namespace}]`,
|
|
574
|
-
);
|
|
775
|
+
validateUseItems(result, namespace, "intercept", "use");
|
|
575
776
|
}
|
|
576
777
|
|
|
577
778
|
ctx.parent.intercept.push(entry);
|
|
@@ -581,10 +782,10 @@ const intercept = (
|
|
|
581
782
|
/**
|
|
582
783
|
* Loader helper - attaches a loader to the current entry
|
|
583
784
|
*/
|
|
584
|
-
const
|
|
585
|
-
const store =
|
|
586
|
-
|
|
587
|
-
|
|
785
|
+
const loader: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
786
|
+
const { store, ctx } = requireDslContext(
|
|
787
|
+
"loader() must be called inside urls()",
|
|
788
|
+
);
|
|
588
789
|
|
|
589
790
|
// Attach to last entry in stack
|
|
590
791
|
if (!ctx.parent || !ctx.parent?.loader) {
|
|
@@ -599,25 +800,28 @@ const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
|
599
800
|
revalidate: [] as ShouldRevalidateFn<any, any>[],
|
|
600
801
|
};
|
|
601
802
|
|
|
602
|
-
//
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
803
|
+
// Merge handler.use defaults (attached to the loader definition) with explicit use
|
|
804
|
+
const handlerUseFn = resolveHandlerUse(loaderDef);
|
|
805
|
+
const mergedUse = mergeHandlerUse(handlerUseFn, use, "loader");
|
|
806
|
+
|
|
807
|
+
// If any use callback is in effect, run it to collect revalidation rules and cache config
|
|
808
|
+
if (mergedUse) {
|
|
606
809
|
// Create a temporary "parent" with type "loader" so cache() can detect it.
|
|
607
810
|
// Save existing .cache to distinguish inherited config from newly set config.
|
|
608
|
-
const parentCache = (
|
|
811
|
+
const parentCache = (ctx.parent as any).cache;
|
|
609
812
|
const tempParent = {
|
|
610
|
-
...
|
|
813
|
+
...ctx.parent,
|
|
611
814
|
type: "loader",
|
|
612
815
|
revalidate: loaderEntry.revalidate,
|
|
613
816
|
};
|
|
614
|
-
ctx.parent = tempParent as EntryData;
|
|
615
817
|
|
|
616
|
-
const result =
|
|
818
|
+
const result = withParent(ctx, tempParent as EntryData, () =>
|
|
819
|
+
mergedUse()?.flat(3),
|
|
820
|
+
);
|
|
617
821
|
|
|
618
822
|
// Copy cache config only if cache() was called during the use() callback.
|
|
619
|
-
// The spread
|
|
620
|
-
//
|
|
823
|
+
// The spread may carry an inherited .cache from a parent cache() boundary —
|
|
824
|
+
// only copy if it was newly set.
|
|
621
825
|
if (
|
|
622
826
|
(tempParent as any).cache &&
|
|
623
827
|
(tempParent as any).cache !== parentCache
|
|
@@ -625,13 +829,7 @@ const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
|
625
829
|
(loaderEntry as any).cache = (tempParent as any).cache;
|
|
626
830
|
}
|
|
627
831
|
|
|
628
|
-
|
|
629
|
-
ctx.parent = originalParent;
|
|
630
|
-
|
|
631
|
-
invariant(
|
|
632
|
-
Array.isArray(result) && result.every((item) => isValidUseItem(item)),
|
|
633
|
-
`loader() use() callback must return an array of use items [${name}]`,
|
|
634
|
-
);
|
|
832
|
+
validateUseItems(result, name, "loader", "use");
|
|
635
833
|
}
|
|
636
834
|
|
|
637
835
|
ctx.parent.loader.push(loaderEntry);
|
|
@@ -642,21 +840,25 @@ const loaderFn: RouteHelpers<any, any>["loader"] = (loaderDef, use) => {
|
|
|
642
840
|
* Loading helper - attaches a loading component to the current entry
|
|
643
841
|
* Loading components are static (no context) and shown during navigation
|
|
644
842
|
*/
|
|
645
|
-
const
|
|
646
|
-
const store =
|
|
647
|
-
|
|
648
|
-
|
|
843
|
+
const loading: RouteHelpers<any, any>["loading"] = (component, options) => {
|
|
844
|
+
const { store, ctx } = requireDslContext(
|
|
845
|
+
"loading() must be called inside urls()",
|
|
846
|
+
);
|
|
649
847
|
|
|
650
848
|
const parent = ctx.parent;
|
|
651
849
|
if (!parent || !("loading" in parent)) {
|
|
652
850
|
invariant(false, "No parent entry available for loading()");
|
|
653
851
|
}
|
|
654
852
|
|
|
853
|
+
// Unwrap function form: loading(() => <Skeleton />) → loading(<Skeleton />)
|
|
854
|
+
const resolved =
|
|
855
|
+
typeof component === "function" ? (component as () => any)() : component;
|
|
856
|
+
|
|
655
857
|
// If ssr: false and we're in SSR, set loading to false
|
|
656
858
|
if (options?.ssr === false && ctx.isSSR) {
|
|
657
859
|
parent.loading = false;
|
|
658
860
|
} else {
|
|
659
|
-
parent.loading =
|
|
861
|
+
parent.loading = resolved;
|
|
660
862
|
}
|
|
661
863
|
|
|
662
864
|
const name = `$${store.getNextIndex("loading")}`;
|
|
@@ -664,10 +866,13 @@ const loadingFn: RouteHelpers<any, any>["loading"] = (component, options) => {
|
|
|
664
866
|
};
|
|
665
867
|
|
|
666
868
|
/**
|
|
667
|
-
* Transition helper -
|
|
668
|
-
*
|
|
869
|
+
* Transition helper - opts the entry (or a wrapped group of routes) into
|
|
870
|
+
* transition-driven navigation by attaching a TransitionConfig. This drives the
|
|
871
|
+
* commit through startTransition (content hold on all React versions) and, on
|
|
872
|
+
* experimental React, places a `<ViewTransition>` boundary unless
|
|
873
|
+
* `viewTransition: false`. See skills/view-transitions for the matrix.
|
|
669
874
|
*/
|
|
670
|
-
const
|
|
875
|
+
const transition = (
|
|
671
876
|
configOrChildren?: TransitionConfig | (() => UseItems<AllUseItems>),
|
|
672
877
|
maybeChildren?: () => UseItems<AllUseItems>,
|
|
673
878
|
): TransitionItem => {
|
|
@@ -681,9 +886,9 @@ const transitionFn = (
|
|
|
681
886
|
const children: (() => UseItems<AllUseItems>) | undefined =
|
|
682
887
|
typeof configOrChildren === "function" ? configOrChildren : maybeChildren;
|
|
683
888
|
|
|
684
|
-
const store =
|
|
685
|
-
|
|
686
|
-
|
|
889
|
+
const { store, ctx } = requireDslContext(
|
|
890
|
+
"transition() must be called inside urls()",
|
|
891
|
+
);
|
|
687
892
|
|
|
688
893
|
const name = `$${store.getNextIndex("transition")}`;
|
|
689
894
|
|
|
@@ -700,68 +905,43 @@ const transitionFn = (
|
|
|
700
905
|
// Position 2: wrapper — create a transparent layout with transition config
|
|
701
906
|
const namespace = `${ctx.namespace}.${store.getNextIndex("transition")}`;
|
|
702
907
|
const entry = {
|
|
908
|
+
...emptySegmentBase(),
|
|
703
909
|
id: namespace,
|
|
704
910
|
shortCode: store.getShortCode("layout"),
|
|
705
911
|
type: "layout",
|
|
706
912
|
parent: ctx.parent,
|
|
707
913
|
handler: RootLayout,
|
|
708
|
-
loading: undefined,
|
|
709
914
|
transition: config,
|
|
710
|
-
|
|
711
|
-
revalidate: [],
|
|
712
|
-
errorBoundary: [],
|
|
713
|
-
notFoundBoundary: [],
|
|
714
|
-
layout: [],
|
|
715
|
-
parallel: {},
|
|
716
|
-
intercept: [],
|
|
717
|
-
loader: [],
|
|
718
|
-
} as EntryData;
|
|
719
|
-
|
|
720
|
-
const result = store.run(namespace, entry, children)?.flat(3);
|
|
915
|
+
} satisfies EntryData;
|
|
721
916
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
917
|
+
const result = runAndValidateUseItems(
|
|
918
|
+
store,
|
|
919
|
+
namespace,
|
|
920
|
+
entry,
|
|
921
|
+
children,
|
|
922
|
+
"transition",
|
|
923
|
+
"children",
|
|
725
924
|
);
|
|
726
925
|
|
|
727
|
-
|
|
728
|
-
result &&
|
|
729
|
-
Array.isArray(result) &&
|
|
730
|
-
result.some((item) => hasRoutesInItem(item));
|
|
731
|
-
|
|
732
|
-
if (!hasRoutes) {
|
|
733
|
-
const parent = ctx.parent;
|
|
734
|
-
if (parent && "layout" in parent) {
|
|
735
|
-
entry.parent = null;
|
|
736
|
-
parent.layout.push(entry);
|
|
737
|
-
}
|
|
738
|
-
}
|
|
926
|
+
if (isOrphan(result)) attachOrphanSibling(ctx.parent, entry);
|
|
739
927
|
|
|
740
928
|
return { name: namespace, type: "transition" } as TransitionItem;
|
|
741
929
|
};
|
|
742
930
|
|
|
743
|
-
const
|
|
744
|
-
const store =
|
|
745
|
-
|
|
746
|
-
|
|
931
|
+
const route: RouteHelpers<any, any>["route"] = (name, handler, use) => {
|
|
932
|
+
const { store, ctx } = requireDslContext(
|
|
933
|
+
"route() must be called inside urls()",
|
|
934
|
+
);
|
|
747
935
|
|
|
748
936
|
const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${name}`;
|
|
749
937
|
|
|
750
938
|
const entry = {
|
|
939
|
+
...emptySegmentBase(),
|
|
751
940
|
id: namespace,
|
|
752
941
|
shortCode: store.getShortCode("route"),
|
|
753
942
|
type: "route",
|
|
754
943
|
parent: ctx.parent,
|
|
755
|
-
handler,
|
|
756
|
-
loading: undefined, // Allow loading() to attach loading state
|
|
757
|
-
middleware: [],
|
|
758
|
-
revalidate: [],
|
|
759
|
-
errorBoundary: [],
|
|
760
|
-
notFoundBoundary: [],
|
|
761
|
-
layout: [],
|
|
762
|
-
parallel: {},
|
|
763
|
-
intercept: [],
|
|
764
|
-
loader: [],
|
|
944
|
+
handler: handler as unknown as Handler<any, any, any>,
|
|
765
945
|
} satisfies EntryData;
|
|
766
946
|
|
|
767
947
|
/* We will throw if user is registring same route name twice */
|
|
@@ -771,12 +951,18 @@ const routeFn: RouteHelpers<any, any>["route"] = (name, handler, use) => {
|
|
|
771
951
|
);
|
|
772
952
|
/* Register route entry */
|
|
773
953
|
ctx.manifest.set(name, entry);
|
|
954
|
+
/* Merge handler.use defaults with explicit use */
|
|
955
|
+
const handlerUseFn = resolveHandlerUse(handler);
|
|
956
|
+
const mergedUse = mergeHandlerUse(handlerUseFn, use, "route");
|
|
774
957
|
/* Run use and attach handlers */
|
|
775
|
-
if (
|
|
776
|
-
const result =
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
958
|
+
if (mergedUse) {
|
|
959
|
+
const result = runAndValidateUseItems(
|
|
960
|
+
store,
|
|
961
|
+
namespace,
|
|
962
|
+
entry,
|
|
963
|
+
mergedUse,
|
|
964
|
+
"route",
|
|
965
|
+
"use",
|
|
780
966
|
);
|
|
781
967
|
return { name: namespace, type: "route", uses: result } as RouteItem;
|
|
782
968
|
}
|
|
@@ -786,9 +972,9 @@ const routeFn: RouteHelpers<any, any>["route"] = (name, handler, use) => {
|
|
|
786
972
|
};
|
|
787
973
|
|
|
788
974
|
const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
789
|
-
const store =
|
|
790
|
-
|
|
791
|
-
|
|
975
|
+
const { store, ctx } = requireDslContext(
|
|
976
|
+
"layout() must be called inside urls()",
|
|
977
|
+
);
|
|
792
978
|
|
|
793
979
|
invariant(
|
|
794
980
|
!ctx.parent || ctx.parent.type !== "parallel",
|
|
@@ -806,20 +992,12 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
806
992
|
|
|
807
993
|
const urlPrefix = getUrlPrefix();
|
|
808
994
|
const entry = {
|
|
995
|
+
...emptySegmentBase(),
|
|
809
996
|
id: namespace,
|
|
810
997
|
shortCode,
|
|
811
998
|
type: "layout",
|
|
812
999
|
parent: ctx.parent,
|
|
813
1000
|
handler: unwrappedHandler,
|
|
814
|
-
loading: undefined, // Allow loading() to attach loading state
|
|
815
|
-
middleware: [],
|
|
816
|
-
revalidate: [],
|
|
817
|
-
errorBoundary: [],
|
|
818
|
-
notFoundBoundary: [],
|
|
819
|
-
parallel: {},
|
|
820
|
-
intercept: [],
|
|
821
|
-
layout: [],
|
|
822
|
-
loader: [],
|
|
823
1001
|
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
824
1002
|
...(isStatic
|
|
825
1003
|
? {
|
|
@@ -834,14 +1012,20 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
834
1012
|
(handler as any).$$routePrefix = ctx.namePrefix;
|
|
835
1013
|
}
|
|
836
1014
|
|
|
837
|
-
//
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
result = store.run(namespace, entry, use)?.flat(3);
|
|
1015
|
+
// Merge handler.use defaults with explicit use
|
|
1016
|
+
const handlerUseFn = resolveHandlerUse(handler);
|
|
1017
|
+
const mergedUse = mergeHandlerUse(handlerUseFn, use, "layout");
|
|
841
1018
|
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
1019
|
+
// Run merged use callback if present
|
|
1020
|
+
let result: AllUseItems[] | undefined;
|
|
1021
|
+
if (mergedUse) {
|
|
1022
|
+
result = runAndValidateUseItems(
|
|
1023
|
+
store,
|
|
1024
|
+
namespace,
|
|
1025
|
+
entry,
|
|
1026
|
+
mergedUse,
|
|
1027
|
+
"layout",
|
|
1028
|
+
"use",
|
|
845
1029
|
);
|
|
846
1030
|
}
|
|
847
1031
|
|
|
@@ -883,9 +1067,7 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
883
1067
|
`Orphan layouts can only be defined inside route or layout > check [${namespace}]`,
|
|
884
1068
|
);
|
|
885
1069
|
|
|
886
|
-
|
|
887
|
-
entry.parent = null;
|
|
888
|
-
parent.layout.push(entry);
|
|
1070
|
+
attachOrphanSibling(parent, entry);
|
|
889
1071
|
}
|
|
890
1072
|
}
|
|
891
1073
|
|
|
@@ -898,33 +1080,15 @@ const layout: RouteHelpers<any, any>["layout"] = (handler, use) => {
|
|
|
898
1080
|
} as LayoutItem;
|
|
899
1081
|
};
|
|
900
1082
|
|
|
901
|
-
const isValidUseItem = (item: any): item is AllUseItems | undefined | null =>
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
(item
|
|
906
|
-
typeof item === "object" &&
|
|
907
|
-
"type" in item &&
|
|
908
|
-
[
|
|
909
|
-
"layout",
|
|
910
|
-
"route",
|
|
911
|
-
"middleware",
|
|
912
|
-
"revalidate",
|
|
913
|
-
"parallel",
|
|
914
|
-
"intercept",
|
|
915
|
-
"loader",
|
|
916
|
-
"loading",
|
|
917
|
-
"errorBoundary",
|
|
918
|
-
"notFoundBoundary",
|
|
919
|
-
"when",
|
|
920
|
-
"cache",
|
|
921
|
-
"transition",
|
|
922
|
-
"include", // For urls() include() helper
|
|
923
|
-
].includes(item.type))
|
|
924
|
-
);
|
|
925
|
-
};
|
|
1083
|
+
const isValidUseItem = (item: any): item is AllUseItems | undefined | null =>
|
|
1084
|
+
item == null ||
|
|
1085
|
+
(typeof item === "object" &&
|
|
1086
|
+
"type" in item &&
|
|
1087
|
+
ALL_USE_ITEM_TYPES.has(item.type));
|
|
926
1088
|
|
|
927
|
-
//
|
|
1089
|
+
// DSL helpers exported for direct import from @rangojs/router and for
|
|
1090
|
+
// assembly into the RouteHelpers object in helper-factories.ts. The route-item
|
|
1091
|
+
// types are discriminated by their `type` literal, so the helpers carry no brand.
|
|
928
1092
|
export {
|
|
929
1093
|
layout,
|
|
930
1094
|
cache,
|
|
@@ -935,25 +1099,11 @@ export {
|
|
|
935
1099
|
when,
|
|
936
1100
|
errorBoundary,
|
|
937
1101
|
notFoundBoundary,
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
const isOrphanLayout = (item: AllUseItems): boolean => {
|
|
944
|
-
return (
|
|
945
|
-
item.type === "layout" &&
|
|
946
|
-
!item.uses?.some((child) => hasRoutesInItem(child))
|
|
947
|
-
);
|
|
948
|
-
};
|
|
949
|
-
|
|
950
|
-
// Internal exports used by helper-factories.ts
|
|
951
|
-
export {
|
|
952
|
-
routeFn,
|
|
953
|
-
loaderFn,
|
|
954
|
-
loadingFn,
|
|
955
|
-
transitionFn,
|
|
956
|
-
hasRoutesInItem,
|
|
1102
|
+
route,
|
|
1103
|
+
loader,
|
|
1104
|
+
loading,
|
|
1105
|
+
transition,
|
|
957
1106
|
isValidUseItem,
|
|
958
|
-
|
|
1107
|
+
emptySegmentBase,
|
|
1108
|
+
runAndValidateUseItems,
|
|
959
1109
|
};
|