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