@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.20
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 +5 -0
- package/README.md +850 -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 +1601 -0
- package/dist/bin/rango.js.map +1 -0
- package/dist/browser/event-controller.d.ts +191 -0
- package/dist/browser/event-controller.d.ts.map +1 -0
- package/dist/browser/event-controller.js +559 -0
- package/dist/browser/event-controller.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +14 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/link-interceptor.d.ts +38 -0
- package/dist/browser/link-interceptor.d.ts.map +1 -0
- package/dist/browser/link-interceptor.js +99 -0
- package/dist/browser/link-interceptor.js.map +1 -0
- package/dist/browser/logging.d.ts +10 -0
- package/dist/browser/logging.d.ts.map +1 -0
- package/dist/browser/logging.js +29 -0
- package/dist/browser/logging.js.map +1 -0
- package/dist/browser/lru-cache.d.ts +17 -0
- package/dist/browser/lru-cache.d.ts.map +1 -0
- package/dist/browser/lru-cache.js +50 -0
- package/dist/browser/lru-cache.js.map +1 -0
- package/dist/browser/merge-segment-loaders.d.ts +39 -0
- package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
- package/dist/browser/merge-segment-loaders.js +102 -0
- package/dist/browser/merge-segment-loaders.js.map +1 -0
- package/dist/browser/navigation-bridge.d.ts +102 -0
- package/dist/browser/navigation-bridge.d.ts.map +1 -0
- package/dist/browser/navigation-bridge.js +708 -0
- package/dist/browser/navigation-bridge.js.map +1 -0
- package/dist/browser/navigation-client.d.ts +25 -0
- package/dist/browser/navigation-client.d.ts.map +1 -0
- package/dist/browser/navigation-client.js +157 -0
- package/dist/browser/navigation-client.js.map +1 -0
- package/dist/browser/navigation-store.d.ts +101 -0
- package/dist/browser/navigation-store.d.ts.map +1 -0
- package/dist/browser/navigation-store.js +625 -0
- package/dist/browser/navigation-store.js.map +1 -0
- package/dist/browser/partial-update.d.ts +75 -0
- package/dist/browser/partial-update.d.ts.map +1 -0
- package/dist/browser/partial-update.js +426 -0
- package/dist/browser/partial-update.js.map +1 -0
- package/dist/browser/react/Link.d.ts +86 -0
- package/dist/browser/react/Link.d.ts.map +1 -0
- package/dist/browser/react/Link.js +128 -0
- package/dist/browser/react/Link.js.map +1 -0
- package/dist/browser/react/NavigationProvider.d.ts +63 -0
- package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
- package/dist/browser/react/NavigationProvider.js +216 -0
- package/dist/browser/react/NavigationProvider.js.map +1 -0
- package/dist/browser/react/ScrollRestoration.d.ts +75 -0
- package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
- package/dist/browser/react/ScrollRestoration.js +57 -0
- package/dist/browser/react/ScrollRestoration.js.map +1 -0
- package/dist/browser/react/context.d.ts +46 -0
- package/dist/browser/react/context.d.ts.map +1 -0
- package/dist/browser/react/context.js +10 -0
- package/dist/browser/react/context.js.map +1 -0
- package/dist/browser/react/index.d.ts +11 -0
- package/dist/browser/react/index.d.ts.map +1 -0
- package/dist/browser/react/index.js +22 -0
- package/dist/browser/react/index.js.map +1 -0
- package/dist/browser/react/location-state-shared.d.ts +63 -0
- package/dist/browser/react/location-state-shared.d.ts.map +1 -0
- package/dist/browser/react/location-state-shared.js +81 -0
- package/dist/browser/react/location-state-shared.js.map +1 -0
- package/dist/browser/react/location-state.d.ts +23 -0
- package/dist/browser/react/location-state.d.ts.map +1 -0
- package/dist/browser/react/location-state.js +29 -0
- package/dist/browser/react/location-state.js.map +1 -0
- package/dist/browser/react/mount-context.d.ts +24 -0
- package/dist/browser/react/mount-context.d.ts.map +1 -0
- package/dist/browser/react/mount-context.js +24 -0
- package/dist/browser/react/mount-context.js.map +1 -0
- package/dist/browser/react/use-action.d.ts +64 -0
- package/dist/browser/react/use-action.d.ts.map +1 -0
- package/dist/browser/react/use-action.js +134 -0
- package/dist/browser/react/use-action.js.map +1 -0
- package/dist/browser/react/use-client-cache.d.ts +41 -0
- package/dist/browser/react/use-client-cache.d.ts.map +1 -0
- package/dist/browser/react/use-client-cache.js +39 -0
- package/dist/browser/react/use-client-cache.js.map +1 -0
- package/dist/browser/react/use-handle.d.ts +31 -0
- package/dist/browser/react/use-handle.d.ts.map +1 -0
- package/dist/browser/react/use-handle.js +144 -0
- package/dist/browser/react/use-handle.js.map +1 -0
- package/dist/browser/react/use-href.d.ts +33 -0
- package/dist/browser/react/use-href.d.ts.map +1 -0
- package/dist/browser/react/use-href.js +39 -0
- package/dist/browser/react/use-href.js.map +1 -0
- package/dist/browser/react/use-link-status.d.ts +37 -0
- package/dist/browser/react/use-link-status.d.ts.map +1 -0
- package/dist/browser/react/use-link-status.js +99 -0
- package/dist/browser/react/use-link-status.js.map +1 -0
- package/dist/browser/react/use-mount.d.ts +25 -0
- package/dist/browser/react/use-mount.d.ts.map +1 -0
- package/dist/browser/react/use-mount.js +30 -0
- package/dist/browser/react/use-mount.js.map +1 -0
- package/dist/browser/react/use-navigation.d.ts +27 -0
- package/dist/browser/react/use-navigation.d.ts.map +1 -0
- package/dist/browser/react/use-navigation.js +87 -0
- package/dist/browser/react/use-navigation.js.map +1 -0
- package/dist/browser/react/use-segments.d.ts +38 -0
- package/dist/browser/react/use-segments.d.ts.map +1 -0
- package/dist/browser/react/use-segments.js +130 -0
- package/dist/browser/react/use-segments.js.map +1 -0
- package/dist/browser/request-controller.d.ts +26 -0
- package/dist/browser/request-controller.d.ts.map +1 -0
- package/dist/browser/request-controller.js +147 -0
- package/dist/browser/request-controller.js.map +1 -0
- package/dist/browser/rsc-router.d.ts +129 -0
- package/dist/browser/rsc-router.d.ts.map +1 -0
- package/dist/browser/rsc-router.js +195 -0
- package/dist/browser/rsc-router.js.map +1 -0
- package/dist/browser/scroll-restoration.d.ts +93 -0
- package/dist/browser/scroll-restoration.d.ts.map +1 -0
- package/dist/browser/scroll-restoration.js +321 -0
- package/dist/browser/scroll-restoration.js.map +1 -0
- package/dist/browser/segment-structure-assert.d.ts +17 -0
- package/dist/browser/segment-structure-assert.d.ts.map +1 -0
- package/dist/browser/segment-structure-assert.js +59 -0
- package/dist/browser/segment-structure-assert.js.map +1 -0
- package/dist/browser/server-action-bridge.d.ts +26 -0
- package/dist/browser/server-action-bridge.d.ts.map +1 -0
- package/dist/browser/server-action-bridge.js +668 -0
- package/dist/browser/server-action-bridge.js.map +1 -0
- package/dist/browser/shallow.d.ts +12 -0
- package/dist/browser/shallow.d.ts.map +1 -0
- package/dist/browser/shallow.js +34 -0
- package/dist/browser/shallow.js.map +1 -0
- package/dist/browser/types.d.ts +369 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
- package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-cli.test.js +237 -0
- package/dist/build/__tests__/generate-cli.test.js.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-manifest.test.js +119 -0
- package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
- package/dist/build/__tests__/generate-route-types.test.js +620 -0
- package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
- package/dist/build/__tests__/per-router-manifest.test.js +308 -0
- package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
- package/dist/build/generate-manifest.d.ts +81 -0
- package/dist/build/generate-manifest.d.ts.map +1 -0
- package/dist/build/generate-manifest.js +276 -0
- package/dist/build/generate-manifest.js.map +1 -0
- package/dist/build/generate-route-types.d.ts +115 -0
- package/dist/build/generate-route-types.d.ts.map +1 -0
- package/dist/build/generate-route-types.js +740 -0
- package/dist/build/generate-route-types.js.map +1 -0
- package/dist/build/index.d.ts +21 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +21 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/route-trie.d.ts +71 -0
- package/dist/build/route-trie.d.ts.map +1 -0
- package/dist/build/route-trie.js +175 -0
- package/dist/build/route-trie.js.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
- package/dist/cache/__tests__/cache-scope.test.js +208 -0
- package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
- package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
- package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
- package/dist/cache/__tests__/document-cache.test.js +345 -0
- package/dist/cache/__tests__/document-cache.test.js.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
- package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
- package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
- package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
- package/dist/cache/__tests__/memory-store.test.js +367 -0
- package/dist/cache/__tests__/memory-store.test.js.map +1 -0
- package/dist/cache/cache-scope.d.ts +102 -0
- package/dist/cache/cache-scope.d.ts.map +1 -0
- package/dist/cache/cache-scope.js +440 -0
- package/dist/cache/cache-scope.js.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
- package/dist/cache/cf/cf-cache-store.d.ts +165 -0
- package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
- package/dist/cache/cf/cf-cache-store.js +242 -0
- package/dist/cache/cf/cf-cache-store.js.map +1 -0
- package/dist/cache/cf/index.d.ts +14 -0
- package/dist/cache/cf/index.d.ts.map +1 -0
- package/dist/cache/cf/index.js +17 -0
- package/dist/cache/cf/index.js.map +1 -0
- package/dist/cache/document-cache.d.ts +64 -0
- package/dist/cache/document-cache.d.ts.map +1 -0
- package/dist/cache/document-cache.js +228 -0
- package/dist/cache/document-cache.js.map +1 -0
- package/dist/cache/index.d.ts +19 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-segment-store.d.ts +110 -0
- package/dist/cache/memory-segment-store.d.ts.map +1 -0
- package/dist/cache/memory-segment-store.js +117 -0
- package/dist/cache/memory-segment-store.js.map +1 -0
- package/dist/cache/memory-store.d.ts +41 -0
- package/dist/cache/memory-store.d.ts.map +1 -0
- package/dist/cache/memory-store.js +191 -0
- package/dist/cache/memory-store.js.map +1 -0
- package/dist/cache/types.d.ts +317 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +12 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/client.d.ts +248 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +367 -0
- package/dist/client.js.map +1 -0
- package/dist/client.rsc.d.ts +26 -0
- package/dist/client.rsc.d.ts.map +1 -0
- package/dist/client.rsc.js +46 -0
- package/dist/client.rsc.js.map +1 -0
- package/dist/component-utils.d.ts +36 -0
- package/dist/component-utils.d.ts.map +1 -0
- package/dist/component-utils.js +61 -0
- package/dist/component-utils.js.map +1 -0
- package/dist/components/DefaultDocument.d.ts +13 -0
- package/dist/components/DefaultDocument.d.ts.map +1 -0
- package/dist/components/DefaultDocument.js +15 -0
- package/dist/components/DefaultDocument.js.map +1 -0
- package/dist/debug.d.ts +58 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +157 -0
- package/dist/debug.js.map +1 -0
- package/dist/default-error-boundary.d.ts +11 -0
- package/dist/default-error-boundary.d.ts.map +1 -0
- package/dist/default-error-boundary.js +45 -0
- package/dist/default-error-boundary.js.map +1 -0
- package/dist/deps/browser.d.ts +2 -0
- package/dist/deps/browser.d.ts.map +1 -0
- package/dist/deps/browser.js +3 -0
- package/dist/deps/browser.js.map +1 -0
- package/dist/deps/html-stream-client.d.ts +2 -0
- package/dist/deps/html-stream-client.d.ts.map +1 -0
- package/dist/deps/html-stream-client.js +3 -0
- package/dist/deps/html-stream-client.js.map +1 -0
- package/dist/deps/html-stream-server.d.ts +2 -0
- package/dist/deps/html-stream-server.d.ts.map +1 -0
- package/dist/deps/html-stream-server.js +3 -0
- package/dist/deps/html-stream-server.js.map +1 -0
- package/dist/deps/rsc.d.ts +2 -0
- package/dist/deps/rsc.d.ts.map +1 -0
- package/dist/deps/rsc.js +4 -0
- package/dist/deps/rsc.js.map +1 -0
- package/dist/deps/ssr.d.ts +2 -0
- package/dist/deps/ssr.d.ts.map +1 -0
- package/dist/deps/ssr.js +3 -0
- package/dist/deps/ssr.js.map +1 -0
- package/dist/errors.d.ts +174 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +241 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +78 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +82 -0
- package/dist/handle.js.map +1 -0
- package/dist/handles/MetaTags.d.ts +14 -0
- package/dist/handles/MetaTags.d.ts.map +1 -0
- package/dist/handles/MetaTags.js +136 -0
- package/dist/handles/MetaTags.js.map +1 -0
- package/dist/handles/index.d.ts +6 -0
- package/dist/handles/index.d.ts.map +1 -0
- package/dist/handles/index.js +6 -0
- package/dist/handles/index.js.map +1 -0
- package/dist/handles/meta.d.ts +39 -0
- package/dist/handles/meta.d.ts.map +1 -0
- package/dist/handles/meta.js +202 -0
- package/dist/handles/meta.js.map +1 -0
- package/dist/host/__tests__/errors.test.d.ts +2 -0
- package/dist/host/__tests__/errors.test.d.ts.map +1 -0
- package/dist/host/__tests__/errors.test.js +76 -0
- package/dist/host/__tests__/errors.test.js.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/host/__tests__/pattern-matcher.test.js +251 -0
- package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/host/__tests__/router.test.d.ts +2 -0
- package/dist/host/__tests__/router.test.d.ts.map +1 -0
- package/dist/host/__tests__/router.test.js +241 -0
- package/dist/host/__tests__/router.test.js.map +1 -0
- package/dist/host/__tests__/testing.test.d.ts +2 -0
- package/dist/host/__tests__/testing.test.d.ts.map +1 -0
- package/dist/host/__tests__/testing.test.js +64 -0
- package/dist/host/__tests__/testing.test.js.map +1 -0
- package/dist/host/__tests__/utils.test.d.ts +2 -0
- package/dist/host/__tests__/utils.test.d.ts.map +1 -0
- package/dist/host/__tests__/utils.test.js +29 -0
- package/dist/host/__tests__/utils.test.js.map +1 -0
- package/dist/host/cookie-handler.d.ts +34 -0
- package/dist/host/cookie-handler.d.ts.map +1 -0
- package/dist/host/cookie-handler.js +124 -0
- package/dist/host/cookie-handler.js.map +1 -0
- package/dist/host/errors.d.ts +56 -0
- package/dist/host/errors.d.ts.map +1 -0
- package/dist/host/errors.js +79 -0
- package/dist/host/errors.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +32 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/pattern-matcher.d.ts +36 -0
- package/dist/host/pattern-matcher.d.ts.map +1 -0
- package/dist/host/pattern-matcher.js +172 -0
- package/dist/host/pattern-matcher.js.map +1 -0
- package/dist/host/router.d.ts +26 -0
- package/dist/host/router.d.ts.map +1 -0
- package/dist/host/router.js +218 -0
- package/dist/host/router.js.map +1 -0
- package/dist/host/testing.d.ts +36 -0
- package/dist/host/testing.d.ts.map +1 -0
- package/dist/host/testing.js +55 -0
- package/dist/host/testing.js.map +1 -0
- package/dist/host/types.d.ts +115 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +7 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/utils.d.ts +21 -0
- package/dist/host/utils.d.ts.map +1 -0
- package/dist/host/utils.js +23 -0
- package/dist/host/utils.js.map +1 -0
- package/dist/href-client.d.ts +131 -0
- package/dist/href-client.d.ts.map +1 -0
- package/dist/href-client.js +64 -0
- package/dist/href-client.js.map +1 -0
- package/{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 +4583 -749
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +18 -17
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +82 -46
- package/skills/cache-guide/SKILL.md +262 -0
- package/skills/caching/SKILL.md +139 -238
- package/skills/composability/SKILL.md +172 -0
- package/skills/debug-manifest/SKILL.md +112 -0
- package/skills/document-cache/SKILL.md +87 -57
- package/skills/fonts/SKILL.md +167 -0
- package/skills/hooks/SKILL.md +403 -60
- package/skills/intercept/SKILL.md +224 -203
- package/skills/layout/SKILL.md +243 -149
- package/skills/links/SKILL.md +239 -0
- package/skills/loader/SKILL.md +444 -253
- package/skills/middleware/SKILL.md +222 -325
- package/skills/mime-routes/SKILL.md +128 -0
- package/skills/parallel/SKILL.md +220 -170
- package/skills/prerender/SKILL.md +643 -0
- package/skills/rango/SKILL.md +119 -0
- package/skills/response-routes/SKILL.md +411 -0
- package/skills/route/SKILL.md +334 -89
- package/skills/router-setup/SKILL.md +305 -274
- package/skills/tailwind/SKILL.md +129 -0
- package/skills/testing/SKILL.md +226 -0
- package/skills/theme/SKILL.md +36 -11
- package/skills/typesafety/SKILL.md +437 -168
- package/skills/use-cache/SKILL.md +324 -0
- package/src/__internal.ts +181 -0
- package/src/bin/rango.ts +321 -0
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/action-response-classifier.ts +99 -0
- package/src/browser/event-controller.ts +87 -64
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/link-interceptor.ts +20 -4
- package/src/browser/logging.ts +55 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +217 -549
- package/src/browser/navigation-client.ts +74 -46
- package/src/browser/navigation-store.ts +33 -50
- package/src/browser/navigation-transaction.ts +295 -0
- package/src/browser/network-error-handler.ts +61 -0
- package/src/browser/partial-update.ts +288 -297
- package/src/browser/prefetch/cache.ts +67 -0
- package/src/browser/prefetch/fetch.ts +137 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +42 -0
- package/src/browser/prefetch/queue.ts +88 -0
- package/src/browser/rango-state.ts +112 -0
- package/src/browser/react/Link.tsx +173 -73
- package/src/browser/react/NavigationProvider.tsx +138 -27
- 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 +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 +49 -65
- 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 +27 -78
- 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 +104 -34
- package/src/browser/scroll-restoration.ts +92 -16
- package/src/browser/segment-reconciler.ts +216 -0
- package/src/browser/segment-structure-assert.ts +83 -0
- package/src/browser/server-action-bridge.ts +504 -584
- package/src/browser/shallow.ts +6 -1
- package/src/browser/types.ts +107 -57
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +438 -0
- package/src/build/generate-route-types.ts +36 -0
- package/src/build/index.ts +35 -0
- package/src/build/route-trie.ts +249 -0
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +98 -0
- package/src/build/route-types/codegen.ts +102 -0
- package/src/build/route-types/include-resolution.ts +411 -0
- package/src/build/route-types/param-extraction.ts +48 -0
- package/src/build/route-types/per-module-writer.ts +128 -0
- package/src/build/route-types/router-processing.ts +469 -0
- package/src/build/route-types/scan-filter.ts +78 -0
- package/src/build/runtime-discovery.ts +231 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-key-utils.ts +44 -0
- package/src/cache/cache-policy.ts +125 -0
- package/src/cache/cache-runtime.ts +338 -0
- package/src/cache/cache-scope.ts +120 -303
- package/src/cache/cf/cf-cache-store.ts +119 -7
- package/src/cache/cf/index.ts +8 -2
- package/src/cache/document-cache.ts +101 -72
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +41 -0
- package/src/cache/index.ts +0 -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 +76 -121
- package/src/client.rsc.tsx +10 -14
- package/src/client.tsx +114 -89
- package/src/component-utils.ts +4 -4
- package/src/components/DefaultDocument.tsx +6 -2
- package/src/context-var.ts +86 -0
- package/src/debug.ts +243 -0
- package/src/errors.ts +108 -2
- package/src/handle.ts +34 -19
- package/src/handles/MetaTags.tsx +76 -23
- 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 +56 -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 +209 -23
- package/src/index.ts +256 -32
- 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-provider.tsx +45 -0
- package/src/prerender/param-hash.ts +37 -0
- package/src/prerender/store.ts +144 -0
- package/src/prerender.ts +463 -0
- package/src/reverse.ts +330 -0
- package/src/root-error-boundary.tsx +41 -29
- package/src/route-content-wrapper.tsx +9 -11
- package/src/route-definition/dsl-helpers.ts +934 -0
- package/src/route-definition/helper-factories.ts +200 -0
- package/src/route-definition/helpers-types.ts +430 -0
- package/src/route-definition/index.ts +55 -0
- package/src/route-definition/redirect.ts +93 -0
- package/src/route-definition/route-function.ts +119 -0
- package/src/route-definition.ts +1 -1371
- package/src/route-map-builder.ts +241 -112
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +70 -9
- 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 +158 -0
- package/src/router/handler-context.ts +348 -82
- package/src/router/intercept-resolution.ts +395 -0
- package/src/router/lazy-includes.ts +234 -0
- package/src/router/loader-resolution.ts +215 -121
- package/src/router/logging.ts +248 -0
- package/src/router/manifest.ts +172 -43
- package/src/router/match-api.ts +620 -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 +80 -93
- package/src/router/match-middleware/cache-lookup.ts +382 -9
- package/src/router/match-middleware/cache-store.ts +51 -22
- package/src/router/match-middleware/intercept-resolution.ts +55 -17
- package/src/router/match-middleware/segment-resolution.ts +24 -6
- package/src/router/match-pipelines.ts +10 -45
- package/src/router/match-result.ts +34 -20
- package/src/router/metrics.ts +3 -3
- package/src/router/middleware-cookies.ts +55 -0
- package/src/router/middleware-types.ts +179 -0
- package/src/router/middleware.ts +239 -328
- package/src/router/pattern-matching.ts +302 -26
- package/src/router/prerender-match.ts +398 -0
- package/src/router/preview-match.ts +170 -0
- package/src/router/revalidation.ts +112 -33
- package/src/router/router-context.ts +40 -23
- package/src/router/router-interfaces.ts +439 -0
- package/src/router/router-options.ts +587 -0
- package/src/router/router-registry.ts +24 -0
- package/src/router/segment-resolution/fresh.ts +552 -0
- package/src/router/segment-resolution/helpers.ts +263 -0
- package/src/router/segment-resolution/loader-cache.ts +198 -0
- package/src/router/segment-resolution/revalidation.ts +1226 -0
- package/src/router/segment-resolution/static-store.ts +67 -0
- package/src/router/segment-resolution.ts +21 -0
- package/src/router/segment-wrappers.ts +289 -0
- package/src/router/telemetry-otel.ts +299 -0
- package/src/router/telemetry.ts +300 -0
- package/src/router/timeout.ts +148 -0
- package/src/router/trie-matching.ts +221 -0
- package/src/router/types.ts +78 -4
- package/src/router.ts +672 -3566
- package/src/rsc/handler-context.ts +45 -0
- package/src/rsc/handler.ts +691 -757
- package/src/rsc/helpers.ts +140 -6
- package/src/rsc/index.ts +5 -5
- 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 +366 -0
- package/src/rsc/response-error.ts +37 -0
- package/src/rsc/response-route-handler.ts +347 -0
- package/src/rsc/rsc-rendering.ts +250 -0
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +344 -0
- package/src/rsc/types.ts +38 -14
- package/src/search-params.ts +227 -0
- package/src/segment-system.tsx +59 -61
- package/src/server/context.ts +217 -49
- package/src/server/cookie-store.ts +190 -0
- package/src/server/fetchable-loader-store.ts +37 -0
- package/src/server/handle-store.ts +98 -20
- package/src/server/loader-registry.ts +15 -56
- package/src/server/request-context.ts +406 -65
- package/src/server.ts +32 -133
- package/src/ssr/index.tsx +157 -26
- package/src/static-handler.ts +114 -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 +6 -7
- 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 +691 -0
- package/src/types/index.ts +88 -0
- package/src/types/loader-types.ts +183 -0
- package/src/types/route-config.ts +161 -0
- package/src/types/route-entry.ts +102 -0
- package/src/types/segments.ts +153 -0
- package/src/types.ts +1 -1561
- 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 -726
- package/src/use-loader.tsx +85 -77
- package/src/vite/discovery/bundle-postprocess.ts +209 -0
- package/src/vite/discovery/discover-routers.ts +345 -0
- package/src/vite/discovery/prerender-collection.ts +365 -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 +113 -0
- package/src/vite/discovery/virtual-module-codegen.ts +203 -0
- package/src/vite/index.ts +10 -782
- package/src/vite/plugin-types.ts +131 -0
- package/src/vite/plugins/cjs-to-esm.ts +93 -0
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +105 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
- package/src/vite/plugins/expose-id-utils.ts +287 -0
- package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +569 -0
- package/src/vite/plugins/use-cache-transform.ts +323 -0
- package/src/vite/plugins/version-injector.ts +83 -0
- package/src/vite/plugins/version-plugin.ts +254 -0
- package/src/vite/plugins/virtual-entries.ts +123 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +510 -0
- package/src/vite/router-discovery.ts +781 -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} +25 -29
- package/src/vite/utils/prerender-utils.ts +129 -0
- package/src/vite/utils/shared-utils.ts +169 -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,49 @@
|
|
|
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
|
-
/** URL params extracted from route/middleware pattern */
|
|
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;
|
|
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
|
+
|
|
24
|
+
// Re-export types and cookie utilities for backward compatibility
|
|
25
|
+
export type {
|
|
26
|
+
CookieOptions,
|
|
27
|
+
CollectedMiddleware,
|
|
28
|
+
MiddlewareCollectableEntry,
|
|
29
|
+
MiddlewareContext,
|
|
30
|
+
MiddlewareEntry,
|
|
31
|
+
MiddlewareFn,
|
|
32
|
+
ResponseHolder,
|
|
33
|
+
} from "./middleware-types.js";
|
|
34
|
+
export { parseCookies, serializeCookie } from "./middleware-cookies.js";
|
|
35
|
+
|
|
36
|
+
// W5: Deduplicate by function reference so each distinct middleware warns once,
|
|
37
|
+
// regardless of whether it is named or anonymous.
|
|
38
|
+
let warnedRedirectMiddleware = new WeakSet<Function>();
|
|
39
|
+
|
|
40
|
+
function warnCtxSetBeforeRedirect(handler: Function): void {
|
|
41
|
+
if (warnedRedirectMiddleware.has(handler)) return;
|
|
42
|
+
warnedRedirectMiddleware.add(handler);
|
|
43
|
+
const label = handler.name || "(anonymous)";
|
|
44
|
+
console.warn(
|
|
45
|
+
`[rango] Route middleware "${label}" called ctx.set() then returned a ` +
|
|
46
|
+
`redirect. Context variables are per-request and won't be available ` +
|
|
47
|
+
`on the redirect target. Use cookies to persist state across ` +
|
|
48
|
+
`redirects, or move ctx.set() to the target route's middleware.`,
|
|
49
|
+
);
|
|
104
50
|
}
|
|
105
51
|
|
|
106
|
-
/**
|
|
107
|
-
|
|
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;
|
|
126
|
-
|
|
127
|
-
/** Param names extracted from pattern */
|
|
128
|
-
paramNames: string[];
|
|
129
|
-
|
|
130
|
-
/** The middleware function */
|
|
131
|
-
handler: MiddlewareFn<TEnv>;
|
|
132
|
-
|
|
133
|
-
/** Mount prefix this middleware is scoped to (null = global) */
|
|
134
|
-
mountPrefix: string | null;
|
|
52
|
+
/** Reset W5 deduplication state (for tests only). */
|
|
53
|
+
export function _resetW5Warnings(): void {
|
|
54
|
+
warnedRedirectMiddleware = new WeakSet();
|
|
135
55
|
}
|
|
136
56
|
|
|
137
57
|
/**
|
|
@@ -191,7 +111,7 @@ function escapeRegex(str: string): string {
|
|
|
191
111
|
export function extractParams(
|
|
192
112
|
pathname: string,
|
|
193
113
|
regex: RegExp,
|
|
194
|
-
paramNames: string[]
|
|
114
|
+
paramNames: string[],
|
|
195
115
|
): Record<string, string> {
|
|
196
116
|
const match = pathname.match(regex);
|
|
197
117
|
if (!match) return {};
|
|
@@ -203,149 +123,110 @@ export function extractParams(
|
|
|
203
123
|
return params;
|
|
204
124
|
}
|
|
205
125
|
|
|
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
126
|
/**
|
|
256
127
|
* Create middleware context
|
|
128
|
+
*
|
|
129
|
+
* Note: The implementation uses runtime values while the interface provides
|
|
130
|
+
* compile-time type safety. The env/get/set types are resolved at call sites
|
|
131
|
+
* via conditional types based on TEnv from createRouter<TBindings>().
|
|
257
132
|
*/
|
|
258
133
|
export function createMiddlewareContext<TEnv>(
|
|
259
134
|
request: Request,
|
|
260
135
|
env: TEnv,
|
|
261
136
|
params: Record<string, string>,
|
|
262
|
-
variables: Record<string,
|
|
263
|
-
responseHolder: ResponseHolder
|
|
137
|
+
variables: Record<string, unknown>,
|
|
138
|
+
responseHolder: ResponseHolder,
|
|
139
|
+
reverse?: (
|
|
140
|
+
name: string,
|
|
141
|
+
params?: Record<string, string>,
|
|
142
|
+
search?: Record<string, unknown>,
|
|
143
|
+
) => string,
|
|
264
144
|
): MiddlewareContext<TEnv> {
|
|
265
145
|
const url = new URL(request.url);
|
|
266
|
-
const cookieHeader = request.headers.get("Cookie");
|
|
267
|
-
let parsedCookies: Record<string, string> | null = null;
|
|
268
146
|
|
|
147
|
+
// Track the initial response to detect pre/post-next() phase.
|
|
148
|
+
// Before next(): responseHolder.response === initialResponse (the stub).
|
|
149
|
+
// After next(): responseHolder.response is the real downstream response.
|
|
150
|
+
const initialResponse = responseHolder.response;
|
|
151
|
+
const isPreNext = () => responseHolder.response === initialResponse;
|
|
152
|
+
|
|
153
|
+
// Delegation strategy for RequestContext (reqCtx):
|
|
154
|
+
// - res getter: before next() returns shared reqCtx stub; after next() returns
|
|
155
|
+
// the real downstream response.
|
|
156
|
+
// - header(): before next() delegates to reqCtx; after next() writes to the
|
|
157
|
+
// real downstream response.
|
|
158
|
+
// Cookie operations are handled by the standalone cookies() function which
|
|
159
|
+
// delegates to the shared RequestContext internally.
|
|
160
|
+
// The runtime implementation - types are enforced at call sites via MiddlewareContext<TEnv>
|
|
269
161
|
return {
|
|
270
162
|
request,
|
|
271
163
|
url,
|
|
272
164
|
pathname: url.pathname,
|
|
273
165
|
searchParams: url.searchParams,
|
|
274
|
-
env,
|
|
166
|
+
env: env as MiddlewareContext<TEnv>["env"],
|
|
275
167
|
params,
|
|
168
|
+
// Getter: re-derives from request context on each access so that global
|
|
169
|
+
// middleware sees the matched route name after await next().
|
|
170
|
+
get routeName(): MiddlewareContext<TEnv>["routeName"] {
|
|
171
|
+
const reqCtx = _getRequestContext();
|
|
172
|
+
const raw = reqCtx?._routeName;
|
|
173
|
+
return (
|
|
174
|
+
raw && !isAutoGeneratedRouteName(raw) ? raw : undefined
|
|
175
|
+
) as MiddlewareContext<TEnv>["routeName"];
|
|
176
|
+
},
|
|
276
177
|
|
|
277
|
-
// res getter - returns the stub or real response (always available)
|
|
278
178
|
get res(): Response {
|
|
179
|
+
// Before next(): return shared RequestContext stub so headers
|
|
180
|
+
// set via ctx.header() are visible on ctx.res.
|
|
181
|
+
if (isPreNext()) {
|
|
182
|
+
const reqCtx = _getRequestContext();
|
|
183
|
+
if (reqCtx) return reqCtx.res;
|
|
184
|
+
}
|
|
279
185
|
if (!responseHolder.response) {
|
|
280
186
|
throw new Error(
|
|
281
|
-
"ctx.res is not available - responseHolder was not initialized"
|
|
187
|
+
"ctx.res is not available - responseHolder was not initialized",
|
|
282
188
|
);
|
|
283
189
|
}
|
|
284
190
|
return responseHolder.response;
|
|
285
191
|
},
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
192
|
+
set res(_: Response) {
|
|
193
|
+
throw new Error(
|
|
194
|
+
"ctx.res is read-only. Use ctx.header() to set response headers, or cookies() for cookie mutations.",
|
|
195
|
+
);
|
|
290
196
|
},
|
|
291
197
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
parsedCookies = parseCookies(cookieHeader);
|
|
295
|
-
}
|
|
296
|
-
return parsedCookies[name];
|
|
297
|
-
},
|
|
198
|
+
get: ((keyOrVar: any) =>
|
|
199
|
+
contextGet(variables, keyOrVar)) as MiddlewareContext<TEnv>["get"],
|
|
298
200
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
}
|
|
303
|
-
return { ...parsedCookies };
|
|
304
|
-
},
|
|
201
|
+
set: ((keyOrVar: any, value: unknown) => {
|
|
202
|
+
contextSet(variables, keyOrVar, value);
|
|
203
|
+
}) as MiddlewareContext<TEnv>["set"],
|
|
305
204
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
)
|
|
205
|
+
header(name: string, value: string): void {
|
|
206
|
+
// Before next(): delegate to shared RequestContext stub
|
|
207
|
+
if (isPreNext()) {
|
|
208
|
+
const reqCtx = _getRequestContext();
|
|
209
|
+
if (reqCtx) {
|
|
210
|
+
reqCtx.header(name, value);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
311
213
|
}
|
|
312
|
-
|
|
313
|
-
"Set-Cookie",
|
|
314
|
-
serializeCookie(name, value, options)
|
|
315
|
-
);
|
|
316
|
-
},
|
|
317
|
-
|
|
318
|
-
deleteCookie(
|
|
319
|
-
name: string,
|
|
320
|
-
options?: Pick<CookieOptions, "domain" | "path">
|
|
321
|
-
): void {
|
|
214
|
+
// After next() or standalone: write to current response
|
|
322
215
|
if (!responseHolder.response) {
|
|
323
216
|
throw new Error(
|
|
324
|
-
"ctx.
|
|
217
|
+
"ctx.header() is not available - responseHolder was not initialized",
|
|
325
218
|
);
|
|
326
219
|
}
|
|
327
|
-
responseHolder.response.headers.
|
|
328
|
-
"Set-Cookie",
|
|
329
|
-
serializeCookie(name, "", { ...options, maxAge: 0 })
|
|
330
|
-
);
|
|
331
|
-
},
|
|
332
|
-
|
|
333
|
-
get<K extends string>(key: K): any {
|
|
334
|
-
return variables[key];
|
|
335
|
-
},
|
|
336
|
-
|
|
337
|
-
set<K extends string>(key: K, value: any): void {
|
|
338
|
-
variables[key] = value;
|
|
220
|
+
responseHolder.response.headers.set(name, value);
|
|
339
221
|
},
|
|
340
222
|
|
|
341
|
-
|
|
342
|
-
|
|
223
|
+
reverse:
|
|
224
|
+
reverse ??
|
|
225
|
+
((name: string) => {
|
|
343
226
|
throw new Error(
|
|
344
|
-
|
|
227
|
+
`ctx.reverse() is not available - route map was not provided to middleware context`,
|
|
345
228
|
);
|
|
346
|
-
}
|
|
347
|
-
responseHolder.response.headers.set(name, value);
|
|
348
|
-
},
|
|
229
|
+
}),
|
|
349
230
|
};
|
|
350
231
|
}
|
|
351
232
|
|
|
@@ -355,7 +236,7 @@ export function createMiddlewareContext<TEnv>(
|
|
|
355
236
|
*/
|
|
356
237
|
export function matchMiddleware<TEnv>(
|
|
357
238
|
pathname: string,
|
|
358
|
-
entries: MiddlewareEntry<TEnv>[]
|
|
239
|
+
entries: MiddlewareEntry<TEnv>[],
|
|
359
240
|
): Array<{ entry: MiddlewareEntry<TEnv>; params: Record<string, string> }> {
|
|
360
241
|
const matches: Array<{
|
|
361
242
|
entry: MiddlewareEntry<TEnv>;
|
|
@@ -398,7 +279,12 @@ export async function executeMiddleware<TEnv>(
|
|
|
398
279
|
request: Request,
|
|
399
280
|
env: TEnv,
|
|
400
281
|
variables: Record<string, any>,
|
|
401
|
-
finalHandler: () => Promise<Response
|
|
282
|
+
finalHandler: () => Promise<Response>,
|
|
283
|
+
reverse?: (
|
|
284
|
+
name: string,
|
|
285
|
+
params?: Record<string, string>,
|
|
286
|
+
search?: Record<string, unknown>,
|
|
287
|
+
) => string,
|
|
402
288
|
): Promise<Response> {
|
|
403
289
|
let index = 0;
|
|
404
290
|
|
|
@@ -412,8 +298,8 @@ export async function executeMiddleware<TEnv>(
|
|
|
412
298
|
// End of chain - call actual RSC handler
|
|
413
299
|
const response = await finalHandler();
|
|
414
300
|
|
|
415
|
-
// Merge headers set on stub into the real response
|
|
416
|
-
// Use append for Set-Cookie to preserve multiple cookies
|
|
301
|
+
// Merge headers set on stub into the real response.
|
|
302
|
+
// Use append for Set-Cookie to preserve multiple cookies.
|
|
417
303
|
const mergedHeaders = new Headers(response.headers);
|
|
418
304
|
stubResponse.headers.forEach((value, name) => {
|
|
419
305
|
if (name.toLowerCase() === "set-cookie") {
|
|
@@ -422,6 +308,19 @@ export async function executeMiddleware<TEnv>(
|
|
|
422
308
|
mergedHeaders.set(name, value);
|
|
423
309
|
}
|
|
424
310
|
});
|
|
311
|
+
// Also merge shared RequestContext stub (cookies written via cookies().set()).
|
|
312
|
+
// Set-Cookie duplication is prevented by createResponseWithMergedHeaders
|
|
313
|
+
// draining Set-Cookie from ctx.res after merging (helpers.ts).
|
|
314
|
+
const reqCtx = _getRequestContext();
|
|
315
|
+
if (reqCtx) {
|
|
316
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
317
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
318
|
+
mergedHeaders.append(name, value);
|
|
319
|
+
} else if (!mergedHeaders.has(name)) {
|
|
320
|
+
mergedHeaders.set(name, value);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
425
324
|
|
|
426
325
|
// Clone response with merged headers (mutable for post-next() modifications)
|
|
427
326
|
responseHolder.response = new Response(response.body, {
|
|
@@ -439,23 +338,77 @@ export async function executeMiddleware<TEnv>(
|
|
|
439
338
|
env,
|
|
440
339
|
params,
|
|
441
340
|
variables,
|
|
442
|
-
responseHolder
|
|
341
|
+
responseHolder,
|
|
342
|
+
reverse,
|
|
443
343
|
);
|
|
444
344
|
|
|
445
|
-
// Track if next() was called and capture its Promise
|
|
446
|
-
//
|
|
345
|
+
// Track if next() was called and capture its Promise.
|
|
346
|
+
// Guard against double-calling: a second call would re-enter the
|
|
347
|
+
// downstream chain and overwrite responseHolder.response.
|
|
447
348
|
let nextPromise: Promise<Response> | null = null;
|
|
448
349
|
const wrappedNext = (): Promise<Response> => {
|
|
350
|
+
if (nextPromise) {
|
|
351
|
+
throw new Error(
|
|
352
|
+
`[@rangojs/router] Middleware called next() more than once.`,
|
|
353
|
+
);
|
|
354
|
+
}
|
|
449
355
|
nextPromise = next();
|
|
450
356
|
return nextPromise;
|
|
451
357
|
};
|
|
452
358
|
|
|
359
|
+
// W5: track whether ctx.set() is called during this middleware
|
|
360
|
+
let ctxSetCalled = false;
|
|
361
|
+
if (process.env.NODE_ENV !== "production") {
|
|
362
|
+
const originalSet = ctx.set;
|
|
363
|
+
ctx.set = ((...args: any[]) => {
|
|
364
|
+
ctxSetCalled = true;
|
|
365
|
+
return (originalSet as Function).apply(ctx, args);
|
|
366
|
+
}) as typeof ctx.set;
|
|
367
|
+
}
|
|
368
|
+
|
|
453
369
|
const result = await entry.handler(ctx, wrappedNext);
|
|
454
370
|
|
|
455
|
-
// Explicit return takes precedence
|
|
371
|
+
// Explicit return takes precedence (middleware short-circuit).
|
|
372
|
+
// Merge stub headers (from ctx.header before this point) and
|
|
373
|
+
// RequestContext stub headers (from ctx.setCookie) into the
|
|
374
|
+
// returned Response so they are not lost.
|
|
456
375
|
if (result instanceof Response) {
|
|
457
|
-
|
|
458
|
-
|
|
376
|
+
// W5: warn if ctx.set() was called but middleware returned a redirect
|
|
377
|
+
if (
|
|
378
|
+
process.env.NODE_ENV !== "production" &&
|
|
379
|
+
ctxSetCalled &&
|
|
380
|
+
result.status >= 300 &&
|
|
381
|
+
result.status < 400
|
|
382
|
+
) {
|
|
383
|
+
warnCtxSetBeforeRedirect(entry.handler);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const mergedHeaders = new Headers(result.headers);
|
|
387
|
+
stubResponse.headers.forEach((value, name) => {
|
|
388
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
389
|
+
mergedHeaders.append(name, value);
|
|
390
|
+
} else if (!mergedHeaders.has(name)) {
|
|
391
|
+
mergedHeaders.set(name, value);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
// Also merge shared RequestContext stub (cookies written via setCookie)
|
|
395
|
+
const reqCtx = _getRequestContext();
|
|
396
|
+
if (reqCtx) {
|
|
397
|
+
reqCtx.res.headers.forEach((value, name) => {
|
|
398
|
+
if (name.toLowerCase() === "set-cookie") {
|
|
399
|
+
mergedHeaders.append(name, value);
|
|
400
|
+
} else if (!mergedHeaders.has(name)) {
|
|
401
|
+
mergedHeaders.set(name, value);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
const merged = new Response(result.body, {
|
|
406
|
+
status: result.status,
|
|
407
|
+
statusText: result.statusText,
|
|
408
|
+
headers: mergedHeaders,
|
|
409
|
+
});
|
|
410
|
+
responseHolder.response = merged;
|
|
411
|
+
return merged;
|
|
459
412
|
}
|
|
460
413
|
|
|
461
414
|
// Warn about unexpected return values (non-Response, non-undefined)
|
|
@@ -464,13 +417,26 @@ export async function executeMiddleware<TEnv>(
|
|
|
464
417
|
const fnName = entry.handler.name || "(anonymous)";
|
|
465
418
|
console.warn(
|
|
466
419
|
`[Middleware] "${fnName}" returned ${typeof result} instead of Response or undefined. ` +
|
|
467
|
-
`This return value will be ignored. Did you mean to return a Response
|
|
420
|
+
`This return value will be ignored. Did you mean to return a Response?`,
|
|
468
421
|
);
|
|
469
422
|
}
|
|
470
423
|
|
|
471
424
|
// If middleware called next(), await it and return the response
|
|
472
425
|
if (nextPromise) {
|
|
473
426
|
await nextPromise;
|
|
427
|
+
|
|
428
|
+
// W5: warn if ctx.set() was called but the downstream response is a redirect.
|
|
429
|
+
// The ctx.set() values will be lost because the redirect navigates away.
|
|
430
|
+
if (
|
|
431
|
+
process.env.NODE_ENV !== "production" &&
|
|
432
|
+
ctxSetCalled &&
|
|
433
|
+
responseHolder.response &&
|
|
434
|
+
responseHolder.response.status >= 300 &&
|
|
435
|
+
responseHolder.response.status < 400
|
|
436
|
+
) {
|
|
437
|
+
warnCtxSetBeforeRedirect(entry.handler);
|
|
438
|
+
}
|
|
439
|
+
|
|
474
440
|
return responseHolder.response!;
|
|
475
441
|
}
|
|
476
442
|
|
|
@@ -481,7 +447,7 @@ export async function executeMiddleware<TEnv>(
|
|
|
481
447
|
`Middleware must call next() or return a Response. ` +
|
|
482
448
|
`Function: ${fnName}, Pattern: ${entry.pattern ?? "(all)"}
|
|
483
449
|
Source: ${import.meta.env.DEV ? entry.handler.toString().slice(0, 200) : "(source hidden in production)"}`,
|
|
484
|
-
{ cause: { url: request.url, fn: entry.handler } }
|
|
450
|
+
{ cause: { url: request.url, fn: entry.handler } },
|
|
485
451
|
);
|
|
486
452
|
};
|
|
487
453
|
|
|
@@ -496,63 +462,6 @@ export async function executeMiddleware<TEnv>(
|
|
|
496
462
|
return finalResponse;
|
|
497
463
|
}
|
|
498
464
|
|
|
499
|
-
/**
|
|
500
|
-
* Execute middleware for server actions
|
|
501
|
-
*
|
|
502
|
-
* Server actions can't return Response directly, but headers/cookies set
|
|
503
|
-
* on ctx.res (from getRequestContext().res) will be merged into the final response.
|
|
504
|
-
*
|
|
505
|
-
* - Runs middleware for auth checks, variable setting, headers, cookies
|
|
506
|
-
* - Throws if middleware returns Response (can't short-circuit server action)
|
|
507
|
-
*/
|
|
508
|
-
export async function executeServerActionMiddleware<TEnv>(
|
|
509
|
-
middlewares: MiddlewareFn<TEnv>[],
|
|
510
|
-
request: Request,
|
|
511
|
-
env: TEnv,
|
|
512
|
-
params: Record<string, string>,
|
|
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
|
-
);
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
return stubResponse;
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
await next();
|
|
553
|
-
// Headers/cookies set on stubResponse will be merged by the caller
|
|
554
|
-
}
|
|
555
|
-
|
|
556
465
|
/**
|
|
557
466
|
* Execute middleware for intercepts (simplified execution)
|
|
558
467
|
*
|
|
@@ -574,7 +483,12 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
574
483
|
env: TEnv,
|
|
575
484
|
params: Record<string, string>,
|
|
576
485
|
variables: Record<string, any>,
|
|
577
|
-
stubResponse: Response
|
|
486
|
+
stubResponse: Response,
|
|
487
|
+
reverse?: (
|
|
488
|
+
name: string,
|
|
489
|
+
params?: Record<string, string>,
|
|
490
|
+
search?: Record<string, unknown>,
|
|
491
|
+
) => string,
|
|
578
492
|
): Promise<Response | null> {
|
|
579
493
|
if (middlewares.length === 0) {
|
|
580
494
|
return null;
|
|
@@ -597,22 +511,28 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
597
511
|
env,
|
|
598
512
|
params,
|
|
599
513
|
variables,
|
|
600
|
-
responseHolder
|
|
514
|
+
responseHolder,
|
|
515
|
+
reverse,
|
|
601
516
|
);
|
|
602
517
|
|
|
603
|
-
|
|
518
|
+
let nextCalled = false;
|
|
519
|
+
const guardedNext = (): Promise<Response> => {
|
|
520
|
+
if (nextCalled) {
|
|
521
|
+
throw new Error(
|
|
522
|
+
`[@rangojs/router] Intercept middleware called next() more than once.`,
|
|
523
|
+
);
|
|
524
|
+
}
|
|
525
|
+
nextCalled = true;
|
|
526
|
+
return next();
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
const result = await middleware(ctx, guardedNext);
|
|
604
530
|
|
|
605
531
|
if (result instanceof Response) {
|
|
606
532
|
earlyResponse = result;
|
|
607
533
|
return result;
|
|
608
534
|
}
|
|
609
535
|
|
|
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
536
|
return stubResponse;
|
|
617
537
|
};
|
|
618
538
|
|
|
@@ -630,12 +550,14 @@ export async function executeInterceptMiddleware<TEnv>(
|
|
|
630
550
|
});
|
|
631
551
|
|
|
632
552
|
if (hasStubHeaders) {
|
|
633
|
-
// Clone and merge headers from stub into early response
|
|
553
|
+
// Clone and merge headers from stub into early response.
|
|
554
|
+
// Only fill in missing headers — the returned Response's explicit
|
|
555
|
+
// headers take precedence, matching executeMiddleware behavior.
|
|
634
556
|
const mergedHeaders = new Headers(response.headers);
|
|
635
557
|
stubResponse.headers.forEach((value, name) => {
|
|
636
558
|
if (name.toLowerCase() === "set-cookie") {
|
|
637
559
|
mergedHeaders.append(name, value);
|
|
638
|
-
} else {
|
|
560
|
+
} else if (!mergedHeaders.has(name)) {
|
|
639
561
|
mergedHeaders.set(name, value);
|
|
640
562
|
}
|
|
641
563
|
});
|
|
@@ -665,7 +587,12 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
665
587
|
env: TEnv,
|
|
666
588
|
params: Record<string, string>,
|
|
667
589
|
variables: Record<string, any>,
|
|
668
|
-
finalHandler: () => Promise<Response
|
|
590
|
+
finalHandler: () => Promise<Response>,
|
|
591
|
+
reverse?: (
|
|
592
|
+
name: string,
|
|
593
|
+
params?: Record<string, string>,
|
|
594
|
+
search?: Record<string, unknown>,
|
|
595
|
+
) => string,
|
|
669
596
|
): Promise<Response> {
|
|
670
597
|
if (middlewares.length === 0) {
|
|
671
598
|
return finalHandler();
|
|
@@ -688,27 +615,11 @@ export async function executeLoaderMiddleware<TEnv>(
|
|
|
688
615
|
request,
|
|
689
616
|
env,
|
|
690
617
|
variables,
|
|
691
|
-
finalHandler
|
|
618
|
+
finalHandler,
|
|
619
|
+
reverse,
|
|
692
620
|
);
|
|
693
621
|
}
|
|
694
622
|
|
|
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
623
|
/**
|
|
713
624
|
* Collect route-level middleware from an entry tree
|
|
714
625
|
*
|
|
@@ -721,7 +632,7 @@ export interface CollectedMiddleware {
|
|
|
721
632
|
*/
|
|
722
633
|
export function collectRouteMiddleware(
|
|
723
634
|
entries: Iterable<MiddlewareCollectableEntry>,
|
|
724
|
-
params: Record<string, string
|
|
635
|
+
params: Record<string, string>,
|
|
725
636
|
): CollectedMiddleware[] {
|
|
726
637
|
const result: CollectedMiddleware[] = [];
|
|
727
638
|
|