@rangojs/router 0.0.0-experimental.2 → 0.0.0-experimental.21
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 +4630 -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 +185 -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 +184 -0
- package/src/vite/discovery/discover-routers.ts +345 -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 +110 -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 +785 -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 +189 -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
|
@@ -0,0 +1,740 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { join, dirname, resolve, relative, basename as pathBasename } from "node:path";
|
|
3
|
+
// @ts-ignore -- picomatch ships no .d.ts; types are trivial
|
|
4
|
+
import picomatch from "picomatch";
|
|
5
|
+
import ts from "typescript";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// AST helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
function getStringValue(node) {
|
|
10
|
+
if (ts.isStringLiteral(node))
|
|
11
|
+
return node.text;
|
|
12
|
+
if (ts.isNoSubstitutionTemplateLiteral(node))
|
|
13
|
+
return node.text;
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function extractObjectStringProperties(node) {
|
|
17
|
+
const result = {};
|
|
18
|
+
for (const prop of node.properties) {
|
|
19
|
+
if (!ts.isPropertyAssignment(prop))
|
|
20
|
+
continue;
|
|
21
|
+
const key = ts.isIdentifier(prop.name) ? prop.name.text
|
|
22
|
+
: ts.isStringLiteral(prop.name) ? prop.name.text
|
|
23
|
+
: null;
|
|
24
|
+
if (!key)
|
|
25
|
+
continue;
|
|
26
|
+
const val = getStringValue(prop.initializer);
|
|
27
|
+
if (val !== null)
|
|
28
|
+
result[key] = val;
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Param extraction from route patterns
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/**
|
|
36
|
+
* Extract typed params from a route pattern string.
|
|
37
|
+
* Matches `:paramName` and `:paramName?` (optional).
|
|
38
|
+
* Custom regex constraints like `:id(\d+)` are ignored for type purposes.
|
|
39
|
+
*/
|
|
40
|
+
export function extractParamsFromPattern(pattern) {
|
|
41
|
+
const params = {};
|
|
42
|
+
const regex = /:([a-zA-Z_$][\w$]*)(?:\([^)]+\))?(\?)?/g;
|
|
43
|
+
let match;
|
|
44
|
+
while ((match = regex.exec(pattern)) !== null) {
|
|
45
|
+
params[match[1]] = match[2] ? "string?" : "string";
|
|
46
|
+
}
|
|
47
|
+
return Object.keys(params).length > 0 ? params : undefined;
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Shared route entry formatter
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Format a single route entry for codegen output.
|
|
54
|
+
* Routes without search remain plain strings (params are extracted from
|
|
55
|
+
* the pattern at the type level by ExtractParams).
|
|
56
|
+
* Routes with search become objects with path and search fields.
|
|
57
|
+
*/
|
|
58
|
+
export function formatRouteEntry(key, pattern, _params, search) {
|
|
59
|
+
const hasSearch = search && Object.keys(search).length > 0;
|
|
60
|
+
if (!hasSearch) {
|
|
61
|
+
return ` ${key}: "${pattern}",`;
|
|
62
|
+
}
|
|
63
|
+
const searchBody = Object.entries(search)
|
|
64
|
+
.map(([k, v]) => `${k}: "${v}"`)
|
|
65
|
+
.join(", ");
|
|
66
|
+
return ` ${key}: { path: "${pattern}", search: { ${searchBody} } },`;
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// AST-based route extraction
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
/**
|
|
72
|
+
* Extract route definitions from source code by walking the TypeScript AST.
|
|
73
|
+
* Finds path() and path.json(), path.md(), etc. call expressions and extracts
|
|
74
|
+
* the pattern, name, params, and optional search schema from each.
|
|
75
|
+
* Skips unnamed paths (no { name: "..." }).
|
|
76
|
+
*/
|
|
77
|
+
export function extractRoutesFromSource(code) {
|
|
78
|
+
const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
79
|
+
const routes = [];
|
|
80
|
+
function visit(node) {
|
|
81
|
+
if (ts.isCallExpression(node)) {
|
|
82
|
+
const callee = node.expression;
|
|
83
|
+
const isPath = (ts.isIdentifier(callee) && callee.text === "path") ||
|
|
84
|
+
(ts.isPropertyAccessExpression(callee) &&
|
|
85
|
+
ts.isIdentifier(callee.expression) && callee.expression.text === "path");
|
|
86
|
+
if (isPath && node.arguments.length >= 1) {
|
|
87
|
+
const route = extractRouteFromCallExpression(node);
|
|
88
|
+
if (route)
|
|
89
|
+
routes.push(route);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
ts.forEachChild(node, visit);
|
|
93
|
+
}
|
|
94
|
+
visit(sourceFile);
|
|
95
|
+
return routes;
|
|
96
|
+
}
|
|
97
|
+
function extractRouteFromCallExpression(node) {
|
|
98
|
+
const patternNode = node.arguments[0];
|
|
99
|
+
const pattern = getStringValue(patternNode);
|
|
100
|
+
if (pattern === null)
|
|
101
|
+
return null;
|
|
102
|
+
let name = null;
|
|
103
|
+
let search;
|
|
104
|
+
for (let i = 1; i < node.arguments.length; i++) {
|
|
105
|
+
const arg = node.arguments[i];
|
|
106
|
+
if (ts.isObjectLiteralExpression(arg)) {
|
|
107
|
+
for (const prop of arg.properties) {
|
|
108
|
+
if (!ts.isPropertyAssignment(prop))
|
|
109
|
+
continue;
|
|
110
|
+
const propName = ts.isIdentifier(prop.name) ? prop.name.text : null;
|
|
111
|
+
if (propName === "name") {
|
|
112
|
+
name = getStringValue(prop.initializer);
|
|
113
|
+
}
|
|
114
|
+
else if (propName === "search" && ts.isObjectLiteralExpression(prop.initializer)) {
|
|
115
|
+
search = extractObjectStringProperties(prop.initializer);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!name)
|
|
121
|
+
return null;
|
|
122
|
+
const params = extractParamsFromPattern(pattern);
|
|
123
|
+
return {
|
|
124
|
+
name,
|
|
125
|
+
pattern,
|
|
126
|
+
...(params ? { params } : {}),
|
|
127
|
+
...(search && Object.keys(search).length > 0 ? { search } : {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Code generation
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Generate a per-module types file from extracted routes.
|
|
135
|
+
* Output has zero imports, preventing circular references.
|
|
136
|
+
*/
|
|
137
|
+
export function generatePerModuleTypesSource(routes) {
|
|
138
|
+
const valid = routes.filter(({ name }) => {
|
|
139
|
+
if (!name || /["'\\`\n\r]/.test(name)) {
|
|
140
|
+
console.warn(`[rsc-router] Skipping route with invalid name: ${JSON.stringify(name)}`);
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
});
|
|
145
|
+
// Deduplicate by name (first definition wins — primary route before variants)
|
|
146
|
+
const deduped = new Map();
|
|
147
|
+
for (const { name, pattern, params, search } of valid) {
|
|
148
|
+
if (deduped.has(name)) {
|
|
149
|
+
console.warn(`[rsc-router] Duplicate route name "${name}" — keeping first definition`);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
deduped.set(name, { pattern, params, search });
|
|
153
|
+
}
|
|
154
|
+
const sorted = [...deduped.entries()]
|
|
155
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
156
|
+
const body = sorted
|
|
157
|
+
.map(([name, { pattern, params, search }]) => {
|
|
158
|
+
const key = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `"${name}"`;
|
|
159
|
+
return formatRouteEntry(key, pattern, params, search);
|
|
160
|
+
})
|
|
161
|
+
.join("\n");
|
|
162
|
+
return `// Auto-generated by @rangojs/router - do not edit\nexport const routes = {\n${body}\n} as const;\nexport type routes = typeof routes;\n`;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generates a .ts file that augments RSCRouter.GeneratedRouteMap
|
|
166
|
+
* with route name -> pattern mappings. This enables Handler<"routeName">
|
|
167
|
+
* without circular references since the file has no imports from the app.
|
|
168
|
+
*/
|
|
169
|
+
export function generateRouteTypesSource(routeManifest, searchSchemas) {
|
|
170
|
+
const entries = Object.entries(routeManifest).sort(([a], [b]) => a.localeCompare(b));
|
|
171
|
+
const objectBody = entries
|
|
172
|
+
.map(([name, pattern]) => {
|
|
173
|
+
const key = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `"${name}"`;
|
|
174
|
+
const params = extractParamsFromPattern(pattern);
|
|
175
|
+
const search = searchSchemas?.[name];
|
|
176
|
+
return formatRouteEntry(key, pattern, params, search);
|
|
177
|
+
})
|
|
178
|
+
.join("\n");
|
|
179
|
+
return `// Auto-generated by @rangojs/router - do not edit
|
|
180
|
+
export const NamedRoutes = {
|
|
181
|
+
${objectBody}
|
|
182
|
+
} as const;
|
|
183
|
+
|
|
184
|
+
declare global {
|
|
185
|
+
namespace RSCRouter {
|
|
186
|
+
interface GeneratedRouteMap extends Readonly<typeof NamedRoutes> {}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
`;
|
|
190
|
+
}
|
|
191
|
+
/** Default exclude patterns for route type scanning. */
|
|
192
|
+
export const DEFAULT_EXCLUDE_PATTERNS = [
|
|
193
|
+
"**/__tests__/**",
|
|
194
|
+
"**/__mocks__/**",
|
|
195
|
+
"**/dist/**",
|
|
196
|
+
"**/coverage/**",
|
|
197
|
+
"**/*.test.{ts,tsx}",
|
|
198
|
+
"**/*.spec.{ts,tsx}",
|
|
199
|
+
];
|
|
200
|
+
/**
|
|
201
|
+
* Compile include/exclude glob patterns into a single predicate.
|
|
202
|
+
* Paths are made root-relative before matching.
|
|
203
|
+
* Returns undefined when no filtering is needed (no include, default exclude).
|
|
204
|
+
*/
|
|
205
|
+
export function createScanFilter(root, opts) {
|
|
206
|
+
const { include, exclude } = opts;
|
|
207
|
+
const hasInclude = include && include.length > 0;
|
|
208
|
+
const hasCustomExclude = exclude !== undefined;
|
|
209
|
+
if (!hasInclude && !hasCustomExclude)
|
|
210
|
+
return undefined;
|
|
211
|
+
const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
|
|
212
|
+
const includeMatcher = hasInclude ? picomatch(include) : null;
|
|
213
|
+
const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
|
|
214
|
+
return (absolutePath) => {
|
|
215
|
+
const rel = relative(root, absolutePath);
|
|
216
|
+
if (excludeMatcher && excludeMatcher(rel))
|
|
217
|
+
return false;
|
|
218
|
+
if (includeMatcher)
|
|
219
|
+
return includeMatcher(rel);
|
|
220
|
+
return true;
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Recursively find .ts/.tsx files under a directory, skipping node_modules
|
|
225
|
+
* and .gen. files.
|
|
226
|
+
*/
|
|
227
|
+
export function findTsFiles(dir, filter) {
|
|
228
|
+
const results = [];
|
|
229
|
+
let entries;
|
|
230
|
+
try {
|
|
231
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
console.warn(`[rsc-router] Failed to scan directory ${dir}: ${err.message}`);
|
|
235
|
+
return results;
|
|
236
|
+
}
|
|
237
|
+
for (const entry of entries) {
|
|
238
|
+
const fullPath = join(dir, entry.name);
|
|
239
|
+
if (entry.isDirectory()) {
|
|
240
|
+
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
241
|
+
continue;
|
|
242
|
+
results.push(...findTsFiles(fullPath, filter));
|
|
243
|
+
}
|
|
244
|
+
else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx")) &&
|
|
245
|
+
!entry.name.includes(".gen.")) {
|
|
246
|
+
if (filter && !filter(fullPath))
|
|
247
|
+
continue;
|
|
248
|
+
results.push(fullPath);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return results;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Generate per-module route type files by statically parsing url module source.
|
|
255
|
+
* Scans for files containing `urls(` and writes a sibling `.gen.ts` with the
|
|
256
|
+
* extracted route name/pattern pairs. Only writes when content has changed.
|
|
257
|
+
*/
|
|
258
|
+
export function writePerModuleRouteTypes(root, filter) {
|
|
259
|
+
const files = findTsFiles(root, filter);
|
|
260
|
+
for (const filePath of files) {
|
|
261
|
+
writePerModuleRouteTypesForFile(filePath);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Find all variable names assigned to urls() calls in source code.
|
|
266
|
+
* e.g. `export const patterns = urls(...)` → ["patterns"]
|
|
267
|
+
*/
|
|
268
|
+
function findUrlsVariableNames(code) {
|
|
269
|
+
const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
270
|
+
const names = [];
|
|
271
|
+
function visit(node) {
|
|
272
|
+
if (ts.isVariableDeclaration(node) &&
|
|
273
|
+
ts.isIdentifier(node.name) &&
|
|
274
|
+
node.initializer &&
|
|
275
|
+
ts.isCallExpression(node.initializer)) {
|
|
276
|
+
const callee = node.initializer.expression;
|
|
277
|
+
if (ts.isIdentifier(callee) && callee.text === "urls") {
|
|
278
|
+
names.push(node.name.text);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
ts.forEachChild(node, visit);
|
|
282
|
+
}
|
|
283
|
+
visit(sourceFile);
|
|
284
|
+
return names;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Generate per-module route types for a single url module file.
|
|
288
|
+
* Follows include() calls recursively to produce the full route tree.
|
|
289
|
+
* No-ops if the file doesn't contain `urls(` or has no named routes.
|
|
290
|
+
*/
|
|
291
|
+
export function writePerModuleRouteTypesForFile(filePath) {
|
|
292
|
+
try {
|
|
293
|
+
const source = readFileSync(filePath, "utf-8");
|
|
294
|
+
if (!source.includes("urls("))
|
|
295
|
+
return;
|
|
296
|
+
const varNames = findUrlsVariableNames(source);
|
|
297
|
+
let routes;
|
|
298
|
+
if (varNames.length > 0) {
|
|
299
|
+
// Follow includes recursively via the combined route map builder.
|
|
300
|
+
// The visited set in buildCombinedRouteMapWithSearch prevents infinite loops.
|
|
301
|
+
routes = [];
|
|
302
|
+
for (const varName of varNames) {
|
|
303
|
+
const { routes: routeMap, searchSchemas } = buildCombinedRouteMapWithSearch(filePath, varName);
|
|
304
|
+
for (const [name, pattern] of Object.entries(routeMap)) {
|
|
305
|
+
const params = extractParamsFromPattern(pattern);
|
|
306
|
+
routes.push({
|
|
307
|
+
name,
|
|
308
|
+
pattern,
|
|
309
|
+
...(params ? { params } : {}),
|
|
310
|
+
...(searchSchemas[name] ? { search: searchSchemas[name] } : {}),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
// Fallback: no urls() variable found, extract path() calls directly
|
|
317
|
+
routes = extractRoutesFromSource(source);
|
|
318
|
+
}
|
|
319
|
+
if (routes.length === 0)
|
|
320
|
+
return;
|
|
321
|
+
const genPath = filePath.replace(/\.(tsx?)$/, ".gen.ts");
|
|
322
|
+
const genSource = generatePerModuleTypesSource(routes);
|
|
323
|
+
const existing = existsSync(genPath) ? readFileSync(genPath, "utf-8") : null;
|
|
324
|
+
if (existing !== genSource) {
|
|
325
|
+
writeFileSync(genPath, genSource);
|
|
326
|
+
console.log(`[rsc-router] Generated route types -> ${genPath}`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
console.warn(`[rsc-router] Failed to generate route types for ${filePath}: ${err.message}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// ---------------------------------------------------------------------------
|
|
334
|
+
// AST-based include() parsing
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
/**
|
|
337
|
+
* Extract include() calls from source code by walking the TypeScript AST.
|
|
338
|
+
* Returns the path prefix, variable name, and optional name prefix for each.
|
|
339
|
+
*/
|
|
340
|
+
export function extractIncludesFromSource(code) {
|
|
341
|
+
const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
342
|
+
const results = [];
|
|
343
|
+
function visit(node) {
|
|
344
|
+
if (ts.isCallExpression(node)) {
|
|
345
|
+
const callee = node.expression;
|
|
346
|
+
if (ts.isIdentifier(callee) && callee.text === "include") {
|
|
347
|
+
const result = extractIncludeFromCallExpression(node);
|
|
348
|
+
if (result)
|
|
349
|
+
results.push(result);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
ts.forEachChild(node, visit);
|
|
353
|
+
}
|
|
354
|
+
visit(sourceFile);
|
|
355
|
+
return results;
|
|
356
|
+
}
|
|
357
|
+
function extractIncludeFromCallExpression(node) {
|
|
358
|
+
if (node.arguments.length < 2)
|
|
359
|
+
return null;
|
|
360
|
+
const pathPrefix = getStringValue(node.arguments[0]);
|
|
361
|
+
if (pathPrefix === null)
|
|
362
|
+
return null;
|
|
363
|
+
const secondArg = node.arguments[1];
|
|
364
|
+
if (!ts.isIdentifier(secondArg))
|
|
365
|
+
return null;
|
|
366
|
+
const variableName = secondArg.text;
|
|
367
|
+
let namePrefix = null;
|
|
368
|
+
if (node.arguments.length >= 3) {
|
|
369
|
+
const thirdArg = node.arguments[2];
|
|
370
|
+
if (ts.isObjectLiteralExpression(thirdArg)) {
|
|
371
|
+
for (const prop of thirdArg.properties) {
|
|
372
|
+
if (!ts.isPropertyAssignment(prop))
|
|
373
|
+
continue;
|
|
374
|
+
const propName = ts.isIdentifier(prop.name) ? prop.name.text : null;
|
|
375
|
+
if (propName === "name") {
|
|
376
|
+
namePrefix = getStringValue(prop.initializer);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return { pathPrefix, variableName, namePrefix };
|
|
382
|
+
}
|
|
383
|
+
// ---------------------------------------------------------------------------
|
|
384
|
+
// Import resolution
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
/**
|
|
387
|
+
* Find the import statement for a local variable name.
|
|
388
|
+
* Returns the import specifier and the exported name from the source module.
|
|
389
|
+
*/
|
|
390
|
+
function resolveImportedVariable(code, localName) {
|
|
391
|
+
const importRegex = /import\s*\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
|
|
392
|
+
let match;
|
|
393
|
+
while ((match = importRegex.exec(code)) !== null) {
|
|
394
|
+
const imports = match[1];
|
|
395
|
+
const specifier = match[2];
|
|
396
|
+
const parts = imports
|
|
397
|
+
.split(",")
|
|
398
|
+
.map((s) => s.trim())
|
|
399
|
+
.filter(Boolean);
|
|
400
|
+
for (const part of parts) {
|
|
401
|
+
const asMatch = part.match(/^(\w+)\s+as\s+(\w+)$/);
|
|
402
|
+
if (asMatch && asMatch[2] === localName)
|
|
403
|
+
return { specifier, exportedName: asMatch[1] };
|
|
404
|
+
if (part === localName)
|
|
405
|
+
return { specifier, exportedName: localName };
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Resolve an import specifier relative to the importing file.
|
|
412
|
+
* Strips .js/.mjs extensions and tries .ts/.tsx candidates.
|
|
413
|
+
*/
|
|
414
|
+
function resolveImportPath(importSpec, fromFile) {
|
|
415
|
+
if (!importSpec.startsWith("."))
|
|
416
|
+
return null;
|
|
417
|
+
const dir = dirname(fromFile);
|
|
418
|
+
let base = importSpec;
|
|
419
|
+
if (base.endsWith(".js"))
|
|
420
|
+
base = base.slice(0, -3);
|
|
421
|
+
else if (base.endsWith(".mjs"))
|
|
422
|
+
base = base.slice(0, -4);
|
|
423
|
+
const candidates = [
|
|
424
|
+
resolve(dir, base + ".ts"),
|
|
425
|
+
resolve(dir, base + ".tsx"),
|
|
426
|
+
resolve(dir, base + "/index.ts"),
|
|
427
|
+
resolve(dir, base + "/index.tsx"),
|
|
428
|
+
];
|
|
429
|
+
for (const candidate of candidates) {
|
|
430
|
+
if (existsSync(candidate))
|
|
431
|
+
return candidate;
|
|
432
|
+
}
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
// ---------------------------------------------------------------------------
|
|
436
|
+
// urls() block extraction for same-file variables
|
|
437
|
+
// ---------------------------------------------------------------------------
|
|
438
|
+
/**
|
|
439
|
+
* Extract the source of a specific `const varName = urls(...)` call using
|
|
440
|
+
* the TypeScript AST. Returns the full text of the urls() call expression.
|
|
441
|
+
*/
|
|
442
|
+
function extractUrlsBlockForVariable(code, varName) {
|
|
443
|
+
const sourceFile = ts.createSourceFile("input.tsx", code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
444
|
+
let result = null;
|
|
445
|
+
function visit(node) {
|
|
446
|
+
if (result)
|
|
447
|
+
return;
|
|
448
|
+
if (ts.isVariableDeclaration(node) &&
|
|
449
|
+
ts.isIdentifier(node.name) &&
|
|
450
|
+
node.name.text === varName &&
|
|
451
|
+
node.initializer &&
|
|
452
|
+
ts.isCallExpression(node.initializer)) {
|
|
453
|
+
const callee = node.initializer.expression;
|
|
454
|
+
if (ts.isIdentifier(callee) && callee.text === "urls") {
|
|
455
|
+
result = node.initializer.getText(sourceFile);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
ts.forEachChild(node, visit);
|
|
460
|
+
}
|
|
461
|
+
visit(sourceFile);
|
|
462
|
+
return result;
|
|
463
|
+
}
|
|
464
|
+
// ---------------------------------------------------------------------------
|
|
465
|
+
// Combined route map building
|
|
466
|
+
// ---------------------------------------------------------------------------
|
|
467
|
+
/**
|
|
468
|
+
* Recursively build a route map from a urls module file.
|
|
469
|
+
* Extracts local path() routes and follows include() calls to sub-modules.
|
|
470
|
+
* Handles both imported and same-file variables.
|
|
471
|
+
*/
|
|
472
|
+
export function buildCombinedRouteMap(filePath, variableName, visited) {
|
|
473
|
+
visited = visited ?? new Set();
|
|
474
|
+
const realPath = resolve(filePath);
|
|
475
|
+
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
476
|
+
if (visited.has(key)) {
|
|
477
|
+
console.warn(`[rsc-router] Circular include detected, skipping: ${key}`);
|
|
478
|
+
return {};
|
|
479
|
+
}
|
|
480
|
+
visited.add(key);
|
|
481
|
+
let source;
|
|
482
|
+
try {
|
|
483
|
+
source = readFileSync(realPath, "utf-8");
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
return {};
|
|
487
|
+
}
|
|
488
|
+
// If a specific variable is requested, extract just its urls() block
|
|
489
|
+
let block;
|
|
490
|
+
if (variableName) {
|
|
491
|
+
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
492
|
+
if (!extracted)
|
|
493
|
+
return {};
|
|
494
|
+
block = extracted;
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
block = source;
|
|
498
|
+
}
|
|
499
|
+
return buildRouteMapFromBlock(block, source, realPath, visited);
|
|
500
|
+
}
|
|
501
|
+
function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut) {
|
|
502
|
+
const routeMap = {};
|
|
503
|
+
// Extract local path() routes
|
|
504
|
+
const localRoutes = extractRoutesFromSource(block);
|
|
505
|
+
for (const { name, pattern, search } of localRoutes) {
|
|
506
|
+
routeMap[name] = pattern;
|
|
507
|
+
if (search && searchSchemasOut) {
|
|
508
|
+
searchSchemasOut[name] = search;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
// Extract include() calls
|
|
512
|
+
const includes = extractIncludesFromSource(block);
|
|
513
|
+
for (const { pathPrefix, variableName, namePrefix } of includes) {
|
|
514
|
+
let childResult;
|
|
515
|
+
// Try import resolution first
|
|
516
|
+
const imported = resolveImportedVariable(fullSource, variableName);
|
|
517
|
+
if (imported) {
|
|
518
|
+
const targetFile = resolveImportPath(imported.specifier, filePath);
|
|
519
|
+
if (!targetFile)
|
|
520
|
+
continue;
|
|
521
|
+
childResult = buildCombinedRouteMapWithSearch(targetFile, imported.exportedName, visited);
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
// Same-file variable
|
|
525
|
+
childResult = buildCombinedRouteMapWithSearch(filePath, variableName, visited);
|
|
526
|
+
}
|
|
527
|
+
// Apply prefixes
|
|
528
|
+
for (const [name, pattern] of Object.entries(childResult.routes)) {
|
|
529
|
+
const prefixedName = namePrefix ? `${namePrefix}.${name}` : name;
|
|
530
|
+
let prefixedPattern;
|
|
531
|
+
if (pattern === "/") {
|
|
532
|
+
prefixedPattern = pathPrefix || "/";
|
|
533
|
+
}
|
|
534
|
+
else if (pathPrefix.endsWith("/") && pattern.startsWith("/")) {
|
|
535
|
+
prefixedPattern = pathPrefix + pattern.slice(1);
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
prefixedPattern = pathPrefix + pattern;
|
|
539
|
+
}
|
|
540
|
+
routeMap[prefixedName] = prefixedPattern;
|
|
541
|
+
// Propagate search schemas with prefix
|
|
542
|
+
if (childResult.searchSchemas[name] && searchSchemasOut) {
|
|
543
|
+
searchSchemasOut[prefixedName] = childResult.searchSchemas[name];
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return routeMap;
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Build route map and search schemas together.
|
|
551
|
+
* Internal helper used by the include resolution path.
|
|
552
|
+
*/
|
|
553
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited) {
|
|
554
|
+
visited = visited ?? new Set();
|
|
555
|
+
const realPath = resolve(filePath);
|
|
556
|
+
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
557
|
+
if (visited.has(key)) {
|
|
558
|
+
console.warn(`[rsc-router] Circular include detected, skipping: ${key}`);
|
|
559
|
+
return { routes: {}, searchSchemas: {} };
|
|
560
|
+
}
|
|
561
|
+
visited.add(key);
|
|
562
|
+
let source;
|
|
563
|
+
try {
|
|
564
|
+
source = readFileSync(realPath, "utf-8");
|
|
565
|
+
}
|
|
566
|
+
catch {
|
|
567
|
+
return { routes: {}, searchSchemas: {} };
|
|
568
|
+
}
|
|
569
|
+
let block;
|
|
570
|
+
if (variableName) {
|
|
571
|
+
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
572
|
+
if (!extracted)
|
|
573
|
+
return { routes: {}, searchSchemas: {} };
|
|
574
|
+
block = extracted;
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
block = source;
|
|
578
|
+
}
|
|
579
|
+
const searchSchemas = {};
|
|
580
|
+
const routes = buildRouteMapFromBlock(block, source, realPath, visited, searchSchemas);
|
|
581
|
+
return { routes, searchSchemas };
|
|
582
|
+
}
|
|
583
|
+
// ---------------------------------------------------------------------------
|
|
584
|
+
// Router file URL extraction
|
|
585
|
+
// ---------------------------------------------------------------------------
|
|
586
|
+
/**
|
|
587
|
+
* Extract the url patterns variable from a router file.
|
|
588
|
+
* Looks for patterns like:
|
|
589
|
+
* .routes(variableName)
|
|
590
|
+
* urls: variableName
|
|
591
|
+
* Returns the local variable name and optional import info.
|
|
592
|
+
*/
|
|
593
|
+
function extractUrlsVariableFromRouter(code) {
|
|
594
|
+
// Pattern 1: .routes(variableName) where variableName is an identifier (not a string)
|
|
595
|
+
const routesCallMatch = code.match(/\.routes\s*\(\s*([a-zA-Z_$][\w$]*)\s*\)/);
|
|
596
|
+
if (routesCallMatch)
|
|
597
|
+
return routesCallMatch[1];
|
|
598
|
+
// Pattern 2: urls: variableName in createRouter options
|
|
599
|
+
const urlsOptionMatch = code.match(/urls\s*:\s*([a-zA-Z_$][\w$]*)/);
|
|
600
|
+
if (urlsOptionMatch)
|
|
601
|
+
return urlsOptionMatch[1];
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Resolve routes and search schemas from a router source file by following the
|
|
606
|
+
* variable passed to `.routes(...)` or `urls: ...` in createRouter options.
|
|
607
|
+
*/
|
|
608
|
+
export function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
609
|
+
let routerSource;
|
|
610
|
+
try {
|
|
611
|
+
routerSource = readFileSync(routerFilePath, "utf-8");
|
|
612
|
+
}
|
|
613
|
+
catch {
|
|
614
|
+
return { routes: {}, searchSchemas: {} };
|
|
615
|
+
}
|
|
616
|
+
const urlsVarName = extractUrlsVariableFromRouter(routerSource);
|
|
617
|
+
if (!urlsVarName) {
|
|
618
|
+
return { routes: {}, searchSchemas: {} };
|
|
619
|
+
}
|
|
620
|
+
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
621
|
+
if (imported) {
|
|
622
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
623
|
+
if (!targetFile) {
|
|
624
|
+
return { routes: {}, searchSchemas: {} };
|
|
625
|
+
}
|
|
626
|
+
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
627
|
+
}
|
|
628
|
+
return buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
629
|
+
}
|
|
630
|
+
// ---------------------------------------------------------------------------
|
|
631
|
+
// Per-router named-routes.gen.ts writer
|
|
632
|
+
// ---------------------------------------------------------------------------
|
|
633
|
+
/**
|
|
634
|
+
* Scan for files containing createRouter() and return their paths.
|
|
635
|
+
* Call once at startup; the result can be reused on subsequent watcher triggers.
|
|
636
|
+
*/
|
|
637
|
+
export function findRouterFiles(root, filter) {
|
|
638
|
+
const files = findTsFiles(root, filter);
|
|
639
|
+
const result = [];
|
|
640
|
+
for (const filePath of files) {
|
|
641
|
+
if (filePath.includes(".gen."))
|
|
642
|
+
continue;
|
|
643
|
+
try {
|
|
644
|
+
const source = readFileSync(filePath, "utf-8");
|
|
645
|
+
if (/\bcreateRouter\s*[<(]/.test(source)) {
|
|
646
|
+
result.push(filePath);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
catch {
|
|
650
|
+
continue;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
return result;
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Generate per-router named-routes.gen.ts files from known router file paths.
|
|
657
|
+
* Re-reads each router file and resolves url patterns via static source parsing.
|
|
658
|
+
*
|
|
659
|
+
* Pass `knownRouterFiles` from a previous `findRouterFiles()` call to skip the
|
|
660
|
+
* full directory scan. If omitted, falls back to scanning (startup path).
|
|
661
|
+
*/
|
|
662
|
+
/**
|
|
663
|
+
* Write named-routes.gen.ts files from static source parsing.
|
|
664
|
+
* Dev-only: provides initial .gen.ts files for IDE types before runtime
|
|
665
|
+
* discovery runs. Must NOT be called during production builds — runtime
|
|
666
|
+
* discovery in buildStart produces the definitive file.
|
|
667
|
+
*/
|
|
668
|
+
export function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
669
|
+
// Delete old combined named-routes.gen.ts if it exists (stale from older versions)
|
|
670
|
+
try {
|
|
671
|
+
const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
|
|
672
|
+
if (existsSync(oldCombinedPath)) {
|
|
673
|
+
unlinkSync(oldCombinedPath);
|
|
674
|
+
console.log(`[rsc-router] Removed stale combined route types: ${oldCombinedPath}`);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
catch { }
|
|
678
|
+
const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
|
|
679
|
+
if (routerFilePaths.length === 0)
|
|
680
|
+
return;
|
|
681
|
+
for (const routerFilePath of routerFilePaths) {
|
|
682
|
+
let routerSource;
|
|
683
|
+
try {
|
|
684
|
+
routerSource = readFileSync(routerFilePath, "utf-8");
|
|
685
|
+
}
|
|
686
|
+
catch {
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
689
|
+
// Extract the urls variable name from .routes(varName) or urls: varName
|
|
690
|
+
const urlsVarName = extractUrlsVariableFromRouter(routerSource);
|
|
691
|
+
if (!urlsVarName)
|
|
692
|
+
continue;
|
|
693
|
+
// Resolve the variable to its source module
|
|
694
|
+
let result;
|
|
695
|
+
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
696
|
+
if (imported) {
|
|
697
|
+
// Variable is imported from another module
|
|
698
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
699
|
+
if (!targetFile)
|
|
700
|
+
continue;
|
|
701
|
+
result = buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
// Variable is defined in the same file
|
|
705
|
+
result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
706
|
+
}
|
|
707
|
+
const routerBasename = pathBasename(routerFilePath).replace(/\.(tsx?|jsx?)$/, "");
|
|
708
|
+
const outPath = join(dirname(routerFilePath), `${routerBasename}.named-routes.gen.ts`);
|
|
709
|
+
const existing = existsSync(outPath) ? readFileSync(outPath, "utf-8") : null;
|
|
710
|
+
// When the static parser can't extract routes (e.g. callback-style urls()),
|
|
711
|
+
// write an empty placeholder so the build-time transform's injected import
|
|
712
|
+
// resolves. Runtime discovery will overwrite this with the real routes.
|
|
713
|
+
if (Object.keys(result.routes).length === 0) {
|
|
714
|
+
if (!existing) {
|
|
715
|
+
const emptySource = generateRouteTypesSource({});
|
|
716
|
+
writeFileSync(outPath, emptySource);
|
|
717
|
+
}
|
|
718
|
+
continue;
|
|
719
|
+
}
|
|
720
|
+
const hasSearchSchemas = Object.keys(result.searchSchemas).length > 0;
|
|
721
|
+
const source = generateRouteTypesSource(result.routes, hasSearchSchemas ? result.searchSchemas : undefined);
|
|
722
|
+
if (existing !== source) {
|
|
723
|
+
// On initial dev startup, don't overwrite a file from runtime discovery
|
|
724
|
+
// (which has all dynamic routes) with a smaller set from the static
|
|
725
|
+
// parser. The static parser can't see routes generated by Array.from()
|
|
726
|
+
// or other dynamic code. During HMR (file watcher), always write so
|
|
727
|
+
// newly added routes appear immediately.
|
|
728
|
+
if (opts?.preserveIfLarger && existing) {
|
|
729
|
+
const existingCount = (existing.match(/^\s+["a-zA-Z_$][^:]*:\s*["{]/gm) || []).length;
|
|
730
|
+
const newCount = Object.keys(result.routes).length;
|
|
731
|
+
if (existingCount > newCount) {
|
|
732
|
+
continue;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
writeFileSync(outPath, source);
|
|
736
|
+
console.log(`[rsc-router] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
//# sourceMappingURL=generate-route-types.js.map
|