@rangojs/router 0.0.0-experimental.19 → 0.0.0-experimental.1db96a9e
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 +122 -30
- 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 +245 -63
- 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/dist/href-context.d.ts +29 -0
- 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 +985 -465
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/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 +3 -3
- 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 +33 -31
- package/skills/host-router/SKILL.md +218 -0
- package/skills/links/SKILL.md +3 -1
- package/skills/loader/SKILL.md +72 -22
- package/skills/middleware/SKILL.md +2 -0
- package/skills/parallel/SKILL.md +126 -0
- package/skills/prerender/SKILL.md +112 -70
- package/skills/rango/SKILL.md +0 -1
- package/skills/route/SKILL.md +34 -4
- package/skills/router-setup/SKILL.md +95 -5
- package/skills/typesafety/SKILL.md +35 -23
- package/src/__internal.ts +92 -0
- package/src/bin/rango.ts +18 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +5 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +114 -18
- package/src/browser/navigation-client.ts +126 -44
- package/src/browser/navigation-store.ts +43 -8
- package/src/browser/navigation-transaction.ts +11 -9
- package/src/browser/partial-update.ts +80 -15
- package/src/browser/prefetch/cache.ts +166 -27
- package/src/browser/prefetch/fetch.ts +52 -39
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +92 -20
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/react/Link.tsx +70 -14
- package/src/browser/react/NavigationProvider.tsx +40 -4
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/use-handle.ts +9 -58
- package/src/browser/react/use-router.ts +21 -8
- package/src/browser/rsc-router.tsx +143 -59
- package/src/browser/scroll-restoration.ts +41 -42
- package/src/browser/segment-reconciler.ts +6 -1
- package/src/browser/server-action-bridge.ts +454 -436
- package/src/browser/types.ts +60 -5
- package/src/build/generate-manifest.ts +6 -6
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/route-trie.ts +19 -3
- package/src/build/route-types/include-resolution.ts +8 -1
- package/src/build/route-types/router-processing.ts +346 -87
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/cache/cache-runtime.ts +15 -11
- package/src/cache/cache-scope.ts +48 -7
- package/src/cache/cf/cf-cache-store.ts +453 -11
- package/src/cache/cf/index.ts +5 -1
- package/src/cache/document-cache.ts +17 -7
- package/src/cache/index.ts +1 -0
- package/src/cache/taint.ts +55 -0
- package/src/client.rsc.tsx +2 -1
- package/src/client.tsx +3 -102
- package/src/context-var.ts +72 -2
- package/src/debug.ts +2 -2
- package/src/handle.ts +40 -0
- package/src/handles/breadcrumbs.ts +66 -0
- package/src/handles/index.ts +1 -0
- package/src/host/index.ts +0 -3
- package/src/index.rsc.ts +8 -37
- package/src/index.ts +44 -66
- package/src/prerender/store.ts +57 -15
- package/src/prerender.ts +138 -77
- package/src/reverse.ts +22 -1
- package/src/route-definition/dsl-helpers.ts +73 -25
- package/src/route-definition/helpers-types.ts +10 -6
- package/src/route-definition/index.ts +3 -3
- package/src/route-definition/redirect.ts +11 -3
- package/src/route-definition/resolve-handler-use.ts +149 -0
- package/src/route-map-builder.ts +7 -1
- package/src/route-types.ts +11 -0
- package/src/router/content-negotiation.ts +100 -1
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +108 -25
- package/src/router/intercept-resolution.ts +11 -4
- package/src/router/lazy-includes.ts +4 -1
- package/src/router/loader-resolution.ts +157 -22
- package/src/router/logging.ts +5 -2
- package/src/router/manifest.ts +9 -3
- package/src/router/match-api.ts +125 -190
- package/src/router/match-middleware/background-revalidation.ts +30 -2
- package/src/router/match-middleware/cache-lookup.ts +92 -16
- package/src/router/match-middleware/cache-store.ts +53 -10
- package/src/router/match-middleware/intercept-resolution.ts +9 -7
- package/src/router/match-middleware/segment-resolution.ts +61 -5
- package/src/router/match-result.ts +22 -15
- package/src/router/metrics.ts +238 -13
- package/src/router/middleware-types.ts +53 -12
- package/src/router/middleware.ts +172 -85
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +20 -5
- package/src/router/prerender-match.ts +114 -10
- package/src/router/preview-match.ts +30 -102
- package/src/router/request-classification.ts +310 -0
- package/src/router/revalidation.ts +27 -7
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +6 -1
- package/src/router/router-interfaces.ts +50 -5
- package/src/router/router-options.ts +50 -19
- package/src/router/segment-resolution/fresh.ts +210 -19
- package/src/router/segment-resolution/helpers.ts +30 -25
- package/src/router/segment-resolution/loader-cache.ts +1 -0
- package/src/router/segment-resolution/revalidation.ts +448 -301
- package/src/router/segment-wrappers.ts +2 -0
- package/src/router/trie-matching.ts +20 -2
- package/src/router/types.ts +1 -0
- package/src/router.ts +88 -15
- package/src/rsc/handler.ts +550 -359
- package/src/rsc/index.ts +0 -20
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/progressive-enhancement.ts +35 -10
- package/src/rsc/rsc-rendering.ts +40 -44
- package/src/rsc/server-action.ts +22 -10
- package/src/rsc/ssr-setup.ts +128 -0
- package/src/rsc/types.ts +11 -1
- package/src/search-params.ts +16 -13
- package/src/segment-system.tsx +140 -4
- package/src/server/context.ts +148 -16
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +223 -35
- package/src/server.ts +6 -0
- package/src/ssr/index.tsx +4 -0
- package/src/static-handler.ts +18 -6
- package/src/theme/index.ts +4 -13
- package/src/types/cache-types.ts +4 -4
- package/src/types/handler-context.ts +149 -49
- package/src/types/loader-types.ts +36 -9
- package/src/types/route-config.ts +17 -8
- package/src/types/route-entry.ts +8 -1
- package/src/types/segments.ts +2 -5
- package/src/urls/path-helper-types.ts +9 -2
- package/src/urls/path-helper.ts +48 -13
- package/src/urls/pattern-types.ts +12 -0
- package/src/urls/response-types.ts +16 -6
- package/src/use-loader.tsx +73 -4
- package/src/vite/discovery/bundle-postprocess.ts +61 -89
- package/src/vite/discovery/discover-routers.ts +23 -5
- package/src/vite/discovery/prerender-collection.ts +78 -15
- package/src/vite/discovery/state.ts +17 -13
- package/src/vite/index.ts +8 -3
- package/src/vite/plugin-types.ts +51 -79
- package/src/vite/plugins/client-ref-dedup.ts +115 -0
- package/src/vite/plugins/expose-action-id.ts +1 -3
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-internal-ids.ts +122 -39
- package/src/vite/plugins/performance-tracks.ts +88 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/version-plugin.ts +13 -1
- package/src/vite/rango.ts +174 -211
- package/src/vite/router-discovery.ts +194 -45
- package/src/vite/utils/banner.ts +3 -3
- package/src/vite/utils/prerender-utils.ts +78 -0
- package/src/vite/utils/shared-utils.ts +3 -2
- package/skills/testing/SKILL.md +0 -226
- package/src/route-definition/route-function.ts +0 -119
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;
|
|
@@ -910,9 +910,7 @@ function generateWholeFileStubs(cfg, bindings, code, filePath, isBuild) {
|
|
|
910
910
|
});
|
|
911
911
|
return { code: stubs.join("\n") + "\n", map: null };
|
|
912
912
|
}
|
|
913
|
-
function
|
|
914
|
-
if (bindings.length === 0) return null;
|
|
915
|
-
const s = new MagicString2(code);
|
|
913
|
+
function stubHandlerExprs(cfg, bindings, s, filePath, isBuild) {
|
|
916
914
|
let hasChanges = false;
|
|
917
915
|
for (const binding of bindings) {
|
|
918
916
|
const exportName = binding.exportNames[0];
|
|
@@ -924,15 +922,7 @@ function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
|
|
|
924
922
|
);
|
|
925
923
|
hasChanges = true;
|
|
926
924
|
}
|
|
927
|
-
|
|
928
|
-
return {
|
|
929
|
-
code: s.toString(),
|
|
930
|
-
map: s.generateMap({
|
|
931
|
-
source: sourceId,
|
|
932
|
-
includeContent: true,
|
|
933
|
-
hires: "boundary"
|
|
934
|
-
})
|
|
935
|
-
};
|
|
925
|
+
return hasChanges;
|
|
936
926
|
}
|
|
937
927
|
function transformHandlerIds(cfg, bindings, s, filePath, isBuild) {
|
|
938
928
|
let hasChanges = false;
|
|
@@ -1269,15 +1259,6 @@ ${lazyImports.join(",\n")}
|
|
|
1269
1259
|
isBuild
|
|
1270
1260
|
);
|
|
1271
1261
|
if (wholeFile) return wholeFile;
|
|
1272
|
-
const exprStubs = generateExprStubs(
|
|
1273
|
-
PRERENDER_CONFIG,
|
|
1274
|
-
bindings,
|
|
1275
|
-
code,
|
|
1276
|
-
filePath,
|
|
1277
|
-
id,
|
|
1278
|
-
isBuild
|
|
1279
|
-
);
|
|
1280
|
-
if (exprStubs) return exprStubs;
|
|
1281
1262
|
}
|
|
1282
1263
|
if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
|
|
1283
1264
|
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
@@ -1329,15 +1310,57 @@ ${lazyImports.join(",\n")}
|
|
|
1329
1310
|
isBuild
|
|
1330
1311
|
);
|
|
1331
1312
|
if (wholeFile) return wholeFile;
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1313
|
+
}
|
|
1314
|
+
if (!isRscEnv && (hasPrerenderHandlerCode || hasStaticHandlerCode)) {
|
|
1315
|
+
const allBindings = [];
|
|
1316
|
+
if (hasLoaderCode) {
|
|
1317
|
+
allBindings.push(...getBindings(code, getFnNames("createLoader")));
|
|
1318
|
+
}
|
|
1319
|
+
if (hasHandleCode) {
|
|
1320
|
+
allBindings.push(...getBindings(code, getFnNames("createHandle")));
|
|
1321
|
+
}
|
|
1322
|
+
if (hasLocationStateCode) {
|
|
1323
|
+
allBindings.push(
|
|
1324
|
+
...getBindings(code, getFnNames("createLocationState"))
|
|
1325
|
+
);
|
|
1326
|
+
}
|
|
1327
|
+
if (hasPrerenderHandlerCode) {
|
|
1328
|
+
allBindings.push(
|
|
1329
|
+
...getBindings(code, getFnNames(PRERENDER_CONFIG.fnName))
|
|
1330
|
+
);
|
|
1331
|
+
}
|
|
1332
|
+
if (hasStaticHandlerCode) {
|
|
1333
|
+
allBindings.push(
|
|
1334
|
+
...getBindings(code, getFnNames(STATIC_CONFIG.fnName))
|
|
1335
|
+
);
|
|
1336
|
+
}
|
|
1337
|
+
if (allBindings.length > 0 && isExportOnlyFile(code, allBindings)) {
|
|
1338
|
+
const stubs = [];
|
|
1339
|
+
for (const binding of allBindings) {
|
|
1340
|
+
const name = binding.exportNames[0];
|
|
1341
|
+
const stubId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
|
|
1342
|
+
const fnCall = code.slice(
|
|
1343
|
+
binding.callExprStart,
|
|
1344
|
+
binding.callOpenParenPos + 1
|
|
1345
|
+
);
|
|
1346
|
+
let brand = "loader";
|
|
1347
|
+
if (hasPrerenderHandlerCode && getFnNames(PRERENDER_CONFIG.fnName).some(
|
|
1348
|
+
(n) => fnCall.includes(n)
|
|
1349
|
+
)) {
|
|
1350
|
+
brand = PRERENDER_CONFIG.brand;
|
|
1351
|
+
} else if (hasStaticHandlerCode && getFnNames(STATIC_CONFIG.fnName).some((n) => fnCall.includes(n))) {
|
|
1352
|
+
brand = STATIC_CONFIG.brand;
|
|
1353
|
+
} else if (hasHandleCode && getFnNames("createHandle").some((n) => fnCall.includes(n))) {
|
|
1354
|
+
brand = "handle";
|
|
1355
|
+
} else if (hasLocationStateCode && getFnNames("createLocationState").some((n) => fnCall.includes(n))) {
|
|
1356
|
+
brand = "locationState";
|
|
1357
|
+
}
|
|
1358
|
+
stubs.push(
|
|
1359
|
+
`export const ${name} = { __brand: "${brand}", $$id: "${stubId}" };`
|
|
1360
|
+
);
|
|
1361
|
+
}
|
|
1362
|
+
return { code: stubs.join("\n") + "\n", map: null };
|
|
1363
|
+
}
|
|
1341
1364
|
}
|
|
1342
1365
|
if (hasStaticHandlerCode && isRscEnv && isBuild) {
|
|
1343
1366
|
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
@@ -1372,25 +1395,41 @@ ${lazyImports.join(",\n")}
|
|
|
1372
1395
|
isBuild
|
|
1373
1396
|
) || changed;
|
|
1374
1397
|
}
|
|
1375
|
-
if (hasPrerenderHandlerCode
|
|
1398
|
+
if (hasPrerenderHandlerCode) {
|
|
1376
1399
|
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1400
|
+
const bindings = getBindings(code, fnNames);
|
|
1401
|
+
if (isRscEnv) {
|
|
1402
|
+
changed = transformHandlerIds(
|
|
1403
|
+
PRERENDER_CONFIG,
|
|
1404
|
+
bindings,
|
|
1405
|
+
s,
|
|
1406
|
+
filePath,
|
|
1407
|
+
isBuild
|
|
1408
|
+
) || changed;
|
|
1409
|
+
} else {
|
|
1410
|
+
changed = stubHandlerExprs(
|
|
1411
|
+
PRERENDER_CONFIG,
|
|
1412
|
+
bindings,
|
|
1413
|
+
s,
|
|
1414
|
+
filePath,
|
|
1415
|
+
isBuild
|
|
1416
|
+
) || changed;
|
|
1417
|
+
}
|
|
1384
1418
|
}
|
|
1385
|
-
if (hasStaticHandlerCode
|
|
1419
|
+
if (hasStaticHandlerCode) {
|
|
1386
1420
|
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1421
|
+
const bindings = getBindings(code, fnNames);
|
|
1422
|
+
if (isRscEnv) {
|
|
1423
|
+
changed = transformHandlerIds(
|
|
1424
|
+
STATIC_CONFIG,
|
|
1425
|
+
bindings,
|
|
1426
|
+
s,
|
|
1427
|
+
filePath,
|
|
1428
|
+
isBuild
|
|
1429
|
+
) || changed;
|
|
1430
|
+
} else {
|
|
1431
|
+
changed = stubHandlerExprs(STATIC_CONFIG, bindings, s, filePath, isBuild) || changed;
|
|
1432
|
+
}
|
|
1394
1433
|
}
|
|
1395
1434
|
if (!changed) return;
|
|
1396
1435
|
return {
|
|
@@ -1585,6 +1624,53 @@ function warnOnNearMissDirectives(ast, fileId, warn) {
|
|
|
1585
1624
|
}
|
|
1586
1625
|
}
|
|
1587
1626
|
|
|
1627
|
+
// src/vite/plugins/client-ref-dedup.ts
|
|
1628
|
+
var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
|
|
1629
|
+
function extractPackageName(absolutePath) {
|
|
1630
|
+
const marker = "/node_modules/";
|
|
1631
|
+
const idx = absolutePath.lastIndexOf(marker);
|
|
1632
|
+
if (idx === -1) return null;
|
|
1633
|
+
const afterModules = absolutePath.slice(idx + marker.length);
|
|
1634
|
+
if (afterModules.startsWith("@")) {
|
|
1635
|
+
const parts = afterModules.split("/");
|
|
1636
|
+
if (parts.length < 2 || !parts[1]) return null;
|
|
1637
|
+
return `${parts[0]}/${parts[1]}`;
|
|
1638
|
+
}
|
|
1639
|
+
const name = afterModules.split("/")[0];
|
|
1640
|
+
return name || null;
|
|
1641
|
+
}
|
|
1642
|
+
function clientRefDedup() {
|
|
1643
|
+
let clientExclude = [];
|
|
1644
|
+
return {
|
|
1645
|
+
name: "@rangojs/router:client-ref-dedup",
|
|
1646
|
+
enforce: "pre",
|
|
1647
|
+
apply: "serve",
|
|
1648
|
+
configResolved(config) {
|
|
1649
|
+
const clientEnv = config.environments?.["client"];
|
|
1650
|
+
clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
|
|
1651
|
+
},
|
|
1652
|
+
resolveId(source, importer, options) {
|
|
1653
|
+
if (this.environment?.name !== "client") return;
|
|
1654
|
+
if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
|
|
1655
|
+
if (!source.includes("/node_modules/")) return;
|
|
1656
|
+
if (!importer) return;
|
|
1657
|
+
const packageName = extractPackageName(source);
|
|
1658
|
+
if (!packageName) return;
|
|
1659
|
+
if (clientExclude.includes(packageName)) return;
|
|
1660
|
+
return `\0rango:dedup/${packageName}`;
|
|
1661
|
+
},
|
|
1662
|
+
load(id) {
|
|
1663
|
+
if (!id.startsWith("\0rango:dedup/")) return;
|
|
1664
|
+
const packageName = id.slice("\0rango:dedup/".length);
|
|
1665
|
+
return [
|
|
1666
|
+
`export * from ${JSON.stringify(packageName)};`,
|
|
1667
|
+
`import * as __all__ from ${JSON.stringify(packageName)};`,
|
|
1668
|
+
`export default __all__.default;`
|
|
1669
|
+
].join("\n");
|
|
1670
|
+
}
|
|
1671
|
+
};
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1588
1674
|
// src/vite/plugins/virtual-entries.ts
|
|
1589
1675
|
var VIRTUAL_ENTRY_BROWSER = `
|
|
1590
1676
|
import {
|
|
@@ -1698,7 +1784,7 @@ import { resolve } from "node:path";
|
|
|
1698
1784
|
// package.json
|
|
1699
1785
|
var package_default = {
|
|
1700
1786
|
name: "@rangojs/router",
|
|
1701
|
-
version: "0.0.0-experimental.
|
|
1787
|
+
version: "0.0.0-experimental.1db96a9e",
|
|
1702
1788
|
description: "Django-inspired RSC router with composable URL patterns",
|
|
1703
1789
|
keywords: [
|
|
1704
1790
|
"react",
|
|
@@ -1729,7 +1815,7 @@ var package_default = {
|
|
|
1729
1815
|
"!src/**/*.test.tsx",
|
|
1730
1816
|
"dist",
|
|
1731
1817
|
"skills",
|
|
1732
|
-
"
|
|
1818
|
+
"AGENTS.md",
|
|
1733
1819
|
"README.md"
|
|
1734
1820
|
],
|
|
1735
1821
|
type: "module",
|
|
@@ -1840,7 +1926,7 @@ var package_default = {
|
|
|
1840
1926
|
"test:unit:watch": "vitest"
|
|
1841
1927
|
},
|
|
1842
1928
|
dependencies: {
|
|
1843
|
-
"@vitejs/plugin-rsc": "^0.5.
|
|
1929
|
+
"@vitejs/plugin-rsc": "^0.5.19",
|
|
1844
1930
|
"magic-string": "^0.30.17",
|
|
1845
1931
|
picomatch: "^4.0.3",
|
|
1846
1932
|
"rsc-html-stream": "^0.0.7"
|
|
@@ -2048,55 +2134,7 @@ declare global {
|
|
|
2048
2134
|
}
|
|
2049
2135
|
|
|
2050
2136
|
// src/build/route-types/scan-filter.ts
|
|
2051
|
-
import { join, relative } from "node:path";
|
|
2052
|
-
import { readdirSync } from "node:fs";
|
|
2053
2137
|
import picomatch from "picomatch";
|
|
2054
|
-
var DEFAULT_EXCLUDE_PATTERNS = [
|
|
2055
|
-
"**/__tests__/**",
|
|
2056
|
-
"**/__mocks__/**",
|
|
2057
|
-
"**/dist/**",
|
|
2058
|
-
"**/coverage/**",
|
|
2059
|
-
"**/*.test.{ts,tsx,js,jsx}",
|
|
2060
|
-
"**/*.spec.{ts,tsx,js,jsx}"
|
|
2061
|
-
];
|
|
2062
|
-
function createScanFilter(root, opts) {
|
|
2063
|
-
const { include, exclude } = opts;
|
|
2064
|
-
const hasInclude = include && include.length > 0;
|
|
2065
|
-
const hasCustomExclude = exclude !== void 0;
|
|
2066
|
-
if (!hasInclude && !hasCustomExclude) return void 0;
|
|
2067
|
-
const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
|
|
2068
|
-
const includeMatcher = hasInclude ? picomatch(include) : null;
|
|
2069
|
-
const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
|
|
2070
|
-
return (absolutePath) => {
|
|
2071
|
-
const rel = relative(root, absolutePath);
|
|
2072
|
-
if (excludeMatcher && excludeMatcher(rel)) return false;
|
|
2073
|
-
if (includeMatcher) return includeMatcher(rel);
|
|
2074
|
-
return true;
|
|
2075
|
-
};
|
|
2076
|
-
}
|
|
2077
|
-
function findTsFiles(dir, filter) {
|
|
2078
|
-
const results = [];
|
|
2079
|
-
let entries;
|
|
2080
|
-
try {
|
|
2081
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
2082
|
-
} catch (err) {
|
|
2083
|
-
console.warn(
|
|
2084
|
-
`[rsc-router] Failed to scan directory ${dir}: ${err.message}`
|
|
2085
|
-
);
|
|
2086
|
-
return results;
|
|
2087
|
-
}
|
|
2088
|
-
for (const entry of entries) {
|
|
2089
|
-
const fullPath = join(dir, entry.name);
|
|
2090
|
-
if (entry.isDirectory()) {
|
|
2091
|
-
if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
|
|
2092
|
-
results.push(...findTsFiles(fullPath, filter));
|
|
2093
|
-
} else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
|
|
2094
|
-
if (filter && !filter(fullPath)) continue;
|
|
2095
|
-
results.push(fullPath);
|
|
2096
|
-
}
|
|
2097
|
-
}
|
|
2098
|
-
return results;
|
|
2099
|
-
}
|
|
2100
2138
|
|
|
2101
2139
|
// src/build/route-types/per-module-writer.ts
|
|
2102
2140
|
import ts4 from "typescript";
|
|
@@ -2318,7 +2356,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2318
2356
|
}
|
|
2319
2357
|
return routeMap;
|
|
2320
2358
|
}
|
|
2321
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
|
|
2359
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
2322
2360
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
2323
2361
|
const realPath = resolve2(filePath);
|
|
2324
2362
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
@@ -2334,7 +2372,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2334
2372
|
return { routes: {}, searchSchemas: {} };
|
|
2335
2373
|
}
|
|
2336
2374
|
let block;
|
|
2337
|
-
if (
|
|
2375
|
+
if (inlineBlock) {
|
|
2376
|
+
block = inlineBlock;
|
|
2377
|
+
} else if (variableName) {
|
|
2338
2378
|
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
2339
2379
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
2340
2380
|
block = extracted;
|
|
@@ -2355,8 +2395,20 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2355
2395
|
}
|
|
2356
2396
|
|
|
2357
2397
|
// src/build/route-types/router-processing.ts
|
|
2358
|
-
import {
|
|
2359
|
-
|
|
2398
|
+
import {
|
|
2399
|
+
readFileSync as readFileSync2,
|
|
2400
|
+
writeFileSync,
|
|
2401
|
+
existsSync as existsSync3,
|
|
2402
|
+
unlinkSync,
|
|
2403
|
+
readdirSync
|
|
2404
|
+
} from "node:fs";
|
|
2405
|
+
import {
|
|
2406
|
+
join,
|
|
2407
|
+
dirname as dirname2,
|
|
2408
|
+
resolve as resolve3,
|
|
2409
|
+
sep,
|
|
2410
|
+
basename as pathBasename
|
|
2411
|
+
} from "node:path";
|
|
2360
2412
|
import ts5 from "typescript";
|
|
2361
2413
|
function countPublicRouteEntries(source) {
|
|
2362
2414
|
const matches = source.matchAll(/^\s+(?:"([^"]+)"|([a-zA-Z_$][^:]*)):\s*["{]/gm) ?? [];
|
|
@@ -2369,7 +2421,79 @@ function countPublicRouteEntries(source) {
|
|
|
2369
2421
|
}
|
|
2370
2422
|
return count;
|
|
2371
2423
|
}
|
|
2372
|
-
|
|
2424
|
+
var ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
|
|
2425
|
+
function isRoutableSourceFile(name) {
|
|
2426
|
+
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
|
|
2427
|
+
}
|
|
2428
|
+
function findRouterFilesRecursive(dir, filter, results) {
|
|
2429
|
+
let entries;
|
|
2430
|
+
try {
|
|
2431
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
2432
|
+
} catch (err) {
|
|
2433
|
+
console.warn(
|
|
2434
|
+
`[rsc-router] Failed to scan directory ${dir}: ${err.message}`
|
|
2435
|
+
);
|
|
2436
|
+
return;
|
|
2437
|
+
}
|
|
2438
|
+
const childDirs = [];
|
|
2439
|
+
const routerFilesInDir = [];
|
|
2440
|
+
for (const entry of entries) {
|
|
2441
|
+
const fullPath = join(dir, entry.name);
|
|
2442
|
+
if (entry.isDirectory()) {
|
|
2443
|
+
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
|
|
2444
|
+
continue;
|
|
2445
|
+
childDirs.push(fullPath);
|
|
2446
|
+
continue;
|
|
2447
|
+
}
|
|
2448
|
+
if (!isRoutableSourceFile(entry.name)) continue;
|
|
2449
|
+
if (filter && !filter(fullPath)) continue;
|
|
2450
|
+
try {
|
|
2451
|
+
const source = readFileSync2(fullPath, "utf-8");
|
|
2452
|
+
if (ROUTER_CALL_PATTERN.test(source)) {
|
|
2453
|
+
routerFilesInDir.push(fullPath);
|
|
2454
|
+
}
|
|
2455
|
+
} catch {
|
|
2456
|
+
continue;
|
|
2457
|
+
}
|
|
2458
|
+
}
|
|
2459
|
+
if (routerFilesInDir.length > 0) {
|
|
2460
|
+
results.push(...routerFilesInDir);
|
|
2461
|
+
return;
|
|
2462
|
+
}
|
|
2463
|
+
for (const childDir of childDirs) {
|
|
2464
|
+
findRouterFilesRecursive(childDir, filter, results);
|
|
2465
|
+
}
|
|
2466
|
+
}
|
|
2467
|
+
function findNestedRouterConflict(routerFiles) {
|
|
2468
|
+
const routerDirs = [
|
|
2469
|
+
...new Set(routerFiles.map((filePath) => dirname2(resolve3(filePath))))
|
|
2470
|
+
].sort((a, b) => a.length - b.length);
|
|
2471
|
+
for (let i = 0; i < routerDirs.length; i++) {
|
|
2472
|
+
const ancestorDir = routerDirs[i];
|
|
2473
|
+
const prefix = ancestorDir.endsWith(sep) ? ancestorDir : `${ancestorDir}${sep}`;
|
|
2474
|
+
for (let j = i + 1; j < routerDirs.length; j++) {
|
|
2475
|
+
const nestedDir = routerDirs[j];
|
|
2476
|
+
if (!nestedDir.startsWith(prefix)) continue;
|
|
2477
|
+
const ancestorFile = routerFiles.find(
|
|
2478
|
+
(filePath) => dirname2(resolve3(filePath)) === ancestorDir
|
|
2479
|
+
);
|
|
2480
|
+
const nestedFile = routerFiles.find(
|
|
2481
|
+
(filePath) => dirname2(resolve3(filePath)) === nestedDir
|
|
2482
|
+
);
|
|
2483
|
+
if (ancestorFile && nestedFile) {
|
|
2484
|
+
return { ancestor: ancestorFile, nested: nestedFile };
|
|
2485
|
+
}
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
return null;
|
|
2489
|
+
}
|
|
2490
|
+
function formatNestedRouterConflictError(conflict, prefix = "[rsc-router]") {
|
|
2491
|
+
return `${prefix} Nested router roots are not supported.
|
|
2492
|
+
Router root: ${conflict.ancestor}
|
|
2493
|
+
Nested router: ${conflict.nested}
|
|
2494
|
+
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
2495
|
+
}
|
|
2496
|
+
function extractUrlsFromRouter(code) {
|
|
2373
2497
|
const sourceFile = ts5.createSourceFile(
|
|
2374
2498
|
"router.tsx",
|
|
2375
2499
|
code,
|
|
@@ -2383,24 +2507,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2383
2507
|
const callee = node.expression;
|
|
2384
2508
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
2385
2509
|
}
|
|
2510
|
+
function isInlineBuilder(node) {
|
|
2511
|
+
return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
|
|
2512
|
+
}
|
|
2513
|
+
function isRoutesOnCreateRouter(node) {
|
|
2514
|
+
if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
|
|
2515
|
+
return false;
|
|
2516
|
+
let inner = node.expression.expression;
|
|
2517
|
+
while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
|
|
2518
|
+
inner = inner.expression.expression;
|
|
2519
|
+
}
|
|
2520
|
+
return isCreateRouterCall(inner);
|
|
2521
|
+
}
|
|
2386
2522
|
function visit(node) {
|
|
2387
2523
|
if (result) return;
|
|
2388
|
-
if (ts5.isCallExpression(node) &&
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
}
|
|
2393
|
-
|
|
2394
|
-
result = node.arguments[0].text;
|
|
2395
|
-
return;
|
|
2524
|
+
if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
|
|
2525
|
+
const arg = node.arguments[0];
|
|
2526
|
+
if (ts5.isIdentifier(arg)) {
|
|
2527
|
+
result = { kind: "variable", name: arg.text };
|
|
2528
|
+
} else if (isInlineBuilder(arg)) {
|
|
2529
|
+
result = { kind: "inline", block: arg.getText(sourceFile) };
|
|
2396
2530
|
}
|
|
2531
|
+
return;
|
|
2397
2532
|
}
|
|
2398
2533
|
if (isCreateRouterCall(node)) {
|
|
2399
2534
|
const callExpr = node;
|
|
2400
|
-
for (const
|
|
2535
|
+
for (const callArg of callExpr.arguments) {
|
|
2536
|
+
if (ts5.isObjectLiteralExpression(callArg)) {
|
|
2537
|
+
for (const prop of callArg.properties) {
|
|
2538
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
|
|
2539
|
+
if (ts5.isIdentifier(prop.initializer)) {
|
|
2540
|
+
result = { kind: "variable", name: prop.initializer.text };
|
|
2541
|
+
} else if (isInlineBuilder(prop.initializer)) {
|
|
2542
|
+
result = {
|
|
2543
|
+
kind: "inline",
|
|
2544
|
+
block: prop.initializer.getText(sourceFile)
|
|
2545
|
+
};
|
|
2546
|
+
}
|
|
2547
|
+
return;
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
}
|
|
2551
|
+
}
|
|
2552
|
+
}
|
|
2553
|
+
ts5.forEachChild(node, visit);
|
|
2554
|
+
}
|
|
2555
|
+
visit(sourceFile);
|
|
2556
|
+
return result;
|
|
2557
|
+
}
|
|
2558
|
+
function extractBasenameFromRouter(code) {
|
|
2559
|
+
const sourceFile = ts5.createSourceFile(
|
|
2560
|
+
"router.tsx",
|
|
2561
|
+
code,
|
|
2562
|
+
ts5.ScriptTarget.Latest,
|
|
2563
|
+
true,
|
|
2564
|
+
ts5.ScriptKind.TSX
|
|
2565
|
+
);
|
|
2566
|
+
let result;
|
|
2567
|
+
function visit(node) {
|
|
2568
|
+
if (result !== void 0) return;
|
|
2569
|
+
if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
|
|
2570
|
+
for (const arg of node.arguments) {
|
|
2401
2571
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
2402
2572
|
for (const prop of arg.properties) {
|
|
2403
|
-
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "
|
|
2573
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
|
|
2404
2574
|
result = prop.initializer.text;
|
|
2405
2575
|
return;
|
|
2406
2576
|
}
|
|
@@ -2413,6 +2583,19 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2413
2583
|
visit(sourceFile);
|
|
2414
2584
|
return result;
|
|
2415
2585
|
}
|
|
2586
|
+
function applyBasenameToRoutes(result, basename3) {
|
|
2587
|
+
const prefixed = {};
|
|
2588
|
+
for (const [name, pattern] of Object.entries(result.routes)) {
|
|
2589
|
+
if (pattern === "/") {
|
|
2590
|
+
prefixed[name] = basename3;
|
|
2591
|
+
} else if (basename3.endsWith("/") && pattern.startsWith("/")) {
|
|
2592
|
+
prefixed[name] = basename3 + pattern.slice(1);
|
|
2593
|
+
} else {
|
|
2594
|
+
prefixed[name] = basename3 + pattern;
|
|
2595
|
+
}
|
|
2596
|
+
}
|
|
2597
|
+
return { routes: prefixed, searchSchemas: result.searchSchemas };
|
|
2598
|
+
}
|
|
2416
2599
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
2417
2600
|
let routerSource;
|
|
2418
2601
|
try {
|
|
@@ -2420,39 +2603,49 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
2420
2603
|
} catch {
|
|
2421
2604
|
return { routes: {}, searchSchemas: {} };
|
|
2422
2605
|
}
|
|
2423
|
-
const
|
|
2424
|
-
if (!
|
|
2606
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
2607
|
+
if (!extraction) {
|
|
2425
2608
|
return { routes: {}, searchSchemas: {} };
|
|
2426
2609
|
}
|
|
2427
|
-
const
|
|
2428
|
-
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2610
|
+
const rawBasename = extractBasenameFromRouter(routerSource);
|
|
2611
|
+
const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
|
|
2612
|
+
let result;
|
|
2613
|
+
if (extraction.kind === "inline") {
|
|
2614
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2615
|
+
routerFilePath,
|
|
2616
|
+
void 0,
|
|
2617
|
+
void 0,
|
|
2618
|
+
void 0,
|
|
2619
|
+
extraction.block
|
|
2620
|
+
);
|
|
2621
|
+
} else {
|
|
2622
|
+
const imported = resolveImportedVariable(routerSource, extraction.name);
|
|
2623
|
+
if (imported) {
|
|
2624
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2625
|
+
if (!targetFile) {
|
|
2626
|
+
return { routes: {}, searchSchemas: {} };
|
|
2627
|
+
}
|
|
2628
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2629
|
+
targetFile,
|
|
2630
|
+
imported.exportedName
|
|
2631
|
+
);
|
|
2632
|
+
} else {
|
|
2633
|
+
result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
|
|
2432
2634
|
}
|
|
2433
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
2434
2635
|
}
|
|
2435
|
-
|
|
2636
|
+
if (basename3) {
|
|
2637
|
+
result = applyBasenameToRoutes(result, basename3);
|
|
2638
|
+
}
|
|
2639
|
+
return result;
|
|
2436
2640
|
}
|
|
2437
2641
|
function findRouterFiles(root, filter) {
|
|
2438
|
-
const files = findTsFiles(root, filter);
|
|
2439
2642
|
const result = [];
|
|
2440
|
-
|
|
2441
|
-
if (filePath.includes(".gen.")) continue;
|
|
2442
|
-
try {
|
|
2443
|
-
const source = readFileSync2(filePath, "utf-8");
|
|
2444
|
-
if (/\bcreateRouter\s*[<(]/.test(source)) {
|
|
2445
|
-
result.push(filePath);
|
|
2446
|
-
}
|
|
2447
|
-
} catch {
|
|
2448
|
-
continue;
|
|
2449
|
-
}
|
|
2450
|
-
}
|
|
2643
|
+
findRouterFilesRecursive(root, filter, result);
|
|
2451
2644
|
return result;
|
|
2452
2645
|
}
|
|
2453
2646
|
function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
2454
2647
|
try {
|
|
2455
|
-
const oldCombinedPath =
|
|
2648
|
+
const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
|
|
2456
2649
|
if (existsSync3(oldCombinedPath)) {
|
|
2457
2650
|
unlinkSync(oldCombinedPath);
|
|
2458
2651
|
console.log(
|
|
@@ -2463,32 +2656,26 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
2463
2656
|
}
|
|
2464
2657
|
const routerFilePaths = knownRouterFiles ?? findRouterFiles(root);
|
|
2465
2658
|
if (routerFilePaths.length === 0) return;
|
|
2659
|
+
const nestedRouterConflict = findNestedRouterConflict(routerFilePaths);
|
|
2660
|
+
if (nestedRouterConflict) {
|
|
2661
|
+
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
2662
|
+
}
|
|
2466
2663
|
for (const routerFilePath of routerFilePaths) {
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
routerSource
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
2477
|
-
if (imported) {
|
|
2478
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2479
|
-
if (!targetFile) continue;
|
|
2480
|
-
result = buildCombinedRouteMapWithSearch(
|
|
2481
|
-
targetFile,
|
|
2482
|
-
imported.exportedName
|
|
2483
|
-
);
|
|
2484
|
-
} else {
|
|
2485
|
-
result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
2664
|
+
const result = buildCombinedRouteMapForRouterFile(routerFilePath);
|
|
2665
|
+
if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
|
|
2666
|
+
let routerSource;
|
|
2667
|
+
try {
|
|
2668
|
+
routerSource = readFileSync2(routerFilePath, "utf-8");
|
|
2669
|
+
} catch {
|
|
2670
|
+
continue;
|
|
2671
|
+
}
|
|
2672
|
+
if (!extractUrlsFromRouter(routerSource)) continue;
|
|
2486
2673
|
}
|
|
2487
2674
|
const routerBasename = pathBasename(routerFilePath).replace(
|
|
2488
2675
|
/\.(tsx?|jsx?)$/,
|
|
2489
2676
|
""
|
|
2490
2677
|
);
|
|
2491
|
-
const outPath =
|
|
2678
|
+
const outPath = join(
|
|
2492
2679
|
dirname2(routerFilePath),
|
|
2493
2680
|
`${routerBasename}.named-routes.gen.ts`
|
|
2494
2681
|
);
|
|
@@ -2618,8 +2805,9 @@ function createVersionPlugin() {
|
|
|
2618
2805
|
let isDev = false;
|
|
2619
2806
|
let server = null;
|
|
2620
2807
|
const clientModuleSignatures = /* @__PURE__ */ new Map();
|
|
2808
|
+
let versionCounter = 0;
|
|
2621
2809
|
const bumpVersion = (reason) => {
|
|
2622
|
-
currentVersion = Date.now().toString(16);
|
|
2810
|
+
currentVersion = Date.now().toString(16) + String(++versionCounter);
|
|
2623
2811
|
console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
|
|
2624
2812
|
const rscEnv = server?.environments?.rsc;
|
|
2625
2813
|
const versionMod = rscEnv?.moduleGraph?.getModuleById(
|
|
@@ -2675,6 +2863,9 @@ function createVersionPlugin() {
|
|
|
2675
2863
|
if (!isDev) return;
|
|
2676
2864
|
const isRscModule = this.environment?.name === "rsc";
|
|
2677
2865
|
if (!isRscModule) return;
|
|
2866
|
+
if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
|
|
2867
|
+
return;
|
|
2868
|
+
}
|
|
2678
2869
|
if (isCodeModule(ctx.file)) {
|
|
2679
2870
|
const filePath = normalizeModuleId(ctx.file);
|
|
2680
2871
|
const previousSignature = clientModuleSignatures.get(filePath);
|
|
@@ -2704,6 +2895,68 @@ function createVersionPlugin() {
|
|
|
2704
2895
|
|
|
2705
2896
|
// src/vite/utils/shared-utils.ts
|
|
2706
2897
|
import * as Vite from "vite";
|
|
2898
|
+
|
|
2899
|
+
// src/vite/plugins/performance-tracks.ts
|
|
2900
|
+
import { readFile } from "node:fs/promises";
|
|
2901
|
+
var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
|
|
2902
|
+
function buildPatchReplacement(match, debugInfoVar) {
|
|
2903
|
+
return `${match}
|
|
2904
|
+
if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
|
|
2905
|
+
var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
|
|
2906
|
+
if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
|
|
2907
|
+
${debugInfoVar} = _resolved._debugInfo;
|
|
2908
|
+
}
|
|
2909
|
+
}`;
|
|
2910
|
+
}
|
|
2911
|
+
function patchRsdwClientDebugInfoRecovery(code) {
|
|
2912
|
+
const match = code.match(RSDW_PATCH_RE);
|
|
2913
|
+
if (!match) {
|
|
2914
|
+
return { code, debugInfoVar: null };
|
|
2915
|
+
}
|
|
2916
|
+
return {
|
|
2917
|
+
code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
|
|
2918
|
+
debugInfoVar: match[2]
|
|
2919
|
+
};
|
|
2920
|
+
}
|
|
2921
|
+
function performanceTracksOptimizeDepsPlugin() {
|
|
2922
|
+
return {
|
|
2923
|
+
name: "@rangojs/router:performance-tracks-optimize-deps",
|
|
2924
|
+
setup(build) {
|
|
2925
|
+
build.onLoad(
|
|
2926
|
+
{
|
|
2927
|
+
filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
|
|
2928
|
+
},
|
|
2929
|
+
async (args) => {
|
|
2930
|
+
const code = await readFile(args.path, "utf8");
|
|
2931
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
2932
|
+
return {
|
|
2933
|
+
contents: patched.code,
|
|
2934
|
+
loader: "js"
|
|
2935
|
+
};
|
|
2936
|
+
}
|
|
2937
|
+
);
|
|
2938
|
+
}
|
|
2939
|
+
};
|
|
2940
|
+
}
|
|
2941
|
+
function performanceTracksPlugin() {
|
|
2942
|
+
return {
|
|
2943
|
+
name: "@rangojs/router:performance-tracks",
|
|
2944
|
+
transform(code, id) {
|
|
2945
|
+
if (!id.includes("react-server-dom") || !id.includes("client")) return;
|
|
2946
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
2947
|
+
if (!patched.debugInfoVar) return;
|
|
2948
|
+
if (process.env.INTERNAL_RANGO_DEBUG)
|
|
2949
|
+
console.log(
|
|
2950
|
+
"[perf-tracks] patched RSDW client (var:",
|
|
2951
|
+
patched.debugInfoVar,
|
|
2952
|
+
")"
|
|
2953
|
+
);
|
|
2954
|
+
return patched.code;
|
|
2955
|
+
}
|
|
2956
|
+
};
|
|
2957
|
+
}
|
|
2958
|
+
|
|
2959
|
+
// src/vite/utils/shared-utils.ts
|
|
2707
2960
|
var versionEsbuildPlugin = {
|
|
2708
2961
|
name: "@rangojs/router-version",
|
|
2709
2962
|
setup(build) {
|
|
@@ -2721,7 +2974,7 @@ var versionEsbuildPlugin = {
|
|
|
2721
2974
|
}
|
|
2722
2975
|
};
|
|
2723
2976
|
var sharedEsbuildOptions = {
|
|
2724
|
-
plugins: [versionEsbuildPlugin]
|
|
2977
|
+
plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
|
|
2725
2978
|
};
|
|
2726
2979
|
function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
2727
2980
|
const virtualModules = {};
|
|
@@ -2804,11 +3057,11 @@ ${dim} \u2571${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2
|
|
|
2804
3057
|
${dim} ${reset}${bold}\u2551 \u2551${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2727. \u2571${reset}
|
|
2805
3058
|
${dim} ${reset}${bold}\u2554\u2557 \u2551 \u2551 \u2551 \u2551${reset}${dim} * \u2571${reset}
|
|
2806
3059
|
${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}
|
|
2807
|
-
${dim}
|
|
3060
|
+
${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}
|
|
2808
3061
|
${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}
|
|
2809
3062
|
${dim} ${reset}${bold}\u255A\u2550\u2550\u2557 \u2551${reset}${dim} * RSC Wrangler \u2727 \u2726${reset}
|
|
2810
|
-
${dim} * ${reset}${bold}\u2551 \
|
|
2811
|
-
${bold}\u2550\u2550\u2550\
|
|
3063
|
+
${dim} * ${reset}${bold}\u2551 \u2551${reset}${dim} * \u2727. \u2571${reset}
|
|
3064
|
+
${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
|
|
2812
3065
|
|
|
2813
3066
|
v${version} \xB7 ${preset} \xB7 ${mode}
|
|
2814
3067
|
`;
|
|
@@ -2925,7 +3178,10 @@ function createCjsToEsmPlugin() {
|
|
|
2925
3178
|
|
|
2926
3179
|
// src/vite/router-discovery.ts
|
|
2927
3180
|
import { createServer as createViteServer } from "vite";
|
|
3181
|
+
import { resolve as resolve8 } from "node:path";
|
|
2928
3182
|
import { readFileSync as readFileSync6 } from "node:fs";
|
|
3183
|
+
import { createRequire } from "node:module";
|
|
3184
|
+
import { pathToFileURL } from "node:url";
|
|
2929
3185
|
|
|
2930
3186
|
// src/vite/plugins/virtual-stub-plugin.ts
|
|
2931
3187
|
function createVirtualStubPlugin() {
|
|
@@ -2952,7 +3208,7 @@ function createVirtualStubPlugin() {
|
|
|
2952
3208
|
}
|
|
2953
3209
|
|
|
2954
3210
|
// src/vite/plugins/client-ref-hashing.ts
|
|
2955
|
-
import { relative
|
|
3211
|
+
import { relative } from "node:path";
|
|
2956
3212
|
import { createHash as createHash2 } from "node:crypto";
|
|
2957
3213
|
var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
|
|
2958
3214
|
var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
|
|
@@ -2965,10 +3221,10 @@ function computeProductionHash(projectRoot, refKey) {
|
|
|
2965
3221
|
const absPath = decodeURIComponent(
|
|
2966
3222
|
refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
|
|
2967
3223
|
);
|
|
2968
|
-
toHash =
|
|
3224
|
+
toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
|
|
2969
3225
|
} else if (refKey.startsWith(FS_PREFIX)) {
|
|
2970
3226
|
const absPath = refKey.slice(FS_PREFIX.length - 1);
|
|
2971
|
-
toHash =
|
|
3227
|
+
toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
|
|
2972
3228
|
} else if (refKey.startsWith("/")) {
|
|
2973
3229
|
toHash = refKey.slice(1);
|
|
2974
3230
|
} else {
|
|
@@ -3107,10 +3363,10 @@ function createDiscoveryState(entryPath, opts) {
|
|
|
3107
3363
|
perRouterTrieMap: /* @__PURE__ */ new Map(),
|
|
3108
3364
|
perRouterPrecomputedMap: /* @__PURE__ */ new Map(),
|
|
3109
3365
|
perRouterManifestDataMap: /* @__PURE__ */ new Map(),
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3366
|
+
prerenderManifestEntries: null,
|
|
3367
|
+
staticManifestEntries: null,
|
|
3368
|
+
handlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3369
|
+
staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3114
3370
|
rscEntryFileName: null,
|
|
3115
3371
|
resolvedPrerenderModules: void 0,
|
|
3116
3372
|
resolvedStaticModules: void 0,
|
|
@@ -3193,8 +3449,17 @@ function jsonParseExpression(value) {
|
|
|
3193
3449
|
}
|
|
3194
3450
|
|
|
3195
3451
|
// src/context-var.ts
|
|
3452
|
+
var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
|
|
3453
|
+
"rango:non-cacheable-keys"
|
|
3454
|
+
);
|
|
3455
|
+
function getNonCacheableKeys(variables) {
|
|
3456
|
+
if (!variables[NON_CACHEABLE_KEYS]) {
|
|
3457
|
+
variables[NON_CACHEABLE_KEYS] = /* @__PURE__ */ new Set();
|
|
3458
|
+
}
|
|
3459
|
+
return variables[NON_CACHEABLE_KEYS];
|
|
3460
|
+
}
|
|
3196
3461
|
var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
3197
|
-
function contextSet(variables, keyOrVar, value) {
|
|
3462
|
+
function contextSet(variables, keyOrVar, value, options) {
|
|
3198
3463
|
if (typeof keyOrVar === "string") {
|
|
3199
3464
|
if (FORBIDDEN_KEYS.has(keyOrVar)) {
|
|
3200
3465
|
throw new Error(
|
|
@@ -3202,12 +3467,28 @@ function contextSet(variables, keyOrVar, value) {
|
|
|
3202
3467
|
);
|
|
3203
3468
|
}
|
|
3204
3469
|
variables[keyOrVar] = value;
|
|
3470
|
+
if (options?.cache === false) {
|
|
3471
|
+
getNonCacheableKeys(variables).add(keyOrVar);
|
|
3472
|
+
}
|
|
3205
3473
|
} else {
|
|
3206
3474
|
variables[keyOrVar.key] = value;
|
|
3475
|
+
if (options?.cache === false) {
|
|
3476
|
+
getNonCacheableKeys(variables).add(keyOrVar.key);
|
|
3477
|
+
}
|
|
3207
3478
|
}
|
|
3208
3479
|
}
|
|
3209
3480
|
|
|
3210
3481
|
// src/vite/utils/prerender-utils.ts
|
|
3482
|
+
import { createHash as createHash4 } from "node:crypto";
|
|
3483
|
+
import {
|
|
3484
|
+
copyFileSync,
|
|
3485
|
+
existsSync as existsSync4,
|
|
3486
|
+
mkdirSync,
|
|
3487
|
+
rmSync,
|
|
3488
|
+
statSync,
|
|
3489
|
+
writeFileSync as writeFileSync2
|
|
3490
|
+
} from "node:fs";
|
|
3491
|
+
import { resolve as resolve5 } from "node:path";
|
|
3211
3492
|
function escapeRegExp2(str) {
|
|
3212
3493
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3213
3494
|
}
|
|
@@ -3216,6 +3497,7 @@ function encodePathParam(value) {
|
|
|
3216
3497
|
}
|
|
3217
3498
|
function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
3218
3499
|
let result = pattern;
|
|
3500
|
+
let hadOmittedOptional = false;
|
|
3219
3501
|
for (const [key, value] of Object.entries(params)) {
|
|
3220
3502
|
const escaped = escapeRegExp2(key);
|
|
3221
3503
|
result = result.replace(
|
|
@@ -3224,6 +3506,15 @@ function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
|
3224
3506
|
);
|
|
3225
3507
|
result = result.replace(`*${key}`, encode(value));
|
|
3226
3508
|
}
|
|
3509
|
+
result = result.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)(\([^)]*\))?\?/g, () => {
|
|
3510
|
+
hadOmittedOptional = true;
|
|
3511
|
+
return "";
|
|
3512
|
+
});
|
|
3513
|
+
if (hadOmittedOptional) {
|
|
3514
|
+
const hadTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
|
|
3515
|
+
result = result.replace(/\/\/+/g, "/").replace(/\/+$/, "") || "/";
|
|
3516
|
+
if (hadTrailingSlash && !result.endsWith("/")) result += "/";
|
|
3517
|
+
}
|
|
3227
3518
|
return result;
|
|
3228
3519
|
}
|
|
3229
3520
|
async function runWithConcurrency(items, concurrency, fn) {
|
|
@@ -3286,6 +3577,37 @@ function notifyOnError(registry, error, phase, routeKey, pathname, skipped) {
|
|
|
3286
3577
|
break;
|
|
3287
3578
|
}
|
|
3288
3579
|
}
|
|
3580
|
+
function getStagedAssetDir(projectRoot) {
|
|
3581
|
+
return resolve5(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
|
|
3582
|
+
}
|
|
3583
|
+
function resetStagedBuildAssets(projectRoot) {
|
|
3584
|
+
rmSync(getStagedAssetDir(projectRoot), { recursive: true, force: true });
|
|
3585
|
+
}
|
|
3586
|
+
function stageBuildAssetModule(projectRoot, prefix, exportValue) {
|
|
3587
|
+
const stagedDir = getStagedAssetDir(projectRoot);
|
|
3588
|
+
mkdirSync(stagedDir, { recursive: true });
|
|
3589
|
+
const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
|
|
3590
|
+
const fileName = `${prefix}-${contentHash}.js`;
|
|
3591
|
+
const filePath = resolve5(stagedDir, fileName);
|
|
3592
|
+
if (!existsSync4(filePath)) {
|
|
3593
|
+
writeFileSync2(filePath, `export default ${exportValue};
|
|
3594
|
+
`);
|
|
3595
|
+
}
|
|
3596
|
+
return fileName;
|
|
3597
|
+
}
|
|
3598
|
+
function copyStagedBuildAssets(projectRoot, fileNames) {
|
|
3599
|
+
const stagedDir = getStagedAssetDir(projectRoot);
|
|
3600
|
+
const distAssetsDir = resolve5(projectRoot, "dist/rsc/assets");
|
|
3601
|
+
mkdirSync(distAssetsDir, { recursive: true });
|
|
3602
|
+
let totalBytes = 0;
|
|
3603
|
+
for (const fileName of new Set(fileNames)) {
|
|
3604
|
+
const stagedPath = resolve5(stagedDir, fileName);
|
|
3605
|
+
const distPath = resolve5(distAssetsDir, fileName);
|
|
3606
|
+
copyFileSync(stagedPath, distPath);
|
|
3607
|
+
totalBytes += statSync(stagedPath).size;
|
|
3608
|
+
}
|
|
3609
|
+
return totalBytes;
|
|
3610
|
+
}
|
|
3289
3611
|
|
|
3290
3612
|
// src/vite/discovery/prerender-collection.ts
|
|
3291
3613
|
async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
@@ -3301,14 +3623,33 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3301
3623
|
if (!params) return pattern;
|
|
3302
3624
|
return substituteRouteParams(pattern, params);
|
|
3303
3625
|
};
|
|
3626
|
+
let resolvedRoutes = 0;
|
|
3627
|
+
let totalDynamic = 0;
|
|
3628
|
+
for (const { manifest } of allManifests) {
|
|
3629
|
+
if (!manifest.prerenderRoutes) continue;
|
|
3630
|
+
for (const routeName of manifest.prerenderRoutes) {
|
|
3631
|
+
const pattern = manifest.routeManifest[routeName];
|
|
3632
|
+
if (pattern && (pattern.includes(":") || pattern.includes("*"))) {
|
|
3633
|
+
totalDynamic++;
|
|
3634
|
+
}
|
|
3635
|
+
}
|
|
3636
|
+
}
|
|
3637
|
+
const paramsStart = performance.now();
|
|
3638
|
+
const progressInterval = totalDynamic > 0 ? setInterval(() => {
|
|
3639
|
+
const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
|
|
3640
|
+
console.log(
|
|
3641
|
+
`[rsc-router] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
|
|
3642
|
+
);
|
|
3643
|
+
}, 5e3) : void 0;
|
|
3304
3644
|
for (const { manifest } of allManifests) {
|
|
3305
3645
|
if (!manifest.prerenderRoutes) continue;
|
|
3306
3646
|
const defs = manifest._prerenderDefs || {};
|
|
3647
|
+
const passthroughSet = new Set(manifest.passthroughRoutes || []);
|
|
3307
3648
|
for (const routeName of manifest.prerenderRoutes) {
|
|
3308
3649
|
const pattern = manifest.routeManifest[routeName];
|
|
3309
3650
|
if (!pattern) continue;
|
|
3310
3651
|
const def = defs[routeName];
|
|
3311
|
-
const isPassthroughRoute =
|
|
3652
|
+
const isPassthroughRoute = passthroughSet.has(routeName);
|
|
3312
3653
|
const hasDynamic = pattern.includes(":") || pattern.includes("*");
|
|
3313
3654
|
if (!hasDynamic) {
|
|
3314
3655
|
entries.push({
|
|
@@ -3321,12 +3662,20 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3321
3662
|
if (def?.getParams) {
|
|
3322
3663
|
try {
|
|
3323
3664
|
const buildVars = {};
|
|
3665
|
+
const buildEnv = state.resolvedBuildEnv;
|
|
3324
3666
|
const getParamsCtx = {
|
|
3325
3667
|
build: true,
|
|
3668
|
+
dev: !state.isBuildMode,
|
|
3326
3669
|
set: ((keyOrVar, value) => {
|
|
3327
3670
|
contextSet(buildVars, keyOrVar, value);
|
|
3328
3671
|
}),
|
|
3329
|
-
reverse: getParamsReverse
|
|
3672
|
+
reverse: getParamsReverse,
|
|
3673
|
+
get env() {
|
|
3674
|
+
if (buildEnv !== void 0) return buildEnv;
|
|
3675
|
+
throw new Error(
|
|
3676
|
+
"[rsc-router] ctx.env is not available during build-time getParams(). Configure buildEnv in your rango() plugin options to enable build-time env access."
|
|
3677
|
+
);
|
|
3678
|
+
}
|
|
3330
3679
|
};
|
|
3331
3680
|
const paramsList = await def.getParams(getParamsCtx);
|
|
3332
3681
|
const concurrency = def.options?.concurrency ?? 1;
|
|
@@ -3351,7 +3700,9 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3351
3700
|
isPassthroughRoute
|
|
3352
3701
|
});
|
|
3353
3702
|
}
|
|
3703
|
+
resolvedRoutes++;
|
|
3354
3704
|
} catch (err) {
|
|
3705
|
+
resolvedRoutes++;
|
|
3355
3706
|
if (err.name === "Skip") {
|
|
3356
3707
|
console.log(
|
|
3357
3708
|
`[rsc-router] SKIP route "${routeName}" - ${err.message}`
|
|
@@ -3380,6 +3731,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3380
3731
|
}
|
|
3381
3732
|
}
|
|
3382
3733
|
}
|
|
3734
|
+
if (progressInterval) clearInterval(progressInterval);
|
|
3383
3735
|
if (entries.length === 0) return;
|
|
3384
3736
|
const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
|
|
3385
3737
|
const concurrencyNote = maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
|
|
@@ -3387,7 +3739,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3387
3739
|
`[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
|
|
3388
3740
|
);
|
|
3389
3741
|
const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
|
|
3390
|
-
const
|
|
3742
|
+
const manifestEntries = {};
|
|
3391
3743
|
let doneCount = 0;
|
|
3392
3744
|
let skipCount = 0;
|
|
3393
3745
|
const startTotal = performance.now();
|
|
@@ -3405,7 +3757,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3405
3757
|
entry.urlPath,
|
|
3406
3758
|
{},
|
|
3407
3759
|
entry.buildVars,
|
|
3408
|
-
entry.isPassthroughRoute
|
|
3760
|
+
entry.isPassthroughRoute,
|
|
3761
|
+
state.resolvedBuildEnv
|
|
3409
3762
|
);
|
|
3410
3763
|
if (!result) continue;
|
|
3411
3764
|
if (result.passthrough) {
|
|
@@ -3417,18 +3770,30 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3417
3770
|
break;
|
|
3418
3771
|
}
|
|
3419
3772
|
const paramHash = hashParams(result.params || {});
|
|
3420
|
-
|
|
3773
|
+
const mainKey = `${result.routeName}/${paramHash}`;
|
|
3774
|
+
const mainValue = JSON.stringify({
|
|
3421
3775
|
segments: result.segments,
|
|
3422
3776
|
handles: result.handles
|
|
3423
|
-
};
|
|
3777
|
+
});
|
|
3778
|
+
manifestEntries[mainKey] = stageBuildAssetModule(
|
|
3779
|
+
state.projectRoot,
|
|
3780
|
+
"__pr",
|
|
3781
|
+
mainValue
|
|
3782
|
+
);
|
|
3424
3783
|
if (result.interceptSegments?.length) {
|
|
3425
|
-
|
|
3784
|
+
const interceptKey = `${result.routeName}/${paramHash}/i`;
|
|
3785
|
+
const interceptValue = JSON.stringify({
|
|
3426
3786
|
segments: [...result.segments, ...result.interceptSegments],
|
|
3427
3787
|
handles: {
|
|
3428
3788
|
...result.handles,
|
|
3429
3789
|
...result.interceptHandles || {}
|
|
3430
3790
|
}
|
|
3431
|
-
};
|
|
3791
|
+
});
|
|
3792
|
+
manifestEntries[interceptKey] = stageBuildAssetModule(
|
|
3793
|
+
state.projectRoot,
|
|
3794
|
+
"__pr",
|
|
3795
|
+
interceptValue
|
|
3796
|
+
);
|
|
3432
3797
|
}
|
|
3433
3798
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
3434
3799
|
console.log(
|
|
@@ -3472,7 +3837,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3472
3837
|
}
|
|
3473
3838
|
const totalElapsed = (performance.now() - startTotal).toFixed(0);
|
|
3474
3839
|
if (doneCount > 0) {
|
|
3475
|
-
state.
|
|
3840
|
+
state.prerenderManifestEntries = manifestEntries;
|
|
3476
3841
|
}
|
|
3477
3842
|
const parts = [`${doneCount} done`];
|
|
3478
3843
|
if (skipCount > 0) parts.push(`${skipCount} skipped`);
|
|
@@ -3483,7 +3848,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3483
3848
|
async function renderStaticHandlers(state, rscEnv, registry) {
|
|
3484
3849
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
|
|
3485
3850
|
return;
|
|
3486
|
-
const
|
|
3851
|
+
const manifestEntries = {};
|
|
3487
3852
|
let staticDone = 0;
|
|
3488
3853
|
let staticSkip = 0;
|
|
3489
3854
|
let totalStaticCount = 0;
|
|
@@ -3517,10 +3882,18 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3517
3882
|
const result = await routerInstance.renderStaticSegment(
|
|
3518
3883
|
def.handler,
|
|
3519
3884
|
def.$$id,
|
|
3520
|
-
def.$$routePrefix
|
|
3885
|
+
def.$$routePrefix,
|
|
3886
|
+
state.resolvedBuildEnv,
|
|
3887
|
+
!state.isBuildMode
|
|
3521
3888
|
);
|
|
3522
3889
|
if (result) {
|
|
3523
|
-
|
|
3890
|
+
const hasHandles = Object.keys(result.handles).length > 0;
|
|
3891
|
+
const exportValue = hasHandles ? JSON.stringify(result) : JSON.stringify(result.encoded);
|
|
3892
|
+
manifestEntries[def.$$id] = stageBuildAssetModule(
|
|
3893
|
+
state.projectRoot,
|
|
3894
|
+
"__st",
|
|
3895
|
+
exportValue
|
|
3896
|
+
);
|
|
3524
3897
|
const elapsed = (performance.now() - startHandler).toFixed(0);
|
|
3525
3898
|
console.log(
|
|
3526
3899
|
`[rsc-router] OK ${name.padEnd(40)} (${elapsed}ms)`
|
|
@@ -3557,7 +3930,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3557
3930
|
}
|
|
3558
3931
|
const totalStaticElapsed = (performance.now() - startStatic).toFixed(0);
|
|
3559
3932
|
if (staticDone > 0) {
|
|
3560
|
-
state.
|
|
3933
|
+
state.staticManifestEntries = manifestEntries;
|
|
3561
3934
|
}
|
|
3562
3935
|
const staticParts = [`${staticDone} done`];
|
|
3563
3936
|
if (staticSkip > 0) staticParts.push(`${staticSkip} skipped`);
|
|
@@ -3574,8 +3947,7 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3574
3947
|
let registry = serverMod.RouterRegistry;
|
|
3575
3948
|
if (!registry || registry.size === 0) {
|
|
3576
3949
|
try {
|
|
3577
|
-
const
|
|
3578
|
-
const hostRegistry = hostMod.HostRouterRegistry;
|
|
3950
|
+
const hostRegistry = serverMod.HostRouterRegistry;
|
|
3579
3951
|
if (hostRegistry && hostRegistry.size > 0) {
|
|
3580
3952
|
console.log(
|
|
3581
3953
|
`[rsc-router] Found ${hostRegistry.size} host router(s), resolving lazy handlers...`
|
|
@@ -3615,6 +3987,14 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3615
3987
|
}
|
|
3616
3988
|
const buildMod = await rscEnv.runner.import("@rangojs/router/build");
|
|
3617
3989
|
const generateManifestFull = buildMod.generateManifestFull;
|
|
3990
|
+
const nestedRouterConflict = findNestedRouterConflict(
|
|
3991
|
+
[...registry.values()].map((router) => router.__sourceFile).filter(
|
|
3992
|
+
(sourceFile) => typeof sourceFile === "string"
|
|
3993
|
+
)
|
|
3994
|
+
);
|
|
3995
|
+
if (nestedRouterConflict) {
|
|
3996
|
+
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
3997
|
+
}
|
|
3618
3998
|
const newMergedRouteManifest = {};
|
|
3619
3999
|
const newMergedPrecomputedEntries = [];
|
|
3620
4000
|
const newPerRouterManifests = [];
|
|
@@ -3629,7 +4009,11 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3629
4009
|
if (!router.urlpatterns || !generateManifestFull) {
|
|
3630
4010
|
continue;
|
|
3631
4011
|
}
|
|
3632
|
-
const manifest = generateManifestFull(
|
|
4012
|
+
const manifest = generateManifestFull(
|
|
4013
|
+
router.urlpatterns,
|
|
4014
|
+
routerMountIndex,
|
|
4015
|
+
router.__basename ? { urlPrefix: router.__basename } : void 0
|
|
4016
|
+
);
|
|
3633
4017
|
routerMountIndex++;
|
|
3634
4018
|
allManifests.push({ id, manifest });
|
|
3635
4019
|
const routeCount = Object.keys(manifest.routeManifest).length;
|
|
@@ -3771,8 +4155,8 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3771
4155
|
}
|
|
3772
4156
|
|
|
3773
4157
|
// src/vite/discovery/route-types-writer.ts
|
|
3774
|
-
import { dirname as dirname3, basename, join as
|
|
3775
|
-
import { readFileSync as readFileSync4, writeFileSync as
|
|
4158
|
+
import { dirname as dirname3, basename, join as join2, resolve as resolve6 } from "node:path";
|
|
4159
|
+
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
|
|
3776
4160
|
function filterUserNamedRoutes(manifest) {
|
|
3777
4161
|
const filtered = {};
|
|
3778
4162
|
for (const [name, pattern] of Object.entries(manifest)) {
|
|
@@ -3792,7 +4176,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
|
|
|
3792
4176
|
/\.(tsx?|jsx?)$/,
|
|
3793
4177
|
""
|
|
3794
4178
|
);
|
|
3795
|
-
const outPath =
|
|
4179
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3796
4180
|
try {
|
|
3797
4181
|
preContent.set(outPath, readFileSync4(outPath, "utf-8"));
|
|
3798
4182
|
} catch {
|
|
@@ -3805,8 +4189,8 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
|
|
|
3805
4189
|
/\.(tsx?|jsx?)$/,
|
|
3806
4190
|
""
|
|
3807
4191
|
);
|
|
3808
|
-
const outPath =
|
|
3809
|
-
if (!
|
|
4192
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
4193
|
+
if (!existsSync5(outPath)) continue;
|
|
3810
4194
|
try {
|
|
3811
4195
|
const content = readFileSync4(outPath, "utf-8");
|
|
3812
4196
|
if (content !== preContent.get(outPath)) {
|
|
@@ -3820,10 +4204,10 @@ function writeRouteTypesFiles(state) {
|
|
|
3820
4204
|
if (state.perRouterManifests.length === 0) return;
|
|
3821
4205
|
try {
|
|
3822
4206
|
const entryDir = dirname3(
|
|
3823
|
-
|
|
4207
|
+
resolve6(state.projectRoot, state.resolvedEntryPath)
|
|
3824
4208
|
);
|
|
3825
|
-
const oldCombinedPath =
|
|
3826
|
-
if (
|
|
4209
|
+
const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
|
|
4210
|
+
if (existsSync5(oldCombinedPath)) {
|
|
3827
4211
|
unlinkSync2(oldCombinedPath);
|
|
3828
4212
|
console.log(
|
|
3829
4213
|
`[rsc-router] Removed stale combined route types: ${oldCombinedPath}`
|
|
@@ -3847,7 +4231,7 @@ Set an explicit \`id\` on createRouter() or check the call site.`
|
|
|
3847
4231
|
}
|
|
3848
4232
|
const routerDir = dirname3(sourceFile);
|
|
3849
4233
|
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
3850
|
-
const outPath =
|
|
4234
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3851
4235
|
const userRoutes = filterUserNamedRoutes(routeManifest);
|
|
3852
4236
|
let effectiveSearchSchemas = routeSearchSchemas;
|
|
3853
4237
|
if ((!effectiveSearchSchemas || Object.keys(effectiveSearchSchemas).length === 0) && sourceFile) {
|
|
@@ -3867,10 +4251,10 @@ Set an explicit \`id\` on createRouter() or check the call site.`
|
|
|
3867
4251
|
userRoutes,
|
|
3868
4252
|
effectiveSearchSchemas && Object.keys(effectiveSearchSchemas).length > 0 ? effectiveSearchSchemas : void 0
|
|
3869
4253
|
);
|
|
3870
|
-
const existing =
|
|
4254
|
+
const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
|
|
3871
4255
|
if (existing !== source) {
|
|
3872
4256
|
markSelfGenWrite(state, outPath, source);
|
|
3873
|
-
|
|
4257
|
+
writeFileSync3(outPath, source);
|
|
3874
4258
|
console.log(`[rsc-router] Generated route types -> ${outPath}`);
|
|
3875
4259
|
}
|
|
3876
4260
|
}
|
|
@@ -3912,21 +4296,21 @@ function supplementGenFilesWithRuntimeRoutes(state) {
|
|
|
3912
4296
|
}
|
|
3913
4297
|
const routerDir = dirname3(sourceFile);
|
|
3914
4298
|
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
3915
|
-
const outPath =
|
|
4299
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3916
4300
|
const source = generateRouteTypesSource(
|
|
3917
4301
|
mergedRoutes,
|
|
3918
4302
|
Object.keys(mergedSearchSchemas).length > 0 ? mergedSearchSchemas : void 0
|
|
3919
4303
|
);
|
|
3920
|
-
const existing =
|
|
4304
|
+
const existing = existsSync5(outPath) ? readFileSync4(outPath, "utf-8") : null;
|
|
3921
4305
|
if (existing !== source) {
|
|
3922
4306
|
markSelfGenWrite(state, outPath, source);
|
|
3923
|
-
|
|
4307
|
+
writeFileSync3(outPath, source);
|
|
3924
4308
|
}
|
|
3925
4309
|
}
|
|
3926
4310
|
}
|
|
3927
4311
|
|
|
3928
4312
|
// src/vite/discovery/virtual-module-codegen.ts
|
|
3929
|
-
import { dirname as dirname4, basename as basename2, join as
|
|
4313
|
+
import { dirname as dirname4, basename as basename2, join as join3 } from "node:path";
|
|
3930
4314
|
function generateRoutesManifestModule(state) {
|
|
3931
4315
|
const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
|
|
3932
4316
|
if (hasManifest) {
|
|
@@ -3941,7 +4325,7 @@ function generateRoutesManifestModule(state) {
|
|
|
3941
4325
|
/\.(tsx?|jsx?)$/,
|
|
3942
4326
|
""
|
|
3943
4327
|
);
|
|
3944
|
-
const genPath =
|
|
4328
|
+
const genPath = join3(
|
|
3945
4329
|
routerDir,
|
|
3946
4330
|
`${routerBasename}.named-routes.gen.js`
|
|
3947
4331
|
).replaceAll("\\", "/");
|
|
@@ -4038,7 +4422,7 @@ function generatePerRouterModule(state, routerId) {
|
|
|
4038
4422
|
/\.(tsx?|jsx?)$/,
|
|
4039
4423
|
""
|
|
4040
4424
|
);
|
|
4041
|
-
const genPath =
|
|
4425
|
+
const genPath = join3(
|
|
4042
4426
|
routerDir,
|
|
4043
4427
|
`${routerBasename}.named-routes.gen.js`
|
|
4044
4428
|
).replaceAll("\\", "/");
|
|
@@ -4065,100 +4449,90 @@ function generatePerRouterModule(state, routerId) {
|
|
|
4065
4449
|
}
|
|
4066
4450
|
|
|
4067
4451
|
// src/vite/discovery/bundle-postprocess.ts
|
|
4068
|
-
import { resolve as
|
|
4069
|
-
import {
|
|
4070
|
-
import { readFileSync as readFileSync5, writeFileSync as writeFileSync3, existsSync as existsSync5, mkdirSync } from "node:fs";
|
|
4452
|
+
import { resolve as resolve7 } from "node:path";
|
|
4453
|
+
import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync6 } from "node:fs";
|
|
4071
4454
|
function postprocessBundle(state) {
|
|
4072
|
-
const hasPrerenderData = state.
|
|
4073
|
-
const hasStaticData = state.
|
|
4455
|
+
const hasPrerenderData = state.prerenderManifestEntries && Object.keys(state.prerenderManifestEntries).length > 0;
|
|
4456
|
+
const hasStaticData = state.staticManifestEntries && Object.keys(state.staticManifestEntries).length > 0;
|
|
4074
4457
|
if (!hasPrerenderData && !hasStaticData) return;
|
|
4075
|
-
const rscEntryPath =
|
|
4458
|
+
const rscEntryPath = resolve7(
|
|
4076
4459
|
state.projectRoot,
|
|
4077
4460
|
"dist/rsc",
|
|
4078
4461
|
state.rscEntryFileName ?? "index.js"
|
|
4079
4462
|
);
|
|
4080
4463
|
const evictionTargets = [
|
|
4081
4464
|
{
|
|
4082
|
-
|
|
4465
|
+
infos: state.handlerChunkInfoMap.values(),
|
|
4083
4466
|
fnName: "Prerender",
|
|
4084
4467
|
brand: "prerenderHandler",
|
|
4085
4468
|
label: "handler code from RSC bundle"
|
|
4086
4469
|
},
|
|
4087
4470
|
{
|
|
4088
|
-
|
|
4471
|
+
infos: state.staticHandlerChunkInfoMap.values(),
|
|
4089
4472
|
fnName: "Static",
|
|
4090
4473
|
brand: "staticHandler",
|
|
4091
4474
|
label: "static handler code"
|
|
4092
4475
|
}
|
|
4093
4476
|
];
|
|
4094
4477
|
for (const target of evictionTargets) {
|
|
4095
|
-
|
|
4096
|
-
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4104
|
-
|
|
4105
|
-
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
4109
|
-
|
|
4110
|
-
|
|
4111
|
-
|
|
4112
|
-
|
|
4113
|
-
|
|
4478
|
+
for (const info of target.infos) {
|
|
4479
|
+
const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
|
|
4480
|
+
try {
|
|
4481
|
+
const code = readFileSync5(chunkPath, "utf-8");
|
|
4482
|
+
const result = evictHandlerCode(
|
|
4483
|
+
code,
|
|
4484
|
+
info.exports,
|
|
4485
|
+
target.fnName,
|
|
4486
|
+
target.brand
|
|
4487
|
+
);
|
|
4488
|
+
if (result) {
|
|
4489
|
+
writeFileSync4(chunkPath, result.code);
|
|
4490
|
+
const savedKB = (result.savedBytes / 1024).toFixed(1);
|
|
4491
|
+
console.log(
|
|
4492
|
+
`[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`
|
|
4493
|
+
);
|
|
4494
|
+
}
|
|
4495
|
+
} catch (replaceErr) {
|
|
4496
|
+
console.warn(
|
|
4497
|
+
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4114
4498
|
);
|
|
4115
4499
|
}
|
|
4116
|
-
} catch (replaceErr) {
|
|
4117
|
-
console.warn(
|
|
4118
|
-
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4119
|
-
);
|
|
4120
4500
|
}
|
|
4121
4501
|
}
|
|
4122
|
-
state.
|
|
4123
|
-
state.
|
|
4124
|
-
if (hasPrerenderData &&
|
|
4502
|
+
state.handlerChunkInfoMap.clear();
|
|
4503
|
+
state.staticHandlerChunkInfoMap.clear();
|
|
4504
|
+
if (hasPrerenderData && existsSync6(rscEntryPath)) {
|
|
4125
4505
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4126
4506
|
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
4127
4507
|
try {
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
|
|
4131
|
-
|
|
4132
|
-
|
|
4133
|
-
|
|
4508
|
+
let totalBytes = copyStagedBuildAssets(
|
|
4509
|
+
state.projectRoot,
|
|
4510
|
+
Object.values(state.prerenderManifestEntries)
|
|
4511
|
+
);
|
|
4512
|
+
const manifestMap = {};
|
|
4513
|
+
for (const [key, assetFileName] of Object.entries(
|
|
4514
|
+
state.prerenderManifestEntries
|
|
4134
4515
|
)) {
|
|
4135
|
-
|
|
4136
|
-
const contentHash = createHash4("sha256").update(entryJson).digest("hex").slice(0, 8);
|
|
4137
|
-
const assetFileName = `__pr-${contentHash}.js`;
|
|
4138
|
-
const assetPath = resolve6(assetsDir, assetFileName);
|
|
4139
|
-
const assetCode = `export default ${entryJson};
|
|
4140
|
-
`;
|
|
4141
|
-
writeFileSync3(assetPath, assetCode);
|
|
4142
|
-
totalBytes += Buffer.byteLength(assetCode);
|
|
4143
|
-
manifestEntries.push(
|
|
4144
|
-
`${JSON.stringify(key)}:()=>import("./assets/${assetFileName}")`
|
|
4145
|
-
);
|
|
4516
|
+
manifestMap[key] = `./assets/${assetFileName}`;
|
|
4146
4517
|
}
|
|
4147
|
-
const manifestCode =
|
|
4148
|
-
|
|
4149
|
-
|
|
4518
|
+
const manifestCode = [
|
|
4519
|
+
`const m=JSON.parse('${JSON.stringify(manifestMap).replace(/'/g, "\\'")}');`,
|
|
4520
|
+
`export function loadPrerenderAsset(s){return import(s)}`,
|
|
4521
|
+
`export default m;`,
|
|
4522
|
+
""
|
|
4523
|
+
].join("\n");
|
|
4524
|
+
const manifestPath = resolve7(
|
|
4150
4525
|
state.projectRoot,
|
|
4151
4526
|
"dist/rsc/__prerender-manifest.js"
|
|
4152
4527
|
);
|
|
4153
|
-
|
|
4528
|
+
writeFileSync4(manifestPath, manifestCode);
|
|
4154
4529
|
totalBytes += Buffer.byteLength(manifestCode);
|
|
4155
|
-
const injection = `
|
|
4156
|
-
globalThis.__PRERENDER_MANIFEST = __pm;
|
|
4530
|
+
const injection = `globalThis.__loadPrerenderManifestModule = () => import("./__prerender-manifest.js");
|
|
4157
4531
|
`;
|
|
4158
|
-
|
|
4532
|
+
writeFileSync4(rscEntryPath, injection + rscCode);
|
|
4159
4533
|
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
4160
4534
|
console.log(
|
|
4161
|
-
`[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.
|
|
4535
|
+
`[rsc-router] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderManifestEntries).length} entries)`
|
|
4162
4536
|
);
|
|
4163
4537
|
} catch (err) {
|
|
4164
4538
|
throw new Error(
|
|
@@ -4167,44 +4541,36 @@ globalThis.__PRERENDER_MANIFEST = __pm;
|
|
|
4167
4541
|
}
|
|
4168
4542
|
}
|
|
4169
4543
|
}
|
|
4170
|
-
if (hasStaticData &&
|
|
4544
|
+
if (hasStaticData && existsSync6(rscEntryPath)) {
|
|
4171
4545
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4172
|
-
if (!rscCode.includes("
|
|
4546
|
+
if (!rscCode.includes("__static-manifest.js")) {
|
|
4173
4547
|
try {
|
|
4174
|
-
const assetsDir = resolve6(state.projectRoot, "dist/rsc/assets");
|
|
4175
|
-
mkdirSync(assetsDir, { recursive: true });
|
|
4176
4548
|
const manifestEntries = [];
|
|
4177
|
-
let totalBytes =
|
|
4178
|
-
|
|
4179
|
-
state.
|
|
4549
|
+
let totalBytes = copyStagedBuildAssets(
|
|
4550
|
+
state.projectRoot,
|
|
4551
|
+
Object.values(state.staticManifestEntries)
|
|
4552
|
+
);
|
|
4553
|
+
for (const [handlerId, assetFileName] of Object.entries(
|
|
4554
|
+
state.staticManifestEntries
|
|
4180
4555
|
)) {
|
|
4181
|
-
const hasHandles = Object.keys(handles).length > 0;
|
|
4182
|
-
const exportValue = hasHandles ? JSON.stringify({ encoded, handles }) : JSON.stringify(encoded);
|
|
4183
|
-
const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
|
|
4184
|
-
const assetFileName = `__st-${contentHash}.js`;
|
|
4185
|
-
const assetPath = resolve6(assetsDir, assetFileName);
|
|
4186
|
-
const assetCode = `export default ${exportValue};
|
|
4187
|
-
`;
|
|
4188
|
-
writeFileSync3(assetPath, assetCode);
|
|
4189
|
-
totalBytes += Buffer.byteLength(assetCode);
|
|
4190
4556
|
manifestEntries.push(
|
|
4191
4557
|
`${JSON.stringify(handlerId)}:()=>import("./assets/${assetFileName}")`
|
|
4192
4558
|
);
|
|
4193
4559
|
}
|
|
4194
4560
|
const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;
|
|
4195
4561
|
`;
|
|
4196
|
-
const manifestPath =
|
|
4562
|
+
const manifestPath = resolve7(
|
|
4197
4563
|
state.projectRoot,
|
|
4198
4564
|
"dist/rsc/__static-manifest.js"
|
|
4199
4565
|
);
|
|
4200
|
-
|
|
4566
|
+
writeFileSync4(manifestPath, manifestCode);
|
|
4201
4567
|
totalBytes += Buffer.byteLength(manifestCode);
|
|
4202
4568
|
const injection = `import "./__static-manifest.js";
|
|
4203
4569
|
`;
|
|
4204
|
-
|
|
4570
|
+
writeFileSync4(rscEntryPath, injection + rscCode);
|
|
4205
4571
|
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
4206
4572
|
console.log(
|
|
4207
|
-
`[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.
|
|
4573
|
+
`[rsc-router] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticManifestEntries).length} entries)`
|
|
4208
4574
|
);
|
|
4209
4575
|
} catch (err) {
|
|
4210
4576
|
throw new Error(
|
|
@@ -4246,8 +4612,67 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4246
4612
|
]
|
|
4247
4613
|
});
|
|
4248
4614
|
}
|
|
4615
|
+
async function resolveBuildEnv(option, factoryCtx) {
|
|
4616
|
+
if (!option) return null;
|
|
4617
|
+
if (option === "auto") {
|
|
4618
|
+
if (factoryCtx.preset !== "cloudflare") {
|
|
4619
|
+
throw new Error(
|
|
4620
|
+
'[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". Use a factory function or plain object for other presets.'
|
|
4621
|
+
);
|
|
4622
|
+
}
|
|
4623
|
+
try {
|
|
4624
|
+
const userRequire = createRequire(
|
|
4625
|
+
resolve8(factoryCtx.root, "package.json")
|
|
4626
|
+
);
|
|
4627
|
+
const wranglerPath = userRequire.resolve("wrangler");
|
|
4628
|
+
const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
|
|
4629
|
+
const proxy = await getPlatformProxy();
|
|
4630
|
+
return {
|
|
4631
|
+
env: proxy.env,
|
|
4632
|
+
dispose: proxy.dispose
|
|
4633
|
+
};
|
|
4634
|
+
} catch (err) {
|
|
4635
|
+
throw new Error(
|
|
4636
|
+
`[rsc-router] buildEnv: "auto" requires wrangler to be installed.
|
|
4637
|
+
Install it with: pnpm add -D wrangler
|
|
4638
|
+
${err.message}`
|
|
4639
|
+
);
|
|
4640
|
+
}
|
|
4641
|
+
}
|
|
4642
|
+
if (typeof option === "function") {
|
|
4643
|
+
return await option(factoryCtx);
|
|
4644
|
+
}
|
|
4645
|
+
return { env: option };
|
|
4646
|
+
}
|
|
4647
|
+
async function acquireBuildEnv(s, command, mode) {
|
|
4648
|
+
const option = s.opts?.buildEnv;
|
|
4649
|
+
if (!option) return false;
|
|
4650
|
+
const result = await resolveBuildEnv(option, {
|
|
4651
|
+
root: s.projectRoot,
|
|
4652
|
+
mode,
|
|
4653
|
+
command,
|
|
4654
|
+
preset: s.opts?.preset ?? "node"
|
|
4655
|
+
});
|
|
4656
|
+
if (!result) return false;
|
|
4657
|
+
s.resolvedBuildEnv = result.env;
|
|
4658
|
+
s.buildEnvDispose = result.dispose ?? null;
|
|
4659
|
+
return true;
|
|
4660
|
+
}
|
|
4661
|
+
async function releaseBuildEnv(s) {
|
|
4662
|
+
if (s.buildEnvDispose) {
|
|
4663
|
+
try {
|
|
4664
|
+
await s.buildEnvDispose();
|
|
4665
|
+
} catch (err) {
|
|
4666
|
+
console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
|
|
4667
|
+
}
|
|
4668
|
+
s.buildEnvDispose = null;
|
|
4669
|
+
}
|
|
4670
|
+
s.resolvedBuildEnv = void 0;
|
|
4671
|
+
}
|
|
4249
4672
|
function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
4250
4673
|
const s = createDiscoveryState(entryPath, opts);
|
|
4674
|
+
let viteCommand = "build";
|
|
4675
|
+
let viteMode = "production";
|
|
4251
4676
|
return {
|
|
4252
4677
|
name: "@rangojs/router:discovery",
|
|
4253
4678
|
config() {
|
|
@@ -4256,31 +4681,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4256
4681
|
__RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
|
|
4257
4682
|
}
|
|
4258
4683
|
};
|
|
4259
|
-
if (opts?.enableBuildPrerender) {
|
|
4260
|
-
config.environments = {
|
|
4261
|
-
rsc: {
|
|
4262
|
-
build: {
|
|
4263
|
-
rollupOptions: {
|
|
4264
|
-
output: {
|
|
4265
|
-
manualChunks(id) {
|
|
4266
|
-
if (s.resolvedPrerenderModules?.has(id)) {
|
|
4267
|
-
return "__prerender-handlers";
|
|
4268
|
-
}
|
|
4269
|
-
if (s.resolvedStaticModules?.has(id)) {
|
|
4270
|
-
return "__static-handlers";
|
|
4271
|
-
}
|
|
4272
|
-
}
|
|
4273
|
-
}
|
|
4274
|
-
}
|
|
4275
|
-
}
|
|
4276
|
-
}
|
|
4277
|
-
};
|
|
4278
|
-
}
|
|
4279
4684
|
return config;
|
|
4280
4685
|
},
|
|
4281
4686
|
configResolved(config) {
|
|
4282
4687
|
s.projectRoot = config.root;
|
|
4283
4688
|
s.isBuildMode = config.command === "build";
|
|
4689
|
+
viteCommand = config.command;
|
|
4690
|
+
viteMode = config.mode;
|
|
4284
4691
|
s.userResolveAlias = config.resolve.alias;
|
|
4285
4692
|
if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
|
|
4286
4693
|
s.resolvedEntryPath = opts.routerPathRef.path;
|
|
@@ -4294,12 +4701,6 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4294
4701
|
s.resolvedEntryPath = entries[0];
|
|
4295
4702
|
}
|
|
4296
4703
|
}
|
|
4297
|
-
if (opts?.include || opts?.exclude) {
|
|
4298
|
-
s.scanFilter = createScanFilter(s.projectRoot, {
|
|
4299
|
-
include: opts.include,
|
|
4300
|
-
exclude: opts.exclude
|
|
4301
|
-
});
|
|
4302
|
-
}
|
|
4303
4704
|
if (opts?.staticRouteTypesGeneration !== false) {
|
|
4304
4705
|
s.cachedRouterFiles = findRouterFiles(s.projectRoot, s.scanFilter);
|
|
4305
4706
|
writeCombinedRouteTypesWithTracking(s, { preserveIfLarger: true });
|
|
@@ -4319,8 +4720,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4319
4720
|
if (globalThis.__rscRouterDiscoveryActive) return;
|
|
4320
4721
|
s.devServer = server;
|
|
4321
4722
|
let resolveDiscovery;
|
|
4322
|
-
const discoveryPromise = new Promise((
|
|
4323
|
-
resolveDiscovery =
|
|
4723
|
+
const discoveryPromise = new Promise((resolve10) => {
|
|
4724
|
+
resolveDiscovery = resolve10;
|
|
4324
4725
|
});
|
|
4325
4726
|
const getDevServerOrigin = () => server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") || `http://localhost:${server.config.server.port || 5173}`;
|
|
4326
4727
|
let prerenderTempServer = null;
|
|
@@ -4331,6 +4732,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4331
4732
|
});
|
|
4332
4733
|
prerenderTempServer = null;
|
|
4333
4734
|
}
|
|
4735
|
+
releaseBuildEnv(s).catch(() => {
|
|
4736
|
+
});
|
|
4334
4737
|
});
|
|
4335
4738
|
async function getOrCreateTempServer() {
|
|
4336
4739
|
if (prerenderNodeRegistry) {
|
|
@@ -4361,6 +4764,7 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4361
4764
|
if (!rscEnv?.runner) {
|
|
4362
4765
|
s.devServerOrigin = getDevServerOrigin();
|
|
4363
4766
|
try {
|
|
4767
|
+
await acquireBuildEnv(s, viteCommand, viteMode);
|
|
4364
4768
|
const tempRscEnv = await getOrCreateTempServer();
|
|
4365
4769
|
if (tempRscEnv) {
|
|
4366
4770
|
await discoverRouters(s, tempRscEnv);
|
|
@@ -4376,6 +4780,7 @@ ${err.stack}`
|
|
|
4376
4780
|
return;
|
|
4377
4781
|
}
|
|
4378
4782
|
try {
|
|
4783
|
+
await acquireBuildEnv(s, viteCommand, viteMode);
|
|
4379
4784
|
const serverMod = await rscEnv.runner.import(
|
|
4380
4785
|
"@rangojs/router/server"
|
|
4381
4786
|
);
|
|
@@ -4395,8 +4800,8 @@ ${err.stack}`
|
|
|
4395
4800
|
resolveDiscovery();
|
|
4396
4801
|
}
|
|
4397
4802
|
};
|
|
4398
|
-
s.discoveryDone = new Promise((
|
|
4399
|
-
setTimeout(() => discover().then(
|
|
4803
|
+
s.discoveryDone = new Promise((resolve10) => {
|
|
4804
|
+
setTimeout(() => discover().then(resolve10, resolve10), 0);
|
|
4400
4805
|
});
|
|
4401
4806
|
let mainRegistry = null;
|
|
4402
4807
|
const propagateDiscoveryState = async (rscEnv) => {
|
|
@@ -4440,7 +4845,26 @@ ${err.stack}`
|
|
|
4440
4845
|
res.end("Missing pathname");
|
|
4441
4846
|
return;
|
|
4442
4847
|
}
|
|
4443
|
-
|
|
4848
|
+
const rscEnv = server.environments?.rsc;
|
|
4849
|
+
let registry = null;
|
|
4850
|
+
if (rscEnv?.runner && s.resolvedEntryPath) {
|
|
4851
|
+
try {
|
|
4852
|
+
await rscEnv.runner.import(s.resolvedEntryPath);
|
|
4853
|
+
const serverMod = await rscEnv.runner.import(
|
|
4854
|
+
"@rangojs/router/server"
|
|
4855
|
+
);
|
|
4856
|
+
registry = serverMod.RouterRegistry ?? null;
|
|
4857
|
+
} catch (err) {
|
|
4858
|
+
console.warn(
|
|
4859
|
+
`[rsc-router] Dev prerender module refresh failed: ${err.message}`
|
|
4860
|
+
);
|
|
4861
|
+
res.statusCode = 500;
|
|
4862
|
+
res.end(`Prerender handler error: ${err.message}`);
|
|
4863
|
+
return;
|
|
4864
|
+
}
|
|
4865
|
+
} else {
|
|
4866
|
+
registry = mainRegistry;
|
|
4867
|
+
}
|
|
4444
4868
|
if (!registry) {
|
|
4445
4869
|
if (!prerenderNodeRegistry) {
|
|
4446
4870
|
await getOrCreateTempServer();
|
|
@@ -4462,7 +4886,10 @@ ${err.stack}`
|
|
|
4462
4886
|
pathname,
|
|
4463
4887
|
{},
|
|
4464
4888
|
void 0,
|
|
4465
|
-
wantPassthrough
|
|
4889
|
+
wantPassthrough,
|
|
4890
|
+
s.resolvedBuildEnv,
|
|
4891
|
+
true
|
|
4892
|
+
// devMode: check getParams for passthrough routes
|
|
4466
4893
|
);
|
|
4467
4894
|
if (!result) continue;
|
|
4468
4895
|
if (result.passthrough) continue;
|
|
@@ -4563,6 +4990,16 @@ ${err.stack}`
|
|
|
4563
4990
|
const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
|
|
4564
4991
|
if (!hasUrls && !hasCreateRouter) return;
|
|
4565
4992
|
if (hasCreateRouter) {
|
|
4993
|
+
const nestedRouterConflict = findNestedRouterConflict([
|
|
4994
|
+
...s.cachedRouterFiles ?? [],
|
|
4995
|
+
resolve8(filePath)
|
|
4996
|
+
]);
|
|
4997
|
+
if (nestedRouterConflict) {
|
|
4998
|
+
server.config.logger.error(
|
|
4999
|
+
formatNestedRouterConflictError(nestedRouterConflict)
|
|
5000
|
+
);
|
|
5001
|
+
return;
|
|
5002
|
+
}
|
|
4566
5003
|
s.cachedRouterFiles = void 0;
|
|
4567
5004
|
}
|
|
4568
5005
|
scheduleRouteRegeneration();
|
|
@@ -4585,6 +5022,10 @@ ${err.stack}`
|
|
|
4585
5022
|
async buildStart() {
|
|
4586
5023
|
if (!s.isBuildMode) return;
|
|
4587
5024
|
if (s.mergedRouteManifest !== null) return;
|
|
5025
|
+
resetStagedBuildAssets(s.projectRoot);
|
|
5026
|
+
s.prerenderManifestEntries = null;
|
|
5027
|
+
s.staticManifestEntries = null;
|
|
5028
|
+
await acquireBuildEnv(s, viteCommand, viteMode);
|
|
4588
5029
|
let tempServer = null;
|
|
4589
5030
|
globalThis.__rscRouterDiscoveryActive = true;
|
|
4590
5031
|
try {
|
|
@@ -4624,6 +5065,7 @@ ${details}`
|
|
|
4624
5065
|
if (tempServer) {
|
|
4625
5066
|
await tempServer.close();
|
|
4626
5067
|
}
|
|
5068
|
+
await releaseBuildEnv(s);
|
|
4627
5069
|
}
|
|
4628
5070
|
},
|
|
4629
5071
|
// Virtual module: provides the pre-generated route manifest as a JS module
|
|
@@ -4666,20 +5108,30 @@ ${details}`
|
|
|
4666
5108
|
}
|
|
4667
5109
|
if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
|
|
4668
5110
|
return;
|
|
5111
|
+
s.handlerChunkInfoMap.clear();
|
|
5112
|
+
s.staticHandlerChunkInfoMap.clear();
|
|
4669
5113
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4670
5114
|
if (chunk.type !== "chunk") continue;
|
|
4671
|
-
if (
|
|
5115
|
+
if (s.resolvedPrerenderModules?.size) {
|
|
4672
5116
|
const handlers = extractHandlerExportsFromChunk(
|
|
4673
5117
|
chunk.code,
|
|
4674
5118
|
s.resolvedPrerenderModules,
|
|
4675
5119
|
"Prerender",
|
|
4676
|
-
|
|
5120
|
+
false
|
|
4677
5121
|
);
|
|
4678
5122
|
if (handlers.length > 0) {
|
|
4679
|
-
|
|
5123
|
+
const existing = s.handlerChunkInfoMap.get(fileName);
|
|
5124
|
+
if (existing) {
|
|
5125
|
+
existing.exports.push(...handlers);
|
|
5126
|
+
} else {
|
|
5127
|
+
s.handlerChunkInfoMap.set(fileName, {
|
|
5128
|
+
fileName,
|
|
5129
|
+
exports: handlers
|
|
5130
|
+
});
|
|
5131
|
+
}
|
|
4680
5132
|
}
|
|
4681
5133
|
}
|
|
4682
|
-
if (
|
|
5134
|
+
if (s.resolvedStaticModules?.size) {
|
|
4683
5135
|
const handlers = extractHandlerExportsFromChunk(
|
|
4684
5136
|
chunk.code,
|
|
4685
5137
|
s.resolvedStaticModules,
|
|
@@ -4687,7 +5139,15 @@ ${details}`
|
|
|
4687
5139
|
false
|
|
4688
5140
|
);
|
|
4689
5141
|
if (handlers.length > 0) {
|
|
4690
|
-
|
|
5142
|
+
const existing = s.staticHandlerChunkInfoMap.get(fileName);
|
|
5143
|
+
if (existing) {
|
|
5144
|
+
existing.exports.push(...handlers);
|
|
5145
|
+
} else {
|
|
5146
|
+
s.staticHandlerChunkInfoMap.set(fileName, {
|
|
5147
|
+
fileName,
|
|
5148
|
+
exports: handlers
|
|
5149
|
+
});
|
|
5150
|
+
}
|
|
4691
5151
|
}
|
|
4692
5152
|
}
|
|
4693
5153
|
}
|
|
@@ -4714,8 +5174,16 @@ async function rango(options) {
|
|
|
4714
5174
|
const showBanner = resolvedOptions.banner ?? true;
|
|
4715
5175
|
const plugins = [];
|
|
4716
5176
|
const rangoAliases = getPackageAliases();
|
|
4717
|
-
const excludeDeps =
|
|
4718
|
-
|
|
5177
|
+
const excludeDeps = [
|
|
5178
|
+
...getExcludeDeps(),
|
|
5179
|
+
// The public browser entry re-exports the RSDW browser client.
|
|
5180
|
+
// Excluding both keeps Vite from freezing the unpatched bundle into
|
|
5181
|
+
// .vite/deps before our source transforms run.
|
|
5182
|
+
"@vitejs/plugin-rsc/browser",
|
|
5183
|
+
// Keep the browser RSDW client out of Vite's dep optimizer so our
|
|
5184
|
+
// cjs-to-esm transform can patch the real file.
|
|
5185
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
|
|
5186
|
+
];
|
|
4719
5187
|
const routerRef = { path: void 0 };
|
|
4720
5188
|
const prerenderEnabled = true;
|
|
4721
5189
|
if (preset === "cloudflare") {
|
|
@@ -4811,160 +5279,132 @@ async function rango(options) {
|
|
|
4811
5279
|
}
|
|
4812
5280
|
});
|
|
4813
5281
|
plugins.push(createVirtualEntriesPlugin(finalEntries));
|
|
5282
|
+
plugins.push(performanceTracksPlugin());
|
|
4814
5283
|
plugins.push(
|
|
4815
5284
|
rsc({
|
|
4816
5285
|
entries: finalEntries,
|
|
4817
5286
|
serverHandler: false
|
|
4818
5287
|
})
|
|
4819
5288
|
);
|
|
5289
|
+
plugins.push(clientRefDedup());
|
|
4820
5290
|
} else {
|
|
4821
|
-
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
const
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
|
|
4837
|
-
} else if (candidates.length > 1) {
|
|
4838
|
-
const list = candidates.map(
|
|
4839
|
-
(f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
|
|
4840
|
-
).join("\n");
|
|
4841
|
-
throw new Error(
|
|
4842
|
-
`[rsc-router] Multiple routers found. Specify \`router\` to choose one:
|
|
4843
|
-
${list}`
|
|
4844
|
-
);
|
|
4845
|
-
}
|
|
5291
|
+
plugins.push({
|
|
5292
|
+
name: "@rangojs/router:auto-discover",
|
|
5293
|
+
config(userConfig) {
|
|
5294
|
+
if (routerRef.path) return;
|
|
5295
|
+
const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
|
|
5296
|
+
const candidates = findRouterFiles(root);
|
|
5297
|
+
if (candidates.length === 1) {
|
|
5298
|
+
const abs = candidates[0];
|
|
5299
|
+
routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
|
|
5300
|
+
} else if (candidates.length > 1) {
|
|
5301
|
+
const list = candidates.map(
|
|
5302
|
+
(f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
|
|
5303
|
+
).join("\n");
|
|
5304
|
+
throw new Error(`[rsc-router] Multiple routers found:
|
|
5305
|
+
${list}`);
|
|
4846
5306
|
}
|
|
4847
|
-
}
|
|
4848
|
-
}
|
|
4849
|
-
const
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
resolve: {
|
|
4878
|
-
alias: rangoAliases
|
|
4879
|
-
},
|
|
4880
|
-
environments: {
|
|
4881
|
-
client: {
|
|
4882
|
-
build: {
|
|
4883
|
-
rollupOptions: {
|
|
4884
|
-
output: {
|
|
4885
|
-
manualChunks: getManualChunks
|
|
4886
|
-
}
|
|
4887
|
-
}
|
|
4888
|
-
},
|
|
4889
|
-
// Always exclude rsc-router modules, conditionally add virtual entry
|
|
4890
|
-
optimizeDeps: {
|
|
4891
|
-
// Pre-bundle React and rsc-html-stream to prevent late discovery
|
|
4892
|
-
// triggering ERR_OUTDATED_OPTIMIZED_DEP on cold starts
|
|
4893
|
-
include: [
|
|
4894
|
-
"react",
|
|
4895
|
-
"react-dom",
|
|
4896
|
-
"react/jsx-runtime",
|
|
4897
|
-
"react/jsx-dev-runtime",
|
|
4898
|
-
"rsc-html-stream/client"
|
|
4899
|
-
],
|
|
4900
|
-
exclude: excludeDeps,
|
|
4901
|
-
esbuildOptions: sharedEsbuildOptions,
|
|
4902
|
-
...useVirtualClient && {
|
|
4903
|
-
// Tell Vite to scan the virtual entry for dependencies
|
|
4904
|
-
entries: [VIRTUAL_IDS.browser]
|
|
4905
|
-
}
|
|
4906
|
-
}
|
|
4907
|
-
},
|
|
4908
|
-
...useVirtualSSR && {
|
|
4909
|
-
ssr: {
|
|
4910
|
-
optimizeDeps: {
|
|
4911
|
-
entries: [VIRTUAL_IDS.ssr],
|
|
4912
|
-
// Pre-bundle all SSR deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
|
|
4913
|
-
include: [
|
|
4914
|
-
"react",
|
|
4915
|
-
"react-dom",
|
|
4916
|
-
"react-dom/server.edge",
|
|
4917
|
-
"react-dom/static.edge",
|
|
4918
|
-
"react/jsx-runtime",
|
|
4919
|
-
"react/jsx-dev-runtime",
|
|
4920
|
-
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
4921
|
-
],
|
|
4922
|
-
exclude: excludeDeps,
|
|
4923
|
-
esbuildOptions: sharedEsbuildOptions
|
|
5307
|
+
}
|
|
5308
|
+
});
|
|
5309
|
+
const finalEntries = {
|
|
5310
|
+
client: VIRTUAL_IDS.browser,
|
|
5311
|
+
ssr: VIRTUAL_IDS.ssr,
|
|
5312
|
+
rsc: VIRTUAL_IDS.rsc
|
|
5313
|
+
};
|
|
5314
|
+
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
5315
|
+
let hasWarnedDuplicate = false;
|
|
5316
|
+
plugins.push({
|
|
5317
|
+
name: "@rangojs/router:rsc-integration",
|
|
5318
|
+
enforce: "pre",
|
|
5319
|
+
config() {
|
|
5320
|
+
return {
|
|
5321
|
+
optimizeDeps: {
|
|
5322
|
+
exclude: excludeDeps,
|
|
5323
|
+
esbuildOptions: sharedEsbuildOptions
|
|
5324
|
+
},
|
|
5325
|
+
build: {
|
|
5326
|
+
rollupOptions: { onwarn }
|
|
5327
|
+
},
|
|
5328
|
+
resolve: {
|
|
5329
|
+
alias: rangoAliases
|
|
5330
|
+
},
|
|
5331
|
+
environments: {
|
|
5332
|
+
client: {
|
|
5333
|
+
build: {
|
|
5334
|
+
rollupOptions: {
|
|
5335
|
+
output: {
|
|
5336
|
+
manualChunks: getManualChunks
|
|
4924
5337
|
}
|
|
4925
5338
|
}
|
|
4926
5339
|
},
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
4939
|
-
|
|
4940
|
-
|
|
5340
|
+
optimizeDeps: {
|
|
5341
|
+
include: [
|
|
5342
|
+
"react",
|
|
5343
|
+
"react-dom",
|
|
5344
|
+
"react/jsx-runtime",
|
|
5345
|
+
"react/jsx-dev-runtime",
|
|
5346
|
+
"rsc-html-stream/client"
|
|
5347
|
+
],
|
|
5348
|
+
exclude: excludeDeps,
|
|
5349
|
+
esbuildOptions: sharedEsbuildOptions,
|
|
5350
|
+
entries: [VIRTUAL_IDS.browser]
|
|
5351
|
+
}
|
|
5352
|
+
},
|
|
5353
|
+
ssr: {
|
|
5354
|
+
optimizeDeps: {
|
|
5355
|
+
entries: [VIRTUAL_IDS.ssr],
|
|
5356
|
+
include: [
|
|
5357
|
+
"react",
|
|
5358
|
+
"react-dom",
|
|
5359
|
+
"react-dom/server.edge",
|
|
5360
|
+
"react-dom/static.edge",
|
|
5361
|
+
"react/jsx-runtime",
|
|
5362
|
+
"react/jsx-dev-runtime",
|
|
5363
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
5364
|
+
],
|
|
5365
|
+
exclude: excludeDeps,
|
|
5366
|
+
esbuildOptions: sharedEsbuildOptions
|
|
5367
|
+
}
|
|
5368
|
+
},
|
|
5369
|
+
rsc: {
|
|
5370
|
+
optimizeDeps: {
|
|
5371
|
+
entries: [VIRTUAL_IDS.rsc],
|
|
5372
|
+
include: [
|
|
5373
|
+
"react",
|
|
5374
|
+
"react/jsx-runtime",
|
|
5375
|
+
"react/jsx-dev-runtime",
|
|
5376
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
5377
|
+
],
|
|
5378
|
+
esbuildOptions: sharedEsbuildOptions
|
|
4941
5379
|
}
|
|
4942
5380
|
}
|
|
4943
|
-
};
|
|
4944
|
-
},
|
|
4945
|
-
configResolved(config) {
|
|
4946
|
-
if (showBanner) {
|
|
4947
|
-
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
4948
|
-
printBanner(mode, "node", rangoVersion);
|
|
4949
|
-
}
|
|
4950
|
-
const rscMinimalCount = config.plugins.filter(
|
|
4951
|
-
(p) => p.name === "rsc:minimal"
|
|
4952
|
-
).length;
|
|
4953
|
-
if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
|
|
4954
|
-
hasWarnedDuplicate = true;
|
|
4955
|
-
console.warn(
|
|
4956
|
-
"[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your config or use rango({ rsc: false }) for manual configuration."
|
|
4957
|
-
);
|
|
4958
5381
|
}
|
|
5382
|
+
};
|
|
5383
|
+
},
|
|
5384
|
+
configResolved(config) {
|
|
5385
|
+
if (showBanner) {
|
|
5386
|
+
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
5387
|
+
printBanner(mode, "node", rangoVersion);
|
|
4959
5388
|
}
|
|
4960
|
-
|
|
4961
|
-
|
|
4962
|
-
|
|
4963
|
-
|
|
4964
|
-
|
|
4965
|
-
|
|
4966
|
-
|
|
4967
|
-
|
|
5389
|
+
const rscMinimalCount = config.plugins.filter(
|
|
5390
|
+
(p) => p.name === "rsc:minimal"
|
|
5391
|
+
).length;
|
|
5392
|
+
if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
|
|
5393
|
+
hasWarnedDuplicate = true;
|
|
5394
|
+
console.warn(
|
|
5395
|
+
"[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your vite config \u2014 rango() includes it automatically."
|
|
5396
|
+
);
|
|
5397
|
+
}
|
|
5398
|
+
}
|
|
5399
|
+
});
|
|
5400
|
+
plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
|
|
5401
|
+
plugins.push(performanceTracksPlugin());
|
|
5402
|
+
plugins.push(
|
|
5403
|
+
rsc({
|
|
5404
|
+
entries: finalEntries
|
|
5405
|
+
})
|
|
5406
|
+
);
|
|
5407
|
+
plugins.push(clientRefDedup());
|
|
4968
5408
|
}
|
|
4969
5409
|
plugins.push({
|
|
4970
5410
|
name: "@rangojs/router:client-component-hmr",
|
|
@@ -4991,22 +5431,102 @@ ${list}`
|
|
|
4991
5431
|
plugins.push(createVersionPlugin());
|
|
4992
5432
|
const discoveryEntryPath = preset !== "cloudflare" ? routerRef.path : void 0;
|
|
4993
5433
|
const discoveryRouterRef = preset !== "cloudflare" ? routerRef : void 0;
|
|
4994
|
-
|
|
4995
|
-
|
|
4996
|
-
plugins.push(createVersionInjectorPlugin(injectorEntryPath));
|
|
5434
|
+
if (preset === "cloudflare") {
|
|
5435
|
+
plugins.push(createVersionInjectorPlugin(void 0));
|
|
4997
5436
|
}
|
|
4998
5437
|
plugins.push(createCjsToEsmPlugin());
|
|
4999
5438
|
plugins.push(
|
|
5000
5439
|
createRouterDiscoveryPlugin(discoveryEntryPath, {
|
|
5001
5440
|
routerPathRef: discoveryRouterRef,
|
|
5002
5441
|
enableBuildPrerender: prerenderEnabled,
|
|
5003
|
-
|
|
5004
|
-
|
|
5005
|
-
exclude: resolvedOptions.exclude
|
|
5442
|
+
buildEnv: options?.buildEnv,
|
|
5443
|
+
preset
|
|
5006
5444
|
})
|
|
5007
5445
|
);
|
|
5008
5446
|
return plugins;
|
|
5009
5447
|
}
|
|
5448
|
+
|
|
5449
|
+
// src/vite/plugins/refresh-cmd.ts
|
|
5450
|
+
function poke() {
|
|
5451
|
+
return {
|
|
5452
|
+
name: "vite-plugin-poke",
|
|
5453
|
+
apply: "serve",
|
|
5454
|
+
configureServer(server) {
|
|
5455
|
+
const stdin = process.stdin;
|
|
5456
|
+
const debug = process.env.RANGO_POKE_DEBUG === "1";
|
|
5457
|
+
const triggerReload = (source) => {
|
|
5458
|
+
server.hot.send({ type: "full-reload", path: "*" });
|
|
5459
|
+
server.config.logger.info(` browser reload (${source})`, {
|
|
5460
|
+
timestamp: true
|
|
5461
|
+
});
|
|
5462
|
+
};
|
|
5463
|
+
const toBuffer = (chunk) => {
|
|
5464
|
+
return typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
5465
|
+
};
|
|
5466
|
+
const formatChunk = (chunk) => {
|
|
5467
|
+
const data = toBuffer(chunk);
|
|
5468
|
+
const hex = Array.from(data).map((byte) => `0x${byte.toString(16).padStart(2, "0")}`).join(" ");
|
|
5469
|
+
const ascii = Array.from(data).map((byte) => {
|
|
5470
|
+
if (byte >= 32 && byte <= 126) return String.fromCharCode(byte);
|
|
5471
|
+
if (byte === 10) return "\\n";
|
|
5472
|
+
if (byte === 13) return "\\r";
|
|
5473
|
+
if (byte === 9) return "\\t";
|
|
5474
|
+
return ".";
|
|
5475
|
+
}).join("");
|
|
5476
|
+
return `len=${data.length} hex=[${hex}] ascii="${ascii}"`;
|
|
5477
|
+
};
|
|
5478
|
+
const readCtrlR = (chunk) => {
|
|
5479
|
+
const data = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
5480
|
+
return data.length === 1 && data[0] === 18;
|
|
5481
|
+
};
|
|
5482
|
+
const readSubmittedCommands = (chunk) => {
|
|
5483
|
+
const text = toBuffer(chunk).toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
5484
|
+
if (!text.includes("\n")) return [];
|
|
5485
|
+
const lines = text.split("\n");
|
|
5486
|
+
lines.pop();
|
|
5487
|
+
return lines;
|
|
5488
|
+
};
|
|
5489
|
+
if (debug) {
|
|
5490
|
+
server.config.logger.info(
|
|
5491
|
+
` poke debug enabled (isTTY=${stdin.isTTY ? "yes" : "no"}, isRaw=${stdin.isTTY ? stdin.isRaw ? "yes" : "no" : "n/a"})`,
|
|
5492
|
+
{ timestamp: true }
|
|
5493
|
+
);
|
|
5494
|
+
}
|
|
5495
|
+
if (stdin.isTTY) {
|
|
5496
|
+
server.config.logger.info(
|
|
5497
|
+
" poke ready: press e + enter to reload browser (ctrl+r also works when available)",
|
|
5498
|
+
{ timestamp: true }
|
|
5499
|
+
);
|
|
5500
|
+
}
|
|
5501
|
+
const onData = (data) => {
|
|
5502
|
+
if (debug) {
|
|
5503
|
+
server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
|
|
5504
|
+
timestamp: true
|
|
5505
|
+
});
|
|
5506
|
+
}
|
|
5507
|
+
if (readCtrlR(data)) {
|
|
5508
|
+
triggerReload("ctrl+r");
|
|
5509
|
+
return;
|
|
5510
|
+
}
|
|
5511
|
+
for (const command of readSubmittedCommands(data)) {
|
|
5512
|
+
if (command === "e") {
|
|
5513
|
+
triggerReload("e+enter");
|
|
5514
|
+
return;
|
|
5515
|
+
}
|
|
5516
|
+
if (command === "\x1Br") {
|
|
5517
|
+
triggerReload("option+r+enter");
|
|
5518
|
+
return;
|
|
5519
|
+
}
|
|
5520
|
+
}
|
|
5521
|
+
};
|
|
5522
|
+
stdin.on("data", onData);
|
|
5523
|
+
server.httpServer?.on("close", () => {
|
|
5524
|
+
stdin.off("data", onData);
|
|
5525
|
+
});
|
|
5526
|
+
}
|
|
5527
|
+
};
|
|
5528
|
+
}
|
|
5010
5529
|
export {
|
|
5530
|
+
poke,
|
|
5011
5531
|
rango
|
|
5012
5532
|
};
|