@rangojs/router 0.0.0-experimental.9 → 0.0.0-experimental.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +972 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/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 +1619 -155
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +5565 -2291
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/{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 +72 -63
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +93 -23
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +12 -8
- package/skills/document-cache/SKILL.md +18 -16
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +341 -71
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +151 -8
- package/skills/layout/SKILL.md +122 -3
- package/skills/links/SKILL.md +158 -25
- package/skills/loader/SKILL.md +439 -46
- package/skills/middleware/SKILL.md +205 -37
- package/skills/migrate-nextjs/SKILL.md +560 -0
- package/skills/migrate-react-router/SKILL.md +765 -0
- package/skills/mime-routes/SKILL.md +15 -11
- package/skills/parallel/SKILL.md +263 -1
- package/skills/prerender/SKILL.md +467 -65
- package/skills/rango/SKILL.md +87 -21
- package/skills/response-routes/SKILL.md +152 -91
- package/skills/route/SKILL.md +281 -14
- package/skills/router-setup/SKILL.md +210 -32
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +327 -86
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +102 -4
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +367 -561
- package/src/browser/navigation-client.ts +228 -70
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +362 -316
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +255 -71
- package/src/browser/react/NavigationProvider.tsx +132 -17
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +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 +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -120
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +44 -65
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +83 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +246 -64
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +510 -603
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +152 -48
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +84 -23
- package/src/build/generate-route-types.ts +39 -752
- package/src/build/index.ts +6 -5
- package/src/build/route-trie.ts +83 -31
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -307
- package/src/cache/cf/cf-cache-store.ts +573 -21
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +113 -301
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +156 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +77 -7
- package/src/handle.ts +55 -10
- package/src/handles/MetaTags.tsx +73 -20
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +30 -13
- package/src/host/cookie-handler.ts +21 -15
- package/src/host/errors.ts +8 -8
- package/src/host/index.ts +4 -7
- package/src/host/pattern-matcher.ts +27 -27
- package/src/host/router.ts +61 -39
- package/src/host/testing.ts +8 -8
- package/src/host/types.ts +15 -7
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +65 -45
- package/src/index.rsc.ts +138 -21
- package/src/index.ts +206 -51
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +25 -143
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +159 -13
- package/src/prerender.ts +397 -29
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +209 -121
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +478 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition.ts +1 -1431
- package/src/route-map-builder.ts +162 -123
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +66 -9
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +455 -86
- package/src/router/intercept-resolution.ts +35 -20
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +359 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +98 -32
- package/src/router/match-api.ts +195 -261
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +415 -86
- package/src/router/match-middleware/cache-store.ts +91 -29
- package/src/router/match-middleware/intercept-resolution.ts +48 -21
- package/src/router/match-middleware/segment-resolution.ts +73 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +135 -35
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +200 -0
- package/src/router/middleware.ts +373 -371
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +251 -44
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +152 -39
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +41 -21
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1384 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1315
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +103 -30
- package/src/router/types.ts +17 -9
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +647 -1988
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +864 -1114
- package/src/rsc/helpers.ts +181 -19
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +393 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +253 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +358 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +46 -11
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +134 -36
- package/src/server/context.ts +333 -59
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +113 -15
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +603 -109
- package/src/server.ts +35 -155
- package/src/ssr/index.tsx +103 -30
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +5 -2
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +4 -30
- package/src/theme/theme-script.ts +21 -18
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +759 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1757
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1282
- package/src/use-loader.tsx +161 -81
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +376 -0
- package/src/vite/discovery/prerender-collection.ts +486 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +15 -1963
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +98 -0
- package/src/vite/plugins/client-ref-dedup.ts +131 -0
- package/src/vite/plugins/client-ref-hashing.ts +117 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +107 -64
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +816 -0
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +336 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +497 -0
- package/src/vite/router-discovery.ts +1111 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/utils/package-resolution.ts +161 -0
- package/src/vite/utils/prerender-utils.ts +221 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -43
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/memory-store.ts +0 -253
- package/src/router.gen.ts +0 -6
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -426
- package/src/vite/expose-location-state-id.ts +0 -177
- package/src/vite/expose-prerender-handler-id.ts +0 -429
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/router/middleware.ts
CHANGED
|
@@ -9,169 +9,58 @@
|
|
|
9
9
|
* - Forgiving API: if middleware doesn't return, original response is used
|
|
10
10
|
*/
|
|
11
11
|
|
|
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
|
-
|
|
12
|
+
import { contextGet, contextSet } from "../context-var.js";
|
|
13
|
+
import { safeDecodeURIComponent } from "./url-params.js";
|
|
14
|
+
import { fireAndForgetWaitUntil } from "../types/request-scope.js";
|
|
15
|
+
import type {
|
|
16
|
+
CollectedMiddleware,
|
|
17
|
+
MiddlewareCollectableEntry,
|
|
18
|
+
MiddlewareContext,
|
|
19
|
+
MiddlewareEntry,
|
|
20
|
+
MiddlewareFn,
|
|
21
|
+
ResponseHolder,
|
|
22
|
+
} from "./middleware-types.js";
|
|
23
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
24
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
25
|
+
import { appendMetric, createMetricsStore } from "./metrics.js";
|
|
26
|
+
import { stripInternalParams } from "./handler-context.js";
|
|
27
|
+
import { isWebSocketUpgradeResponse } from "../response-utils.js";
|
|
28
|
+
|
|
29
|
+
// Re-export types and cookie utilities for backward compatibility
|
|
30
|
+
export type {
|
|
31
|
+
CookieOptions,
|
|
32
|
+
CollectedMiddleware,
|
|
33
|
+
MiddlewareCollectableEntry,
|
|
34
|
+
MiddlewareContext,
|
|
35
|
+
MiddlewareEntry,
|
|
36
|
+
MiddlewareFn,
|
|
37
|
+
ResponseHolder,
|
|
38
|
+
} from "./middleware-types.js";
|
|
39
|
+
export { parseCookies, serializeCookie } from "./middleware-cookies.js";
|
|
40
|
+
|
|
41
|
+
const MIDDLEWARE_METRIC_DEPTH = 1;
|
|
42
|
+
/** Ignore post-next() durations below this threshold (measurement noise). */
|
|
43
|
+
const POST_METRIC_MIN_DURATION_MS = 0.01;
|
|
44
|
+
|
|
45
|
+
function getMiddlewareMetricBase<TEnv>(
|
|
46
|
+
entry: MiddlewareEntry<TEnv>,
|
|
47
|
+
ordinal: number,
|
|
48
|
+
): string {
|
|
49
|
+
const handlerName = entry.handler.name?.trim();
|
|
50
|
+
const scope = entry.pattern ?? "*";
|
|
38
51
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
export interface CookieOptions {
|
|
43
|
-
domain?: string;
|
|
44
|
-
path?: string;
|
|
45
|
-
maxAge?: number;
|
|
46
|
-
expires?: Date;
|
|
47
|
-
httpOnly?: boolean;
|
|
48
|
-
secure?: boolean;
|
|
49
|
-
sameSite?: "strict" | "lax" | "none";
|
|
50
|
-
}
|
|
52
|
+
if (handlerName) {
|
|
53
|
+
return `${handlerName}@${scope}`;
|
|
54
|
+
}
|
|
51
55
|
|
|
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;
|
|
56
|
+
return `${scope}#${ordinal + 1}`;
|
|
131
57
|
}
|
|
132
58
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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[];
|
|
169
|
-
|
|
170
|
-
/** The middleware function */
|
|
171
|
-
handler: MiddlewareFn<TEnv>;
|
|
172
|
-
|
|
173
|
-
/** Mount prefix this middleware is scoped to (null = global) */
|
|
174
|
-
mountPrefix: string | null;
|
|
59
|
+
function getMiddlewareMetricLabel<TEnv>(
|
|
60
|
+
entry: MiddlewareEntry<TEnv>,
|
|
61
|
+
ordinal: number,
|
|
62
|
+
): string {
|
|
63
|
+
return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
|
|
175
64
|
}
|
|
176
65
|
|
|
177
66
|
/**
|
|
@@ -226,168 +115,164 @@ function escapeRegex(str: string): string {
|
|
|
226
115
|
}
|
|
227
116
|
|
|
228
117
|
/**
|
|
229
|
-
* Extract params from a pathname using a pattern's regex and param names
|
|
118
|
+
* Extract params from a pathname using a pattern's regex and param names.
|
|
119
|
+
*
|
|
120
|
+
* Values are URL-decoded so apps see the raw string (e.g. "ivo@example.com")
|
|
121
|
+
* instead of the percent-encoded form ("ivo%40example.com"). This matches the
|
|
122
|
+
* contract assumed by ctx.reverse (which re-encodes) and aligns with
|
|
123
|
+
* Express/React Router/Fastify/Koa.
|
|
230
124
|
*/
|
|
231
125
|
export function extractParams(
|
|
232
126
|
pathname: string,
|
|
233
127
|
regex: RegExp,
|
|
234
|
-
paramNames: string[]
|
|
128
|
+
paramNames: string[],
|
|
235
129
|
): Record<string, string> {
|
|
236
130
|
const match = pathname.match(regex);
|
|
237
131
|
if (!match) return {};
|
|
238
132
|
|
|
239
133
|
const params: Record<string, string> = {};
|
|
240
134
|
for (let i = 0; i < paramNames.length; i++) {
|
|
241
|
-
params[paramNames[i]] = match[i + 1] || "";
|
|
135
|
+
params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
|
|
242
136
|
}
|
|
243
137
|
return params;
|
|
244
138
|
}
|
|
245
139
|
|
|
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
140
|
/**
|
|
296
141
|
* Create middleware context
|
|
297
142
|
*
|
|
298
143
|
* Note: The implementation uses runtime values while the interface provides
|
|
299
144
|
* compile-time type safety. The env/get/set types are resolved at call sites
|
|
300
|
-
* via conditional types based on TEnv
|
|
145
|
+
* via conditional types based on TEnv from createRouter<TBindings>().
|
|
301
146
|
*/
|
|
302
147
|
export function createMiddlewareContext<TEnv>(
|
|
303
148
|
request: Request,
|
|
304
149
|
env: TEnv,
|
|
305
150
|
params: Record<string, string>,
|
|
306
151
|
variables: Record<string, unknown>,
|
|
307
|
-
responseHolder: ResponseHolder
|
|
152
|
+
responseHolder: ResponseHolder,
|
|
153
|
+
reverse?: (
|
|
154
|
+
name: string,
|
|
155
|
+
params?: Record<string, string>,
|
|
156
|
+
search?: Record<string, unknown>,
|
|
157
|
+
) => string,
|
|
308
158
|
): MiddlewareContext<TEnv> {
|
|
309
|
-
const url = new URL(request.url);
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
159
|
+
const url = stripInternalParams(new URL(request.url));
|
|
160
|
+
|
|
161
|
+
// Track the initial response to detect pre/post-next() phase.
|
|
162
|
+
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
163
|
+
// After next(): responseHolder.response is the real downstream response.
|
|
164
|
+
const initialResponse = responseHolder.response;
|
|
165
|
+
const isPreNext = () => responseHolder.response === initialResponse;
|
|
166
|
+
|
|
167
|
+
// Delegation strategy for RequestContext (reqCtx):
|
|
168
|
+
// - res getter: before next() returns shared reqCtx stub; after next() returns
|
|
169
|
+
// the real downstream response.
|
|
170
|
+
// - header(): before next() delegates to reqCtx; after next() writes to the
|
|
171
|
+
// real downstream response.
|
|
172
|
+
// Cookie operations are handled by the standalone cookies() function which
|
|
173
|
+
// delegates to the shared RequestContext internally.
|
|
313
174
|
// The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
|
|
175
|
+
// Internal helper: resolve the current response (stub before next(), real after).
|
|
176
|
+
// Not exposed on the public MiddlewareContext type — use ctx.headers instead.
|
|
177
|
+
const getResponse = (): Response => {
|
|
178
|
+
if (isPreNext()) {
|
|
179
|
+
const reqCtx = _getRequestContext();
|
|
180
|
+
if (reqCtx) return reqCtx.res;
|
|
181
|
+
}
|
|
182
|
+
if (!responseHolder.response) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
"Response is not available - responseHolder was not initialized",
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
return responseHolder.response;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Capture reqCtx once: the request-scoped platform fields
|
|
191
|
+
// (originalUrl, executionContext, waitUntil) are immutable per request,
|
|
192
|
+
// so snapshotting beats re-reading ALS on every access. The lazy getters
|
|
193
|
+
// below (routeName, theme, setTheme) stay lazy because those can change
|
|
194
|
+
// during `await next()`.
|
|
195
|
+
const reqCtx = _getRequestContext();
|
|
314
196
|
return {
|
|
315
197
|
request,
|
|
316
198
|
url,
|
|
199
|
+
originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
|
|
317
200
|
pathname: url.pathname,
|
|
318
201
|
searchParams: url.searchParams,
|
|
319
202
|
env: env as MiddlewareContext<TEnv>["env"],
|
|
320
203
|
params,
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
204
|
+
executionContext: reqCtx?.executionContext,
|
|
205
|
+
waitUntil: reqCtx ? reqCtx.waitUntil.bind(reqCtx) : fireAndForgetWaitUntil,
|
|
206
|
+
// Getter: re-derives from request context on each access so that global
|
|
207
|
+
// middleware sees the matched route name after await next().
|
|
208
|
+
get routeName(): MiddlewareContext<TEnv>["routeName"] {
|
|
209
|
+
const reqCtx = _getRequestContext();
|
|
210
|
+
const raw = reqCtx?._routeName;
|
|
211
|
+
return (
|
|
212
|
+
raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
|
|
213
|
+
) as MiddlewareContext<TEnv>["routeName"];
|
|
330
214
|
},
|
|
331
215
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
responseHolder.response = response;
|
|
216
|
+
get headers(): Headers {
|
|
217
|
+
return getResponse().headers;
|
|
335
218
|
},
|
|
336
219
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
parsedCookies = parseCookies(cookieHeader);
|
|
340
|
-
}
|
|
341
|
-
return parsedCookies[name];
|
|
342
|
-
},
|
|
220
|
+
get: ((keyOrVar: any) =>
|
|
221
|
+
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
343
222
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
223
|
+
set: ((keyOrVar: any, value: unknown, options?: any) => {
|
|
224
|
+
contextSet(variables, keyOrVar, value, options);
|
|
225
|
+
}) as MiddlewareContext<TEnv>["set"],
|
|
226
|
+
header(name: string, value: string): void {
|
|
227
|
+
// Before next(): delegate to shared RequestContext stub
|
|
228
|
+
if (isPreNext()) {
|
|
229
|
+
const reqCtx = _getRequestContext();
|
|
230
|
+
if (reqCtx) {
|
|
231
|
+
reqCtx.header(name, value);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
347
234
|
}
|
|
348
|
-
|
|
349
|
-
},
|
|
350
|
-
|
|
351
|
-
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
235
|
+
// After next() or standalone: write to current response
|
|
352
236
|
if (!responseHolder.response) {
|
|
353
237
|
throw new Error(
|
|
354
|
-
"ctx.
|
|
238
|
+
"ctx.header() is not available - responseHolder was not initialized",
|
|
355
239
|
);
|
|
356
240
|
}
|
|
357
|
-
responseHolder.response.headers.
|
|
358
|
-
"Set-Cookie",
|
|
359
|
-
serializeCookie(name, value, options)
|
|
360
|
-
);
|
|
241
|
+
responseHolder.response.headers.set(name, value);
|
|
361
242
|
},
|
|
362
243
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
244
|
+
get theme(): MiddlewareContext<TEnv>["theme"] {
|
|
245
|
+
return _getRequestContext()?.theme;
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
|
|
249
|
+
return _getRequestContext()?.setTheme;
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
setLocationState(entries) {
|
|
253
|
+
const reqCtx = _getRequestContext();
|
|
254
|
+
if (!reqCtx) {
|
|
368
255
|
throw new Error(
|
|
369
|
-
"
|
|
256
|
+
"setLocationState() is not available outside a request context",
|
|
370
257
|
);
|
|
371
258
|
}
|
|
372
|
-
|
|
373
|
-
"Set-Cookie",
|
|
374
|
-
serializeCookie(name, "", { ...options, maxAge: 0 })
|
|
375
|
-
);
|
|
259
|
+
reqCtx.setLocationState(entries);
|
|
376
260
|
},
|
|
377
261
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
variables[key] = value;
|
|
382
|
-
}) as MiddlewareContext<TEnv>["set"],
|
|
383
|
-
|
|
384
|
-
header(name: string, value: string): void {
|
|
385
|
-
if (!responseHolder.response) {
|
|
262
|
+
reverse:
|
|
263
|
+
reverse ??
|
|
264
|
+
((name: string) => {
|
|
386
265
|
throw new Error(
|
|
387
|
-
|
|
266
|
+
`ctx.reverse() is not available - route map was not provided to middleware context`,
|
|
388
267
|
);
|
|
268
|
+
}),
|
|
269
|
+
|
|
270
|
+
debugPerformance(): void {
|
|
271
|
+
const reqCtx = _getRequestContext();
|
|
272
|
+
if (reqCtx) {
|
|
273
|
+
reqCtx._debugPerformance = true;
|
|
274
|
+
reqCtx._metricsStore ??= createMetricsStore(true);
|
|
389
275
|
}
|
|
390
|
-
responseHolder.response.headers.set(name, value);
|
|
391
276
|
},
|
|
392
277
|
};
|
|
393
278
|
}
|
|
@@ -398,7 +283,7 @@ export function createMiddlewareContext<TEnv>(
|
|
|
398
283
|
*/
|
|
399
284
|
export function matchMiddleware<TEnv>(
|
|
400
285
|
pathname: string,
|
|
401
|
-
entries: MiddlewareEntry<TEnv>[]
|
|
286
|
+
entries: MiddlewareEntry<TEnv>[],
|
|
402
287
|
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
403
288
|
const matches: Array<{
|
|
404
289
|
entry: MiddlewareEntry<TEnv>;
|
|
@@ -427,9 +312,9 @@ export function matchMiddleware<TEnv>(
|
|
|
427
312
|
*
|
|
428
313
|
* Features:
|
|
429
314
|
* - `await next()` returns actual Response
|
|
430
|
-
* - `ctx.
|
|
431
|
-
* - `ctx.header()` shorthand for setting
|
|
432
|
-
* - Forgiving: if middleware doesn't return, uses
|
|
315
|
+
* - `ctx.headers` available before and after `await next()`
|
|
316
|
+
* - `ctx.header()` shorthand for setting a single header
|
|
317
|
+
* - Forgiving: if middleware doesn't return, uses the downstream response
|
|
433
318
|
* - Short-circuit: return Response to stop chain
|
|
434
319
|
* - Error catching: try/catch around `next()` works
|
|
435
320
|
*/
|
|
@@ -441,7 +326,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
441
326
|
request: Request,
|
|
442
327
|
env: TEnv,
|
|
443
328
|
variables: Record<string, any>,
|
|
444
|
-
finalHandler: () => Promise<Response
|
|
329
|
+
finalHandler: () => Promise<Response>,
|
|
330
|
+
reverse?: (
|
|
331
|
+
name: string,
|
|
332
|
+
params?: Record<string, string>,
|
|
333
|
+
search?: Record<string, unknown>,
|
|
334
|
+
) => string,
|
|
445
335
|
): Promise<Response> {
|
|
446
336
|
let index = 0;
|
|
447
337
|
|
|
@@ -455,8 +345,8 @@ export async function executeMiddleware<TEnv>(
|
|
|
455
345
|
// End of chain - call actual RSC handler
|
|
456
346
|
const response = await finalHandler();
|
|
457
347
|
|
|
458
|
-
// Merge headers set on stub into the real response
|
|
459
|
-
// Use append for Set-Cookie to preserve multiple cookies
|
|
348
|
+
// Merge headers set on stub into the real response.
|
|
349
|
+
// Use append for Set-Cookie to preserve multiple cookies.
|
|
460
350
|
const mergedHeaders = new Headers(response.headers);
|
|
461
351
|
stubResponse.headers.forEach((value, name) => {
|
|
462
352
|
if (name.toLowerCase() === "set-cookie") {
|
|
@@ -465,6 +355,31 @@ export async function executeMiddleware<TEnv>(
|
|
|
465
355
|
mergedHeaders.set(name, value);
|
|
466
356
|
}
|
|
467
357
|
});
|
|
358
|
+
// Also merge shared RequestContext stub (cookies written via cookies().set()).
|
|
359
|
+
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
360
|
+
// may have already merged the same reqCtx cookies into the response.
|
|
361
|
+
const reqCtx = _getRequestContext();
|
|
362
|
+
if (reqCtx) {
|
|
363
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
364
|
+
if (stubCookies.length > 0) {
|
|
365
|
+
const existing = new Set(mergedHeaders.getSetCookie());
|
|
366
|
+
for (const cookie of stubCookies) {
|
|
367
|
+
if (!existing.has(cookie)) {
|
|
368
|
+
mergedHeaders.append("set-cookie", cookie);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
373
|
+
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
374
|
+
mergedHeaders.set(name, value);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (isWebSocketUpgradeResponse(response)) {
|
|
380
|
+
responseHolder.response = response;
|
|
381
|
+
return response;
|
|
382
|
+
}
|
|
468
383
|
|
|
469
384
|
// Clone response with merged headers (mutable for post-next() modifications)
|
|
470
385
|
responseHolder.response = new Response(response.body, {
|
|
@@ -476,29 +391,134 @@ export async function executeMiddleware<TEnv>(
|
|
|
476
391
|
return responseHolder.response;
|
|
477
392
|
}
|
|
478
393
|
|
|
394
|
+
const middlewareOrdinal = index;
|
|
479
395
|
const { entry, params } = middlewares[index++];
|
|
480
396
|
const ctx = createMiddlewareContext(
|
|
481
397
|
request,
|
|
482
398
|
env,
|
|
483
399
|
params,
|
|
484
400
|
variables,
|
|
485
|
-
responseHolder
|
|
401
|
+
responseHolder,
|
|
402
|
+
reverse,
|
|
486
403
|
);
|
|
404
|
+
const metricStart = performance.now();
|
|
405
|
+
const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
|
|
406
|
+
let middlewareFinished = false;
|
|
407
|
+
const finishMiddleware = () => {
|
|
408
|
+
if (!middlewareFinished) {
|
|
409
|
+
middlewareFinished = true;
|
|
410
|
+
appendMetric(
|
|
411
|
+
_getRequestContext()?._metricsStore,
|
|
412
|
+
`${metricLabel}:pre`,
|
|
413
|
+
metricStart,
|
|
414
|
+
performance.now() - metricStart,
|
|
415
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
};
|
|
487
419
|
|
|
488
|
-
// Track if next() was called and capture its Promise
|
|
489
|
-
//
|
|
420
|
+
// Track if next() was called and capture its Promise.
|
|
421
|
+
// Guard against double-calling: a second call would re-enter the
|
|
422
|
+
// downstream chain and overwrite responseHolder.response.
|
|
490
423
|
let nextPromise: Promise<Response> | null = null;
|
|
424
|
+
let nextResolvedAt: number | undefined;
|
|
491
425
|
const wrappedNext = (): Promise<Response> => {
|
|
492
|
-
|
|
426
|
+
if (nextPromise) {
|
|
427
|
+
throw new Error(
|
|
428
|
+
`[@rangojs/router] Middleware called next() more than once.`,
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
finishMiddleware();
|
|
432
|
+
const downstream = next();
|
|
433
|
+
nextPromise = downstream.then(
|
|
434
|
+
(res) => {
|
|
435
|
+
nextResolvedAt = performance.now();
|
|
436
|
+
return res;
|
|
437
|
+
},
|
|
438
|
+
(err) => {
|
|
439
|
+
nextResolvedAt = performance.now();
|
|
440
|
+
throw err;
|
|
441
|
+
},
|
|
442
|
+
);
|
|
493
443
|
return nextPromise;
|
|
494
444
|
};
|
|
495
445
|
|
|
496
|
-
|
|
446
|
+
let result: Response | void;
|
|
447
|
+
try {
|
|
448
|
+
result = await entry.handler(ctx, wrappedNext);
|
|
449
|
+
} catch (error) {
|
|
450
|
+
// Thrown Response is short-circuit control flow, not an error.
|
|
451
|
+
// Fall through to the `if (result instanceof Response)` branch below
|
|
452
|
+
// so stub headers and request-context cookies merge as they do for
|
|
453
|
+
// an explicit `return new Response(...)`. Real errors propagate.
|
|
454
|
+
if (error instanceof Response) {
|
|
455
|
+
result = error;
|
|
456
|
+
} else {
|
|
457
|
+
finishMiddleware();
|
|
458
|
+
throw error;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
finishMiddleware();
|
|
462
|
+
|
|
463
|
+
// Record post-next() processing time when middleware did work after
|
|
464
|
+
// the downstream chain resolved (e.g. adding headers, logging).
|
|
465
|
+
if (nextResolvedAt !== undefined) {
|
|
466
|
+
const postDur = performance.now() - nextResolvedAt;
|
|
467
|
+
if (postDur > POST_METRIC_MIN_DURATION_MS) {
|
|
468
|
+
appendMetric(
|
|
469
|
+
_getRequestContext()?._metricsStore,
|
|
470
|
+
`${metricLabel}:post`,
|
|
471
|
+
nextResolvedAt,
|
|
472
|
+
postDur,
|
|
473
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
497
477
|
|
|
498
|
-
// Explicit return takes precedence
|
|
478
|
+
// Explicit return takes precedence (middleware short-circuit).
|
|
479
|
+
// Merge stub headers (from ctx.header before this point) and
|
|
480
|
+
// RequestContext stub headers (from ctx.setCookie) into the
|
|
481
|
+
// returned Response so they are not lost.
|
|
499
482
|
if (result instanceof Response) {
|
|
500
|
-
|
|
501
|
-
|
|
483
|
+
if (isWebSocketUpgradeResponse(result)) {
|
|
484
|
+
responseHolder.response = result;
|
|
485
|
+
return result;
|
|
486
|
+
}
|
|
487
|
+
const mergedHeaders = new Headers(result.headers);
|
|
488
|
+
stubResponse.headers.forEach((value, name) => {
|
|
489
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
490
|
+
mergedHeaders.append(name, value);
|
|
491
|
+
} else if (!mergedHeaders.has(name)) {
|
|
492
|
+
mergedHeaders.set(name, value);
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
// Also merge shared RequestContext stub (cookies written via setCookie).
|
|
496
|
+
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
497
|
+
// may have already merged the same reqCtx cookies into the response.
|
|
498
|
+
const reqCtx = _getRequestContext();
|
|
499
|
+
if (reqCtx) {
|
|
500
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
501
|
+
if (stubCookies.length > 0) {
|
|
502
|
+
const existing = new Set(mergedHeaders.getSetCookie());
|
|
503
|
+
for (const cookie of stubCookies) {
|
|
504
|
+
if (!existing.has(cookie)) {
|
|
505
|
+
mergedHeaders.append("set-cookie", cookie);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
510
|
+
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
511
|
+
mergedHeaders.set(name, value);
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
const merged = new Response(result.body, {
|
|
516
|
+
status: result.status,
|
|
517
|
+
statusText: result.statusText,
|
|
518
|
+
headers: mergedHeaders,
|
|
519
|
+
});
|
|
520
|
+
responseHolder.response = merged;
|
|
521
|
+
return merged;
|
|
502
522
|
}
|
|
503
523
|
|
|
504
524
|
// Warn about unexpected return values (non-Response, non-undefined)
|
|
@@ -507,7 +527,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
507
527
|
const fnName = entry.handler.name || "(anonymous)";
|
|
508
528
|
console.warn(
|
|
509
529
|
`[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
|
|
510
|
-
`This return value will be ignored. Did you mean to return a Response
|
|
530
|
+
`This return value will be ignored. Did you mean to return a Response?`,
|
|
511
531
|
);
|
|
512
532
|
}
|
|
513
533
|
|
|
@@ -524,7 +544,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
524
544
|
`Middleware must call next() or return a Response. ` +
|
|
525
545
|
`Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
|
|
526
546
|
Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
|
|
527
|
-
{ cause: { url: request.url, fn: entry.handler } }
|
|
547
|
+
{ cause: { url: request.url, fn: entry.handler } },
|
|
528
548
|
);
|
|
529
549
|
};
|
|
530
550
|
|
|
@@ -536,64 +556,33 @@ export async function executeMiddleware<TEnv>(
|
|
|
536
556
|
throw new Error("No response generated by middleware chain");
|
|
537
557
|
}
|
|
538
558
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
variables: Record<string, any>,
|
|
557
|
-
stubResponse: Response
|
|
558
|
-
): Promise<void> {
|
|
559
|
-
if (middlewares.length === 0) {
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
let index = 0;
|
|
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
|
-
);
|
|
559
|
+
// Final re-merge: capture any RequestContext stub headers added after the
|
|
560
|
+
// last merge point (e.g. cookies().set() called after await next()).
|
|
561
|
+
// The reqCtx stub may have already been partially merged during finalHandler
|
|
562
|
+
// or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
|
|
563
|
+
//
|
|
564
|
+
// Skip for upgrade responses: upgrade headers are semantically immutable and
|
|
565
|
+
// set-cookie on an upgrade is not meaningful.
|
|
566
|
+
const reqCtx = _getRequestContext();
|
|
567
|
+
if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
|
|
568
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
569
|
+
if (stubCookies.length > 0) {
|
|
570
|
+
const existingCookies = new Set(finalResponse.headers.getSetCookie());
|
|
571
|
+
for (const cookie of stubCookies) {
|
|
572
|
+
if (!existingCookies.has(cookie)) {
|
|
573
|
+
finalResponse.headers.append("set-cookie", cookie);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
590
576
|
}
|
|
577
|
+
// Fill in non-cookie headers that aren't already on the response
|
|
578
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
579
|
+
if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
|
|
580
|
+
finalResponse.headers.set(name, value);
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
}
|
|
591
584
|
|
|
592
|
-
|
|
593
|
-
};
|
|
594
|
-
|
|
595
|
-
await next();
|
|
596
|
-
// Headers/cookies set on stubResponse will be merged by the caller
|
|
585
|
+
return finalResponse;
|
|
597
586
|
}
|
|
598
587
|
|
|
599
588
|
/**
|
|
@@ -617,7 +606,12 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
617
606
|
env: TEnv,
|
|
618
607
|
params: Record<string, string>,
|
|
619
608
|
variables: Record<string, any>,
|
|
620
|
-
stubResponse: Response
|
|
609
|
+
stubResponse: Response,
|
|
610
|
+
reverse?: (
|
|
611
|
+
name: string,
|
|
612
|
+
params?: Record<string, string>,
|
|
613
|
+
search?: Record<string, unknown>,
|
|
614
|
+
) => string,
|
|
621
615
|
): Promise<Response | null> {
|
|
622
616
|
if (middlewares.length === 0) {
|
|
623
617
|
return null;
|
|
@@ -640,22 +634,39 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
640
634
|
env,
|
|
641
635
|
params,
|
|
642
636
|
variables,
|
|
643
|
-
responseHolder
|
|
637
|
+
responseHolder,
|
|
638
|
+
reverse,
|
|
644
639
|
);
|
|
645
640
|
|
|
646
|
-
|
|
641
|
+
let nextCalled = false;
|
|
642
|
+
const guardedNext = (): Promise<Response> => {
|
|
643
|
+
if (nextCalled) {
|
|
644
|
+
throw new Error(
|
|
645
|
+
`[@rangojs/router] Intercept middleware called next() more than once.`,
|
|
646
|
+
);
|
|
647
|
+
}
|
|
648
|
+
nextCalled = true;
|
|
649
|
+
return next();
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
let result: Response | void;
|
|
653
|
+
try {
|
|
654
|
+
result = await middleware(ctx, guardedNext);
|
|
655
|
+
} catch (error) {
|
|
656
|
+
// Thrown Response is short-circuit control flow, parity with the
|
|
657
|
+
// explicit-return path below. Real errors propagate.
|
|
658
|
+
if (error instanceof Response) {
|
|
659
|
+
result = error;
|
|
660
|
+
} else {
|
|
661
|
+
throw error;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
647
664
|
|
|
648
665
|
if (result instanceof Response) {
|
|
649
666
|
earlyResponse = result;
|
|
650
667
|
return result;
|
|
651
668
|
}
|
|
652
669
|
|
|
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
670
|
return stubResponse;
|
|
660
671
|
};
|
|
661
672
|
|
|
@@ -673,12 +684,14 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
673
684
|
});
|
|
674
685
|
|
|
675
686
|
if (hasStubHeaders) {
|
|
676
|
-
// Clone and merge headers from stub into early response
|
|
687
|
+
// Clone and merge headers from stub into early response.
|
|
688
|
+
// Only fill in missing headers — the returned Response's explicit
|
|
689
|
+
// headers take precedence, matching executeMiddleware behavior.
|
|
677
690
|
const mergedHeaders = new Headers(response.headers);
|
|
678
691
|
stubResponse.headers.forEach((value, name) => {
|
|
679
692
|
if (name.toLowerCase() === "set-cookie") {
|
|
680
693
|
mergedHeaders.append(name, value);
|
|
681
|
-
} else {
|
|
694
|
+
} else if (!mergedHeaders.has(name)) {
|
|
682
695
|
mergedHeaders.set(name, value);
|
|
683
696
|
}
|
|
684
697
|
});
|
|
@@ -708,7 +721,12 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
708
721
|
env: TEnv,
|
|
709
722
|
params: Record<string, string>,
|
|
710
723
|
variables: Record<string, any>,
|
|
711
|
-
finalHandler: () => Promise<Response
|
|
724
|
+
finalHandler: () => Promise<Response>,
|
|
725
|
+
reverse?: (
|
|
726
|
+
name: string,
|
|
727
|
+
params?: Record<string, string>,
|
|
728
|
+
search?: Record<string, unknown>,
|
|
729
|
+
) => string,
|
|
712
730
|
): Promise<Response> {
|
|
713
731
|
if (middlewares.length === 0) {
|
|
714
732
|
return finalHandler();
|
|
@@ -731,27 +749,11 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
731
749
|
request,
|
|
732
750
|
env,
|
|
733
751
|
variables,
|
|
734
|
-
finalHandler
|
|
752
|
+
finalHandler,
|
|
753
|
+
reverse,
|
|
735
754
|
);
|
|
736
755
|
}
|
|
737
756
|
|
|
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
757
|
/**
|
|
756
758
|
* Collect route-level middleware from an entry tree
|
|
757
759
|
*
|
|
@@ -764,7 +766,7 @@ export interface CollectedMiddleware {
|
|
|
764
766
|
*/
|
|
765
767
|
export function collectRouteMiddleware(
|
|
766
768
|
entries: Iterable<MiddlewareCollectableEntry>,
|
|
767
|
-
params: Record<string, string
|
|
769
|
+
params: Record<string, string>,
|
|
768
770
|
): CollectedMiddleware[] {
|
|
769
771
|
const result: CollectedMiddleware[] = [];
|
|
770
772
|
|