@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.20
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 +5 -0
- package/README.md +850 -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 +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/{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 +4583 -749
- 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/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +82 -46
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +139 -238
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +87 -57
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +403 -60
- package/skills/intercept/SKILL.md +224 -203
- package/skills/layout/SKILL.md +243 -149
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +444 -253
- package/skills/middleware/SKILL.md +222 -325
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +220 -170
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +119 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +334 -89
- package/skills/router-setup/SKILL.md +305 -274
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/testing/SKILL.md +226 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +437 -168
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +181 -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 +87 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +20 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +217 -549
- package/src/browser/navigation-client.ts +74 -46
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +288 -297
- package/src/browser/prefetch/cache.ts +67 -0
- package/src/browser/prefetch/fetch.ts +137 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +42 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +173 -73
- package/src/browser/react/NavigationProvider.tsx +138 -27
- package/src/browser/react/context.ts +6 -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 +49 -65
- 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 +27 -78
- 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 +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +104 -34
- package/src/browser/scroll-restoration.ts +92 -16
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +504 -584
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +107 -57
- 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 +249 -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 +120 -303
- package/src/cache/cf/cf-cache-store.ts +119 -7
- package/src/cache/cf/index.ts +8 -2
- package/src/cache/document-cache.ts +101 -72
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +0 -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 +98 -0
- package/src/cache/types.ts +76 -121
- package/src/client.rsc.tsx +10 -14
- package/src/client.tsx +114 -89
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/errors.ts +108 -2
- package/src/handle.ts +34 -19
- package/src/handles/MetaTags.tsx +76 -23
- 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 +56 -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 +209 -23
- package/src/index.ts +256 -32
- 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-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +144 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +9 -11
- 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 +55 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition/route-function.ts +119 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +241 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +70 -9
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +348 -82
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +215 -121
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +172 -43
- package/src/router/match-api.ts +620 -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 +80 -93
- package/src/router/match-middleware/cache-lookup.ts +382 -9
- package/src/router/match-middleware/cache-store.ts +51 -22
- package/src/router/match-middleware/intercept-resolution.ts +55 -17
- package/src/router/match-middleware/segment-resolution.ts +24 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -20
- package/src/router/metrics.ts +3 -3
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +179 -0
- package/src/router/middleware.ts +239 -328
- package/src/router/pattern-matching.ts +302 -26
- package/src/router/prerender-match.ts +398 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +112 -33
- package/src/router/router-context.ts +40 -23
- package/src/router/router-interfaces.ts +439 -0
- package/src/router/router-options.ts +587 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +552 -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 +1226 -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 +221 -0
- package/src/router/types.ts +78 -4
- package/src/router.ts +672 -3566
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +691 -757
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +5 -5
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +366 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +250 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +344 -0
- package/src/rsc/types.ts +38 -14
- package/src/search-params.ts +227 -0
- package/src/segment-system.tsx +59 -61
- package/src/server/context.ts +217 -49
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +98 -20
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +406 -65
- package/src/server.ts +32 -133
- package/src/ssr/index.tsx +157 -26
- package/src/static-handler.ts +114 -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 +6 -7
- 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 +691 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +161 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +153 -0
- package/src/types.ts +1 -1561
- 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 -726
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +209 -0
- package/src/vite/discovery/discover-routers.ts +345 -0
- package/src/vite/discovery/prerender-collection.ts +365 -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 +113 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +10 -782
- 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/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
- 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/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/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 +781 -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} +25 -29
- package/src/vite/utils/prerender-utils.ts +129 -0
- package/src/vite/utils/shared-utils.ts +169 -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
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server Action Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles server action execution and post-action revalidation as two
|
|
5
|
+
* separate phases:
|
|
6
|
+
*
|
|
7
|
+
* 1. executeServerAction — decodes args, runs the action, handles redirects
|
|
8
|
+
* and error boundaries. Returns either a final Response (redirect/error)
|
|
9
|
+
* or an ActionContinuation for the revalidation phase.
|
|
10
|
+
*
|
|
11
|
+
* 2. revalidateAfterAction — takes the continuation, matches affected
|
|
12
|
+
* segments, builds the RSC payload, and returns the Flight response.
|
|
13
|
+
*
|
|
14
|
+
* The handler (handler.ts) runs the action BEFORE route middleware, then
|
|
15
|
+
* wraps revalidation inside route middleware — identical to a normal render.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import {
|
|
19
|
+
requireRequestContext,
|
|
20
|
+
setRequestContextParams,
|
|
21
|
+
getLocationState,
|
|
22
|
+
} from "../server/request-context.js";
|
|
23
|
+
import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
|
|
24
|
+
import type { RscPayload } from "./types.js";
|
|
25
|
+
import {
|
|
26
|
+
hasBodyContent,
|
|
27
|
+
createResponseWithMergedHeaders,
|
|
28
|
+
createSimpleRedirectResponse,
|
|
29
|
+
carryOverRedirectHeaders,
|
|
30
|
+
} from "./helpers.js";
|
|
31
|
+
import type { HandlerContext } from "./handler-context.js";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Attach location state set during the action to a payload's metadata.
|
|
35
|
+
* No-op if no location state was set.
|
|
36
|
+
*/
|
|
37
|
+
function attachLocationState(payload: RscPayload): void {
|
|
38
|
+
const locationState = getLocationState();
|
|
39
|
+
if (locationState) {
|
|
40
|
+
payload.metadata!.locationState =
|
|
41
|
+
resolveLocationStateEntries(locationState);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Data flowing from action execution to the revalidation phase.
|
|
47
|
+
* When the action completes without redirect/error-boundary, the handler
|
|
48
|
+
* passes this to route middleware → revalidateAfterAction.
|
|
49
|
+
*/
|
|
50
|
+
export interface ActionContinuation {
|
|
51
|
+
returnValue: { ok: boolean; data: unknown };
|
|
52
|
+
actionStatus: number;
|
|
53
|
+
temporaryReferences: ReturnType<
|
|
54
|
+
HandlerContext["createTemporaryReferenceSet"]
|
|
55
|
+
>;
|
|
56
|
+
actionContext: {
|
|
57
|
+
actionId: string;
|
|
58
|
+
actionUrl: URL;
|
|
59
|
+
actionResult: unknown;
|
|
60
|
+
formData?: FormData;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Phase 1: Execute the server action.
|
|
66
|
+
*
|
|
67
|
+
* Decodes arguments, runs the action, handles redirects and error
|
|
68
|
+
* boundaries. Returns a final Response (redirect, error boundary render)
|
|
69
|
+
* or an ActionContinuation for the revalidation phase.
|
|
70
|
+
*/
|
|
71
|
+
export async function executeServerAction<TEnv>(
|
|
72
|
+
ctx: HandlerContext<TEnv>,
|
|
73
|
+
request: Request,
|
|
74
|
+
env: TEnv,
|
|
75
|
+
url: URL,
|
|
76
|
+
actionId: string,
|
|
77
|
+
handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
78
|
+
): Promise<Response | ActionContinuation> {
|
|
79
|
+
const temporaryReferences = ctx.createTemporaryReferenceSet();
|
|
80
|
+
|
|
81
|
+
// Decode action arguments from request body
|
|
82
|
+
const contentType = request.headers.get("content-type") || "";
|
|
83
|
+
let args: unknown[] = [];
|
|
84
|
+
let actionFormData: FormData | undefined;
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
const body = contentType.includes("multipart/form-data")
|
|
88
|
+
? await request.formData()
|
|
89
|
+
: await request.text();
|
|
90
|
+
|
|
91
|
+
if (body instanceof FormData) {
|
|
92
|
+
actionFormData = body;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (hasBodyContent(body)) {
|
|
96
|
+
args = await ctx.decodeReply(body, { temporaryReferences });
|
|
97
|
+
}
|
|
98
|
+
} catch (error) {
|
|
99
|
+
throw new Error(`Failed to decode action arguments: ${error}`, {
|
|
100
|
+
cause: error,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Execute the server action
|
|
105
|
+
let returnValue: { ok: boolean; data: unknown };
|
|
106
|
+
let actionStatus = 200;
|
|
107
|
+
let loadedAction: Function | undefined;
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
loadedAction = await ctx.loadServerAction(actionId);
|
|
111
|
+
const data = await loadedAction!.apply(null, args);
|
|
112
|
+
|
|
113
|
+
// Intercept redirect responses from actions. Without this, the redirect
|
|
114
|
+
// Response would be serialized as the action returnValue (which fails)
|
|
115
|
+
// and the revalidation step would run unnecessarily.
|
|
116
|
+
if (data instanceof Response) {
|
|
117
|
+
const redirectUrl = data.headers.get("Location");
|
|
118
|
+
const isRedirect = data.status >= 300 && data.status < 400 && redirectUrl;
|
|
119
|
+
if (isRedirect) {
|
|
120
|
+
const locationState = getLocationState();
|
|
121
|
+
let redirect: Response;
|
|
122
|
+
if (locationState) {
|
|
123
|
+
redirect = ctx.createRedirectFlightResponse(
|
|
124
|
+
redirectUrl,
|
|
125
|
+
resolveLocationStateEntries(locationState),
|
|
126
|
+
);
|
|
127
|
+
} else {
|
|
128
|
+
redirect = createSimpleRedirectResponse(redirectUrl);
|
|
129
|
+
}
|
|
130
|
+
carryOverRedirectHeaders(data, redirect);
|
|
131
|
+
return redirect;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
returnValue = { ok: true, data };
|
|
136
|
+
} catch (error) {
|
|
137
|
+
// Handle thrown redirect (e.g., throw redirect('/path'))
|
|
138
|
+
if (error instanceof Response) {
|
|
139
|
+
const redirectUrl = error.headers.get("Location");
|
|
140
|
+
const isRedirect =
|
|
141
|
+
error.status >= 300 && error.status < 400 && redirectUrl;
|
|
142
|
+
if (isRedirect) {
|
|
143
|
+
const locationState = getLocationState();
|
|
144
|
+
let redirect: Response;
|
|
145
|
+
if (locationState) {
|
|
146
|
+
redirect = ctx.createRedirectFlightResponse(
|
|
147
|
+
redirectUrl,
|
|
148
|
+
resolveLocationStateEntries(locationState),
|
|
149
|
+
);
|
|
150
|
+
} else {
|
|
151
|
+
redirect = createSimpleRedirectResponse(redirectUrl);
|
|
152
|
+
}
|
|
153
|
+
carryOverRedirectHeaders(error, redirect);
|
|
154
|
+
return redirect;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Non-redirect Response thrown from action — this will be treated
|
|
158
|
+
// as a regular error and routed to the error boundary. Warn in dev
|
|
159
|
+
// since the intent is likely a redirect with a missing Location header.
|
|
160
|
+
if (process.env.NODE_ENV !== "production") {
|
|
161
|
+
console.warn(
|
|
162
|
+
`[@rangojs/router] Server action "${actionId}" threw a Response ` +
|
|
163
|
+
`(status ${error.status}) that is not a redirect. ` +
|
|
164
|
+
`Non-redirect Responses are treated as errors. ` +
|
|
165
|
+
`Use \`throw redirect('/path')\` for redirects.`,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
returnValue = { ok: false, data: error };
|
|
171
|
+
actionStatus = 500;
|
|
172
|
+
|
|
173
|
+
// Try to render error boundary.
|
|
174
|
+
// Report the action error first so it is not lost if matchError throws.
|
|
175
|
+
let errorResult;
|
|
176
|
+
try {
|
|
177
|
+
errorResult = await ctx.router.matchError(
|
|
178
|
+
request,
|
|
179
|
+
{ env },
|
|
180
|
+
error,
|
|
181
|
+
"route",
|
|
182
|
+
);
|
|
183
|
+
} catch (matchErr) {
|
|
184
|
+
// matchError failed — report the original action error as unhandled,
|
|
185
|
+
// then let the matchError failure propagate.
|
|
186
|
+
ctx.callOnError(error, "action", {
|
|
187
|
+
request,
|
|
188
|
+
url,
|
|
189
|
+
env,
|
|
190
|
+
actionId,
|
|
191
|
+
handledByBoundary: false,
|
|
192
|
+
});
|
|
193
|
+
throw matchErr;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
ctx.callOnError(error, "action", {
|
|
197
|
+
request,
|
|
198
|
+
url,
|
|
199
|
+
env,
|
|
200
|
+
actionId,
|
|
201
|
+
handledByBoundary: !!errorResult,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
if (errorResult) {
|
|
205
|
+
setRequestContextParams(errorResult.params, errorResult.routeName);
|
|
206
|
+
|
|
207
|
+
const payload: RscPayload = {
|
|
208
|
+
metadata: {
|
|
209
|
+
pathname: url.pathname,
|
|
210
|
+
segments: errorResult.segments,
|
|
211
|
+
isPartial: true,
|
|
212
|
+
matched: errorResult.matched,
|
|
213
|
+
diff: errorResult.diff,
|
|
214
|
+
isError: true,
|
|
215
|
+
handles: handleStore.stream(),
|
|
216
|
+
version: ctx.version,
|
|
217
|
+
},
|
|
218
|
+
returnValue,
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// Intentionally omit attachLocationState for error payloads:
|
|
222
|
+
// location state is a success-only semantic. Error boundary responses
|
|
223
|
+
// update the error UI but should not mutate browser history state.
|
|
224
|
+
|
|
225
|
+
const rscStream = ctx.renderToReadableStream<RscPayload>(payload, {
|
|
226
|
+
temporaryReferences,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
230
|
+
status: actionStatus,
|
|
231
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Build continuation for the revalidation phase
|
|
237
|
+
const resolvedActionId =
|
|
238
|
+
(loadedAction as { $id?: string; $$id?: string } | undefined)?.$id ??
|
|
239
|
+
(loadedAction as { $$id?: string } | undefined)?.$$id ??
|
|
240
|
+
actionId;
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
returnValue,
|
|
244
|
+
actionStatus,
|
|
245
|
+
temporaryReferences,
|
|
246
|
+
actionContext: {
|
|
247
|
+
actionId: resolvedActionId,
|
|
248
|
+
actionUrl: new URL(request.url),
|
|
249
|
+
actionResult: returnValue.data,
|
|
250
|
+
formData: actionFormData,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Phase 2: Revalidate after action.
|
|
257
|
+
*
|
|
258
|
+
* Matches affected segments, builds the RSC payload, and returns the
|
|
259
|
+
* Flight response. Called inside route middleware (same as a normal render).
|
|
260
|
+
*
|
|
261
|
+
* Invariant: the response payload MUST have isPartial: true. The client
|
|
262
|
+
* (server-action-bridge) rejects non-partial payloads because partial
|
|
263
|
+
* reconciliation requires matched/diff semantics that full renders don't
|
|
264
|
+
* provide. Redirects are the only non-partial outcome and are handled via
|
|
265
|
+
* X-RSC-Redirect headers before Flight deserialization.
|
|
266
|
+
*/
|
|
267
|
+
export async function revalidateAfterAction<TEnv>(
|
|
268
|
+
ctx: HandlerContext<TEnv>,
|
|
269
|
+
request: Request,
|
|
270
|
+
env: TEnv,
|
|
271
|
+
url: URL,
|
|
272
|
+
handleStore: ReturnType<typeof requireRequestContext>["_handleStore"],
|
|
273
|
+
continuation: ActionContinuation,
|
|
274
|
+
): Promise<Response> {
|
|
275
|
+
const { returnValue, actionStatus, temporaryReferences, actionContext } =
|
|
276
|
+
continuation;
|
|
277
|
+
|
|
278
|
+
const matchResult = await ctx.router.matchPartial(
|
|
279
|
+
request,
|
|
280
|
+
{ env },
|
|
281
|
+
actionContext,
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
if (!matchResult) {
|
|
285
|
+
// matchPartial returns null when the route is a redirect or the request
|
|
286
|
+
// is missing required headers (previousUrl). Check for redirect first.
|
|
287
|
+
const fullMatch = await ctx.router.match(request, { env });
|
|
288
|
+
setRequestContextParams(fullMatch.params, fullMatch.routeName);
|
|
289
|
+
|
|
290
|
+
if (fullMatch.redirect) {
|
|
291
|
+
// Action context is always partial — use X-RSC-Redirect header so
|
|
292
|
+
// the client can perform SPA navigation instead of fetch auto-following
|
|
293
|
+
// a raw 308 to a URL that would render full HTML.
|
|
294
|
+
return createSimpleRedirectResponse(fullMatch.redirect);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Non-redirect: this branch is only reachable when the action request
|
|
298
|
+
// is missing the X-RSC-Router-Client-Path header (defensive). The
|
|
299
|
+
// client requires isPartial for action responses, so producing a full
|
|
300
|
+
// payload here would be rejected. Return 500 instead.
|
|
301
|
+
throw new Error(
|
|
302
|
+
`[RSC] matchPartial returned null for a non-redirect route ` +
|
|
303
|
+
`during action revalidation (${url.pathname}). This indicates ` +
|
|
304
|
+
`a malformed action request (missing X-RSC-Router-Client-Path header).`,
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Return updated segments
|
|
309
|
+
setRequestContextParams(matchResult.params, matchResult.routeName);
|
|
310
|
+
|
|
311
|
+
const serverTiming = matchResult.serverTiming;
|
|
312
|
+
|
|
313
|
+
const payload: RscPayload = {
|
|
314
|
+
metadata: {
|
|
315
|
+
pathname: url.pathname,
|
|
316
|
+
segments: matchResult.segments,
|
|
317
|
+
isPartial: true,
|
|
318
|
+
matched: matchResult.matched,
|
|
319
|
+
diff: matchResult.diff,
|
|
320
|
+
slots: matchResult.slots,
|
|
321
|
+
handles: handleStore.stream(),
|
|
322
|
+
version: ctx.version,
|
|
323
|
+
},
|
|
324
|
+
returnValue,
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
attachLocationState(payload);
|
|
328
|
+
|
|
329
|
+
const rscStream = ctx.renderToReadableStream<RscPayload>(payload, {
|
|
330
|
+
temporaryReferences,
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
const actionHeaders: Record<string, string> = {
|
|
334
|
+
"content-type": "text/x-component;charset=utf-8",
|
|
335
|
+
};
|
|
336
|
+
if (serverTiming) {
|
|
337
|
+
actionHeaders["Server-Timing"] = serverTiming;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
341
|
+
status: actionStatus,
|
|
342
|
+
headers: actionHeaders,
|
|
343
|
+
});
|
|
344
|
+
}
|
package/src/rsc/types.ts
CHANGED
|
@@ -7,14 +7,15 @@
|
|
|
7
7
|
|
|
8
8
|
import type { ResolvedSegment, SlotState } from "../types.js";
|
|
9
9
|
import type { HandleData } from "../server/handle-store.js";
|
|
10
|
-
import type {
|
|
10
|
+
import type { RSCRouterInternal } from "../router/router-interfaces.js";
|
|
11
11
|
import type { ResolvedThemeConfig, Theme } from "../theme/types.js";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* RSC payload sent to the client
|
|
14
|
+
* RSC payload sent to the client.
|
|
15
|
+
* The tree is always reconstructed from metadata.segments by consumers
|
|
16
|
+
* (SSR via renderSegments, browser via renderSegments in bridges).
|
|
15
17
|
*/
|
|
16
18
|
export interface RscPayload {
|
|
17
|
-
root: React.ReactNode | Promise<React.ReactNode>;
|
|
18
19
|
metadata?: {
|
|
19
20
|
pathname: string;
|
|
20
21
|
segments: ResolvedSegment[];
|
|
@@ -22,6 +23,8 @@ export interface RscPayload {
|
|
|
22
23
|
isError?: boolean;
|
|
23
24
|
matched?: string[];
|
|
24
25
|
diff?: string[];
|
|
26
|
+
/** Merged route params from the matched route */
|
|
27
|
+
params?: Record<string, string>;
|
|
25
28
|
slots?: Record<string, SlotState>;
|
|
26
29
|
/** Root layout component for browser-side re-renders (client component reference) */
|
|
27
30
|
rootLayout?: React.ComponentType<{ children: React.ReactNode }>;
|
|
@@ -33,10 +36,12 @@ export interface RscPayload {
|
|
|
33
36
|
themeConfig?: ResolvedThemeConfig | null;
|
|
34
37
|
/** Initial theme from cookie (for SSR hydration) */
|
|
35
38
|
initialTheme?: Theme;
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
|
|
39
|
+
/** Whether connection warmup is enabled */
|
|
40
|
+
warmupEnabled?: boolean;
|
|
41
|
+
/** Server-side redirect with optional state (for partial requests) */
|
|
42
|
+
redirect?: { url: string };
|
|
43
|
+
/** Server-set location state to include in history.pushState */
|
|
44
|
+
locationState?: Record<string, unknown>;
|
|
40
45
|
};
|
|
41
46
|
returnValue?: { ok: boolean; data: unknown };
|
|
42
47
|
formState?: unknown;
|
|
@@ -56,7 +61,7 @@ export interface RSCDependencies {
|
|
|
56
61
|
*/
|
|
57
62
|
renderToReadableStream: <T>(
|
|
58
63
|
payload: T,
|
|
59
|
-
options?: { temporaryReferences?: unknown }
|
|
64
|
+
options?: { temporaryReferences?: unknown },
|
|
60
65
|
) => ReadableStream<Uint8Array>;
|
|
61
66
|
|
|
62
67
|
/**
|
|
@@ -64,7 +69,7 @@ export interface RSCDependencies {
|
|
|
64
69
|
*/
|
|
65
70
|
decodeReply: (
|
|
66
71
|
body: FormData | string,
|
|
67
|
-
options?: { temporaryReferences?: unknown }
|
|
72
|
+
options?: { temporaryReferences?: unknown },
|
|
68
73
|
) => Promise<unknown[]>;
|
|
69
74
|
|
|
70
75
|
/**
|
|
@@ -89,7 +94,7 @@ export interface RSCDependencies {
|
|
|
89
94
|
*/
|
|
90
95
|
decodeFormState: (
|
|
91
96
|
actionResult: unknown,
|
|
92
|
-
body: FormData
|
|
97
|
+
body: FormData,
|
|
93
98
|
) => Promise<ReactFormState | null>;
|
|
94
99
|
}
|
|
95
100
|
|
|
@@ -109,6 +114,14 @@ export interface SSRRenderOptions {
|
|
|
109
114
|
* Nonce for Content Security Policy (CSP)
|
|
110
115
|
*/
|
|
111
116
|
nonce?: string;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* SSR stream mode.
|
|
120
|
+
*
|
|
121
|
+
* - `"stream"` (default) — start flushing HTML immediately.
|
|
122
|
+
* - `"allReady"` — await `stream.allReady` before returning.
|
|
123
|
+
*/
|
|
124
|
+
streamMode?: import("../router/router-options.js").SSRStreamMode;
|
|
112
125
|
}
|
|
113
126
|
|
|
114
127
|
/**
|
|
@@ -117,7 +130,7 @@ export interface SSRRenderOptions {
|
|
|
117
130
|
export interface SSRModule {
|
|
118
131
|
renderHTML: (
|
|
119
132
|
rscStream: ReadableStream<Uint8Array>,
|
|
120
|
-
options?: SSRRenderOptions
|
|
133
|
+
options?: SSRRenderOptions,
|
|
121
134
|
) => Promise<ReadableStream<Uint8Array>>;
|
|
122
135
|
}
|
|
123
136
|
|
|
@@ -143,7 +156,7 @@ export interface HandlerCacheConfig {
|
|
|
143
156
|
*/
|
|
144
157
|
export type NonceProvider<TEnv = unknown> = (
|
|
145
158
|
request: Request,
|
|
146
|
-
env: TEnv
|
|
159
|
+
env: TEnv,
|
|
147
160
|
) => string | true | Promise<string | true>;
|
|
148
161
|
|
|
149
162
|
/**
|
|
@@ -156,7 +169,7 @@ export interface CreateRSCHandlerOptions<
|
|
|
156
169
|
/**
|
|
157
170
|
* The RSC router instance
|
|
158
171
|
*/
|
|
159
|
-
router:
|
|
172
|
+
router: RSCRouterInternal<TEnv, TRoutes>;
|
|
160
173
|
|
|
161
174
|
/**
|
|
162
175
|
* RSC dependencies from @vitejs/plugin-rsc/rsc.
|
|
@@ -215,7 +228,8 @@ export interface CreateRSCHandlerOptions<
|
|
|
215
228
|
* - Undefined to disable nonce (default)
|
|
216
229
|
*
|
|
217
230
|
* The nonce will be applied to inline scripts injected by the RSC payload.
|
|
218
|
-
* It's also available to middleware via `
|
|
231
|
+
* It's also available to middleware via the typed `nonce` token:
|
|
232
|
+
* `import { nonce } from "@rangojs/router"; ctx.get(nonce)`
|
|
219
233
|
*
|
|
220
234
|
* @example Auto-generate nonce
|
|
221
235
|
* ```tsx
|
|
@@ -232,6 +246,16 @@ export interface CreateRSCHandlerOptions<
|
|
|
232
246
|
* nonce: (request, env) => env.nonce,
|
|
233
247
|
* });
|
|
234
248
|
* ```
|
|
249
|
+
*
|
|
250
|
+
* @example Access nonce in middleware
|
|
251
|
+
* ```tsx
|
|
252
|
+
* import { nonce } from "@rangojs/router";
|
|
253
|
+
*
|
|
254
|
+
* const cspMiddleware: Middleware = async (ctx, next) => {
|
|
255
|
+
* const value = ctx.get(nonce); // string | undefined
|
|
256
|
+
* await next();
|
|
257
|
+
* };
|
|
258
|
+
* ```
|
|
235
259
|
*/
|
|
236
260
|
nonce?: NonceProvider<TEnv>;
|
|
237
261
|
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search parameter schema types and runtime utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides a lightweight schema system for typed query parameters.
|
|
5
|
+
* When a route defines a `search` schema, ctx.search provides a typed
|
|
6
|
+
* object with parsed values. ctx.searchParams always remains a standard
|
|
7
|
+
* URLSearchParams instance.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Schema Types
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
/** Supported scalar types for search params (append ? for optional). */
|
|
15
|
+
export type SearchSchemaValue =
|
|
16
|
+
| "string"
|
|
17
|
+
| "number"
|
|
18
|
+
| "boolean"
|
|
19
|
+
| "string?"
|
|
20
|
+
| "number?"
|
|
21
|
+
| "boolean?";
|
|
22
|
+
|
|
23
|
+
/** A search schema maps param names to their type descriptors. */
|
|
24
|
+
export type SearchSchema = Record<string, SearchSchemaValue>;
|
|
25
|
+
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Type-Level Schema Resolution
|
|
28
|
+
// ============================================================================
|
|
29
|
+
|
|
30
|
+
/** Strip trailing `?` from a schema value to get the base type. */
|
|
31
|
+
type BaseType<T extends string> = T extends `${infer B}?` ? B : T;
|
|
32
|
+
|
|
33
|
+
/** Map a base type string to its TypeScript type. */
|
|
34
|
+
type ResolveBaseType<T extends string> = T extends "string"
|
|
35
|
+
? string
|
|
36
|
+
: T extends "number"
|
|
37
|
+
? number
|
|
38
|
+
: T extends "boolean"
|
|
39
|
+
? boolean
|
|
40
|
+
: never;
|
|
41
|
+
|
|
42
|
+
/** Keys whose schema value does NOT end with `?`. */
|
|
43
|
+
type RequiredKeys<T extends SearchSchema> = {
|
|
44
|
+
[K in keyof T]: T[K] extends `${string}?` ? never : K;
|
|
45
|
+
}[keyof T];
|
|
46
|
+
|
|
47
|
+
/** Keys whose schema value ends with `?`. */
|
|
48
|
+
type OptionalKeys<T extends SearchSchema> = {
|
|
49
|
+
[K in keyof T]: T[K] extends `${string}?` ? K : never;
|
|
50
|
+
}[keyof T];
|
|
51
|
+
|
|
52
|
+
/** Flatten an intersection type into a single object type. */
|
|
53
|
+
type Simplify<T> = { [K in keyof T]: T[K] };
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a SearchSchema to its typed object.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* type S = { q: "string"; page: "number?"; sort: "string?" };
|
|
60
|
+
* type R = ResolveSearchSchema<S>;
|
|
61
|
+
* // { q: string; page?: number; sort?: string }
|
|
62
|
+
*/
|
|
63
|
+
export type ResolveSearchSchema<T extends SearchSchema> = Simplify<
|
|
64
|
+
{
|
|
65
|
+
[K in RequiredKeys<T> & string]: ResolveBaseType<BaseType<T[K]>>;
|
|
66
|
+
} & {
|
|
67
|
+
[K in OptionalKeys<T> & string]?: ResolveBaseType<BaseType<T[K]>>;
|
|
68
|
+
}
|
|
69
|
+
>;
|
|
70
|
+
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Route-Level Type Extraction
|
|
73
|
+
// ============================================================================
|
|
74
|
+
|
|
75
|
+
/** Resolve the global route map from RegisteredRoutes or GeneratedRouteMap. */
|
|
76
|
+
type GlobalRouteMap = keyof RSCRouter.RegisteredRoutes extends never
|
|
77
|
+
? keyof RSCRouter.GeneratedRouteMap extends never
|
|
78
|
+
? Record<string, string>
|
|
79
|
+
: RSCRouter.GeneratedRouteMap
|
|
80
|
+
: RSCRouter.RegisteredRoutes;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Extract the resolved search params type for a named route.
|
|
84
|
+
* Looks up the search schema from the route map and resolves it.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* // Given: path("/search", handler, { name: "search", search: { q: "string", page: "number?" } })
|
|
89
|
+
* type Params = RouteSearchParams<"search">;
|
|
90
|
+
* // { q: string; page?: number }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export type RouteSearchParams<TName extends string, TRouteMap = never> = [
|
|
94
|
+
TRouteMap,
|
|
95
|
+
] extends [never]
|
|
96
|
+
? ExtractAndResolveSearch<GlobalRouteMap, TName>
|
|
97
|
+
: ExtractAndResolveSearch<TRouteMap, TName>;
|
|
98
|
+
|
|
99
|
+
type ExtractAndResolveSearch<TRouteMap, TName> = TName extends keyof TRouteMap
|
|
100
|
+
? TRouteMap[TName] extends { readonly search: infer S extends SearchSchema }
|
|
101
|
+
? ResolveSearchSchema<S>
|
|
102
|
+
: {}
|
|
103
|
+
: {};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Extract the route params type for a named route.
|
|
107
|
+
* Looks up the path pattern from the route map and extracts params.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* // Given: path("/blog/:slug", handler, { name: "blogPost" })
|
|
112
|
+
* type Params = RouteParams<"blogPost">;
|
|
113
|
+
* // { slug: string }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export type RouteParams<TName extends string, TRouteMap = never> = [
|
|
117
|
+
TRouteMap,
|
|
118
|
+
] extends [never]
|
|
119
|
+
? ExtractRouteParamsFromMap<GlobalRouteMap, TName>
|
|
120
|
+
: ExtractRouteParamsFromMap<TRouteMap, TName>;
|
|
121
|
+
|
|
122
|
+
type ExtractRouteParamsFromMap<TRouteMap, TName> = TName extends keyof TRouteMap
|
|
123
|
+
? TRouteMap[TName] extends string
|
|
124
|
+
? ExtractParamsFromPattern<TRouteMap[TName]>
|
|
125
|
+
: TRouteMap[TName] extends { readonly path: infer P extends string }
|
|
126
|
+
? ExtractParamsFromPattern<P>
|
|
127
|
+
: {}
|
|
128
|
+
: {};
|
|
129
|
+
|
|
130
|
+
/** Parse "a|b|c" into "a" | "b" | "c" */
|
|
131
|
+
type ParseConstraint<T extends string> =
|
|
132
|
+
T extends `${infer First}|${infer Rest}` ? First | ParseConstraint<Rest> : T;
|
|
133
|
+
|
|
134
|
+
/** Minimal inline param extraction (avoids importing from types.ts to prevent circular deps). */
|
|
135
|
+
type ExtractParamsFromPattern<T extends string> =
|
|
136
|
+
T extends `${string}:${infer Param}/${infer Rest}`
|
|
137
|
+
? Param extends `${infer Name}(${infer C})?`
|
|
138
|
+
? {
|
|
139
|
+
[K in Name]?: ParseConstraint<C>;
|
|
140
|
+
} & ExtractParamsFromPattern<`/${Rest}`>
|
|
141
|
+
: Param extends `${infer Name}(${infer C})`
|
|
142
|
+
? {
|
|
143
|
+
[K in Name]: ParseConstraint<C>;
|
|
144
|
+
} & ExtractParamsFromPattern<`/${Rest}`>
|
|
145
|
+
: Param extends `${infer Name}?`
|
|
146
|
+
? { [K in Name]?: string } & ExtractParamsFromPattern<`/${Rest}`>
|
|
147
|
+
: { [K in Param]: string } & ExtractParamsFromPattern<`/${Rest}`>
|
|
148
|
+
: T extends `${string}:${infer Param}`
|
|
149
|
+
? Param extends `${infer Name}(${infer C})?`
|
|
150
|
+
? { [K in Name]?: ParseConstraint<C> }
|
|
151
|
+
: Param extends `${infer Name}(${infer C})`
|
|
152
|
+
? { [K in Name]: ParseConstraint<C> }
|
|
153
|
+
: Param extends `${infer Name}?`
|
|
154
|
+
? { [K in Name]?: string }
|
|
155
|
+
: { [K in Param]: string }
|
|
156
|
+
: {};
|
|
157
|
+
|
|
158
|
+
// ============================================================================
|
|
159
|
+
// Runtime Parser
|
|
160
|
+
// ============================================================================
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Parse URLSearchParams into a typed object using the given schema.
|
|
164
|
+
*
|
|
165
|
+
* - `"string"` / `"string?"` - kept as-is
|
|
166
|
+
* - `"number"` / `"number?"` - coerced via `Number()`; NaN treated as missing
|
|
167
|
+
* - `"boolean"` / `"boolean?"` - `"true"` / `"1"` -> true, `"false"` / `"0"` / `""` -> false
|
|
168
|
+
*
|
|
169
|
+
* Missing required params are set to their zero value (empty string / 0 / false).
|
|
170
|
+
*/
|
|
171
|
+
export function parseSearchParams<T extends SearchSchema>(
|
|
172
|
+
searchParams: URLSearchParams,
|
|
173
|
+
schema: T,
|
|
174
|
+
): ResolveSearchSchema<T> {
|
|
175
|
+
const result: Record<string, unknown> = {};
|
|
176
|
+
|
|
177
|
+
for (const [key, descriptor] of Object.entries(schema)) {
|
|
178
|
+
const isOptional = descriptor.endsWith("?");
|
|
179
|
+
const baseType = isOptional ? descriptor.slice(0, -1) : descriptor;
|
|
180
|
+
const raw = searchParams.get(key);
|
|
181
|
+
|
|
182
|
+
if (raw === null) {
|
|
183
|
+
if (!isOptional) {
|
|
184
|
+
// Required param missing: use zero value
|
|
185
|
+
if (baseType === "string") result[key] = "";
|
|
186
|
+
else if (baseType === "number") result[key] = 0;
|
|
187
|
+
else if (baseType === "boolean") result[key] = false;
|
|
188
|
+
}
|
|
189
|
+
// Optional params are omitted (undefined)
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (baseType === "string") {
|
|
194
|
+
result[key] = raw;
|
|
195
|
+
} else if (baseType === "number") {
|
|
196
|
+
const num = Number(raw);
|
|
197
|
+
if (Number.isNaN(num)) {
|
|
198
|
+
if (!isOptional) result[key] = 0;
|
|
199
|
+
} else {
|
|
200
|
+
result[key] = num;
|
|
201
|
+
}
|
|
202
|
+
} else if (baseType === "boolean") {
|
|
203
|
+
result[key] = raw === "true" || raw === "1";
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return result as ResolveSearchSchema<T>;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// Runtime Serializer
|
|
212
|
+
// ============================================================================
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Serialize a typed search params object to a query string (without leading `?`).
|
|
216
|
+
* Skips `undefined` and `null` values.
|
|
217
|
+
*/
|
|
218
|
+
export function serializeSearchParams(params: Record<string, unknown>): string {
|
|
219
|
+
const parts: string[] = [];
|
|
220
|
+
for (const [key, value] of Object.entries(params)) {
|
|
221
|
+
if (value === undefined || value === null) continue;
|
|
222
|
+
parts.push(
|
|
223
|
+
`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
return parts.join("&");
|
|
227
|
+
}
|