@rangojs/router 0.0.0-experimental.18 → 0.0.0-experimental.1878aa49
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/{CLAUDE.md → AGENTS.md} +4 -0
- package/README.md +91 -19
- package/dist/__internal.d.ts +83 -0
- package/dist/__internal.d.ts.map +1 -0
- package/dist/__internal.js +19 -0
- package/dist/__internal.js.map +1 -0
- package/dist/__mocks__/version.d.ts +7 -0
- package/dist/__mocks__/version.d.ts.map +1 -0
- package/dist/__mocks__/version.js +7 -0
- package/dist/__mocks__/version.js.map +1 -0
- package/dist/__tests__/client-href.test.d.ts +2 -0
- package/dist/__tests__/client-href.test.d.ts.map +1 -0
- package/dist/__tests__/client-href.test.js +74 -0
- package/dist/__tests__/client-href.test.js.map +1 -0
- package/dist/__tests__/component-utils.test.d.ts +2 -0
- package/dist/__tests__/component-utils.test.d.ts.map +1 -0
- package/dist/__tests__/component-utils.test.js +51 -0
- package/dist/__tests__/component-utils.test.js.map +1 -0
- package/dist/__tests__/event-controller.test.d.ts +2 -0
- package/dist/__tests__/event-controller.test.d.ts.map +1 -0
- package/dist/__tests__/event-controller.test.js +538 -0
- package/dist/__tests__/event-controller.test.js.map +1 -0
- package/dist/__tests__/helpers/route-tree.d.ts +118 -0
- package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
- package/dist/__tests__/helpers/route-tree.js +374 -0
- package/dist/__tests__/helpers/route-tree.js.map +1 -0
- package/dist/__tests__/match-result.test.d.ts +2 -0
- package/dist/__tests__/match-result.test.d.ts.map +1 -0
- package/dist/__tests__/match-result.test.js +154 -0
- package/dist/__tests__/match-result.test.js.map +1 -0
- package/dist/__tests__/navigation-store.test.d.ts +2 -0
- package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
- package/dist/__tests__/navigation-store.test.js +440 -0
- package/dist/__tests__/navigation-store.test.js.map +1 -0
- package/dist/__tests__/partial-update.test.d.ts +2 -0
- package/dist/__tests__/partial-update.test.d.ts.map +1 -0
- package/dist/__tests__/partial-update.test.js +1009 -0
- package/dist/__tests__/partial-update.test.js.map +1 -0
- package/dist/__tests__/reverse-types.test.d.ts +8 -0
- package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-types.test.js +656 -0
- package/dist/__tests__/reverse-types.test.js.map +1 -0
- package/dist/__tests__/route-definition.test.d.ts +2 -0
- package/dist/__tests__/route-definition.test.d.ts.map +1 -0
- package/dist/__tests__/route-definition.test.js +55 -0
- package/dist/__tests__/route-definition.test.js.map +1 -0
- package/dist/__tests__/router-helpers.test.d.ts +2 -0
- package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
- package/dist/__tests__/router-helpers.test.js +377 -0
- package/dist/__tests__/router-helpers.test.js.map +1 -0
- package/dist/__tests__/router-integration-2.test.d.ts +2 -0
- package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration-2.test.js +426 -0
- package/dist/__tests__/router-integration-2.test.js.map +1 -0
- package/dist/__tests__/router-integration.test.d.ts +2 -0
- package/dist/__tests__/router-integration.test.d.ts.map +1 -0
- package/dist/__tests__/router-integration.test.js +1051 -0
- package/dist/__tests__/router-integration.test.js.map +1 -0
- package/dist/__tests__/search-params.test.d.ts +5 -0
- package/dist/__tests__/search-params.test.d.ts.map +1 -0
- package/dist/__tests__/search-params.test.js +306 -0
- package/dist/__tests__/search-params.test.js.map +1 -0
- package/dist/__tests__/segment-system.test.d.ts +2 -0
- package/dist/__tests__/segment-system.test.d.ts.map +1 -0
- package/dist/__tests__/segment-system.test.js +627 -0
- package/dist/__tests__/segment-system.test.js.map +1 -0
- package/dist/__tests__/static-handler-types.test.d.ts +8 -0
- package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
- package/dist/__tests__/static-handler-types.test.js +63 -0
- package/dist/__tests__/static-handler-types.test.js.map +1 -0
- package/dist/__tests__/urls.test.d.ts +2 -0
- package/dist/__tests__/urls.test.d.ts.map +1 -0
- package/dist/__tests__/urls.test.js +421 -0
- package/dist/__tests__/urls.test.js.map +1 -0
- package/dist/__tests__/use-mount.test.d.ts +2 -0
- package/dist/__tests__/use-mount.test.d.ts.map +1 -0
- package/dist/__tests__/use-mount.test.js +35 -0
- package/dist/__tests__/use-mount.test.js.map +1 -0
- package/dist/bin/rango.d.ts +2 -0
- package/dist/bin/rango.d.ts.map +1 -0
- package/dist/bin/rango.js +348 -80
- 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 +883 -444
- 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/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +17 -16
- package/skills/breadcrumbs/SKILL.md +250 -0
- package/skills/cache-guide/SKILL.md +32 -0
- package/skills/caching/SKILL.md +49 -8
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/hooks/SKILL.md +34 -32
- package/skills/host-router/SKILL.md +218 -0
- package/skills/intercept/SKILL.md +79 -0
- package/skills/layout/SKILL.md +62 -2
- package/skills/links/SKILL.md +3 -1
- package/skills/loader/SKILL.md +166 -23
- package/skills/middleware/SKILL.md +83 -0
- package/skills/parallel/SKILL.md +183 -2
- package/skills/prerender/SKILL.md +189 -19
- package/skills/rango/SKILL.md +0 -1
- package/skills/route/SKILL.md +76 -5
- package/skills/router-setup/SKILL.md +172 -5
- package/skills/typesafety/SKILL.md +35 -23
- package/src/__internal.ts +93 -1
- package/src/bin/rango.ts +56 -19
- package/src/browser/action-coordinator.ts +97 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +30 -27
- package/src/browser/history-state.ts +80 -0
- package/src/browser/intercept-utils.ts +1 -1
- package/src/browser/link-interceptor.ts +4 -3
- package/src/browser/merge-segment-loaders.ts +9 -2
- package/src/browser/navigation-bridge.ts +160 -31
- package/src/browser/navigation-client.ts +141 -88
- package/src/browser/navigation-store.ts +44 -39
- package/src/browser/navigation-transaction.ts +55 -214
- package/src/browser/partial-update.ts +181 -164
- package/src/browser/prefetch/cache.ts +206 -0
- package/src/browser/prefetch/fetch.ts +150 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +160 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/react/Link.tsx +97 -36
- package/src/browser/react/NavigationProvider.tsx +49 -5
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/index.ts +2 -6
- package/src/browser/react/location-state-shared.ts +1 -1
- package/src/browser/react/location-state.ts +2 -0
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/use-action.ts +9 -1
- package/src/browser/react/use-handle.ts +3 -25
- package/src/browser/react/use-params.ts +2 -4
- package/src/browser/react/use-pathname.ts +2 -3
- package/src/browser/react/use-router.ts +22 -9
- package/src/browser/react/use-search-params.ts +2 -1
- package/src/browser/react/use-segments.ts +7 -60
- package/src/browser/response-adapter.ts +73 -0
- package/src/browser/rsc-router.tsx +154 -64
- package/src/browser/scroll-restoration.ts +37 -37
- package/src/browser/segment-reconciler.ts +6 -1
- package/src/browser/server-action-bridge.ts +463 -426
- package/src/browser/types.ts +61 -36
- package/src/browser/validate-redirect-origin.ts +29 -0
- package/src/build/generate-manifest.ts +8 -0
- package/src/build/generate-route-types.ts +7 -0
- package/src/build/route-trie.ts +19 -3
- package/src/build/route-types/codegen.ts +13 -4
- package/src/build/route-types/include-resolution.ts +21 -1
- package/src/build/route-types/per-module-writer.ts +15 -3
- package/src/build/route-types/router-processing.ts +391 -90
- package/src/build/runtime-discovery.ts +13 -1
- 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 +136 -96
- package/src/cache/cache-scope.ts +119 -80
- package/src/cache/cf/cf-cache-store.ts +462 -15
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +88 -53
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/index.ts +1 -0
- package/src/cache/memory-segment-store.ts +18 -7
- package/src/cache/profile-registry.ts +43 -8
- package/src/cache/read-through-swr.ts +134 -0
- package/src/cache/segment-codec.ts +101 -112
- package/src/cache/taint.ts +81 -0
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +54 -76
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/errors.ts +6 -1
- package/src/handle.ts +1 -1
- package/src/handles/MetaTags.tsx +5 -2
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/cookie-handler.ts +8 -3
- package/src/host/index.ts +0 -3
- package/src/host/router.ts +14 -1
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +24 -23
- package/src/index.ts +45 -52
- package/src/loader.rsc.ts +12 -4
- package/src/loader.ts +8 -0
- package/src/prerender/store.ts +60 -18
- package/src/prerender.ts +76 -18
- package/src/reverse.ts +11 -7
- package/src/root-error-boundary.tsx +30 -26
- package/src/route-definition/dsl-helpers.ts +41 -13
- package/src/route-definition/helpers-types.ts +6 -5
- package/src/route-definition/index.ts +0 -3
- package/src/route-definition/redirect.ts +24 -4
- package/src/route-map-builder.ts +45 -3
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +7 -0
- package/src/router/content-negotiation.ts +1 -1
- package/src/router/debug-manifest.ts +16 -3
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +159 -34
- package/src/router/intercept-resolution.ts +17 -8
- package/src/router/lazy-includes.ts +8 -1
- package/src/router/loader-resolution.ts +11 -3
- package/src/router/logging.ts +104 -4
- package/src/router/manifest.ts +45 -7
- package/src/router/match-api.ts +62 -8
- package/src/router/match-context.ts +3 -0
- package/src/router/match-handlers.ts +185 -11
- package/src/router/match-middleware/background-revalidation.ts +94 -86
- package/src/router/match-middleware/cache-lookup.ts +138 -13
- package/src/router/match-middleware/cache-store.ts +55 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +8 -5
- package/src/router/match-pipelines.ts +8 -43
- package/src/router/match-result.ts +22 -15
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +60 -12
- package/src/router/middleware.ts +214 -42
- package/src/router/pattern-matching.ts +61 -10
- package/src/router/prerender-match.ts +40 -8
- package/src/router/preview-match.ts +7 -1
- package/src/router/revalidation.ts +87 -8
- package/src/router/router-context.ts +20 -0
- package/src/router/router-interfaces.ts +73 -5
- package/src/router/router-options.ts +250 -19
- package/src/router/segment-resolution/fresh.ts +277 -45
- package/src/router/segment-resolution/helpers.ts +49 -25
- package/src/router/segment-resolution/loader-cache.ts +38 -146
- package/src/router/segment-resolution/revalidation.ts +619 -275
- package/src/router/segment-wrappers.ts +5 -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 +20 -2
- package/src/router/types.ts +8 -1
- package/src/router.ts +230 -25
- package/src/rsc/handler-context.ts +11 -0
- package/src/rsc/handler.ts +492 -96
- package/src/rsc/helpers.ts +25 -16
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +84 -42
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/origin-guard.ts +141 -0
- package/src/rsc/progressive-enhancement.ts +249 -19
- package/src/rsc/response-route-handler.ts +37 -26
- package/src/rsc/rsc-rendering.ts +40 -41
- package/src/rsc/runtime-warnings.ts +42 -0
- package/src/rsc/server-action.ts +150 -68
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +18 -1
- package/src/search-params.ts +38 -23
- package/src/segment-system.tsx +140 -4
- package/src/server/context.ts +187 -20
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +66 -9
- package/src/server/loader-registry.ts +20 -54
- package/src/server/request-context.ts +188 -41
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +66 -26
- package/src/static-handler.ts +7 -0
- package/src/theme/ThemeProvider.tsx +6 -1
- package/src/theme/index.ts +4 -18
- package/src/theme/theme-context.ts +1 -28
- package/src/theme/theme-script.ts +2 -1
- package/src/types/cache-types.ts +9 -4
- package/src/types/error-types.ts +3 -0
- package/src/types/global-namespace.ts +9 -0
- package/src/types/handler-context.ts +167 -55
- package/src/types/loader-types.ts +11 -5
- package/src/types/route-config.ts +17 -8
- package/src/types/route-entry.ts +35 -0
- package/src/types/segments.ts +2 -5
- package/src/urls/include-helper.ts +49 -8
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +30 -12
- package/src/urls/path-helper.ts +18 -3
- package/src/urls/pattern-types.ts +33 -1
- package/src/urls/response-types.ts +27 -2
- package/src/urls/type-extraction.ts +23 -15
- package/src/use-loader.tsx +12 -4
- package/src/vite/discovery/bundle-postprocess.ts +32 -52
- package/src/vite/discovery/discover-routers.ts +53 -23
- package/src/vite/discovery/prerender-collection.ts +58 -41
- package/src/vite/discovery/route-types-writer.ts +7 -7
- package/src/vite/discovery/state.ts +4 -9
- package/src/vite/discovery/virtual-module-codegen.ts +5 -2
- package/src/vite/index.ts +4 -3
- package/src/vite/plugin-types.ts +0 -83
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/client-ref-hashing.ts +3 -3
- package/src/vite/plugins/expose-action-id.ts +1 -3
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +65 -0
- package/src/vite/plugins/use-cache-transform.ts +91 -3
- package/src/vite/plugins/version-plugin.ts +13 -1
- package/src/vite/rango.ts +172 -210
- package/src/vite/router-discovery.ts +115 -44
- package/src/vite/utils/banner.ts +3 -3
- package/src/vite/utils/prerender-utils.ts +81 -0
- package/src/vite/utils/shared-utils.ts +6 -3
- package/skills/testing/SKILL.md +0 -226
- package/src/browser/prefetch-cache.ts +0 -48
- package/src/browser/prefetch-fetch.ts +0 -109
- package/src/browser/prefetch-queue.ts +0 -81
- package/src/browser/request-controller.ts +0 -164
- package/src/route-definition/route-function.ts +0 -119
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- /package/src/browser/{prefetch-observer.ts → prefetch/observer.ts} +0 -0
package/dist/vite/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/vite/rango.ts
|
|
2
2
|
import { readFileSync as readFileSync7 } from "node:fs";
|
|
3
|
-
import { resolve as
|
|
3
|
+
import { resolve as resolve9 } from "node:path";
|
|
4
4
|
|
|
5
5
|
// src/vite/plugins/expose-action-id.ts
|
|
6
6
|
import MagicString from "magic-string";
|
|
@@ -292,7 +292,7 @@ function exposeActionId() {
|
|
|
292
292
|
}
|
|
293
293
|
if (!rscPluginApi) {
|
|
294
294
|
throw new Error(
|
|
295
|
-
"[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin
|
|
295
|
+
"[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin, which is included automatically by rango()."
|
|
296
296
|
);
|
|
297
297
|
}
|
|
298
298
|
if (!isBuild) return;
|
|
@@ -1454,7 +1454,7 @@ function useCacheTransform() {
|
|
|
1454
1454
|
transformWrapExport
|
|
1455
1455
|
);
|
|
1456
1456
|
}
|
|
1457
|
-
|
|
1457
|
+
const functionResult = transformFunctionLevelUseCache(
|
|
1458
1458
|
code,
|
|
1459
1459
|
ast,
|
|
1460
1460
|
filePath,
|
|
@@ -1462,21 +1462,33 @@ function useCacheTransform() {
|
|
|
1462
1462
|
isBuild,
|
|
1463
1463
|
transformHoistInlineDirective
|
|
1464
1464
|
);
|
|
1465
|
+
warnOnNearMissDirectives(ast, id, this.warn.bind(this));
|
|
1466
|
+
if (functionResult) return functionResult;
|
|
1465
1467
|
}
|
|
1466
1468
|
};
|
|
1467
1469
|
}
|
|
1468
1470
|
function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLayoutOrTemplate, transformWrapExport) {
|
|
1471
|
+
const nonFunctionExports = [];
|
|
1469
1472
|
const { exportNames, output } = transformWrapExport(code, ast, {
|
|
1470
1473
|
runtime: (value, name) => {
|
|
1471
1474
|
const funcId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
|
|
1472
1475
|
return `__rango_registerCachedFunction(${value}, ${JSON.stringify(funcId)}, "default")`;
|
|
1473
1476
|
},
|
|
1474
1477
|
rejectNonAsyncFunction: false,
|
|
1475
|
-
filter: (name) => {
|
|
1478
|
+
filter: (name, meta) => {
|
|
1476
1479
|
if (name === "default" && isLayoutOrTemplate) return false;
|
|
1480
|
+
if (meta.isFunction === false) {
|
|
1481
|
+
nonFunctionExports.push(name);
|
|
1482
|
+
return false;
|
|
1483
|
+
}
|
|
1477
1484
|
return true;
|
|
1478
1485
|
}
|
|
1479
1486
|
});
|
|
1487
|
+
if (nonFunctionExports.length > 0) {
|
|
1488
|
+
throw new Error(
|
|
1489
|
+
`[rango:use-cache] File-level "use cache" in ${sourceId} cannot wrap non-function export${nonFunctionExports.length > 1 ? "s" : ""}: ${nonFunctionExports.map((n) => `"${n}"`).join(", ")}. Only function exports can be cached. Either remove "use cache" from the file level and add it inside individual functions, or move the non-function exports to a separate module.`
|
|
1490
|
+
);
|
|
1491
|
+
}
|
|
1480
1492
|
if (exportNames.length === 0) {
|
|
1481
1493
|
const s = new MagicString5(code);
|
|
1482
1494
|
const directive2 = findFileLevelDirective(ast);
|
|
@@ -1513,7 +1525,7 @@ function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLa
|
|
|
1513
1525
|
function transformFunctionLevelUseCache(code, ast, filePath, sourceId, isBuild, transformHoistInlineDirective) {
|
|
1514
1526
|
try {
|
|
1515
1527
|
const { output, names } = transformHoistInlineDirective(code, ast, {
|
|
1516
|
-
directive: /^use cache(:\s
|
|
1528
|
+
directive: /^use cache(:\s*[\w-]+)?$/,
|
|
1517
1529
|
runtime: (value, name, meta) => {
|
|
1518
1530
|
const funcId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
|
|
1519
1531
|
const profileMatch = meta.directiveMatch[1];
|
|
@@ -1543,6 +1555,82 @@ function findFileLevelDirective(ast) {
|
|
|
1543
1555
|
}
|
|
1544
1556
|
return null;
|
|
1545
1557
|
}
|
|
1558
|
+
var VALID_DIRECTIVE_RE = /^use cache(:\s*[\w-]+)?$/;
|
|
1559
|
+
var NEAR_MISS_RE = /^use cache:\s*.+$/;
|
|
1560
|
+
function warnOnNearMissDirectives(ast, fileId, warn) {
|
|
1561
|
+
const visit = (node) => {
|
|
1562
|
+
if (!node || typeof node !== "object") return;
|
|
1563
|
+
if (node.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
|
|
1564
|
+
const value = node.expression.value;
|
|
1565
|
+
if (value.startsWith("use cache") && NEAR_MISS_RE.test(value) && !VALID_DIRECTIVE_RE.test(value)) {
|
|
1566
|
+
const profilePart = value.slice("use cache:".length).trim();
|
|
1567
|
+
warn(
|
|
1568
|
+
`[rango:use-cache] "${value}" in ${fileId} has an invalid profile name "${profilePart}". Profile names must match [a-zA-Z0-9_-]+. This directive will be ignored.`
|
|
1569
|
+
);
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
for (const key of Object.keys(node)) {
|
|
1573
|
+
const child = node[key];
|
|
1574
|
+
if (Array.isArray(child)) {
|
|
1575
|
+
for (const item of child) {
|
|
1576
|
+
visit(item);
|
|
1577
|
+
}
|
|
1578
|
+
} else if (child && typeof child === "object" && child.type) {
|
|
1579
|
+
visit(child);
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
};
|
|
1583
|
+
for (const node of ast.body ?? []) {
|
|
1584
|
+
visit(node);
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
// src/vite/plugins/client-ref-dedup.ts
|
|
1589
|
+
var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
|
|
1590
|
+
function extractPackageName(absolutePath) {
|
|
1591
|
+
const marker = "/node_modules/";
|
|
1592
|
+
const idx = absolutePath.lastIndexOf(marker);
|
|
1593
|
+
if (idx === -1) return null;
|
|
1594
|
+
const afterModules = absolutePath.slice(idx + marker.length);
|
|
1595
|
+
if (afterModules.startsWith("@")) {
|
|
1596
|
+
const parts = afterModules.split("/");
|
|
1597
|
+
if (parts.length < 2 || !parts[1]) return null;
|
|
1598
|
+
return `${parts[0]}/${parts[1]}`;
|
|
1599
|
+
}
|
|
1600
|
+
const name = afterModules.split("/")[0];
|
|
1601
|
+
return name || null;
|
|
1602
|
+
}
|
|
1603
|
+
function clientRefDedup() {
|
|
1604
|
+
let clientExclude = [];
|
|
1605
|
+
return {
|
|
1606
|
+
name: "@rangojs/router:client-ref-dedup",
|
|
1607
|
+
enforce: "pre",
|
|
1608
|
+
apply: "serve",
|
|
1609
|
+
configResolved(config) {
|
|
1610
|
+
const clientEnv = config.environments?.["client"];
|
|
1611
|
+
clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
|
|
1612
|
+
},
|
|
1613
|
+
resolveId(source, importer, options) {
|
|
1614
|
+
if (this.environment?.name !== "client") return;
|
|
1615
|
+
if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
|
|
1616
|
+
if (!source.includes("/node_modules/")) return;
|
|
1617
|
+
if (!importer) return;
|
|
1618
|
+
const packageName = extractPackageName(source);
|
|
1619
|
+
if (!packageName) return;
|
|
1620
|
+
if (clientExclude.includes(packageName)) return;
|
|
1621
|
+
return `\0rango:dedup/${packageName}`;
|
|
1622
|
+
},
|
|
1623
|
+
load(id) {
|
|
1624
|
+
if (!id.startsWith("\0rango:dedup/")) return;
|
|
1625
|
+
const packageName = id.slice("\0rango:dedup/".length);
|
|
1626
|
+
return [
|
|
1627
|
+
`export * from ${JSON.stringify(packageName)};`,
|
|
1628
|
+
`import * as __all__ from ${JSON.stringify(packageName)};`,
|
|
1629
|
+
`export default __all__.default;`
|
|
1630
|
+
].join("\n");
|
|
1631
|
+
}
|
|
1632
|
+
};
|
|
1633
|
+
}
|
|
1546
1634
|
|
|
1547
1635
|
// src/vite/plugins/virtual-entries.ts
|
|
1548
1636
|
var VIRTUAL_ENTRY_BROWSER = `
|
|
@@ -1657,7 +1745,7 @@ import { resolve } from "node:path";
|
|
|
1657
1745
|
// package.json
|
|
1658
1746
|
var package_default = {
|
|
1659
1747
|
name: "@rangojs/router",
|
|
1660
|
-
version: "0.0.0-experimental.
|
|
1748
|
+
version: "0.0.0-experimental.1878aa49",
|
|
1661
1749
|
description: "Django-inspired RSC router with composable URL patterns",
|
|
1662
1750
|
keywords: [
|
|
1663
1751
|
"react",
|
|
@@ -1688,7 +1776,7 @@ var package_default = {
|
|
|
1688
1776
|
"!src/**/*.test.tsx",
|
|
1689
1777
|
"dist",
|
|
1690
1778
|
"skills",
|
|
1691
|
-
"
|
|
1779
|
+
"AGENTS.md",
|
|
1692
1780
|
"README.md"
|
|
1693
1781
|
],
|
|
1694
1782
|
type: "module",
|
|
@@ -1799,7 +1887,7 @@ var package_default = {
|
|
|
1799
1887
|
"test:unit:watch": "vitest"
|
|
1800
1888
|
},
|
|
1801
1889
|
dependencies: {
|
|
1802
|
-
"@vitejs/plugin-rsc": "^0.5.
|
|
1890
|
+
"@vitejs/plugin-rsc": "^0.5.19",
|
|
1803
1891
|
"magic-string": "^0.30.17",
|
|
1804
1892
|
picomatch: "^4.0.3",
|
|
1805
1893
|
"rsc-html-stream": "^0.0.7"
|
|
@@ -1970,15 +2058,27 @@ function extractRouteFromCallExpression(node) {
|
|
|
1970
2058
|
};
|
|
1971
2059
|
}
|
|
1972
2060
|
|
|
2061
|
+
// src/route-name.ts
|
|
2062
|
+
var AUTO_GENERATED_ROUTE_PREFIX = "$path_";
|
|
2063
|
+
var INTERNAL_INCLUDE_SCOPE_PREFIX = "$prefix_";
|
|
2064
|
+
function isAutoGeneratedRouteName(name) {
|
|
2065
|
+
return name.split(".").some((segment) => {
|
|
2066
|
+
return segment.startsWith(AUTO_GENERATED_ROUTE_PREFIX) || segment.startsWith(INTERNAL_INCLUDE_SCOPE_PREFIX);
|
|
2067
|
+
});
|
|
2068
|
+
}
|
|
2069
|
+
|
|
1973
2070
|
// src/build/route-types/codegen.ts
|
|
1974
2071
|
function generateRouteTypesSource(routeManifest, searchSchemas) {
|
|
1975
|
-
const entries = Object.entries(routeManifest).sort(
|
|
1976
|
-
|
|
1977
|
-
|
|
2072
|
+
const entries = Object.entries(routeManifest).filter(([name]) => !isAutoGeneratedRouteName(name)).sort(([a], [b]) => a.localeCompare(b));
|
|
2073
|
+
const filteredSearchSchemas = searchSchemas ? Object.fromEntries(
|
|
2074
|
+
Object.entries(searchSchemas).filter(
|
|
2075
|
+
([name]) => !isAutoGeneratedRouteName(name)
|
|
2076
|
+
)
|
|
2077
|
+
) : void 0;
|
|
1978
2078
|
const objectBody = entries.map(([name, pattern]) => {
|
|
1979
2079
|
const key = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `"${name}"`;
|
|
1980
2080
|
const params = extractParamsFromPattern(pattern);
|
|
1981
|
-
const search =
|
|
2081
|
+
const search = filteredSearchSchemas?.[name];
|
|
1982
2082
|
return formatRouteEntry(key, pattern, params, search);
|
|
1983
2083
|
}).join("\n");
|
|
1984
2084
|
return `// Auto-generated by @rangojs/router - do not edit
|
|
@@ -1995,55 +2095,7 @@ declare global {
|
|
|
1995
2095
|
}
|
|
1996
2096
|
|
|
1997
2097
|
// src/build/route-types/scan-filter.ts
|
|
1998
|
-
import { join, relative } from "node:path";
|
|
1999
|
-
import { readdirSync } from "node:fs";
|
|
2000
2098
|
import picomatch from "picomatch";
|
|
2001
|
-
var DEFAULT_EXCLUDE_PATTERNS = [
|
|
2002
|
-
"**/__tests__/**",
|
|
2003
|
-
"**/__mocks__/**",
|
|
2004
|
-
"**/dist/**",
|
|
2005
|
-
"**/coverage/**",
|
|
2006
|
-
"**/*.test.{ts,tsx,js,jsx}",
|
|
2007
|
-
"**/*.spec.{ts,tsx,js,jsx}"
|
|
2008
|
-
];
|
|
2009
|
-
function createScanFilter(root, opts) {
|
|
2010
|
-
const { include, exclude } = opts;
|
|
2011
|
-
const hasInclude = include && include.length > 0;
|
|
2012
|
-
const hasCustomExclude = exclude !== void 0;
|
|
2013
|
-
if (!hasInclude && !hasCustomExclude) return void 0;
|
|
2014
|
-
const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
|
|
2015
|
-
const includeMatcher = hasInclude ? picomatch(include) : null;
|
|
2016
|
-
const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
|
|
2017
|
-
return (absolutePath) => {
|
|
2018
|
-
const rel = relative(root, absolutePath);
|
|
2019
|
-
if (excludeMatcher && excludeMatcher(rel)) return false;
|
|
2020
|
-
if (includeMatcher) return includeMatcher(rel);
|
|
2021
|
-
return true;
|
|
2022
|
-
};
|
|
2023
|
-
}
|
|
2024
|
-
function findTsFiles(dir, filter) {
|
|
2025
|
-
const results = [];
|
|
2026
|
-
let entries;
|
|
2027
|
-
try {
|
|
2028
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
2029
|
-
} catch (err) {
|
|
2030
|
-
console.warn(
|
|
2031
|
-
`[rsc-router] Failed to scan directory ${dir}: ${err.message}`
|
|
2032
|
-
);
|
|
2033
|
-
return results;
|
|
2034
|
-
}
|
|
2035
|
-
for (const entry of entries) {
|
|
2036
|
-
const fullPath = join(dir, entry.name);
|
|
2037
|
-
if (entry.isDirectory()) {
|
|
2038
|
-
if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
|
|
2039
|
-
results.push(...findTsFiles(fullPath, filter));
|
|
2040
|
-
} else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
|
|
2041
|
-
if (filter && !filter(fullPath)) continue;
|
|
2042
|
-
results.push(fullPath);
|
|
2043
|
-
}
|
|
2044
|
-
}
|
|
2045
|
-
return results;
|
|
2046
|
-
}
|
|
2047
2099
|
|
|
2048
2100
|
// src/build/route-types/per-module-writer.ts
|
|
2049
2101
|
import ts4 from "typescript";
|
|
@@ -2244,6 +2296,9 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2244
2296
|
diagnosticsOut
|
|
2245
2297
|
);
|
|
2246
2298
|
}
|
|
2299
|
+
if (namePrefix === null) {
|
|
2300
|
+
continue;
|
|
2301
|
+
}
|
|
2247
2302
|
for (const [name, pattern] of Object.entries(childResult.routes)) {
|
|
2248
2303
|
const prefixedName = namePrefix ? `${namePrefix}.${name}` : name;
|
|
2249
2304
|
let prefixedPattern;
|
|
@@ -2262,7 +2317,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2262
2317
|
}
|
|
2263
2318
|
return routeMap;
|
|
2264
2319
|
}
|
|
2265
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
|
|
2320
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
2266
2321
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
2267
2322
|
const realPath = resolve2(filePath);
|
|
2268
2323
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
@@ -2278,7 +2333,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2278
2333
|
return { routes: {}, searchSchemas: {} };
|
|
2279
2334
|
}
|
|
2280
2335
|
let block;
|
|
2281
|
-
if (
|
|
2336
|
+
if (inlineBlock) {
|
|
2337
|
+
block = inlineBlock;
|
|
2338
|
+
} else if (variableName) {
|
|
2282
2339
|
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
2283
2340
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
2284
2341
|
block = extracted;
|
|
@@ -2294,14 +2351,110 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2294
2351
|
searchSchemas,
|
|
2295
2352
|
diagnosticsOut
|
|
2296
2353
|
);
|
|
2354
|
+
visited.delete(key);
|
|
2297
2355
|
return { routes, searchSchemas };
|
|
2298
2356
|
}
|
|
2299
2357
|
|
|
2300
2358
|
// src/build/route-types/router-processing.ts
|
|
2301
|
-
import {
|
|
2302
|
-
|
|
2359
|
+
import {
|
|
2360
|
+
readFileSync as readFileSync2,
|
|
2361
|
+
writeFileSync,
|
|
2362
|
+
existsSync as existsSync3,
|
|
2363
|
+
unlinkSync,
|
|
2364
|
+
readdirSync
|
|
2365
|
+
} from "node:fs";
|
|
2366
|
+
import {
|
|
2367
|
+
join,
|
|
2368
|
+
dirname as dirname2,
|
|
2369
|
+
resolve as resolve3,
|
|
2370
|
+
sep,
|
|
2371
|
+
basename as pathBasename
|
|
2372
|
+
} from "node:path";
|
|
2303
2373
|
import ts5 from "typescript";
|
|
2304
|
-
function
|
|
2374
|
+
function countPublicRouteEntries(source) {
|
|
2375
|
+
const matches = source.matchAll(/^\s+(?:"([^"]+)"|([a-zA-Z_$][^:]*)):\s*["{]/gm) ?? [];
|
|
2376
|
+
let count = 0;
|
|
2377
|
+
for (const match of matches) {
|
|
2378
|
+
const routeName = match[1] || match[2];
|
|
2379
|
+
if (routeName && !isAutoGeneratedRouteName(routeName.trim())) {
|
|
2380
|
+
count++;
|
|
2381
|
+
}
|
|
2382
|
+
}
|
|
2383
|
+
return count;
|
|
2384
|
+
}
|
|
2385
|
+
var ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
|
|
2386
|
+
function isRoutableSourceFile(name) {
|
|
2387
|
+
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
|
|
2388
|
+
}
|
|
2389
|
+
function findRouterFilesRecursive(dir, filter, results) {
|
|
2390
|
+
let entries;
|
|
2391
|
+
try {
|
|
2392
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
2393
|
+
} catch (err) {
|
|
2394
|
+
console.warn(
|
|
2395
|
+
`[rsc-router] Failed to scan directory ${dir}: ${err.message}`
|
|
2396
|
+
);
|
|
2397
|
+
return;
|
|
2398
|
+
}
|
|
2399
|
+
const childDirs = [];
|
|
2400
|
+
const routerFilesInDir = [];
|
|
2401
|
+
for (const entry of entries) {
|
|
2402
|
+
const fullPath = join(dir, entry.name);
|
|
2403
|
+
if (entry.isDirectory()) {
|
|
2404
|
+
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
|
|
2405
|
+
continue;
|
|
2406
|
+
childDirs.push(fullPath);
|
|
2407
|
+
continue;
|
|
2408
|
+
}
|
|
2409
|
+
if (!isRoutableSourceFile(entry.name)) continue;
|
|
2410
|
+
if (filter && !filter(fullPath)) continue;
|
|
2411
|
+
try {
|
|
2412
|
+
const source = readFileSync2(fullPath, "utf-8");
|
|
2413
|
+
if (ROUTER_CALL_PATTERN.test(source)) {
|
|
2414
|
+
routerFilesInDir.push(fullPath);
|
|
2415
|
+
}
|
|
2416
|
+
} catch {
|
|
2417
|
+
continue;
|
|
2418
|
+
}
|
|
2419
|
+
}
|
|
2420
|
+
if (routerFilesInDir.length > 0) {
|
|
2421
|
+
results.push(...routerFilesInDir);
|
|
2422
|
+
return;
|
|
2423
|
+
}
|
|
2424
|
+
for (const childDir of childDirs) {
|
|
2425
|
+
findRouterFilesRecursive(childDir, filter, results);
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
function findNestedRouterConflict(routerFiles) {
|
|
2429
|
+
const routerDirs = [
|
|
2430
|
+
...new Set(routerFiles.map((filePath) => dirname2(resolve3(filePath))))
|
|
2431
|
+
].sort((a, b) => a.length - b.length);
|
|
2432
|
+
for (let i = 0; i < routerDirs.length; i++) {
|
|
2433
|
+
const ancestorDir = routerDirs[i];
|
|
2434
|
+
const prefix = ancestorDir.endsWith(sep) ? ancestorDir : `${ancestorDir}${sep}`;
|
|
2435
|
+
for (let j = i + 1; j < routerDirs.length; j++) {
|
|
2436
|
+
const nestedDir = routerDirs[j];
|
|
2437
|
+
if (!nestedDir.startsWith(prefix)) continue;
|
|
2438
|
+
const ancestorFile = routerFiles.find(
|
|
2439
|
+
(filePath) => dirname2(resolve3(filePath)) === ancestorDir
|
|
2440
|
+
);
|
|
2441
|
+
const nestedFile = routerFiles.find(
|
|
2442
|
+
(filePath) => dirname2(resolve3(filePath)) === nestedDir
|
|
2443
|
+
);
|
|
2444
|
+
if (ancestorFile && nestedFile) {
|
|
2445
|
+
return { ancestor: ancestorFile, nested: nestedFile };
|
|
2446
|
+
}
|
|
2447
|
+
}
|
|
2448
|
+
}
|
|
2449
|
+
return null;
|
|
2450
|
+
}
|
|
2451
|
+
function formatNestedRouterConflictError(conflict, prefix = "[rsc-router]") {
|
|
2452
|
+
return `${prefix} Nested router roots are not supported.
|
|
2453
|
+
Router root: ${conflict.ancestor}
|
|
2454
|
+
Nested router: ${conflict.nested}
|
|
2455
|
+
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
2456
|
+
}
|
|
2457
|
+
function extractUrlsFromRouter(code) {
|
|
2305
2458
|
const sourceFile = ts5.createSourceFile(
|
|
2306
2459
|
"router.tsx",
|
|
2307
2460
|
code,
|
|
@@ -2315,24 +2468,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2315
2468
|
const callee = node.expression;
|
|
2316
2469
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
2317
2470
|
}
|
|
2471
|
+
function isInlineBuilder(node) {
|
|
2472
|
+
return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
|
|
2473
|
+
}
|
|
2474
|
+
function isRoutesOnCreateRouter(node) {
|
|
2475
|
+
if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
|
|
2476
|
+
return false;
|
|
2477
|
+
let inner = node.expression.expression;
|
|
2478
|
+
while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
|
|
2479
|
+
inner = inner.expression.expression;
|
|
2480
|
+
}
|
|
2481
|
+
return isCreateRouterCall(inner);
|
|
2482
|
+
}
|
|
2318
2483
|
function visit(node) {
|
|
2319
2484
|
if (result) return;
|
|
2320
|
-
if (ts5.isCallExpression(node) &&
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
}
|
|
2325
|
-
|
|
2326
|
-
result = node.arguments[0].text;
|
|
2327
|
-
return;
|
|
2485
|
+
if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
|
|
2486
|
+
const arg = node.arguments[0];
|
|
2487
|
+
if (ts5.isIdentifier(arg)) {
|
|
2488
|
+
result = { kind: "variable", name: arg.text };
|
|
2489
|
+
} else if (isInlineBuilder(arg)) {
|
|
2490
|
+
result = { kind: "inline", block: arg.getText(sourceFile) };
|
|
2328
2491
|
}
|
|
2492
|
+
return;
|
|
2329
2493
|
}
|
|
2330
2494
|
if (isCreateRouterCall(node)) {
|
|
2331
2495
|
const callExpr = node;
|
|
2332
|
-
for (const
|
|
2496
|
+
for (const callArg of callExpr.arguments) {
|
|
2497
|
+
if (ts5.isObjectLiteralExpression(callArg)) {
|
|
2498
|
+
for (const prop of callArg.properties) {
|
|
2499
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
|
|
2500
|
+
if (ts5.isIdentifier(prop.initializer)) {
|
|
2501
|
+
result = { kind: "variable", name: prop.initializer.text };
|
|
2502
|
+
} else if (isInlineBuilder(prop.initializer)) {
|
|
2503
|
+
result = {
|
|
2504
|
+
kind: "inline",
|
|
2505
|
+
block: prop.initializer.getText(sourceFile)
|
|
2506
|
+
};
|
|
2507
|
+
}
|
|
2508
|
+
return;
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2514
|
+
ts5.forEachChild(node, visit);
|
|
2515
|
+
}
|
|
2516
|
+
visit(sourceFile);
|
|
2517
|
+
return result;
|
|
2518
|
+
}
|
|
2519
|
+
function extractBasenameFromRouter(code) {
|
|
2520
|
+
const sourceFile = ts5.createSourceFile(
|
|
2521
|
+
"router.tsx",
|
|
2522
|
+
code,
|
|
2523
|
+
ts5.ScriptTarget.Latest,
|
|
2524
|
+
true,
|
|
2525
|
+
ts5.ScriptKind.TSX
|
|
2526
|
+
);
|
|
2527
|
+
let result;
|
|
2528
|
+
function visit(node) {
|
|
2529
|
+
if (result !== void 0) return;
|
|
2530
|
+
if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
|
|
2531
|
+
for (const arg of node.arguments) {
|
|
2333
2532
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
2334
2533
|
for (const prop of arg.properties) {
|
|
2335
|
-
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "
|
|
2534
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
|
|
2336
2535
|
result = prop.initializer.text;
|
|
2337
2536
|
return;
|
|
2338
2537
|
}
|
|
@@ -2345,6 +2544,19 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2345
2544
|
visit(sourceFile);
|
|
2346
2545
|
return result;
|
|
2347
2546
|
}
|
|
2547
|
+
function applyBasenameToRoutes(result, basename3) {
|
|
2548
|
+
const prefixed = {};
|
|
2549
|
+
for (const [name, pattern] of Object.entries(result.routes)) {
|
|
2550
|
+
if (pattern === "/") {
|
|
2551
|
+
prefixed[name] = basename3;
|
|
2552
|
+
} else if (basename3.endsWith("/") && pattern.startsWith("/")) {
|
|
2553
|
+
prefixed[name] = basename3 + pattern.slice(1);
|
|
2554
|
+
} else {
|
|
2555
|
+
prefixed[name] = basename3 + pattern;
|
|
2556
|
+
}
|
|
2557
|
+
}
|
|
2558
|
+
return { routes: prefixed, searchSchemas: result.searchSchemas };
|
|
2559
|
+
}
|
|
2348
2560
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
2349
2561
|
let routerSource;
|
|
2350
2562
|
try {
|
|
@@ -2352,39 +2564,49 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
2352
2564
|
} catch {
|
|
2353
2565
|
return { routes: {}, searchSchemas: {} };
|
|
2354
2566
|
}
|
|
2355
|
-
const
|
|
2356
|
-
if (!
|
|
2567
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
2568
|
+
if (!extraction) {
|
|
2357
2569
|
return { routes: {}, searchSchemas: {} };
|
|
2358
2570
|
}
|
|
2359
|
-
const
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2571
|
+
const rawBasename = extractBasenameFromRouter(routerSource);
|
|
2572
|
+
const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
|
|
2573
|
+
let result;
|
|
2574
|
+
if (extraction.kind === "inline") {
|
|
2575
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2576
|
+
routerFilePath,
|
|
2577
|
+
void 0,
|
|
2578
|
+
void 0,
|
|
2579
|
+
void 0,
|
|
2580
|
+
extraction.block
|
|
2581
|
+
);
|
|
2582
|
+
} else {
|
|
2583
|
+
const imported = resolveImportedVariable(routerSource, extraction.name);
|
|
2584
|
+
if (imported) {
|
|
2585
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2586
|
+
if (!targetFile) {
|
|
2587
|
+
return { routes: {}, searchSchemas: {} };
|
|
2588
|
+
}
|
|
2589
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2590
|
+
targetFile,
|
|
2591
|
+
imported.exportedName
|
|
2592
|
+
);
|
|
2593
|
+
} else {
|
|
2594
|
+
result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
|
|
2364
2595
|
}
|
|
2365
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
2366
2596
|
}
|
|
2367
|
-
|
|
2597
|
+
if (basename3) {
|
|
2598
|
+
result = applyBasenameToRoutes(result, basename3);
|
|
2599
|
+
}
|
|
2600
|
+
return result;
|
|
2368
2601
|
}
|
|
2369
2602
|
function findRouterFiles(root, filter) {
|
|
2370
|
-
const files = findTsFiles(root, filter);
|
|
2371
2603
|
const result = [];
|
|
2372
|
-
|
|
2373
|
-
if (filePath.includes(".gen.")) continue;
|
|
2374
|
-
try {
|
|
2375
|
-
const source = readFileSync2(filePath, "utf-8");
|
|
2376
|
-
if (/\bcreateRouter\s*[<(]/.test(source)) {
|
|
2377
|
-
result.push(filePath);
|
|
2378
|
-
}
|
|
2379
|
-
} catch {
|
|
2380
|
-
continue;
|
|
2381
|
-
}
|
|
2382
|
-
}
|
|
2604
|
+
findRouterFilesRecursive(root, filter, result);
|
|
2383
2605
|
return result;
|
|
2384
2606
|
}
|
|
2385
2607
|
function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
2386
2608
|
try {
|
|
2387
|
-
const oldCombinedPath =
|
|
2609
|
+
const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
|
|
2388
2610
|
if (existsSync3(oldCombinedPath)) {
|
|
2389
2611
|
unlinkSync(oldCombinedPath);
|
|
2390
2612
|
console.log(
|
|
@@ -2395,32 +2617,26 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
2395
2617
|
}
|
|
2396
2618
|
const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
|
|
2397
2619
|
if (routerFilePaths.length === 0) return;
|
|
2620
|
+
const nestedRouterConflict = findNestedRouterConflict(routerFilePaths);
|
|
2621
|
+
if (nestedRouterConflict) {
|
|
2622
|
+
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
2623
|
+
}
|
|
2398
2624
|
for (const routerFilePath of routerFilePaths) {
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
routerSource
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
|
|
2408
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
2409
|
-
if (imported) {
|
|
2410
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2411
|
-
if (!targetFile) continue;
|
|
2412
|
-
result = buildCombinedRouteMapWithSearch(
|
|
2413
|
-
targetFile,
|
|
2414
|
-
imported.exportedName
|
|
2415
|
-
);
|
|
2416
|
-
} else {
|
|
2417
|
-
result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
2625
|
+
const result = buildCombinedRouteMapForRouterFile(routerFilePath);
|
|
2626
|
+
if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
|
|
2627
|
+
let routerSource;
|
|
2628
|
+
try {
|
|
2629
|
+
routerSource = readFileSync2(routerFilePath, "utf-8");
|
|
2630
|
+
} catch {
|
|
2631
|
+
continue;
|
|
2632
|
+
}
|
|
2633
|
+
if (!extractUrlsFromRouter(routerSource)) continue;
|
|
2418
2634
|
}
|
|
2419
2635
|
const routerBasename = pathBasename(routerFilePath).replace(
|
|
2420
2636
|
/\.(tsx?|jsx?)$/,
|
|
2421
2637
|
""
|
|
2422
2638
|
);
|
|
2423
|
-
const outPath =
|
|
2639
|
+
const outPath = join(
|
|
2424
2640
|
dirname2(routerFilePath),
|
|
2425
2641
|
`${routerBasename}.named-routes.gen.ts`
|
|
2426
2642
|
);
|
|
@@ -2439,8 +2655,10 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
2439
2655
|
);
|
|
2440
2656
|
if (existing !== source) {
|
|
2441
2657
|
if (opts?.preserveIfLarger && existing) {
|
|
2442
|
-
const existingCount = (existing
|
|
2443
|
-
const newCount = Object.keys(result.routes).
|
|
2658
|
+
const existingCount = countPublicRouteEntries(existing);
|
|
2659
|
+
const newCount = Object.keys(result.routes).filter(
|
|
2660
|
+
(name) => !isAutoGeneratedRouteName(name)
|
|
2661
|
+
).length;
|
|
2444
2662
|
if (existingCount > newCount) {
|
|
2445
2663
|
continue;
|
|
2446
2664
|
}
|
|
@@ -2548,8 +2766,9 @@ function createVersionPlugin() {
|
|
|
2548
2766
|
let isDev = false;
|
|
2549
2767
|
let server = null;
|
|
2550
2768
|
const clientModuleSignatures = /* @__PURE__ */ new Map();
|
|
2769
|
+
let versionCounter = 0;
|
|
2551
2770
|
const bumpVersion = (reason) => {
|
|
2552
|
-
currentVersion = Date.now().toString(16);
|
|
2771
|
+
currentVersion = Date.now().toString(16) + String(++versionCounter);
|
|
2553
2772
|
console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
|
|
2554
2773
|
const rscEnv = server?.environments?.rsc;
|
|
2555
2774
|
const versionMod = rscEnv?.moduleGraph?.getModuleById(
|
|
@@ -2605,6 +2824,9 @@ function createVersionPlugin() {
|
|
|
2605
2824
|
if (!isDev) return;
|
|
2606
2825
|
const isRscModule = this.environment?.name === "rsc";
|
|
2607
2826
|
if (!isRscModule) return;
|
|
2827
|
+
if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
|
|
2828
|
+
return;
|
|
2829
|
+
}
|
|
2608
2830
|
if (isCodeModule(ctx.file)) {
|
|
2609
2831
|
const filePath = normalizeModuleId(ctx.file);
|
|
2610
2832
|
const previousSignature = clientModuleSignatures.get(filePath);
|
|
@@ -2634,6 +2856,68 @@ function createVersionPlugin() {
|
|
|
2634
2856
|
|
|
2635
2857
|
// src/vite/utils/shared-utils.ts
|
|
2636
2858
|
import * as Vite from "vite";
|
|
2859
|
+
|
|
2860
|
+
// src/vite/plugins/performance-tracks.ts
|
|
2861
|
+
import { readFile } from "node:fs/promises";
|
|
2862
|
+
var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
|
|
2863
|
+
function buildPatchReplacement(match, debugInfoVar) {
|
|
2864
|
+
return `${match}
|
|
2865
|
+
if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
|
|
2866
|
+
var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
|
|
2867
|
+
if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
|
|
2868
|
+
${debugInfoVar} = _resolved._debugInfo;
|
|
2869
|
+
}
|
|
2870
|
+
}`;
|
|
2871
|
+
}
|
|
2872
|
+
function patchRsdwClientDebugInfoRecovery(code) {
|
|
2873
|
+
const match = code.match(RSDW_PATCH_RE);
|
|
2874
|
+
if (!match) {
|
|
2875
|
+
return { code, debugInfoVar: null };
|
|
2876
|
+
}
|
|
2877
|
+
return {
|
|
2878
|
+
code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
|
|
2879
|
+
debugInfoVar: match[2]
|
|
2880
|
+
};
|
|
2881
|
+
}
|
|
2882
|
+
function performanceTracksOptimizeDepsPlugin() {
|
|
2883
|
+
return {
|
|
2884
|
+
name: "@rangojs/router:performance-tracks-optimize-deps",
|
|
2885
|
+
setup(build) {
|
|
2886
|
+
build.onLoad(
|
|
2887
|
+
{
|
|
2888
|
+
filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
|
|
2889
|
+
},
|
|
2890
|
+
async (args) => {
|
|
2891
|
+
const code = await readFile(args.path, "utf8");
|
|
2892
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
2893
|
+
return {
|
|
2894
|
+
contents: patched.code,
|
|
2895
|
+
loader: "js"
|
|
2896
|
+
};
|
|
2897
|
+
}
|
|
2898
|
+
);
|
|
2899
|
+
}
|
|
2900
|
+
};
|
|
2901
|
+
}
|
|
2902
|
+
function performanceTracksPlugin() {
|
|
2903
|
+
return {
|
|
2904
|
+
name: "@rangojs/router:performance-tracks",
|
|
2905
|
+
transform(code, id) {
|
|
2906
|
+
if (!id.includes("react-server-dom") || !id.includes("client")) return;
|
|
2907
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
2908
|
+
if (!patched.debugInfoVar) return;
|
|
2909
|
+
if (process.env.INTERNAL_RANGO_DEBUG)
|
|
2910
|
+
console.log(
|
|
2911
|
+
"[perf-tracks] patched RSDW client (var:",
|
|
2912
|
+
patched.debugInfoVar,
|
|
2913
|
+
")"
|
|
2914
|
+
);
|
|
2915
|
+
return patched.code;
|
|
2916
|
+
}
|
|
2917
|
+
};
|
|
2918
|
+
}
|
|
2919
|
+
|
|
2920
|
+
// src/vite/utils/shared-utils.ts
|
|
2637
2921
|
var versionEsbuildPlugin = {
|
|
2638
2922
|
name: "@rangojs/router-version",
|
|
2639
2923
|
setup(build) {
|
|
@@ -2651,7 +2935,7 @@ var versionEsbuildPlugin = {
|
|
|
2651
2935
|
}
|
|
2652
2936
|
};
|
|
2653
2937
|
var sharedEsbuildOptions = {
|
|
2654
|
-
plugins: [versionEsbuildPlugin]
|
|
2938
|
+
plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
|
|
2655
2939
|
};
|
|
2656
2940
|
function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
2657
2941
|
const virtualModules = {};
|
|
@@ -2684,7 +2968,8 @@ function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
|
2684
2968
|
return virtualModules[virtualId];
|
|
2685
2969
|
}
|
|
2686
2970
|
if (virtualId === VIRTUAL_IDS.rsc && routerPathRef?.path) {
|
|
2687
|
-
const
|
|
2971
|
+
const raw = routerPathRef.path.startsWith(".") ? "/" + routerPathRef.path.slice(2) : routerPathRef.path;
|
|
2972
|
+
const absoluteRouterPath = raw.replaceAll("\\", "/");
|
|
2688
2973
|
return getVirtualEntryRSC(absoluteRouterPath);
|
|
2689
2974
|
}
|
|
2690
2975
|
}
|
|
@@ -2733,11 +3018,11 @@ ${dim} \u2571${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2
|
|
|
2733
3018
|
${dim} ${reset}${bold}\u2551 \u2551${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2727. \u2571${reset}
|
|
2734
3019
|
${dim} ${reset}${bold}\u2554\u2557 \u2551 \u2551 \u2551 \u2551${reset}${dim} * \u2571${reset}
|
|
2735
3020
|
${dim} ${reset}${bold}\u2551\u2551 \u2551 \u2551 \u2551 \u2551 \u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2554\u2550\u2557${reset}${dim} \u2727 \u2726${reset}
|
|
2736
|
-
${dim}
|
|
3021
|
+
${dim} ${reset}${bold}\u2551\u2551 \u2551 \u2560\u2550\u255D \u2551 \u2560\u2566\u255D\u2560\u2550\u2563\u2551\u2551\u2551\u2551 \u2566\u2551 \u2551${reset}${dim} * \u2727${reset}
|
|
2737
3022
|
${dim} ${reset}${bold}\u2551\u255A\u2550\u255D \u2554\u2550\u2550\u2550\u255D \u2569\u255A\u2550\u2569 \u2569\u255D\u255A\u255D\u255A\u2550\u255D\u255A\u2550\u255D${reset}${dim} \u2726 . *${reset}
|
|
2738
3023
|
${dim} ${reset}${bold}\u255A\u2550\u2550\u2557 \u2551${reset}${dim} * RSC Wrangler \u2727 \u2726${reset}
|
|
2739
|
-
${dim} * ${reset}${bold}\u2551 \
|
|
2740
|
-
${bold}\u2550\u2550\u2550\
|
|
3024
|
+
${dim} * ${reset}${bold}\u2551 \u2551${reset}${dim} * \u2727. \u2571${reset}
|
|
3025
|
+
${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
|
|
2741
3026
|
|
|
2742
3027
|
v${version} \xB7 ${preset} \xB7 ${mode}
|
|
2743
3028
|
`;
|
|
@@ -2854,6 +3139,7 @@ function createCjsToEsmPlugin() {
|
|
|
2854
3139
|
|
|
2855
3140
|
// src/vite/router-discovery.ts
|
|
2856
3141
|
import { createServer as createViteServer } from "vite";
|
|
3142
|
+
import { resolve as resolve8 } from "node:path";
|
|
2857
3143
|
import { readFileSync as readFileSync6 } from "node:fs";
|
|
2858
3144
|
|
|
2859
3145
|
// src/vite/plugins/virtual-stub-plugin.ts
|
|
@@ -2881,7 +3167,7 @@ function createVirtualStubPlugin() {
|
|
|
2881
3167
|
}
|
|
2882
3168
|
|
|
2883
3169
|
// src/vite/plugins/client-ref-hashing.ts
|
|
2884
|
-
import { relative
|
|
3170
|
+
import { relative } from "node:path";
|
|
2885
3171
|
import { createHash as createHash2 } from "node:crypto";
|
|
2886
3172
|
var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
|
|
2887
3173
|
var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
|
|
@@ -2894,10 +3180,10 @@ function computeProductionHash(projectRoot, refKey) {
|
|
|
2894
3180
|
const absPath = decodeURIComponent(
|
|
2895
3181
|
refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
|
|
2896
3182
|
);
|
|
2897
|
-
toHash =
|
|
3183
|
+
toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
|
|
2898
3184
|
} else if (refKey.startsWith(FS_PREFIX)) {
|
|
2899
3185
|
const absPath = refKey.slice(FS_PREFIX.length - 1);
|
|
2900
|
-
toHash =
|
|
3186
|
+
toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
|
|
2901
3187
|
} else if (refKey.startsWith("/")) {
|
|
2902
3188
|
toHash = refKey.slice(1);
|
|
2903
3189
|
} else {
|
|
@@ -3036,8 +3322,8 @@ function createDiscoveryState(entryPath, opts) {
|
|
|
3036
3322
|
perRouterTrieMap: /* @__PURE__ */ new Map(),
|
|
3037
3323
|
perRouterPrecomputedMap: /* @__PURE__ */ new Map(),
|
|
3038
3324
|
perRouterManifestDataMap: /* @__PURE__ */ new Map(),
|
|
3039
|
-
|
|
3040
|
-
|
|
3325
|
+
prerenderManifestEntries: null,
|
|
3326
|
+
staticManifestEntries: null,
|
|
3041
3327
|
handlerChunkInfo: null,
|
|
3042
3328
|
staticHandlerChunkInfo: null,
|
|
3043
3329
|
rscEntryFileName: null,
|
|
@@ -3122,8 +3408,17 @@ function jsonParseExpression(value) {
|
|
|
3122
3408
|
}
|
|
3123
3409
|
|
|
3124
3410
|
// src/context-var.ts
|
|
3411
|
+
var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
|
|
3412
|
+
"rango:non-cacheable-keys"
|
|
3413
|
+
);
|
|
3414
|
+
function getNonCacheableKeys(variables) {
|
|
3415
|
+
if (!variables[NON_CACHEABLE_KEYS]) {
|
|
3416
|
+
variables[NON_CACHEABLE_KEYS] = /* @__PURE__ */ new Set();
|
|
3417
|
+
}
|
|
3418
|
+
return variables[NON_CACHEABLE_KEYS];
|
|
3419
|
+
}
|
|
3125
3420
|
var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
3126
|
-
function contextSet(variables, keyOrVar, value) {
|
|
3421
|
+
function contextSet(variables, keyOrVar, value, options) {
|
|
3127
3422
|
if (typeof keyOrVar === "string") {
|
|
3128
3423
|
if (FORBIDDEN_KEYS.has(keyOrVar)) {
|
|
3129
3424
|
throw new Error(
|
|
@@ -3131,18 +3426,46 @@ function contextSet(variables, keyOrVar, value) {
|
|
|
3131
3426
|
);
|
|
3132
3427
|
}
|
|
3133
3428
|
variables[keyOrVar] = value;
|
|
3429
|
+
if (options?.cache === false) {
|
|
3430
|
+
getNonCacheableKeys(variables).add(keyOrVar);
|
|
3431
|
+
}
|
|
3134
3432
|
} else {
|
|
3135
3433
|
variables[keyOrVar.key] = value;
|
|
3434
|
+
if (options?.cache === false) {
|
|
3435
|
+
getNonCacheableKeys(variables).add(keyOrVar.key);
|
|
3436
|
+
}
|
|
3136
3437
|
}
|
|
3137
3438
|
}
|
|
3138
3439
|
|
|
3139
3440
|
// src/vite/utils/prerender-utils.ts
|
|
3441
|
+
import { createHash as createHash4 } from "node:crypto";
|
|
3442
|
+
import {
|
|
3443
|
+
copyFileSync,
|
|
3444
|
+
existsSync as existsSync4,
|
|
3445
|
+
mkdirSync,
|
|
3446
|
+
rmSync,
|
|
3447
|
+
statSync,
|
|
3448
|
+
writeFileSync as writeFileSync2
|
|
3449
|
+
} from "node:fs";
|
|
3450
|
+
import { resolve as resolve5 } from "node:path";
|
|
3140
3451
|
function escapeRegExp2(str) {
|
|
3141
3452
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3142
3453
|
}
|
|
3143
3454
|
function encodePathParam(value) {
|
|
3144
3455
|
return String(value).split("/").map((segment) => encodeURIComponent(segment)).join("/");
|
|
3145
3456
|
}
|
|
3457
|
+
function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
3458
|
+
let result = pattern;
|
|
3459
|
+
for (const [key, value] of Object.entries(params)) {
|
|
3460
|
+
const escaped = escapeRegExp2(key);
|
|
3461
|
+
result = result.replace(
|
|
3462
|
+
new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
|
|
3463
|
+
encode(value)
|
|
3464
|
+
);
|
|
3465
|
+
result = result.replace(`*${key}`, encode(value));
|
|
3466
|
+
}
|
|
3467
|
+
return result;
|
|
3468
|
+
}
|
|
3146
3469
|
async function runWithConcurrency(items, concurrency, fn) {
|
|
3147
3470
|
const limit = Math.max(1, Math.min(concurrency, items.length));
|
|
3148
3471
|
if (limit <= 1) {
|
|
@@ -3203,6 +3526,37 @@ function notifyOnError(registry, error, phase, routeKey, pathname, skipped) {
|
|
|
3203
3526
|
break;
|
|
3204
3527
|
}
|
|
3205
3528
|
}
|
|
3529
|
+
function getStagedAssetDir(projectRoot) {
|
|
3530
|
+
return resolve5(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
|
|
3531
|
+
}
|
|
3532
|
+
function resetStagedBuildAssets(projectRoot) {
|
|
3533
|
+
rmSync(getStagedAssetDir(projectRoot), { recursive: true, force: true });
|
|
3534
|
+
}
|
|
3535
|
+
function stageBuildAssetModule(projectRoot, prefix, exportValue) {
|
|
3536
|
+
const stagedDir = getStagedAssetDir(projectRoot);
|
|
3537
|
+
mkdirSync(stagedDir, { recursive: true });
|
|
3538
|
+
const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
|
|
3539
|
+
const fileName = `${prefix}-${contentHash}.js`;
|
|
3540
|
+
const filePath = resolve5(stagedDir, fileName);
|
|
3541
|
+
if (!existsSync4(filePath)) {
|
|
3542
|
+
writeFileSync2(filePath, `export default ${exportValue};
|
|
3543
|
+
`);
|
|
3544
|
+
}
|
|
3545
|
+
return fileName;
|
|
3546
|
+
}
|
|
3547
|
+
function copyStagedBuildAssets(projectRoot, fileNames) {
|
|
3548
|
+
const stagedDir = getStagedAssetDir(projectRoot);
|
|
3549
|
+
const distAssetsDir = resolve5(projectRoot, "dist/rsc/assets");
|
|
3550
|
+
mkdirSync(distAssetsDir, { recursive: true });
|
|
3551
|
+
let totalBytes = 0;
|
|
3552
|
+
for (const fileName of new Set(fileNames)) {
|
|
3553
|
+
const stagedPath = resolve5(stagedDir, fileName);
|
|
3554
|
+
const distPath = resolve5(distAssetsDir, fileName);
|
|
3555
|
+
copyFileSync(stagedPath, distPath);
|
|
3556
|
+
totalBytes += statSync(stagedPath).size;
|
|
3557
|
+
}
|
|
3558
|
+
return totalBytes;
|
|
3559
|
+
}
|
|
3206
3560
|
|
|
3207
3561
|
// src/vite/discovery/prerender-collection.ts
|
|
3208
3562
|
async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
@@ -3215,18 +3569,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3215
3569
|
const getParamsReverse = (name, params) => {
|
|
3216
3570
|
const pattern = allRoutes[name];
|
|
3217
3571
|
if (!pattern) throw new Error(`Unknown route: "${name}"`);
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
for (const [key, value] of Object.entries(params)) {
|
|
3221
|
-
const escaped = escapeRegExp2(key);
|
|
3222
|
-
result = result.replace(
|
|
3223
|
-
new RegExp(`:${escaped}(\\([^)]*\\))?`),
|
|
3224
|
-
encodeURIComponent(value)
|
|
3225
|
-
);
|
|
3226
|
-
result = result.replace(`*${key}`, encodeURIComponent(value));
|
|
3227
|
-
}
|
|
3228
|
-
}
|
|
3229
|
-
return result;
|
|
3572
|
+
if (!params) return pattern;
|
|
3573
|
+
return substituteRouteParams(pattern, params);
|
|
3230
3574
|
};
|
|
3231
3575
|
for (const { manifest } of allManifests) {
|
|
3232
3576
|
if (!manifest.prerenderRoutes) continue;
|
|
@@ -3234,15 +3578,17 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3234
3578
|
for (const routeName of manifest.prerenderRoutes) {
|
|
3235
3579
|
const pattern = manifest.routeManifest[routeName];
|
|
3236
3580
|
if (!pattern) continue;
|
|
3581
|
+
const def = defs[routeName];
|
|
3582
|
+
const isPassthroughRoute = !!def?.options?.passthrough;
|
|
3237
3583
|
const hasDynamic = pattern.includes(":") || pattern.includes("*");
|
|
3238
3584
|
if (!hasDynamic) {
|
|
3239
3585
|
entries.push({
|
|
3240
3586
|
urlPath: pattern.replace(/\/$/, "") || "/",
|
|
3241
3587
|
routeName,
|
|
3242
|
-
concurrency: 1
|
|
3588
|
+
concurrency: 1,
|
|
3589
|
+
isPassthroughRoute
|
|
3243
3590
|
});
|
|
3244
3591
|
} else {
|
|
3245
|
-
const def = defs[routeName];
|
|
3246
3592
|
if (def?.getParams) {
|
|
3247
3593
|
try {
|
|
3248
3594
|
const buildVars = {};
|
|
@@ -3257,18 +3603,11 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3257
3603
|
const concurrency = def.options?.concurrency ?? 1;
|
|
3258
3604
|
const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
|
|
3259
3605
|
for (const params of paramsList) {
|
|
3260
|
-
let url =
|
|
3261
|
-
|
|
3262
|
-
params
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
const escaped = escapeRegExp2(key);
|
|
3266
|
-
url = url.replace(
|
|
3267
|
-
new RegExp(`:${escaped}(\\([^)]*\\))?`),
|
|
3268
|
-
encoded
|
|
3269
|
-
);
|
|
3270
|
-
url = url.replace(`*${key}`, encoded);
|
|
3271
|
-
}
|
|
3606
|
+
let url = substituteRouteParams(
|
|
3607
|
+
pattern,
|
|
3608
|
+
params,
|
|
3609
|
+
encodePathParam
|
|
3610
|
+
);
|
|
3272
3611
|
if (url.includes("*")) {
|
|
3273
3612
|
const wildcardValue = params["*"] ?? params.splat;
|
|
3274
3613
|
if (wildcardValue !== void 0) {
|
|
@@ -3279,7 +3618,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3279
3618
|
urlPath: url.replace(/\/$/, "") || "/",
|
|
3280
3619
|
routeName,
|
|
3281
3620
|
concurrency,
|
|
3282
|
-
...hasBuildVars ? { buildVars } : {}
|
|
3621
|
+
...hasBuildVars ? { buildVars } : {},
|
|
3622
|
+
isPassthroughRoute
|
|
3283
3623
|
});
|
|
3284
3624
|
}
|
|
3285
3625
|
} catch (err) {
|
|
@@ -3318,7 +3658,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3318
3658
|
`[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
|
|
3319
3659
|
);
|
|
3320
3660
|
const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
|
|
3321
|
-
const
|
|
3661
|
+
const manifestEntries = {};
|
|
3322
3662
|
let doneCount = 0;
|
|
3323
3663
|
let skipCount = 0;
|
|
3324
3664
|
const startTotal = performance.now();
|
|
@@ -3335,22 +3675,43 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3335
3675
|
const result = await routerInstance.matchForPrerender(
|
|
3336
3676
|
entry.urlPath,
|
|
3337
3677
|
{},
|
|
3338
|
-
entry.buildVars
|
|
3678
|
+
entry.buildVars,
|
|
3679
|
+
entry.isPassthroughRoute
|
|
3339
3680
|
);
|
|
3340
3681
|
if (!result) continue;
|
|
3682
|
+
if (result.passthrough) {
|
|
3683
|
+
const elapsed2 = (performance.now() - startUrl).toFixed(0);
|
|
3684
|
+
console.log(
|
|
3685
|
+
`[rsc-router] PASS ${entry.urlPath.padEnd(40)} (${elapsed2}ms) - live fallback`
|
|
3686
|
+
);
|
|
3687
|
+
doneCount++;
|
|
3688
|
+
break;
|
|
3689
|
+
}
|
|
3341
3690
|
const paramHash = hashParams(result.params || {});
|
|
3342
|
-
|
|
3691
|
+
const mainKey = `${result.routeName}/${paramHash}`;
|
|
3692
|
+
const mainValue = JSON.stringify({
|
|
3343
3693
|
segments: result.segments,
|
|
3344
3694
|
handles: result.handles
|
|
3345
|
-
};
|
|
3695
|
+
});
|
|
3696
|
+
manifestEntries[mainKey] = stageBuildAssetModule(
|
|
3697
|
+
state.projectRoot,
|
|
3698
|
+
"__pr",
|
|
3699
|
+
mainValue
|
|
3700
|
+
);
|
|
3346
3701
|
if (result.interceptSegments?.length) {
|
|
3347
|
-
|
|
3702
|
+
const interceptKey = `${result.routeName}/${paramHash}/i`;
|
|
3703
|
+
const interceptValue = JSON.stringify({
|
|
3348
3704
|
segments: [...result.segments, ...result.interceptSegments],
|
|
3349
3705
|
handles: {
|
|
3350
3706
|
...result.handles,
|
|
3351
3707
|
...result.interceptHandles || {}
|
|
3352
3708
|
}
|
|
3353
|
-
};
|
|
3709
|
+
});
|
|
3710
|
+
manifestEntries[interceptKey] = stageBuildAssetModule(
|
|
3711
|
+
state.projectRoot,
|
|
3712
|
+
"__pr",
|
|
3713
|
+
interceptValue
|
|
3714
|
+
);
|
|
3354
3715
|
}
|
|
3355
3716
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
3356
3717
|
console.log(
|
|
@@ -3394,7 +3755,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3394
3755
|
}
|
|
3395
3756
|
const totalElapsed = (performance.now() - startTotal).toFixed(0);
|
|
3396
3757
|
if (doneCount > 0) {
|
|
3397
|
-
state.
|
|
3758
|
+
state.prerenderManifestEntries = manifestEntries;
|
|
3398
3759
|
}
|
|
3399
3760
|
const parts = [`${doneCount} done`];
|
|
3400
3761
|
if (skipCount > 0) parts.push(`${skipCount} skipped`);
|
|
@@ -3405,7 +3766,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3405
3766
|
async function renderStaticHandlers(state, rscEnv, registry) {
|
|
3406
3767
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
|
|
3407
3768
|
return;
|
|
3408
|
-
const
|
|
3769
|
+
const manifestEntries = {};
|
|
3409
3770
|
let staticDone = 0;
|
|
3410
3771
|
let staticSkip = 0;
|
|
3411
3772
|
let totalStaticCount = 0;
|
|
@@ -3442,7 +3803,13 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3442
3803
|
def.$$routePrefix
|
|
3443
3804
|
);
|
|
3444
3805
|
if (result) {
|
|
3445
|
-
|
|
3806
|
+
const hasHandles = Object.keys(result.handles).length > 0;
|
|
3807
|
+
const exportValue = hasHandles ? JSON.stringify(result) : JSON.stringify(result.encoded);
|
|
3808
|
+
manifestEntries[def.$$id] = stageBuildAssetModule(
|
|
3809
|
+
state.projectRoot,
|
|
3810
|
+
"__st",
|
|
3811
|
+
exportValue
|
|
3812
|
+
);
|
|
3446
3813
|
const elapsed = (performance.now() - startHandler).toFixed(0);
|
|
3447
3814
|
console.log(
|
|
3448
3815
|
`[rsc-router] OK ${name.padEnd(40)} (${elapsed}ms)`
|
|
@@ -3479,7 +3846,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3479
3846
|
}
|
|
3480
3847
|
const totalStaticElapsed = (performance.now() - startStatic).toFixed(0);
|
|
3481
3848
|
if (staticDone > 0) {
|
|
3482
|
-
state.
|
|
3849
|
+
state.staticManifestEntries = manifestEntries;
|
|
3483
3850
|
}
|
|
3484
3851
|
const staticParts = [`${staticDone} done`];
|
|
3485
3852
|
if (staticSkip > 0) staticParts.push(`${staticSkip} skipped`);
|
|
@@ -3496,8 +3863,7 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3496
3863
|
let registry = serverMod.RouterRegistry;
|
|
3497
3864
|
if (!registry || registry.size === 0) {
|
|
3498
3865
|
try {
|
|
3499
|
-
const
|
|
3500
|
-
const hostRegistry = hostMod.HostRouterRegistry;
|
|
3866
|
+
const hostRegistry = serverMod.HostRouterRegistry;
|
|
3501
3867
|
if (hostRegistry && hostRegistry.size > 0) {
|
|
3502
3868
|
console.log(
|
|
3503
3869
|
`[rsc-router] Found ${hostRegistry.size} host router(s), resolving lazy handlers...`
|
|
@@ -3537,12 +3903,20 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3537
3903
|
}
|
|
3538
3904
|
const buildMod = await rscEnv.runner.import("@rangojs/router/build");
|
|
3539
3905
|
const generateManifestFull = buildMod.generateManifestFull;
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3906
|
+
const nestedRouterConflict = findNestedRouterConflict(
|
|
3907
|
+
[...registry.values()].map((router) => router.__sourceFile).filter(
|
|
3908
|
+
(sourceFile) => typeof sourceFile === "string"
|
|
3909
|
+
)
|
|
3910
|
+
);
|
|
3911
|
+
if (nestedRouterConflict) {
|
|
3912
|
+
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
3913
|
+
}
|
|
3914
|
+
const newMergedRouteManifest = {};
|
|
3915
|
+
const newMergedPrecomputedEntries = [];
|
|
3916
|
+
const newPerRouterManifests = [];
|
|
3917
|
+
const newPerRouterManifestDataMap = /* @__PURE__ */ new Map();
|
|
3918
|
+
const newPerRouterPrecomputedMap = /* @__PURE__ */ new Map();
|
|
3919
|
+
const newPerRouterTrieMap = /* @__PURE__ */ new Map();
|
|
3546
3920
|
let mergedRouteAncestry = {};
|
|
3547
3921
|
let mergedRouteTrailingSlash = {};
|
|
3548
3922
|
let routerMountIndex = 0;
|
|
@@ -3551,7 +3925,11 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3551
3925
|
if (!router.urlpatterns || !generateManifestFull) {
|
|
3552
3926
|
continue;
|
|
3553
3927
|
}
|
|
3554
|
-
const manifest = generateManifestFull(
|
|
3928
|
+
const manifest = generateManifestFull(
|
|
3929
|
+
router.urlpatterns,
|
|
3930
|
+
routerMountIndex,
|
|
3931
|
+
router.__basename ? { urlPrefix: router.__basename } : void 0
|
|
3932
|
+
);
|
|
3555
3933
|
routerMountIndex++;
|
|
3556
3934
|
allManifests.push({ id, manifest });
|
|
3557
3935
|
const routeCount = Object.keys(manifest.routeManifest).length;
|
|
@@ -3559,7 +3937,7 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3559
3937
|
(p) => !p.includes(":") && !p.includes("*")
|
|
3560
3938
|
).length;
|
|
3561
3939
|
const dynamicRoutes = routeCount - staticRoutes;
|
|
3562
|
-
Object.assign(
|
|
3940
|
+
Object.assign(newMergedRouteManifest, manifest.routeManifest);
|
|
3563
3941
|
let factoryOnlyPrefixes;
|
|
3564
3942
|
if (router.__sourceFile) {
|
|
3565
3943
|
const staticParsed = buildCombinedRouteMapForRouterFile(
|
|
@@ -3577,7 +3955,7 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3577
3955
|
}
|
|
3578
3956
|
if (factoryOnlyPrefixes.size === 0) factoryOnlyPrefixes = void 0;
|
|
3579
3957
|
}
|
|
3580
|
-
|
|
3958
|
+
newPerRouterManifests.push({
|
|
3581
3959
|
id,
|
|
3582
3960
|
routeManifest: manifest.routeManifest,
|
|
3583
3961
|
routeSearchSchemas: manifest.routeSearchSchemas,
|
|
@@ -3593,16 +3971,16 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3593
3971
|
flattenLeafEntries(
|
|
3594
3972
|
manifest.prefixTree,
|
|
3595
3973
|
manifest.routeManifest,
|
|
3596
|
-
|
|
3974
|
+
newMergedPrecomputedEntries
|
|
3597
3975
|
);
|
|
3598
|
-
|
|
3976
|
+
newPerRouterManifestDataMap.set(id, manifest.routeManifest);
|
|
3599
3977
|
const routerPrecomputed = [];
|
|
3600
3978
|
flattenLeafEntries(
|
|
3601
3979
|
manifest.prefixTree,
|
|
3602
3980
|
manifest.routeManifest,
|
|
3603
3981
|
routerPrecomputed
|
|
3604
3982
|
);
|
|
3605
|
-
|
|
3983
|
+
newPerRouterPrecomputedMap.set(id, routerPrecomputed);
|
|
3606
3984
|
console.log(
|
|
3607
3985
|
`[rsc-router] Router "${id}" -> ${routeCount} routes (${staticRoutes} static, ${dynamicRoutes} dynamic)`
|
|
3608
3986
|
);
|
|
@@ -3617,7 +3995,8 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3617
3995
|
);
|
|
3618
3996
|
}
|
|
3619
3997
|
}
|
|
3620
|
-
|
|
3998
|
+
let newMergedRouteTrie = null;
|
|
3999
|
+
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
3621
4000
|
const buildRouteTrie = buildMod.buildRouteTrie;
|
|
3622
4001
|
if (buildRouteTrie && mergedRouteAncestry) {
|
|
3623
4002
|
const routeToStaticPrefix = {};
|
|
@@ -3647,8 +4026,8 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3647
4026
|
Object.assign(mergedResponseTypeRoutes, manifest.responseTypeRoutes);
|
|
3648
4027
|
}
|
|
3649
4028
|
}
|
|
3650
|
-
|
|
3651
|
-
|
|
4029
|
+
newMergedRouteTrie = buildRouteTrie(
|
|
4030
|
+
newMergedRouteManifest,
|
|
3652
4031
|
mergedRouteAncestry,
|
|
3653
4032
|
routeToStaticPrefix,
|
|
3654
4033
|
Object.keys(mergedRouteTrailingSlash).length > 0 ? mergedRouteTrailingSlash : void 0,
|
|
@@ -3675,22 +4054,29 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3675
4054
|
perRouterPassthroughNames && perRouterPassthroughNames.size > 0 ? perRouterPassthroughNames : void 0,
|
|
3676
4055
|
manifest.responseTypeRoutes && Object.keys(manifest.responseTypeRoutes).length > 0 ? manifest.responseTypeRoutes : void 0
|
|
3677
4056
|
);
|
|
3678
|
-
|
|
4057
|
+
newPerRouterTrieMap.set(id, perRouterTrie);
|
|
3679
4058
|
}
|
|
3680
4059
|
}
|
|
3681
4060
|
}
|
|
4061
|
+
state.mergedRouteManifest = newMergedRouteManifest;
|
|
4062
|
+
state.mergedPrecomputedEntries = newMergedPrecomputedEntries;
|
|
4063
|
+
state.perRouterManifests = newPerRouterManifests;
|
|
4064
|
+
state.perRouterManifestDataMap = newPerRouterManifestDataMap;
|
|
4065
|
+
state.perRouterPrecomputedMap = newPerRouterPrecomputedMap;
|
|
4066
|
+
state.perRouterTrieMap = newPerRouterTrieMap;
|
|
4067
|
+
state.mergedRouteTrie = newMergedRouteTrie;
|
|
3682
4068
|
await expandPrerenderRoutes(state, rscEnv, registry, allManifests);
|
|
3683
4069
|
await renderStaticHandlers(state, rscEnv, registry);
|
|
3684
4070
|
return serverMod;
|
|
3685
4071
|
}
|
|
3686
4072
|
|
|
3687
4073
|
// src/vite/discovery/route-types-writer.ts
|
|
3688
|
-
import { dirname as dirname3, basename, join as
|
|
3689
|
-
import { readFileSync as readFileSync4, writeFileSync as
|
|
4074
|
+
import { dirname as dirname3, basename, join as join2, resolve as resolve6 } from "node:path";
|
|
4075
|
+
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
|
|
3690
4076
|
function filterUserNamedRoutes(manifest) {
|
|
3691
4077
|
const filtered = {};
|
|
3692
4078
|
for (const [name, pattern] of Object.entries(manifest)) {
|
|
3693
|
-
if (!name
|
|
4079
|
+
if (!isAutoGeneratedRouteName(name)) {
|
|
3694
4080
|
filtered[name] = pattern;
|
|
3695
4081
|
}
|
|
3696
4082
|
}
|
|
@@ -3706,7 +4092,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
|
|
|
3706
4092
|
/\.(tsx?|jsx?)$/,
|
|
3707
4093
|
""
|
|
3708
4094
|
);
|
|
3709
|
-
const outPath =
|
|
4095
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3710
4096
|
try {
|
|
3711
4097
|
preContent.set(outPath, readFileSync4(outPath, "utf-8"));
|
|
3712
4098
|
} catch {
|
|
@@ -3719,8 +4105,8 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
|
|
|
3719
4105
|
/\.(tsx?|jsx?)$/,
|
|
3720
4106
|
""
|
|
3721
4107
|
);
|
|
3722
|
-
const outPath =
|
|
3723
|
-
if (!
|
|
4108
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
4109
|
+
if (!existsSync5(outPath)) continue;
|
|
3724
4110
|
try {
|
|
3725
4111
|
const content = readFileSync4(outPath, "utf-8");
|
|
3726
4112
|
if (content !== preContent.get(outPath)) {
|
|
@@ -3734,10 +4120,10 @@ function writeRouteTypesFiles(state) {
|
|
|
3734
4120
|
if (state.perRouterManifests.length === 0) return;
|
|
3735
4121
|
try {
|
|
3736
4122
|
const entryDir = dirname3(
|
|
3737
|
-
|
|
4123
|
+
resolve6(state.projectRoot, state.resolvedEntryPath)
|
|
3738
4124
|
);
|
|
3739
|
-
const oldCombinedPath =
|
|
3740
|
-
if (
|
|
4125
|
+
const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
|
|
4126
|
+
if (existsSync5(oldCombinedPath)) {
|
|
3741
4127
|
unlinkSync2(oldCombinedPath);
|
|
3742
4128
|
console.log(
|
|
3743
4129
|
`[rsc-router] Removed stale combined route types: ${oldCombinedPath}`
|
|
@@ -3761,7 +4147,7 @@ Set an explicit \`id\` on createRouter() or check the call site.`
|
|
|
3761
4147
|
}
|
|
3762
4148
|
const routerDir = dirname3(sourceFile);
|
|
3763
4149
|
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
3764
|
-
const outPath =
|
|
4150
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3765
4151
|
const userRoutes = filterUserNamedRoutes(routeManifest);
|
|
3766
4152
|
let effectiveSearchSchemas = routeSearchSchemas;
|
|
3767
4153
|
if ((!effectiveSearchSchemas || Object.keys(effectiveSearchSchemas).length === 0) && sourceFile) {
|
|
@@ -3781,10 +4167,10 @@ Set an explicit \`id\` on createRouter() or check the call site.`
|
|
|
3781
4167
|
userRoutes,
|
|
3782
4168
|
effectiveSearchSchemas && Object.keys(effectiveSearchSchemas).length > 0 ? effectiveSearchSchemas : void 0
|
|
3783
4169
|
);
|
|
3784
|
-
const existing =
|
|
4170
|
+
const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
|
|
3785
4171
|
if (existing !== source) {
|
|
3786
4172
|
markSelfGenWrite(state, outPath, source);
|
|
3787
|
-
|
|
4173
|
+
writeFileSync3(outPath, source);
|
|
3788
4174
|
console.log(`[rsc-router] Generated route types -> ${outPath}`);
|
|
3789
4175
|
}
|
|
3790
4176
|
}
|
|
@@ -3813,7 +4199,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
|
|
|
3813
4199
|
...staticParsed.searchSchemas
|
|
3814
4200
|
};
|
|
3815
4201
|
for (const [name, pattern] of Object.entries(routeManifest)) {
|
|
3816
|
-
if (name
|
|
4202
|
+
if (isAutoGeneratedRouteName(name)) continue;
|
|
3817
4203
|
const dotIdx = name.indexOf(".");
|
|
3818
4204
|
if (dotIdx <= 0) continue;
|
|
3819
4205
|
const prefix = name.substring(0, dotIdx + 1);
|
|
@@ -3826,21 +4212,21 @@ function supplementGenFilesWithRuntimeRoutes(state) {
|
|
|
3826
4212
|
}
|
|
3827
4213
|
const routerDir = dirname3(sourceFile);
|
|
3828
4214
|
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
3829
|
-
const outPath =
|
|
4215
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3830
4216
|
const source = generateRouteTypesSource(
|
|
3831
4217
|
mergedRoutes,
|
|
3832
4218
|
Object.keys(mergedSearchSchemas).length > 0 ? mergedSearchSchemas : void 0
|
|
3833
4219
|
);
|
|
3834
|
-
const existing =
|
|
4220
|
+
const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
|
|
3835
4221
|
if (existing !== source) {
|
|
3836
4222
|
markSelfGenWrite(state, outPath, source);
|
|
3837
|
-
|
|
4223
|
+
writeFileSync3(outPath, source);
|
|
3838
4224
|
}
|
|
3839
4225
|
}
|
|
3840
4226
|
}
|
|
3841
4227
|
|
|
3842
4228
|
// src/vite/discovery/virtual-module-codegen.ts
|
|
3843
|
-
import { dirname as dirname4, basename as basename2, join as
|
|
4229
|
+
import { dirname as dirname4, basename as basename2, join as join3 } from "node:path";
|
|
3844
4230
|
function generateRoutesManifestModule(state) {
|
|
3845
4231
|
const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
|
|
3846
4232
|
if (hasManifest) {
|
|
@@ -3855,10 +4241,10 @@ function generateRoutesManifestModule(state) {
|
|
|
3855
4241
|
/\.(tsx?|jsx?)$/,
|
|
3856
4242
|
""
|
|
3857
4243
|
);
|
|
3858
|
-
const genPath =
|
|
4244
|
+
const genPath = join3(
|
|
3859
4245
|
routerDir,
|
|
3860
4246
|
`${routerBasename}.named-routes.gen.js`
|
|
3861
|
-
);
|
|
4247
|
+
).replaceAll("\\", "/");
|
|
3862
4248
|
const varName = `_r${varIdx++}`;
|
|
3863
4249
|
genFileImports.push(
|
|
3864
4250
|
`import { NamedRoutes as ${varName} } from ${JSON.stringify(genPath)};`
|
|
@@ -3952,7 +4338,10 @@ function generatePerRouterModule(state, routerId) {
|
|
|
3952
4338
|
/\.(tsx?|jsx?)$/,
|
|
3953
4339
|
""
|
|
3954
4340
|
);
|
|
3955
|
-
const genPath =
|
|
4341
|
+
const genPath = join3(
|
|
4342
|
+
routerDir,
|
|
4343
|
+
`${routerBasename}.named-routes.gen.js`
|
|
4344
|
+
).replaceAll("\\", "/");
|
|
3956
4345
|
lines.push(`import { NamedRoutes as _r } from ${JSON.stringify(genPath)};`);
|
|
3957
4346
|
lines.push(
|
|
3958
4347
|
`function __flat(r) { const o = {}; for (const [k, v] of Object.entries(r)) o[k] = typeof v === "string" ? v : v.path; return o; }`
|
|
@@ -3976,14 +4365,13 @@ function generatePerRouterModule(state, routerId) {
|
|
|
3976
4365
|
}
|
|
3977
4366
|
|
|
3978
4367
|
// src/vite/discovery/bundle-postprocess.ts
|
|
3979
|
-
import { resolve as
|
|
3980
|
-
import {
|
|
3981
|
-
import { readFileSync as readFileSync5, writeFileSync as writeFileSync3, existsSync as existsSync5, mkdirSync } from "node:fs";
|
|
4368
|
+
import { resolve as resolve7 } from "node:path";
|
|
4369
|
+
import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6 } from "node:fs";
|
|
3982
4370
|
function postprocessBundle(state) {
|
|
3983
|
-
const hasPrerenderData = state.
|
|
3984
|
-
const hasStaticData = state.
|
|
4371
|
+
const hasPrerenderData = state.prerenderManifestEntries && Object.keys(state.prerenderManifestEntries).length > 0;
|
|
4372
|
+
const hasStaticData = state.staticManifestEntries && Object.keys(state.staticManifestEntries).length > 0;
|
|
3985
4373
|
if (!hasPrerenderData && !hasStaticData) return;
|
|
3986
|
-
const rscEntryPath =
|
|
4374
|
+
const rscEntryPath = resolve7(
|
|
3987
4375
|
state.projectRoot,
|
|
3988
4376
|
"dist/rsc",
|
|
3989
4377
|
state.rscEntryFileName ?? "index.js"
|
|
@@ -4004,7 +4392,7 @@ function postprocessBundle(state) {
|
|
|
4004
4392
|
];
|
|
4005
4393
|
for (const target of evictionTargets) {
|
|
4006
4394
|
if (!target.info) continue;
|
|
4007
|
-
const chunkPath =
|
|
4395
|
+
const chunkPath = resolve7(
|
|
4008
4396
|
state.projectRoot,
|
|
4009
4397
|
"dist/rsc",
|
|
4010
4398
|
target.info.fileName
|
|
@@ -4018,7 +4406,7 @@ function postprocessBundle(state) {
|
|
|
4018
4406
|
target.brand
|
|
4019
4407
|
);
|
|
4020
4408
|
if (result) {
|
|
4021
|
-
|
|
4409
|
+
writeFileSync4(chunkPath, result.code);
|
|
4022
4410
|
const savedKB = (result.savedBytes / 1024).toFixed(1);
|
|
4023
4411
|
console.log(
|
|
4024
4412
|
`[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${target.info.fileName}`
|
|
@@ -4032,44 +4420,38 @@ function postprocessBundle(state) {
|
|
|
4032
4420
|
}
|
|
4033
4421
|
state.handlerChunkInfo = null;
|
|
4034
4422
|
state.staticHandlerChunkInfo = null;
|
|
4035
|
-
if (hasPrerenderData &&
|
|
4423
|
+
if (hasPrerenderData && existsSync6(rscEntryPath)) {
|
|
4036
4424
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4037
|
-
if (!rscCode.includes("
|
|
4425
|
+
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
4038
4426
|
try {
|
|
4039
|
-
|
|
4040
|
-
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
|
|
4427
|
+
let totalBytes = copyStagedBuildAssets(
|
|
4428
|
+
state.projectRoot,
|
|
4429
|
+
Object.values(state.prerenderManifestEntries)
|
|
4430
|
+
);
|
|
4431
|
+
const manifestMap = {};
|
|
4432
|
+
for (const [key, assetFileName] of Object.entries(
|
|
4433
|
+
state.prerenderManifestEntries
|
|
4045
4434
|
)) {
|
|
4046
|
-
|
|
4047
|
-
const contentHash = createHash4("sha256").update(entryJson).digest("hex").slice(0, 8);
|
|
4048
|
-
const assetFileName = `__pr-${contentHash}.js`;
|
|
4049
|
-
const assetPath = resolve6(assetsDir, assetFileName);
|
|
4050
|
-
const assetCode = `export default ${entryJson};
|
|
4051
|
-
`;
|
|
4052
|
-
writeFileSync3(assetPath, assetCode);
|
|
4053
|
-
totalBytes += Buffer.byteLength(assetCode);
|
|
4054
|
-
manifestEntries.push(
|
|
4055
|
-
`${JSON.stringify(key)}:()=>import("./assets/${assetFileName}")`
|
|
4056
|
-
);
|
|
4435
|
+
manifestMap[key] = `./assets/${assetFileName}`;
|
|
4057
4436
|
}
|
|
4058
|
-
const manifestCode =
|
|
4059
|
-
|
|
4060
|
-
|
|
4437
|
+
const manifestCode = [
|
|
4438
|
+
`const m=JSON.parse('${JSON.stringify(manifestMap).replace(/'/g, "\\'")}');`,
|
|
4439
|
+
`export function loadPrerenderAsset(s){return import(s)}`,
|
|
4440
|
+
`export default m;`,
|
|
4441
|
+
""
|
|
4442
|
+
].join("\n");
|
|
4443
|
+
const manifestPath = resolve7(
|
|
4061
4444
|
state.projectRoot,
|
|
4062
4445
|
"dist/rsc/__prerender-manifest.js"
|
|
4063
4446
|
);
|
|
4064
|
-
|
|
4447
|
+
writeFileSync4(manifestPath, manifestCode);
|
|
4065
4448
|
totalBytes += Buffer.byteLength(manifestCode);
|
|
4066
|
-
const injection = `
|
|
4067
|
-
globalThis.__PRERENDER_MANIFEST = __pm;
|
|
4449
|
+
const injection = `globalThis.__loadPrerenderManifestModule = () => import("./__prerender-manifest.js");
|
|
4068
4450
|
`;
|
|
4069
|
-
|
|
4451
|
+
writeFileSync4(rscEntryPath, injection + rscCode);
|
|
4070
4452
|
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
4071
4453
|
console.log(
|
|
4072
|
-
`[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.
|
|
4454
|
+
`[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderManifestEntries).length} entries)`
|
|
4073
4455
|
);
|
|
4074
4456
|
} catch (err) {
|
|
4075
4457
|
throw new Error(
|
|
@@ -4078,44 +4460,36 @@ globalThis.__PRERENDER_MANIFEST = __pm;
|
|
|
4078
4460
|
}
|
|
4079
4461
|
}
|
|
4080
4462
|
}
|
|
4081
|
-
if (hasStaticData &&
|
|
4463
|
+
if (hasStaticData && existsSync6(rscEntryPath)) {
|
|
4082
4464
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4083
4465
|
if (!rscCode.includes("__STATIC_MANIFEST")) {
|
|
4084
4466
|
try {
|
|
4085
|
-
const assetsDir = resolve6(state.projectRoot, "dist/rsc/assets");
|
|
4086
|
-
mkdirSync(assetsDir, { recursive: true });
|
|
4087
4467
|
const manifestEntries = [];
|
|
4088
|
-
let totalBytes =
|
|
4089
|
-
|
|
4090
|
-
state.
|
|
4468
|
+
let totalBytes = copyStagedBuildAssets(
|
|
4469
|
+
state.projectRoot,
|
|
4470
|
+
Object.values(state.staticManifestEntries)
|
|
4471
|
+
);
|
|
4472
|
+
for (const [handlerId, assetFileName] of Object.entries(
|
|
4473
|
+
state.staticManifestEntries
|
|
4091
4474
|
)) {
|
|
4092
|
-
const contentHash = createHash4("sha256").update(encoded).digest("hex").slice(0, 8);
|
|
4093
|
-
const assetFileName = `__st-${contentHash}.js`;
|
|
4094
|
-
const assetPath = resolve6(assetsDir, assetFileName);
|
|
4095
|
-
const hasHandles = Object.keys(handles).length > 0;
|
|
4096
|
-
const exportValue = hasHandles ? JSON.stringify({ encoded, handles }) : JSON.stringify(encoded);
|
|
4097
|
-
const assetCode = `export default ${exportValue};
|
|
4098
|
-
`;
|
|
4099
|
-
writeFileSync3(assetPath, assetCode);
|
|
4100
|
-
totalBytes += Buffer.byteLength(assetCode);
|
|
4101
4475
|
manifestEntries.push(
|
|
4102
4476
|
`${JSON.stringify(handlerId)}:()=>import("./assets/${assetFileName}")`
|
|
4103
4477
|
);
|
|
4104
4478
|
}
|
|
4105
4479
|
const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;
|
|
4106
4480
|
`;
|
|
4107
|
-
const manifestPath =
|
|
4481
|
+
const manifestPath = resolve7(
|
|
4108
4482
|
state.projectRoot,
|
|
4109
4483
|
"dist/rsc/__static-manifest.js"
|
|
4110
4484
|
);
|
|
4111
|
-
|
|
4485
|
+
writeFileSync4(manifestPath, manifestCode);
|
|
4112
4486
|
totalBytes += Buffer.byteLength(manifestCode);
|
|
4113
4487
|
const injection = `import "./__static-manifest.js";
|
|
4114
4488
|
`;
|
|
4115
|
-
|
|
4489
|
+
writeFileSync4(rscEntryPath, injection + rscCode);
|
|
4116
4490
|
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
4117
4491
|
console.log(
|
|
4118
|
-
`[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.
|
|
4492
|
+
`[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticManifestEntries).length} entries)`
|
|
4119
4493
|
);
|
|
4120
4494
|
} catch (err) {
|
|
4121
4495
|
throw new Error(
|
|
@@ -4205,12 +4579,6 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4205
4579
|
s.resolvedEntryPath = entries[0];
|
|
4206
4580
|
}
|
|
4207
4581
|
}
|
|
4208
|
-
if (opts?.include || opts?.exclude) {
|
|
4209
|
-
s.scanFilter = createScanFilter(s.projectRoot, {
|
|
4210
|
-
include: opts.include,
|
|
4211
|
-
exclude: opts.exclude
|
|
4212
|
-
});
|
|
4213
|
-
}
|
|
4214
4582
|
if (opts?.staticRouteTypesGeneration !== false) {
|
|
4215
4583
|
s.cachedRouterFiles = findRouterFiles(s.projectRoot, s.scanFilter);
|
|
4216
4584
|
writeCombinedRouteTypesWithTracking(s, { preserveIfLarger: true });
|
|
@@ -4230,8 +4598,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4230
4598
|
if (globalThis.__rscRouterDiscoveryActive) return;
|
|
4231
4599
|
s.devServer = server;
|
|
4232
4600
|
let resolveDiscovery;
|
|
4233
|
-
const discoveryPromise = new Promise((
|
|
4234
|
-
resolveDiscovery =
|
|
4601
|
+
const discoveryPromise = new Promise((resolve10) => {
|
|
4602
|
+
resolveDiscovery = resolve10;
|
|
4235
4603
|
});
|
|
4236
4604
|
const getDevServerOrigin = () => server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") || `http://localhost:${server.config.server.port || 5173}`;
|
|
4237
4605
|
let prerenderTempServer = null;
|
|
@@ -4293,34 +4661,10 @@ ${err.stack}`
|
|
|
4293
4661
|
if (serverMod?.setManifestReadyPromise) {
|
|
4294
4662
|
serverMod.setManifestReadyPromise(discoveryPromise);
|
|
4295
4663
|
}
|
|
4296
|
-
|
|
4297
|
-
mainRegistry = serverModAfterDiscovery?.RouterRegistry ?? null;
|
|
4664
|
+
await discoverRouters(s, rscEnv);
|
|
4298
4665
|
s.devServerOrigin = getDevServerOrigin();
|
|
4299
4666
|
writeRouteTypesFiles(s);
|
|
4300
|
-
|
|
4301
|
-
serverMod.setCachedManifest(s.mergedRouteManifest);
|
|
4302
|
-
}
|
|
4303
|
-
if (s.mergedPrecomputedEntries && s.mergedPrecomputedEntries.length > 0 && serverMod?.setPrecomputedEntries) {
|
|
4304
|
-
serverMod.setPrecomputedEntries(s.mergedPrecomputedEntries);
|
|
4305
|
-
}
|
|
4306
|
-
if (s.mergedRouteTrie && serverMod?.setRouteTrie) {
|
|
4307
|
-
serverMod.setRouteTrie(s.mergedRouteTrie);
|
|
4308
|
-
}
|
|
4309
|
-
if (serverMod?.setRouterManifest) {
|
|
4310
|
-
for (const [routerId, manifest] of s.perRouterManifestDataMap) {
|
|
4311
|
-
serverMod.setRouterManifest(routerId, manifest);
|
|
4312
|
-
}
|
|
4313
|
-
}
|
|
4314
|
-
if (serverMod?.setRouterTrie) {
|
|
4315
|
-
for (const [routerId, trie] of s.perRouterTrieMap) {
|
|
4316
|
-
serverMod.setRouterTrie(routerId, trie);
|
|
4317
|
-
}
|
|
4318
|
-
}
|
|
4319
|
-
if (serverMod?.setRouterPrecomputedEntries) {
|
|
4320
|
-
for (const [routerId, entries] of s.perRouterPrecomputedMap) {
|
|
4321
|
-
serverMod.setRouterPrecomputedEntries(routerId, entries);
|
|
4322
|
-
}
|
|
4323
|
-
}
|
|
4667
|
+
await propagateDiscoveryState(rscEnv);
|
|
4324
4668
|
} catch (err) {
|
|
4325
4669
|
console.warn(
|
|
4326
4670
|
`[rsc-router] Router discovery failed: ${err.message}
|
|
@@ -4330,10 +4674,42 @@ ${err.stack}`
|
|
|
4330
4674
|
resolveDiscovery();
|
|
4331
4675
|
}
|
|
4332
4676
|
};
|
|
4333
|
-
s.discoveryDone = new Promise((
|
|
4334
|
-
setTimeout(() => discover().then(
|
|
4677
|
+
s.discoveryDone = new Promise((resolve10) => {
|
|
4678
|
+
setTimeout(() => discover().then(resolve10, resolve10), 0);
|
|
4335
4679
|
});
|
|
4336
4680
|
let mainRegistry = null;
|
|
4681
|
+
const propagateDiscoveryState = async (rscEnv) => {
|
|
4682
|
+
const serverMod = await rscEnv.runner.import("@rangojs/router/server");
|
|
4683
|
+
if (!serverMod) return;
|
|
4684
|
+
if (serverMod.clearAllRouterData) {
|
|
4685
|
+
serverMod.clearAllRouterData();
|
|
4686
|
+
}
|
|
4687
|
+
mainRegistry = serverMod.RouterRegistry ?? null;
|
|
4688
|
+
if (s.mergedRouteManifest && serverMod.setCachedManifest) {
|
|
4689
|
+
serverMod.setCachedManifest(s.mergedRouteManifest);
|
|
4690
|
+
}
|
|
4691
|
+
if (s.mergedPrecomputedEntries && s.mergedPrecomputedEntries.length > 0 && serverMod.setPrecomputedEntries) {
|
|
4692
|
+
serverMod.setPrecomputedEntries(s.mergedPrecomputedEntries);
|
|
4693
|
+
}
|
|
4694
|
+
if (s.mergedRouteTrie && serverMod.setRouteTrie) {
|
|
4695
|
+
serverMod.setRouteTrie(s.mergedRouteTrie);
|
|
4696
|
+
}
|
|
4697
|
+
if (serverMod.setRouterManifest) {
|
|
4698
|
+
for (const [routerId, manifest] of s.perRouterManifestDataMap) {
|
|
4699
|
+
serverMod.setRouterManifest(routerId, manifest);
|
|
4700
|
+
}
|
|
4701
|
+
}
|
|
4702
|
+
if (serverMod.setRouterTrie) {
|
|
4703
|
+
for (const [routerId, trie] of s.perRouterTrieMap) {
|
|
4704
|
+
serverMod.setRouterTrie(routerId, trie);
|
|
4705
|
+
}
|
|
4706
|
+
}
|
|
4707
|
+
if (serverMod.setRouterPrecomputedEntries) {
|
|
4708
|
+
for (const [routerId, entries] of s.perRouterPrecomputedMap) {
|
|
4709
|
+
serverMod.setRouterPrecomputedEntries(routerId, entries);
|
|
4710
|
+
}
|
|
4711
|
+
}
|
|
4712
|
+
};
|
|
4337
4713
|
server.middlewares.use("/__rsc_prerender", async (req, res) => {
|
|
4338
4714
|
if (s.discoveryDone) await s.discoveryDone;
|
|
4339
4715
|
const url = new URL(req.url || "/", "http://localhost");
|
|
@@ -4356,11 +4732,20 @@ ${err.stack}`
|
|
|
4356
4732
|
return;
|
|
4357
4733
|
}
|
|
4358
4734
|
const wantIntercept = url.searchParams.get("intercept") === "1";
|
|
4735
|
+
const wantRouteName = url.searchParams.get("routeName");
|
|
4736
|
+
const wantPassthrough = url.searchParams.get("passthrough") === "1";
|
|
4359
4737
|
for (const [, routerInstance] of registry) {
|
|
4360
4738
|
if (!routerInstance.matchForPrerender) continue;
|
|
4361
4739
|
try {
|
|
4362
|
-
const result = await routerInstance.matchForPrerender(
|
|
4740
|
+
const result = await routerInstance.matchForPrerender(
|
|
4741
|
+
pathname,
|
|
4742
|
+
{},
|
|
4743
|
+
void 0,
|
|
4744
|
+
wantPassthrough
|
|
4745
|
+
);
|
|
4363
4746
|
if (!result) continue;
|
|
4747
|
+
if (result.passthrough) continue;
|
|
4748
|
+
if (wantRouteName && result.routeName !== wantRouteName) continue;
|
|
4364
4749
|
res.setHeader("content-type", "application/json");
|
|
4365
4750
|
let payload;
|
|
4366
4751
|
if (wantIntercept && result.interceptSegments?.length) {
|
|
@@ -4397,10 +4782,29 @@ ${err.stack}`
|
|
|
4397
4782
|
const maybeHandleGeneratedRouteFileMutation = (filePath) => {
|
|
4398
4783
|
if (!isGeneratedRouteFile(filePath)) return false;
|
|
4399
4784
|
if (consumeSelfGenWrite(s, filePath)) return true;
|
|
4785
|
+
const hasRunner = !!server.environments?.rsc?.runner;
|
|
4786
|
+
if (!hasRunner) return true;
|
|
4400
4787
|
regenerateGeneratedRouteFiles();
|
|
4401
4788
|
return true;
|
|
4402
4789
|
};
|
|
4403
4790
|
let routeChangeTimer;
|
|
4791
|
+
let runtimeRediscoveryInProgress = false;
|
|
4792
|
+
const refreshRuntimeDiscovery = async () => {
|
|
4793
|
+
const rscEnv = server.environments?.rsc;
|
|
4794
|
+
if (!rscEnv?.runner || runtimeRediscoveryInProgress) return;
|
|
4795
|
+
runtimeRediscoveryInProgress = true;
|
|
4796
|
+
try {
|
|
4797
|
+
await discoverRouters(s, rscEnv);
|
|
4798
|
+
writeRouteTypesFiles(s);
|
|
4799
|
+
await propagateDiscoveryState(rscEnv);
|
|
4800
|
+
} catch (err) {
|
|
4801
|
+
console.warn(
|
|
4802
|
+
`[rsc-router] Runtime re-discovery failed: ${err.message}`
|
|
4803
|
+
);
|
|
4804
|
+
} finally {
|
|
4805
|
+
runtimeRediscoveryInProgress = false;
|
|
4806
|
+
}
|
|
4807
|
+
};
|
|
4404
4808
|
const scheduleRouteRegeneration = () => {
|
|
4405
4809
|
clearTimeout(routeChangeTimer);
|
|
4406
4810
|
routeChangeTimer = setTimeout(() => {
|
|
@@ -4415,6 +4819,13 @@ ${err.stack}`
|
|
|
4415
4819
|
`[rsc-router] Route regeneration error: ${err.message}`
|
|
4416
4820
|
);
|
|
4417
4821
|
}
|
|
4822
|
+
if (s.perRouterManifests.length > 0) {
|
|
4823
|
+
refreshRuntimeDiscovery().catch((err) => {
|
|
4824
|
+
console.warn(
|
|
4825
|
+
`[rsc-router] Runtime re-discovery error: ${err.message}`
|
|
4826
|
+
);
|
|
4827
|
+
});
|
|
4828
|
+
}
|
|
4418
4829
|
}, 100);
|
|
4419
4830
|
};
|
|
4420
4831
|
const handleRouteFileChange = (filePath) => {
|
|
@@ -4431,6 +4842,16 @@ ${err.stack}`
|
|
|
4431
4842
|
const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
|
|
4432
4843
|
if (!hasUrls && !hasCreateRouter) return;
|
|
4433
4844
|
if (hasCreateRouter) {
|
|
4845
|
+
const nestedRouterConflict = findNestedRouterConflict([
|
|
4846
|
+
...s.cachedRouterFiles ?? [],
|
|
4847
|
+
resolve8(filePath)
|
|
4848
|
+
]);
|
|
4849
|
+
if (nestedRouterConflict) {
|
|
4850
|
+
server.config.logger.error(
|
|
4851
|
+
formatNestedRouterConflictError(nestedRouterConflict)
|
|
4852
|
+
);
|
|
4853
|
+
return;
|
|
4854
|
+
}
|
|
4434
4855
|
s.cachedRouterFiles = void 0;
|
|
4435
4856
|
}
|
|
4436
4857
|
scheduleRouteRegeneration();
|
|
@@ -4441,6 +4862,8 @@ ${err.stack}`
|
|
|
4441
4862
|
server.watcher.on("change", handleRouteFileChange);
|
|
4442
4863
|
server.watcher.on("unlink", (filePath) => {
|
|
4443
4864
|
if (!isGeneratedRouteFile(filePath)) return;
|
|
4865
|
+
const hasRunner = !!server.environments?.rsc?.runner;
|
|
4866
|
+
if (!hasRunner) return;
|
|
4444
4867
|
regenerateGeneratedRouteFiles();
|
|
4445
4868
|
});
|
|
4446
4869
|
}
|
|
@@ -4451,6 +4874,9 @@ ${err.stack}`
|
|
|
4451
4874
|
async buildStart() {
|
|
4452
4875
|
if (!s.isBuildMode) return;
|
|
4453
4876
|
if (s.mergedRouteManifest !== null) return;
|
|
4877
|
+
resetStagedBuildAssets(s.projectRoot);
|
|
4878
|
+
s.prerenderManifestEntries = null;
|
|
4879
|
+
s.staticManifestEntries = null;
|
|
4454
4880
|
let tempServer = null;
|
|
4455
4881
|
globalThis.__rscRouterDiscoveryActive = true;
|
|
4456
4882
|
try {
|
|
@@ -4580,8 +5006,16 @@ async function rango(options) {
|
|
|
4580
5006
|
const showBanner = resolvedOptions.banner ?? true;
|
|
4581
5007
|
const plugins = [];
|
|
4582
5008
|
const rangoAliases = getPackageAliases();
|
|
4583
|
-
const excludeDeps =
|
|
4584
|
-
|
|
5009
|
+
const excludeDeps = [
|
|
5010
|
+
...getExcludeDeps(),
|
|
5011
|
+
// The public browser entry re-exports the RSDW browser client.
|
|
5012
|
+
// Excluding both keeps Vite from freezing the unpatched bundle into
|
|
5013
|
+
// .vite/deps before our source transforms run.
|
|
5014
|
+
"@vitejs/plugin-rsc/browser",
|
|
5015
|
+
// Keep the browser RSDW client out of Vite's dep optimizer so our
|
|
5016
|
+
// cjs-to-esm transform can patch the real file.
|
|
5017
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
|
|
5018
|
+
];
|
|
4585
5019
|
const routerRef = { path: void 0 };
|
|
4586
5020
|
const prerenderEnabled = true;
|
|
4587
5021
|
if (preset === "cloudflare") {
|
|
@@ -4677,160 +5111,132 @@ async function rango(options) {
|
|
|
4677
5111
|
}
|
|
4678
5112
|
});
|
|
4679
5113
|
plugins.push(createVirtualEntriesPlugin(finalEntries));
|
|
5114
|
+
plugins.push(performanceTracksPlugin());
|
|
4680
5115
|
plugins.push(
|
|
4681
5116
|
rsc({
|
|
4682
5117
|
entries: finalEntries,
|
|
4683
5118
|
serverHandler: false
|
|
4684
5119
|
})
|
|
4685
5120
|
);
|
|
5121
|
+
plugins.push(clientRefDedup());
|
|
4686
5122
|
} else {
|
|
4687
|
-
|
|
4688
|
-
|
|
4689
|
-
|
|
4690
|
-
|
|
4691
|
-
|
|
4692
|
-
|
|
4693
|
-
|
|
4694
|
-
const
|
|
4695
|
-
|
|
4696
|
-
|
|
4697
|
-
|
|
4698
|
-
|
|
4699
|
-
|
|
4700
|
-
|
|
4701
|
-
|
|
4702
|
-
routerRef.path = abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs;
|
|
4703
|
-
} else if (candidates.length > 1) {
|
|
4704
|
-
const list = candidates.map(
|
|
4705
|
-
(f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
|
|
4706
|
-
).join("\n");
|
|
4707
|
-
throw new Error(
|
|
4708
|
-
`[rsc-router] Multiple routers found. Specify \`router\` to choose one:
|
|
4709
|
-
${list}`
|
|
4710
|
-
);
|
|
4711
|
-
}
|
|
5123
|
+
plugins.push({
|
|
5124
|
+
name: "@rangojs/router:auto-discover",
|
|
5125
|
+
config(userConfig) {
|
|
5126
|
+
if (routerRef.path) return;
|
|
5127
|
+
const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
|
|
5128
|
+
const candidates = findRouterFiles(root);
|
|
5129
|
+
if (candidates.length === 1) {
|
|
5130
|
+
const abs = candidates[0];
|
|
5131
|
+
routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
|
|
5132
|
+
} else if (candidates.length > 1) {
|
|
5133
|
+
const list = candidates.map(
|
|
5134
|
+
(f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
|
|
5135
|
+
).join("\n");
|
|
5136
|
+
throw new Error(`[rsc-router] Multiple routers found:
|
|
5137
|
+
${list}`);
|
|
4712
5138
|
}
|
|
4713
|
-
}
|
|
4714
|
-
}
|
|
4715
|
-
const
|
|
4716
|
-
|
|
4717
|
-
|
|
4718
|
-
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
|
|
4722
|
-
|
|
4723
|
-
|
|
4724
|
-
|
|
4725
|
-
|
|
4726
|
-
|
|
4727
|
-
|
|
4728
|
-
|
|
4729
|
-
|
|
4730
|
-
|
|
4731
|
-
|
|
4732
|
-
|
|
4733
|
-
|
|
4734
|
-
|
|
4735
|
-
|
|
4736
|
-
|
|
4737
|
-
|
|
4738
|
-
|
|
4739
|
-
|
|
4740
|
-
|
|
4741
|
-
|
|
4742
|
-
|
|
4743
|
-
resolve: {
|
|
4744
|
-
alias: rangoAliases
|
|
4745
|
-
},
|
|
4746
|
-
environments: {
|
|
4747
|
-
client: {
|
|
4748
|
-
build: {
|
|
4749
|
-
rollupOptions: {
|
|
4750
|
-
output: {
|
|
4751
|
-
manualChunks: getManualChunks
|
|
4752
|
-
}
|
|
4753
|
-
}
|
|
4754
|
-
},
|
|
4755
|
-
// Always exclude rsc-router modules, conditionally add virtual entry
|
|
4756
|
-
optimizeDeps: {
|
|
4757
|
-
// Pre-bundle React and rsc-html-stream to prevent late discovery
|
|
4758
|
-
// triggering ERR_OUTDATED_OPTIMIZED_DEP on cold starts
|
|
4759
|
-
include: [
|
|
4760
|
-
"react",
|
|
4761
|
-
"react-dom",
|
|
4762
|
-
"react/jsx-runtime",
|
|
4763
|
-
"react/jsx-dev-runtime",
|
|
4764
|
-
"rsc-html-stream/client"
|
|
4765
|
-
],
|
|
4766
|
-
exclude: excludeDeps,
|
|
4767
|
-
esbuildOptions: sharedEsbuildOptions,
|
|
4768
|
-
...useVirtualClient && {
|
|
4769
|
-
// Tell Vite to scan the virtual entry for dependencies
|
|
4770
|
-
entries: [VIRTUAL_IDS.browser]
|
|
4771
|
-
}
|
|
4772
|
-
}
|
|
4773
|
-
},
|
|
4774
|
-
...useVirtualSSR && {
|
|
4775
|
-
ssr: {
|
|
4776
|
-
optimizeDeps: {
|
|
4777
|
-
entries: [VIRTUAL_IDS.ssr],
|
|
4778
|
-
// Pre-bundle all SSR deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
|
|
4779
|
-
include: [
|
|
4780
|
-
"react",
|
|
4781
|
-
"react-dom",
|
|
4782
|
-
"react-dom/server.edge",
|
|
4783
|
-
"react-dom/static.edge",
|
|
4784
|
-
"react/jsx-runtime",
|
|
4785
|
-
"react/jsx-dev-runtime",
|
|
4786
|
-
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
4787
|
-
],
|
|
4788
|
-
exclude: excludeDeps,
|
|
4789
|
-
esbuildOptions: sharedEsbuildOptions
|
|
5139
|
+
}
|
|
5140
|
+
});
|
|
5141
|
+
const finalEntries = {
|
|
5142
|
+
client: VIRTUAL_IDS.browser,
|
|
5143
|
+
ssr: VIRTUAL_IDS.ssr,
|
|
5144
|
+
rsc: VIRTUAL_IDS.rsc
|
|
5145
|
+
};
|
|
5146
|
+
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
5147
|
+
let hasWarnedDuplicate = false;
|
|
5148
|
+
plugins.push({
|
|
5149
|
+
name: "@rangojs/router:rsc-integration",
|
|
5150
|
+
enforce: "pre",
|
|
5151
|
+
config() {
|
|
5152
|
+
return {
|
|
5153
|
+
optimizeDeps: {
|
|
5154
|
+
exclude: excludeDeps,
|
|
5155
|
+
esbuildOptions: sharedEsbuildOptions
|
|
5156
|
+
},
|
|
5157
|
+
build: {
|
|
5158
|
+
rollupOptions: { onwarn }
|
|
5159
|
+
},
|
|
5160
|
+
resolve: {
|
|
5161
|
+
alias: rangoAliases
|
|
5162
|
+
},
|
|
5163
|
+
environments: {
|
|
5164
|
+
client: {
|
|
5165
|
+
build: {
|
|
5166
|
+
rollupOptions: {
|
|
5167
|
+
output: {
|
|
5168
|
+
manualChunks: getManualChunks
|
|
4790
5169
|
}
|
|
4791
5170
|
}
|
|
4792
5171
|
},
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
5172
|
+
optimizeDeps: {
|
|
5173
|
+
include: [
|
|
5174
|
+
"react",
|
|
5175
|
+
"react-dom",
|
|
5176
|
+
"react/jsx-runtime",
|
|
5177
|
+
"react/jsx-dev-runtime",
|
|
5178
|
+
"rsc-html-stream/client"
|
|
5179
|
+
],
|
|
5180
|
+
exclude: excludeDeps,
|
|
5181
|
+
esbuildOptions: sharedEsbuildOptions,
|
|
5182
|
+
entries: [VIRTUAL_IDS.browser]
|
|
5183
|
+
}
|
|
5184
|
+
},
|
|
5185
|
+
ssr: {
|
|
5186
|
+
optimizeDeps: {
|
|
5187
|
+
entries: [VIRTUAL_IDS.ssr],
|
|
5188
|
+
include: [
|
|
5189
|
+
"react",
|
|
5190
|
+
"react-dom",
|
|
5191
|
+
"react-dom/server.edge",
|
|
5192
|
+
"react-dom/static.edge",
|
|
5193
|
+
"react/jsx-runtime",
|
|
5194
|
+
"react/jsx-dev-runtime",
|
|
5195
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
5196
|
+
],
|
|
5197
|
+
exclude: excludeDeps,
|
|
5198
|
+
esbuildOptions: sharedEsbuildOptions
|
|
5199
|
+
}
|
|
5200
|
+
},
|
|
5201
|
+
rsc: {
|
|
5202
|
+
optimizeDeps: {
|
|
5203
|
+
entries: [VIRTUAL_IDS.rsc],
|
|
5204
|
+
include: [
|
|
5205
|
+
"react",
|
|
5206
|
+
"react/jsx-runtime",
|
|
5207
|
+
"react/jsx-dev-runtime",
|
|
5208
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
5209
|
+
],
|
|
5210
|
+
esbuildOptions: sharedEsbuildOptions
|
|
4807
5211
|
}
|
|
4808
5212
|
}
|
|
4809
|
-
};
|
|
4810
|
-
},
|
|
4811
|
-
configResolved(config) {
|
|
4812
|
-
if (showBanner) {
|
|
4813
|
-
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
4814
|
-
printBanner(mode, "node", rangoVersion);
|
|
4815
|
-
}
|
|
4816
|
-
const rscMinimalCount = config.plugins.filter(
|
|
4817
|
-
(p) => p.name === "rsc:minimal"
|
|
4818
|
-
).length;
|
|
4819
|
-
if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
|
|
4820
|
-
hasWarnedDuplicate = true;
|
|
4821
|
-
console.warn(
|
|
4822
|
-
"[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your config or use rango({ rsc: false }) for manual configuration."
|
|
4823
|
-
);
|
|
4824
5213
|
}
|
|
5214
|
+
};
|
|
5215
|
+
},
|
|
5216
|
+
configResolved(config) {
|
|
5217
|
+
if (showBanner) {
|
|
5218
|
+
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
5219
|
+
printBanner(mode, "node", rangoVersion);
|
|
4825
5220
|
}
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
5221
|
+
const rscMinimalCount = config.plugins.filter(
|
|
5222
|
+
(p) => p.name === "rsc:minimal"
|
|
5223
|
+
).length;
|
|
5224
|
+
if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
|
|
5225
|
+
hasWarnedDuplicate = true;
|
|
5226
|
+
console.warn(
|
|
5227
|
+
"[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your vite config \u2014 rango() includes it automatically."
|
|
5228
|
+
);
|
|
5229
|
+
}
|
|
5230
|
+
}
|
|
5231
|
+
});
|
|
5232
|
+
plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
|
|
5233
|
+
plugins.push(performanceTracksPlugin());
|
|
5234
|
+
plugins.push(
|
|
5235
|
+
rsc({
|
|
5236
|
+
entries: finalEntries
|
|
5237
|
+
})
|
|
5238
|
+
);
|
|
5239
|
+
plugins.push(clientRefDedup());
|
|
4834
5240
|
}
|
|
4835
5241
|
plugins.push({
|
|
4836
5242
|
name: "@rangojs/router:client-component-hmr",
|
|
@@ -4857,22 +5263,55 @@ ${list}`
|
|
|
4857
5263
|
plugins.push(createVersionPlugin());
|
|
4858
5264
|
const discoveryEntryPath = preset !== "cloudflare" ? routerRef.path : void 0;
|
|
4859
5265
|
const discoveryRouterRef = preset !== "cloudflare" ? routerRef : void 0;
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
plugins.push(createVersionInjectorPlugin(injectorEntryPath));
|
|
5266
|
+
if (preset === "cloudflare") {
|
|
5267
|
+
plugins.push(createVersionInjectorPlugin(void 0));
|
|
4863
5268
|
}
|
|
4864
5269
|
plugins.push(createCjsToEsmPlugin());
|
|
4865
5270
|
plugins.push(
|
|
4866
5271
|
createRouterDiscoveryPlugin(discoveryEntryPath, {
|
|
4867
5272
|
routerPathRef: discoveryRouterRef,
|
|
4868
5273
|
enableBuildPrerender: prerenderEnabled,
|
|
4869
|
-
staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration
|
|
4870
|
-
include: resolvedOptions.include,
|
|
4871
|
-
exclude: resolvedOptions.exclude
|
|
5274
|
+
staticRouteTypesGeneration: resolvedOptions.staticRouteTypesGeneration
|
|
4872
5275
|
})
|
|
4873
5276
|
);
|
|
4874
5277
|
return plugins;
|
|
4875
5278
|
}
|
|
5279
|
+
|
|
5280
|
+
// src/vite/plugins/refresh-cmd.ts
|
|
5281
|
+
function poke() {
|
|
5282
|
+
return {
|
|
5283
|
+
name: "vite-plugin-poke",
|
|
5284
|
+
apply: "serve",
|
|
5285
|
+
configureServer(server) {
|
|
5286
|
+
const stdin = process.stdin;
|
|
5287
|
+
const previousRawMode = stdin.isTTY ? stdin.isRaw : null;
|
|
5288
|
+
if (stdin.isTTY) {
|
|
5289
|
+
stdin.setRawMode(true);
|
|
5290
|
+
}
|
|
5291
|
+
const onData = (data) => {
|
|
5292
|
+
if (data.length !== 1) return;
|
|
5293
|
+
if (data[0] === 3) {
|
|
5294
|
+
process.emit("SIGINT", "SIGINT");
|
|
5295
|
+
return;
|
|
5296
|
+
}
|
|
5297
|
+
if (data[0] === 18) {
|
|
5298
|
+
server.hot.send({ type: "full-reload", path: "*" });
|
|
5299
|
+
server.config.logger.info(" browser reload (ctrl+r)", {
|
|
5300
|
+
timestamp: true
|
|
5301
|
+
});
|
|
5302
|
+
}
|
|
5303
|
+
};
|
|
5304
|
+
stdin.on("data", onData);
|
|
5305
|
+
server.httpServer?.on("close", () => {
|
|
5306
|
+
stdin.off("data", onData);
|
|
5307
|
+
if (stdin.isTTY && previousRawMode !== null) {
|
|
5308
|
+
stdin.setRawMode(previousRawMode);
|
|
5309
|
+
}
|
|
5310
|
+
});
|
|
5311
|
+
}
|
|
5312
|
+
};
|
|
5313
|
+
}
|
|
4876
5314
|
export {
|
|
5315
|
+
poke,
|
|
4877
5316
|
rango
|
|
4878
5317
|
};
|