@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.20dbba0c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -0
- package/README.md +972 -4
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/{src/__mocks__/version.ts → dist/__mocks__/version.js} +1 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +1689 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
- package/dist/href-context.d.ts.map +1 -0
- package/dist/href-context.js +21 -0
- package/dist/href-context.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/index.rsc.d.ts +32 -0
- package/dist/index.rsc.d.ts.map +1 -0
- package/dist/index.rsc.js +40 -0
- package/dist/index.rsc.js.map +1 -0
- package/dist/internal-debug.d.ts +2 -0
- package/dist/internal-debug.d.ts.map +1 -0
- package/dist/internal-debug.js +5 -0
- package/dist/internal-debug.js.map +1 -0
- package/dist/loader.d.ts +14 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +20 -0
- package/dist/loader.js.map +1 -0
- package/dist/loader.rsc.d.ts +19 -0
- package/dist/loader.rsc.d.ts.map +1 -0
- package/dist/loader.rsc.js +99 -0
- package/dist/loader.rsc.js.map +1 -0
- package/dist/network-error-thrower.d.ts +17 -0
- package/dist/network-error-thrower.d.ts.map +1 -0
- package/dist/network-error-thrower.js +14 -0
- package/dist/network-error-thrower.js.map +1 -0
- package/dist/outlet-context.d.ts +13 -0
- package/dist/outlet-context.d.ts.map +1 -0
- package/dist/outlet-context.js +3 -0
- package/dist/outlet-context.js.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
- package/dist/prerender/__tests__/param-hash.test.js +148 -0
- package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
- package/dist/prerender/param-hash.d.ts +16 -0
- package/dist/prerender/param-hash.d.ts.map +1 -0
- package/dist/prerender/param-hash.js +36 -0
- package/dist/prerender/param-hash.js.map +1 -0
- package/dist/prerender/store.d.ts +38 -0
- package/dist/prerender/store.d.ts.map +1 -0
- package/dist/prerender/store.js +61 -0
- package/dist/prerender/store.js.map +1 -0
- package/dist/prerender.d.ts +66 -0
- package/dist/prerender.d.ts.map +1 -0
- package/dist/prerender.js +57 -0
- package/dist/prerender.js.map +1 -0
- package/dist/reverse.d.ts +196 -0
- package/dist/reverse.d.ts.map +1 -0
- package/dist/reverse.js +78 -0
- package/dist/reverse.js.map +1 -0
- package/dist/root-error-boundary.d.ts +33 -0
- package/dist/root-error-boundary.d.ts.map +1 -0
- package/dist/root-error-boundary.js +165 -0
- package/dist/root-error-boundary.js.map +1 -0
- package/dist/route-content-wrapper.d.ts +46 -0
- package/dist/route-content-wrapper.d.ts.map +1 -0
- package/dist/route-content-wrapper.js +77 -0
- package/dist/route-content-wrapper.js.map +1 -0
- package/dist/route-definition.d.ts +421 -0
- package/dist/route-definition.d.ts.map +1 -0
- package/dist/route-definition.js +868 -0
- package/dist/route-definition.js.map +1 -0
- package/dist/route-map-builder.d.ts +155 -0
- package/dist/route-map-builder.d.ts.map +1 -0
- package/dist/route-map-builder.js +237 -0
- package/dist/route-map-builder.js.map +1 -0
- package/dist/route-types.d.ts +165 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +7 -0
- package/dist/route-types.js.map +1 -0
- package/dist/router/__tests__/handler-context.test.d.ts +2 -0
- package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/handler-context.test.js +65 -0
- package/dist/router/__tests__/handler-context.test.js.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
- package/dist/router/__tests__/match-context.test.d.ts +2 -0
- package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-context.test.js +92 -0
- package/dist/router/__tests__/match-context.test.js.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-pipelines.test.js +417 -0
- package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
- package/dist/router/__tests__/match-result.test.d.ts +2 -0
- package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/router/__tests__/match-result.test.js +457 -0
- package/dist/router/__tests__/match-result.test.js.map +1 -0
- package/dist/router/__tests__/on-error.test.d.ts +2 -0
- package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
- package/dist/router/__tests__/on-error.test.js +678 -0
- package/dist/router/__tests__/on-error.test.js.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
- package/dist/router/__tests__/pattern-matching.test.js +629 -0
- package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
- package/dist/router/error-handling.d.ts +77 -0
- package/dist/router/error-handling.d.ts.map +1 -0
- package/dist/router/error-handling.js +202 -0
- package/dist/router/error-handling.js.map +1 -0
- package/dist/router/handler-context.d.ts +20 -0
- package/dist/router/handler-context.d.ts.map +1 -0
- package/dist/router/handler-context.js +198 -0
- package/dist/router/handler-context.js.map +1 -0
- package/dist/router/intercept-resolution.d.ts +66 -0
- package/dist/router/intercept-resolution.d.ts.map +1 -0
- package/dist/router/intercept-resolution.js +246 -0
- package/dist/router/intercept-resolution.js.map +1 -0
- package/dist/router/loader-resolution.d.ts +64 -0
- package/dist/router/loader-resolution.d.ts.map +1 -0
- package/dist/router/loader-resolution.js +284 -0
- package/dist/router/loader-resolution.js.map +1 -0
- package/dist/router/logging.d.ts +15 -0
- package/dist/router/logging.d.ts.map +1 -0
- package/dist/router/logging.js +99 -0
- package/dist/router/logging.js.map +1 -0
- package/dist/router/manifest.d.ts +22 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/manifest.js +181 -0
- package/dist/router/manifest.js.map +1 -0
- package/dist/router/match-api.d.ts +35 -0
- package/dist/router/match-api.d.ts.map +1 -0
- package/dist/router/match-api.js +406 -0
- package/dist/router/match-api.js.map +1 -0
- package/dist/router/match-context.d.ts +206 -0
- package/dist/router/match-context.d.ts.map +1 -0
- package/dist/router/match-context.js +17 -0
- package/dist/router/match-context.js.map +1 -0
- package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
- package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
- package/dist/router/match-middleware/background-revalidation.js +75 -0
- package/dist/router/match-middleware/background-revalidation.js.map +1 -0
- package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
- package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-lookup.js +257 -0
- package/dist/router/match-middleware/cache-lookup.js.map +1 -0
- package/dist/router/match-middleware/cache-store.d.ts +113 -0
- package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
- package/dist/router/match-middleware/cache-store.js +108 -0
- package/dist/router/match-middleware/cache-store.js.map +1 -0
- package/dist/router/match-middleware/index.d.ts +81 -0
- package/dist/router/match-middleware/index.d.ts.map +1 -0
- package/dist/router/match-middleware/index.js +80 -0
- package/dist/router/match-middleware/index.js.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/intercept-resolution.js +134 -0
- package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
- package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
- package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
- package/dist/router/match-middleware/segment-resolution.js +53 -0
- package/dist/router/match-middleware/segment-resolution.js.map +1 -0
- package/dist/router/match-pipelines.d.ts +147 -0
- package/dist/router/match-pipelines.d.ts.map +1 -0
- package/dist/router/match-pipelines.js +82 -0
- package/dist/router/match-pipelines.js.map +1 -0
- package/dist/router/match-result.d.ts +126 -0
- package/dist/router/match-result.d.ts.map +1 -0
- package/dist/router/match-result.js +93 -0
- package/dist/router/match-result.js.map +1 -0
- package/dist/router/metrics.d.ts +20 -0
- package/dist/router/metrics.d.ts.map +1 -0
- package/dist/router/metrics.js +47 -0
- package/dist/router/metrics.js.map +1 -0
- package/dist/router/middleware.d.ts +249 -0
- package/dist/router/middleware.d.ts.map +1 -0
- package/dist/router/middleware.js +434 -0
- package/dist/router/middleware.js.map +1 -0
- package/dist/router/middleware.test.d.ts +2 -0
- package/dist/router/middleware.test.d.ts.map +1 -0
- package/dist/router/middleware.test.js +816 -0
- package/dist/router/middleware.test.js.map +1 -0
- package/dist/router/pattern-matching.d.ts +149 -0
- package/dist/router/pattern-matching.d.ts.map +1 -0
- package/dist/router/pattern-matching.js +349 -0
- package/dist/router/pattern-matching.js.map +1 -0
- package/dist/router/revalidation.d.ts +44 -0
- package/dist/router/revalidation.d.ts.map +1 -0
- package/dist/router/revalidation.js +147 -0
- package/dist/router/revalidation.js.map +1 -0
- package/dist/router/router-context.d.ts +135 -0
- package/dist/router/router-context.d.ts.map +1 -0
- package/dist/router/router-context.js +36 -0
- package/dist/router/router-context.js.map +1 -0
- package/dist/router/segment-resolution.d.ts +127 -0
- package/dist/router/segment-resolution.d.ts.map +1 -0
- package/dist/router/segment-resolution.js +919 -0
- package/dist/router/segment-resolution.js.map +1 -0
- package/dist/router/trie-matching.d.ts +40 -0
- package/dist/router/trie-matching.d.ts.map +1 -0
- package/dist/router/trie-matching.js +127 -0
- package/dist/router/trie-matching.js.map +1 -0
- package/dist/router/types.d.ts +136 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/router.d.ts +753 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.gen.d.ts +6 -0
- package/dist/router.gen.d.ts.map +1 -0
- package/dist/router.gen.js +6 -0
- package/dist/router.gen.js.map +1 -0
- package/dist/router.js +1304 -0
- package/dist/router.js.map +1 -0
- package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
- package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/rsc/__tests__/helpers.test.js +140 -0
- package/dist/rsc/__tests__/helpers.test.js.map +1 -0
- package/dist/rsc/handler.d.ts +45 -0
- package/dist/rsc/handler.d.ts.map +1 -0
- package/dist/rsc/handler.js +1172 -0
- package/dist/rsc/handler.js.map +1 -0
- package/dist/rsc/helpers.d.ts +16 -0
- package/dist/rsc/helpers.d.ts.map +1 -0
- package/dist/rsc/helpers.js +55 -0
- package/dist/rsc/helpers.js.map +1 -0
- package/dist/rsc/index.d.ts +22 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +23 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/nonce.d.ts +9 -0
- package/dist/rsc/nonce.d.ts.map +1 -0
- package/dist/rsc/nonce.js +18 -0
- package/dist/rsc/nonce.js.map +1 -0
- package/dist/rsc/types.d.ts +206 -0
- package/dist/rsc/types.d.ts.map +1 -0
- package/dist/rsc/types.js +8 -0
- package/dist/rsc/types.js.map +1 -0
- package/dist/search-params.d.ts +103 -0
- package/dist/search-params.d.ts.map +1 -0
- package/dist/search-params.js +74 -0
- package/dist/search-params.js.map +1 -0
- package/dist/segment-system.d.ts +75 -0
- package/dist/segment-system.d.ts.map +1 -0
- package/dist/segment-system.js +336 -0
- package/dist/segment-system.js.map +1 -0
- package/dist/server/context.d.ts +245 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +197 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/fetchable-loader-store.d.ts +18 -0
- package/dist/server/fetchable-loader-store.d.ts.map +1 -0
- package/dist/server/fetchable-loader-store.js +18 -0
- package/dist/server/fetchable-loader-store.js.map +1 -0
- package/dist/server/handle-store.d.ts +85 -0
- package/dist/server/handle-store.d.ts.map +1 -0
- package/dist/server/handle-store.js +142 -0
- package/dist/server/handle-store.js.map +1 -0
- package/dist/server/loader-registry.d.ts +55 -0
- package/dist/server/loader-registry.d.ts.map +1 -0
- package/dist/server/loader-registry.js +132 -0
- package/dist/server/loader-registry.js.map +1 -0
- package/dist/server/request-context.d.ts +226 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +290 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/server/root-layout.d.ts +4 -0
- package/dist/server/root-layout.d.ts.map +1 -0
- package/dist/server/root-layout.js +5 -0
- package/dist/server/root-layout.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
- package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
- package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
- package/dist/ssr/index.d.ts +98 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +158 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static-handler.d.ts +50 -0
- package/dist/static-handler.d.ts.map +1 -0
- package/dist/static-handler.gen.d.ts +5 -0
- package/dist/static-handler.gen.d.ts.map +1 -0
- package/dist/static-handler.gen.js +5 -0
- package/dist/static-handler.gen.js.map +1 -0
- package/dist/static-handler.js +29 -0
- package/dist/static-handler.js.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +20 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +240 -0
- package/dist/theme/ThemeProvider.js.map +1 -0
- package/dist/theme/ThemeScript.d.ts +48 -0
- package/dist/theme/ThemeScript.d.ts.map +1 -0
- package/dist/theme/ThemeScript.js +13 -0
- package/dist/theme/ThemeScript.js.map +1 -0
- package/dist/theme/__tests__/theme.test.d.ts +2 -0
- package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
- package/dist/theme/__tests__/theme.test.js +103 -0
- package/dist/theme/__tests__/theme.test.js.map +1 -0
- package/dist/theme/constants.d.ts +29 -0
- package/dist/theme/constants.d.ts.map +1 -0
- package/dist/theme/constants.js +48 -0
- package/dist/theme/constants.js.map +1 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +36 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme-context.d.ts +40 -0
- package/dist/theme/theme-context.d.ts.map +1 -0
- package/dist/theme/theme-context.js +60 -0
- package/dist/theme/theme-context.js.map +1 -0
- package/dist/theme/theme-script.d.ts +27 -0
- package/dist/theme/theme-script.d.ts.map +1 -0
- package/dist/theme/theme-script.js +147 -0
- package/dist/theme/theme-script.js.map +1 -0
- package/dist/theme/types.d.ts +163 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +11 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/theme/use-theme.d.ts +12 -0
- package/dist/theme/use-theme.d.ts.map +1 -0
- package/dist/theme/use-theme.js +40 -0
- package/dist/theme/use-theme.js.map +1 -0
- package/dist/types.d.ts +1479 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/urls.d.ts +441 -0
- package/dist/urls.d.ts.map +1 -0
- package/dist/urls.gen.d.ts +8 -0
- package/dist/urls.gen.d.ts.map +1 -0
- package/dist/urls.gen.js +8 -0
- package/dist/urls.gen.js.map +1 -0
- package/dist/urls.js +443 -0
- package/dist/urls.js.map +1 -0
- package/dist/use-loader.d.ts +127 -0
- package/dist/use-loader.d.ts.map +1 -0
- package/dist/use-loader.js +237 -0
- package/dist/use-loader.js.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
- package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
- package/dist/vite/__tests__/expose-router-id.test.js +39 -0
- package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
- package/dist/vite/ast-handler-extract.d.ts +49 -0
- package/dist/vite/ast-handler-extract.d.ts.map +1 -0
- package/dist/vite/ast-handler-extract.js +249 -0
- package/dist/vite/ast-handler-extract.js.map +1 -0
- package/dist/vite/expose-action-id.d.ts +19 -0
- package/dist/vite/expose-action-id.d.ts.map +1 -0
- package/dist/vite/expose-action-id.js +250 -0
- package/dist/vite/expose-action-id.js.map +1 -0
- package/dist/vite/expose-id-utils.d.ts +69 -0
- package/dist/vite/expose-id-utils.d.ts.map +1 -0
- package/dist/vite/expose-id-utils.js +289 -0
- package/dist/vite/expose-id-utils.js.map +1 -0
- package/dist/vite/expose-internal-ids.d.ts +22 -0
- package/dist/vite/expose-internal-ids.d.ts.map +1 -0
- package/dist/vite/expose-internal-ids.js +886 -0
- package/dist/vite/expose-internal-ids.js.map +1 -0
- package/dist/vite/index.d.ts +149 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +5320 -834
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +92 -55
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +294 -0
- package/skills/caching/SKILL.md +173 -231
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +88 -58
- package/skills/fonts/SKILL.md +167 -0
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +420 -67
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +243 -202
- package/skills/layout/SKILL.md +262 -146
- package/skills/links/SKILL.md +313 -0
- package/skills/loader/SKILL.md +525 -251
- package/skills/middleware/SKILL.md +248 -320
- package/skills/migrate-nextjs/SKILL.md +560 -0
- package/skills/migrate-react-router/SKILL.md +765 -0
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +393 -158
- package/skills/prerender/SKILL.md +685 -0
- package/skills/rango/SKILL.md +120 -0
- package/skills/response-routes/SKILL.md +419 -0
- package/skills/route/SKILL.md +388 -89
- package/skills/router-setup/SKILL.md +388 -267
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +456 -173
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +273 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +92 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +383 -557
- package/src/browser/navigation-client.ts +229 -68
- package/src/browser/navigation-store.ts +97 -55
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +391 -304
- package/src/browser/prefetch/cache.ts +314 -0
- package/src/browser/prefetch/fetch.ts +282 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +191 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +152 -0
- package/src/browser/react/Link.tsx +258 -74
- package/src/browser/react/NavigationProvider.tsx +219 -33
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +37 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +29 -51
- package/src/browser/react/use-client-cache.ts +5 -3
- package/src/browser/react/use-handle.ts +30 -95
- package/src/browser/react/use-href.tsx +20 -188
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-mount.ts +31 -0
- package/src/browser/react/use-navigation.ts +49 -80
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +83 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +251 -70
- package/src/browser/scroll-restoration.ts +127 -52
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +510 -588
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +176 -58
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +39 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +291 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +418 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +618 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +342 -0
- package/src/cache/cache-scope.ts +167 -309
- package/src/cache/cf/cf-cache-store.ts +573 -21
- package/src/cache/cf/index.ts +13 -3
- package/src/cache/document-cache.ts +116 -77
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +1 -15
- package/src/cache/memory-segment-store.ts +191 -13
- package/src/cache/profile-registry.ts +73 -0
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +256 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +76 -121
- package/src/client.rsc.tsx +12 -15
- package/src/client.tsx +142 -308
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +156 -0
- package/src/debug.ts +243 -0
- package/src/errors.ts +108 -2
- package/src/handle.ts +74 -19
- package/src/handles/MetaTags.tsx +76 -23
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/handles/meta.ts +32 -15
- package/src/host/cookie-handler.ts +165 -0
- package/src/host/errors.ts +97 -0
- package/src/host/index.ts +53 -0
- package/src/host/pattern-matcher.ts +214 -0
- package/src/host/router.ts +352 -0
- package/src/host/testing.ts +79 -0
- package/src/host/types.ts +146 -0
- package/src/host/utils.ts +25 -0
- package/src/href-client.ts +141 -47
- package/src/index.rsc.ts +187 -28
- package/src/index.ts +271 -38
- package/src/internal-debug.ts +11 -0
- package/src/loader.rsc.ts +27 -142
- package/src/loader.ts +27 -10
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +186 -0
- package/src/prerender.ts +524 -0
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +355 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +9 -11
- package/src/route-definition/dsl-helpers.ts +1134 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +478 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +101 -0
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +247 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +88 -9
- package/src/router/content-negotiation.ts +215 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +457 -88
- package/src/router/intercept-resolution.ts +402 -0
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +360 -128
- package/src/router/logging.ts +251 -0
- package/src/router/manifest.ts +187 -43
- package/src/router/match-api.ts +555 -0
- package/src/router/match-context.ts +6 -4
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +108 -93
- package/src/router/match-middleware/cache-lookup.ts +460 -10
- package/src/router/match-middleware/cache-store.ts +98 -26
- package/src/router/match-middleware/intercept-resolution.ts +57 -17
- package/src/router/match-middleware/segment-resolution.ts +80 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +135 -36
- package/src/router/metrics.ts +240 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +200 -0
- package/src/router/middleware.ts +359 -333
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +375 -33
- package/src/router/prerender-match.ts +502 -0
- package/src/router/preview-match.ts +98 -0
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +137 -38
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +45 -23
- package/src/router/router-interfaces.ts +484 -0
- package/src/router/router-options.ts +618 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +748 -0
- package/src/router/segment-resolution/helpers.ts +268 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1379 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +291 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +245 -0
- package/src/router/types.ts +79 -4
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +750 -3572
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +934 -801
- package/src/rsc/helpers.ts +181 -19
- package/src/rsc/index.ts +5 -25
- package/src/rsc/loader-fetch.ts +229 -0
- package/src/rsc/manifest-init.ts +90 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +393 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +360 -0
- package/src/rsc/rsc-rendering.ts +253 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +358 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +48 -14
- package/src/search-params.ts +230 -0
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +165 -81
- package/src/server/context.ts +384 -61
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +117 -20
- package/src/server/loader-registry.ts +24 -64
- package/src/server/request-context.ts +603 -109
- package/src/server.ts +36 -131
- package/src/ssr/index.tsx +160 -25
- package/src/static-handler.ts +126 -0
- package/src/theme/ThemeProvider.tsx +21 -15
- package/src/theme/ThemeScript.tsx +5 -5
- package/src/theme/constants.ts +11 -4
- package/src/theme/index.ts +4 -14
- package/src/theme/theme-context.ts +5 -31
- package/src/theme/theme-script.ts +21 -18
- package/src/theme/types.ts +1 -1
- package/src/types/boundaries.ts +158 -0
- package/src/types/cache-types.ts +198 -0
- package/src/types/error-types.ts +192 -0
- package/src/types/global-namespace.ts +100 -0
- package/src/types/handler-context.ts +759 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +209 -0
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +120 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1561
- package/src/urls/include-helper.ts +207 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +372 -0
- package/src/urls/path-helper.ts +364 -0
- package/src/urls/pattern-types.ts +107 -0
- package/src/urls/response-types.ts +108 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -726
- package/src/use-loader.tsx +161 -81
- package/src/vite/discovery/bundle-postprocess.ts +181 -0
- package/src/vite/discovery/discover-routers.ts +348 -0
- package/src/vite/discovery/prerender-collection.ts +439 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +117 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +18 -785
- package/src/vite/plugin-types.ts +103 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -53
- package/src/vite/plugins/expose-id-utils.ts +299 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +786 -0
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +266 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +483 -0
- package/src/vite/router-discovery.ts +977 -0
- package/src/vite/utils/ast-handler-extract.ts +517 -0
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +58 -29
- package/src/vite/utils/prerender-utils.ts +221 -0
- package/src/vite/utils/shared-utils.ts +170 -0
- package/CLAUDE.md +0 -7
- package/src/__tests__/component-utils.test.ts +0 -76
- package/src/__tests__/route-definition.test.ts +0 -63
- package/src/__tests__/urls.test.tsx +0 -436
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/request-controller.ts +0 -164
- package/src/cache/__tests__/document-cache.test.ts +0 -522
- package/src/cache/__tests__/memory-segment-store.test.ts +0 -487
- package/src/cache/__tests__/memory-store.test.ts +0 -484
- package/src/cache/cf/__tests__/cf-cache-store.test.ts +0 -428
- package/src/cache/memory-store.ts +0 -253
- package/src/href.ts +0 -177
- package/src/route-utils.ts +0 -89
- package/src/router/__tests__/match-context.test.ts +0 -104
- package/src/router/__tests__/match-pipelines.test.ts +0 -537
- package/src/router/__tests__/match-result.test.ts +0 -566
- package/src/router/__tests__/on-error.test.ts +0 -935
- package/src/router/__tests__/pattern-matching.test.ts +0 -577
- package/src/router/middleware.test.ts +0 -1355
- package/src/rsc/__tests__/helpers.test.ts +0 -175
- package/src/server/__tests__/request-context.test.ts +0 -171
- package/src/ssr/__tests__/ssr-handler.test.tsx +0 -188
- package/src/theme/__tests__/theme.test.ts +0 -120
- package/src/vite/__tests__/expose-loader-id.test.ts +0 -117
- package/src/vite/expose-handle-id.ts +0 -209
- package/src/vite/expose-loader-id.ts +0 -357
- package/src/vite/expose-location-state-id.ts +0 -177
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/router/middleware.ts
CHANGED
|
@@ -9,129 +9,58 @@
|
|
|
9
9
|
* - Forgiving API: if middleware doesn't return, original response is used
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
params: TParams;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Response object - available immediately via stub, real response after `await next()`
|
|
55
|
-
*
|
|
56
|
-
* Headers set before `next()` are merged into the final response.
|
|
57
|
-
* Can be used to modify headers directly like Hono's `c.res`.
|
|
58
|
-
*
|
|
59
|
-
* @example
|
|
60
|
-
* ```typescript
|
|
61
|
-
* middleware(async (ctx, next) => {
|
|
62
|
-
* // Set headers BEFORE next() - will be merged into final response
|
|
63
|
-
* ctx.res.headers.set('X-Request-Id', generateId());
|
|
64
|
-
*
|
|
65
|
-
* await next();
|
|
66
|
-
*
|
|
67
|
-
* // Set headers AFTER next() - applied directly
|
|
68
|
-
* ctx.res.headers.set('X-Custom', 'value');
|
|
69
|
-
* // No return needed!
|
|
70
|
-
* });
|
|
71
|
-
* ```
|
|
72
|
-
*/
|
|
73
|
-
res: Response;
|
|
74
|
-
|
|
75
|
-
/** Get a cookie value */
|
|
76
|
-
cookie(name: string): string | undefined;
|
|
77
|
-
|
|
78
|
-
/** Get all cookies as object */
|
|
79
|
-
cookies(): Record<string, string>;
|
|
80
|
-
|
|
81
|
-
/** Set a cookie on the response */
|
|
82
|
-
setCookie(name: string, value: string, options?: CookieOptions): void;
|
|
83
|
-
|
|
84
|
-
/** Delete a cookie */
|
|
85
|
-
deleteCookie(
|
|
86
|
-
name: string,
|
|
87
|
-
options?: Pick<CookieOptions, "domain" | "path">
|
|
88
|
-
): void;
|
|
89
|
-
|
|
90
|
-
/** Get a context variable (shared with route handlers) */
|
|
91
|
-
get<K extends string>(key: K): any;
|
|
92
|
-
|
|
93
|
-
/** Set a context variable (shared with route handlers) */
|
|
94
|
-
set<K extends string>(key: K, value: any): void;
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Set a response header - can be called before or after `next()`
|
|
98
|
-
*
|
|
99
|
-
* When called before `next()`, headers are queued and merged into the final response.
|
|
100
|
-
* When called after `next()`, headers are set directly on the response.
|
|
101
|
-
* Shorthand for `ctx.res.headers.set()`.
|
|
102
|
-
*/
|
|
103
|
-
header(name: string, value: string): void;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Middleware function signature
|
|
108
|
-
*
|
|
109
|
-
* @template TEnv - Environment type
|
|
110
|
-
* @template TParams - URL params type (typed for route middleware)
|
|
111
|
-
*/
|
|
112
|
-
export type MiddlewareFn<TEnv = any, TParams = Record<string, string>> = (
|
|
113
|
-
ctx: MiddlewareContext<TEnv, TParams>,
|
|
114
|
-
next: () => Promise<Response>
|
|
115
|
-
) => Response | Promise<Response> | void | Promise<void>;
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Stored middleware entry with pattern matching info
|
|
119
|
-
*/
|
|
120
|
-
export interface MiddlewareEntry<TEnv = any> {
|
|
121
|
-
/** Original pattern string */
|
|
122
|
-
pattern: string | null;
|
|
123
|
-
|
|
124
|
-
/** Compiled regex for matching */
|
|
125
|
-
regex: RegExp | null;
|
|
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 ?? "*";
|
|
126
51
|
|
|
127
|
-
|
|
128
|
-
|
|
52
|
+
if (handlerName) {
|
|
53
|
+
return `${handlerName}@${scope}`;
|
|
54
|
+
}
|
|
129
55
|
|
|
130
|
-
|
|
131
|
-
|
|
56
|
+
return `${scope}#${ordinal + 1}`;
|
|
57
|
+
}
|
|
132
58
|
|
|
133
|
-
|
|
134
|
-
|
|
59
|
+
function getMiddlewareMetricLabel<TEnv>(
|
|
60
|
+
entry: MiddlewareEntry<TEnv>,
|
|
61
|
+
ordinal: number,
|
|
62
|
+
): string {
|
|
63
|
+
return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
|
|
135
64
|
}
|
|
136
65
|
|
|
137
66
|
/**
|
|
@@ -186,165 +115,164 @@ function escapeRegex(str: string): string {
|
|
|
186
115
|
}
|
|
187
116
|
|
|
188
117
|
/**
|
|
189
|
-
* 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.
|
|
190
124
|
*/
|
|
191
125
|
export function extractParams(
|
|
192
126
|
pathname: string,
|
|
193
127
|
regex: RegExp,
|
|
194
|
-
paramNames: string[]
|
|
128
|
+
paramNames: string[],
|
|
195
129
|
): Record<string, string> {
|
|
196
130
|
const match = pathname.match(regex);
|
|
197
131
|
if (!match) return {};
|
|
198
132
|
|
|
199
133
|
const params: Record<string, string> = {};
|
|
200
134
|
for (let i = 0; i < paramNames.length; i++) {
|
|
201
|
-
params[paramNames[i]] = match[i + 1] || "";
|
|
135
|
+
params[paramNames[i]] = safeDecodeURIComponent(match[i + 1] || "");
|
|
202
136
|
}
|
|
203
137
|
return params;
|
|
204
138
|
}
|
|
205
139
|
|
|
206
|
-
/**
|
|
207
|
-
* Parse cookies from Cookie header
|
|
208
|
-
*/
|
|
209
|
-
export function parseCookies(
|
|
210
|
-
cookieHeader: string | null
|
|
211
|
-
): Record<string, string> {
|
|
212
|
-
if (!cookieHeader) return {};
|
|
213
|
-
|
|
214
|
-
const cookies: Record<string, string> = {};
|
|
215
|
-
const pairs = cookieHeader.split(";");
|
|
216
|
-
|
|
217
|
-
for (const pair of pairs) {
|
|
218
|
-
const [name, ...rest] = pair.trim().split("=");
|
|
219
|
-
if (name) {
|
|
220
|
-
cookies[name] = decodeURIComponent(rest.join("="));
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return cookies;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Serialize a cookie for Set-Cookie header
|
|
229
|
-
*/
|
|
230
|
-
export function serializeCookie(
|
|
231
|
-
name: string,
|
|
232
|
-
value: string,
|
|
233
|
-
options: CookieOptions = {}
|
|
234
|
-
): string {
|
|
235
|
-
let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
236
|
-
|
|
237
|
-
if (options.domain) cookie += `; Domain=${options.domain}`;
|
|
238
|
-
if (options.path) cookie += `; Path=${options.path}`;
|
|
239
|
-
if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;
|
|
240
|
-
if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;
|
|
241
|
-
if (options.httpOnly) cookie += "; HttpOnly";
|
|
242
|
-
if (options.secure) cookie += "; Secure";
|
|
243
|
-
if (options.sameSite) cookie += `; SameSite=${options.sameSite}`;
|
|
244
|
-
|
|
245
|
-
return cookie;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Mutable response holder - allows ctx.res to be updated after next() is called
|
|
250
|
-
*/
|
|
251
|
-
export interface ResponseHolder {
|
|
252
|
-
response: Response | null;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
140
|
/**
|
|
256
141
|
* Create middleware context
|
|
142
|
+
*
|
|
143
|
+
* Note: The implementation uses runtime values while the interface provides
|
|
144
|
+
* compile-time type safety. The env/get/set types are resolved at call sites
|
|
145
|
+
* via conditional types based on TEnv from createRouter<TBindings>().
|
|
257
146
|
*/
|
|
258
147
|
export function createMiddlewareContext<TEnv>(
|
|
259
148
|
request: Request,
|
|
260
149
|
env: TEnv,
|
|
261
150
|
params: Record<string, string>,
|
|
262
|
-
variables: Record<string,
|
|
263
|
-
responseHolder: ResponseHolder
|
|
151
|
+
variables: Record<string, unknown>,
|
|
152
|
+
responseHolder: ResponseHolder,
|
|
153
|
+
reverse?: (
|
|
154
|
+
name: string,
|
|
155
|
+
params?: Record<string, string>,
|
|
156
|
+
search?: Record<string, unknown>,
|
|
157
|
+
) => string,
|
|
264
158
|
): MiddlewareContext<TEnv> {
|
|
265
|
-
const url = new URL(request.url);
|
|
266
|
-
|
|
267
|
-
|
|
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.
|
|
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
|
+
};
|
|
268
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();
|
|
269
196
|
return {
|
|
270
197
|
request,
|
|
271
198
|
url,
|
|
199
|
+
originalUrl: reqCtx?.originalUrl ?? new URL(request.url),
|
|
272
200
|
pathname: url.pathname,
|
|
273
201
|
searchParams: url.searchParams,
|
|
274
|
-
env,
|
|
202
|
+
env: env as MiddlewareContext<TEnv>["env"],
|
|
275
203
|
params,
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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"];
|
|
285
214
|
},
|
|
286
215
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
responseHolder.response = response;
|
|
216
|
+
get headers(): Headers {
|
|
217
|
+
return getResponse().headers;
|
|
290
218
|
},
|
|
291
219
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
parsedCookies = parseCookies(cookieHeader);
|
|
295
|
-
}
|
|
296
|
-
return parsedCookies[name];
|
|
297
|
-
},
|
|
220
|
+
get: ((keyOrVar: any) =>
|
|
221
|
+
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
298
222
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
+
}
|
|
302
234
|
}
|
|
303
|
-
|
|
304
|
-
},
|
|
305
|
-
|
|
306
|
-
setCookie(name: string, value: string, options?: CookieOptions): void {
|
|
235
|
+
// After next() or standalone: write to current response
|
|
307
236
|
if (!responseHolder.response) {
|
|
308
237
|
throw new Error(
|
|
309
|
-
"ctx.
|
|
238
|
+
"ctx.header() is not available - responseHolder was not initialized",
|
|
310
239
|
);
|
|
311
240
|
}
|
|
312
|
-
responseHolder.response.headers.
|
|
313
|
-
"Set-Cookie",
|
|
314
|
-
serializeCookie(name, value, options)
|
|
315
|
-
);
|
|
241
|
+
responseHolder.response.headers.set(name, value);
|
|
316
242
|
},
|
|
317
243
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
options?: Pick<CookieOptions, "domain" | "path">
|
|
321
|
-
): void {
|
|
322
|
-
if (!responseHolder.response) {
|
|
323
|
-
throw new Error(
|
|
324
|
-
"ctx.deleteCookie() is not available - responseHolder was not initialized"
|
|
325
|
-
);
|
|
326
|
-
}
|
|
327
|
-
responseHolder.response.headers.append(
|
|
328
|
-
"Set-Cookie",
|
|
329
|
-
serializeCookie(name, "", { ...options, maxAge: 0 })
|
|
330
|
-
);
|
|
244
|
+
get theme(): MiddlewareContext<TEnv>["theme"] {
|
|
245
|
+
return _getRequestContext()?.theme;
|
|
331
246
|
},
|
|
332
247
|
|
|
333
|
-
get
|
|
334
|
-
return
|
|
248
|
+
get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
|
|
249
|
+
return _getRequestContext()?.setTheme;
|
|
335
250
|
},
|
|
336
251
|
|
|
337
|
-
|
|
338
|
-
|
|
252
|
+
setLocationState(entries) {
|
|
253
|
+
const reqCtx = _getRequestContext();
|
|
254
|
+
if (!reqCtx) {
|
|
255
|
+
throw new Error(
|
|
256
|
+
"setLocationState() is not available outside a request context",
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
reqCtx.setLocationState(entries);
|
|
339
260
|
},
|
|
340
261
|
|
|
341
|
-
|
|
342
|
-
|
|
262
|
+
reverse:
|
|
263
|
+
reverse ??
|
|
264
|
+
((name: string) => {
|
|
343
265
|
throw new Error(
|
|
344
|
-
|
|
266
|
+
`ctx.reverse() is not available - route map was not provided to middleware context`,
|
|
345
267
|
);
|
|
268
|
+
}),
|
|
269
|
+
|
|
270
|
+
debugPerformance(): void {
|
|
271
|
+
const reqCtx = _getRequestContext();
|
|
272
|
+
if (reqCtx) {
|
|
273
|
+
reqCtx._debugPerformance = true;
|
|
274
|
+
reqCtx._metricsStore ??= createMetricsStore(true);
|
|
346
275
|
}
|
|
347
|
-
responseHolder.response.headers.set(name, value);
|
|
348
276
|
},
|
|
349
277
|
};
|
|
350
278
|
}
|
|
@@ -355,7 +283,7 @@ export function createMiddlewareContext<TEnv>(
|
|
|
355
283
|
*/
|
|
356
284
|
export function matchMiddleware<TEnv>(
|
|
357
285
|
pathname: string,
|
|
358
|
-
entries: MiddlewareEntry<TEnv>[]
|
|
286
|
+
entries: MiddlewareEntry<TEnv>[],
|
|
359
287
|
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
360
288
|
const matches: Array<{
|
|
361
289
|
entry: MiddlewareEntry<TEnv>;
|
|
@@ -384,9 +312,9 @@ export function matchMiddleware<TEnv>(
|
|
|
384
312
|
*
|
|
385
313
|
* Features:
|
|
386
314
|
* - `await next()` returns actual Response
|
|
387
|
-
* - `ctx.
|
|
388
|
-
* - `ctx.header()` shorthand for setting
|
|
389
|
-
* - 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
|
|
390
318
|
* - Short-circuit: return Response to stop chain
|
|
391
319
|
* - Error catching: try/catch around `next()` works
|
|
392
320
|
*/
|
|
@@ -398,7 +326,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
398
326
|
request: Request,
|
|
399
327
|
env: TEnv,
|
|
400
328
|
variables: Record<string, any>,
|
|
401
|
-
finalHandler: () => Promise<Response
|
|
329
|
+
finalHandler: () => Promise<Response>,
|
|
330
|
+
reverse?: (
|
|
331
|
+
name: string,
|
|
332
|
+
params?: Record<string, string>,
|
|
333
|
+
search?: Record<string, unknown>,
|
|
334
|
+
) => string,
|
|
402
335
|
): Promise<Response> {
|
|
403
336
|
let index = 0;
|
|
404
337
|
|
|
@@ -412,8 +345,8 @@ export async function executeMiddleware<TEnv>(
|
|
|
412
345
|
// End of chain - call actual RSC handler
|
|
413
346
|
const response = await finalHandler();
|
|
414
347
|
|
|
415
|
-
// Merge headers set on stub into the real response
|
|
416
|
-
// 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.
|
|
417
350
|
const mergedHeaders = new Headers(response.headers);
|
|
418
351
|
stubResponse.headers.forEach((value, name) => {
|
|
419
352
|
if (name.toLowerCase() === "set-cookie") {
|
|
@@ -422,6 +355,31 @@ export async function executeMiddleware<TEnv>(
|
|
|
422
355
|
mergedHeaders.set(name, value);
|
|
423
356
|
}
|
|
424
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
|
+
}
|
|
425
383
|
|
|
426
384
|
// Clone response with merged headers (mutable for post-next() modifications)
|
|
427
385
|
responseHolder.response = new Response(response.body, {
|
|
@@ -433,29 +391,126 @@ export async function executeMiddleware<TEnv>(
|
|
|
433
391
|
return responseHolder.response;
|
|
434
392
|
}
|
|
435
393
|
|
|
394
|
+
const middlewareOrdinal = index;
|
|
436
395
|
const { entry, params } = middlewares[index++];
|
|
437
396
|
const ctx = createMiddlewareContext(
|
|
438
397
|
request,
|
|
439
398
|
env,
|
|
440
399
|
params,
|
|
441
400
|
variables,
|
|
442
|
-
responseHolder
|
|
401
|
+
responseHolder,
|
|
402
|
+
reverse,
|
|
443
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
|
+
};
|
|
444
419
|
|
|
445
|
-
// Track if next() was called and capture its Promise
|
|
446
|
-
//
|
|
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.
|
|
447
423
|
let nextPromise: Promise<Response> | null = null;
|
|
424
|
+
let nextResolvedAt: number | undefined;
|
|
448
425
|
const wrappedNext = (): Promise<Response> => {
|
|
449
|
-
|
|
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
|
+
);
|
|
450
443
|
return nextPromise;
|
|
451
444
|
};
|
|
452
445
|
|
|
453
|
-
|
|
446
|
+
let result: Response | void;
|
|
447
|
+
try {
|
|
448
|
+
result = await entry.handler(ctx, wrappedNext);
|
|
449
|
+
} catch (error) {
|
|
450
|
+
finishMiddleware();
|
|
451
|
+
throw error;
|
|
452
|
+
}
|
|
453
|
+
finishMiddleware();
|
|
454
|
+
|
|
455
|
+
// Record post-next() processing time when middleware did work after
|
|
456
|
+
// the downstream chain resolved (e.g. adding headers, logging).
|
|
457
|
+
if (nextResolvedAt !== undefined) {
|
|
458
|
+
const postDur = performance.now() - nextResolvedAt;
|
|
459
|
+
if (postDur > POST_METRIC_MIN_DURATION_MS) {
|
|
460
|
+
appendMetric(
|
|
461
|
+
_getRequestContext()?._metricsStore,
|
|
462
|
+
`${metricLabel}:post`,
|
|
463
|
+
nextResolvedAt,
|
|
464
|
+
postDur,
|
|
465
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
454
469
|
|
|
455
|
-
// Explicit return takes precedence
|
|
470
|
+
// Explicit return takes precedence (middleware short-circuit).
|
|
471
|
+
// Merge stub headers (from ctx.header before this point) and
|
|
472
|
+
// RequestContext stub headers (from ctx.setCookie) into the
|
|
473
|
+
// returned Response so they are not lost.
|
|
456
474
|
if (result instanceof Response) {
|
|
457
|
-
|
|
458
|
-
|
|
475
|
+
if (isWebSocketUpgradeResponse(result)) {
|
|
476
|
+
responseHolder.response = result;
|
|
477
|
+
return result;
|
|
478
|
+
}
|
|
479
|
+
const mergedHeaders = new Headers(result.headers);
|
|
480
|
+
stubResponse.headers.forEach((value, name) => {
|
|
481
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
482
|
+
mergedHeaders.append(name, value);
|
|
483
|
+
} else if (!mergedHeaders.has(name)) {
|
|
484
|
+
mergedHeaders.set(name, value);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
// Also merge shared RequestContext stub (cookies written via setCookie).
|
|
488
|
+
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
489
|
+
// may have already merged the same reqCtx cookies into the response.
|
|
490
|
+
const reqCtx = _getRequestContext();
|
|
491
|
+
if (reqCtx) {
|
|
492
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
493
|
+
if (stubCookies.length > 0) {
|
|
494
|
+
const existing = new Set(mergedHeaders.getSetCookie());
|
|
495
|
+
for (const cookie of stubCookies) {
|
|
496
|
+
if (!existing.has(cookie)) {
|
|
497
|
+
mergedHeaders.append("set-cookie", cookie);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
502
|
+
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
503
|
+
mergedHeaders.set(name, value);
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
const merged = new Response(result.body, {
|
|
508
|
+
status: result.status,
|
|
509
|
+
statusText: result.statusText,
|
|
510
|
+
headers: mergedHeaders,
|
|
511
|
+
});
|
|
512
|
+
responseHolder.response = merged;
|
|
513
|
+
return merged;
|
|
459
514
|
}
|
|
460
515
|
|
|
461
516
|
// Warn about unexpected return values (non-Response, non-undefined)
|
|
@@ -464,7 +519,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
464
519
|
const fnName = entry.handler.name || "(anonymous)";
|
|
465
520
|
console.warn(
|
|
466
521
|
`[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
|
|
467
|
-
`This return value will be ignored. Did you mean to return a Response
|
|
522
|
+
`This return value will be ignored. Did you mean to return a Response?`,
|
|
468
523
|
);
|
|
469
524
|
}
|
|
470
525
|
|
|
@@ -481,7 +536,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
481
536
|
`Middleware must call next() or return a Response. ` +
|
|
482
537
|
`Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
|
|
483
538
|
Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
|
|
484
|
-
{ cause: { url: request.url, fn: entry.handler } }
|
|
539
|
+
{ cause: { url: request.url, fn: entry.handler } },
|
|
485
540
|
);
|
|
486
541
|
};
|
|
487
542
|
|
|
@@ -493,64 +548,33 @@ export async function executeMiddleware<TEnv>(
|
|
|
493
548
|
throw new Error("No response generated by middleware chain");
|
|
494
549
|
}
|
|
495
550
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
variables: Record<string, any>,
|
|
514
|
-
stubResponse: Response
|
|
515
|
-
): Promise<void> {
|
|
516
|
-
if (middlewares.length === 0) {
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
let index = 0;
|
|
521
|
-
const responseHolder: ResponseHolder = { response: stubResponse };
|
|
522
|
-
|
|
523
|
-
const next = async (): Promise<Response> => {
|
|
524
|
-
if (index >= middlewares.length) {
|
|
525
|
-
return stubResponse;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
const middleware = middlewares[index++];
|
|
529
|
-
const ctx = createMiddlewareContext(
|
|
530
|
-
request,
|
|
531
|
-
env,
|
|
532
|
-
params,
|
|
533
|
-
variables,
|
|
534
|
-
responseHolder
|
|
535
|
-
);
|
|
536
|
-
|
|
537
|
-
const result = await middleware(ctx, next);
|
|
538
|
-
|
|
539
|
-
// If middleware returned a Response, throw an error
|
|
540
|
-
// Server actions can't short-circuit with a Response
|
|
541
|
-
if (result instanceof Response) {
|
|
542
|
-
throw new Error(
|
|
543
|
-
`Loader middleware returned a Response (status: ${result.status}). ` +
|
|
544
|
-
`Server actions cannot return Response. ` +
|
|
545
|
-
`Use GET-based loader fetching for redirects, or throw an error instead.`
|
|
546
|
-
);
|
|
551
|
+
// Final re-merge: capture any RequestContext stub headers added after the
|
|
552
|
+
// last merge point (e.g. cookies().set() called after await next()).
|
|
553
|
+
// The reqCtx stub may have already been partially merged during finalHandler
|
|
554
|
+
// or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
|
|
555
|
+
//
|
|
556
|
+
// Skip for upgrade responses: upgrade headers are semantically immutable and
|
|
557
|
+
// set-cookie on an upgrade is not meaningful.
|
|
558
|
+
const reqCtx = _getRequestContext();
|
|
559
|
+
if (reqCtx && !isWebSocketUpgradeResponse(finalResponse)) {
|
|
560
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
561
|
+
if (stubCookies.length > 0) {
|
|
562
|
+
const existingCookies = new Set(finalResponse.headers.getSetCookie());
|
|
563
|
+
for (const cookie of stubCookies) {
|
|
564
|
+
if (!existingCookies.has(cookie)) {
|
|
565
|
+
finalResponse.headers.append("set-cookie", cookie);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
547
568
|
}
|
|
569
|
+
// Fill in non-cookie headers that aren't already on the response
|
|
570
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
571
|
+
if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
|
|
572
|
+
finalResponse.headers.set(name, value);
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
}
|
|
548
576
|
|
|
549
|
-
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
await next();
|
|
553
|
-
// Headers/cookies set on stubResponse will be merged by the caller
|
|
577
|
+
return finalResponse;
|
|
554
578
|
}
|
|
555
579
|
|
|
556
580
|
/**
|
|
@@ -574,7 +598,12 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
574
598
|
env: TEnv,
|
|
575
599
|
params: Record<string, string>,
|
|
576
600
|
variables: Record<string, any>,
|
|
577
|
-
stubResponse: Response
|
|
601
|
+
stubResponse: Response,
|
|
602
|
+
reverse?: (
|
|
603
|
+
name: string,
|
|
604
|
+
params?: Record<string, string>,
|
|
605
|
+
search?: Record<string, unknown>,
|
|
606
|
+
) => string,
|
|
578
607
|
): Promise<Response | null> {
|
|
579
608
|
if (middlewares.length === 0) {
|
|
580
609
|
return null;
|
|
@@ -597,22 +626,28 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
597
626
|
env,
|
|
598
627
|
params,
|
|
599
628
|
variables,
|
|
600
|
-
responseHolder
|
|
629
|
+
responseHolder,
|
|
630
|
+
reverse,
|
|
601
631
|
);
|
|
602
632
|
|
|
603
|
-
|
|
633
|
+
let nextCalled = false;
|
|
634
|
+
const guardedNext = (): Promise<Response> => {
|
|
635
|
+
if (nextCalled) {
|
|
636
|
+
throw new Error(
|
|
637
|
+
`[@rangojs/router] Intercept middleware called next() more than once.`,
|
|
638
|
+
);
|
|
639
|
+
}
|
|
640
|
+
nextCalled = true;
|
|
641
|
+
return next();
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
const result = await middleware(ctx, guardedNext);
|
|
604
645
|
|
|
605
646
|
if (result instanceof Response) {
|
|
606
647
|
earlyResponse = result;
|
|
607
648
|
return result;
|
|
608
649
|
}
|
|
609
650
|
|
|
610
|
-
// Check if middleware replaced ctx.res with a different response
|
|
611
|
-
if (responseHolder.response && responseHolder.response !== stubResponse) {
|
|
612
|
-
earlyResponse = responseHolder.response;
|
|
613
|
-
return earlyResponse;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
651
|
return stubResponse;
|
|
617
652
|
};
|
|
618
653
|
|
|
@@ -630,12 +665,14 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
630
665
|
});
|
|
631
666
|
|
|
632
667
|
if (hasStubHeaders) {
|
|
633
|
-
// Clone and merge headers from stub into early response
|
|
668
|
+
// Clone and merge headers from stub into early response.
|
|
669
|
+
// Only fill in missing headers — the returned Response's explicit
|
|
670
|
+
// headers take precedence, matching executeMiddleware behavior.
|
|
634
671
|
const mergedHeaders = new Headers(response.headers);
|
|
635
672
|
stubResponse.headers.forEach((value, name) => {
|
|
636
673
|
if (name.toLowerCase() === "set-cookie") {
|
|
637
674
|
mergedHeaders.append(name, value);
|
|
638
|
-
} else {
|
|
675
|
+
} else if (!mergedHeaders.has(name)) {
|
|
639
676
|
mergedHeaders.set(name, value);
|
|
640
677
|
}
|
|
641
678
|
});
|
|
@@ -665,7 +702,12 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
665
702
|
env: TEnv,
|
|
666
703
|
params: Record<string, string>,
|
|
667
704
|
variables: Record<string, any>,
|
|
668
|
-
finalHandler: () => Promise<Response
|
|
705
|
+
finalHandler: () => Promise<Response>,
|
|
706
|
+
reverse?: (
|
|
707
|
+
name: string,
|
|
708
|
+
params?: Record<string, string>,
|
|
709
|
+
search?: Record<string, unknown>,
|
|
710
|
+
) => string,
|
|
669
711
|
): Promise<Response> {
|
|
670
712
|
if (middlewares.length === 0) {
|
|
671
713
|
return finalHandler();
|
|
@@ -688,27 +730,11 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
688
730
|
request,
|
|
689
731
|
env,
|
|
690
732
|
variables,
|
|
691
|
-
finalHandler
|
|
733
|
+
finalHandler,
|
|
734
|
+
reverse,
|
|
692
735
|
);
|
|
693
736
|
}
|
|
694
737
|
|
|
695
|
-
/**
|
|
696
|
-
* Entry type for middleware collection
|
|
697
|
-
* Matches the shape of EntryData used in router.ts
|
|
698
|
-
*/
|
|
699
|
-
export interface MiddlewareCollectableEntry {
|
|
700
|
-
middleware?: MiddlewareFn<any, any>[];
|
|
701
|
-
layout?: MiddlewareCollectableEntry[];
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
/**
|
|
705
|
-
* Collected route middleware with params
|
|
706
|
-
*/
|
|
707
|
-
export interface CollectedMiddleware {
|
|
708
|
-
handler: MiddlewareFn<any, any>;
|
|
709
|
-
params: Record<string, string>;
|
|
710
|
-
}
|
|
711
|
-
|
|
712
738
|
/**
|
|
713
739
|
* Collect route-level middleware from an entry tree
|
|
714
740
|
*
|
|
@@ -721,7 +747,7 @@ export interface CollectedMiddleware {
|
|
|
721
747
|
*/
|
|
722
748
|
export function collectRouteMiddleware(
|
|
723
749
|
entries: Iterable<MiddlewareCollectableEntry>,
|
|
724
|
-
params: Record<string, string
|
|
750
|
+
params: Record<string, string>,
|
|
725
751
|
): CollectedMiddleware[] {
|
|
726
752
|
const result: CollectedMiddleware[] = [];
|
|
727
753
|
|