@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.135c6902
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 +884 -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 +1531 -212
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/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 +3995 -2489
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +57 -52
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +85 -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/hooks/SKILL.md +328 -70
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +131 -8
- package/skills/layout/SKILL.md +100 -3
- package/skills/links/SKILL.md +62 -15
- package/skills/loader/SKILL.md +368 -42
- package/skills/middleware/SKILL.md +171 -34
- package/skills/mime-routes/SKILL.md +14 -10
- package/skills/parallel/SKILL.md +137 -1
- package/skills/prerender/SKILL.md +366 -28
- package/skills/rango/SKILL.md +85 -21
- package/skills/response-routes/SKILL.md +136 -83
- package/skills/route/SKILL.md +195 -21
- package/skills/router-setup/SKILL.md +123 -30
- package/skills/theme/SKILL.md +9 -8
- package/skills/typesafety/SKILL.md +240 -102
- 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/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 +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +266 -558
- package/src/browser/navigation-client.ts +132 -75
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +297 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +292 -309
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +144 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +128 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +190 -70
- package/src/browser/react/NavigationProvider.tsx +78 -11
- package/src/browser/react/context.ts +6 -0
- package/src/browser/react/filter-segment-order.ts +11 -0
- package/src/browser/react/index.ts +12 -12
- package/src/browser/react/location-state-shared.ts +95 -53
- package/src/browser/react/location-state.ts +60 -15
- package/src/browser/react/mount-context.ts +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 +29 -70
- package/src/browser/react/use-link-status.ts +6 -5
- package/src/browser/react/use-navigation.ts +22 -63
- package/src/browser/react/use-params.ts +65 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-router.ts +63 -0
- package/src/browser/react/use-search-params.ts +56 -0
- package/src/browser/react/use-segments.ts +80 -97
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +188 -57
- package/src/browser/scroll-restoration.ts +117 -44
- package/src/browser/segment-reconciler.ts +221 -0
- package/src/browser/segment-structure-assert.ts +16 -0
- package/src/browser/server-action-bridge.ts +488 -606
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +116 -47
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +63 -21
- package/src/build/generate-route-types.ts +36 -1038
- package/src/build/index.ts +2 -5
- package/src/build/route-trie.ts +38 -12
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +479 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +122 -303
- package/src/cache/cf/cf-cache-store.ts +571 -17
- 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 +98 -0
- package/src/cache/types.ts +72 -122
- package/src/client.rsc.tsx +3 -1
- package/src/client.tsx +84 -126
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +5 -1
- package/src/context-var.ts +86 -0
- package/src/debug.ts +19 -9
- package/src/errors.ts +77 -7
- package/src/handle.ts +12 -7
- 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 +104 -40
- package/src/index.ts +122 -67
- package/src/internal-debug.ts +9 -3
- package/src/loader.rsc.ts +18 -93
- package/src/loader.ts +26 -9
- package/src/network-error-thrower.tsx +3 -1
- package/src/outlet-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +4 -2
- package/src/prerender/store.ts +121 -17
- package/src/prerender.ts +325 -20
- package/src/reverse.ts +144 -124
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +7 -4
- package/src/route-definition/dsl-helpers.ts +959 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +52 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition.ts +1 -1450
- package/src/route-map-builder.ts +87 -133
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +41 -6
- package/src/router/content-negotiation.ts +116 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +9 -9
- package/src/router/find-match.ts +160 -0
- package/src/router/handler-context.ts +324 -116
- package/src/router/intercept-resolution.ts +11 -4
- package/src/router/lazy-includes.ts +237 -0
- package/src/router/loader-resolution.ts +179 -133
- package/src/router/logging.ts +112 -6
- package/src/router/manifest.ts +58 -19
- package/src/router/match-api.ts +89 -88
- package/src/router/match-context.ts +4 -2
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +84 -89
- package/src/router/match-middleware/cache-lookup.ts +261 -48
- package/src/router/match-middleware/cache-store.ts +54 -13
- package/src/router/match-middleware/intercept-resolution.ts +45 -22
- package/src/router/match-middleware/segment-resolution.ts +20 -9
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -17
- package/src/router/metrics.ts +235 -15
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +222 -0
- package/src/router/middleware.ts +327 -369
- package/src/router/pattern-matching.ts +169 -31
- package/src/router/prerender-match.ts +402 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +105 -14
- package/src/router/router-context.ts +40 -21
- package/src/router/router-interfaces.ts +452 -0
- package/src/router/router-options.ts +592 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +656 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +199 -0
- package/src/router/segment-resolution/revalidation.ts +1277 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -1354
- 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 +96 -29
- package/src/router/types.ts +15 -9
- package/src/router.ts +642 -2366
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +646 -1027
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +209 -0
- package/src/rsc/manifest-init.ts +86 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +379 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +237 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +348 -0
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +38 -11
- package/src/search-params.ts +66 -54
- package/src/segment-system.tsx +165 -17
- package/src/server/context.ts +237 -54
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +94 -15
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +438 -71
- package/src/server.ts +26 -164
- package/src/ssr/index.tsx +101 -31
- package/src/static-handler.ts +22 -4
- 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 +687 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +170 -0
- package/src/types/route-entry.ts +109 -0
- package/src/types/segments.ts +150 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +197 -0
- package/src/urls/index.ts +53 -0
- package/src/urls/path-helper-types.ts +339 -0
- package/src/urls/path-helper.ts +329 -0
- package/src/urls/pattern-types.ts +95 -0
- package/src/urls/response-types.ts +106 -0
- package/src/urls/type-extraction.ts +372 -0
- package/src/urls/urls-function.ts +98 -0
- package/src/urls.ts +1 -1323
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +184 -0
- package/src/vite/discovery/discover-routers.ts +344 -0
- package/src/vite/discovery/prerender-collection.ts +385 -0
- package/src/vite/discovery/route-types-writer.ts +258 -0
- package/src/vite/discovery/self-gen-tracking.ts +47 -0
- package/src/vite/discovery/state.ts +108 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +11 -2259
- package/src/vite/plugin-types.ts +48 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -47
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +8 -43
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +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 +445 -0
- package/src/vite/router-discovery.ts +777 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +181 -9
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +137 -0
- package/src/vite/utils/manifest-utils.ts +70 -0
- package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
- package/src/vite/utils/prerender-utils.ts +189 -0
- package/src/vite/utils/shared-utils.ts +169 -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/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/router/middleware.ts
CHANGED
|
@@ -9,169 +9,55 @@
|
|
|
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
|
-
type
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
12
|
+
import { contextGet, contextSet } from "../context-var.js";
|
|
13
|
+
import type {
|
|
14
|
+
CollectedMiddleware,
|
|
15
|
+
MiddlewareCollectableEntry,
|
|
16
|
+
MiddlewareContext,
|
|
17
|
+
MiddlewareEntry,
|
|
18
|
+
MiddlewareFn,
|
|
19
|
+
ResponseHolder,
|
|
20
|
+
} from "./middleware-types.js";
|
|
21
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
22
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
23
|
+
import { appendMetric, createMetricsStore } from "./metrics.js";
|
|
24
|
+
import { stripInternalParams } from "./handler-context.js";
|
|
25
|
+
|
|
26
|
+
// Re-export types and cookie utilities for backward compatibility
|
|
27
|
+
export type {
|
|
28
|
+
CookieOptions,
|
|
29
|
+
CollectedMiddleware,
|
|
30
|
+
MiddlewareCollectableEntry,
|
|
31
|
+
MiddlewareContext,
|
|
32
|
+
MiddlewareEntry,
|
|
33
|
+
MiddlewareFn,
|
|
34
|
+
ResponseHolder,
|
|
35
|
+
} from "./middleware-types.js";
|
|
36
|
+
export { parseCookies, serializeCookie } from "./middleware-cookies.js";
|
|
37
|
+
|
|
38
|
+
const MIDDLEWARE_METRIC_DEPTH = 1;
|
|
39
|
+
/** Ignore post-next() durations below this threshold (measurement noise). */
|
|
40
|
+
const POST_METRIC_MIN_DURATION_MS = 0.01;
|
|
41
|
+
|
|
42
|
+
function getMiddlewareMetricBase<TEnv>(
|
|
43
|
+
entry: MiddlewareEntry<TEnv>,
|
|
44
|
+
ordinal: number,
|
|
45
|
+
): string {
|
|
46
|
+
const handlerName = entry.handler.name?.trim();
|
|
47
|
+
const scope = entry.pattern ?? "*";
|
|
38
48
|
|
|
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
|
-
}
|
|
49
|
+
if (handlerName) {
|
|
50
|
+
return `${handlerName}@${scope}`;
|
|
51
|
+
}
|
|
51
52
|
|
|
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;
|
|
53
|
+
return `${scope}#${ordinal + 1}`;
|
|
131
54
|
}
|
|
132
55
|
|
|
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;
|
|
56
|
+
function getMiddlewareMetricLabel<TEnv>(
|
|
57
|
+
entry: MiddlewareEntry<TEnv>,
|
|
58
|
+
ordinal: number,
|
|
59
|
+
): string {
|
|
60
|
+
return `middleware:${getMiddlewareMetricBase(entry, ordinal)}`;
|
|
175
61
|
}
|
|
176
62
|
|
|
177
63
|
/**
|
|
@@ -231,7 +117,7 @@ function escapeRegex(str: string): string {
|
|
|
231
117
|
export function extractParams(
|
|
232
118
|
pathname: string,
|
|
233
119
|
regex: RegExp,
|
|
234
|
-
paramNames: string[]
|
|
120
|
+
paramNames: string[],
|
|
235
121
|
): Record<string, string> {
|
|
236
122
|
const match = pathname.match(regex);
|
|
237
123
|
if (!match) return {};
|
|
@@ -243,151 +129,137 @@ export function extractParams(
|
|
|
243
129
|
return params;
|
|
244
130
|
}
|
|
245
131
|
|
|
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
132
|
/**
|
|
296
133
|
* Create middleware context
|
|
297
134
|
*
|
|
298
135
|
* Note: The implementation uses runtime values while the interface provides
|
|
299
136
|
* compile-time type safety. The env/get/set types are resolved at call sites
|
|
300
|
-
* via conditional types based on TEnv
|
|
137
|
+
* via conditional types based on TEnv from createRouter<TBindings>().
|
|
301
138
|
*/
|
|
302
139
|
export function createMiddlewareContext<TEnv>(
|
|
303
140
|
request: Request,
|
|
304
141
|
env: TEnv,
|
|
305
142
|
params: Record<string, string>,
|
|
306
143
|
variables: Record<string, unknown>,
|
|
307
|
-
responseHolder: ResponseHolder
|
|
144
|
+
responseHolder: ResponseHolder,
|
|
145
|
+
reverse?: (
|
|
146
|
+
name: string,
|
|
147
|
+
params?: Record<string, string>,
|
|
148
|
+
search?: Record<string, unknown>,
|
|
149
|
+
) => string,
|
|
308
150
|
): MiddlewareContext<TEnv> {
|
|
309
|
-
const url = new URL(request.url);
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
151
|
+
const url = stripInternalParams(new URL(request.url));
|
|
152
|
+
|
|
153
|
+
// Track the initial response to detect pre/post-next() phase.
|
|
154
|
+
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
155
|
+
// After next(): responseHolder.response is the real downstream response.
|
|
156
|
+
const initialResponse = responseHolder.response;
|
|
157
|
+
const isPreNext = () => responseHolder.response === initialResponse;
|
|
158
|
+
|
|
159
|
+
// Delegation strategy for RequestContext (reqCtx):
|
|
160
|
+
// - res getter: before next() returns shared reqCtx stub; after next() returns
|
|
161
|
+
// the real downstream response.
|
|
162
|
+
// - header(): before next() delegates to reqCtx; after next() writes to the
|
|
163
|
+
// real downstream response.
|
|
164
|
+
// Cookie operations are handled by the standalone cookies() function which
|
|
165
|
+
// delegates to the shared RequestContext internally.
|
|
313
166
|
// The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
|
|
167
|
+
// Internal helper: resolve the current response (stub before next(), real after).
|
|
168
|
+
// Not exposed on the public MiddlewareContext type — use ctx.headers instead.
|
|
169
|
+
const getResponse = (): Response => {
|
|
170
|
+
if (isPreNext()) {
|
|
171
|
+
const reqCtx = _getRequestContext();
|
|
172
|
+
if (reqCtx) return reqCtx.res;
|
|
173
|
+
}
|
|
174
|
+
if (!responseHolder.response) {
|
|
175
|
+
throw new Error(
|
|
176
|
+
"Response is not available - responseHolder was not initialized",
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
return responseHolder.response;
|
|
180
|
+
};
|
|
181
|
+
|
|
314
182
|
return {
|
|
315
183
|
request,
|
|
316
184
|
url,
|
|
185
|
+
originalUrl: new URL(request.url),
|
|
317
186
|
pathname: url.pathname,
|
|
318
187
|
searchParams: url.searchParams,
|
|
319
188
|
env: env as MiddlewareContext<TEnv>["env"],
|
|
320
189
|
params,
|
|
321
|
-
|
|
322
|
-
//
|
|
323
|
-
get
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
)
|
|
328
|
-
|
|
329
|
-
return responseHolder.response;
|
|
190
|
+
// Getter: re-derives from request context on each access so that global
|
|
191
|
+
// middleware sees the matched route name after await next().
|
|
192
|
+
get routeName(): MiddlewareContext<TEnv>["routeName"] {
|
|
193
|
+
const reqCtx = _getRequestContext();
|
|
194
|
+
const raw = reqCtx?._routeName;
|
|
195
|
+
return (
|
|
196
|
+
raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
|
|
197
|
+
) as MiddlewareContext<TEnv>["routeName"];
|
|
330
198
|
},
|
|
331
199
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
responseHolder.response = response;
|
|
200
|
+
get headers(): Headers {
|
|
201
|
+
return getResponse().headers;
|
|
335
202
|
},
|
|
336
203
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
parsedCookies = parseCookies(cookieHeader);
|
|
340
|
-
}
|
|
341
|
-
return parsedCookies[name];
|
|
342
|
-
},
|
|
204
|
+
get: ((keyOrVar: any) =>
|
|
205
|
+
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
343
206
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
},
|
|
207
|
+
set: ((keyOrVar: any, value: unknown) => {
|
|
208
|
+
contextSet(variables, keyOrVar, value);
|
|
209
|
+
}) as MiddlewareContext<TEnv>["set"],
|
|
210
|
+
|
|
211
|
+
var: variables as MiddlewareContext<TEnv>["var"],
|
|
350
212
|
|
|
351
|
-
|
|
213
|
+
header(name: string, value: string): void {
|
|
214
|
+
// Before next(): delegate to shared RequestContext stub
|
|
215
|
+
if (isPreNext()) {
|
|
216
|
+
const reqCtx = _getRequestContext();
|
|
217
|
+
if (reqCtx) {
|
|
218
|
+
reqCtx.header(name, value);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// After next() or standalone: write to current response
|
|
352
223
|
if (!responseHolder.response) {
|
|
353
224
|
throw new Error(
|
|
354
|
-
"ctx.
|
|
225
|
+
"ctx.header() is not available - responseHolder was not initialized",
|
|
355
226
|
);
|
|
356
227
|
}
|
|
357
|
-
responseHolder.response.headers.
|
|
358
|
-
"Set-Cookie",
|
|
359
|
-
serializeCookie(name, value, options)
|
|
360
|
-
);
|
|
228
|
+
responseHolder.response.headers.set(name, value);
|
|
361
229
|
},
|
|
362
230
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
231
|
+
get theme(): MiddlewareContext<TEnv>["theme"] {
|
|
232
|
+
return _getRequestContext()?.theme;
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
get setTheme(): MiddlewareContext<TEnv>["setTheme"] {
|
|
236
|
+
return _getRequestContext()?.setTheme;
|
|
237
|
+
},
|
|
238
|
+
|
|
239
|
+
setLocationState(entries) {
|
|
240
|
+
const reqCtx = _getRequestContext();
|
|
241
|
+
if (!reqCtx) {
|
|
368
242
|
throw new Error(
|
|
369
|
-
"
|
|
243
|
+
"setLocationState() is not available outside a request context",
|
|
370
244
|
);
|
|
371
245
|
}
|
|
372
|
-
|
|
373
|
-
"Set-Cookie",
|
|
374
|
-
serializeCookie(name, "", { ...options, maxAge: 0 })
|
|
375
|
-
);
|
|
246
|
+
reqCtx.setLocationState(entries);
|
|
376
247
|
},
|
|
377
248
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
variables[key] = value;
|
|
382
|
-
}) as MiddlewareContext<TEnv>["set"],
|
|
383
|
-
|
|
384
|
-
header(name: string, value: string): void {
|
|
385
|
-
if (!responseHolder.response) {
|
|
249
|
+
reverse:
|
|
250
|
+
reverse ??
|
|
251
|
+
((name: string) => {
|
|
386
252
|
throw new Error(
|
|
387
|
-
|
|
253
|
+
`ctx.reverse() is not available - route map was not provided to middleware context`,
|
|
388
254
|
);
|
|
255
|
+
}),
|
|
256
|
+
|
|
257
|
+
debugPerformance(): void {
|
|
258
|
+
const reqCtx = _getRequestContext();
|
|
259
|
+
if (reqCtx) {
|
|
260
|
+
reqCtx._debugPerformance = true;
|
|
261
|
+
reqCtx._metricsStore ??= createMetricsStore(true);
|
|
389
262
|
}
|
|
390
|
-
responseHolder.response.headers.set(name, value);
|
|
391
263
|
},
|
|
392
264
|
};
|
|
393
265
|
}
|
|
@@ -398,7 +270,7 @@ export function createMiddlewareContext<TEnv>(
|
|
|
398
270
|
*/
|
|
399
271
|
export function matchMiddleware<TEnv>(
|
|
400
272
|
pathname: string,
|
|
401
|
-
entries: MiddlewareEntry<TEnv>[]
|
|
273
|
+
entries: MiddlewareEntry<TEnv>[],
|
|
402
274
|
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
403
275
|
const matches: Array<{
|
|
404
276
|
entry: MiddlewareEntry<TEnv>;
|
|
@@ -427,9 +299,9 @@ export function matchMiddleware<TEnv>(
|
|
|
427
299
|
*
|
|
428
300
|
* Features:
|
|
429
301
|
* - `await next()` returns actual Response
|
|
430
|
-
* - `ctx.
|
|
431
|
-
* - `ctx.header()` shorthand for setting
|
|
432
|
-
* - Forgiving: if middleware doesn't return, uses
|
|
302
|
+
* - `ctx.headers` available before and after `await next()`
|
|
303
|
+
* - `ctx.header()` shorthand for setting a single header
|
|
304
|
+
* - Forgiving: if middleware doesn't return, uses the downstream response
|
|
433
305
|
* - Short-circuit: return Response to stop chain
|
|
434
306
|
* - Error catching: try/catch around `next()` works
|
|
435
307
|
*/
|
|
@@ -441,7 +313,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
441
313
|
request: Request,
|
|
442
314
|
env: TEnv,
|
|
443
315
|
variables: Record<string, any>,
|
|
444
|
-
finalHandler: () => Promise<Response
|
|
316
|
+
finalHandler: () => Promise<Response>,
|
|
317
|
+
reverse?: (
|
|
318
|
+
name: string,
|
|
319
|
+
params?: Record<string, string>,
|
|
320
|
+
search?: Record<string, unknown>,
|
|
321
|
+
) => string,
|
|
445
322
|
): Promise<Response> {
|
|
446
323
|
let index = 0;
|
|
447
324
|
|
|
@@ -455,8 +332,8 @@ export async function executeMiddleware<TEnv>(
|
|
|
455
332
|
// End of chain - call actual RSC handler
|
|
456
333
|
const response = await finalHandler();
|
|
457
334
|
|
|
458
|
-
// Merge headers set on stub into the real response
|
|
459
|
-
// Use append for Set-Cookie to preserve multiple cookies
|
|
335
|
+
// Merge headers set on stub into the real response.
|
|
336
|
+
// Use append for Set-Cookie to preserve multiple cookies.
|
|
460
337
|
const mergedHeaders = new Headers(response.headers);
|
|
461
338
|
stubResponse.headers.forEach((value, name) => {
|
|
462
339
|
if (name.toLowerCase() === "set-cookie") {
|
|
@@ -465,6 +342,26 @@ export async function executeMiddleware<TEnv>(
|
|
|
465
342
|
mergedHeaders.set(name, value);
|
|
466
343
|
}
|
|
467
344
|
});
|
|
345
|
+
// Also merge shared RequestContext stub (cookies written via cookies().set()).
|
|
346
|
+
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
347
|
+
// may have already merged the same reqCtx cookies into the response.
|
|
348
|
+
const reqCtx = _getRequestContext();
|
|
349
|
+
if (reqCtx) {
|
|
350
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
351
|
+
if (stubCookies.length > 0) {
|
|
352
|
+
const existing = new Set(mergedHeaders.getSetCookie());
|
|
353
|
+
for (const cookie of stubCookies) {
|
|
354
|
+
if (!existing.has(cookie)) {
|
|
355
|
+
mergedHeaders.append("set-cookie", cookie);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
360
|
+
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
361
|
+
mergedHeaders.set(name, value);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
}
|
|
468
365
|
|
|
469
366
|
// Clone response with merged headers (mutable for post-next() modifications)
|
|
470
367
|
responseHolder.response = new Response(response.body, {
|
|
@@ -476,29 +373,122 @@ export async function executeMiddleware<TEnv>(
|
|
|
476
373
|
return responseHolder.response;
|
|
477
374
|
}
|
|
478
375
|
|
|
376
|
+
const middlewareOrdinal = index;
|
|
479
377
|
const { entry, params } = middlewares[index++];
|
|
480
378
|
const ctx = createMiddlewareContext(
|
|
481
379
|
request,
|
|
482
380
|
env,
|
|
483
381
|
params,
|
|
484
382
|
variables,
|
|
485
|
-
responseHolder
|
|
383
|
+
responseHolder,
|
|
384
|
+
reverse,
|
|
486
385
|
);
|
|
386
|
+
const metricStart = performance.now();
|
|
387
|
+
const metricLabel = getMiddlewareMetricLabel(entry, middlewareOrdinal);
|
|
388
|
+
let middlewareFinished = false;
|
|
389
|
+
const finishMiddleware = () => {
|
|
390
|
+
if (!middlewareFinished) {
|
|
391
|
+
middlewareFinished = true;
|
|
392
|
+
appendMetric(
|
|
393
|
+
_getRequestContext()?._metricsStore,
|
|
394
|
+
`${metricLabel}:pre`,
|
|
395
|
+
metricStart,
|
|
396
|
+
performance.now() - metricStart,
|
|
397
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
};
|
|
487
401
|
|
|
488
|
-
// Track if next() was called and capture its Promise
|
|
489
|
-
//
|
|
402
|
+
// Track if next() was called and capture its Promise.
|
|
403
|
+
// Guard against double-calling: a second call would re-enter the
|
|
404
|
+
// downstream chain and overwrite responseHolder.response.
|
|
490
405
|
let nextPromise: Promise<Response> | null = null;
|
|
406
|
+
let nextResolvedAt: number | undefined;
|
|
491
407
|
const wrappedNext = (): Promise<Response> => {
|
|
492
|
-
|
|
408
|
+
if (nextPromise) {
|
|
409
|
+
throw new Error(
|
|
410
|
+
`[@rangojs/router] Middleware called next() more than once.`,
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
finishMiddleware();
|
|
414
|
+
const downstream = next();
|
|
415
|
+
nextPromise = downstream.then(
|
|
416
|
+
(res) => {
|
|
417
|
+
nextResolvedAt = performance.now();
|
|
418
|
+
return res;
|
|
419
|
+
},
|
|
420
|
+
(err) => {
|
|
421
|
+
nextResolvedAt = performance.now();
|
|
422
|
+
throw err;
|
|
423
|
+
},
|
|
424
|
+
);
|
|
493
425
|
return nextPromise;
|
|
494
426
|
};
|
|
495
427
|
|
|
496
|
-
|
|
428
|
+
let result: Response | void;
|
|
429
|
+
try {
|
|
430
|
+
result = await entry.handler(ctx, wrappedNext);
|
|
431
|
+
} catch (error) {
|
|
432
|
+
finishMiddleware();
|
|
433
|
+
throw error;
|
|
434
|
+
}
|
|
435
|
+
finishMiddleware();
|
|
436
|
+
|
|
437
|
+
// Record post-next() processing time when middleware did work after
|
|
438
|
+
// the downstream chain resolved (e.g. adding headers, logging).
|
|
439
|
+
if (nextResolvedAt !== undefined) {
|
|
440
|
+
const postDur = performance.now() - nextResolvedAt;
|
|
441
|
+
if (postDur > POST_METRIC_MIN_DURATION_MS) {
|
|
442
|
+
appendMetric(
|
|
443
|
+
_getRequestContext()?._metricsStore,
|
|
444
|
+
`${metricLabel}:post`,
|
|
445
|
+
nextResolvedAt,
|
|
446
|
+
postDur,
|
|
447
|
+
MIDDLEWARE_METRIC_DEPTH,
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
497
451
|
|
|
498
|
-
// Explicit return takes precedence
|
|
452
|
+
// Explicit return takes precedence (middleware short-circuit).
|
|
453
|
+
// Merge stub headers (from ctx.header before this point) and
|
|
454
|
+
// RequestContext stub headers (from ctx.setCookie) into the
|
|
455
|
+
// returned Response so they are not lost.
|
|
499
456
|
if (result instanceof Response) {
|
|
500
|
-
|
|
501
|
-
|
|
457
|
+
const mergedHeaders = new Headers(result.headers);
|
|
458
|
+
stubResponse.headers.forEach((value, name) => {
|
|
459
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
460
|
+
mergedHeaders.append(name, value);
|
|
461
|
+
} else if (!mergedHeaders.has(name)) {
|
|
462
|
+
mergedHeaders.set(name, value);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
// Also merge shared RequestContext stub (cookies written via setCookie).
|
|
466
|
+
// Dedup Set-Cookie: an inner executeMiddleware (route-level middleware)
|
|
467
|
+
// may have already merged the same reqCtx cookies into the response.
|
|
468
|
+
const reqCtx = _getRequestContext();
|
|
469
|
+
if (reqCtx) {
|
|
470
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
471
|
+
if (stubCookies.length > 0) {
|
|
472
|
+
const existing = new Set(mergedHeaders.getSetCookie());
|
|
473
|
+
for (const cookie of stubCookies) {
|
|
474
|
+
if (!existing.has(cookie)) {
|
|
475
|
+
mergedHeaders.append("set-cookie", cookie);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
480
|
+
if (name !== "set-cookie" && !mergedHeaders.has(name)) {
|
|
481
|
+
mergedHeaders.set(name, value);
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
const merged = new Response(result.body, {
|
|
486
|
+
status: result.status,
|
|
487
|
+
statusText: result.statusText,
|
|
488
|
+
headers: mergedHeaders,
|
|
489
|
+
});
|
|
490
|
+
responseHolder.response = merged;
|
|
491
|
+
return merged;
|
|
502
492
|
}
|
|
503
493
|
|
|
504
494
|
// Warn about unexpected return values (non-Response, non-undefined)
|
|
@@ -507,7 +497,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
507
497
|
const fnName = entry.handler.name || "(anonymous)";
|
|
508
498
|
console.warn(
|
|
509
499
|
`[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
|
|
510
|
-
`This return value will be ignored. Did you mean to return a Response
|
|
500
|
+
`This return value will be ignored. Did you mean to return a Response?`,
|
|
511
501
|
);
|
|
512
502
|
}
|
|
513
503
|
|
|
@@ -524,7 +514,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
524
514
|
`Middleware must call next() or return a Response. ` +
|
|
525
515
|
`Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
|
|
526
516
|
Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
|
|
527
|
-
{ cause: { url: request.url, fn: entry.handler } }
|
|
517
|
+
{ cause: { url: request.url, fn: entry.handler } },
|
|
528
518
|
);
|
|
529
519
|
};
|
|
530
520
|
|
|
@@ -536,64 +526,30 @@ export async function executeMiddleware<TEnv>(
|
|
|
536
526
|
throw new Error("No response generated by middleware chain");
|
|
537
527
|
}
|
|
538
528
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
request: Request,
|
|
554
|
-
env: TEnv,
|
|
555
|
-
params: Record<string, string>,
|
|
556
|
-
variables: Record<string, any>,
|
|
557
|
-
stubResponse: Response
|
|
558
|
-
): Promise<void> {
|
|
559
|
-
if (middlewares.length === 0) {
|
|
560
|
-
return;
|
|
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
|
-
);
|
|
529
|
+
// Final re-merge: capture any RequestContext stub headers added after the
|
|
530
|
+
// last merge point (e.g. cookies().set() called after await next()).
|
|
531
|
+
// The reqCtx stub may have already been partially merged during finalHandler
|
|
532
|
+
// or early-return paths; only append *new* Set-Cookie entries to avoid dupes.
|
|
533
|
+
const reqCtx = _getRequestContext();
|
|
534
|
+
if (reqCtx) {
|
|
535
|
+
const stubCookies = reqCtx.res.headers.getSetCookie();
|
|
536
|
+
if (stubCookies.length > 0) {
|
|
537
|
+
const existingCookies = new Set(finalResponse.headers.getSetCookie());
|
|
538
|
+
for (const cookie of stubCookies) {
|
|
539
|
+
if (!existingCookies.has(cookie)) {
|
|
540
|
+
finalResponse.headers.append("set-cookie", cookie);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
590
543
|
}
|
|
544
|
+
// Fill in non-cookie headers that aren't already on the response
|
|
545
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
546
|
+
if (name !== "set-cookie" && !finalResponse.headers.has(name)) {
|
|
547
|
+
finalResponse.headers.set(name, value);
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
}
|
|
591
551
|
|
|
592
|
-
|
|
593
|
-
};
|
|
594
|
-
|
|
595
|
-
await next();
|
|
596
|
-
// Headers/cookies set on stubResponse will be merged by the caller
|
|
552
|
+
return finalResponse;
|
|
597
553
|
}
|
|
598
554
|
|
|
599
555
|
/**
|
|
@@ -617,7 +573,12 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
617
573
|
env: TEnv,
|
|
618
574
|
params: Record<string, string>,
|
|
619
575
|
variables: Record<string, any>,
|
|
620
|
-
stubResponse: Response
|
|
576
|
+
stubResponse: Response,
|
|
577
|
+
reverse?: (
|
|
578
|
+
name: string,
|
|
579
|
+
params?: Record<string, string>,
|
|
580
|
+
search?: Record<string, unknown>,
|
|
581
|
+
) => string,
|
|
621
582
|
): Promise<Response | null> {
|
|
622
583
|
if (middlewares.length === 0) {
|
|
623
584
|
return null;
|
|
@@ -640,22 +601,28 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
640
601
|
env,
|
|
641
602
|
params,
|
|
642
603
|
variables,
|
|
643
|
-
responseHolder
|
|
604
|
+
responseHolder,
|
|
605
|
+
reverse,
|
|
644
606
|
);
|
|
645
607
|
|
|
646
|
-
|
|
608
|
+
let nextCalled = false;
|
|
609
|
+
const guardedNext = (): Promise<Response> => {
|
|
610
|
+
if (nextCalled) {
|
|
611
|
+
throw new Error(
|
|
612
|
+
`[@rangojs/router] Intercept middleware called next() more than once.`,
|
|
613
|
+
);
|
|
614
|
+
}
|
|
615
|
+
nextCalled = true;
|
|
616
|
+
return next();
|
|
617
|
+
};
|
|
618
|
+
|
|
619
|
+
const result = await middleware(ctx, guardedNext);
|
|
647
620
|
|
|
648
621
|
if (result instanceof Response) {
|
|
649
622
|
earlyResponse = result;
|
|
650
623
|
return result;
|
|
651
624
|
}
|
|
652
625
|
|
|
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
626
|
return stubResponse;
|
|
660
627
|
};
|
|
661
628
|
|
|
@@ -673,12 +640,14 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
673
640
|
});
|
|
674
641
|
|
|
675
642
|
if (hasStubHeaders) {
|
|
676
|
-
// Clone and merge headers from stub into early response
|
|
643
|
+
// Clone and merge headers from stub into early response.
|
|
644
|
+
// Only fill in missing headers — the returned Response's explicit
|
|
645
|
+
// headers take precedence, matching executeMiddleware behavior.
|
|
677
646
|
const mergedHeaders = new Headers(response.headers);
|
|
678
647
|
stubResponse.headers.forEach((value, name) => {
|
|
679
648
|
if (name.toLowerCase() === "set-cookie") {
|
|
680
649
|
mergedHeaders.append(name, value);
|
|
681
|
-
} else {
|
|
650
|
+
} else if (!mergedHeaders.has(name)) {
|
|
682
651
|
mergedHeaders.set(name, value);
|
|
683
652
|
}
|
|
684
653
|
});
|
|
@@ -708,7 +677,12 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
708
677
|
env: TEnv,
|
|
709
678
|
params: Record<string, string>,
|
|
710
679
|
variables: Record<string, any>,
|
|
711
|
-
finalHandler: () => Promise<Response
|
|
680
|
+
finalHandler: () => Promise<Response>,
|
|
681
|
+
reverse?: (
|
|
682
|
+
name: string,
|
|
683
|
+
params?: Record<string, string>,
|
|
684
|
+
search?: Record<string, unknown>,
|
|
685
|
+
) => string,
|
|
712
686
|
): Promise<Response> {
|
|
713
687
|
if (middlewares.length === 0) {
|
|
714
688
|
return finalHandler();
|
|
@@ -731,27 +705,11 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
731
705
|
request,
|
|
732
706
|
env,
|
|
733
707
|
variables,
|
|
734
|
-
finalHandler
|
|
708
|
+
finalHandler,
|
|
709
|
+
reverse,
|
|
735
710
|
);
|
|
736
711
|
}
|
|
737
712
|
|
|
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
713
|
/**
|
|
756
714
|
* Collect route-level middleware from an entry tree
|
|
757
715
|
*
|
|
@@ -764,7 +722,7 @@ export interface CollectedMiddleware {
|
|
|
764
722
|
*/
|
|
765
723
|
export function collectRouteMiddleware(
|
|
766
724
|
entries: Iterable<MiddlewareCollectableEntry>,
|
|
767
|
-
params: Record<string, string
|
|
725
|
+
params: Record<string, string>,
|
|
768
726
|
): CollectedMiddleware[] {
|
|
769
727
|
const result: CollectedMiddleware[] = [];
|
|
770
728
|
|