@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.20dbba0c
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 +972 -4
- 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/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -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 +1689 -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/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/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 +5320 -834
- 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/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +92 -55
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +173 -231
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +88 -58
- package/skills/fonts/SKILL.md +167 -0
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +420 -67
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +243 -202
- package/skills/layout/SKILL.md +262 -146
- package/skills/links/SKILL.md +313 -0
- package/skills/loader/SKILL.md +525 -251
- package/skills/middleware/SKILL.md +248 -320
- package/skills/migrate-nextjs/SKILL.md +560 -0
- package/skills/migrate-react-router/SKILL.md +765 -0
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +393 -158
- package/skills/prerender/SKILL.md +685 -0
- package/skills/rango/SKILL.md +120 -0
- package/skills/response-routes/SKILL.md +419 -0
- package/skills/route/SKILL.md +388 -89
- package/skills/router-setup/SKILL.md +388 -267
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +456 -173
- 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/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +383 -557
- package/src/browser/navigation-client.ts +229 -68
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +391 -304
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +258 -74
- package/src/browser/react/NavigationProvider.tsx +219 -33
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- 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 +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -95
- package/src/browser/react/use-href.tsx +20 -188
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +49 -80
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +83 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +251 -70
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +510 -588
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +176 -58
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +39 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +291 -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 +418 -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 +618 -0
- package/src/build/route-types/scan-filter.ts +85 -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 +342 -0
- package/src/cache/cache-scope.ts +167 -309
- package/src/cache/cf/cf-cache-store.ts +573 -21
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- 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 +153 -0
- package/src/cache/types.ts +76 -121
- package/src/client.rsc.tsx +12 -15
- package/src/client.tsx +142 -308
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +156 -0
- package/src/debug.ts +243 -0
- package/src/errors.ts +108 -2
- package/src/handle.ts +74 -19
- package/src/handles/MetaTags.tsx +76 -23
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +32 -15
- 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 +141 -47
- package/src/index.rsc.ts +187 -28
- package/src/index.ts +271 -38
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +27 -142
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +186 -0
- package/src/prerender.ts +524 -0
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +355 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +9 -11
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +478 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +247 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +88 -9
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +457 -88
- package/src/router/intercept-resolution.ts +402 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +360 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +187 -43
- package/src/router/match-api.ts +555 -0
- package/src/router/match-context.ts +6 -4
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +460 -10
- package/src/router/match-middleware/cache-store.ts +98 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +80 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +135 -36
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +200 -0
- package/src/router/middleware.ts +359 -333
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +375 -33
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +45 -23
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1379 -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 +291 -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 +245 -0
- package/src/router/types.ts +79 -4
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +750 -3572
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +934 -801
- package/src/rsc/helpers.ts +181 -19
- package/src/rsc/index.ts +5 -25
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +393 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +253 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +358 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +48 -14
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +165 -81
- package/src/server/context.ts +384 -61
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +117 -20
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +603 -109
- package/src/server.ts +36 -131
- package/src/ssr/index.tsx +160 -25
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +11 -4
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +5 -31
- package/src/theme/theme-script.ts +21 -18
- package/src/theme/types.ts +1 -1
- 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 +759 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1561
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -726
- package/src/use-loader.tsx +161 -81
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +348 -0
- package/src/vite/discovery/prerender-collection.ts +439 -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 +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +18 -785
- package/src/vite/plugin-types.ts +103 -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/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -53
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -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 +786 -0
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -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 +266 -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 +483 -0
- package/src/vite/router-discovery.ts +977 -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/{package-resolution.ts → utils/package-resolution.ts} +58 -29
- package/src/vite/utils/prerender-utils.ts +221 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -7
- package/src/__tests__/component-utils.test.ts +0 -76
- package/src/__tests__/route-definition.test.ts +0 -63
- package/src/__tests__/urls.test.tsx +0 -436
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/__tests__/document-cache.test.ts +0 -522
- package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
- package/src/cache/__tests__/memory-store.test.ts +0 -484
- package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
- package/src/cache/memory-store.ts +0 -253
- package/src/href.ts +0 -177
- package/src/route-utils.ts +0 -89
- package/src/router/__tests__/match-context.test.ts +0 -104
- package/src/router/__tests__/match-pipelines.test.ts +0 -537
- package/src/router/__tests__/match-result.test.ts +0 -566
- package/src/router/__tests__/on-error.test.ts +0 -935
- package/src/router/__tests__/pattern-matching.test.ts +0 -577
- package/src/router/middleware.test.ts +0 -1355
- package/src/rsc/__tests__/helpers.test.ts +0 -175
- package/src/server/__tests__/request-context.test.ts +0 -171
- package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
- package/src/theme/__tests__/theme.test.ts +0 -120
- package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -357
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/skills/loader/SKILL.md
CHANGED
|
@@ -1,365 +1,639 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: loader
|
|
3
3
|
description: Define data loaders for fetching data in routes with createLoader
|
|
4
|
-
argument-hint: [loader
|
|
4
|
+
argument-hint: [loader]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# Data Loaders
|
|
7
|
+
# Data Loaders with loader()
|
|
8
8
|
|
|
9
|
-
Loaders fetch data
|
|
9
|
+
Loaders fetch data on the server and stream it to the client.
|
|
10
10
|
|
|
11
11
|
## Creating a Loader
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
|
-
import { createLoader
|
|
14
|
+
import { createLoader } from "@rangojs/router";
|
|
15
15
|
|
|
16
16
|
export const ProductLoader = createLoader(async (ctx) => {
|
|
17
|
-
|
|
18
|
-
where: { slug: ctx.params.slug },
|
|
19
|
-
});
|
|
17
|
+
"use server";
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
const product = await ctx.env.DB.prepare(
|
|
20
|
+
"SELECT * FROM products WHERE slug = ?",
|
|
21
|
+
)
|
|
22
|
+
.bind(ctx.params.slug)
|
|
23
|
+
.first();
|
|
24
24
|
|
|
25
|
-
return product;
|
|
25
|
+
return { product };
|
|
26
26
|
});
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
### Supported export patterns
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
All of the following are equivalent and fully supported by the Vite transform:
|
|
32
32
|
|
|
33
33
|
```typescript
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
ctx.query; // Query string parameters
|
|
37
|
-
ctx.url; // Full URL object
|
|
38
|
-
ctx.pathname; // Current path
|
|
39
|
-
ctx.method; // HTTP method
|
|
40
|
-
ctx.request; // Raw Request object
|
|
41
|
-
|
|
42
|
-
// Variables from middleware
|
|
43
|
-
const user = ctx.get("user");
|
|
34
|
+
// Direct export (most common)
|
|
35
|
+
export const ProductLoader = createLoader(handler);
|
|
44
36
|
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
// Separate declaration + named export
|
|
38
|
+
const ProductLoader = createLoader(handler);
|
|
39
|
+
export { ProductLoader };
|
|
47
40
|
|
|
48
|
-
|
|
49
|
-
|
|
41
|
+
// Aliased export
|
|
42
|
+
const InternalLoader = createLoader(handler);
|
|
43
|
+
export { InternalLoader as ProductLoader };
|
|
44
|
+
|
|
45
|
+
// Aliased import
|
|
46
|
+
import { createLoader as cl } from "@rangojs/router";
|
|
47
|
+
export const ProductLoader = cl(handler);
|
|
50
48
|
```
|
|
51
49
|
|
|
52
|
-
|
|
50
|
+
The `export const` form and the `const + export { }` form both work for
|
|
51
|
+
client stubs, ID injection, and loader manifest tracking.
|
|
52
|
+
|
|
53
|
+
## Using Loaders in Routes
|
|
53
54
|
|
|
54
55
|
```typescript
|
|
55
|
-
import {
|
|
56
|
-
import { ProductLoader } from "
|
|
57
|
-
|
|
58
|
-
export
|
|
59
|
-
|
|
60
|
-
const product = await ctx.use(ProductLoader);
|
|
61
|
-
return <ProductPage product={product} />;
|
|
62
|
-
}, () => [
|
|
56
|
+
import { urls } from "@rangojs/router";
|
|
57
|
+
import { ProductLoader } from "./loaders/product";
|
|
58
|
+
|
|
59
|
+
export const urlpatterns = urls(({ path, loader }) => [
|
|
60
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
63
61
|
loader(ProductLoader),
|
|
64
|
-
loading(<ProductSkeleton />),
|
|
65
62
|
]),
|
|
66
63
|
]);
|
|
67
64
|
```
|
|
68
65
|
|
|
69
|
-
## Loader
|
|
66
|
+
## Consuming Loader Data
|
|
70
67
|
|
|
71
|
-
|
|
68
|
+
Register loaders with `loader()` in the DSL and consume them in client
|
|
69
|
+
components with `useLoader()`. This is the recommended pattern — it keeps
|
|
70
|
+
data fetching on the server and consumption on the client, with a clean
|
|
71
|
+
separation that works correctly with `cache()`.
|
|
72
72
|
|
|
73
73
|
```typescript
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return db.users.findUnique({ where: { id: userId } });
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
middleware: [
|
|
81
|
-
async (ctx, next) => {
|
|
82
|
-
const userId = ctx.params.id;
|
|
83
|
-
|
|
84
|
-
// Validate user ID
|
|
85
|
-
if (!isValidUUID(userId)) {
|
|
86
|
-
throw new Error("Invalid user ID");
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
ctx.set("validatedUserId", userId);
|
|
90
|
-
await next();
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
}
|
|
94
|
-
);
|
|
95
|
-
```
|
|
74
|
+
"use client";
|
|
75
|
+
import { useLoader } from "@rangojs/router/client";
|
|
76
|
+
import { ProductLoader } from "./loaders/product";
|
|
96
77
|
|
|
97
|
-
|
|
78
|
+
function ProductDetails() {
|
|
79
|
+
const { data } = useLoader(ProductLoader);
|
|
80
|
+
return <div>{data.product.description}</div>;
|
|
81
|
+
}
|
|
82
|
+
```
|
|
98
83
|
|
|
99
84
|
```typescript
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
85
|
+
// Route definition — loader() registration required
|
|
86
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
87
|
+
loader(ProductLoader),
|
|
88
|
+
]);
|
|
89
|
+
```
|
|
103
90
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
]);
|
|
91
|
+
DSL loaders are the **live data layer** — they resolve fresh on every
|
|
92
|
+
request, even when the route is inside a `cache()` boundary. The router
|
|
93
|
+
excludes them from the segment cache at storage time and re-resolves them
|
|
94
|
+
on retrieval. This means `cache()` gives you cached UI + fresh data by
|
|
95
|
+
default.
|
|
110
96
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
97
|
+
### Cache safety
|
|
98
|
+
|
|
99
|
+
DSL loaders can safely read `createVar({ cache: false })` variables
|
|
100
|
+
because they are always resolved fresh. The read guard is bypassed for
|
|
101
|
+
loader functions — they never produce stale data.
|
|
102
|
+
|
|
103
|
+
### ctx.use(Loader) — escape hatch
|
|
104
|
+
|
|
105
|
+
For cases where you need loader data in the server handler itself (e.g.,
|
|
106
|
+
to set ctx variables or make routing decisions), use `ctx.use(Loader)`:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
path("/product/:slug", async (ctx) => {
|
|
110
|
+
const { product } = await ctx.use(ProductLoader);
|
|
111
|
+
ctx.set(Product, product); // make available to children
|
|
112
|
+
return <ProductPage />;
|
|
113
|
+
}, { name: "product" }, () => [
|
|
114
|
+
loader(ProductLoader), // still register for client consumption
|
|
122
115
|
])
|
|
123
116
|
```
|
|
124
117
|
|
|
125
|
-
|
|
118
|
+
When you register with `loader()` in the DSL, `ctx.use()` returns the
|
|
119
|
+
same memoized result — loaders never run twice per request.
|
|
120
|
+
|
|
121
|
+
**Limitations of ctx.use(Loader):**
|
|
122
|
+
|
|
123
|
+
- The handler output depends on the loader data. If the route is inside
|
|
124
|
+
`cache()`, the handler is cached with the loader result baked in —
|
|
125
|
+
defeating the live data guarantee.
|
|
126
|
+
- Non-cacheable variable reads (`createVar({ cache: false })`) inside the
|
|
127
|
+
handler still throw, even if the data came from a loader.
|
|
128
|
+
- Prefer DSL `loader()` + client `useLoader()` for data that depends on
|
|
129
|
+
non-cacheable context variables.
|
|
126
130
|
|
|
127
|
-
|
|
131
|
+
**Never use `useLoader()` in server components** — it is a client-only API.
|
|
132
|
+
|
|
133
|
+
### Summary
|
|
134
|
+
|
|
135
|
+
| Pattern | API | Cache-safe | Recommended |
|
|
136
|
+
| ---------------------- | ------------------- | ---------- | ----------- |
|
|
137
|
+
| DSL + client component | `useLoader(Loader)` | Yes | Yes |
|
|
138
|
+
| Handler escape hatch | `ctx.use(Loader)` | No | When needed |
|
|
139
|
+
|
|
140
|
+
## Loader Context
|
|
141
|
+
|
|
142
|
+
Loaders receive the same context shape as route handlers.
|
|
143
|
+
|
|
144
|
+
### Full field surface
|
|
145
|
+
|
|
146
|
+
| Field | Type | Notes |
|
|
147
|
+
| -------------- | ------------------------------ | --------------------------------------------------------------------------------------------------- |
|
|
148
|
+
| `params` | `TParams` | Merged route + explicit loader params; overridable by fetchable `load({ params })`. |
|
|
149
|
+
| `routeParams` | `Record<string, string>` | Server-trusted route params from URL pattern matching; cannot be overridden. |
|
|
150
|
+
| `request` | `Request` | The incoming `Request` (headers, method, body, `signal` for abort). |
|
|
151
|
+
| `url` | `URL` | Parsed request URL. |
|
|
152
|
+
| `pathname` | `string` | URL pathname (shortcut for `ctx.url.pathname`). |
|
|
153
|
+
| `searchParams` | `URLSearchParams` | Shortcut for `ctx.url.searchParams`. |
|
|
154
|
+
| `search` | `ResolveSearchSchema<TSearch>` | Typed query params when a search schema is declared on the route; `{}` otherwise. |
|
|
155
|
+
| `env` | `TEnv` | Plain bindings from `createRouter<TEnv>()` (DB, KV, secrets, etc.). |
|
|
156
|
+
| `get` | `(key \| ContextVar) => value` | Reads variables/context-vars set by middleware. |
|
|
157
|
+
| `use` | `(loader \| handle) => T` | Access another loader's data (Promise) or a handle's collected data (after `await ctx.rendered()`). |
|
|
158
|
+
| `rendered` | `() => Promise<void>` | **Experimental.** DSL loaders only — waits for non-loader segments before reading handle data. |
|
|
159
|
+
| `method` | `string` | HTTP method. `"GET"` for SSR loader runs; reflects real method for fetchable loaders. |
|
|
160
|
+
| `body` | `TBody \| undefined` | Parsed request body for fetchable POST/PUT/PATCH/DELETE calls. |
|
|
161
|
+
| `formData` | `FormData \| undefined` | Present when a fetchable loader is invoked via form submission. |
|
|
162
|
+
| `reverse` | `ScopedReverseFunction` | Generate type-checked URLs from route names (same scoped semantics as route handlers). |
|
|
163
|
+
|
|
164
|
+
### Example
|
|
128
165
|
|
|
129
166
|
```typescript
|
|
130
|
-
|
|
131
|
-
|
|
167
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
168
|
+
"use server";
|
|
132
169
|
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
currentParams.slug !== nextParams.slug
|
|
136
|
-
),
|
|
170
|
+
// URL params (may include client-provided overrides for fetchable loaders)
|
|
171
|
+
const { slug } = ctx.params;
|
|
137
172
|
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
173
|
+
// Server-trusted route params (from URL pattern matching, cannot be overridden)
|
|
174
|
+
const { slug: trustedSlug } = ctx.routeParams;
|
|
175
|
+
|
|
176
|
+
// Query params
|
|
177
|
+
const variant = ctx.url.searchParams.get("variant");
|
|
178
|
+
|
|
179
|
+
// Platform bindings (DB, KV, etc.) — plain bindings from createRouter<TEnv>()
|
|
180
|
+
const db = ctx.env.DB;
|
|
181
|
+
|
|
182
|
+
// Request headers
|
|
183
|
+
const auth = ctx.request.headers.get("Authorization");
|
|
184
|
+
|
|
185
|
+
// Variables set by middleware (from RSCRouter.Vars augmentation)
|
|
186
|
+
const user = ctx.get("user");
|
|
187
|
+
|
|
188
|
+
// Type-checked URLs for payloads. `.name` resolves within the current
|
|
189
|
+
// include() scope; a bare `name` resolves globally. See /route and
|
|
190
|
+
// /typesafety for scope rules and route-name autocomplete.
|
|
191
|
+
const detailUrl = ctx.reverse(".detail", { slug });
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
product: await fetchProduct(slug),
|
|
195
|
+
links: { self: detailUrl },
|
|
196
|
+
};
|
|
197
|
+
});
|
|
143
198
|
```
|
|
144
199
|
|
|
145
|
-
|
|
200
|
+
See `/route` for the full handler-context contract (shared with loaders) and
|
|
201
|
+
`/typesafety` for route-name typing that powers `ctx.reverse` autocomplete.
|
|
202
|
+
|
|
203
|
+
### params vs routeParams
|
|
204
|
+
|
|
205
|
+
- `ctx.params` — merged route params + explicit loader params. For fetchable
|
|
206
|
+
loaders called with `load(Loader, { params: { ... } })`, explicit params
|
|
207
|
+
override route-matched params.
|
|
208
|
+
- `ctx.routeParams` — server-trusted route params from URL pattern matching.
|
|
209
|
+
Cannot be overridden by client-provided params.
|
|
210
|
+
|
|
211
|
+
Use `ctx.routeParams` when you need trusted route identity for authorization
|
|
212
|
+
or resource scoping:
|
|
146
213
|
|
|
147
214
|
```typescript
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
return currentParams.id !== nextParams.id; // boolean
|
|
151
|
-
});
|
|
215
|
+
export const OrderLoader = createLoader(async (ctx) => {
|
|
216
|
+
"use server";
|
|
152
217
|
|
|
153
|
-
//
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
218
|
+
// Use routeParams for auth checks — client cannot spoof the URL-matched ID
|
|
219
|
+
const { orderId } = ctx.routeParams;
|
|
220
|
+
const user = ctx.get("user");
|
|
221
|
+
|
|
222
|
+
const order = await db.orders.get(orderId);
|
|
223
|
+
if (order.userId !== user.id)
|
|
224
|
+
throw new Response("Forbidden", { status: 403 });
|
|
225
|
+
|
|
226
|
+
return { order };
|
|
160
227
|
});
|
|
161
228
|
```
|
|
162
229
|
|
|
163
|
-
##
|
|
230
|
+
## Loader with Children
|
|
164
231
|
|
|
165
|
-
|
|
232
|
+
Add caching or revalidation to specific loaders:
|
|
166
233
|
|
|
167
|
-
```
|
|
168
|
-
"
|
|
169
|
-
|
|
170
|
-
|
|
234
|
+
```typescript
|
|
235
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
236
|
+
// Cached loader
|
|
237
|
+
loader(ProductLoader, () => [cache({ ttl: 300 })]),
|
|
171
238
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
239
|
+
// Loader with revalidation control
|
|
240
|
+
loader(RelatedProductsLoader, () => [
|
|
241
|
+
revalidate(() => false), // Never revalidate
|
|
242
|
+
]),
|
|
243
|
+
|
|
244
|
+
// Loader that revalidates after cart actions
|
|
245
|
+
loader(CartLoader, () => [
|
|
246
|
+
revalidate(({ actionId }) => actionId?.includes("Cart") ?? false),
|
|
247
|
+
]),
|
|
248
|
+
]);
|
|
177
249
|
```
|
|
178
250
|
|
|
179
|
-
###
|
|
251
|
+
### Revalidation Contracts for Loader Dependencies
|
|
180
252
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
import { useFetchLoader } from "rsc-router";
|
|
184
|
-
import { SearchLoader } from "../loaders/search";
|
|
253
|
+
If a loader reads `ctx.get()` data produced by an outer handler/layout, share
|
|
254
|
+
the same named revalidation contract across producer and consumer segments.
|
|
185
255
|
|
|
186
|
-
|
|
187
|
-
|
|
256
|
+
```typescript
|
|
257
|
+
// revalidation-contracts.ts
|
|
258
|
+
export const revalidateAccountScope = ({ actionId }) =>
|
|
259
|
+
actionId?.includes("src/actions/account.ts#") ?? false;
|
|
260
|
+
|
|
261
|
+
layout(AccountLayout, () => [
|
|
262
|
+
revalidate(revalidateAccountScope), // producer reruns
|
|
263
|
+
path("/account/orders", OrdersPage, { name: "account.orders" }, () => [
|
|
264
|
+
loader(OrdersLoader, () => [
|
|
265
|
+
revalidate(revalidateAccountScope), // consumer reruns
|
|
266
|
+
]),
|
|
267
|
+
]),
|
|
268
|
+
]);
|
|
269
|
+
```
|
|
188
270
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
};
|
|
271
|
+
For segments that depend on multiple upstream domains, compose multiple
|
|
272
|
+
contracts on both sides.
|
|
192
273
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
274
|
+
To keep loader route trees concise, export helper wrappers:
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
import { revalidate } from "@rangojs/router";
|
|
278
|
+
|
|
279
|
+
export const revalidateAccount = () => [revalidate(revalidateAccountScope)];
|
|
280
|
+
|
|
281
|
+
layout(AccountLayout, () => [
|
|
282
|
+
revalidateAccount(),
|
|
283
|
+
path("/account/orders", OrdersPage, { name: "account.orders" }, () => [
|
|
284
|
+
loader(OrdersLoader, () => [revalidateAccount()]),
|
|
285
|
+
]),
|
|
286
|
+
]);
|
|
201
287
|
```
|
|
202
288
|
|
|
203
|
-
##
|
|
289
|
+
## Loaders: The Live Data Layer
|
|
290
|
+
|
|
291
|
+
Loaders are the live data layer of the router. They resolve fresh on every
|
|
292
|
+
request, even when the route's UI segments are served from cache. This is a
|
|
293
|
+
core design principle — route-level `cache()` caches rendered components but
|
|
294
|
+
never caches loader data. Loaders are excluded at storage time and re-resolved
|
|
295
|
+
on retrieval.
|
|
296
|
+
|
|
297
|
+
This means `cache()` gives you cached UI + fresh data by default. Pre-rendering
|
|
298
|
+
follows the same rule: at build time, loaders are skipped entirely (there is no
|
|
299
|
+
real request context), and at runtime the worker resolves them fresh against
|
|
300
|
+
the live database.
|
|
204
301
|
|
|
205
|
-
|
|
302
|
+
### Opting a Loader into Caching
|
|
303
|
+
|
|
304
|
+
To cache a specific loader's data, attach a `cache()` child:
|
|
206
305
|
|
|
207
306
|
```typescript
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
// Immediate data
|
|
211
|
-
product: await db.products.findUnique({ where: { id: ctx.params.id } }),
|
|
307
|
+
loader(ProductLoader, () => [cache({ ttl: 300 })]),
|
|
308
|
+
```
|
|
212
309
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
310
|
+
The loader's data is cached independently from the route's segment cache,
|
|
311
|
+
using the same `SegmentCacheStore` (app-level or per-loader override).
|
|
312
|
+
|
|
313
|
+
Values are serialized through RSC Flight, so loaders can return ReactNode,
|
|
314
|
+
Promises, null, and any RSC-serializable type — all round-trip correctly
|
|
315
|
+
through the cache.
|
|
316
|
+
|
|
317
|
+
### Cache Key
|
|
318
|
+
|
|
319
|
+
The default cache key is `loader:{loaderId}:{pathname}:{sortedParams}`.
|
|
320
|
+
This can be customized at two levels:
|
|
321
|
+
|
|
322
|
+
```typescript
|
|
323
|
+
// Full override — key function replaces the default entirely
|
|
324
|
+
loader(ProductLoader, () => [
|
|
325
|
+
cache({
|
|
326
|
+
ttl: 300,
|
|
327
|
+
key: (ctx) => `product:${ctx.params.slug}:${cookies().get("locale")?.value ?? "en"}`,
|
|
328
|
+
}),
|
|
329
|
+
]),
|
|
330
|
+
|
|
331
|
+
// Store-level keyGenerator — modifies the default key (e.g., adds a region prefix)
|
|
332
|
+
// Set in the store configuration, applies to all entries in that store
|
|
217
333
|
```
|
|
218
334
|
|
|
219
|
-
|
|
335
|
+
Resolution priority (same as route-level `cache()`):
|
|
336
|
+
|
|
337
|
+
1. `key(ctx)` from cache options — full override
|
|
338
|
+
2. `store.keyGenerator(ctx, defaultKey)` — store-level modification
|
|
339
|
+
3. Default key — `loader:{id}:{pathname}:{params}`
|
|
340
|
+
|
|
341
|
+
If a custom key function throws, it falls back to the default key silently
|
|
342
|
+
(logged to console.error).
|
|
343
|
+
|
|
344
|
+
### Tags for Invalidation
|
|
220
345
|
|
|
221
346
|
```typescript
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
347
|
+
// Static tags
|
|
348
|
+
loader(ProductLoader, () => [
|
|
349
|
+
cache({ ttl: 300, tags: ["products", "catalog"] }),
|
|
350
|
+
]),
|
|
351
|
+
|
|
352
|
+
// Dynamic tags
|
|
353
|
+
loader(ProductLoader, () => [
|
|
354
|
+
cache({
|
|
355
|
+
ttl: 300,
|
|
356
|
+
tags: (ctx) => [`product:${ctx.params.slug}`, "products"],
|
|
357
|
+
}),
|
|
358
|
+
]),
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Stale-While-Revalidate
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
loader(ProductLoader, () => [
|
|
365
|
+
cache({ ttl: 60, swr: 300 }),
|
|
366
|
+
]),
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
During the SWR window (60-360s), stale data is returned immediately while
|
|
370
|
+
fresh data is fetched in the background via `waitUntil`. After the SWR window
|
|
371
|
+
expires (360s+), the entry is treated as a cache miss.
|
|
372
|
+
|
|
373
|
+
### Conditional Caching
|
|
374
|
+
|
|
375
|
+
Skip the cache at runtime based on request properties:
|
|
376
|
+
|
|
377
|
+
```typescript
|
|
378
|
+
loader(ProductLoader, () => [
|
|
379
|
+
cache({
|
|
380
|
+
ttl: 300,
|
|
381
|
+
condition: (ctx) => !ctx.request.headers.has("authorization"),
|
|
382
|
+
}),
|
|
383
|
+
]),
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
When `condition` returns false, the loader runs fresh and the cache is bypassed
|
|
387
|
+
entirely (no read, no write).
|
|
388
|
+
|
|
389
|
+
### Per-Loader Store Override
|
|
230
390
|
|
|
231
|
-
|
|
232
|
-
|
|
391
|
+
```typescript
|
|
392
|
+
const hotStore = new MemorySegmentCacheStore({ defaults: { ttl: 10 } });
|
|
393
|
+
|
|
394
|
+
loader(PricingLoader, () => [
|
|
395
|
+
cache({ store: hotStore }),
|
|
396
|
+
]),
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
Without an explicit store, the loader uses the app-level store from the
|
|
400
|
+
handler config (`cache.store`).
|
|
401
|
+
|
|
402
|
+
## Multiple Loaders
|
|
403
|
+
|
|
404
|
+
Routes can have multiple loaders that run in parallel:
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
233
408
|
loader(ProductLoader),
|
|
234
|
-
|
|
409
|
+
loader(RelatedProductsLoader),
|
|
410
|
+
loader(ReviewsLoader),
|
|
411
|
+
]);
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Layout Loaders
|
|
415
|
+
|
|
416
|
+
Loaders on layouts are shared by all child routes:
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
layout(<ShopLayout />, () => [
|
|
420
|
+
// These loaders are available to all shop routes
|
|
421
|
+
loader(CartLoader),
|
|
422
|
+
loader(CategoriesLoader),
|
|
423
|
+
|
|
424
|
+
path("/shop", ShopIndex, { name: "index" }),
|
|
425
|
+
path("/shop/product/:slug", ProductPage, { name: "product" }),
|
|
235
426
|
])
|
|
236
427
|
```
|
|
237
428
|
|
|
238
|
-
##
|
|
429
|
+
## Passing Loaders as Props
|
|
430
|
+
|
|
431
|
+
Loaders can be passed as props from server to client components. RSC serialization
|
|
432
|
+
uses `toJSON()` to send only `{ __brand, $$id }` — the loader function is stripped.
|
|
239
433
|
|
|
240
434
|
```typescript
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
const product = await db.products.findUnique({
|
|
244
|
-
where: { slug: ctx.params.slug },
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
if (!product) {
|
|
248
|
-
throw notFound("Product not found");
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return product;
|
|
252
|
-
} catch (error) {
|
|
253
|
-
if (error instanceof DatabaseError) {
|
|
254
|
-
throw new Error("Failed to load product");
|
|
255
|
-
}
|
|
256
|
-
throw error;
|
|
257
|
-
}
|
|
258
|
-
});
|
|
435
|
+
// Server component (route handler)
|
|
436
|
+
import { SlowLoader } from "../loaders";
|
|
259
437
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
errorBoundary(({ error, reset }) => (
|
|
264
|
-
<div>
|
|
265
|
-
<p>Error loading product: {error.message}</p>
|
|
266
|
-
<button onClick={reset}>Retry</button>
|
|
267
|
-
</div>
|
|
268
|
-
)),
|
|
438
|
+
path("/dashboard", () => <DashboardContent loader={SlowLoader} />, { name: "dashboard" }, () => [
|
|
439
|
+
loader(SlowLoader),
|
|
440
|
+
loading(<DashboardSkeleton />),
|
|
269
441
|
])
|
|
442
|
+
|
|
443
|
+
// Client component — use typeof for type-safe props
|
|
444
|
+
"use client";
|
|
445
|
+
import { useLoader } from "@rangojs/router/client";
|
|
446
|
+
import type { SlowLoader } from "../loaders";
|
|
447
|
+
|
|
448
|
+
function DashboardContent({ loader }: { loader: typeof SlowLoader }) {
|
|
449
|
+
const { data } = useLoader(loader);
|
|
450
|
+
return <div>{data.message}</div>;
|
|
451
|
+
}
|
|
270
452
|
```
|
|
271
453
|
|
|
272
|
-
|
|
454
|
+
Use `typeof MyLoader` for the prop type — it infers the full generic automatically.
|
|
455
|
+
|
|
456
|
+
## Streaming with Suspense
|
|
457
|
+
|
|
458
|
+
Loaders stream data. Use Suspense for loading states:
|
|
273
459
|
|
|
274
460
|
```typescript
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
)
|
|
461
|
+
// In route definition
|
|
462
|
+
path("/product/:slug", ProductPage, { name: "product" }, () => [
|
|
463
|
+
loader(ProductLoader),
|
|
464
|
+
loading(<ProductSkeleton />), // Shows while loader streams
|
|
465
|
+
])
|
|
466
|
+
|
|
467
|
+
// Or in component
|
|
468
|
+
function ProductPage() {
|
|
469
|
+
return (
|
|
470
|
+
<Suspense fallback={<ProductSkeleton />}>
|
|
471
|
+
<ProductDetails />
|
|
472
|
+
</Suspense>
|
|
473
|
+
);
|
|
474
|
+
}
|
|
288
475
|
```
|
|
289
476
|
|
|
290
|
-
##
|
|
477
|
+
## Fetchable Loaders
|
|
478
|
+
|
|
479
|
+
By default, loaders only run during SSR and navigation. Pass `true` as the second
|
|
480
|
+
argument to `createLoader` to make a loader **fetchable** — callable from the client
|
|
481
|
+
via `useFetchLoader()` and `load()`:
|
|
291
482
|
|
|
292
483
|
```typescript
|
|
293
|
-
|
|
294
|
-
export const UserLoader = createLoader(async (ctx) => {
|
|
295
|
-
return db.users.findUnique({ where: { id: ctx.get("userId") } });
|
|
296
|
-
});
|
|
484
|
+
import { createLoader } from "@rangojs/router";
|
|
297
485
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
const user = await ctx.use(UserLoader);
|
|
301
|
-
const orders = await db.orders.findMany({
|
|
302
|
-
where: { userId: user.id },
|
|
303
|
-
});
|
|
486
|
+
export const SearchLoader = createLoader(async (ctx) => {
|
|
487
|
+
"use server";
|
|
304
488
|
|
|
305
|
-
|
|
306
|
-
|
|
489
|
+
const query = ctx.params.query ?? "";
|
|
490
|
+
const results = await ctx.env.DB.prepare(
|
|
491
|
+
"SELECT * FROM products WHERE name LIKE ?",
|
|
492
|
+
)
|
|
493
|
+
.bind(`%${query}%`)
|
|
494
|
+
.all();
|
|
495
|
+
|
|
496
|
+
return { results: results.results ?? [] };
|
|
497
|
+
}, true); // true = fetchable
|
|
307
498
|
```
|
|
308
499
|
|
|
309
|
-
|
|
500
|
+
### Fetchable Loader with Middleware
|
|
501
|
+
|
|
502
|
+
Pass an options object instead of `true` to attach per-loader middleware.
|
|
503
|
+
This middleware runs only on `_rsc_loader` fetch requests (client-side
|
|
504
|
+
`load()` / `useFetchLoader()` calls), not during SSR `ctx.use()` execution:
|
|
310
505
|
|
|
311
506
|
```typescript
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
});
|
|
507
|
+
import { createLoader } from "@rangojs/router";
|
|
508
|
+
import { authMiddleware } from "../middleware/auth";
|
|
509
|
+
import { rateLimitMiddleware } from "../middleware/rate-limit";
|
|
316
510
|
|
|
317
|
-
|
|
318
|
-
|
|
511
|
+
export const ProtectedLoader = createLoader(
|
|
512
|
+
async (ctx) => {
|
|
513
|
+
"use server";
|
|
319
514
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
515
|
+
const user = ctx.get("user");
|
|
516
|
+
return { orders: await db.orders.list(user.id) };
|
|
517
|
+
},
|
|
518
|
+
{ middleware: [authMiddleware, rateLimitMiddleware] },
|
|
519
|
+
);
|
|
323
520
|
```
|
|
324
521
|
|
|
325
|
-
|
|
522
|
+
The middleware uses the same `MiddlewareFn` signature as route/app middleware,
|
|
523
|
+
so you can reuse existing middleware functions directly.
|
|
524
|
+
|
|
525
|
+
Fetchable loaders support both GET and POST (PUT, PATCH, DELETE) from the client.
|
|
526
|
+
The `load()` function auto-detects the body type:
|
|
527
|
+
|
|
528
|
+
- **JSON body** (`body: { ... }`) — sent as `application/json`, available as `ctx.body`
|
|
529
|
+
- **FormData body** (`body: formData`) — sent as `multipart/form-data`, available as `ctx.formData`
|
|
530
|
+
|
|
531
|
+
### Mutation Context
|
|
326
532
|
|
|
327
|
-
|
|
533
|
+
When a fetchable loader receives a POST/PUT/PATCH/DELETE request, the context
|
|
534
|
+
includes additional fields depending on the body type:
|
|
328
535
|
|
|
329
536
|
```typescript
|
|
330
|
-
export const
|
|
331
|
-
|
|
332
|
-
const limit = 20;
|
|
333
|
-
|
|
334
|
-
const [products, total] = await Promise.all([
|
|
335
|
-
db.products.findMany({
|
|
336
|
-
skip: (page - 1) * limit,
|
|
337
|
-
take: limit,
|
|
338
|
-
}),
|
|
339
|
-
db.products.count(),
|
|
340
|
-
]);
|
|
537
|
+
export const MutationLoader = createLoader(async (ctx) => {
|
|
538
|
+
"use server";
|
|
341
539
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
540
|
+
// JSON body — available as ctx.body (parsed object)
|
|
541
|
+
const data = ctx.body as { name: string; email: string };
|
|
542
|
+
|
|
543
|
+
// FormData body — available as ctx.formData
|
|
544
|
+
const file = ctx.formData?.get("file") as File | null;
|
|
545
|
+
const name = ctx.formData?.get("name") as string | null;
|
|
546
|
+
|
|
547
|
+
// Route params are always available
|
|
548
|
+
const { slug } = ctx.params;
|
|
549
|
+
|
|
550
|
+
return { success: true };
|
|
551
|
+
}, true);
|
|
351
552
|
```
|
|
352
553
|
|
|
353
|
-
###
|
|
554
|
+
### File Upload Example
|
|
354
555
|
|
|
355
556
|
```typescript
|
|
356
|
-
|
|
357
|
-
|
|
557
|
+
// loaders/upload.ts
|
|
558
|
+
import { createLoader } from "@rangojs/router";
|
|
559
|
+
|
|
560
|
+
export const FileUploadLoader = createLoader(async (ctx) => {
|
|
561
|
+
"use server";
|
|
358
562
|
|
|
359
|
-
|
|
360
|
-
|
|
563
|
+
const file = ctx.formData?.get("file") as File | null;
|
|
564
|
+
if (file && file.size > 0) {
|
|
565
|
+
// Save to R2, D1, etc.
|
|
566
|
+
await ctx.env.BUCKET.put(file.name, file.stream());
|
|
567
|
+
return { uploaded: { name: file.name, size: file.size, type: file.type } };
|
|
361
568
|
}
|
|
569
|
+
return { uploaded: null };
|
|
570
|
+
}, true);
|
|
571
|
+
```
|
|
362
572
|
|
|
363
|
-
|
|
573
|
+
Client usage — see `/hooks useFetchLoader` for the full client-side pattern.
|
|
574
|
+
|
|
575
|
+
## Complete Example
|
|
576
|
+
|
|
577
|
+
```typescript
|
|
578
|
+
// loaders/shop.ts
|
|
579
|
+
import { createLoader } from "@rangojs/router";
|
|
580
|
+
|
|
581
|
+
export const ProductLoader = createLoader(async (ctx) => {
|
|
582
|
+
"use server";
|
|
583
|
+
|
|
584
|
+
const product = await ctx.env.DB
|
|
585
|
+
.prepare("SELECT * FROM products WHERE slug = ?")
|
|
586
|
+
.bind(ctx.params.slug)
|
|
587
|
+
.first();
|
|
588
|
+
|
|
589
|
+
if (!product) {
|
|
590
|
+
notFound("Product not found");
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
return { product };
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
export const CartLoader = createLoader(async (ctx) => {
|
|
597
|
+
"use server";
|
|
598
|
+
|
|
599
|
+
const user = ctx.get("user");
|
|
600
|
+
if (!user) return { cart: null };
|
|
601
|
+
|
|
602
|
+
const cart = await ctx.env.KV.get(`cart:${user.id}`, "json");
|
|
603
|
+
return { cart };
|
|
364
604
|
});
|
|
605
|
+
|
|
606
|
+
// urls.tsx — register loaders in the DSL
|
|
607
|
+
export const urlpatterns = urls(({ path, layout, loader, loading, cache, revalidate }) => [
|
|
608
|
+
layout(<ShopLayout />, () => [
|
|
609
|
+
loader(CartLoader, () => [
|
|
610
|
+
revalidate(({ actionId }) => actionId?.includes("Cart") ?? false),
|
|
611
|
+
]),
|
|
612
|
+
|
|
613
|
+
path("/shop/product/:slug", ProductPage, { name: "product" }, () => [
|
|
614
|
+
loader(ProductLoader, () => [cache({ ttl: 60 })]),
|
|
615
|
+
loading(<ProductSkeleton />),
|
|
616
|
+
]),
|
|
617
|
+
]),
|
|
618
|
+
]);
|
|
619
|
+
|
|
620
|
+
// components/ProductDetails.tsx — consume in client component
|
|
621
|
+
"use client";
|
|
622
|
+
import { useLoader } from "@rangojs/router/client";
|
|
623
|
+
import { ProductLoader, CartLoader } from "./loaders/shop";
|
|
624
|
+
|
|
625
|
+
function ProductDetails() {
|
|
626
|
+
const { data: { product } } = useLoader(ProductLoader);
|
|
627
|
+
const { data: { cart } } = useLoader(CartLoader);
|
|
628
|
+
|
|
629
|
+
return (
|
|
630
|
+
<div>
|
|
631
|
+
<h1>{product.name}</h1>
|
|
632
|
+
<AddToCartButton
|
|
633
|
+
productId={product.id}
|
|
634
|
+
inCart={cart?.items.includes(product.id)}
|
|
635
|
+
/>
|
|
636
|
+
</div>
|
|
637
|
+
);
|
|
638
|
+
}
|
|
365
639
|
```
|