@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.131
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 +1040 -5
- 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 +1712 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
- 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/{src/handles/index.ts → dist/handles/index.js} +1 -1
- 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/testing/vitest.js +82 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +6263 -2733
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +123 -68
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +312 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +486 -0
- package/skills/caching/SKILL.md +349 -24
- package/skills/composability/SKILL.md +197 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +278 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +175 -8
- package/skills/layout/SKILL.md +128 -5
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +604 -54
- package/skills/middleware/SKILL.md +213 -37
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +41 -10
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +276 -3
- package/skills/prerender/SKILL.md +432 -52
- package/skills/rango/SKILL.md +313 -21
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +248 -120
- package/skills/route/SKILL.md +287 -21
- package/skills/router-setup/SKILL.md +231 -33
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +547 -107
- package/skills/use-cache/SKILL.md +355 -0
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +162 -200
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +323 -563
- package/src/browser/navigation-client.ts +219 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +104 -112
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +328 -348
- package/src/browser/prefetch/cache.ts +324 -0
- package/src/browser/prefetch/fetch.ts +357 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +194 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +253 -71
- package/src/browser/react/NavigationProvider.tsx +155 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +53 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +260 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- 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 +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-link-status.ts +6 -9
- package/src/browser/react/use-navigation.ts +44 -68
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +124 -0
- package/src/browser/rsc-router.tsx +290 -72
- package/src/browser/scroll-restoration.ts +132 -49
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +621 -613
- package/src/browser/types.ts +175 -50
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +123 -56
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +9 -6
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +165 -34
- 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 +113 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +131 -0
- package/src/build/route-types/router-processing.ts +651 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +220 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +165 -0
- package/src/cache/cache-runtime.ts +444 -0
- package/src/cache/cache-scope.ts +231 -325
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2644 -75
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +172 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +104 -0
- package/src/cache/index.ts +11 -35
- package/src/cache/memory-segment-store.ts +307 -30
- package/src/cache/profile-registry.ts +49 -0
- package/src/cache/read-through-swr.ts +164 -0
- package/src/cache/segment-codec.ts +240 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +94 -211
- package/src/client.rsc.tsx +8 -21
- package/src/client.tsx +123 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +106 -10
- package/src/handle.ts +76 -23
- package/src/handles/MetaTags.tsx +73 -34
- package/src/handles/breadcrumbs.ts +77 -0
- package/src/handles/meta.ts +30 -52
- package/src/host/cookie-handler.ts +21 -51
- package/src/host/errors.ts +8 -32
- package/src/host/index.ts +12 -9
- package/src/host/pattern-matcher.ts +34 -77
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +174 -34
- package/src/index.ts +241 -73
- package/src/internal-debug.ts +8 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +4 -7
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +14 -13
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +445 -24
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +10 -72
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +90 -0
- package/src/route-definition/helpers-types.ts +506 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +135 -0
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +72 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +22 -26
- package/src/router/find-match.ts +181 -0
- package/src/router/handler-context.ts +372 -125
- package/src/router/instrument.ts +346 -0
- package/src/router/intercept-resolution.ts +34 -27
- package/src/router/lazy-includes.ts +200 -0
- package/src/router/loader-resolution.ts +381 -147
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +88 -51
- package/src/router/match-api.ts +162 -245
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +90 -89
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +75 -33
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +421 -413
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +263 -79
- package/src/router/prerender-match.ts +541 -0
- package/src/router/preview-match.ts +100 -0
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +143 -44
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +41 -47
- package/src/router/router-interfaces.ts +525 -0
- package/src/router/router-options.ts +726 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +747 -0
- package/src/router/segment-resolution/helpers.ts +314 -0
- package/src/router/segment-resolution/loader-cache.ts +207 -0
- package/src/router/segment-resolution/revalidation.ts +1322 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +24 -1354
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +172 -60
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +748 -2376
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +861 -1141
- package/src/rsc/helpers.ts +269 -19
- package/src/rsc/index.ts +1 -21
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +235 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +413 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +374 -0
- package/src/rsc/rsc-rendering.ts +261 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +376 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/types.ts +58 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +70 -74
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +292 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +439 -85
- package/src/server/cookie-store.ts +265 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +112 -31
- package/src/server/loader-registry.ts +23 -82
- package/src/server/request-context.ts +724 -143
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +113 -36
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +21 -67
- package/src/theme/ThemeScript.tsx +5 -11
- package/src/theme/constants.ts +5 -14
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +21 -32
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +79 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +126 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +171 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +160 -0
- package/src/urls/index.ts +43 -0
- package/src/urls/path-helper-types.ts +386 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +291 -0
- package/src/urls/urls-function.ts +81 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +406 -141
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +17 -2259
- package/src/vite/plugin-types.ts +221 -0
- package/src/vite/plugins/cjs-to-esm.ts +83 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +13 -87
- package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +806 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/version-injector.ts +79 -0
- package/src/vite/plugins/version-plugin.ts +275 -0
- package/src/vite/plugins/virtual-entries.ts +108 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +444 -0
- package/src/vite/router-discovery.ts +1581 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +223 -0
- package/src/vite/utils/shared-utils.ts +219 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/router/middleware.ts
CHANGED
|
@@ -1,183 +1,53 @@
|
|
|
1
1
|
/// <reference types="vite/types/importMeta.d.ts" />
|
|
2
|
-
/**
|
|
3
|
-
* Middleware Execution
|
|
4
|
-
*
|
|
5
|
-
* True middleware that wraps the entire RSC handler.
|
|
6
|
-
* - `await next()` returns actual Response
|
|
7
|
-
* - Can modify response headers
|
|
8
|
-
* - Can catch errors from RSC rendering
|
|
9
|
-
* - Forgiving API: if middleware doesn't return, original response is used
|
|
10
|
-
*/
|
|
11
2
|
|
|
12
|
-
import
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Context passed to middleware
|
|
54
|
-
*
|
|
55
|
-
* @template TEnv - Environment type (bindings, variables) - defaults to any for internal flexibility
|
|
56
|
-
* @template TParams - URL params type (typed for route middleware, Record<string, string> for global middleware)
|
|
57
|
-
*/
|
|
58
|
-
export interface MiddlewareContext<
|
|
59
|
-
TEnv = any,
|
|
60
|
-
TParams = Record<string, string>,
|
|
61
|
-
> {
|
|
62
|
-
/** Original request */
|
|
63
|
-
request: Request;
|
|
64
|
-
|
|
65
|
-
/** Parsed URL */
|
|
66
|
-
url: URL;
|
|
67
|
-
|
|
68
|
-
/** URL pathname */
|
|
69
|
-
pathname: string;
|
|
70
|
-
|
|
71
|
-
/** URL search params */
|
|
72
|
-
searchParams: URLSearchParams;
|
|
73
|
-
|
|
74
|
-
/** Platform bindings (Cloudflare, etc.) */
|
|
75
|
-
env: TEnv extends RouterEnv<infer B, unknown> ? B : {};
|
|
76
|
-
|
|
77
|
-
/** URL params extracted from route/middleware pattern */
|
|
78
|
-
params: TParams;
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Response object - available immediately via stub, real response after `await next()`
|
|
82
|
-
*
|
|
83
|
-
* Headers set before `next()` are merged into the final response.
|
|
84
|
-
* Can be used to modify headers directly like Hono's `c.res`.
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* ```typescript
|
|
88
|
-
* middleware(async (ctx, next) => {
|
|
89
|
-
* // Set headers BEFORE next() - will be merged into final response
|
|
90
|
-
* ctx.res.headers.set('X-Request-Id', generateId());
|
|
91
|
-
*
|
|
92
|
-
* await next();
|
|
93
|
-
*
|
|
94
|
-
* // Set headers AFTER next() - applied directly
|
|
95
|
-
* ctx.res.headers.set('X-Custom', 'value');
|
|
96
|
-
* // No return needed!
|
|
97
|
-
* });
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
res: Response;
|
|
101
|
-
|
|
102
|
-
/** Get a cookie value */
|
|
103
|
-
cookie(name: string): string | undefined;
|
|
104
|
-
|
|
105
|
-
/** Get all cookies as object */
|
|
106
|
-
cookies(): Record<string, string>;
|
|
107
|
-
|
|
108
|
-
/** Set a cookie on the response */
|
|
109
|
-
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
110
|
-
|
|
111
|
-
/** Delete a cookie */
|
|
112
|
-
deleteCookie(
|
|
113
|
-
name: string,
|
|
114
|
-
options?: Pick<CookieOptions, "domain" | "path">
|
|
115
|
-
): void;
|
|
116
|
-
|
|
117
|
-
/** Get a context variable (shared with route handlers) */
|
|
118
|
-
get: GetVariableFn<TEnv>;
|
|
119
|
-
|
|
120
|
-
/** Set a context variable (shared with route handlers) */
|
|
121
|
-
set: SetVariableFn<TEnv>;
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Set a response header - can be called before or after `next()`
|
|
125
|
-
*
|
|
126
|
-
* When called before `next()`, headers are queued and merged into the final response.
|
|
127
|
-
* When called after `next()`, headers are set directly on the response.
|
|
128
|
-
* Shorthand for `ctx.res.headers.set()`.
|
|
129
|
-
*/
|
|
130
|
-
header(name: string, value: string): void;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Middleware function signature
|
|
135
|
-
*
|
|
136
|
-
* @template TEnv - Environment type - defaults to any for internal flexibility
|
|
137
|
-
* @template TParams - URL params type (typed for route middleware)
|
|
138
|
-
*
|
|
139
|
-
* When using middleware with global augmentation (RSCRouter.Env), explicitly
|
|
140
|
-
* annotate your middleware functions, or the types will be inferred from context:
|
|
141
|
-
*
|
|
142
|
-
* @example
|
|
143
|
-
* ```typescript
|
|
144
|
-
* // With explicit annotation (recommended for reusable middleware)
|
|
145
|
-
* const authMiddleware: MiddlewareFn<AppEnv> = async (ctx, next) => {...}
|
|
146
|
-
*
|
|
147
|
-
* // Types inferred from router.use() call
|
|
148
|
-
* router.use((ctx, next) => {...}) // ctx is typed from router's TEnv
|
|
149
|
-
* ```
|
|
150
|
-
*/
|
|
151
|
-
export type MiddlewareFn<TEnv = any, TParams = Record<string, string>> = (
|
|
152
|
-
ctx: MiddlewareContext<TEnv, TParams>,
|
|
153
|
-
next: () => Promise<Response>
|
|
154
|
-
) => Response | void | Promise<Response | void>;
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Stored middleware entry with pattern matching info
|
|
158
|
-
* @internal - uses any for internal flexibility
|
|
159
|
-
*/
|
|
160
|
-
export interface MiddlewareEntry<TEnv = any> {
|
|
161
|
-
/** Original pattern string */
|
|
162
|
-
pattern: string | null;
|
|
163
|
-
|
|
164
|
-
/** Compiled regex for matching */
|
|
165
|
-
regex: RegExp | null;
|
|
166
|
-
|
|
167
|
-
/** Param names extracted from pattern */
|
|
168
|
-
paramNames: string[];
|
|
3
|
+
import { contextGet, contextSet } from "../context-var.js";
|
|
4
|
+
import { safeDecodeURIComponent } from "./url-params.js";
|
|
5
|
+
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
6
|
+
import type {
|
|
7
|
+
CollectedMiddleware,
|
|
8
|
+
MiddlewareCollectableEntry,
|
|
9
|
+
MiddlewareContext,
|
|
10
|
+
MiddlewareEntry,
|
|
11
|
+
MiddlewareFn,
|
|
12
|
+
ResponseHolder,
|
|
13
|
+
} from "./middleware-types.js";
|
|
14
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
15
|
+
import {
|
|
16
|
+
EXTERNAL_REDIRECT_MARKER,
|
|
17
|
+
isExternalRedirect,
|
|
18
|
+
markExternalRedirect,
|
|
19
|
+
} from "../redirect-origin.js";
|
|
20
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
21
|
+
import { appendMetric, createMetricsStore } from "./metrics.js";
|
|
22
|
+
import { observePhase, PHASES } from "./instrument.js";
|
|
23
|
+
import { stripInternalParams } from "./handler-context.js";
|
|
24
|
+
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
25
|
+
|
|
26
|
+
// Re-export types consumed through this module's path.
|
|
27
|
+
export type {
|
|
28
|
+
CookieOptions,
|
|
29
|
+
MiddlewareContext,
|
|
30
|
+
MiddlewareEntry,
|
|
31
|
+
MiddlewareFn,
|
|
32
|
+
} from "./middleware-types.js";
|
|
33
|
+
|
|
34
|
+
const MIDDLEWARE_METRIC_DEPTH = 1;
|
|
35
|
+
const POST_METRIC_MIN_DURATION_MS = 0.01;
|
|
36
|
+
|
|
37
|
+
function getMiddlewareMetricLabel<TEnv>(
|
|
38
|
+
entry: MiddlewareEntry<TEnv>,
|
|
39
|
+
ordinal: number,
|
|
40
|
+
): string {
|
|
41
|
+
const handlerName = entry.handler.name?.trim();
|
|
42
|
+
const scope = entry.pattern ?? "*";
|
|
169
43
|
|
|
170
|
-
|
|
171
|
-
|
|
44
|
+
if (handlerName) {
|
|
45
|
+
return `middleware:${handlerName}@${scope}`;
|
|
46
|
+
}
|
|
172
47
|
|
|
173
|
-
|
|
174
|
-
mountPrefix: string | null;
|
|
48
|
+
return `middleware:${scope}#${ordinal + 1}`;
|
|
175
49
|
}
|
|
176
50
|
|
|
177
|
-
/**
|
|
178
|
-
* Parse a route pattern into regex and param names
|
|
179
|
-
* Supports: *, /path, /path/*, /path/:param, /path/:param/*
|
|
180
|
-
*/
|
|
181
51
|
export function parsePattern(pattern: string): {
|
|
182
52
|
regex: RegExp;
|
|
183
53
|
paramNames: string[];
|
|
@@ -226,168 +96,168 @@ function escapeRegex(str: string): string {
|
|
|
226
96
|
}
|
|
227
97
|
|
|
228
98
|
/**
|
|
229
|
-
* Extract params from a pathname using a pattern's regex and param names
|
|
99
|
+
* Extract params from a pathname using a pattern's regex and param names.
|
|
100
|
+
*
|
|
101
|
+
* Values are URL-decoded so apps see the raw string (e.g. "ivo@example.com")
|
|
102
|
+
* instead of the percent-encoded form ("ivo%40example.com"). This matches the
|
|
103
|
+
* contract assumed by ctx.reverse (which re-encodes) and aligns with
|
|
104
|
+
* Express/React Router/Fastify/Koa.
|
|
230
105
|
*/
|
|
231
106
|
export function extractParams(
|
|
232
107
|
pathname: string,
|
|
233
108
|
regex: RegExp,
|
|
234
|
-
paramNames: string[]
|
|
109
|
+
paramNames: string[],
|
|
235
110
|
): Record<string, string> {
|
|
236
111
|
const match = pathname.match(regex);
|
|
237
112
|
if (!match) return {};
|
|
238
113
|
|
|
239
114
|
const params: Record<string, string> = {};
|
|
240
115
|
for (let i = 0; i < paramNames.length; i++) {
|
|
241
|
-
params[paramNames[i]] = match[i + 1] || "";
|
|
116
|
+
params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
|
|
242
117
|
}
|
|
243
118
|
return params;
|
|
244
119
|
}
|
|
245
120
|
|
|
246
|
-
/**
|
|
247
|
-
* Parse cookies from Cookie header
|
|
248
|
-
*/
|
|
249
|
-
export function parseCookies(
|
|
250
|
-
cookieHeader: string | null
|
|
251
|
-
): Record<string, string> {
|
|
252
|
-
if (!cookieHeader) return {};
|
|
253
|
-
|
|
254
|
-
const cookies: Record<string, string> = {};
|
|
255
|
-
const pairs = cookieHeader.split(";");
|
|
256
|
-
|
|
257
|
-
for (const pair of pairs) {
|
|
258
|
-
const [name, ...rest] = pair.trim().split("=");
|
|
259
|
-
if (name) {
|
|
260
|
-
cookies[name] = decodeURIComponent(rest.join("="));
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
return cookies;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Serialize a cookie for Set-Cookie header
|
|
269
|
-
*/
|
|
270
|
-
export function serializeCookie(
|
|
271
|
-
name: string,
|
|
272
|
-
value: string,
|
|
273
|
-
options: CookieOptions = {}
|
|
274
|
-
): string {
|
|
275
|
-
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
276
|
-
|
|
277
|
-
if (options.domain) cookie += `; Domain=${options.domain}`;
|
|
278
|
-
if (options.path) cookie += `; Path=${options.path}`;
|
|
279
|
-
if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;
|
|
280
|
-
if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;
|
|
281
|
-
if (options.httpOnly) cookie += "; HttpOnly";
|
|
282
|
-
if (options.secure) cookie += "; Secure";
|
|
283
|
-
if (options.sameSite) cookie += `; SameSite=${options.sameSite}`;
|
|
284
|
-
|
|
285
|
-
return cookie;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Mutable response holder - allows ctx.res to be updated after next() is called
|
|
290
|
-
*/
|
|
291
|
-
export interface ResponseHolder {
|
|
292
|
-
response: Response | null;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
121
|
/**
|
|
296
122
|
* Create middleware context
|
|
297
123
|
*
|
|
298
124
|
* Note: The implementation uses runtime values while the interface provides
|
|
299
125
|
* compile-time type safety. The env/get/set types are resolved at call sites
|
|
300
|
-
* via conditional types based on TEnv
|
|
126
|
+
* via conditional types based on TEnv from createRouter<TBindings>().
|
|
301
127
|
*/
|
|
302
128
|
export function createMiddlewareContext<TEnv>(
|
|
303
129
|
request: Request,
|
|
304
130
|
env: TEnv,
|
|
305
131
|
params: Record<string, string>,
|
|
306
132
|
variables: Record<string, unknown>,
|
|
307
|
-
responseHolder: ResponseHolder
|
|
133
|
+
responseHolder: ResponseHolder,
|
|
134
|
+
reverse?: (
|
|
135
|
+
name: string,
|
|
136
|
+
params?: Record<string, string>,
|
|
137
|
+
search?: Record<string, unknown>,
|
|
138
|
+
) => string,
|
|
308
139
|
): MiddlewareContext<TEnv> {
|
|
309
|
-
const url = new URL(request.url);
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
140
|
+
const url = stripInternalParams(new URL(request.url));
|
|
141
|
+
|
|
142
|
+
// Track the initial response to detect pre/post-next() phase.
|
|
143
|
+
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
144
|
+
// After next(): responseHolder.response is the real downstream response.
|
|
145
|
+
const initialResponse = responseHolder.response;
|
|
146
|
+
const isPreNext = () => responseHolder.response === initialResponse;
|
|
147
|
+
|
|
148
|
+
// Delegation strategy for RequestContext (reqCtx):
|
|
149
|
+
// - res getter: before next() returns shared reqCtx stub; after next() returns
|
|
150
|
+
// the real downstream response.
|
|
151
|
+
// - header(): before next() delegates to reqCtx; after next() writes to the
|
|
152
|
+
// real downstream response.
|
|
153
|
+
// Cookie operations are handled by the standalone cookies() function which
|
|
154
|
+
// delegates to the shared RequestContext internally.
|
|
313
155
|
// The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
|
|
156
|
+
// Internal helper: resolve the current response (stub before next(), real after).
|
|
157
|
+
// Not exposed on the public MiddlewareContext type — use ctx.headers instead.
|
|
158
|
+
const getResponse = (): Response => {
|
|
159
|
+
if (isPreNext()) {
|
|
160
|
+
const reqCtx = _getRequestContext();
|
|
161
|
+
if (reqCtx) return reqCtx.res;
|
|
162
|
+
}
|
|
163
|
+
if (!responseHolder.response) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
"Response is not available - responseHolder was not initialized",
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return responseHolder.response;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// Capture reqCtx once: the request-scoped platform fields
|
|
172
|
+
// (originalUrl, executionContext, waitUntil) are immutable per request,
|
|
173
|
+
// so snapshotting beats re-reading ALS on every access. The lazy getters
|
|
174
|
+
// below (routeName, theme, setTheme) stay lazy because those can change
|
|
175
|
+
// during `await next()`.
|
|
176
|
+
const reqCtx = _getRequestContext();
|
|
314
177
|
return {
|
|
315
178
|
request,
|
|
316
179
|
url,
|
|
180
|
+
originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
|
|
317
181
|
pathname: url.pathname,
|
|
318
182
|
searchParams: url.searchParams,
|
|
319
183
|
env: env as MiddlewareContext<TEnv>["env"],
|
|
320
184
|
params,
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
185
|
+
executionContext: reqCtx?.executionContext,
|
|
186
|
+
waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
|
|
187
|
+
// Getter: re-derives from request context on each access so that global
|
|
188
|
+
// middleware sees the matched route name after await next().
|
|
189
|
+
get routeName(): MiddlewareContext<TEnv>["routeName"] {
|
|
190
|
+
const reqCtx = _getRequestContext();
|
|
191
|
+
const raw = reqCtx?._routeName;
|
|
192
|
+
return (
|
|
193
|
+
raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
|
|
194
|
+
) as MiddlewareContext<TEnv>["routeName"];
|
|
330
195
|
},
|
|
331
196
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
responseHolder.response = response;
|
|
197
|
+
get headers(): Headers {
|
|
198
|
+
return getResponse().headers;
|
|
335
199
|
},
|
|
336
200
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
parsedCookies = parseCookies(cookieHeader);
|
|
340
|
-
}
|
|
341
|
-
return parsedCookies[name];
|
|
342
|
-
},
|
|
201
|
+
get: ((keyOrVar: any) =>
|
|
202
|
+
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
343
203
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
204
|
+
set: ((keyOrVar: any, value: unknown, options?: any) => {
|
|
205
|
+
contextSet(variables, keyOrVar, value, options);
|
|
206
|
+
}) as MiddlewareContext<TEnv>["set"],
|
|
207
|
+
header(name: string, value: string): void {
|
|
208
|
+
// Before next(): delegate to shared RequestContext stub
|
|
209
|
+
if (isPreNext()) {
|
|
210
|
+
const reqCtx = _getRequestContext();
|
|
211
|
+
if (reqCtx) {
|
|
212
|
+
reqCtx.header(name, value);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
347
215
|
}
|
|
348
|
-
|
|
349
|
-
},
|
|
350
|
-
|
|
351
|
-
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
216
|
+
// After next() or standalone: write to current response
|
|
352
217
|
if (!responseHolder.response) {
|
|
353
218
|
throw new Error(
|
|
354
|
-
"ctx.
|
|
219
|
+
"ctx.header() is not available - responseHolder was not initialized",
|
|
355
220
|
);
|
|
356
221
|
}
|
|
357
|
-
responseHolder.response.headers.
|
|
358
|
-
"Set-Cookie",
|
|
359
|
-
serializeCookie(name, value, options)
|
|
360
|
-
);
|
|
222
|
+
responseHolder.response.headers.set(name, value);
|
|
361
223
|
},
|
|
362
224
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
225
|
+
get theme(): MiddlewareContext<TEnv>["theme"] {
|
|
226
|
+
return _getRequestContext()?.theme;
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
|
|
230
|
+
return _getRequestContext()?.setTheme;
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
setLocationState(entries) {
|
|
234
|
+
const reqCtx = _getRequestContext();
|
|
235
|
+
if (!reqCtx) {
|
|
368
236
|
throw new Error(
|
|
369
|
-
"
|
|
237
|
+
"setLocationState() is not available outside a request context",
|
|
370
238
|
);
|
|
371
239
|
}
|
|
372
|
-
|
|
373
|
-
"Set-Cookie",
|
|
374
|
-
serializeCookie(name, "", { ...options, maxAge: 0 })
|
|
375
|
-
);
|
|
240
|
+
reqCtx.setLocationState(entries);
|
|
376
241
|
},
|
|
377
242
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
if (!responseHolder.response) {
|
|
243
|
+
reverse:
|
|
244
|
+
reverse ??
|
|
245
|
+
((
|
|
246
|
+
name: string,
|
|
247
|
+
_params?: Record<string, string>,
|
|
248
|
+
_search?: Record<string, unknown>,
|
|
249
|
+
) => {
|
|
386
250
|
throw new Error(
|
|
387
|
-
|
|
251
|
+
`ctx.reverse(${JSON.stringify(name)}) is not available: no route map is bound to this middleware context.`,
|
|
388
252
|
);
|
|
253
|
+
}),
|
|
254
|
+
|
|
255
|
+
debugPerformance(): void {
|
|
256
|
+
const reqCtx = _getRequestContext();
|
|
257
|
+
if (reqCtx) {
|
|
258
|
+
reqCtx._debugPerformance = true;
|
|
259
|
+
reqCtx._metricsStore ??= createMetricsStore(true);
|
|
389
260
|
}
|
|
390
|
-
responseHolder.response.headers.set(name, value);
|
|
391
261
|
},
|
|
392
262
|
};
|
|
393
263
|
}
|
|
@@ -398,7 +268,7 @@ export function createMiddlewareContext<TEnv>(
|
|
|
398
268
|
*/
|
|
399
269
|
export function matchMiddleware<TEnv>(
|
|
400
270
|
pathname: string,
|
|
401
|
-
entries: MiddlewareEntry<TEnv>[]
|
|
271
|
+
entries: MiddlewareEntry<TEnv>[],
|
|
402
272
|
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
403
273
|
const matches: Array<{
|
|
404
274
|
entry: MiddlewareEntry<TEnv>;
|
|
@@ -422,15 +292,97 @@ export function matchMiddleware<TEnv>(
|
|
|
422
292
|
return matches;
|
|
423
293
|
}
|
|
424
294
|
|
|
295
|
+
// Set-Cookie is appended; for other headers stubOverridesNonCookie=true
|
|
296
|
+
// overwrites (chain ran to completion), false fills only missing slots (an
|
|
297
|
+
// explicit short-circuit Response's own headers win).
|
|
298
|
+
function mergeStubHeaders(
|
|
299
|
+
target: Headers,
|
|
300
|
+
stub: Headers,
|
|
301
|
+
stubOverridesNonCookie: boolean,
|
|
302
|
+
): void {
|
|
303
|
+
stub.forEach((value, name) => {
|
|
304
|
+
// The reserved external-redirect marker is internal and never a trust
|
|
305
|
+
// signal; never copy a stub value (e.g. a stray ctx.header() call) onto a
|
|
306
|
+
// browser-facing response. The opt-in is the out-of-band brand.
|
|
307
|
+
if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
|
|
308
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
309
|
+
target.append(name, value);
|
|
310
|
+
} else if (stubOverridesNonCookie || !target.has(name)) {
|
|
311
|
+
target.set(name, value);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Set-Cookie is deduped so a nested inner executeMiddleware that already merged
|
|
317
|
+
// the same reqCtx cookies does not duplicate them; other headers fill if missing.
|
|
318
|
+
function mergeReqCtxStub(
|
|
319
|
+
target: Headers,
|
|
320
|
+
reqCtx: ReturnType<typeof _getRequestContext>,
|
|
321
|
+
): void {
|
|
322
|
+
if (!reqCtx) return;
|
|
323
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
324
|
+
if (stubCookies.length > 0) {
|
|
325
|
+
const existing = new Set(target.getSetCookie());
|
|
326
|
+
for (const cookie of stubCookies) {
|
|
327
|
+
if (!existing.has(cookie)) {
|
|
328
|
+
target.append("set-cookie", cookie);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
333
|
+
// Never propagate the reserved external-redirect marker (see mergeStubHeaders).
|
|
334
|
+
if (name.toLowerCase() === EXTERNAL_REDIRECT_MARKER) return;
|
|
335
|
+
if (name !== "set-cookie" && !target.has(name)) {
|
|
336
|
+
target.set(name, value);
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Clone `base` with stub headers merged into a fresh Headers (the clone keeps
|
|
342
|
+
// the body mutable for post-next() modifications). Set-Cookie is always
|
|
343
|
+
// appended; other headers obey stubOverridesNonCookie (see mergeStubHeaders).
|
|
344
|
+
// mergeReqCtx folds in RequestContext stub cookies/headers; the intercept
|
|
345
|
+
// short-circuit path passes false (its reqCtx headers are not merged here),
|
|
346
|
+
// which is the one deliberate divergence between the call sites.
|
|
347
|
+
function mergeResponse(
|
|
348
|
+
base: Response,
|
|
349
|
+
stub: Headers,
|
|
350
|
+
opts: { stubOverridesNonCookie: boolean; mergeReqCtx: boolean },
|
|
351
|
+
): Response {
|
|
352
|
+
const mergedHeaders = new Headers(base.headers);
|
|
353
|
+
// The reserved external-redirect marker is never a trust signal and must never
|
|
354
|
+
// reach the browser. The guard strips it on 3xx redirects; strip it here too so
|
|
355
|
+
// a forged value cannot ride a non-3xx middleware response (which the 3xx-only
|
|
356
|
+
// guard would not touch) to the client. The opt-in is the out-of-band brand.
|
|
357
|
+
mergedHeaders.delete(EXTERNAL_REDIRECT_MARKER);
|
|
358
|
+
mergeStubHeaders(mergedHeaders, stub, opts.stubOverridesNonCookie);
|
|
359
|
+
if (opts.mergeReqCtx) {
|
|
360
|
+
mergeReqCtxStub(mergedHeaders, _getRequestContext());
|
|
361
|
+
}
|
|
362
|
+
const merged = new Response(base.body, {
|
|
363
|
+
status: base.status,
|
|
364
|
+
statusText: base.statusText,
|
|
365
|
+
headers: mergedHeaders,
|
|
366
|
+
});
|
|
367
|
+
// Transfer the out-of-band external-redirect brand across this rebuild: a
|
|
368
|
+
// middleware short-circuit `return redirect(url, { external: true })` reaches
|
|
369
|
+
// the open-redirect guard only after this merge, and the brand lives on the
|
|
370
|
+
// Response object, not in its headers.
|
|
371
|
+
if (isExternalRedirect(base)) {
|
|
372
|
+
markExternalRedirect(merged);
|
|
373
|
+
}
|
|
374
|
+
return merged;
|
|
375
|
+
}
|
|
376
|
+
|
|
425
377
|
/**
|
|
426
378
|
* Execute middleware chain
|
|
427
379
|
*
|
|
428
380
|
* Features:
|
|
429
381
|
* - `await next()` returns actual Response
|
|
430
|
-
* - `ctx.
|
|
431
|
-
* - `ctx.header()` shorthand for setting
|
|
432
|
-
* - Forgiving: if middleware doesn't return, uses
|
|
433
|
-
* - Short-circuit: return Response to stop chain
|
|
382
|
+
* - `ctx.headers` available before and after `await next()`
|
|
383
|
+
* - `ctx.header()` shorthand for setting a single header
|
|
384
|
+
* - Forgiving: if middleware doesn't return, uses the downstream response
|
|
385
|
+
* - Short-circuit: return OR throw a Response to stop chain
|
|
434
386
|
* - Error catching: try/catch around `next()` works
|
|
435
387
|
*/
|
|
436
388
|
export async function executeMiddleware<TEnv>(
|
|
@@ -441,7 +393,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
441
393
|
request: Request,
|
|
442
394
|
env: TEnv,
|
|
443
395
|
variables: Record<string, any>,
|
|
444
|
-
finalHandler: () => Promise<Response
|
|
396
|
+
finalHandler: () => Promise<Response>,
|
|
397
|
+
reverse?: (
|
|
398
|
+
name: string,
|
|
399
|
+
params?: Record<string, string>,
|
|
400
|
+
search?: Record<string, unknown>,
|
|
401
|
+
) => string,
|
|
445
402
|
): Promise<Response> {
|
|
446
403
|
let index = 0;
|
|
447
404
|
|
|
@@ -455,50 +412,130 @@ export async function executeMiddleware<TEnv>(
|
|
|
455
412
|
// End of chain - call actual RSC handler
|
|
456
413
|
const response = await finalHandler();
|
|
457
414
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
if (name.toLowerCase() === "set-cookie") {
|
|
463
|
-
mergedHeaders.append(name, value);
|
|
464
|
-
} else {
|
|
465
|
-
mergedHeaders.set(name, value);
|
|
466
|
-
}
|
|
467
|
-
});
|
|
415
|
+
if (isWebSocketUpgradeResponse(response)) {
|
|
416
|
+
responseHolder.response = response;
|
|
417
|
+
return response;
|
|
418
|
+
}
|
|
468
419
|
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
420
|
+
// Chain ran to completion: stub headers overwrite (stubOverridesNonCookie)
|
|
421
|
+
// and reqCtx stub headers are merged in.
|
|
422
|
+
responseHolder.response = mergeResponse(response, stubResponse.headers, {
|
|
423
|
+
stubOverridesNonCookie: true,
|
|
424
|
+
mergeReqCtx: true,
|
|
474
425
|
});
|
|
475
426
|
|
|
476
427
|
return responseHolder.response;
|
|
477
428
|
}
|
|
478
429
|
|
|
430
|
+
const middlewareOrdinal = index;
|
|
479
431
|
const { entry, params } = middlewares[index++];
|
|
480
432
|
const ctx = createMiddlewareContext(
|
|
481
433
|
request,
|
|
482
434
|
env,
|
|
483
435
|
params,
|
|
484
436
|
variables,
|
|
485
|
-
responseHolder
|
|
437
|
+
responseHolder,
|
|
438
|
+
reverse,
|
|
486
439
|
);
|
|
440
|
+
const metricStart = performance.now();
|
|
441
|
+
const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
|
|
442
|
+
let middlewareFinished = false;
|
|
443
|
+
const finishMiddleware = () => {
|
|
444
|
+
if (!middlewareFinished) {
|
|
445
|
+
middlewareFinished = true;
|
|
446
|
+
appendMetric(
|
|
447
|
+
_getRequestContext()?._metricsStore,
|
|
448
|
+
`${metricLabel}:pre`,
|
|
449
|
+
metricStart,
|
|
450
|
+
performance.now() - metricStart,
|
|
451
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
};
|
|
487
455
|
|
|
488
|
-
// Track if next() was called and capture its Promise
|
|
489
|
-
//
|
|
456
|
+
// Track if next() was called and capture its Promise.
|
|
457
|
+
// Guard against double-calling: a second call would re-enter the
|
|
458
|
+
// downstream chain and overwrite responseHolder.response.
|
|
490
459
|
let nextPromise: Promise<Response> | null = null;
|
|
460
|
+
let nextResolvedAt: number | undefined;
|
|
491
461
|
const wrappedNext = (): Promise<Response> => {
|
|
492
|
-
|
|
462
|
+
if (nextPromise) {
|
|
463
|
+
throw new Error(
|
|
464
|
+
`[@rangojs/router] Middleware called next() more than once.`,
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
finishMiddleware();
|
|
468
|
+
const downstream = next();
|
|
469
|
+
nextPromise = downstream.then(
|
|
470
|
+
(res) => {
|
|
471
|
+
nextResolvedAt = performance.now();
|
|
472
|
+
return res;
|
|
473
|
+
},
|
|
474
|
+
(err) => {
|
|
475
|
+
nextResolvedAt = performance.now();
|
|
476
|
+
throw err;
|
|
477
|
+
},
|
|
478
|
+
);
|
|
493
479
|
return nextPromise;
|
|
494
480
|
};
|
|
495
481
|
|
|
496
|
-
|
|
482
|
+
// Wrap the middleware (including its downstream next() chain) in its span
|
|
483
|
+
// via the unified phase API. metric:false — the middleware's perf metric is
|
|
484
|
+
// its exclusive pre/post own-time, recorded directly above and below, finer
|
|
485
|
+
// than a single wrap. Spans nest by async context, so this onions
|
|
486
|
+
// middleware-over-middleware and the core handler underneath. Pass-through
|
|
487
|
+
// when neither surface is active.
|
|
488
|
+
let result: Response | void;
|
|
489
|
+
try {
|
|
490
|
+
result = await observePhase(PHASES.middleware(metricLabel), () =>
|
|
491
|
+
entry.handler(ctx, wrappedNext),
|
|
492
|
+
);
|
|
493
|
+
} catch (error) {
|
|
494
|
+
// Thrown Response is short-circuit control flow, not an error.
|
|
495
|
+
// Fall through to the `if (result instanceof Response)` branch below
|
|
496
|
+
// so stub headers and request-context cookies merge as they do for
|
|
497
|
+
// an explicit `return new Response(...)`. Real errors propagate.
|
|
498
|
+
if (error instanceof Response) {
|
|
499
|
+
result = error;
|
|
500
|
+
} else {
|
|
501
|
+
finishMiddleware();
|
|
502
|
+
throw error;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
finishMiddleware();
|
|
506
|
+
|
|
507
|
+
// Record post-next() processing time when middleware did work after
|
|
508
|
+
// the downstream chain resolved (e.g. adding headers, logging).
|
|
509
|
+
if (nextResolvedAt !== undefined) {
|
|
510
|
+
const postDur = performance.now() - nextResolvedAt;
|
|
511
|
+
if (postDur > POST_METRIC_MIN_DURATION_MS) {
|
|
512
|
+
appendMetric(
|
|
513
|
+
_getRequestContext()?._metricsStore,
|
|
514
|
+
`${metricLabel}:post`,
|
|
515
|
+
nextResolvedAt,
|
|
516
|
+
postDur,
|
|
517
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
518
|
+
);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
497
521
|
|
|
498
|
-
// Explicit return takes precedence
|
|
522
|
+
// Explicit return takes precedence (middleware short-circuit).
|
|
523
|
+
// Merge stub headers (from ctx.header before this point) and
|
|
524
|
+
// RequestContext stub headers (from cookies().set()) into the
|
|
525
|
+
// returned Response so they are not lost.
|
|
499
526
|
if (result instanceof Response) {
|
|
500
|
-
|
|
501
|
-
|
|
527
|
+
if (isWebSocketUpgradeResponse(result)) {
|
|
528
|
+
responseHolder.response = result;
|
|
529
|
+
return result;
|
|
530
|
+
}
|
|
531
|
+
// Explicit short-circuit: the returned Response's own headers win
|
|
532
|
+
// (stubOverridesNonCookie=false); reqCtx stub headers still merge in.
|
|
533
|
+
const merged = mergeResponse(result, stubResponse.headers, {
|
|
534
|
+
stubOverridesNonCookie: false,
|
|
535
|
+
mergeReqCtx: true,
|
|
536
|
+
});
|
|
537
|
+
responseHolder.response = merged;
|
|
538
|
+
return merged;
|
|
502
539
|
}
|
|
503
540
|
|
|
504
541
|
// Warn about unexpected return values (non-Response, non-undefined)
|
|
@@ -507,7 +544,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
507
544
|
const fnName = entry.handler.name || "(anonymous)";
|
|
508
545
|
console.warn(
|
|
509
546
|
`[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
|
|
510
|
-
`This return value will be ignored. Did you mean to return a Response
|
|
547
|
+
`This return value will be ignored. Did you mean to return a Response?`,
|
|
511
548
|
);
|
|
512
549
|
}
|
|
513
550
|
|
|
@@ -524,7 +561,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
524
561
|
`Middleware must call next() or return a Response. ` +
|
|
525
562
|
`Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
|
|
526
563
|
Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
|
|
527
|
-
{ cause: { url: request.url, fn: entry.handler } }
|
|
564
|
+
{ cause: { url: request.url, fn: entry.handler } },
|
|
528
565
|
);
|
|
529
566
|
};
|
|
530
567
|
|
|
@@ -536,64 +573,19 @@ export async function executeMiddleware<TEnv>(
|
|
|
536
573
|
throw new Error("No response generated by middleware chain");
|
|
537
574
|
}
|
|
538
575
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
* - Throws if middleware returns Response (can't short-circuit server action)
|
|
550
|
-
*/
|
|
551
|
-
export async function executeServerActionMiddleware<TEnv>(
|
|
552
|
-
middlewares: MiddlewareFn<TEnv>[],
|
|
553
|
-
request: Request,
|
|
554
|
-
env: TEnv,
|
|
555
|
-
params: Record<string, string>,
|
|
556
|
-
variables: Record<string, any>,
|
|
557
|
-
stubResponse: Response
|
|
558
|
-
): Promise<void> {
|
|
559
|
-
if (middlewares.length === 0) {
|
|
560
|
-
return;
|
|
576
|
+
// Final re-merge: capture any RequestContext stub headers added after the
|
|
577
|
+
// last merge point (e.g. cookies().set() called after await next()).
|
|
578
|
+
// The reqCtx stub may have already been partially merged during finalHandler
|
|
579
|
+
// or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
|
|
580
|
+
//
|
|
581
|
+
// Skip for upgrade responses: upgrade headers are semantically immutable and
|
|
582
|
+
// set-cookie on an upgrade is not meaningful.
|
|
583
|
+
const reqCtx = _getRequestContext();
|
|
584
|
+
if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
|
|
585
|
+
mergeReqCtxStub(finalResponse.headers, reqCtx);
|
|
561
586
|
}
|
|
562
587
|
|
|
563
|
-
|
|
564
|
-
const responseHolder: ResponseHolder = { response: stubResponse };
|
|
565
|
-
|
|
566
|
-
const next = async (): Promise<Response> => {
|
|
567
|
-
if (index >= middlewares.length) {
|
|
568
|
-
return stubResponse;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
const middleware = middlewares[index++];
|
|
572
|
-
const ctx = createMiddlewareContext(
|
|
573
|
-
request,
|
|
574
|
-
env,
|
|
575
|
-
params,
|
|
576
|
-
variables,
|
|
577
|
-
responseHolder
|
|
578
|
-
);
|
|
579
|
-
|
|
580
|
-
const result = await middleware(ctx, next);
|
|
581
|
-
|
|
582
|
-
// If middleware returned a Response, throw an error
|
|
583
|
-
// Server actions can't short-circuit with a Response
|
|
584
|
-
if (result instanceof Response) {
|
|
585
|
-
throw new Error(
|
|
586
|
-
`Loader middleware returned a Response (status: ${result.status}). ` +
|
|
587
|
-
`Server actions cannot return Response. ` +
|
|
588
|
-
`Use GET-based loader fetching for redirects, or throw an error instead.`
|
|
589
|
-
);
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
return stubResponse;
|
|
593
|
-
};
|
|
594
|
-
|
|
595
|
-
await next();
|
|
596
|
-
// Headers/cookies set on stubResponse will be merged by the caller
|
|
588
|
+
return finalResponse;
|
|
597
589
|
}
|
|
598
590
|
|
|
599
591
|
/**
|
|
@@ -601,7 +593,7 @@ export async function executeServerActionMiddleware<TEnv>(
|
|
|
601
593
|
*
|
|
602
594
|
* Intercepts use a shared stubResponse from the request context. This function:
|
|
603
595
|
* - Runs middleware in sequence with a simple next() chain
|
|
604
|
-
* - Returns Response if any middleware short-circuits (returns Response or redirects BEFORE next())
|
|
596
|
+
* - Returns Response if any middleware short-circuits (returns OR throws a Response, or redirects, BEFORE next())
|
|
605
597
|
* - Returns null if all middleware calls next() - headers set after next() remain on stubResponse
|
|
606
598
|
*
|
|
607
599
|
* @param middlewares - Array of middleware functions
|
|
@@ -617,7 +609,12 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
617
609
|
env: TEnv,
|
|
618
610
|
params: Record<string, string>,
|
|
619
611
|
variables: Record<string, any>,
|
|
620
|
-
stubResponse: Response
|
|
612
|
+
stubResponse: Response,
|
|
613
|
+
reverse?: (
|
|
614
|
+
name: string,
|
|
615
|
+
params?: Record<string, string>,
|
|
616
|
+
search?: Record<string, unknown>,
|
|
617
|
+
) => string,
|
|
621
618
|
): Promise<Response | null> {
|
|
622
619
|
if (middlewares.length === 0) {
|
|
623
620
|
return null;
|
|
@@ -634,28 +631,57 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
634
631
|
return stubResponse;
|
|
635
632
|
}
|
|
636
633
|
|
|
634
|
+
const ordinal = index;
|
|
637
635
|
const middleware = middlewares[index++];
|
|
638
636
|
const ctx = createMiddlewareContext(
|
|
639
637
|
request,
|
|
640
638
|
env,
|
|
641
639
|
params,
|
|
642
640
|
variables,
|
|
643
|
-
responseHolder
|
|
641
|
+
responseHolder,
|
|
642
|
+
reverse,
|
|
644
643
|
);
|
|
645
644
|
|
|
646
|
-
|
|
645
|
+
let nextCalled = false;
|
|
646
|
+
const guardedNext = (): Promise<Response> => {
|
|
647
|
+
if (nextCalled) {
|
|
648
|
+
throw new Error(
|
|
649
|
+
`[@rangojs/router] Intercept middleware called next() more than once.`,
|
|
650
|
+
);
|
|
651
|
+
}
|
|
652
|
+
nextCalled = true;
|
|
653
|
+
return next();
|
|
654
|
+
};
|
|
655
|
+
|
|
656
|
+
// Span-wrap each intercept middleware as rango.middleware (metric:false —
|
|
657
|
+
// intercept runs inside the render phase already metered by render:total, so
|
|
658
|
+
// it contributes a span but no separate perf metric). Bare MiddlewareFns
|
|
659
|
+
// have no pattern, so the label is scoped to "*" like a pattern-less entry.
|
|
660
|
+
const label = getMiddlewareMetricLabel(
|
|
661
|
+
{ handler: middleware, pattern: null } as MiddlewareEntry<TEnv>,
|
|
662
|
+
ordinal,
|
|
663
|
+
);
|
|
664
|
+
|
|
665
|
+
let result: Response | void;
|
|
666
|
+
try {
|
|
667
|
+
result = await observePhase(PHASES.middleware(label), () =>
|
|
668
|
+
middleware(ctx, guardedNext),
|
|
669
|
+
);
|
|
670
|
+
} catch (error) {
|
|
671
|
+
// Thrown Response is short-circuit control flow, parity with the
|
|
672
|
+
// explicit-return path below. Real errors propagate.
|
|
673
|
+
if (error instanceof Response) {
|
|
674
|
+
result = error;
|
|
675
|
+
} else {
|
|
676
|
+
throw error;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
647
679
|
|
|
648
680
|
if (result instanceof Response) {
|
|
649
681
|
earlyResponse = result;
|
|
650
682
|
return result;
|
|
651
683
|
}
|
|
652
684
|
|
|
653
|
-
// Check if middleware replaced ctx.res with a different response
|
|
654
|
-
if (responseHolder.response && responseHolder.response !== stubResponse) {
|
|
655
|
-
earlyResponse = responseHolder.response;
|
|
656
|
-
return earlyResponse;
|
|
657
|
-
}
|
|
658
|
-
|
|
659
685
|
return stubResponse;
|
|
660
686
|
};
|
|
661
687
|
|
|
@@ -673,19 +699,13 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
673
699
|
});
|
|
674
700
|
|
|
675
701
|
if (hasStubHeaders) {
|
|
676
|
-
//
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
}
|
|
684
|
-
});
|
|
685
|
-
return new Response(response.body, {
|
|
686
|
-
status: response.status,
|
|
687
|
-
statusText: response.statusText,
|
|
688
|
-
headers: mergedHeaders,
|
|
702
|
+
// Only fill in missing headers — the returned Response's explicit headers
|
|
703
|
+
// take precedence (stubOverridesNonCookie=false), matching executeMiddleware.
|
|
704
|
+
// mergeReqCtx=false: the intercept path deliberately does NOT merge reqCtx
|
|
705
|
+
// stub headers here (pinned by intercept-middleware-headers.test.ts).
|
|
706
|
+
return mergeResponse(response, stubResponse.headers, {
|
|
707
|
+
stubOverridesNonCookie: false,
|
|
708
|
+
mergeReqCtx: false,
|
|
689
709
|
});
|
|
690
710
|
}
|
|
691
711
|
return response;
|
|
@@ -708,7 +728,12 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
708
728
|
env: TEnv,
|
|
709
729
|
params: Record<string, string>,
|
|
710
730
|
variables: Record<string, any>,
|
|
711
|
-
finalHandler: () => Promise<Response
|
|
731
|
+
finalHandler: () => Promise<Response>,
|
|
732
|
+
reverse?: (
|
|
733
|
+
name: string,
|
|
734
|
+
params?: Record<string, string>,
|
|
735
|
+
search?: Record<string, unknown>,
|
|
736
|
+
) => string,
|
|
712
737
|
): Promise<Response> {
|
|
713
738
|
if (middlewares.length === 0) {
|
|
714
739
|
return finalHandler();
|
|
@@ -721,7 +746,6 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
721
746
|
regex: null,
|
|
722
747
|
paramNames: [],
|
|
723
748
|
handler,
|
|
724
|
-
mountPrefix: null,
|
|
725
749
|
} as MiddlewareEntry<TEnv>,
|
|
726
750
|
params,
|
|
727
751
|
}));
|
|
@@ -731,27 +755,11 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
731
755
|
request,
|
|
732
756
|
env,
|
|
733
757
|
variables,
|
|
734
|
-
finalHandler
|
|
758
|
+
finalHandler,
|
|
759
|
+
reverse,
|
|
735
760
|
);
|
|
736
761
|
}
|
|
737
762
|
|
|
738
|
-
/**
|
|
739
|
-
* Entry type for middleware collection
|
|
740
|
-
* Matches the shape of EntryData used in router.ts
|
|
741
|
-
*/
|
|
742
|
-
export interface MiddlewareCollectableEntry {
|
|
743
|
-
middleware?: MiddlewareFn<any, any>[];
|
|
744
|
-
layout?: MiddlewareCollectableEntry[];
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
/**
|
|
748
|
-
* Collected route middleware with params
|
|
749
|
-
*/
|
|
750
|
-
export interface CollectedMiddleware {
|
|
751
|
-
handler: MiddlewareFn<any, any>;
|
|
752
|
-
params: Record<string, string>;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
763
|
/**
|
|
756
764
|
* Collect route-level middleware from an entry tree
|
|
757
765
|
*
|
|
@@ -764,7 +772,7 @@ export interface CollectedMiddleware {
|
|
|
764
772
|
*/
|
|
765
773
|
export function collectRouteMiddleware(
|
|
766
774
|
entries: Iterable<MiddlewareCollectableEntry>,
|
|
767
|
-
params: Record<string, string
|
|
775
|
+
params: Record<string, string>,
|
|
768
776
|
): CollectedMiddleware[] {
|
|
769
777
|
const result: CollectedMiddleware[] = [];
|
|
770
778
|
|