@rangojs/router 0.0.0-experimental.0b82333f
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 +9 -0
- package/README.md +899 -0
- 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 +1601 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/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 +5214 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +177 -0
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +220 -0
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +182 -0
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +704 -0
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +313 -0
- package/skills/layout/SKILL.md +310 -0
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +596 -0
- package/skills/middleware/SKILL.md +339 -0
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +305 -0
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +118 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +385 -0
- package/skills/router-setup/SKILL.md +439 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +79 -0
- package/skills/typesafety/SKILL.md +623 -0
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +273 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +899 -0
- package/src/browser/history-state.ts +80 -0
- package/src/browser/index.ts +18 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +141 -0
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +134 -0
- package/src/browser/navigation-bridge.ts +640 -0
- package/src/browser/navigation-client.ts +215 -0
- package/src/browser/navigation-store.ts +806 -0
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +552 -0
- package/src/browser/prefetch/cache.ts +154 -0
- package/src/browser/prefetch/fetch.ts +135 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +360 -0
- package/src/browser/react/NavigationProvider.tsx +386 -0
- package/src/browser/react/ScrollRestoration.tsx +94 -0
- package/src/browser/react/context.ts +59 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +52 -0
- package/src/browser/react/location-state-shared.ts +162 -0
- package/src/browser/react/location-state.ts +107 -0
- package/src/browser/react/mount-context.ts +37 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +218 -0
- package/src/browser/react/use-client-cache.ts +58 -0
- package/src/browser/react/use-handle.ts +162 -0
- package/src/browser/react/use-href.tsx +40 -0
- package/src/browser/react/use-link-status.ts +135 -0
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +99 -0
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +171 -0
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +431 -0
- package/src/browser/scroll-restoration.ts +384 -0
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +667 -0
- package/src/browser/shallow.ts +40 -0
- package/src/browser/types.ts +538 -0
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +265 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +382 -0
- package/src/cache/cf/cf-cache-store.ts +540 -0
- package/src/cache/cf/index.ts +25 -0
- package/src/cache/document-cache.ts +369 -0
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +43 -0
- package/src/cache/memory-segment-store.ts +328 -0
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +98 -0
- package/src/cache/types.ts +342 -0
- package/src/client.rsc.tsx +85 -0
- package/src/client.tsx +601 -0
- package/src/component-utils.ts +76 -0
- package/src/components/DefaultDocument.tsx +27 -0
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/default-error-boundary.tsx +88 -0
- package/src/deps/browser.ts +8 -0
- package/src/deps/html-stream-client.ts +2 -0
- package/src/deps/html-stream-server.ts +2 -0
- package/src/deps/rsc.ts +10 -0
- package/src/deps/ssr.ts +2 -0
- package/src/errors.ts +365 -0
- package/src/handle.ts +135 -0
- package/src/handles/MetaTags.tsx +246 -0
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +7 -0
- package/src/handles/meta.ts +264 -0
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +222 -0
- package/src/index.rsc.ts +233 -0
- package/src/index.ts +277 -0
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +89 -0
- package/src/loader.ts +64 -0
- package/src/network-error-thrower.tsx +23 -0
- package/src/outlet-context.ts +15 -0
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +185 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +289 -0
- package/src/route-content-wrapper.tsx +196 -0
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition.ts +1 -0
- package/src/route-map-builder.ts +275 -0
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +259 -0
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +287 -0
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +451 -0
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +420 -0
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +267 -0
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +266 -0
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +223 -0
- package/src/router/match-middleware/cache-lookup.ts +634 -0
- package/src/router/match-middleware/cache-store.ts +295 -0
- package/src/router/match-middleware/index.ts +81 -0
- package/src/router/match-middleware/intercept-resolution.ts +306 -0
- package/src/router/match-middleware/segment-resolution.ts +192 -0
- package/src/router/match-pipelines.ts +179 -0
- package/src/router/match-result.ts +219 -0
- package/src/router/metrics.ts +282 -0
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +748 -0
- package/src/router/pattern-matching.ts +563 -0
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +289 -0
- package/src/router/router-context.ts +316 -0
- package/src/router/router-interfaces.ts +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +570 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1239 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +239 -0
- package/src/router/types.ts +170 -0
- package/src/router.ts +1002 -0
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +1089 -0
- package/src/rsc/helpers.ts +198 -0
- package/src/rsc/index.ts +36 -0
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +32 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +237 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +263 -0
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +454 -0
- package/src/server/context.ts +591 -0
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +308 -0
- package/src/server/loader-registry.ts +133 -0
- package/src/server/request-context.ts +914 -0
- package/src/server/root-layout.tsx +10 -0
- package/src/server/tsconfig.json +14 -0
- package/src/server.ts +51 -0
- package/src/ssr/index.tsx +365 -0
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +297 -0
- package/src/theme/ThemeScript.tsx +61 -0
- package/src/theme/constants.ts +62 -0
- package/src/theme/index.ts +48 -0
- package/src/theme/theme-context.ts +44 -0
- package/src/theme/theme-script.ts +155 -0
- package/src/theme/types.ts +182 -0
- package/src/theme/use-theme.ts +44 -0
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +687 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +148 -0
- package/src/types.ts +1 -0
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -0
- package/src/use-loader.tsx +354 -0
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +110 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +16 -0
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/plugins/expose-action-id.ts +365 -0
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -0
- package/src/vite/plugins/version.d.ts +12 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +510 -0
- package/src/vite/router-discovery.ts +785 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/utils/package-resolution.ts +121 -0
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
|
@@ -0,0 +1,868 @@
|
|
|
1
|
+
import { getContext, getNamePrefix, getUrlPrefix, } from "./server/context";
|
|
2
|
+
import { invariant } from "./errors";
|
|
3
|
+
import { isStaticHandler } from "./static-handler.js";
|
|
4
|
+
import RootLayout from "./server/root-layout";
|
|
5
|
+
/**
|
|
6
|
+
* Check if a value is a RouteConfig object
|
|
7
|
+
*/
|
|
8
|
+
function isRouteConfig(value) {
|
|
9
|
+
return (typeof value === "object" &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
"path" in value &&
|
|
12
|
+
typeof value.path === "string");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Define routes with optional trailing slash configuration
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Simple string paths
|
|
20
|
+
* const routes = route({
|
|
21
|
+
* blog: "/blog",
|
|
22
|
+
* post: "/blog/:id",
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // With trailing slash config
|
|
26
|
+
* const routes = route({
|
|
27
|
+
* blog: "/blog",
|
|
28
|
+
* api: { path: "/api", trailingSlash: "ignore" },
|
|
29
|
+
* }, { trailingSlash: "never" }); // global default
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function route(input, options) {
|
|
33
|
+
const trailingSlash = {};
|
|
34
|
+
const routes = flattenRoutes(input, "", trailingSlash, options?.trailingSlash);
|
|
35
|
+
// Attach trailing slash config as a non-enumerable property
|
|
36
|
+
// This keeps backwards compatibility while passing the config through
|
|
37
|
+
const result = routes;
|
|
38
|
+
if (Object.keys(trailingSlash).length > 0) {
|
|
39
|
+
Object.defineProperty(result, "__trailingSlash", {
|
|
40
|
+
value: trailingSlash,
|
|
41
|
+
enumerable: false,
|
|
42
|
+
writable: false,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Flatten nested route definitions
|
|
49
|
+
*/
|
|
50
|
+
function flattenRoutes(routes, prefix, trailingSlashConfig, defaultTrailingSlash) {
|
|
51
|
+
const flattened = {};
|
|
52
|
+
for (const [key, value] of Object.entries(routes)) {
|
|
53
|
+
const fullKey = prefix + key;
|
|
54
|
+
if (typeof value === "string") {
|
|
55
|
+
// Direct route pattern - include prefix
|
|
56
|
+
flattened[fullKey] = value;
|
|
57
|
+
// Apply default trailing slash if set
|
|
58
|
+
if (defaultTrailingSlash) {
|
|
59
|
+
trailingSlashConfig[fullKey] = defaultTrailingSlash;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (isRouteConfig(value)) {
|
|
63
|
+
// Route config object with path and optional trailingSlash
|
|
64
|
+
flattened[fullKey] = value.path;
|
|
65
|
+
// Use route-specific config or fall back to default
|
|
66
|
+
const mode = value.trailingSlash ?? defaultTrailingSlash;
|
|
67
|
+
if (mode) {
|
|
68
|
+
trailingSlashConfig[fullKey] = mode;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Nested routes - flatten recursively
|
|
73
|
+
const nested = flattenRoutes(value, `${fullKey}.`, trailingSlashConfig, defaultTrailingSlash);
|
|
74
|
+
Object.assign(flattened, nested);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return flattened;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if an item contains routes (directly or inside nested structures like cache).
|
|
81
|
+
* Used to determine if a layout or cache should be treated as an orphan.
|
|
82
|
+
*/
|
|
83
|
+
const hasRoutesInItem = (item) => {
|
|
84
|
+
if (item.type === "route")
|
|
85
|
+
return true;
|
|
86
|
+
// Lazy includes contain deferred routes — treat them as having routes
|
|
87
|
+
// to prevent the parent layout from being misclassified as orphan,
|
|
88
|
+
// which would clear its parent pointer and break the middleware chain.
|
|
89
|
+
if (item.type === "include")
|
|
90
|
+
return true;
|
|
91
|
+
if (item.type === "cache" && item.uses) {
|
|
92
|
+
return item.uses.some((child) => hasRoutesInItem(child));
|
|
93
|
+
}
|
|
94
|
+
if (item.type === "layout" && item.uses) {
|
|
95
|
+
return item.uses.some((child) => hasRoutesInItem(child));
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
};
|
|
99
|
+
const revalidate = (fn) => {
|
|
100
|
+
const ctx = getContext().getStore();
|
|
101
|
+
if (!ctx)
|
|
102
|
+
throw new Error("revalidate() must be called inside map()");
|
|
103
|
+
// Attach to last entry in stack
|
|
104
|
+
const parent = ctx.parent;
|
|
105
|
+
if (!parent || !("revalidate" in parent)) {
|
|
106
|
+
invariant(false, "No parent entry available for revalidate()");
|
|
107
|
+
}
|
|
108
|
+
const name = `$${getContext().getNextIndex("revalidate")}`;
|
|
109
|
+
parent.revalidate.push(fn);
|
|
110
|
+
return { name, type: "revalidate" };
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Error boundary helper - attaches an error fallback to the current entry
|
|
114
|
+
*
|
|
115
|
+
* When an error occurs during rendering of this segment or its children,
|
|
116
|
+
* the fallback will be rendered instead. The fallback can be:
|
|
117
|
+
* - A static ReactNode (e.g., <ErrorPage />)
|
|
118
|
+
* - A handler function that receives error info and reset function
|
|
119
|
+
*
|
|
120
|
+
* Error boundaries catch errors from:
|
|
121
|
+
* - Middleware execution
|
|
122
|
+
* - Loader execution
|
|
123
|
+
* - Handler/component rendering
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* layout(<ShopLayout />, () => [
|
|
128
|
+
* errorBoundary(<ShopErrorFallback />),
|
|
129
|
+
* route("products.detail", ProductDetail),
|
|
130
|
+
* ])
|
|
131
|
+
*
|
|
132
|
+
* // Or with handler for dynamic error UI:
|
|
133
|
+
* route("products.detail", ProductDetail, () => [
|
|
134
|
+
* errorBoundary(({ error, reset }) => (
|
|
135
|
+
* <div>
|
|
136
|
+
* <h2>Product failed to load</h2>
|
|
137
|
+
* <p>{error.message}</p>
|
|
138
|
+
* <button onClick={reset}>Retry</button>
|
|
139
|
+
* </div>
|
|
140
|
+
* )),
|
|
141
|
+
* ])
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
const errorBoundary = (fallback) => {
|
|
145
|
+
const ctx = getContext().getStore();
|
|
146
|
+
if (!ctx)
|
|
147
|
+
throw new Error("errorBoundary() must be called inside map()");
|
|
148
|
+
// Attach to parent entry in stack
|
|
149
|
+
const parent = ctx.parent;
|
|
150
|
+
if (!parent || !("errorBoundary" in parent)) {
|
|
151
|
+
invariant(false, "No parent entry available for errorBoundary()");
|
|
152
|
+
}
|
|
153
|
+
const name = `$${getContext().getNextIndex("errorBoundary")}`;
|
|
154
|
+
parent.errorBoundary.push(fallback);
|
|
155
|
+
return { name, type: "errorBoundary" };
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* NotFound boundary helper - attaches a not-found fallback to the current entry
|
|
159
|
+
*
|
|
160
|
+
* When a DataNotFoundError is thrown (via notFound()) during rendering of this
|
|
161
|
+
* segment or its children, the fallback will be rendered instead. The fallback can be:
|
|
162
|
+
* - A static ReactNode (e.g., <ProductNotFound />)
|
|
163
|
+
* - A handler function that receives not found info
|
|
164
|
+
*
|
|
165
|
+
* NotFound boundaries catch DataNotFoundError from:
|
|
166
|
+
* - Loader execution
|
|
167
|
+
* - Handler/component rendering
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* layout(<ShopLayout />, () => [
|
|
172
|
+
* notFoundBoundary(<ProductNotFound />),
|
|
173
|
+
* route("products.detail", ProductDetail),
|
|
174
|
+
* ])
|
|
175
|
+
*
|
|
176
|
+
* // Or with handler for dynamic not found UI:
|
|
177
|
+
* route("products.detail", ProductDetail, () => [
|
|
178
|
+
* notFoundBoundary(({ notFound }) => (
|
|
179
|
+
* <div>
|
|
180
|
+
* <h2>Product not found</h2>
|
|
181
|
+
* <p>{notFound.message}</p>
|
|
182
|
+
* <a href="/products">Browse all products</a>
|
|
183
|
+
* </div>
|
|
184
|
+
* )),
|
|
185
|
+
* ])
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
const notFoundBoundary = (fallback) => {
|
|
189
|
+
const ctx = getContext().getStore();
|
|
190
|
+
if (!ctx)
|
|
191
|
+
throw new Error("notFoundBoundary() must be called inside map()");
|
|
192
|
+
// Attach to parent entry in stack
|
|
193
|
+
const parent = ctx.parent;
|
|
194
|
+
if (!parent || !("notFoundBoundary" in parent)) {
|
|
195
|
+
invariant(false, "No parent entry available for notFoundBoundary()");
|
|
196
|
+
}
|
|
197
|
+
const name = `$${getContext().getNextIndex("notFoundBoundary")}`;
|
|
198
|
+
parent.notFoundBoundary.push(fallback);
|
|
199
|
+
return { name, type: "notFoundBoundary" };
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* When helper - defines a condition for intercept activation
|
|
203
|
+
*
|
|
204
|
+
* Only valid inside intercept() use() callback. The when() function
|
|
205
|
+
* is captured by the intercept and stored in its `when` array.
|
|
206
|
+
* During soft navigation, all when() conditions must return true
|
|
207
|
+
* for the intercept to activate.
|
|
208
|
+
*/
|
|
209
|
+
const when = (fn) => {
|
|
210
|
+
const ctx = getContext().getStore();
|
|
211
|
+
if (!ctx)
|
|
212
|
+
throw new Error("when() must be called inside intercept()");
|
|
213
|
+
// The when() function needs to be captured by the intercept's tempParent
|
|
214
|
+
// which should have a `when` array. If not present, we're not inside intercept()
|
|
215
|
+
const parent = ctx.parent;
|
|
216
|
+
if (!parent || !("when" in parent)) {
|
|
217
|
+
invariant(false, "when() can only be used inside intercept() use() callback");
|
|
218
|
+
}
|
|
219
|
+
const name = `$${getContext().getNextIndex("when")}`;
|
|
220
|
+
parent.when.push(fn);
|
|
221
|
+
return { name, type: "when" };
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Cache helper - defines caching configuration for segments
|
|
225
|
+
*
|
|
226
|
+
* Creates a cache boundary that applies to all children unless overridden.
|
|
227
|
+
* When used without children, attaches cache config to the parent entry
|
|
228
|
+
* (e.g., for loader-specific caching).
|
|
229
|
+
*
|
|
230
|
+
* Supports three call signatures:
|
|
231
|
+
* - cache() - no args, uses app-level defaults (for loader caching)
|
|
232
|
+
* - cache(() => [...]) - wraps children with app-level defaults
|
|
233
|
+
* - cache({ ttl: 60 }, () => [...]) - with explicit options
|
|
234
|
+
*/
|
|
235
|
+
const cache = (optionsOrChildren, maybeChildren) => {
|
|
236
|
+
const store = getContext();
|
|
237
|
+
const ctx = store.getStore();
|
|
238
|
+
if (!ctx)
|
|
239
|
+
throw new Error("cache() must be called inside map()");
|
|
240
|
+
// Handle overloaded signature: cache(), cache(children), or cache(options, children)
|
|
241
|
+
let options;
|
|
242
|
+
let children;
|
|
243
|
+
if (optionsOrChildren === undefined) {
|
|
244
|
+
// cache() - no args, use defaults
|
|
245
|
+
options = {};
|
|
246
|
+
children = undefined;
|
|
247
|
+
}
|
|
248
|
+
else if (typeof optionsOrChildren === "function") {
|
|
249
|
+
// cache(() => [...]) - use empty options (will use defaults)
|
|
250
|
+
options = {};
|
|
251
|
+
children = optionsOrChildren;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
// cache(options, children) - explicit options
|
|
255
|
+
options = optionsOrChildren;
|
|
256
|
+
children = maybeChildren;
|
|
257
|
+
}
|
|
258
|
+
const name = `$${store.getNextIndex("cache")}`;
|
|
259
|
+
const cacheConfig = { options };
|
|
260
|
+
// If no children, create an orphan cache entry (like orphan layouts)
|
|
261
|
+
// This allows cache() to wrap subsequent siblings
|
|
262
|
+
if (!children) {
|
|
263
|
+
const parent = ctx.parent;
|
|
264
|
+
// Check if we're inside a loader() use() callback - special case for loader caching
|
|
265
|
+
if (parent && parent.type === "loader") {
|
|
266
|
+
// Direct assignment to loader entry's cache field
|
|
267
|
+
parent.cache = cacheConfig;
|
|
268
|
+
return { name, type: "cache" };
|
|
269
|
+
}
|
|
270
|
+
// Create orphan cache entry (like orphan layout)
|
|
271
|
+
// Subsequent siblings in the same array will attach to this entry
|
|
272
|
+
const namespace = `${ctx.namespace}.${store.getNextIndex("cache")}`;
|
|
273
|
+
const cacheUrlPrefix = getUrlPrefix();
|
|
274
|
+
const entry = {
|
|
275
|
+
id: namespace,
|
|
276
|
+
shortCode: store.getShortCode("cache"),
|
|
277
|
+
type: "cache",
|
|
278
|
+
parent: parent, // link to current parent for hierarchy
|
|
279
|
+
cache: cacheConfig,
|
|
280
|
+
handler: RootLayout,
|
|
281
|
+
middleware: [],
|
|
282
|
+
revalidate: [],
|
|
283
|
+
errorBoundary: [],
|
|
284
|
+
notFoundBoundary: [],
|
|
285
|
+
layout: [],
|
|
286
|
+
parallel: [],
|
|
287
|
+
intercept: [],
|
|
288
|
+
loader: [],
|
|
289
|
+
...(cacheUrlPrefix ? { mountPath: cacheUrlPrefix } : {}),
|
|
290
|
+
};
|
|
291
|
+
// Attach to parent's layout array (cache entries are structural like layouts)
|
|
292
|
+
if (parent && "layout" in parent) {
|
|
293
|
+
parent.layout.push(entry);
|
|
294
|
+
}
|
|
295
|
+
// Update context parent so subsequent siblings attach to this cache entry
|
|
296
|
+
// This makes cache() act as sugar for cache(() => [...])
|
|
297
|
+
ctx.parent = entry;
|
|
298
|
+
return { name: namespace, type: "cache" };
|
|
299
|
+
}
|
|
300
|
+
// With children: create a cache entry (like layout with caching semantics)
|
|
301
|
+
const cacheNextIndex = store.getNextIndex("cache");
|
|
302
|
+
const namespace = `${ctx.namespace}.${cacheNextIndex}`;
|
|
303
|
+
const cacheShortCode = store.getShortCode("cache");
|
|
304
|
+
const cacheUrlPrefix2 = getUrlPrefix();
|
|
305
|
+
const entry = {
|
|
306
|
+
id: namespace,
|
|
307
|
+
shortCode: cacheShortCode,
|
|
308
|
+
type: "cache",
|
|
309
|
+
parent: ctx.parent,
|
|
310
|
+
cache: cacheConfig,
|
|
311
|
+
// Cache entries render like layouts (with Outlet as default handler)
|
|
312
|
+
handler: RootLayout, // RootLayout just renders <Outlet />
|
|
313
|
+
middleware: [],
|
|
314
|
+
revalidate: [],
|
|
315
|
+
errorBoundary: [],
|
|
316
|
+
notFoundBoundary: [],
|
|
317
|
+
layout: [],
|
|
318
|
+
parallel: [],
|
|
319
|
+
intercept: [],
|
|
320
|
+
loader: [],
|
|
321
|
+
...(cacheUrlPrefix2 ? { mountPath: cacheUrlPrefix2 } : {}),
|
|
322
|
+
};
|
|
323
|
+
// Run children with cache entry as parent
|
|
324
|
+
const result = store.run(namespace, entry, children);
|
|
325
|
+
invariant(Array.isArray(result) && result.every((item) => isValidUseItem(item)), `cache() children callback must return an array of use items [${namespace}]`);
|
|
326
|
+
// Check if this cache has routes (including nested caches/layouts)
|
|
327
|
+
const hasRoutes = result &&
|
|
328
|
+
Array.isArray(result) &&
|
|
329
|
+
result.some((item) => hasRoutesInItem(item));
|
|
330
|
+
if (!hasRoutes) {
|
|
331
|
+
const parent = ctx.parent;
|
|
332
|
+
if (parent && "layout" in parent) {
|
|
333
|
+
// Attach to parent's layout array (cache entries are structural like layouts)
|
|
334
|
+
entry.parent = null;
|
|
335
|
+
parent.layout.push(entry);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return { name: namespace, type: "cache", uses: result };
|
|
339
|
+
};
|
|
340
|
+
const middleware = (...fn) => {
|
|
341
|
+
const ctx = getContext().getStore();
|
|
342
|
+
if (!ctx)
|
|
343
|
+
throw new Error("middleware() must be called inside map()");
|
|
344
|
+
// Attach to last entry in stack
|
|
345
|
+
const parent = ctx.parent;
|
|
346
|
+
if (!parent || !("middleware" in parent)) {
|
|
347
|
+
invariant(false, "No parent entry available for middleware()");
|
|
348
|
+
}
|
|
349
|
+
const name = `$${getContext().getNextIndex("middleware")}`;
|
|
350
|
+
parent.middleware.push(...fn);
|
|
351
|
+
return { name, type: "middleware" };
|
|
352
|
+
};
|
|
353
|
+
const parallel = (slots, use) => {
|
|
354
|
+
const store = getContext();
|
|
355
|
+
const ctx = store.getStore();
|
|
356
|
+
if (!ctx)
|
|
357
|
+
throw new Error("parallel() must be called inside map()");
|
|
358
|
+
if (!ctx.parent || !ctx.parent?.parallel) {
|
|
359
|
+
invariant(false, "No parent entry available for parallel()");
|
|
360
|
+
}
|
|
361
|
+
invariant(ctx.parent.type !== "parallel", "parallel() cannot be nested inside another parallel()");
|
|
362
|
+
const namespace = `${ctx.namespace}.$${store.getNextIndex("parallel")}`;
|
|
363
|
+
// Unwrap any static handler definitions in parallel slots
|
|
364
|
+
const unwrappedSlots = {};
|
|
365
|
+
let hasStaticSlot = false;
|
|
366
|
+
for (const [slotName, slotHandler] of Object.entries(slots)) {
|
|
367
|
+
if (isStaticHandler(slotHandler)) {
|
|
368
|
+
hasStaticSlot = true;
|
|
369
|
+
unwrappedSlots[slotName] = slotHandler.handler;
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
unwrappedSlots[slotName] = slotHandler;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Create full EntryData for parallel with its own loaders/revalidate/loading
|
|
376
|
+
const parallelUrlPrefix = getUrlPrefix();
|
|
377
|
+
const entry = {
|
|
378
|
+
id: namespace,
|
|
379
|
+
shortCode: store.getShortCode("parallel"),
|
|
380
|
+
type: "parallel",
|
|
381
|
+
parent: null, // Parallels don't participate in parent chain traversal
|
|
382
|
+
handler: unwrappedSlots,
|
|
383
|
+
loading: undefined, // Allow loading() to attach loading state
|
|
384
|
+
middleware: [],
|
|
385
|
+
revalidate: [],
|
|
386
|
+
errorBoundary: [],
|
|
387
|
+
notFoundBoundary: [],
|
|
388
|
+
layout: [],
|
|
389
|
+
parallel: [],
|
|
390
|
+
intercept: [],
|
|
391
|
+
loader: [],
|
|
392
|
+
...(parallelUrlPrefix ? { mountPath: parallelUrlPrefix } : {}),
|
|
393
|
+
...(hasStaticSlot ? { isStaticPrerender: true } : {}),
|
|
394
|
+
};
|
|
395
|
+
// Run use callback if provided to collect loaders, revalidate, loading
|
|
396
|
+
if (use && typeof use === "function") {
|
|
397
|
+
const result = store.run(namespace, entry, use);
|
|
398
|
+
invariant(Array.isArray(result) && result.every((item) => isValidUseItem(item)), `parallel() use() callback must return an array of use items [${namespace}]`);
|
|
399
|
+
}
|
|
400
|
+
ctx.parent.parallel.push(entry);
|
|
401
|
+
return { name: namespace, type: "parallel" };
|
|
402
|
+
};
|
|
403
|
+
/**
|
|
404
|
+
* Intercept helper - defines an intercepting route for soft navigation
|
|
405
|
+
*/
|
|
406
|
+
const intercept = (slotName, routeName, handler, use) => {
|
|
407
|
+
const store = getContext();
|
|
408
|
+
const ctx = store.getStore();
|
|
409
|
+
if (!ctx)
|
|
410
|
+
throw new Error("intercept() must be called inside map()");
|
|
411
|
+
if (!ctx.parent || !ctx.parent?.intercept) {
|
|
412
|
+
invariant(false, "No parent entry available for intercept()");
|
|
413
|
+
}
|
|
414
|
+
invariant(ctx.parent.type !== "parallel", "intercept() cannot be used inside parallel()");
|
|
415
|
+
const namespace = `${ctx.namespace}.$${store.getNextIndex("intercept")}.${slotName}`;
|
|
416
|
+
// Apply name prefix to routeName (from include())
|
|
417
|
+
// This ensures intercepts match prefixed route keys
|
|
418
|
+
const namePrefix = getNamePrefix();
|
|
419
|
+
const prefixedRouteName = namePrefix ? `${namePrefix}.${routeName}` : routeName;
|
|
420
|
+
// Create intercept entry with its own loaders/revalidate/middleware/when
|
|
421
|
+
const entry = {
|
|
422
|
+
slotName: slotName,
|
|
423
|
+
routeName: prefixedRouteName,
|
|
424
|
+
handler,
|
|
425
|
+
middleware: [],
|
|
426
|
+
revalidate: [],
|
|
427
|
+
errorBoundary: [],
|
|
428
|
+
notFoundBoundary: [],
|
|
429
|
+
loader: [],
|
|
430
|
+
when: [], // Selector conditions for conditional interception
|
|
431
|
+
};
|
|
432
|
+
// Run use callback if provided to collect loaders, revalidate, middleware, etc.
|
|
433
|
+
if (use && typeof use === "function") {
|
|
434
|
+
// Create a temporary parent context for the use() callback
|
|
435
|
+
// so that middleware, loader, revalidate attach to the intercept entry
|
|
436
|
+
const originalParent = ctx.parent;
|
|
437
|
+
// Capture layouts in a temporary array
|
|
438
|
+
const capturedLayouts = [];
|
|
439
|
+
const tempParent = {
|
|
440
|
+
...originalParent,
|
|
441
|
+
middleware: entry.middleware,
|
|
442
|
+
revalidate: entry.revalidate,
|
|
443
|
+
errorBoundary: entry.errorBoundary,
|
|
444
|
+
notFoundBoundary: entry.notFoundBoundary,
|
|
445
|
+
loader: entry.loader,
|
|
446
|
+
layout: capturedLayouts, // Capture layout() calls
|
|
447
|
+
when: entry.when, // Capture when() conditions
|
|
448
|
+
// Use getter/setter to capture loading on the entry
|
|
449
|
+
get loading() {
|
|
450
|
+
return entry.loading;
|
|
451
|
+
},
|
|
452
|
+
set loading(value) {
|
|
453
|
+
entry.loading = value;
|
|
454
|
+
},
|
|
455
|
+
};
|
|
456
|
+
ctx.parent = tempParent;
|
|
457
|
+
const result = use();
|
|
458
|
+
// Restore original parent
|
|
459
|
+
ctx.parent = originalParent;
|
|
460
|
+
// Extract layout from captured layouts (use first one if multiple)
|
|
461
|
+
// Layout inside intercept should always be ReactNode or Handler, not Record slots
|
|
462
|
+
if (capturedLayouts.length > 0 && capturedLayouts[0].type === "layout") {
|
|
463
|
+
entry.layout = capturedLayouts[0].handler;
|
|
464
|
+
}
|
|
465
|
+
invariant(Array.isArray(result) && result.every((item) => isValidUseItem(item)), `intercept() use() callback must return an array of use items [${namespace}]`);
|
|
466
|
+
}
|
|
467
|
+
ctx.parent.intercept.push(entry);
|
|
468
|
+
return { name: namespace, type: "intercept" };
|
|
469
|
+
};
|
|
470
|
+
/**
|
|
471
|
+
* Loader helper - attaches a loader to the current entry
|
|
472
|
+
*/
|
|
473
|
+
const loaderFn = (loaderDef, use) => {
|
|
474
|
+
const store = getContext();
|
|
475
|
+
const ctx = store.getStore();
|
|
476
|
+
if (!ctx)
|
|
477
|
+
throw new Error("loader() must be called inside map()");
|
|
478
|
+
// Attach to last entry in stack
|
|
479
|
+
if (!ctx.parent || !ctx.parent?.loader) {
|
|
480
|
+
invariant(false, "No parent entry available for loader()");
|
|
481
|
+
}
|
|
482
|
+
const name = `${ctx.namespace}.$${store.getNextIndex("loader")}`;
|
|
483
|
+
// Create loader entry with empty revalidate array
|
|
484
|
+
const loaderEntry = {
|
|
485
|
+
loader: loaderDef,
|
|
486
|
+
revalidate: [],
|
|
487
|
+
};
|
|
488
|
+
// If use() callback provided, run it to collect revalidation rules
|
|
489
|
+
if (use && typeof use === "function") {
|
|
490
|
+
// Temporarily set context for revalidate() calls to target this loader
|
|
491
|
+
const originalParent = ctx.parent;
|
|
492
|
+
// Create a temporary "parent" that has the revalidate array we want to populate
|
|
493
|
+
const tempParent = {
|
|
494
|
+
...originalParent,
|
|
495
|
+
revalidate: loaderEntry.revalidate,
|
|
496
|
+
};
|
|
497
|
+
ctx.parent = tempParent;
|
|
498
|
+
const result = use();
|
|
499
|
+
// Restore original parent
|
|
500
|
+
ctx.parent = originalParent;
|
|
501
|
+
invariant(Array.isArray(result) && result.every((item) => isValidUseItem(item)), `loader() use() callback must return an array of use items [${name}]`);
|
|
502
|
+
}
|
|
503
|
+
ctx.parent.loader.push(loaderEntry);
|
|
504
|
+
return { name, type: "loader" };
|
|
505
|
+
};
|
|
506
|
+
/**
|
|
507
|
+
* Loading helper - attaches a loading component to the current entry
|
|
508
|
+
* Loading components are static (no context) and shown during navigation
|
|
509
|
+
*/
|
|
510
|
+
const loadingFn = (component, options) => {
|
|
511
|
+
const store = getContext();
|
|
512
|
+
const ctx = store.getStore();
|
|
513
|
+
if (!ctx)
|
|
514
|
+
throw new Error("loading() must be called inside map()");
|
|
515
|
+
const parent = ctx.parent;
|
|
516
|
+
if (!parent || !("loading" in parent)) {
|
|
517
|
+
invariant(false, "No parent entry available for loading()");
|
|
518
|
+
}
|
|
519
|
+
// If ssr: false and we're in SSR, set loading to false
|
|
520
|
+
if (options?.ssr === false && ctx.isSSR) {
|
|
521
|
+
parent.loading = false;
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
parent.loading = component;
|
|
525
|
+
}
|
|
526
|
+
const name = `$${store.getNextIndex("loading")}`;
|
|
527
|
+
return { name, type: "loading" };
|
|
528
|
+
};
|
|
529
|
+
const routeFn = (name, handler, use) => {
|
|
530
|
+
const store = getContext();
|
|
531
|
+
const ctx = store.getStore();
|
|
532
|
+
if (!ctx)
|
|
533
|
+
throw new Error("route() must be called inside map()");
|
|
534
|
+
const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${name}`;
|
|
535
|
+
const entry = {
|
|
536
|
+
id: namespace,
|
|
537
|
+
shortCode: store.getShortCode("route"),
|
|
538
|
+
type: "route",
|
|
539
|
+
parent: ctx.parent,
|
|
540
|
+
handler,
|
|
541
|
+
loading: undefined, // Allow loading() to attach loading state
|
|
542
|
+
middleware: [],
|
|
543
|
+
revalidate: [],
|
|
544
|
+
errorBoundary: [],
|
|
545
|
+
notFoundBoundary: [],
|
|
546
|
+
layout: [],
|
|
547
|
+
parallel: [],
|
|
548
|
+
intercept: [],
|
|
549
|
+
loader: [],
|
|
550
|
+
};
|
|
551
|
+
/* We will throw if user is registring same route name twice */
|
|
552
|
+
invariant(ctx.manifest.get(name) === undefined, `Duplicate route name: ${name} at ${namespace}`);
|
|
553
|
+
/* Register route entry */
|
|
554
|
+
ctx.manifest.set(name, entry);
|
|
555
|
+
/* Run use and attach handlers */
|
|
556
|
+
if (use && typeof use === "function") {
|
|
557
|
+
const result = store.run(namespace, entry, use);
|
|
558
|
+
invariant(Array.isArray(result) && result.every((item) => isValidUseItem(item)), `route() use() callback must return an array of use items [${namespace}]`);
|
|
559
|
+
return { name: namespace, type: "route", uses: result };
|
|
560
|
+
}
|
|
561
|
+
/* typesafe item */
|
|
562
|
+
return { name: namespace, type: "route" };
|
|
563
|
+
};
|
|
564
|
+
const layout = (handler, use) => {
|
|
565
|
+
const store = getContext();
|
|
566
|
+
const ctx = store.getStore();
|
|
567
|
+
if (!ctx)
|
|
568
|
+
throw new Error("layout() must be called inside map()");
|
|
569
|
+
invariant(!ctx.parent || ctx.parent.type !== "parallel", "layout() cannot be used inside parallel()");
|
|
570
|
+
const isRoot = !ctx.parent || ctx.parent === null;
|
|
571
|
+
const nextIndex = isRoot ? "$root" : store.getNextIndex("layout");
|
|
572
|
+
const namespace = `${ctx.namespace}.${nextIndex}`;
|
|
573
|
+
const shortCode = store.getShortCode("layout");
|
|
574
|
+
// Unwrap static handler definition, extract the actual handler function
|
|
575
|
+
const isStatic = isStaticHandler(handler);
|
|
576
|
+
const unwrappedHandler = isStatic ? handler.handler : handler;
|
|
577
|
+
const urlPrefix = getUrlPrefix();
|
|
578
|
+
const entry = {
|
|
579
|
+
id: namespace,
|
|
580
|
+
shortCode,
|
|
581
|
+
type: "layout",
|
|
582
|
+
parent: ctx.parent,
|
|
583
|
+
handler: unwrappedHandler,
|
|
584
|
+
loading: undefined, // Allow loading() to attach loading state
|
|
585
|
+
middleware: [],
|
|
586
|
+
revalidate: [],
|
|
587
|
+
errorBoundary: [],
|
|
588
|
+
notFoundBoundary: [],
|
|
589
|
+
parallel: [],
|
|
590
|
+
intercept: [],
|
|
591
|
+
layout: [],
|
|
592
|
+
loader: [],
|
|
593
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
594
|
+
...(isStatic ? { isStaticPrerender: true } : {}),
|
|
595
|
+
};
|
|
596
|
+
// Run use callback if provided
|
|
597
|
+
let result;
|
|
598
|
+
if (use && typeof use === "function") {
|
|
599
|
+
result = store.run(namespace, entry, use);
|
|
600
|
+
invariant(Array.isArray(result) && result.every((item) => isValidUseItem(item)), `layout() use() callback must return an array of use items [${namespace}]`);
|
|
601
|
+
}
|
|
602
|
+
// Check if this is an orphan layout (no routes in children, including nested caches)
|
|
603
|
+
const hasRoutes = result &&
|
|
604
|
+
Array.isArray(result) &&
|
|
605
|
+
result.some((item) => hasRoutesInItem(item));
|
|
606
|
+
if (!hasRoutes) {
|
|
607
|
+
// Orphan layouts must not contain other layouts as children.
|
|
608
|
+
// If we're here, all child layouts are also orphan (if any had routes,
|
|
609
|
+
// hasRoutesInItem would have returned true). Nested orphan chains are
|
|
610
|
+
// confusing — use sibling orphan layouts instead.
|
|
611
|
+
if (result) {
|
|
612
|
+
invariant(!result.some((item) => item?.type === "layout"), `orphan layout cannot contain other layouts as children [${namespace}]`);
|
|
613
|
+
}
|
|
614
|
+
const parent = ctx.parent;
|
|
615
|
+
// Allow orphan layouts at root level if they're part of map() builder result
|
|
616
|
+
if (!parent || parent === null) {
|
|
617
|
+
if (!isRoot) {
|
|
618
|
+
invariant(false, `Orphan layout cannot be used at non-root level without parent [${namespace}]`);
|
|
619
|
+
}
|
|
620
|
+
// Root-level orphan is allowed (e.g., sibling layouts in map() builder)
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
// Has parent - register as orphan layout
|
|
624
|
+
invariant(parent.type === "route" ||
|
|
625
|
+
parent.type === "layout" ||
|
|
626
|
+
parent.type === "cache", `Orphan layouts can only be defined inside route or layout > check [${namespace}]`);
|
|
627
|
+
// Clear parent pointer for orphan layouts to prevent duplicate processing
|
|
628
|
+
entry.parent = null;
|
|
629
|
+
parent.layout.push(entry);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
if (result) {
|
|
633
|
+
return { name: namespace, type: "layout", uses: result };
|
|
634
|
+
}
|
|
635
|
+
return {
|
|
636
|
+
name: namespace,
|
|
637
|
+
type: "layout",
|
|
638
|
+
};
|
|
639
|
+
};
|
|
640
|
+
const isValidUseItem = (item) => {
|
|
641
|
+
return (typeof item === "undefined" ||
|
|
642
|
+
item === null ||
|
|
643
|
+
(item &&
|
|
644
|
+
typeof item === "object" &&
|
|
645
|
+
"type" in item &&
|
|
646
|
+
[
|
|
647
|
+
"layout",
|
|
648
|
+
"route",
|
|
649
|
+
"middleware",
|
|
650
|
+
"revalidate",
|
|
651
|
+
"parallel",
|
|
652
|
+
"intercept",
|
|
653
|
+
"loader",
|
|
654
|
+
"loading",
|
|
655
|
+
"errorBoundary",
|
|
656
|
+
"notFoundBoundary",
|
|
657
|
+
"when",
|
|
658
|
+
"cache",
|
|
659
|
+
"include", // For urls() include() helper
|
|
660
|
+
].includes(item.type)));
|
|
661
|
+
};
|
|
662
|
+
const isOrphanLayout = (item) => {
|
|
663
|
+
return (item.type === "layout" &&
|
|
664
|
+
!item.uses?.some((child) => hasRoutesInItem(child)));
|
|
665
|
+
};
|
|
666
|
+
/*
|
|
667
|
+
* Create revalidate helper
|
|
668
|
+
*/
|
|
669
|
+
const createRevalidateHelper = () => {
|
|
670
|
+
return revalidate;
|
|
671
|
+
};
|
|
672
|
+
/**
|
|
673
|
+
* Create errorBoundary helper
|
|
674
|
+
*/
|
|
675
|
+
const createErrorBoundaryHelper = () => {
|
|
676
|
+
return errorBoundary;
|
|
677
|
+
};
|
|
678
|
+
/**
|
|
679
|
+
* Create notFoundBoundary helper
|
|
680
|
+
*/
|
|
681
|
+
const createNotFoundBoundaryHelper = () => {
|
|
682
|
+
return notFoundBoundary;
|
|
683
|
+
};
|
|
684
|
+
/**
|
|
685
|
+
* Create middleware helper
|
|
686
|
+
*/
|
|
687
|
+
const createMiddlewareHelper = () => {
|
|
688
|
+
return middleware;
|
|
689
|
+
};
|
|
690
|
+
/**
|
|
691
|
+
* Create parallel helper
|
|
692
|
+
*/
|
|
693
|
+
const createParallelHelper = () => {
|
|
694
|
+
return parallel;
|
|
695
|
+
};
|
|
696
|
+
/**
|
|
697
|
+
* Create intercept helper
|
|
698
|
+
*/
|
|
699
|
+
const createInterceptHelper = () => {
|
|
700
|
+
return intercept;
|
|
701
|
+
};
|
|
702
|
+
/**
|
|
703
|
+
* Create loader helper
|
|
704
|
+
*/
|
|
705
|
+
const createLoaderHelper = () => {
|
|
706
|
+
return loaderFn;
|
|
707
|
+
};
|
|
708
|
+
/**
|
|
709
|
+
* Create loading helper
|
|
710
|
+
*/
|
|
711
|
+
const createLoadingHelper = () => {
|
|
712
|
+
return loadingFn;
|
|
713
|
+
};
|
|
714
|
+
/**
|
|
715
|
+
* Create route helper
|
|
716
|
+
*/
|
|
717
|
+
const createRouteHelper = () => {
|
|
718
|
+
return routeFn;
|
|
719
|
+
};
|
|
720
|
+
/**
|
|
721
|
+
* Create layout helper
|
|
722
|
+
*/
|
|
723
|
+
const createLayoutHelper = () => {
|
|
724
|
+
return layout;
|
|
725
|
+
};
|
|
726
|
+
/**
|
|
727
|
+
* Create when helper for intercept conditions
|
|
728
|
+
*/
|
|
729
|
+
const createWhenHelper = () => {
|
|
730
|
+
return when;
|
|
731
|
+
};
|
|
732
|
+
/**
|
|
733
|
+
* Create cache helper for cache configuration
|
|
734
|
+
*/
|
|
735
|
+
const createCacheHelper = () => {
|
|
736
|
+
return cache;
|
|
737
|
+
};
|
|
738
|
+
/**
|
|
739
|
+
* Type-safe handler definition helper
|
|
740
|
+
*
|
|
741
|
+
*/
|
|
742
|
+
export function map(builder) {
|
|
743
|
+
const handler = () => {
|
|
744
|
+
// Check if it's a builder function (array-based API)
|
|
745
|
+
invariant(typeof builder === "function", "map() expects a builder function as its argument");
|
|
746
|
+
// Create helpers
|
|
747
|
+
const helpers = {
|
|
748
|
+
route: createRouteHelper(),
|
|
749
|
+
layout: createLayoutHelper(),
|
|
750
|
+
parallel: createParallelHelper(),
|
|
751
|
+
intercept: createInterceptHelper(),
|
|
752
|
+
middleware: createMiddlewareHelper(),
|
|
753
|
+
revalidate: createRevalidateHelper(),
|
|
754
|
+
loader: createLoaderHelper(),
|
|
755
|
+
loading: createLoadingHelper(),
|
|
756
|
+
errorBoundary: createErrorBoundaryHelper(),
|
|
757
|
+
notFoundBoundary: createNotFoundBoundaryHelper(),
|
|
758
|
+
when: createWhenHelper(),
|
|
759
|
+
cache: createCacheHelper(),
|
|
760
|
+
};
|
|
761
|
+
return [layout(RootLayout, () => builder(helpers))].flat(3);
|
|
762
|
+
};
|
|
763
|
+
// Cast to RouteHandlers to carry the route type brand
|
|
764
|
+
return handler;
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* Create RouteHelpers for inline route definitions
|
|
768
|
+
* Used internally by router.map() for inline handler syntax
|
|
769
|
+
*/
|
|
770
|
+
export function createRouteHelpers() {
|
|
771
|
+
return {
|
|
772
|
+
route: createRouteHelper(),
|
|
773
|
+
layout: createLayoutHelper(),
|
|
774
|
+
parallel: createParallelHelper(),
|
|
775
|
+
intercept: createInterceptHelper(),
|
|
776
|
+
middleware: createMiddlewareHelper(),
|
|
777
|
+
revalidate: createRevalidateHelper(),
|
|
778
|
+
loader: createLoaderHelper(),
|
|
779
|
+
loading: createLoadingHelper(),
|
|
780
|
+
errorBoundary: createErrorBoundaryHelper(),
|
|
781
|
+
notFoundBoundary: createNotFoundBoundaryHelper(),
|
|
782
|
+
when: createWhenHelper(),
|
|
783
|
+
cache: createCacheHelper(),
|
|
784
|
+
};
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* Create a loader definition
|
|
788
|
+
*
|
|
789
|
+
* Loaders are RSC-compatible data fetchers that:
|
|
790
|
+
* - Run after middleware, before handlers
|
|
791
|
+
* - Are scoped to where attached (layout/route subtree)
|
|
792
|
+
* - Revalidate independently from UI segments
|
|
793
|
+
* - Are memoized per request (multiple ctx.use() calls return same value)
|
|
794
|
+
*
|
|
795
|
+
* Use the `"use server"` directive inside the loader function to ensure
|
|
796
|
+
* the function is stripped from client bundles.
|
|
797
|
+
*
|
|
798
|
+
* Return type is automatically inferred from the callback.
|
|
799
|
+
*
|
|
800
|
+
* @param fn - Async function that fetches data (should contain "use server" directive)
|
|
801
|
+
* @param fetchable - Optional flag to make the loader fetchable via useFetchLoader
|
|
802
|
+
*
|
|
803
|
+
* @example
|
|
804
|
+
* ```typescript
|
|
805
|
+
* // loaders/cart.ts - return type inferred from callback
|
|
806
|
+
* export const CartLoader = createLoader(async (ctx) => {
|
|
807
|
+
* "use server";
|
|
808
|
+
* const user = ctx.get("user");
|
|
809
|
+
* return await db.cart.get(user.id); // Return type inferred!
|
|
810
|
+
* });
|
|
811
|
+
*
|
|
812
|
+
* // loaders/product.ts - return type inferred
|
|
813
|
+
* export const ProductLoader = createLoader(async (ctx) => {
|
|
814
|
+
* "use server";
|
|
815
|
+
* const { slug } = ctx.params;
|
|
816
|
+
* return await db.products.findBySlug(slug); // Return type inferred!
|
|
817
|
+
* });
|
|
818
|
+
*
|
|
819
|
+
* // Usage in handlers
|
|
820
|
+
* layout(<ShopLayout />, () => [
|
|
821
|
+
* loader(CartLoader),
|
|
822
|
+
* loader(CartLoader, () => [
|
|
823
|
+
* revalidate(({ actionId }) => actionId?.includes("Cart") ?? false),
|
|
824
|
+
* ]),
|
|
825
|
+
* ])
|
|
826
|
+
*
|
|
827
|
+
* // Server-side access
|
|
828
|
+
* route("cart", (ctx) => {
|
|
829
|
+
* const cart = ctx.use(CartLoader);
|
|
830
|
+
* return <CartPage cart={cart} />;
|
|
831
|
+
* });
|
|
832
|
+
*
|
|
833
|
+
* // Client-side access
|
|
834
|
+
* const cart = useLoader(CartLoader);
|
|
835
|
+
* ```
|
|
836
|
+
*/
|
|
837
|
+
// Re-export createLoader from loader.rsc.ts for RSC/server context
|
|
838
|
+
export { createLoader } from "./loader.rsc.js";
|
|
839
|
+
/**
|
|
840
|
+
* Create a soft redirect Response for middleware short-circuit
|
|
841
|
+
*
|
|
842
|
+
* Returns a Response that signals a client-side navigation to the target URL.
|
|
843
|
+
* Unlike Response.redirect() which causes a full page reload, this redirect
|
|
844
|
+
* is handled by the router for SPA-style navigation.
|
|
845
|
+
*
|
|
846
|
+
* @param url - The URL to redirect to
|
|
847
|
+
* @param status - HTTP status code (default: 302)
|
|
848
|
+
*
|
|
849
|
+
* @example
|
|
850
|
+
* ```typescript
|
|
851
|
+
* middleware((ctx, next) => {
|
|
852
|
+
* if (!ctx.get('user')) {
|
|
853
|
+
* return redirect('/login');
|
|
854
|
+
* }
|
|
855
|
+
* next();
|
|
856
|
+
* })
|
|
857
|
+
* ```
|
|
858
|
+
*/
|
|
859
|
+
export function redirect(url, status = 302) {
|
|
860
|
+
return new Response(null, {
|
|
861
|
+
status,
|
|
862
|
+
headers: {
|
|
863
|
+
Location: url,
|
|
864
|
+
"X-RSC-Redirect": "soft",
|
|
865
|
+
},
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
//# sourceMappingURL=route-definition.js.map
|