@rangojs/router 0.0.0-experimental.0b82333f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +899 -0
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1601 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/dist/href-context.d.ts +29 -0
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +5214 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +177 -0
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +220 -0
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +182 -0
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +704 -0
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +313 -0
- package/skills/layout/SKILL.md +310 -0
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +596 -0
- package/skills/middleware/SKILL.md +339 -0
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +305 -0
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +118 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +385 -0
- package/skills/router-setup/SKILL.md +439 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +79 -0
- package/skills/typesafety/SKILL.md +623 -0
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +273 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +899 -0
- package/src/browser/history-state.ts +80 -0
- package/src/browser/index.ts +18 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +141 -0
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +134 -0
- package/src/browser/navigation-bridge.ts +640 -0
- package/src/browser/navigation-client.ts +215 -0
- package/src/browser/navigation-store.ts +806 -0
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +552 -0
- package/src/browser/prefetch/cache.ts +154 -0
- package/src/browser/prefetch/fetch.ts +135 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +360 -0
- package/src/browser/react/NavigationProvider.tsx +386 -0
- package/src/browser/react/ScrollRestoration.tsx +94 -0
- package/src/browser/react/context.ts +59 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +52 -0
- package/src/browser/react/location-state-shared.ts +162 -0
- package/src/browser/react/location-state.ts +107 -0
- package/src/browser/react/mount-context.ts +37 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +218 -0
- package/src/browser/react/use-client-cache.ts +58 -0
- package/src/browser/react/use-handle.ts +162 -0
- package/src/browser/react/use-href.tsx +40 -0
- package/src/browser/react/use-link-status.ts +135 -0
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +99 -0
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +171 -0
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +431 -0
- package/src/browser/scroll-restoration.ts +384 -0
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +667 -0
- package/src/browser/shallow.ts +40 -0
- package/src/browser/types.ts +538 -0
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +265 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +382 -0
- package/src/cache/cf/cf-cache-store.ts +540 -0
- package/src/cache/cf/index.ts +25 -0
- package/src/cache/document-cache.ts +369 -0
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +43 -0
- package/src/cache/memory-segment-store.ts +328 -0
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +98 -0
- package/src/cache/types.ts +342 -0
- package/src/client.rsc.tsx +85 -0
- package/src/client.tsx +601 -0
- package/src/component-utils.ts +76 -0
- package/src/components/DefaultDocument.tsx +27 -0
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/default-error-boundary.tsx +88 -0
- package/src/deps/browser.ts +8 -0
- package/src/deps/html-stream-client.ts +2 -0
- package/src/deps/html-stream-server.ts +2 -0
- package/src/deps/rsc.ts +10 -0
- package/src/deps/ssr.ts +2 -0
- package/src/errors.ts +365 -0
- package/src/handle.ts +135 -0
- package/src/handles/MetaTags.tsx +246 -0
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +7 -0
- package/src/handles/meta.ts +264 -0
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +222 -0
- package/src/index.rsc.ts +233 -0
- package/src/index.ts +277 -0
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +89 -0
- package/src/loader.ts +64 -0
- package/src/network-error-thrower.tsx +23 -0
- package/src/outlet-context.ts +15 -0
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +185 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +289 -0
- package/src/route-content-wrapper.tsx +196 -0
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition.ts +1 -0
- package/src/route-map-builder.ts +275 -0
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +259 -0
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +287 -0
- package/src/router/find-match.ts +158 -0
- package/src/router/handler-context.ts +451 -0
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +420 -0
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +267 -0
- package/src/router/match-api.ts +620 -0
- package/src/router/match-context.ts +266 -0
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +223 -0
- package/src/router/match-middleware/cache-lookup.ts +634 -0
- package/src/router/match-middleware/cache-store.ts +295 -0
- package/src/router/match-middleware/index.ts +81 -0
- package/src/router/match-middleware/intercept-resolution.ts +306 -0
- package/src/router/match-middleware/segment-resolution.ts +192 -0
- package/src/router/match-pipelines.ts +179 -0
- package/src/router/match-result.ts +219 -0
- package/src/router/metrics.ts +282 -0
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +748 -0
- package/src/router/pattern-matching.ts +563 -0
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +289 -0
- package/src/router/router-context.ts +316 -0
- package/src/router/router-interfaces.ts +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +570 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1239 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +239 -0
- package/src/router/types.ts +170 -0
- package/src/router.ts +1002 -0
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +1089 -0
- package/src/rsc/helpers.ts +198 -0
- package/src/rsc/index.ts +36 -0
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +32 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +237 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +263 -0
- package/src/search-params.ts +230 -0
- package/src/segment-system.tsx +454 -0
- package/src/server/context.ts +591 -0
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +308 -0
- package/src/server/loader-registry.ts +133 -0
- package/src/server/request-context.ts +914 -0
- package/src/server/root-layout.tsx +10 -0
- package/src/server/tsconfig.json +14 -0
- package/src/server.ts +51 -0
- package/src/ssr/index.tsx +365 -0
- package/src/static-handler.ts +114 -0
- package/src/theme/ThemeProvider.tsx +297 -0
- package/src/theme/ThemeScript.tsx +61 -0
- package/src/theme/constants.ts +62 -0
- package/src/theme/index.ts +48 -0
- package/src/theme/theme-context.ts +44 -0
- package/src/theme/theme-script.ts +155 -0
- package/src/theme/types.ts +182 -0
- package/src/theme/use-theme.ts +44 -0
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +687 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +148 -0
- package/src/types.ts +1 -0
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -0
- package/src/use-loader.tsx +354 -0
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +110 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +16 -0
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/plugins/expose-action-id.ts +365 -0
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -0
- package/src/vite/plugins/version.d.ts +12 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +510 -0
- package/src/vite/router-discovery.ts +785 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/utils/package-resolution.ts +121 -0
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RSC Handler Helpers
|
|
3
|
+
*
|
|
4
|
+
* Utility functions for RSC request handling.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
_getRequestContext,
|
|
9
|
+
getLocationState,
|
|
10
|
+
} from "../server/request-context.js";
|
|
11
|
+
import { resolveLocationStateEntries } from "../browser/react/location-state-shared.js";
|
|
12
|
+
import type { MiddlewareEntry, MiddlewareFn } from "../router/middleware.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Check if a request body has content to decode
|
|
16
|
+
*/
|
|
17
|
+
export function hasBodyContent(body: FormData | string): boolean {
|
|
18
|
+
if (body instanceof FormData) {
|
|
19
|
+
let hasContent = false;
|
|
20
|
+
body.forEach(() => {
|
|
21
|
+
hasContent = true;
|
|
22
|
+
});
|
|
23
|
+
return hasContent;
|
|
24
|
+
}
|
|
25
|
+
return typeof body === "string" && body.length > 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Create a Response with headers merged from the request context's stub response.
|
|
30
|
+
* This ensures headers/cookies set during middleware or handler execution are included.
|
|
31
|
+
* Also triggers any registered onResponse callbacks.
|
|
32
|
+
*/
|
|
33
|
+
export function createResponseWithMergedHeaders(
|
|
34
|
+
body: BodyInit | null,
|
|
35
|
+
init: ResponseInit,
|
|
36
|
+
): Response {
|
|
37
|
+
const ctx = _getRequestContext();
|
|
38
|
+
if (!ctx) {
|
|
39
|
+
return new Response(body, init);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Merge headers from stub response into the new response.
|
|
43
|
+
// Delete Set-Cookie from the stub after consuming so that downstream
|
|
44
|
+
// merge points (e.g. executeMiddleware) do not duplicate them.
|
|
45
|
+
const mergedHeaders = new Headers(init.headers);
|
|
46
|
+
ctx.res.headers.forEach((value, name) => {
|
|
47
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
48
|
+
mergedHeaders.append(name, value);
|
|
49
|
+
} else if (!mergedHeaders.has(name)) {
|
|
50
|
+
// Only set if not already present in init.headers
|
|
51
|
+
mergedHeaders.set(name, value);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
ctx.res.headers.delete("set-cookie");
|
|
55
|
+
|
|
56
|
+
// Use ctx.res.status if it was set (e.g., 404 for notFound, 500 for error)
|
|
57
|
+
// Otherwise use the status from init
|
|
58
|
+
const status = ctx.res.status !== 200 ? ctx.res.status : init.status;
|
|
59
|
+
|
|
60
|
+
let response = new Response(body, {
|
|
61
|
+
...init,
|
|
62
|
+
status,
|
|
63
|
+
headers: mergedHeaders,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Run onResponse callbacks - each can inspect/modify the response.
|
|
67
|
+
// Drain the array so that downstream callers (e.g. finalizeResponse)
|
|
68
|
+
// do not re-execute the same callbacks on this response.
|
|
69
|
+
const callbacks = ctx._onResponseCallbacks;
|
|
70
|
+
ctx._onResponseCallbacks = [];
|
|
71
|
+
for (const callback of callbacks) {
|
|
72
|
+
response = callback(response) ?? response;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return response;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Create a 204 response with X-RSC-Redirect header for stateless redirects.
|
|
80
|
+
* Used during partial/action requests where fetch would auto-follow a raw
|
|
81
|
+
* 3xx to a URL that renders full HTML instead of Flight data. The 204 status
|
|
82
|
+
* prevents auto-follow; the client reads the header and re-navigates via
|
|
83
|
+
* the router.
|
|
84
|
+
*/
|
|
85
|
+
export function createSimpleRedirectResponse(redirectUrl: string): Response {
|
|
86
|
+
return createResponseWithMergedHeaders(null, {
|
|
87
|
+
status: 204,
|
|
88
|
+
headers: { "X-RSC-Redirect": redirectUrl },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Carry over headers from a source redirect Response to a wrapper Response.
|
|
94
|
+
* Skips Location and X-RSC-Redirect (intentionally replaced by the wrapper)
|
|
95
|
+
* and appends Set-Cookie to avoid clobbering multiple cookie headers.
|
|
96
|
+
*/
|
|
97
|
+
export function carryOverRedirectHeaders(
|
|
98
|
+
source: Response,
|
|
99
|
+
target: Response,
|
|
100
|
+
): void {
|
|
101
|
+
source.headers.forEach((value, name) => {
|
|
102
|
+
const lower = name.toLowerCase();
|
|
103
|
+
if (lower === "location" || lower === "x-rsc-redirect") return;
|
|
104
|
+
if (lower === "set-cookie") {
|
|
105
|
+
target.headers.append(name, value);
|
|
106
|
+
} else if (!target.headers.has(name)) {
|
|
107
|
+
target.headers.set(name, value);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* If a response is a 3xx redirect during a partial (client-side) request,
|
|
114
|
+
* intercept it and return a Flight-compatible redirect instead.
|
|
115
|
+
* fetch() auto-follows 3xx which would hit a URL that renders full HTML
|
|
116
|
+
* the client can't parse. Returns null if the response is not a redirect.
|
|
117
|
+
*/
|
|
118
|
+
export function interceptRedirectForPartial(
|
|
119
|
+
response: Response,
|
|
120
|
+
createRedirectFlightResponse: (
|
|
121
|
+
redirectUrl: string,
|
|
122
|
+
locationState?: Record<string, unknown>,
|
|
123
|
+
) => Response,
|
|
124
|
+
): Response | null {
|
|
125
|
+
const redirectUrl = response.headers.get("Location");
|
|
126
|
+
if (!(response.status >= 300 && response.status < 400 && redirectUrl)) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const locationState = getLocationState();
|
|
130
|
+
let intercepted: Response;
|
|
131
|
+
if (locationState) {
|
|
132
|
+
intercepted = createRedirectFlightResponse(
|
|
133
|
+
redirectUrl,
|
|
134
|
+
resolveLocationStateEntries(locationState),
|
|
135
|
+
);
|
|
136
|
+
} else {
|
|
137
|
+
intercepted = createSimpleRedirectResponse(redirectUrl);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
carryOverRedirectHeaders(response, intercepted);
|
|
141
|
+
|
|
142
|
+
return intercepted;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Only cache successful responses. Non-200 statuses (errors, redirects) are
|
|
147
|
+
* not cached -- notFound() produces 500 in response routes, and explicit
|
|
148
|
+
* non-200 Responses are rare enough that caching them would be surprising.
|
|
149
|
+
*/
|
|
150
|
+
export function isCacheableStatus(status: number): boolean {
|
|
151
|
+
return status === 200;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Convert route-level middleware entries to the format expected by
|
|
156
|
+
* executeMiddleware. Route middleware from previewMatch carries just
|
|
157
|
+
* { handler, params }; this wraps them in the full MiddlewareEntry shape.
|
|
158
|
+
*/
|
|
159
|
+
export function buildRouteMiddlewareEntries<TEnv>(
|
|
160
|
+
routeMiddleware: Array<{
|
|
161
|
+
handler: MiddlewareFn;
|
|
162
|
+
params: Record<string, string>;
|
|
163
|
+
}>,
|
|
164
|
+
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
165
|
+
return routeMiddleware.map((mw) => ({
|
|
166
|
+
entry: {
|
|
167
|
+
pattern: null,
|
|
168
|
+
regex: null,
|
|
169
|
+
paramNames: [],
|
|
170
|
+
handler: mw.handler,
|
|
171
|
+
mountPrefix: null,
|
|
172
|
+
} as MiddlewareEntry<TEnv>,
|
|
173
|
+
params: mw.params,
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Run onResponse callbacks on an existing Response.
|
|
179
|
+
*
|
|
180
|
+
* Used for code paths that bypass createResponseWithMergedHeaders(), such as
|
|
181
|
+
* middleware short-circuits where the Response is already constructed but
|
|
182
|
+
* ctx.onResponse() callbacks still need to fire.
|
|
183
|
+
*/
|
|
184
|
+
export function finalizeResponse(response: Response): Response {
|
|
185
|
+
const ctx = _getRequestContext();
|
|
186
|
+
if (!ctx || ctx._onResponseCallbacks.length === 0) {
|
|
187
|
+
return response;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Drain the array so callbacks run at most once per request.
|
|
191
|
+
const callbacks = ctx._onResponseCallbacks;
|
|
192
|
+
ctx._onResponseCallbacks = [];
|
|
193
|
+
let result = response;
|
|
194
|
+
for (const callback of callbacks) {
|
|
195
|
+
result = callback(result) ?? result;
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
package/src/rsc/index.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RSC Router - RSC Entry Point
|
|
3
|
+
*
|
|
4
|
+
* This module provides RSC utilities for server-side rendering,
|
|
5
|
+
* server actions, loader fetching, and progressive enhancement.
|
|
6
|
+
*
|
|
7
|
+
* @example Basic usage
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { router } from "./router.js";
|
|
10
|
+
*
|
|
11
|
+
* // Use router.fetch to handle requests
|
|
12
|
+
* export default { fetch: router.fetch };
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// Re-export createRSCHandler for custom handler setup
|
|
17
|
+
export { createRSCHandler } from "./handler.js";
|
|
18
|
+
|
|
19
|
+
// Re-export types
|
|
20
|
+
export type {
|
|
21
|
+
RscPayload,
|
|
22
|
+
ReactFormState,
|
|
23
|
+
RSCDependencies,
|
|
24
|
+
SSRRenderOptions,
|
|
25
|
+
SSRModule,
|
|
26
|
+
LoadSSRModule,
|
|
27
|
+
CreateRSCHandlerOptions,
|
|
28
|
+
HandlerCacheConfig,
|
|
29
|
+
NonceProvider,
|
|
30
|
+
} from "./types.js";
|
|
31
|
+
|
|
32
|
+
// Re-export request context utilities for server-side access to env/request/params
|
|
33
|
+
export {
|
|
34
|
+
getRequestContext,
|
|
35
|
+
requireRequestContext,
|
|
36
|
+
} from "../server/request-context.js";
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader Fetch Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles load() requests (GET, POST, PUT, PATCH, DELETE) from the client.
|
|
5
|
+
* All loader data fetching and mutations go through this endpoint.
|
|
6
|
+
*
|
|
7
|
+
* Route params (e.g. slug from /blog/:slug) come from previewMatch() in the
|
|
8
|
+
* outer coreRequestHandler, threaded through coreRequestHandlerInner as
|
|
9
|
+
* routeParams. This is necessary because handleLoaderFetch doesn't do its
|
|
10
|
+
* own route matching -- the URL is the page's pathname, and previewMatch
|
|
11
|
+
* has already extracted params from it.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { getLoaderLazy } from "../server/loader-registry.js";
|
|
15
|
+
import { executeLoaderMiddleware } from "../router/middleware.js";
|
|
16
|
+
import { requireRequestContext } from "../server/request-context.js";
|
|
17
|
+
import {
|
|
18
|
+
createReverseFunction,
|
|
19
|
+
stripInternalParams,
|
|
20
|
+
} from "../router/handler-context.js";
|
|
21
|
+
import {
|
|
22
|
+
getGlobalRouteMap,
|
|
23
|
+
getSearchSchema,
|
|
24
|
+
isRouteRootScoped,
|
|
25
|
+
} from "../route-map-builder.js";
|
|
26
|
+
import { parseSearchParams } from "../search-params.js";
|
|
27
|
+
import {
|
|
28
|
+
createResponseWithMergedHeaders,
|
|
29
|
+
finalizeResponse,
|
|
30
|
+
} from "./helpers.js";
|
|
31
|
+
import type { HandlerContext } from "./handler-context.js";
|
|
32
|
+
|
|
33
|
+
export async function handleLoaderFetch<TEnv>(
|
|
34
|
+
ctx: HandlerContext<TEnv>,
|
|
35
|
+
request: Request,
|
|
36
|
+
env: TEnv,
|
|
37
|
+
url: URL,
|
|
38
|
+
variables: Record<string, any>,
|
|
39
|
+
routeParams?: Record<string, string>,
|
|
40
|
+
): Promise<Response> {
|
|
41
|
+
const loaderId = url.searchParams.get("_rsc_loader");
|
|
42
|
+
|
|
43
|
+
if (!loaderId) {
|
|
44
|
+
return createResponseWithMergedHeaders("Missing _rsc_loader parameter", {
|
|
45
|
+
status: 400,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Look up loader lazily
|
|
50
|
+
const registeredLoader = await getLoaderLazy(loaderId);
|
|
51
|
+
if (!registeredLoader) {
|
|
52
|
+
return createResponseWithMergedHeaders(
|
|
53
|
+
`Loader "${loaderId}" not found in registry`,
|
|
54
|
+
{ status: 404 },
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Non-fetchable loaders are registered for SSR ctx.use() only.
|
|
59
|
+
// They must not be callable through the standalone _rsc_loader endpoint.
|
|
60
|
+
if (!registeredLoader.fetchable) {
|
|
61
|
+
return createResponseWithMergedHeaders(
|
|
62
|
+
`Loader "${loaderId}" is not fetchable`,
|
|
63
|
+
{ status: 403 },
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Parse params, body, and formData based on request method and content type
|
|
68
|
+
let loaderParams: Record<string, string> = {};
|
|
69
|
+
let loaderBody: unknown = undefined;
|
|
70
|
+
let loaderFormData: FormData | undefined;
|
|
71
|
+
const isBodyMethod = request.method !== "GET" && request.method !== "HEAD";
|
|
72
|
+
|
|
73
|
+
if (isBodyMethod) {
|
|
74
|
+
try {
|
|
75
|
+
const contentType = request.headers.get("content-type") || "";
|
|
76
|
+
if (contentType.includes("multipart/form-data")) {
|
|
77
|
+
// FormData body — sent by load() when body is a FormData instance.
|
|
78
|
+
// Preserves File objects and binary data.
|
|
79
|
+
loaderFormData = await request.formData();
|
|
80
|
+
// Extract params if provided via the special field
|
|
81
|
+
const paramsField = loaderFormData.get("_rsc_loader_params");
|
|
82
|
+
if (typeof paramsField === "string") {
|
|
83
|
+
loaderParams = JSON.parse(paramsField);
|
|
84
|
+
loaderFormData.delete("_rsc_loader_params");
|
|
85
|
+
}
|
|
86
|
+
} else if (contentType.includes("application/json")) {
|
|
87
|
+
const jsonBody = (await request.json()) as {
|
|
88
|
+
params?: Record<string, string>;
|
|
89
|
+
body?: unknown;
|
|
90
|
+
};
|
|
91
|
+
loaderParams = jsonBody.params ?? {};
|
|
92
|
+
loaderBody = jsonBody.body;
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
return createResponseWithMergedHeaders("Invalid request body", {
|
|
96
|
+
status: 400,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
const loaderParamsJson = url.searchParams.get("_rsc_loader_params");
|
|
101
|
+
if (loaderParamsJson) {
|
|
102
|
+
try {
|
|
103
|
+
loaderParams = JSON.parse(loaderParamsJson);
|
|
104
|
+
} catch {
|
|
105
|
+
return createResponseWithMergedHeaders(
|
|
106
|
+
"Invalid _rsc_loader_params JSON",
|
|
107
|
+
{ status: 400 },
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Execute the loader with middleware.
|
|
114
|
+
// finalizeResponse drains onResponse callbacks that middleware short-circuits
|
|
115
|
+
// may leave behind (executeLoaderMiddleware does not finalize them itself).
|
|
116
|
+
try {
|
|
117
|
+
const { fn, middleware } = registeredLoader;
|
|
118
|
+
|
|
119
|
+
return finalizeResponse(
|
|
120
|
+
await executeLoaderMiddleware(
|
|
121
|
+
middleware,
|
|
122
|
+
request,
|
|
123
|
+
env,
|
|
124
|
+
loaderParams,
|
|
125
|
+
variables,
|
|
126
|
+
async () => {
|
|
127
|
+
const reqCtx = requireRequestContext();
|
|
128
|
+
// Merge route params (from previewMatch) with explicit loader params.
|
|
129
|
+
// Explicit params take precedence over route-matched params.
|
|
130
|
+
const resolvedRouteParams = routeParams ?? {};
|
|
131
|
+
const mergedParams = {
|
|
132
|
+
...resolvedRouteParams,
|
|
133
|
+
...loaderParams,
|
|
134
|
+
};
|
|
135
|
+
// Strip _rsc_* transport params so loaders see the same
|
|
136
|
+
// url/searchParams as during SSR/navigation.
|
|
137
|
+
const cleanUrl = stripInternalParams(url);
|
|
138
|
+
const cleanSearchParams = cleanUrl.searchParams;
|
|
139
|
+
const searchSchema = reqCtx._routeName
|
|
140
|
+
? getSearchSchema(reqCtx._routeName)
|
|
141
|
+
: undefined;
|
|
142
|
+
const loaderCtx: any = {
|
|
143
|
+
...reqCtx,
|
|
144
|
+
url: cleanUrl,
|
|
145
|
+
pathname: cleanUrl.pathname,
|
|
146
|
+
searchParams: cleanSearchParams,
|
|
147
|
+
search: searchSchema
|
|
148
|
+
? parseSearchParams(cleanSearchParams, searchSchema)
|
|
149
|
+
: {},
|
|
150
|
+
params: mergedParams,
|
|
151
|
+
routeParams: resolvedRouteParams,
|
|
152
|
+
body: loaderBody,
|
|
153
|
+
method: request.method,
|
|
154
|
+
reverse: createReverseFunction(
|
|
155
|
+
getGlobalRouteMap(),
|
|
156
|
+
reqCtx._routeName,
|
|
157
|
+
mergedParams,
|
|
158
|
+
reqCtx._routeName
|
|
159
|
+
? isRouteRootScoped(reqCtx._routeName)
|
|
160
|
+
: undefined,
|
|
161
|
+
),
|
|
162
|
+
...(loaderFormData ? { formData: loaderFormData } : {}),
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const result = await fn(loaderCtx);
|
|
166
|
+
|
|
167
|
+
interface LoaderPayload {
|
|
168
|
+
loaderResult: unknown;
|
|
169
|
+
}
|
|
170
|
+
const loaderPayload: LoaderPayload = { loaderResult: result };
|
|
171
|
+
const rscStream =
|
|
172
|
+
ctx.renderToReadableStream<LoaderPayload>(loaderPayload);
|
|
173
|
+
|
|
174
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
175
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
createReverseFunction(ctx.getRequiredRouteMap()),
|
|
179
|
+
),
|
|
180
|
+
);
|
|
181
|
+
} catch (error) {
|
|
182
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
183
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
184
|
+
|
|
185
|
+
console.error("[RSC] Loader error:", error);
|
|
186
|
+
|
|
187
|
+
ctx.callOnError(error, "loader", {
|
|
188
|
+
request,
|
|
189
|
+
url,
|
|
190
|
+
env,
|
|
191
|
+
loaderName: loaderId,
|
|
192
|
+
handledByBoundary: false,
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const errorPayload = {
|
|
196
|
+
loaderResult: null,
|
|
197
|
+
loaderError: {
|
|
198
|
+
message: isDev ? err.message : "An error occurred",
|
|
199
|
+
name: err.name,
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
const rscStream = ctx.renderToReadableStream(errorPayload);
|
|
203
|
+
|
|
204
|
+
return createResponseWithMergedHeaders(rscStream, {
|
|
205
|
+
status: 500,
|
|
206
|
+
headers: { "content-type": "text/x-component;charset=utf-8" },
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router Manifest Initialization
|
|
3
|
+
*
|
|
4
|
+
* Builds a fresh route trie from router.urlpatterns for dev/HMR scenarios
|
|
5
|
+
* where the manifest exists but the trie needs rebuilding.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
getGlobalRouteMap,
|
|
10
|
+
hasCachedManifest,
|
|
11
|
+
setCachedManifest,
|
|
12
|
+
getRouteTrie,
|
|
13
|
+
setRouteTrie,
|
|
14
|
+
setRouterManifest,
|
|
15
|
+
setRouterTrie,
|
|
16
|
+
} from "../route-map-builder.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Build a fresh route trie from router.urlpatterns and store it in the
|
|
20
|
+
* per-router cache. Also sets the per-router manifest and merges into
|
|
21
|
+
* the global manifest for reverse()/href().
|
|
22
|
+
*
|
|
23
|
+
* Called when manifest data may exist but the per-router trie is missing,
|
|
24
|
+
* which happens in dev mode after HMR: the virtual module sets the manifest
|
|
25
|
+
* from fresh gen files but skips the trie (which would be stale from initial
|
|
26
|
+
* discovery). The trie is essential for correct wildcard priority -- without
|
|
27
|
+
* it, the regex fallback matches catch-all patterns before specific routes.
|
|
28
|
+
*/
|
|
29
|
+
export async function buildRouterTrieFromUrlpatterns(
|
|
30
|
+
router: any,
|
|
31
|
+
): Promise<void> {
|
|
32
|
+
const { generateManifestFull } =
|
|
33
|
+
await import("../build/generate-manifest.js");
|
|
34
|
+
const generated = generateManifestFull(router.urlpatterns);
|
|
35
|
+
if (
|
|
36
|
+
generated._routeAncestry &&
|
|
37
|
+
Object.keys(generated._routeAncestry).length > 0
|
|
38
|
+
) {
|
|
39
|
+
const { buildRouteTrie } = await import("../build/route-trie.js");
|
|
40
|
+
// Map each route to its include() staticPrefix so the trie
|
|
41
|
+
// returns the correct sp for lazy entry lookup in findMatch.
|
|
42
|
+
const routeToStaticPrefix: Record<string, string> = {};
|
|
43
|
+
for (const name of Object.keys(generated.routeManifest)) {
|
|
44
|
+
routeToStaticPrefix[name] = "";
|
|
45
|
+
}
|
|
46
|
+
// Override with prefix from include() entries so the trie
|
|
47
|
+
// returns the correct sp for lazy entry lookup in findMatch.
|
|
48
|
+
// Walk recursively to include routes in nested includes.
|
|
49
|
+
if (generated.prefixTree) {
|
|
50
|
+
const visitPrefixNode = (node: any): void => {
|
|
51
|
+
const sp = node.staticPrefix || "";
|
|
52
|
+
for (const route of node.routes || []) {
|
|
53
|
+
routeToStaticPrefix[route] = sp;
|
|
54
|
+
}
|
|
55
|
+
for (const child of Object.values(node.children || {})) {
|
|
56
|
+
visitPrefixNode(child);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
for (const node of Object.values(generated.prefixTree)) {
|
|
60
|
+
visitPrefixNode(node);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const trie = buildRouteTrie(
|
|
64
|
+
generated.routeManifest,
|
|
65
|
+
generated._routeAncestry,
|
|
66
|
+
routeToStaticPrefix,
|
|
67
|
+
generated.routeTrailingSlash,
|
|
68
|
+
generated.prerenderRoutes
|
|
69
|
+
? new Set(generated.prerenderRoutes)
|
|
70
|
+
: undefined,
|
|
71
|
+
generated.passthroughRoutes
|
|
72
|
+
? new Set(generated.passthroughRoutes)
|
|
73
|
+
: undefined,
|
|
74
|
+
generated.responseTypeRoutes,
|
|
75
|
+
);
|
|
76
|
+
setRouterTrie(router.id, trie);
|
|
77
|
+
// Set global trie only if not already set by another router
|
|
78
|
+
if (!getRouteTrie()) {
|
|
79
|
+
setRouteTrie(trie);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
setRouterManifest(router.id, generated.routeManifest);
|
|
83
|
+
// Merge into global manifest (needed for reverse/href across routers)
|
|
84
|
+
const existing = hasCachedManifest() ? getGlobalRouteMap() : {};
|
|
85
|
+
setCachedManifest({ ...existing, ...generated.routeManifest });
|
|
86
|
+
}
|
package/src/rsc/nonce.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nonce generation for Content Security Policy (CSP)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ContextVar } from "../context-var.js";
|
|
6
|
+
import { createVar } from "../context-var.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Typed ContextVar token for CSP nonce.
|
|
10
|
+
*
|
|
11
|
+
* Use this to access the nonce in middleware or handlers:
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { nonce } from "@rangojs/router";
|
|
14
|
+
* const value = ctx.get(nonce); // string | undefined
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export const nonce: ContextVar<string> = createVar<string>();
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Generate a cryptographic nonce for CSP.
|
|
21
|
+
* Returns a 16-byte random value encoded as base64.
|
|
22
|
+
*/
|
|
23
|
+
export function generateNonce(): string {
|
|
24
|
+
const array = new Uint8Array(16);
|
|
25
|
+
crypto.getRandomValues(array);
|
|
26
|
+
// Convert to base64
|
|
27
|
+
let binary = "";
|
|
28
|
+
for (let i = 0; i < array.length; i++) {
|
|
29
|
+
binary += String.fromCharCode(array[i]);
|
|
30
|
+
}
|
|
31
|
+
return btoa(binary);
|
|
32
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Origin Guard
|
|
3
|
+
*
|
|
4
|
+
* Cross-origin request protection for server actions, loader fetches, and
|
|
5
|
+
* progressive enhancement form submissions. Validates that the Origin header
|
|
6
|
+
* (or Referer fallback) matches the request Host before executing.
|
|
7
|
+
*
|
|
8
|
+
* Requests without an Origin or Referer header are allowed — same-origin
|
|
9
|
+
* navigations, bookmarks, and non-browser clients don't send Origin.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Request phase that triggered the origin check.
|
|
14
|
+
*/
|
|
15
|
+
export type OriginCheckPhase = "action" | "loader" | "pe-form";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Context passed to the originCheck callback.
|
|
19
|
+
*/
|
|
20
|
+
export interface OriginCheckContext<TEnv = any> {
|
|
21
|
+
request: Request;
|
|
22
|
+
url: URL;
|
|
23
|
+
env: TEnv;
|
|
24
|
+
routerId: string;
|
|
25
|
+
phase: OriginCheckPhase;
|
|
26
|
+
/** Run the built-in conservative check (Origin/Referer vs Host + url.protocol). */
|
|
27
|
+
defaultCheck: () => boolean;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Configuration for the origin check.
|
|
32
|
+
*
|
|
33
|
+
* - `true` (default) — built-in conservative check
|
|
34
|
+
* - `false` — disabled
|
|
35
|
+
* - function — custom control; return true to allow, false to reject with
|
|
36
|
+
* default 403, or a Response for custom rejection
|
|
37
|
+
*/
|
|
38
|
+
export type OriginCheckConfig<TEnv = any> =
|
|
39
|
+
| boolean
|
|
40
|
+
| ((
|
|
41
|
+
ctx: OriginCheckContext<TEnv>,
|
|
42
|
+
) => boolean | Response | Promise<boolean | Response>);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Built-in conservative origin check.
|
|
46
|
+
* Compares Origin (or Referer fallback) against Host + url.protocol.
|
|
47
|
+
* Does NOT trust X-Forwarded-Host/Proto headers.
|
|
48
|
+
*
|
|
49
|
+
* Returns true to allow, false to reject.
|
|
50
|
+
*/
|
|
51
|
+
export function defaultOriginCheck(request: Request, url: URL): boolean {
|
|
52
|
+
// 1. Read Origin header (present on all cross-origin requests and
|
|
53
|
+
// same-origin POST/PUT/PATCH/DELETE in modern browsers)
|
|
54
|
+
let requestOrigin = request.headers.get("origin");
|
|
55
|
+
|
|
56
|
+
// 2. Fallback to Referer if Origin is absent (some proxies strip it)
|
|
57
|
+
if (!requestOrigin) {
|
|
58
|
+
const referer = request.headers.get("referer");
|
|
59
|
+
if (referer) {
|
|
60
|
+
try {
|
|
61
|
+
requestOrigin = new URL(referer).origin;
|
|
62
|
+
} catch {
|
|
63
|
+
// Malformed referer — treat as absent
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 3. No Origin or Referer — allow (can't be browser-initiated CSRF)
|
|
69
|
+
if (!requestOrigin) return true;
|
|
70
|
+
|
|
71
|
+
// "null" origin comes from privacy-sensitive contexts (data: URLs,
|
|
72
|
+
// sandboxed iframes, cross-origin redirects). Reject it.
|
|
73
|
+
if (requestOrigin === "null") return false;
|
|
74
|
+
|
|
75
|
+
// 4. Determine expected host from Host header or URL.
|
|
76
|
+
// X-Forwarded-Host/Proto are NOT used — they are client-controllable
|
|
77
|
+
// unless a trusted proxy strips them. On standard deployments (Cloudflare
|
|
78
|
+
// Workers, Node behind nginx/caddy) the Host header is already correct.
|
|
79
|
+
// For non-standard setups, use the custom function escape hatch.
|
|
80
|
+
const expectedHost = request.headers.get("host") || url.host;
|
|
81
|
+
const expectedProtocol = url.protocol;
|
|
82
|
+
|
|
83
|
+
// 5. Build expected origin and compare (case-insensitive)
|
|
84
|
+
const expectedOrigin = `${expectedProtocol}//${expectedHost}`;
|
|
85
|
+
|
|
86
|
+
return requestOrigin.toLowerCase() === expectedOrigin.toLowerCase();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function createForbiddenResponse(request: Request): Response {
|
|
90
|
+
const isDev = process.env.NODE_ENV !== "production";
|
|
91
|
+
const body = isDev
|
|
92
|
+
? "Forbidden: Origin mismatch. The request origin does not match the server host. " +
|
|
93
|
+
`Set originCheck: false in createRouter() to disable this check. ` +
|
|
94
|
+
`(Origin: ${request.headers.get("origin") ?? "none"}, ` +
|
|
95
|
+
`Host: ${request.headers.get("host") ?? "none"})`
|
|
96
|
+
: "Forbidden";
|
|
97
|
+
|
|
98
|
+
return new Response(body, {
|
|
99
|
+
status: 403,
|
|
100
|
+
headers: { "X-Rango-Origin-Check": "failed" },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Configuration-aware origin check dispatcher.
|
|
106
|
+
* Builds the OriginCheckContext and delegates to the configured check.
|
|
107
|
+
*/
|
|
108
|
+
export async function checkRequestOrigin<TEnv = any>(
|
|
109
|
+
request: Request,
|
|
110
|
+
url: URL,
|
|
111
|
+
config: OriginCheckConfig<TEnv> | undefined,
|
|
112
|
+
env: TEnv,
|
|
113
|
+
routerId: string,
|
|
114
|
+
phase: OriginCheckPhase,
|
|
115
|
+
): Promise<Response | null> {
|
|
116
|
+
// Disabled by explicit opt-out
|
|
117
|
+
if (config === false) return null;
|
|
118
|
+
|
|
119
|
+
// Default: built-in validation (config === true or undefined)
|
|
120
|
+
if (config === true || config === undefined) {
|
|
121
|
+
const allowed = defaultOriginCheck(request, url);
|
|
122
|
+
if (allowed) return null;
|
|
123
|
+
return createForbiddenResponse(request);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Custom function — build context and call
|
|
127
|
+
const ctx: OriginCheckContext<TEnv> = {
|
|
128
|
+
request,
|
|
129
|
+
url,
|
|
130
|
+
env,
|
|
131
|
+
routerId,
|
|
132
|
+
phase,
|
|
133
|
+
defaultCheck: () => defaultOriginCheck(request, url),
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
const result = await config(ctx);
|
|
137
|
+
|
|
138
|
+
if (result instanceof Response) return result;
|
|
139
|
+
if (result === true) return null;
|
|
140
|
+
return createForbiddenResponse(request);
|
|
141
|
+
}
|