@rangojs/router 0.0.0-experimental.29 → 0.0.0-experimental.2c0cb8a1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/README.md +190 -36
- 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 +138 -50
- 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 +2018 -732
- 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/plugins/cloudflare-protocol-loader-hook.mjs +76 -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 +19 -16
- package/skills/breadcrumbs/SKILL.md +252 -0
- package/skills/cache-guide/SKILL.md +32 -0
- package/skills/caching/SKILL.md +45 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +76 -24
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +45 -0
- package/skills/layout/SKILL.md +24 -0
- package/skills/links/SKILL.md +237 -17
- package/skills/loader/SKILL.md +141 -24
- package/skills/middleware/SKILL.md +36 -3
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/parallel/SKILL.md +194 -0
- package/skills/prerender/SKILL.md +110 -68
- package/skills/rango/SKILL.md +26 -22
- package/skills/response-routes/SKILL.md +8 -0
- package/skills/route/SKILL.md +80 -2
- package/skills/router-setup/SKILL.md +87 -2
- package/skills/server-actions/SKILL.md +739 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/typesafety/SKILL.md +42 -22
- package/skills/view-transitions/SKILL.md +212 -0
- package/src/__internal.ts +92 -0
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +49 -4
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +244 -21
- package/src/browser/navigation-client.ts +167 -59
- package/src/browser/navigation-store.ts +68 -9
- package/src/browser/navigation-transaction.ts +11 -9
- package/src/browser/partial-update.ts +137 -26
- package/src/browser/prefetch/cache.ts +184 -16
- package/src/browser/prefetch/fetch.ts +180 -33
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +123 -20
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +93 -9
- package/src/browser/react/NavigationProvider.tsx +109 -21
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +51 -7
- package/src/browser/react/index.ts +3 -0
- package/src/browser/react/use-handle.ts +9 -58
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +17 -4
- package/src/browser/react/use-reverse.ts +99 -0
- package/src/browser/react/use-router.ts +29 -9
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/rsc-router.tsx +168 -65
- package/src/browser/scroll-restoration.ts +32 -39
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/server-action-bridge.ts +8 -6
- package/src/browser/types.ts +74 -5
- package/src/build/generate-manifest.ts +6 -6
- package/src/build/generate-route-types.ts +3 -0
- package/src/build/route-trie.ts +52 -25
- package/src/build/route-types/include-resolution.ts +8 -1
- package/src/build/route-types/router-processing.ts +223 -74
- 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 +455 -15
- 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 +5 -0
- package/src/client.tsx +90 -231
- 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/href-client.ts +4 -1
- package/src/index.rsc.ts +9 -36
- package/src/index.ts +53 -43
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +5 -4
- package/src/prerender.ts +138 -77
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +62 -15
- package/src/route-definition/dsl-helpers.ts +240 -40
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +11 -3
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-map-builder.ts +7 -1
- package/src/route-types.ts +18 -0
- package/src/router/content-negotiation.ts +100 -1
- package/src/router/find-match.ts +4 -2
- package/src/router/handler-context.ts +105 -39
- package/src/router/intercept-resolution.ts +11 -4
- package/src/router/lazy-includes.ts +10 -7
- package/src/router/loader-resolution.ts +159 -21
- package/src/router/logging.ts +5 -2
- package/src/router/manifest.ts +31 -16
- package/src/router/match-api.ts +129 -193
- package/src/router/match-handlers.ts +1 -0
- package/src/router/match-middleware/background-revalidation.ts +30 -2
- package/src/router/match-middleware/cache-lookup.ts +94 -17
- 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 +123 -10
- package/src/router/metrics.ts +6 -1
- package/src/router/middleware-types.ts +23 -40
- package/src/router/middleware.ts +77 -36
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +101 -17
- 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 +15 -1
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-context.ts +6 -1
- package/src/router/router-interfaces.ts +36 -4
- package/src/router/router-options.ts +37 -11
- package/src/router/segment-resolution/fresh.ts +206 -20
- 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 +452 -286
- package/src/router/segment-wrappers.ts +2 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/trie-matching.ts +18 -13
- package/src/router/types.ts +1 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +60 -8
- package/src/rsc/handler.ts +478 -374
- package/src/rsc/helpers.ts +69 -41
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/progressive-enhancement.ts +18 -2
- package/src/rsc/response-route-handler.ts +14 -1
- package/src/rsc/rsc-rendering.ts +22 -1
- package/src/rsc/server-action.ts +12 -0
- package/src/rsc/ssr-setup.ts +2 -2
- package/src/rsc/types.ts +15 -1
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +169 -32
- package/src/server/context.ts +166 -17
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +207 -63
- package/src/ssr/index.tsx +9 -1
- package/src/static-handler.ts +18 -6
- package/src/types/cache-types.ts +4 -4
- package/src/types/handler-context.ts +148 -75
- package/src/types/loader-types.ts +41 -15
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +19 -1
- package/src/types/segments.ts +19 -0
- package/src/urls/include-helper.ts +24 -14
- package/src/urls/path-helper-types.ts +39 -6
- package/src/urls/path-helper.ts +48 -13
- package/src/urls/pattern-types.ts +12 -0
- package/src/urls/response-types.ts +18 -16
- package/src/use-loader.tsx +77 -5
- package/src/vite/debug.ts +184 -0
- package/src/vite/discovery/bundle-postprocess.ts +30 -33
- package/src/vite/discovery/discover-routers.ts +36 -4
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +175 -74
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +13 -6
- package/src/vite/index.ts +4 -0
- package/src/vite/plugin-types.ts +51 -79
- package/src/vite/plugins/cjs-to-esm.ts +5 -0
- package/src/vite/plugins/client-ref-dedup.ts +16 -0
- package/src/vite/plugins/client-ref-hashing.ts +16 -4
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/plugins/expose-action-id.ts +53 -31
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +563 -316
- package/src/vite/plugins/performance-tracks.ts +96 -0
- package/src/vite/plugins/refresh-cmd.ts +88 -26
- package/src/vite/plugins/use-cache-transform.ts +56 -43
- package/src/vite/plugins/version-injector.ts +37 -11
- package/src/vite/plugins/version-plugin.ts +13 -1
- package/src/vite/rango.ts +204 -217
- package/src/vite/router-discovery.ts +732 -94
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +38 -5
- package/src/vite/utils/shared-utils.ts +3 -2
package/dist/vite/index.js
CHANGED
|
@@ -18,6 +18,9 @@ function hashId(filePath, exportName) {
|
|
|
18
18
|
const hash = crypto.createHash("sha256").update(input).digest("hex");
|
|
19
19
|
return `${hash.slice(0, 8)}#${exportName}`;
|
|
20
20
|
}
|
|
21
|
+
function makeStubId(filePath, exportName, isBuild) {
|
|
22
|
+
return isBuild ? hashId(filePath, exportName) : `${filePath}#${exportName}`;
|
|
23
|
+
}
|
|
21
24
|
function hashInlineId(filePath, lineNumber, index) {
|
|
22
25
|
const input = index !== void 0 && index > 0 ? `${filePath}:${lineNumber}:${index}` : `${filePath}:${lineNumber}`;
|
|
23
26
|
return crypto.createHash("sha256").update(input).digest("hex").slice(0, 8);
|
|
@@ -188,7 +191,99 @@ function escapeRegExp(input) {
|
|
|
188
191
|
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
189
192
|
}
|
|
190
193
|
|
|
194
|
+
// src/vite/debug.ts
|
|
195
|
+
import debugFactory from "debug";
|
|
196
|
+
var NS = {
|
|
197
|
+
config: "rango:config",
|
|
198
|
+
discovery: "rango:discovery",
|
|
199
|
+
routes: "rango:routes",
|
|
200
|
+
prerender: "rango:prerender",
|
|
201
|
+
build: "rango:build",
|
|
202
|
+
dev: "rango:dev",
|
|
203
|
+
transform: "rango:transform"
|
|
204
|
+
};
|
|
205
|
+
if (process.env.INTERNAL_RANGO_DEBUG) {
|
|
206
|
+
const existing = debugFactory.disable();
|
|
207
|
+
debugFactory.enable(existing ? `${existing},rango:*` : "rango:*");
|
|
208
|
+
}
|
|
209
|
+
function createRangoDebugger(namespace) {
|
|
210
|
+
const primary = debugFactory(namespace);
|
|
211
|
+
const shadow = debugFactory(`vite:${namespace}`);
|
|
212
|
+
if (primary.enabled) return primary;
|
|
213
|
+
if (shadow.enabled) return shadow;
|
|
214
|
+
return void 0;
|
|
215
|
+
}
|
|
216
|
+
async function timed(debug11, label, fn) {
|
|
217
|
+
if (!debug11) return await fn();
|
|
218
|
+
const start = performance.now();
|
|
219
|
+
try {
|
|
220
|
+
return await fn();
|
|
221
|
+
} finally {
|
|
222
|
+
debug11("%s (%sms)", label, (performance.now() - start).toFixed(1));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function timedSync(debug11, label, fn) {
|
|
226
|
+
if (!debug11) return fn();
|
|
227
|
+
const start = performance.now();
|
|
228
|
+
try {
|
|
229
|
+
return fn();
|
|
230
|
+
} finally {
|
|
231
|
+
debug11("%s (%sms)", label, (performance.now() - start).toFixed(1));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function createCounter(debug11, label) {
|
|
235
|
+
if (!debug11) return void 0;
|
|
236
|
+
let n = 0;
|
|
237
|
+
let totalMs = 0;
|
|
238
|
+
let slowestMs = 0;
|
|
239
|
+
let slowestFile = "";
|
|
240
|
+
const record = (file, ms) => {
|
|
241
|
+
n++;
|
|
242
|
+
totalMs += ms;
|
|
243
|
+
if (ms > slowestMs) {
|
|
244
|
+
slowestMs = ms;
|
|
245
|
+
slowestFile = file;
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
return {
|
|
249
|
+
record,
|
|
250
|
+
time(file, fn) {
|
|
251
|
+
const start = performance.now();
|
|
252
|
+
let out;
|
|
253
|
+
try {
|
|
254
|
+
out = fn();
|
|
255
|
+
} catch (err) {
|
|
256
|
+
record(file, performance.now() - start);
|
|
257
|
+
throw err;
|
|
258
|
+
}
|
|
259
|
+
if (out && typeof out.then === "function") {
|
|
260
|
+
return out.finally(
|
|
261
|
+
() => record(file, performance.now() - start)
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
record(file, performance.now() - start);
|
|
265
|
+
return out;
|
|
266
|
+
},
|
|
267
|
+
flush() {
|
|
268
|
+
if (n === 0) return;
|
|
269
|
+
debug11(
|
|
270
|
+
"%s: %d files, %sms total, slowest %sms %s",
|
|
271
|
+
label,
|
|
272
|
+
n,
|
|
273
|
+
totalMs.toFixed(1),
|
|
274
|
+
slowestMs.toFixed(1),
|
|
275
|
+
slowestFile
|
|
276
|
+
);
|
|
277
|
+
n = 0;
|
|
278
|
+
totalMs = 0;
|
|
279
|
+
slowestMs = 0;
|
|
280
|
+
slowestFile = "";
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
191
285
|
// src/vite/plugins/expose-action-id.ts
|
|
286
|
+
var debug = createRangoDebugger(NS.transform);
|
|
192
287
|
function getRscPluginApi(config) {
|
|
193
288
|
let plugin = config.plugins.find((p) => p.name === "rsc:minimal");
|
|
194
289
|
if (!plugin) {
|
|
@@ -277,6 +372,8 @@ function exposeActionId() {
|
|
|
277
372
|
let isBuild = false;
|
|
278
373
|
let hashToFileMap;
|
|
279
374
|
let rscPluginApi;
|
|
375
|
+
const counterTransform = createCounter(debug, "expose-action-id transform");
|
|
376
|
+
const counterRender = createCounter(debug, "expose-action-id renderChunk");
|
|
280
377
|
return {
|
|
281
378
|
name: "@rangojs/router:expose-action-id",
|
|
282
379
|
// Run after all other plugins (including RSC plugin's transforms)
|
|
@@ -286,13 +383,17 @@ function exposeActionId() {
|
|
|
286
383
|
isBuild = config.command === "build";
|
|
287
384
|
rscPluginApi = getRscPluginApi(config);
|
|
288
385
|
},
|
|
386
|
+
buildEnd() {
|
|
387
|
+
counterTransform?.flush();
|
|
388
|
+
counterRender?.flush();
|
|
389
|
+
},
|
|
289
390
|
buildStart() {
|
|
290
391
|
if (!rscPluginApi) {
|
|
291
392
|
rscPluginApi = getRscPluginApi(config);
|
|
292
393
|
}
|
|
293
394
|
if (!rscPluginApi) {
|
|
294
395
|
throw new Error(
|
|
295
|
-
"[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin
|
|
396
|
+
"[rsc-router] Could not find @vitejs/plugin-rsc. @rangojs/router requires the Vite RSC plugin, which is included automatically by rango()."
|
|
296
397
|
);
|
|
297
398
|
}
|
|
298
399
|
if (!isBuild) return;
|
|
@@ -322,28 +423,42 @@ function exposeActionId() {
|
|
|
322
423
|
if (id.includes("/node_modules/")) {
|
|
323
424
|
return;
|
|
324
425
|
}
|
|
325
|
-
|
|
426
|
+
const start = counterTransform ? performance.now() : 0;
|
|
427
|
+
try {
|
|
428
|
+
return transformServerReferences(code, id);
|
|
429
|
+
} finally {
|
|
430
|
+
counterTransform?.record(id, performance.now() - start);
|
|
431
|
+
}
|
|
326
432
|
},
|
|
327
433
|
// Build mode: renderChunk runs after all transforms and bundling complete
|
|
328
434
|
renderChunk(code, chunk) {
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
code
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
435
|
+
const start = counterRender ? performance.now() : 0;
|
|
436
|
+
try {
|
|
437
|
+
const isRscEnv = this.environment?.name === "rsc";
|
|
438
|
+
const effectiveMap = isRscEnv ? hashToFileMap : void 0;
|
|
439
|
+
if (isRscEnv && hashToFileMap) {
|
|
440
|
+
const s = new MagicString(code);
|
|
441
|
+
const changed1 = applyServerReferenceWrapping(code, s, effectiveMap);
|
|
442
|
+
const changed2 = applyRegisterReferenceWrapping(
|
|
443
|
+
code,
|
|
444
|
+
s,
|
|
445
|
+
hashToFileMap
|
|
446
|
+
);
|
|
447
|
+
if (changed1 || changed2) {
|
|
448
|
+
return {
|
|
449
|
+
code: s.toString(),
|
|
450
|
+
map: s.generateMap({
|
|
451
|
+
source: chunk.fileName,
|
|
452
|
+
includeContent: true
|
|
453
|
+
})
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
return null;
|
|
343
457
|
}
|
|
344
|
-
return
|
|
458
|
+
return transformServerReferences(code, chunk.fileName, effectiveMap);
|
|
459
|
+
} finally {
|
|
460
|
+
counterRender?.record(chunk.fileName, performance.now() - start);
|
|
345
461
|
}
|
|
346
|
-
return transformServerReferences(code, chunk.fileName, effectiveMap);
|
|
347
462
|
}
|
|
348
463
|
};
|
|
349
464
|
}
|
|
@@ -910,9 +1025,7 @@ function generateWholeFileStubs(cfg, bindings, code, filePath, isBuild) {
|
|
|
910
1025
|
});
|
|
911
1026
|
return { code: stubs.join("\n") + "\n", map: null };
|
|
912
1027
|
}
|
|
913
|
-
function
|
|
914
|
-
if (bindings.length === 0) return null;
|
|
915
|
-
const s = new MagicString2(code);
|
|
1028
|
+
function stubHandlerExprs(cfg, bindings, s, filePath, isBuild) {
|
|
916
1029
|
let hasChanges = false;
|
|
917
1030
|
for (const binding of bindings) {
|
|
918
1031
|
const exportName = binding.exportNames[0];
|
|
@@ -924,15 +1037,7 @@ function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
|
|
|
924
1037
|
);
|
|
925
1038
|
hasChanges = true;
|
|
926
1039
|
}
|
|
927
|
-
|
|
928
|
-
return {
|
|
929
|
-
code: s.toString(),
|
|
930
|
-
map: s.generateMap({
|
|
931
|
-
source: sourceId,
|
|
932
|
-
includeContent: true,
|
|
933
|
-
hires: "boundary"
|
|
934
|
-
})
|
|
935
|
-
};
|
|
1040
|
+
return hasChanges;
|
|
936
1041
|
}
|
|
937
1042
|
function transformHandlerIds(cfg, bindings, s, filePath, isBuild) {
|
|
938
1043
|
let hasChanges = false;
|
|
@@ -960,6 +1065,7 @@ ${binding.localName}.$$id = "${handlerId}";`;
|
|
|
960
1065
|
import MagicString3 from "magic-string";
|
|
961
1066
|
import path3 from "node:path";
|
|
962
1067
|
import { createHash } from "node:crypto";
|
|
1068
|
+
var debug2 = createRangoDebugger(NS.transform);
|
|
963
1069
|
function transformRouter(code, filePath, routerFnNames, absolutePath) {
|
|
964
1070
|
const pat = new RegExp(
|
|
965
1071
|
`\\b(?:${routerFnNames.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\s*(?:<[^>]*>)?\\s*\\(`,
|
|
@@ -1002,11 +1108,15 @@ function transformRouter(code, filePath, routerFnNames, absolutePath) {
|
|
|
1002
1108
|
}
|
|
1003
1109
|
function exposeRouterId() {
|
|
1004
1110
|
let projectRoot = "";
|
|
1111
|
+
const counter = createCounter(debug2, "expose-router-id");
|
|
1005
1112
|
return {
|
|
1006
1113
|
name: "@rangojs/router:expose-router-id",
|
|
1007
1114
|
configResolved(config) {
|
|
1008
1115
|
projectRoot = config.root;
|
|
1009
1116
|
},
|
|
1117
|
+
buildEnd() {
|
|
1118
|
+
counter?.flush();
|
|
1119
|
+
},
|
|
1010
1120
|
transform(code, id) {
|
|
1011
1121
|
if (!code.includes("createRouter")) return null;
|
|
1012
1122
|
if (!/import\s*\{[^}]*\bcreateRouter\b[^}]*\}\s*from\s*["']@rangojs\/router(?:\/server)?["']/.test(
|
|
@@ -1015,14 +1125,25 @@ function exposeRouterId() {
|
|
|
1015
1125
|
return null;
|
|
1016
1126
|
}
|
|
1017
1127
|
if (id.includes("node_modules")) return null;
|
|
1018
|
-
const
|
|
1019
|
-
|
|
1020
|
-
|
|
1128
|
+
const start = counter ? performance.now() : 0;
|
|
1129
|
+
try {
|
|
1130
|
+
const filePath = normalizePath(path3.relative(projectRoot, id));
|
|
1131
|
+
const routerFnNames = getImportedFnNames(code, "createRouter");
|
|
1132
|
+
return transformRouter(
|
|
1133
|
+
code,
|
|
1134
|
+
filePath,
|
|
1135
|
+
routerFnNames,
|
|
1136
|
+
normalizePath(id)
|
|
1137
|
+
);
|
|
1138
|
+
} finally {
|
|
1139
|
+
counter?.record(id, performance.now() - start);
|
|
1140
|
+
}
|
|
1021
1141
|
}
|
|
1022
1142
|
};
|
|
1023
1143
|
}
|
|
1024
1144
|
|
|
1025
1145
|
// src/vite/plugins/expose-internal-ids.ts
|
|
1146
|
+
var debug3 = createRangoDebugger(NS.transform);
|
|
1026
1147
|
var VIRTUAL_LOADER_MANIFEST = "virtual:rsc-router/loader-manifest";
|
|
1027
1148
|
var RESOLVED_VIRTUAL_LOADER_MANIFEST = "\0" + VIRTUAL_LOADER_MANIFEST;
|
|
1028
1149
|
var VIRTUAL_HANDLER_PREFIX = "virtual:handler-extract:";
|
|
@@ -1035,9 +1156,13 @@ function exposeInternalIds(options) {
|
|
|
1035
1156
|
const staticHandlerModules = /* @__PURE__ */ new Map();
|
|
1036
1157
|
const virtualHandlers = /* @__PURE__ */ new Map();
|
|
1037
1158
|
const unsupportedShapeWarnings = /* @__PURE__ */ new Set();
|
|
1159
|
+
const counter = createCounter(debug3, "expose-internal-ids");
|
|
1038
1160
|
return {
|
|
1039
1161
|
name: "@rangojs/router:expose-internal-ids",
|
|
1040
1162
|
enforce: "post",
|
|
1163
|
+
buildEnd() {
|
|
1164
|
+
counter?.flush();
|
|
1165
|
+
},
|
|
1041
1166
|
api: {
|
|
1042
1167
|
prerenderHandlerModules,
|
|
1043
1168
|
staticHandlerModules
|
|
@@ -1151,11 +1276,13 @@ ${lazyImports.join(",\n")}
|
|
|
1151
1276
|
// --------------- Unified transform ---------------
|
|
1152
1277
|
transform(code, id) {
|
|
1153
1278
|
if (id.includes("/node_modules/")) return;
|
|
1154
|
-
const
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
this.
|
|
1158
|
-
|
|
1279
|
+
const __t0 = counter ? performance.now() : 0;
|
|
1280
|
+
try {
|
|
1281
|
+
const filePath = normalizePath(path4.relative(projectRoot, id));
|
|
1282
|
+
const isRscEnv = this.environment?.name === "rsc";
|
|
1283
|
+
if (id.includes(".named-routes.gen.") && !isRscEnv && this.environment?.name === "client") {
|
|
1284
|
+
this.warn(
|
|
1285
|
+
`
|
|
1159
1286
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1160
1287
|
!! !!
|
|
1161
1288
|
!! WARNING: NamedRoutes imported in a CLIENT component! !!
|
|
@@ -1175,228 +1302,373 @@ ${lazyImports.join(",\n")}
|
|
|
1175
1302
|
!! !!
|
|
1176
1303
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1177
1304
|
`
|
|
1178
|
-
|
|
1179
|
-
}
|
|
1180
|
-
if (!code.includes("@rangojs/router")) return;
|
|
1181
|
-
const has = detectImports(code);
|
|
1182
|
-
const hasLoaderCode = has.loader && code.includes("createLoader");
|
|
1183
|
-
const hasHandleCode = has.handle && code.includes("createHandle");
|
|
1184
|
-
const hasLocationStateCode = has.locationState && code.includes("createLocationState");
|
|
1185
|
-
const hasPrerenderHandlerCode = has.prerenderHandler && code.includes("Prerender");
|
|
1186
|
-
const hasStaticHandlerCode = has.staticHandler && code.includes("Static");
|
|
1187
|
-
if (!hasLoaderCode && !hasHandleCode && !hasLocationStateCode && !hasPrerenderHandlerCode && !hasStaticHandlerCode) {
|
|
1188
|
-
return;
|
|
1189
|
-
}
|
|
1190
|
-
const _fnNamesCache = /* @__PURE__ */ new Map();
|
|
1191
|
-
const _bindingsCache = /* @__PURE__ */ new Map();
|
|
1192
|
-
let _cachedAst;
|
|
1193
|
-
let _astParseFailed = false;
|
|
1194
|
-
let _astCodeRef = code;
|
|
1195
|
-
const getFnNames = (canonicalName) => {
|
|
1196
|
-
let result = _fnNamesCache.get(canonicalName);
|
|
1197
|
-
if (!result) {
|
|
1198
|
-
result = getImportedFnNames(code, canonicalName);
|
|
1199
|
-
_fnNamesCache.set(canonicalName, result);
|
|
1305
|
+
);
|
|
1200
1306
|
}
|
|
1201
|
-
return
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1307
|
+
if (!code.includes("@rangojs/router")) return;
|
|
1308
|
+
const has = detectImports(code);
|
|
1309
|
+
const hasLoaderCode = has.loader && code.includes("createLoader");
|
|
1310
|
+
const hasHandleCode = has.handle && code.includes("createHandle");
|
|
1311
|
+
const hasLocationStateCode = has.locationState && code.includes("createLocationState");
|
|
1312
|
+
const hasPrerenderHandlerCode = has.prerenderHandler && code.includes("Prerender");
|
|
1313
|
+
const hasStaticHandlerCode = has.staticHandler && code.includes("Static");
|
|
1314
|
+
if (!hasLoaderCode && !hasHandleCode && !hasLocationStateCode && !hasPrerenderHandlerCode && !hasStaticHandlerCode) {
|
|
1315
|
+
return;
|
|
1208
1316
|
}
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1317
|
+
const _fnNamesCache = /* @__PURE__ */ new Map();
|
|
1318
|
+
const _bindingsCache = /* @__PURE__ */ new Map();
|
|
1319
|
+
let _cachedAst;
|
|
1320
|
+
let _astParseFailed = false;
|
|
1321
|
+
let _astCodeRef = code;
|
|
1322
|
+
const getFnNames = (canonicalName) => {
|
|
1323
|
+
let result = _fnNamesCache.get(canonicalName);
|
|
1324
|
+
if (!result) {
|
|
1325
|
+
result = getImportedFnNames(code, canonicalName);
|
|
1326
|
+
_fnNamesCache.set(canonicalName, result);
|
|
1327
|
+
}
|
|
1328
|
+
return result;
|
|
1329
|
+
};
|
|
1330
|
+
const lazyAst = () => {
|
|
1331
|
+
if (code !== _astCodeRef) {
|
|
1332
|
+
_cachedAst = void 0;
|
|
1333
|
+
_astParseFailed = false;
|
|
1334
|
+
_astCodeRef = code;
|
|
1335
|
+
}
|
|
1336
|
+
if (_cachedAst !== void 0 || _astParseFailed) return _cachedAst;
|
|
1337
|
+
try {
|
|
1338
|
+
_cachedAst = parseAst2(code, { jsx: true });
|
|
1339
|
+
} catch {
|
|
1340
|
+
_astParseFailed = true;
|
|
1341
|
+
}
|
|
1342
|
+
return _cachedAst;
|
|
1343
|
+
};
|
|
1344
|
+
const getBindings = (currentCode, fnNames) => {
|
|
1345
|
+
const key = fnNames.join("\0");
|
|
1346
|
+
let result = _bindingsCache.get(key);
|
|
1347
|
+
if (!result) {
|
|
1348
|
+
result = collectCreateExportBindings(
|
|
1349
|
+
currentCode,
|
|
1350
|
+
fnNames,
|
|
1351
|
+
lazyAst()
|
|
1352
|
+
);
|
|
1353
|
+
_bindingsCache.set(key, result);
|
|
1354
|
+
}
|
|
1355
|
+
return result;
|
|
1356
|
+
};
|
|
1357
|
+
for (const cfg of STRICT_CREATE_CONFIGS) {
|
|
1358
|
+
const hasCode = cfg.fnName === "createLoader" ? hasLoaderCode : cfg.fnName === "createHandle" ? hasHandleCode : hasLocationStateCode;
|
|
1359
|
+
if (!hasCode) continue;
|
|
1360
|
+
const fnNames = getFnNames(cfg.fnName);
|
|
1361
|
+
const totalCalls = countCreateCallsForNames(code, fnNames);
|
|
1362
|
+
const supportedBindings = getBindings(code, fnNames).length;
|
|
1363
|
+
if (totalCalls <= supportedBindings) continue;
|
|
1364
|
+
const warnKey = `${id}::${cfg.fnName}`;
|
|
1365
|
+
if (unsupportedShapeWarnings.has(warnKey)) continue;
|
|
1366
|
+
unsupportedShapeWarnings.add(warnKey);
|
|
1367
|
+
this.warn(buildUnsupportedShapeWarning(filePath, cfg.fnName));
|
|
1214
1368
|
}
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1369
|
+
if (hasLoaderCode && isRscEnv) {
|
|
1370
|
+
const fnNames = getFnNames("createLoader");
|
|
1371
|
+
const bindings = getBindings(code, fnNames);
|
|
1372
|
+
for (const binding of bindings) {
|
|
1373
|
+
const exportName = binding.exportNames[0];
|
|
1374
|
+
const hashedId = hashId(filePath, exportName);
|
|
1375
|
+
loaderRegistry.set(hashedId, {
|
|
1376
|
+
filePath,
|
|
1377
|
+
exportName
|
|
1378
|
+
});
|
|
1379
|
+
}
|
|
1223
1380
|
}
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
const totalCalls = countCreateCallsForNames(code, fnNames);
|
|
1231
|
-
const supportedBindings = getBindings(code, fnNames).length;
|
|
1232
|
-
if (totalCalls <= supportedBindings) continue;
|
|
1233
|
-
const warnKey = `${id}::${cfg.fnName}`;
|
|
1234
|
-
if (unsupportedShapeWarnings.has(warnKey)) continue;
|
|
1235
|
-
unsupportedShapeWarnings.add(warnKey);
|
|
1236
|
-
this.warn(buildUnsupportedShapeWarning(filePath, cfg.fnName));
|
|
1237
|
-
}
|
|
1238
|
-
if (hasLoaderCode && isRscEnv) {
|
|
1239
|
-
const fnNames = getFnNames("createLoader");
|
|
1240
|
-
const bindings = getBindings(code, fnNames);
|
|
1241
|
-
for (const binding of bindings) {
|
|
1242
|
-
const exportName = binding.exportNames[0];
|
|
1243
|
-
const hashedId = hashId(filePath, exportName);
|
|
1244
|
-
loaderRegistry.set(hashedId, {
|
|
1381
|
+
if (hasLoaderCode && !isRscEnv) {
|
|
1382
|
+
const fnNames = getFnNames("createLoader");
|
|
1383
|
+
const bindings = getBindings(code, fnNames);
|
|
1384
|
+
const stubResult = generateClientLoaderStubs(
|
|
1385
|
+
bindings,
|
|
1386
|
+
code,
|
|
1245
1387
|
filePath,
|
|
1246
|
-
|
|
1247
|
-
|
|
1388
|
+
isBuild
|
|
1389
|
+
);
|
|
1390
|
+
if (stubResult) return stubResult;
|
|
1248
1391
|
}
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
}
|
|
1261
|
-
if (hasPrerenderHandlerCode && !isRscEnv) {
|
|
1262
|
-
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1263
|
-
const bindings = getBindings(code, fnNames);
|
|
1264
|
-
const wholeFile = generateWholeFileStubs(
|
|
1265
|
-
PRERENDER_CONFIG,
|
|
1266
|
-
bindings,
|
|
1267
|
-
code,
|
|
1268
|
-
filePath,
|
|
1269
|
-
isBuild
|
|
1270
|
-
);
|
|
1271
|
-
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
|
-
}
|
|
1282
|
-
if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
|
|
1283
|
-
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1284
|
-
const exportNames = getBindings(code, fnNames).map(
|
|
1285
|
-
(b) => b.exportNames[0]
|
|
1286
|
-
);
|
|
1287
|
-
if (exportNames.length > 0) {
|
|
1288
|
-
prerenderHandlerModules.set(id, exportNames);
|
|
1392
|
+
if (hasPrerenderHandlerCode && !isRscEnv) {
|
|
1393
|
+
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1394
|
+
const bindings = getBindings(code, fnNames);
|
|
1395
|
+
const wholeFile = generateWholeFileStubs(
|
|
1396
|
+
PRERENDER_CONFIG,
|
|
1397
|
+
bindings,
|
|
1398
|
+
code,
|
|
1399
|
+
filePath,
|
|
1400
|
+
isBuild
|
|
1401
|
+
);
|
|
1402
|
+
if (wholeFile) return wholeFile;
|
|
1289
1403
|
}
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
const
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
const
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1404
|
+
if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
|
|
1405
|
+
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1406
|
+
const exportNames = getBindings(code, fnNames).map(
|
|
1407
|
+
(b) => b.exportNames[0]
|
|
1408
|
+
);
|
|
1409
|
+
if (exportNames.length > 0) {
|
|
1410
|
+
prerenderHandlerModules.set(id, exportNames);
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
let changed = false;
|
|
1414
|
+
const handlerConfigs = [
|
|
1415
|
+
hasStaticHandlerCode && STATIC_CONFIG,
|
|
1416
|
+
hasPrerenderHandlerCode && PRERENDER_CONFIG
|
|
1417
|
+
].filter((c) => !!c).map((cfg) => {
|
|
1418
|
+
const fnNames = getFnNames(cfg.fnName);
|
|
1419
|
+
return { cfg, fnNames };
|
|
1420
|
+
});
|
|
1421
|
+
for (const { cfg, fnNames } of handlerConfigs) {
|
|
1422
|
+
const totalCalls = countCreateCallsForNames(code, fnNames);
|
|
1423
|
+
const supportedBindings = getBindings(code, fnNames).length;
|
|
1424
|
+
if (totalCalls > supportedBindings) {
|
|
1425
|
+
const iterS = new MagicString4(code);
|
|
1426
|
+
const result = transformInlineHandlers(
|
|
1427
|
+
cfg.fnName,
|
|
1428
|
+
VIRTUAL_HANDLER_PREFIX,
|
|
1429
|
+
iterS,
|
|
1430
|
+
code,
|
|
1431
|
+
filePath,
|
|
1432
|
+
virtualHandlers,
|
|
1433
|
+
id,
|
|
1434
|
+
parseAst2
|
|
1435
|
+
);
|
|
1436
|
+
if (result) {
|
|
1437
|
+
changed = true;
|
|
1438
|
+
code = iterS.toString();
|
|
1439
|
+
_bindingsCache.clear();
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
if (hasStaticHandlerCode && !isRscEnv) {
|
|
1444
|
+
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1445
|
+
const bindings = getBindings(code, fnNames);
|
|
1446
|
+
const wholeFile = generateWholeFileStubs(
|
|
1447
|
+
STATIC_CONFIG,
|
|
1448
|
+
bindings,
|
|
1308
1449
|
code,
|
|
1309
1450
|
filePath,
|
|
1310
|
-
|
|
1311
|
-
id,
|
|
1312
|
-
parseAst2
|
|
1451
|
+
isBuild
|
|
1313
1452
|
);
|
|
1314
|
-
if (
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1453
|
+
if (wholeFile) return wholeFile;
|
|
1454
|
+
}
|
|
1455
|
+
if (!isRscEnv && (hasPrerenderHandlerCode || hasStaticHandlerCode)) {
|
|
1456
|
+
const prerenderFnNames = hasPrerenderHandlerCode ? getFnNames(PRERENDER_CONFIG.fnName) : [];
|
|
1457
|
+
const staticFnNames = hasStaticHandlerCode ? getFnNames(STATIC_CONFIG.fnName) : [];
|
|
1458
|
+
const loaderFnNames = hasLoaderCode ? getFnNames("createLoader") : [];
|
|
1459
|
+
const handleFnNames = hasHandleCode ? getFnNames("createHandle") : [];
|
|
1460
|
+
const lsFnNames = hasLocationStateCode ? getFnNames("createLocationState") : [];
|
|
1461
|
+
const allBindings = [];
|
|
1462
|
+
for (const fnNames of [
|
|
1463
|
+
prerenderFnNames,
|
|
1464
|
+
staticFnNames,
|
|
1465
|
+
loaderFnNames,
|
|
1466
|
+
handleFnNames,
|
|
1467
|
+
lsFnNames
|
|
1468
|
+
]) {
|
|
1469
|
+
if (fnNames.length > 0) {
|
|
1470
|
+
allBindings.push(...getBindings(code, fnNames));
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
let canStubWholeFile = allBindings.length > 0 && isExportOnlyFile(code, allBindings);
|
|
1474
|
+
if (canStubWholeFile && (handleFnNames.length > 0 || lsFnNames.length > 0)) {
|
|
1475
|
+
const exportedLocals = new Set(allBindings.map((b) => b.localName));
|
|
1476
|
+
const strippedBindings = [];
|
|
1477
|
+
const localDeclPattern = /(?:^|;|\n)\s*(?:const|let|var|function)\s+(\w+)/g;
|
|
1478
|
+
let declMatch;
|
|
1479
|
+
while ((declMatch = localDeclPattern.exec(code)) !== null) {
|
|
1480
|
+
const name = declMatch[1];
|
|
1481
|
+
if (!exportedLocals.has(name) && !/^_c\d*$/.test(name)) {
|
|
1482
|
+
strippedBindings.push(name);
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
const importPattern = /import\s*\{([^}]*)\}\s*from\s*["'](?!@rangojs\/router)[^"']*["']/g;
|
|
1486
|
+
let importMatch;
|
|
1487
|
+
while ((importMatch = importPattern.exec(code)) !== null) {
|
|
1488
|
+
for (const spec of importMatch[1].split(",")) {
|
|
1489
|
+
const m = spec.trim().match(/^[A-Za-z_$][\w$]*(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);
|
|
1490
|
+
if (m)
|
|
1491
|
+
strippedBindings.push(m[1] || m[0].trim().split(/\s/)[0]);
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
const defaultImportPattern = /import\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
|
|
1495
|
+
while ((importMatch = defaultImportPattern.exec(code)) !== null) {
|
|
1496
|
+
strippedBindings.push(importMatch[1]);
|
|
1497
|
+
}
|
|
1498
|
+
const nsImportPattern = /import\s+\*\s+as\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
|
|
1499
|
+
while ((importMatch = nsImportPattern.exec(code)) !== null) {
|
|
1500
|
+
strippedBindings.push(importMatch[1]);
|
|
1501
|
+
}
|
|
1502
|
+
if (strippedBindings.length > 0) {
|
|
1503
|
+
const preservedBindings = allBindings.filter((b) => {
|
|
1504
|
+
const fc = code.slice(b.callExprStart, b.callOpenParenPos + 1);
|
|
1505
|
+
return handleFnNames.some((n) => fc.includes(n)) || lsFnNames.some((n) => fc.includes(n));
|
|
1506
|
+
});
|
|
1507
|
+
const strippedRe = new RegExp(
|
|
1508
|
+
`\\b(?:${strippedBindings.join("|")})\\b`
|
|
1509
|
+
);
|
|
1510
|
+
canStubWholeFile = !preservedBindings.some((b) => {
|
|
1511
|
+
const expr = code.slice(
|
|
1512
|
+
b.callExprStart,
|
|
1513
|
+
b.callCloseParenPos + 1
|
|
1514
|
+
);
|
|
1515
|
+
return strippedRe.test(expr);
|
|
1516
|
+
});
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
if (canStubWholeFile) {
|
|
1520
|
+
const lines = [];
|
|
1521
|
+
const neededImports = [];
|
|
1522
|
+
if (handleFnNames.length > 0) neededImports.push("createHandle");
|
|
1523
|
+
if (lsFnNames.length > 0) neededImports.push("createLocationState");
|
|
1524
|
+
if (neededImports.length > 0) {
|
|
1525
|
+
lines.push(
|
|
1526
|
+
`import { ${neededImports.join(", ")} } from "@rangojs/router";`
|
|
1527
|
+
);
|
|
1528
|
+
}
|
|
1529
|
+
for (const binding of allBindings) {
|
|
1530
|
+
const fnCall = code.slice(
|
|
1531
|
+
binding.callExprStart,
|
|
1532
|
+
binding.callOpenParenPos + 1
|
|
1533
|
+
);
|
|
1534
|
+
const isHandle = handleFnNames.some((n) => fnCall.includes(n));
|
|
1535
|
+
const isLocationState = lsFnNames.some((n) => fnCall.includes(n));
|
|
1536
|
+
const primaryName = binding.exportNames[0];
|
|
1537
|
+
const stubId = makeStubId(filePath, primaryName, isBuild);
|
|
1538
|
+
if (isHandle || isLocationState) {
|
|
1539
|
+
const rawArgs = code.slice(
|
|
1540
|
+
binding.callOpenParenPos + 1,
|
|
1541
|
+
binding.callCloseParenPos
|
|
1542
|
+
).replace(/\b_c\d*\s*=\s*/g, "");
|
|
1543
|
+
const canonicalName = isHandle ? "createHandle" : "createLocationState";
|
|
1544
|
+
const activeFnNames = isHandle ? handleFnNames : lsFnNames;
|
|
1545
|
+
let rawCallee = code.slice(
|
|
1546
|
+
binding.callExprStart,
|
|
1547
|
+
binding.callOpenParenPos
|
|
1548
|
+
);
|
|
1549
|
+
for (const alias of activeFnNames) {
|
|
1550
|
+
if (alias !== canonicalName && rawCallee.startsWith(alias)) {
|
|
1551
|
+
rawCallee = canonicalName + rawCallee.slice(alias.length);
|
|
1552
|
+
break;
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
if (isHandle) {
|
|
1556
|
+
const idParam = binding.argCount === 0 ? `undefined, "${stubId}"` : `, "${stubId}"`;
|
|
1557
|
+
lines.push(
|
|
1558
|
+
`export const ${primaryName} = ${rawCallee}(${rawArgs}${idParam});`
|
|
1559
|
+
);
|
|
1560
|
+
lines.push(`${primaryName}.$$id = "${stubId}";`);
|
|
1561
|
+
} else {
|
|
1562
|
+
lines.push(
|
|
1563
|
+
`export const ${primaryName} = ${rawCallee}(${rawArgs});`
|
|
1564
|
+
);
|
|
1565
|
+
lines.push(
|
|
1566
|
+
`${primaryName}.__rsc_ls_key = "__rsc_ls_${stubId}";`
|
|
1567
|
+
);
|
|
1568
|
+
}
|
|
1569
|
+
for (const name of binding.exportNames.slice(1)) {
|
|
1570
|
+
lines.push(`export const ${name} = ${primaryName};`);
|
|
1571
|
+
}
|
|
1572
|
+
} else {
|
|
1573
|
+
let brand = "loader";
|
|
1574
|
+
if (prerenderFnNames.some((n) => fnCall.includes(n))) {
|
|
1575
|
+
brand = PRERENDER_CONFIG.brand;
|
|
1576
|
+
} else if (staticFnNames.some((n) => fnCall.includes(n))) {
|
|
1577
|
+
brand = STATIC_CONFIG.brand;
|
|
1578
|
+
}
|
|
1579
|
+
lines.push(
|
|
1580
|
+
`export const ${primaryName} = { __brand: "${brand}", $$id: "${stubId}" };`
|
|
1581
|
+
);
|
|
1582
|
+
for (const name of binding.exportNames.slice(1)) {
|
|
1583
|
+
lines.push(`export const ${name} = ${primaryName};`);
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
return { code: lines.join("\n") + "\n", map: null };
|
|
1318
1588
|
}
|
|
1319
1589
|
}
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
filePath,
|
|
1329
|
-
isBuild
|
|
1330
|
-
);
|
|
1331
|
-
if (wholeFile) return wholeFile;
|
|
1332
|
-
const exprStubs = generateExprStubs(
|
|
1333
|
-
STATIC_CONFIG,
|
|
1334
|
-
bindings,
|
|
1335
|
-
code,
|
|
1336
|
-
filePath,
|
|
1337
|
-
id,
|
|
1338
|
-
isBuild
|
|
1339
|
-
);
|
|
1340
|
-
if (exprStubs) return exprStubs;
|
|
1341
|
-
}
|
|
1342
|
-
if (hasStaticHandlerCode && isRscEnv && isBuild) {
|
|
1343
|
-
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1344
|
-
const exportNames = getBindings(code, fnNames).map(
|
|
1345
|
-
(b) => b.exportNames[0]
|
|
1346
|
-
);
|
|
1347
|
-
if (exportNames.length > 0) {
|
|
1348
|
-
staticHandlerModules.set(id, exportNames);
|
|
1590
|
+
if (hasStaticHandlerCode && isRscEnv && isBuild) {
|
|
1591
|
+
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1592
|
+
const exportNames = getBindings(code, fnNames).map(
|
|
1593
|
+
(b) => b.exportNames[0]
|
|
1594
|
+
);
|
|
1595
|
+
if (exportNames.length > 0) {
|
|
1596
|
+
staticHandlerModules.set(id, exportNames);
|
|
1597
|
+
}
|
|
1349
1598
|
}
|
|
1599
|
+
const s = new MagicString4(code);
|
|
1600
|
+
if (hasLoaderCode) {
|
|
1601
|
+
const fnNames = getFnNames("createLoader");
|
|
1602
|
+
changed = transformLoaders(
|
|
1603
|
+
getBindings(code, fnNames),
|
|
1604
|
+
s,
|
|
1605
|
+
filePath,
|
|
1606
|
+
isBuild
|
|
1607
|
+
) || changed;
|
|
1608
|
+
}
|
|
1609
|
+
if (hasHandleCode) {
|
|
1610
|
+
const fnNames = getFnNames("createHandle");
|
|
1611
|
+
changed = transformHandles(
|
|
1612
|
+
getBindings(code, fnNames),
|
|
1613
|
+
s,
|
|
1614
|
+
code,
|
|
1615
|
+
filePath,
|
|
1616
|
+
isBuild
|
|
1617
|
+
) || changed;
|
|
1618
|
+
}
|
|
1619
|
+
if (hasLocationStateCode) {
|
|
1620
|
+
const fnNames = getFnNames("createLocationState");
|
|
1621
|
+
changed = transformLocationState(
|
|
1622
|
+
getBindings(code, fnNames),
|
|
1623
|
+
s,
|
|
1624
|
+
filePath,
|
|
1625
|
+
isBuild
|
|
1626
|
+
) || changed;
|
|
1627
|
+
}
|
|
1628
|
+
if (hasPrerenderHandlerCode) {
|
|
1629
|
+
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1630
|
+
const bindings = getBindings(code, fnNames);
|
|
1631
|
+
if (isRscEnv) {
|
|
1632
|
+
changed = transformHandlerIds(
|
|
1633
|
+
PRERENDER_CONFIG,
|
|
1634
|
+
bindings,
|
|
1635
|
+
s,
|
|
1636
|
+
filePath,
|
|
1637
|
+
isBuild
|
|
1638
|
+
) || changed;
|
|
1639
|
+
} else {
|
|
1640
|
+
changed = stubHandlerExprs(
|
|
1641
|
+
PRERENDER_CONFIG,
|
|
1642
|
+
bindings,
|
|
1643
|
+
s,
|
|
1644
|
+
filePath,
|
|
1645
|
+
isBuild
|
|
1646
|
+
) || changed;
|
|
1647
|
+
}
|
|
1648
|
+
}
|
|
1649
|
+
if (hasStaticHandlerCode) {
|
|
1650
|
+
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1651
|
+
const bindings = getBindings(code, fnNames);
|
|
1652
|
+
if (isRscEnv) {
|
|
1653
|
+
changed = transformHandlerIds(
|
|
1654
|
+
STATIC_CONFIG,
|
|
1655
|
+
bindings,
|
|
1656
|
+
s,
|
|
1657
|
+
filePath,
|
|
1658
|
+
isBuild
|
|
1659
|
+
) || changed;
|
|
1660
|
+
} else {
|
|
1661
|
+
changed = stubHandlerExprs(STATIC_CONFIG, bindings, s, filePath, isBuild) || changed;
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
if (!changed) return;
|
|
1665
|
+
return {
|
|
1666
|
+
code: s.toString(),
|
|
1667
|
+
map: s.generateMap({ source: id, includeContent: true })
|
|
1668
|
+
};
|
|
1669
|
+
} finally {
|
|
1670
|
+
counter?.record(id, performance.now() - __t0);
|
|
1350
1671
|
}
|
|
1351
|
-
const s = new MagicString4(code);
|
|
1352
|
-
if (hasLoaderCode) {
|
|
1353
|
-
const fnNames = getFnNames("createLoader");
|
|
1354
|
-
changed = transformLoaders(getBindings(code, fnNames), s, filePath, isBuild) || changed;
|
|
1355
|
-
}
|
|
1356
|
-
if (hasHandleCode) {
|
|
1357
|
-
const fnNames = getFnNames("createHandle");
|
|
1358
|
-
changed = transformHandles(
|
|
1359
|
-
getBindings(code, fnNames),
|
|
1360
|
-
s,
|
|
1361
|
-
code,
|
|
1362
|
-
filePath,
|
|
1363
|
-
isBuild
|
|
1364
|
-
) || changed;
|
|
1365
|
-
}
|
|
1366
|
-
if (hasLocationStateCode) {
|
|
1367
|
-
const fnNames = getFnNames("createLocationState");
|
|
1368
|
-
changed = transformLocationState(
|
|
1369
|
-
getBindings(code, fnNames),
|
|
1370
|
-
s,
|
|
1371
|
-
filePath,
|
|
1372
|
-
isBuild
|
|
1373
|
-
) || changed;
|
|
1374
|
-
}
|
|
1375
|
-
if (hasPrerenderHandlerCode && isRscEnv) {
|
|
1376
|
-
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1377
|
-
changed = transformHandlerIds(
|
|
1378
|
-
PRERENDER_CONFIG,
|
|
1379
|
-
getBindings(code, fnNames),
|
|
1380
|
-
s,
|
|
1381
|
-
filePath,
|
|
1382
|
-
isBuild
|
|
1383
|
-
) || changed;
|
|
1384
|
-
}
|
|
1385
|
-
if (hasStaticHandlerCode && isRscEnv) {
|
|
1386
|
-
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1387
|
-
changed = transformHandlerIds(
|
|
1388
|
-
STATIC_CONFIG,
|
|
1389
|
-
getBindings(code, fnNames),
|
|
1390
|
-
s,
|
|
1391
|
-
filePath,
|
|
1392
|
-
isBuild
|
|
1393
|
-
) || changed;
|
|
1394
|
-
}
|
|
1395
|
-
if (!changed) return;
|
|
1396
|
-
return {
|
|
1397
|
-
code: s.toString(),
|
|
1398
|
-
map: s.generateMap({ source: id, includeContent: true })
|
|
1399
|
-
};
|
|
1400
1672
|
}
|
|
1401
1673
|
};
|
|
1402
1674
|
}
|
|
@@ -1404,12 +1676,14 @@ ${lazyImports.join(",\n")}
|
|
|
1404
1676
|
// src/vite/plugins/use-cache-transform.ts
|
|
1405
1677
|
import path5 from "node:path";
|
|
1406
1678
|
import MagicString5 from "magic-string";
|
|
1679
|
+
var debug4 = createRangoDebugger(NS.transform);
|
|
1407
1680
|
var CACHE_RUNTIME_IMPORT = "@rangojs/router/cache-runtime";
|
|
1408
1681
|
var LAYOUT_TEMPLATE_PATTERN = /\/(layout|template)\.(tsx?|jsx?)$/;
|
|
1409
1682
|
function useCacheTransform() {
|
|
1410
1683
|
let projectRoot = "";
|
|
1411
1684
|
let isBuild = false;
|
|
1412
1685
|
let rscTransforms = null;
|
|
1686
|
+
const counter = createCounter(debug4, "use-cache");
|
|
1413
1687
|
return {
|
|
1414
1688
|
name: "@rangojs/router:use-cache",
|
|
1415
1689
|
enforce: "post",
|
|
@@ -1417,53 +1691,61 @@ function useCacheTransform() {
|
|
|
1417
1691
|
projectRoot = config.root;
|
|
1418
1692
|
isBuild = config.command === "build";
|
|
1419
1693
|
},
|
|
1694
|
+
buildEnd() {
|
|
1695
|
+
counter?.flush();
|
|
1696
|
+
},
|
|
1420
1697
|
async transform(code, id) {
|
|
1421
1698
|
if (this.environment?.name !== "rsc") return;
|
|
1422
1699
|
if (!code.includes("use cache")) return;
|
|
1423
1700
|
if (id.includes("/node_modules/") || id.startsWith("\0")) return;
|
|
1424
1701
|
if (!/\.(tsx?|jsx?|mjs)$/.test(id)) return;
|
|
1425
|
-
|
|
1702
|
+
const start = counter ? performance.now() : 0;
|
|
1703
|
+
try {
|
|
1704
|
+
if (!rscTransforms) {
|
|
1705
|
+
try {
|
|
1706
|
+
rscTransforms = await import("@vitejs/plugin-rsc/transforms");
|
|
1707
|
+
} catch {
|
|
1708
|
+
return;
|
|
1709
|
+
}
|
|
1710
|
+
}
|
|
1711
|
+
const {
|
|
1712
|
+
hasDirective,
|
|
1713
|
+
transformWrapExport,
|
|
1714
|
+
transformHoistInlineDirective
|
|
1715
|
+
} = rscTransforms;
|
|
1716
|
+
let ast;
|
|
1426
1717
|
try {
|
|
1427
|
-
|
|
1718
|
+
const { parseAst: parseAst4 } = await import("vite");
|
|
1719
|
+
ast = parseAst4(code);
|
|
1428
1720
|
} catch {
|
|
1429
1721
|
return;
|
|
1430
1722
|
}
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
hasDirective,
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
const isLayoutOrTemplate = LAYOUT_TEMPLATE_PATTERN.test(id);
|
|
1446
|
-
if (hasDirective(ast.body, "use cache")) {
|
|
1447
|
-
return transformFileLevelUseCache(
|
|
1723
|
+
const filePath = normalizePath(path5.relative(projectRoot, id));
|
|
1724
|
+
const isLayoutOrTemplate = LAYOUT_TEMPLATE_PATTERN.test(id);
|
|
1725
|
+
if (hasDirective(ast.body, "use cache")) {
|
|
1726
|
+
return transformFileLevelUseCache(
|
|
1727
|
+
code,
|
|
1728
|
+
ast,
|
|
1729
|
+
filePath,
|
|
1730
|
+
id,
|
|
1731
|
+
isBuild,
|
|
1732
|
+
isLayoutOrTemplate,
|
|
1733
|
+
transformWrapExport
|
|
1734
|
+
);
|
|
1735
|
+
}
|
|
1736
|
+
const functionResult = transformFunctionLevelUseCache(
|
|
1448
1737
|
code,
|
|
1449
1738
|
ast,
|
|
1450
1739
|
filePath,
|
|
1451
1740
|
id,
|
|
1452
1741
|
isBuild,
|
|
1453
|
-
|
|
1454
|
-
transformWrapExport
|
|
1742
|
+
transformHoistInlineDirective
|
|
1455
1743
|
);
|
|
1744
|
+
warnOnNearMissDirectives(ast, id, this.warn.bind(this));
|
|
1745
|
+
if (functionResult) return functionResult;
|
|
1746
|
+
} finally {
|
|
1747
|
+
counter?.record(id, performance.now() - start);
|
|
1456
1748
|
}
|
|
1457
|
-
const functionResult = transformFunctionLevelUseCache(
|
|
1458
|
-
code,
|
|
1459
|
-
ast,
|
|
1460
|
-
filePath,
|
|
1461
|
-
id,
|
|
1462
|
-
isBuild,
|
|
1463
|
-
transformHoistInlineDirective
|
|
1464
|
-
);
|
|
1465
|
-
warnOnNearMissDirectives(ast, id, this.warn.bind(this));
|
|
1466
|
-
if (functionResult) return functionResult;
|
|
1467
1749
|
}
|
|
1468
1750
|
};
|
|
1469
1751
|
}
|
|
@@ -1586,6 +1868,7 @@ function warnOnNearMissDirectives(ast, fileId, warn) {
|
|
|
1586
1868
|
}
|
|
1587
1869
|
|
|
1588
1870
|
// src/vite/plugins/client-ref-dedup.ts
|
|
1871
|
+
var debug5 = createRangoDebugger(NS.transform);
|
|
1589
1872
|
var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
|
|
1590
1873
|
function extractPackageName(absolutePath) {
|
|
1591
1874
|
const marker = "/node_modules/";
|
|
@@ -1602,6 +1885,7 @@ function extractPackageName(absolutePath) {
|
|
|
1602
1885
|
}
|
|
1603
1886
|
function clientRefDedup() {
|
|
1604
1887
|
let clientExclude = [];
|
|
1888
|
+
const dedupedPackages = /* @__PURE__ */ new Set();
|
|
1605
1889
|
return {
|
|
1606
1890
|
name: "@rangojs/router:client-ref-dedup",
|
|
1607
1891
|
enforce: "pre",
|
|
@@ -1610,6 +1894,15 @@ function clientRefDedup() {
|
|
|
1610
1894
|
const clientEnv = config.environments?.["client"];
|
|
1611
1895
|
clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
|
|
1612
1896
|
},
|
|
1897
|
+
buildEnd() {
|
|
1898
|
+
if (debug5 && dedupedPackages.size > 0) {
|
|
1899
|
+
debug5(
|
|
1900
|
+
"client-ref-dedup: redirected %d package(s) (%s)",
|
|
1901
|
+
dedupedPackages.size,
|
|
1902
|
+
[...dedupedPackages].join(",")
|
|
1903
|
+
);
|
|
1904
|
+
}
|
|
1905
|
+
},
|
|
1613
1906
|
resolveId(source, importer, options) {
|
|
1614
1907
|
if (this.environment?.name !== "client") return;
|
|
1615
1908
|
if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
|
|
@@ -1618,6 +1911,7 @@ function clientRefDedup() {
|
|
|
1618
1911
|
const packageName = extractPackageName(source);
|
|
1619
1912
|
if (!packageName) return;
|
|
1620
1913
|
if (clientExclude.includes(packageName)) return;
|
|
1914
|
+
if (debug5) dedupedPackages.add(packageName);
|
|
1621
1915
|
return `\0rango:dedup/${packageName}`;
|
|
1622
1916
|
},
|
|
1623
1917
|
load(id) {
|
|
@@ -1740,12 +2034,13 @@ function getVirtualVersionContent(version) {
|
|
|
1740
2034
|
|
|
1741
2035
|
// src/vite/utils/package-resolution.ts
|
|
1742
2036
|
import { existsSync } from "node:fs";
|
|
2037
|
+
import { createRequire } from "node:module";
|
|
1743
2038
|
import { resolve } from "node:path";
|
|
1744
2039
|
|
|
1745
2040
|
// package.json
|
|
1746
2041
|
var package_default = {
|
|
1747
2042
|
name: "@rangojs/router",
|
|
1748
|
-
version: "0.0.0-experimental.
|
|
2043
|
+
version: "0.0.0-experimental.2c0cb8a1",
|
|
1749
2044
|
description: "Django-inspired RSC router with composable URL patterns",
|
|
1750
2045
|
keywords: [
|
|
1751
2046
|
"react",
|
|
@@ -1878,16 +2173,18 @@ var package_default = {
|
|
|
1878
2173
|
tag: "experimental"
|
|
1879
2174
|
},
|
|
1880
2175
|
scripts: {
|
|
1881
|
-
build: "pnpm dlx esbuild src/vite/index.ts --bundle --format=esm --outfile=dist/vite/index.js --platform=node --packages=external && pnpm dlx esbuild src/bin/rango.ts --bundle --format=esm --outfile=dist/bin/rango.js --platform=node --packages=external --banner:js='#!/usr/bin/env node' && chmod +x dist/bin/rango.js",
|
|
2176
|
+
build: "pnpm dlx esbuild src/vite/index.ts --bundle --format=esm --outfile=dist/vite/index.js --platform=node --packages=external && mkdir -p dist/vite/plugins && cp src/vite/plugins/cloudflare-protocol-loader-hook.mjs dist/vite/plugins/cloudflare-protocol-loader-hook.mjs && pnpm dlx esbuild src/bin/rango.ts --bundle --format=esm --outfile=dist/bin/rango.js --platform=node --packages=external --banner:js='#!/usr/bin/env node' && chmod +x dist/bin/rango.js",
|
|
1882
2177
|
prepublishOnly: "pnpm build",
|
|
1883
|
-
typecheck: "tsc --noEmit",
|
|
2178
|
+
typecheck: "tsc --noEmit && tsc -p tsconfig.strict-check.json --noEmit",
|
|
1884
2179
|
test: "playwright test",
|
|
1885
2180
|
"test:ui": "playwright test --ui",
|
|
1886
2181
|
"test:unit": "vitest run",
|
|
1887
2182
|
"test:unit:watch": "vitest"
|
|
1888
2183
|
},
|
|
1889
2184
|
dependencies: {
|
|
1890
|
-
"@
|
|
2185
|
+
"@types/debug": "^4.1.12",
|
|
2186
|
+
"@vitejs/plugin-rsc": "^0.5.23",
|
|
2187
|
+
debug: "^4.4.1",
|
|
1891
2188
|
"magic-string": "^0.30.17",
|
|
1892
2189
|
picomatch: "^4.0.3",
|
|
1893
2190
|
"rsc-html-stream": "^0.0.7"
|
|
@@ -1907,7 +2204,7 @@ var package_default = {
|
|
|
1907
2204
|
},
|
|
1908
2205
|
peerDependencies: {
|
|
1909
2206
|
"@cloudflare/vite-plugin": "^1.25.0",
|
|
1910
|
-
"@vitejs/plugin-rsc": "^0.5.
|
|
2207
|
+
"@vitejs/plugin-rsc": "^0.5.23",
|
|
1911
2208
|
react: "^18.0.0 || ^19.0.0",
|
|
1912
2209
|
vite: "^7.3.0"
|
|
1913
2210
|
},
|
|
@@ -1922,6 +2219,7 @@ var package_default = {
|
|
|
1922
2219
|
};
|
|
1923
2220
|
|
|
1924
2221
|
// src/vite/utils/package-resolution.ts
|
|
2222
|
+
var require2 = createRequire(import.meta.url);
|
|
1925
2223
|
var VIRTUAL_PACKAGE_NAME = "@rangojs/router";
|
|
1926
2224
|
function getPublishedPackageName() {
|
|
1927
2225
|
return package_default.name;
|
|
@@ -1962,6 +2260,20 @@ function getPackageAliases() {
|
|
|
1962
2260
|
}
|
|
1963
2261
|
return aliases;
|
|
1964
2262
|
}
|
|
2263
|
+
function getVendorAliases() {
|
|
2264
|
+
const specs = [
|
|
2265
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge",
|
|
2266
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
2267
|
+
];
|
|
2268
|
+
const aliases = {};
|
|
2269
|
+
for (const spec of specs) {
|
|
2270
|
+
try {
|
|
2271
|
+
aliases[spec] = require2.resolve(spec);
|
|
2272
|
+
} catch {
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
return aliases;
|
|
2276
|
+
}
|
|
1965
2277
|
|
|
1966
2278
|
// src/build/route-types/param-extraction.ts
|
|
1967
2279
|
function extractParamsFromPattern(pattern) {
|
|
@@ -2095,31 +2407,7 @@ declare global {
|
|
|
2095
2407
|
}
|
|
2096
2408
|
|
|
2097
2409
|
// src/build/route-types/scan-filter.ts
|
|
2098
|
-
import { join, relative } from "node:path";
|
|
2099
2410
|
import picomatch from "picomatch";
|
|
2100
|
-
var DEFAULT_EXCLUDE_PATTERNS = [
|
|
2101
|
-
"**/__tests__/**",
|
|
2102
|
-
"**/__mocks__/**",
|
|
2103
|
-
"**/dist/**",
|
|
2104
|
-
"**/coverage/**",
|
|
2105
|
-
"**/*.test.{ts,tsx,js,jsx}",
|
|
2106
|
-
"**/*.spec.{ts,tsx,js,jsx}"
|
|
2107
|
-
];
|
|
2108
|
-
function createScanFilter(root, opts) {
|
|
2109
|
-
const { include, exclude } = opts;
|
|
2110
|
-
const hasInclude = include && include.length > 0;
|
|
2111
|
-
const hasCustomExclude = exclude !== void 0;
|
|
2112
|
-
if (!hasInclude && !hasCustomExclude) return void 0;
|
|
2113
|
-
const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
|
|
2114
|
-
const includeMatcher = hasInclude ? picomatch(include) : null;
|
|
2115
|
-
const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
|
|
2116
|
-
return (absolutePath) => {
|
|
2117
|
-
const rel = relative(root, absolutePath);
|
|
2118
|
-
if (excludeMatcher && excludeMatcher(rel)) return false;
|
|
2119
|
-
if (includeMatcher) return includeMatcher(rel);
|
|
2120
|
-
return true;
|
|
2121
|
-
};
|
|
2122
|
-
}
|
|
2123
2411
|
|
|
2124
2412
|
// src/build/route-types/per-module-writer.ts
|
|
2125
2413
|
import ts4 from "typescript";
|
|
@@ -2341,7 +2629,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2341
2629
|
}
|
|
2342
2630
|
return routeMap;
|
|
2343
2631
|
}
|
|
2344
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
|
|
2632
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
2345
2633
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
2346
2634
|
const realPath = resolve2(filePath);
|
|
2347
2635
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
@@ -2357,7 +2645,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2357
2645
|
return { routes: {}, searchSchemas: {} };
|
|
2358
2646
|
}
|
|
2359
2647
|
let block;
|
|
2360
|
-
if (
|
|
2648
|
+
if (inlineBlock) {
|
|
2649
|
+
block = inlineBlock;
|
|
2650
|
+
} else if (variableName) {
|
|
2361
2651
|
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
2362
2652
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
2363
2653
|
block = extracted;
|
|
@@ -2386,7 +2676,7 @@ import {
|
|
|
2386
2676
|
readdirSync
|
|
2387
2677
|
} from "node:fs";
|
|
2388
2678
|
import {
|
|
2389
|
-
join
|
|
2679
|
+
join,
|
|
2390
2680
|
dirname as dirname2,
|
|
2391
2681
|
resolve as resolve3,
|
|
2392
2682
|
sep,
|
|
@@ -2406,7 +2696,7 @@ function countPublicRouteEntries(source) {
|
|
|
2406
2696
|
}
|
|
2407
2697
|
var ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
|
|
2408
2698
|
function isRoutableSourceFile(name) {
|
|
2409
|
-
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.");
|
|
2699
|
+
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
|
|
2410
2700
|
}
|
|
2411
2701
|
function findRouterFilesRecursive(dir, filter, results) {
|
|
2412
2702
|
let entries;
|
|
@@ -2421,9 +2711,10 @@ function findRouterFilesRecursive(dir, filter, results) {
|
|
|
2421
2711
|
const childDirs = [];
|
|
2422
2712
|
const routerFilesInDir = [];
|
|
2423
2713
|
for (const entry of entries) {
|
|
2424
|
-
const fullPath =
|
|
2714
|
+
const fullPath = join(dir, entry.name);
|
|
2425
2715
|
if (entry.isDirectory()) {
|
|
2426
|
-
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
2716
|
+
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
|
|
2717
|
+
continue;
|
|
2427
2718
|
childDirs.push(fullPath);
|
|
2428
2719
|
continue;
|
|
2429
2720
|
}
|
|
@@ -2475,7 +2766,7 @@ Router root: ${conflict.ancestor}
|
|
|
2475
2766
|
Nested router: ${conflict.nested}
|
|
2476
2767
|
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
2477
2768
|
}
|
|
2478
|
-
function
|
|
2769
|
+
function extractUrlsFromRouter(code) {
|
|
2479
2770
|
const sourceFile = ts5.createSourceFile(
|
|
2480
2771
|
"router.tsx",
|
|
2481
2772
|
code,
|
|
@@ -2489,24 +2780,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2489
2780
|
const callee = node.expression;
|
|
2490
2781
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
2491
2782
|
}
|
|
2783
|
+
function isInlineBuilder(node) {
|
|
2784
|
+
return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
|
|
2785
|
+
}
|
|
2786
|
+
function isRoutesOnCreateRouter(node) {
|
|
2787
|
+
if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
|
|
2788
|
+
return false;
|
|
2789
|
+
let inner = node.expression.expression;
|
|
2790
|
+
while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
|
|
2791
|
+
inner = inner.expression.expression;
|
|
2792
|
+
}
|
|
2793
|
+
return isCreateRouterCall(inner);
|
|
2794
|
+
}
|
|
2492
2795
|
function visit(node) {
|
|
2493
2796
|
if (result) return;
|
|
2494
|
-
if (ts5.isCallExpression(node) &&
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
}
|
|
2499
|
-
|
|
2500
|
-
result = node.arguments[0].text;
|
|
2501
|
-
return;
|
|
2797
|
+
if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
|
|
2798
|
+
const arg = node.arguments[0];
|
|
2799
|
+
if (ts5.isIdentifier(arg)) {
|
|
2800
|
+
result = { kind: "variable", name: arg.text };
|
|
2801
|
+
} else if (isInlineBuilder(arg)) {
|
|
2802
|
+
result = { kind: "inline", block: arg.getText(sourceFile) };
|
|
2502
2803
|
}
|
|
2804
|
+
return;
|
|
2503
2805
|
}
|
|
2504
2806
|
if (isCreateRouterCall(node)) {
|
|
2505
2807
|
const callExpr = node;
|
|
2506
|
-
for (const
|
|
2808
|
+
for (const callArg of callExpr.arguments) {
|
|
2809
|
+
if (ts5.isObjectLiteralExpression(callArg)) {
|
|
2810
|
+
for (const prop of callArg.properties) {
|
|
2811
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
|
|
2812
|
+
if (ts5.isIdentifier(prop.initializer)) {
|
|
2813
|
+
result = { kind: "variable", name: prop.initializer.text };
|
|
2814
|
+
} else if (isInlineBuilder(prop.initializer)) {
|
|
2815
|
+
result = {
|
|
2816
|
+
kind: "inline",
|
|
2817
|
+
block: prop.initializer.getText(sourceFile)
|
|
2818
|
+
};
|
|
2819
|
+
}
|
|
2820
|
+
return;
|
|
2821
|
+
}
|
|
2822
|
+
}
|
|
2823
|
+
}
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
ts5.forEachChild(node, visit);
|
|
2827
|
+
}
|
|
2828
|
+
visit(sourceFile);
|
|
2829
|
+
return result;
|
|
2830
|
+
}
|
|
2831
|
+
function extractBasenameFromRouter(code) {
|
|
2832
|
+
const sourceFile = ts5.createSourceFile(
|
|
2833
|
+
"router.tsx",
|
|
2834
|
+
code,
|
|
2835
|
+
ts5.ScriptTarget.Latest,
|
|
2836
|
+
true,
|
|
2837
|
+
ts5.ScriptKind.TSX
|
|
2838
|
+
);
|
|
2839
|
+
let result;
|
|
2840
|
+
function visit(node) {
|
|
2841
|
+
if (result !== void 0) return;
|
|
2842
|
+
if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
|
|
2843
|
+
for (const arg of node.arguments) {
|
|
2507
2844
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
2508
2845
|
for (const prop of arg.properties) {
|
|
2509
|
-
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "
|
|
2846
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
|
|
2510
2847
|
result = prop.initializer.text;
|
|
2511
2848
|
return;
|
|
2512
2849
|
}
|
|
@@ -2519,6 +2856,19 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2519
2856
|
visit(sourceFile);
|
|
2520
2857
|
return result;
|
|
2521
2858
|
}
|
|
2859
|
+
function applyBasenameToRoutes(result, basename3) {
|
|
2860
|
+
const prefixed = {};
|
|
2861
|
+
for (const [name, pattern] of Object.entries(result.routes)) {
|
|
2862
|
+
if (pattern === "/") {
|
|
2863
|
+
prefixed[name] = basename3;
|
|
2864
|
+
} else if (basename3.endsWith("/") && pattern.startsWith("/")) {
|
|
2865
|
+
prefixed[name] = basename3 + pattern.slice(1);
|
|
2866
|
+
} else {
|
|
2867
|
+
prefixed[name] = basename3 + pattern;
|
|
2868
|
+
}
|
|
2869
|
+
}
|
|
2870
|
+
return { routes: prefixed, searchSchemas: result.searchSchemas };
|
|
2871
|
+
}
|
|
2522
2872
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
2523
2873
|
let routerSource;
|
|
2524
2874
|
try {
|
|
@@ -2526,19 +2876,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
2526
2876
|
} catch {
|
|
2527
2877
|
return { routes: {}, searchSchemas: {} };
|
|
2528
2878
|
}
|
|
2529
|
-
const
|
|
2530
|
-
if (!
|
|
2879
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
2880
|
+
if (!extraction) {
|
|
2531
2881
|
return { routes: {}, searchSchemas: {} };
|
|
2532
2882
|
}
|
|
2533
|
-
const
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2883
|
+
const rawBasename = extractBasenameFromRouter(routerSource);
|
|
2884
|
+
const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
|
|
2885
|
+
let result;
|
|
2886
|
+
if (extraction.kind === "inline") {
|
|
2887
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2888
|
+
routerFilePath,
|
|
2889
|
+
void 0,
|
|
2890
|
+
void 0,
|
|
2891
|
+
void 0,
|
|
2892
|
+
extraction.block
|
|
2893
|
+
);
|
|
2894
|
+
} else {
|
|
2895
|
+
const imported = resolveImportedVariable(routerSource, extraction.name);
|
|
2896
|
+
if (imported) {
|
|
2897
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2898
|
+
if (!targetFile) {
|
|
2899
|
+
return { routes: {}, searchSchemas: {} };
|
|
2900
|
+
}
|
|
2901
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2902
|
+
targetFile,
|
|
2903
|
+
imported.exportedName
|
|
2904
|
+
);
|
|
2905
|
+
} else {
|
|
2906
|
+
result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
|
|
2538
2907
|
}
|
|
2539
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
2540
2908
|
}
|
|
2541
|
-
|
|
2909
|
+
if (basename3) {
|
|
2910
|
+
result = applyBasenameToRoutes(result, basename3);
|
|
2911
|
+
}
|
|
2912
|
+
return result;
|
|
2542
2913
|
}
|
|
2543
2914
|
function findRouterFiles(root, filter) {
|
|
2544
2915
|
const result = [];
|
|
@@ -2547,7 +2918,7 @@ function findRouterFiles(root, filter) {
|
|
|
2547
2918
|
}
|
|
2548
2919
|
function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
2549
2920
|
try {
|
|
2550
|
-
const oldCombinedPath =
|
|
2921
|
+
const oldCombinedPath = join(root, "src", "named-routes.gen.ts");
|
|
2551
2922
|
if (existsSync3(oldCombinedPath)) {
|
|
2552
2923
|
unlinkSync(oldCombinedPath);
|
|
2553
2924
|
console.log(
|
|
@@ -2563,31 +2934,21 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
2563
2934
|
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
2564
2935
|
}
|
|
2565
2936
|
for (const routerFilePath of routerFilePaths) {
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
routerSource
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
2576
|
-
if (imported) {
|
|
2577
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2578
|
-
if (!targetFile) continue;
|
|
2579
|
-
result = buildCombinedRouteMapWithSearch(
|
|
2580
|
-
targetFile,
|
|
2581
|
-
imported.exportedName
|
|
2582
|
-
);
|
|
2583
|
-
} else {
|
|
2584
|
-
result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
2937
|
+
const result = buildCombinedRouteMapForRouterFile(routerFilePath);
|
|
2938
|
+
if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
|
|
2939
|
+
let routerSource;
|
|
2940
|
+
try {
|
|
2941
|
+
routerSource = readFileSync2(routerFilePath, "utf-8");
|
|
2942
|
+
} catch {
|
|
2943
|
+
continue;
|
|
2944
|
+
}
|
|
2945
|
+
if (!extractUrlsFromRouter(routerSource)) continue;
|
|
2585
2946
|
}
|
|
2586
2947
|
const routerBasename = pathBasename(routerFilePath).replace(
|
|
2587
2948
|
/\.(tsx?|jsx?)$/,
|
|
2588
2949
|
""
|
|
2589
2950
|
);
|
|
2590
|
-
const outPath =
|
|
2951
|
+
const outPath = join(
|
|
2591
2952
|
dirname2(routerFilePath),
|
|
2592
2953
|
`${routerBasename}.named-routes.gen.ts`
|
|
2593
2954
|
);
|
|
@@ -2717,8 +3078,9 @@ function createVersionPlugin() {
|
|
|
2717
3078
|
let isDev = false;
|
|
2718
3079
|
let server = null;
|
|
2719
3080
|
const clientModuleSignatures = /* @__PURE__ */ new Map();
|
|
3081
|
+
let versionCounter = 0;
|
|
2720
3082
|
const bumpVersion = (reason) => {
|
|
2721
|
-
currentVersion = Date.now().toString(16);
|
|
3083
|
+
currentVersion = Date.now().toString(16) + String(++versionCounter);
|
|
2722
3084
|
console.log(`[rsc-router] ${reason}, version updated: ${currentVersion}`);
|
|
2723
3085
|
const rscEnv = server?.environments?.rsc;
|
|
2724
3086
|
const versionMod = rscEnv?.moduleGraph?.getModuleById(
|
|
@@ -2774,6 +3136,9 @@ function createVersionPlugin() {
|
|
|
2774
3136
|
if (!isDev) return;
|
|
2775
3137
|
const isRscModule = this.environment?.name === "rsc";
|
|
2776
3138
|
if (!isRscModule) return;
|
|
3139
|
+
if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
|
|
3140
|
+
return;
|
|
3141
|
+
}
|
|
2777
3142
|
if (isCodeModule(ctx.file)) {
|
|
2778
3143
|
const filePath = normalizeModuleId(ctx.file);
|
|
2779
3144
|
const previousSignature = clientModuleSignatures.get(filePath);
|
|
@@ -2803,6 +3168,73 @@ function createVersionPlugin() {
|
|
|
2803
3168
|
|
|
2804
3169
|
// src/vite/utils/shared-utils.ts
|
|
2805
3170
|
import * as Vite from "vite";
|
|
3171
|
+
|
|
3172
|
+
// src/vite/plugins/performance-tracks.ts
|
|
3173
|
+
import { readFile } from "node:fs/promises";
|
|
3174
|
+
var debug6 = createRangoDebugger(NS.transform);
|
|
3175
|
+
var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
|
|
3176
|
+
function buildPatchReplacement(match, debugInfoVar) {
|
|
3177
|
+
return `${match}
|
|
3178
|
+
if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
|
|
3179
|
+
var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
|
|
3180
|
+
if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
|
|
3181
|
+
${debugInfoVar} = _resolved._debugInfo;
|
|
3182
|
+
}
|
|
3183
|
+
}`;
|
|
3184
|
+
}
|
|
3185
|
+
function patchRsdwClientDebugInfoRecovery(code) {
|
|
3186
|
+
const match = code.match(RSDW_PATCH_RE);
|
|
3187
|
+
if (!match) {
|
|
3188
|
+
return { code, debugInfoVar: null };
|
|
3189
|
+
}
|
|
3190
|
+
return {
|
|
3191
|
+
code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
|
|
3192
|
+
debugInfoVar: match[2]
|
|
3193
|
+
};
|
|
3194
|
+
}
|
|
3195
|
+
function performanceTracksOptimizeDepsPlugin() {
|
|
3196
|
+
return {
|
|
3197
|
+
name: "@rangojs/router:performance-tracks-optimize-deps",
|
|
3198
|
+
setup(build) {
|
|
3199
|
+
build.onLoad(
|
|
3200
|
+
{
|
|
3201
|
+
filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
|
|
3202
|
+
},
|
|
3203
|
+
async (args) => {
|
|
3204
|
+
const code = await readFile(args.path, "utf8");
|
|
3205
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
3206
|
+
return {
|
|
3207
|
+
contents: patched.code,
|
|
3208
|
+
loader: "js"
|
|
3209
|
+
};
|
|
3210
|
+
}
|
|
3211
|
+
);
|
|
3212
|
+
}
|
|
3213
|
+
};
|
|
3214
|
+
}
|
|
3215
|
+
function performanceTracksPlugin() {
|
|
3216
|
+
const counter = createCounter(debug6, "performance-tracks");
|
|
3217
|
+
return {
|
|
3218
|
+
name: "@rangojs/router:performance-tracks",
|
|
3219
|
+
buildEnd() {
|
|
3220
|
+
counter?.flush();
|
|
3221
|
+
},
|
|
3222
|
+
transform(code, id) {
|
|
3223
|
+
if (!id.includes("react-server-dom") || !id.includes("client")) return;
|
|
3224
|
+
const start = counter ? performance.now() : 0;
|
|
3225
|
+
try {
|
|
3226
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
3227
|
+
if (!patched.debugInfoVar) return;
|
|
3228
|
+
debug6?.("patched RSDW client (var: %s)", patched.debugInfoVar);
|
|
3229
|
+
return patched.code;
|
|
3230
|
+
} finally {
|
|
3231
|
+
counter?.record(id, performance.now() - start);
|
|
3232
|
+
}
|
|
3233
|
+
}
|
|
3234
|
+
};
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
// src/vite/utils/shared-utils.ts
|
|
2806
3238
|
var versionEsbuildPlugin = {
|
|
2807
3239
|
name: "@rangojs/router-version",
|
|
2808
3240
|
setup(build) {
|
|
@@ -2820,7 +3252,7 @@ var versionEsbuildPlugin = {
|
|
|
2820
3252
|
}
|
|
2821
3253
|
};
|
|
2822
3254
|
var sharedEsbuildOptions = {
|
|
2823
|
-
plugins: [versionEsbuildPlugin]
|
|
3255
|
+
plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
|
|
2824
3256
|
};
|
|
2825
3257
|
function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
2826
3258
|
const virtualModules = {};
|
|
@@ -2903,11 +3335,11 @@ ${dim} \u2571${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2
|
|
|
2903
3335
|
${dim} ${reset}${bold}\u2551 \u2551${reset} ${bold}\u2554\u2550\u2557${reset}${dim} * \u2727. \u2571${reset}
|
|
2904
3336
|
${dim} ${reset}${bold}\u2554\u2557 \u2551 \u2551 \u2551 \u2551${reset}${dim} * \u2571${reset}
|
|
2905
3337
|
${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}
|
|
2906
|
-
${dim}
|
|
3338
|
+
${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}
|
|
2907
3339
|
${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}
|
|
2908
3340
|
${dim} ${reset}${bold}\u255A\u2550\u2550\u2557 \u2551${reset}${dim} * RSC Wrangler \u2727 \u2726${reset}
|
|
2909
|
-
${dim} * ${reset}${bold}\u2551 \
|
|
2910
|
-
${bold}\u2550\u2550\u2550\
|
|
3341
|
+
${dim} * ${reset}${bold}\u2551 \u2551${reset}${dim} * \u2727. \u2571${reset}
|
|
3342
|
+
${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550${reset}${dim} \u2726 *${reset}
|
|
2911
3343
|
|
|
2912
3344
|
v${version} \xB7 ${preset} \xB7 ${mode}
|
|
2913
3345
|
`;
|
|
@@ -2944,11 +3376,10 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2944
3376
|
if (normalizedId !== normalizedEntry) {
|
|
2945
3377
|
return null;
|
|
2946
3378
|
}
|
|
2947
|
-
const prepend = [
|
|
3379
|
+
const prepend = [
|
|
3380
|
+
`import "virtual:rsc-router/routes-manifest";`
|
|
3381
|
+
];
|
|
2948
3382
|
let newCode = code;
|
|
2949
|
-
if (!code.includes("virtual:rsc-router/routes-manifest")) {
|
|
2950
|
-
prepend.push(`import "virtual:rsc-router/routes-manifest";`);
|
|
2951
|
-
}
|
|
2952
3383
|
const needsVersion = code.includes("createRSCHandler") && !code.includes("@rangojs/router:version") && /createRSCHandler\s*\(\s*\{/.test(code);
|
|
2953
3384
|
if (needsVersion) {
|
|
2954
3385
|
prepend.push(`import { VERSION } from "@rangojs/router:version";`);
|
|
@@ -2957,8 +3388,21 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2957
3388
|
"createRSCHandler({\n version: VERSION,"
|
|
2958
3389
|
);
|
|
2959
3390
|
}
|
|
2960
|
-
|
|
2961
|
-
|
|
3391
|
+
const lines = newCode.split("\n");
|
|
3392
|
+
let insertAt = 0;
|
|
3393
|
+
while (insertAt < lines.length) {
|
|
3394
|
+
const trimmed = lines[insertAt].trim();
|
|
3395
|
+
if (trimmed === "" || /^\/\/\/\s*<reference\b/.test(trimmed)) {
|
|
3396
|
+
insertAt++;
|
|
3397
|
+
} else {
|
|
3398
|
+
break;
|
|
3399
|
+
}
|
|
3400
|
+
}
|
|
3401
|
+
newCode = [
|
|
3402
|
+
...lines.slice(0, insertAt),
|
|
3403
|
+
...prepend,
|
|
3404
|
+
...lines.slice(insertAt)
|
|
3405
|
+
].join("\n");
|
|
2962
3406
|
return {
|
|
2963
3407
|
code: newCode,
|
|
2964
3408
|
map: null
|
|
@@ -2968,6 +3412,7 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2968
3412
|
}
|
|
2969
3413
|
|
|
2970
3414
|
// src/vite/plugins/cjs-to-esm.ts
|
|
3415
|
+
var debug7 = createRangoDebugger(NS.transform);
|
|
2971
3416
|
function createCjsToEsmPlugin() {
|
|
2972
3417
|
return {
|
|
2973
3418
|
name: "@rangojs/router:cjs-to-esm",
|
|
@@ -2977,6 +3422,7 @@ function createCjsToEsmPlugin() {
|
|
|
2977
3422
|
if (cleanId.includes("vendor/react-server-dom/client.browser.js") || cleanId.includes("vendor\\react-server-dom\\client.browser.js")) {
|
|
2978
3423
|
const isProd = process.env.NODE_ENV === "production";
|
|
2979
3424
|
const cjsFile = isProd ? "./cjs/react-server-dom-webpack-client.browser.production.js" : "./cjs/react-server-dom-webpack-client.browser.development.js";
|
|
3425
|
+
debug7?.("cjs-to-esm entry redirect %s", id);
|
|
2980
3426
|
return {
|
|
2981
3427
|
code: `export * from "${cjsFile}";`,
|
|
2982
3428
|
map: null
|
|
@@ -3012,6 +3458,7 @@ function createCjsToEsmPlugin() {
|
|
|
3012
3458
|
"export const $1 ="
|
|
3013
3459
|
);
|
|
3014
3460
|
transformed = license + "\n" + transformed;
|
|
3461
|
+
debug7?.("cjs-to-esm body rewrite %s", id);
|
|
3015
3462
|
return {
|
|
3016
3463
|
code: transformed,
|
|
3017
3464
|
map: null
|
|
@@ -3026,6 +3473,8 @@ function createCjsToEsmPlugin() {
|
|
|
3026
3473
|
import { createServer as createViteServer } from "vite";
|
|
3027
3474
|
import { resolve as resolve8 } from "node:path";
|
|
3028
3475
|
import { readFileSync as readFileSync6 } from "node:fs";
|
|
3476
|
+
import { createRequire as createRequire2, register } from "node:module";
|
|
3477
|
+
import { pathToFileURL } from "node:url";
|
|
3029
3478
|
|
|
3030
3479
|
// src/vite/plugins/virtual-stub-plugin.ts
|
|
3031
3480
|
function createVirtualStubPlugin() {
|
|
@@ -3051,9 +3500,117 @@ function createVirtualStubPlugin() {
|
|
|
3051
3500
|
};
|
|
3052
3501
|
}
|
|
3053
3502
|
|
|
3503
|
+
// src/vite/plugins/cloudflare-protocol-stub.ts
|
|
3504
|
+
var VIRTUAL_PREFIX = "virtual:rango-cloudflare-stub-";
|
|
3505
|
+
var NULL_PREFIX = "\0" + VIRTUAL_PREFIX;
|
|
3506
|
+
var CF_PREFIX = "cloudflare:";
|
|
3507
|
+
var BUILD_ENV_GLOBAL_KEY = "__rango_build_env__";
|
|
3508
|
+
var SOURCE_EXT_RE = /\.[mc]?[jt]sx?$/;
|
|
3509
|
+
var IMPORT_NODE_TYPES = /* @__PURE__ */ new Set([
|
|
3510
|
+
"ImportDeclaration",
|
|
3511
|
+
"ImportExpression",
|
|
3512
|
+
"ExportNamedDeclaration",
|
|
3513
|
+
"ExportAllDeclaration"
|
|
3514
|
+
]);
|
|
3515
|
+
var STUBS = {
|
|
3516
|
+
"cloudflare:workers": `
|
|
3517
|
+
export class DurableObject { constructor(_ctx, _env) {} }
|
|
3518
|
+
export class WorkerEntrypoint { constructor(_ctx, _env) {} }
|
|
3519
|
+
export class WorkflowEntrypoint { constructor(_ctx, _env) {} }
|
|
3520
|
+
export class RpcTarget {}
|
|
3521
|
+
export const env = globalThis[${JSON.stringify(BUILD_ENV_GLOBAL_KEY)}] ?? {};
|
|
3522
|
+
export default {};
|
|
3523
|
+
`,
|
|
3524
|
+
"cloudflare:email": `
|
|
3525
|
+
export class EmailMessage { constructor(_from, _to, _raw) {} }
|
|
3526
|
+
export default {};
|
|
3527
|
+
`,
|
|
3528
|
+
"cloudflare:sockets": `
|
|
3529
|
+
export function connect() { return {}; }
|
|
3530
|
+
export default {};
|
|
3531
|
+
`,
|
|
3532
|
+
"cloudflare:workflows": `
|
|
3533
|
+
export class NonRetryableError extends Error {
|
|
3534
|
+
constructor(message, name) { super(message); this.name = name ?? "NonRetryableError"; }
|
|
3535
|
+
}
|
|
3536
|
+
export default {};
|
|
3537
|
+
`
|
|
3538
|
+
};
|
|
3539
|
+
var FALLBACK_STUB = `export default {};
|
|
3540
|
+
`;
|
|
3541
|
+
function createCloudflareProtocolStubPlugin() {
|
|
3542
|
+
return {
|
|
3543
|
+
name: "@rangojs/router:cloudflare-protocol-stub",
|
|
3544
|
+
transform(code, id) {
|
|
3545
|
+
const cleanId = id.split("?")[0] ?? id;
|
|
3546
|
+
if (!SOURCE_EXT_RE.test(cleanId)) return null;
|
|
3547
|
+
if (!code.includes(CF_PREFIX)) return null;
|
|
3548
|
+
let ast;
|
|
3549
|
+
try {
|
|
3550
|
+
ast = this.parse(code);
|
|
3551
|
+
} catch {
|
|
3552
|
+
return null;
|
|
3553
|
+
}
|
|
3554
|
+
const hits = [];
|
|
3555
|
+
walk(ast, (node) => {
|
|
3556
|
+
if (!IMPORT_NODE_TYPES.has(node.type)) return;
|
|
3557
|
+
const source = node.source;
|
|
3558
|
+
if (!source || source.type !== "Literal") return;
|
|
3559
|
+
if (typeof source.value !== "string") return;
|
|
3560
|
+
if (!source.value.startsWith(CF_PREFIX)) return;
|
|
3561
|
+
if (typeof source.start !== "number" || typeof source.end !== "number")
|
|
3562
|
+
return;
|
|
3563
|
+
hits.push({
|
|
3564
|
+
start: source.start,
|
|
3565
|
+
end: source.end,
|
|
3566
|
+
value: source.value
|
|
3567
|
+
});
|
|
3568
|
+
});
|
|
3569
|
+
if (hits.length === 0) return null;
|
|
3570
|
+
hits.sort((a, b) => b.start - a.start);
|
|
3571
|
+
let out = code;
|
|
3572
|
+
for (const hit of hits) {
|
|
3573
|
+
const submodule = hit.value.slice(CF_PREFIX.length);
|
|
3574
|
+
const quote = code[hit.start] === "'" ? "'" : '"';
|
|
3575
|
+
out = out.slice(0, hit.start) + quote + VIRTUAL_PREFIX + submodule + quote + out.slice(hit.end);
|
|
3576
|
+
}
|
|
3577
|
+
return { code: out, map: null };
|
|
3578
|
+
},
|
|
3579
|
+
resolveId(id) {
|
|
3580
|
+
if (id.startsWith(VIRTUAL_PREFIX)) {
|
|
3581
|
+
return "\0" + id;
|
|
3582
|
+
}
|
|
3583
|
+
return null;
|
|
3584
|
+
},
|
|
3585
|
+
load(id) {
|
|
3586
|
+
if (!id.startsWith(NULL_PREFIX)) return null;
|
|
3587
|
+
const submodule = id.slice(NULL_PREFIX.length);
|
|
3588
|
+
const specifier = CF_PREFIX + submodule;
|
|
3589
|
+
return STUBS[specifier] ?? FALLBACK_STUB;
|
|
3590
|
+
}
|
|
3591
|
+
};
|
|
3592
|
+
}
|
|
3593
|
+
function walk(node, visit) {
|
|
3594
|
+
if (!node || typeof node !== "object") return;
|
|
3595
|
+
if (Array.isArray(node)) {
|
|
3596
|
+
for (const child of node) walk(child, visit);
|
|
3597
|
+
return;
|
|
3598
|
+
}
|
|
3599
|
+
const n = node;
|
|
3600
|
+
if (typeof n.type !== "string") return;
|
|
3601
|
+
visit(n);
|
|
3602
|
+
for (const key in n) {
|
|
3603
|
+
if (key === "loc" || key === "start" || key === "end" || key === "range") {
|
|
3604
|
+
continue;
|
|
3605
|
+
}
|
|
3606
|
+
walk(n[key], visit);
|
|
3607
|
+
}
|
|
3608
|
+
}
|
|
3609
|
+
|
|
3054
3610
|
// src/vite/plugins/client-ref-hashing.ts
|
|
3055
|
-
import { relative
|
|
3611
|
+
import { relative } from "node:path";
|
|
3056
3612
|
import { createHash as createHash2 } from "node:crypto";
|
|
3613
|
+
var debug8 = createRangoDebugger(NS.transform);
|
|
3057
3614
|
var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
|
|
3058
3615
|
var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
|
|
3059
3616
|
var FS_PREFIX = "/@fs/";
|
|
@@ -3065,10 +3622,10 @@ function computeProductionHash(projectRoot, refKey) {
|
|
|
3065
3622
|
const absPath = decodeURIComponent(
|
|
3066
3623
|
refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
|
|
3067
3624
|
);
|
|
3068
|
-
toHash =
|
|
3625
|
+
toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
|
|
3069
3626
|
} else if (refKey.startsWith(FS_PREFIX)) {
|
|
3070
3627
|
const absPath = refKey.slice(FS_PREFIX.length - 1);
|
|
3071
|
-
toHash =
|
|
3628
|
+
toHash = relative(projectRoot, absPath).replaceAll("\\", "/");
|
|
3072
3629
|
} else if (refKey.startsWith("/")) {
|
|
3073
3630
|
toHash = refKey.slice(1);
|
|
3074
3631
|
} else {
|
|
@@ -3092,6 +3649,7 @@ function transformClientRefs(code, projectRoot) {
|
|
|
3092
3649
|
return hasReplacement ? result : null;
|
|
3093
3650
|
}
|
|
3094
3651
|
function hashClientRefs(projectRoot) {
|
|
3652
|
+
const counter = createCounter(debug8, "hash-client-refs");
|
|
3095
3653
|
return {
|
|
3096
3654
|
name: "@rangojs/router:hash-client-refs",
|
|
3097
3655
|
// Run after the RSC plugin's transform (default enforce is normal)
|
|
@@ -3099,10 +3657,18 @@ function hashClientRefs(projectRoot) {
|
|
|
3099
3657
|
applyToEnvironment(env) {
|
|
3100
3658
|
return env.name === "rsc";
|
|
3101
3659
|
},
|
|
3102
|
-
|
|
3103
|
-
|
|
3104
|
-
|
|
3105
|
-
|
|
3660
|
+
buildEnd() {
|
|
3661
|
+
counter?.flush();
|
|
3662
|
+
},
|
|
3663
|
+
transform(code, id) {
|
|
3664
|
+
const start = counter ? performance.now() : 0;
|
|
3665
|
+
try {
|
|
3666
|
+
const result = transformClientRefs(code, projectRoot);
|
|
3667
|
+
if (result === null) return;
|
|
3668
|
+
return { code: result, map: null };
|
|
3669
|
+
} finally {
|
|
3670
|
+
counter?.record(id, performance.now() - start);
|
|
3671
|
+
}
|
|
3106
3672
|
}
|
|
3107
3673
|
};
|
|
3108
3674
|
}
|
|
@@ -3209,8 +3775,8 @@ function createDiscoveryState(entryPath, opts) {
|
|
|
3209
3775
|
perRouterManifestDataMap: /* @__PURE__ */ new Map(),
|
|
3210
3776
|
prerenderManifestEntries: null,
|
|
3211
3777
|
staticManifestEntries: null,
|
|
3212
|
-
|
|
3213
|
-
|
|
3778
|
+
handlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3779
|
+
staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3214
3780
|
rscEntryFileName: null,
|
|
3215
3781
|
resolvedPrerenderModules: void 0,
|
|
3216
3782
|
resolvedStaticModules: void 0,
|
|
@@ -3230,6 +3796,12 @@ function markSelfGenWrite(state, filePath, content) {
|
|
|
3230
3796
|
state.selfWrittenGenFiles.set(filePath, { at: Date.now(), hash });
|
|
3231
3797
|
}
|
|
3232
3798
|
function consumeSelfGenWrite(state, filePath) {
|
|
3799
|
+
return checkSelfGenWrite(state, filePath, true);
|
|
3800
|
+
}
|
|
3801
|
+
function peekSelfGenWrite(state, filePath) {
|
|
3802
|
+
return checkSelfGenWrite(state, filePath, false);
|
|
3803
|
+
}
|
|
3804
|
+
function checkSelfGenWrite(state, filePath, consume) {
|
|
3233
3805
|
const info = state.selfWrittenGenFiles.get(filePath);
|
|
3234
3806
|
if (!info) return false;
|
|
3235
3807
|
if (Date.now() - info.at > state.SELF_WRITE_WINDOW_MS) {
|
|
@@ -3240,7 +3812,7 @@ function consumeSelfGenWrite(state, filePath) {
|
|
|
3240
3812
|
const current = readFileSync3(filePath, "utf-8");
|
|
3241
3813
|
const currentHash = createHash3("sha256").update(current).digest("hex");
|
|
3242
3814
|
if (currentHash === info.hash) {
|
|
3243
|
-
state.selfWrittenGenFiles.delete(filePath);
|
|
3815
|
+
if (consume) state.selfWrittenGenFiles.delete(filePath);
|
|
3244
3816
|
return true;
|
|
3245
3817
|
}
|
|
3246
3818
|
return false;
|
|
@@ -3293,8 +3865,17 @@ function jsonParseExpression(value) {
|
|
|
3293
3865
|
}
|
|
3294
3866
|
|
|
3295
3867
|
// src/context-var.ts
|
|
3868
|
+
var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
|
|
3869
|
+
"rango:non-cacheable-keys"
|
|
3870
|
+
);
|
|
3871
|
+
function getNonCacheableKeys(variables) {
|
|
3872
|
+
if (!variables[NON_CACHEABLE_KEYS]) {
|
|
3873
|
+
variables[NON_CACHEABLE_KEYS] = /* @__PURE__ */ new Set();
|
|
3874
|
+
}
|
|
3875
|
+
return variables[NON_CACHEABLE_KEYS];
|
|
3876
|
+
}
|
|
3296
3877
|
var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
3297
|
-
function contextSet(variables, keyOrVar, value) {
|
|
3878
|
+
function contextSet(variables, keyOrVar, value, options) {
|
|
3298
3879
|
if (typeof keyOrVar === "string") {
|
|
3299
3880
|
if (FORBIDDEN_KEYS.has(keyOrVar)) {
|
|
3300
3881
|
throw new Error(
|
|
@@ -3302,8 +3883,14 @@ function contextSet(variables, keyOrVar, value) {
|
|
|
3302
3883
|
);
|
|
3303
3884
|
}
|
|
3304
3885
|
variables[keyOrVar] = value;
|
|
3886
|
+
if (options?.cache === false) {
|
|
3887
|
+
getNonCacheableKeys(variables).add(keyOrVar);
|
|
3888
|
+
}
|
|
3305
3889
|
} else {
|
|
3306
3890
|
variables[keyOrVar.key] = value;
|
|
3891
|
+
if (options?.cache === false) {
|
|
3892
|
+
getNonCacheableKeys(variables).add(keyOrVar.key);
|
|
3893
|
+
}
|
|
3307
3894
|
}
|
|
3308
3895
|
}
|
|
3309
3896
|
|
|
@@ -3326,13 +3913,31 @@ function encodePathParam(value) {
|
|
|
3326
3913
|
}
|
|
3327
3914
|
function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
3328
3915
|
let result = pattern;
|
|
3916
|
+
let hadOmittedOptional = false;
|
|
3329
3917
|
for (const [key, value] of Object.entries(params)) {
|
|
3330
3918
|
const escaped = escapeRegExp2(key);
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3919
|
+
if (value === "") {
|
|
3920
|
+
result = result.replace(
|
|
3921
|
+
new RegExp(`:${escaped}(\\([^)]*\\))?(?!\\?)`),
|
|
3922
|
+
""
|
|
3923
|
+
);
|
|
3924
|
+
result = result.replace(`*${key}`, "");
|
|
3925
|
+
} else {
|
|
3926
|
+
result = result.replace(
|
|
3927
|
+
new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
|
|
3928
|
+
encode(value)
|
|
3929
|
+
);
|
|
3930
|
+
result = result.replace(`*${key}`, encode(value));
|
|
3931
|
+
}
|
|
3932
|
+
}
|
|
3933
|
+
result = result.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)(\([^)]*\))?\?/g, () => {
|
|
3934
|
+
hadOmittedOptional = true;
|
|
3935
|
+
return "";
|
|
3936
|
+
});
|
|
3937
|
+
if (hadOmittedOptional) {
|
|
3938
|
+
const hadTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
|
|
3939
|
+
result = result.replace(/\/\/+/g, "/").replace(/\/+$/, "") || "/";
|
|
3940
|
+
if (hadTrailingSlash && !result.endsWith("/")) result += "/";
|
|
3336
3941
|
}
|
|
3337
3942
|
return result;
|
|
3338
3943
|
}
|
|
@@ -3429,8 +4034,14 @@ function copyStagedBuildAssets(projectRoot, fileNames) {
|
|
|
3429
4034
|
}
|
|
3430
4035
|
|
|
3431
4036
|
// src/vite/discovery/prerender-collection.ts
|
|
4037
|
+
var debug9 = createRangoDebugger(NS.prerender);
|
|
3432
4038
|
async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
3433
4039
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode) return;
|
|
4040
|
+
const overallStart = debug9 ? performance.now() : 0;
|
|
4041
|
+
debug9?.(
|
|
4042
|
+
"expandPrerenderRoutes: start (%d router manifest(s))",
|
|
4043
|
+
allManifests.length
|
|
4044
|
+
);
|
|
3434
4045
|
const entries = [];
|
|
3435
4046
|
const allRoutes = {};
|
|
3436
4047
|
for (const { manifest: m } of allManifests) {
|
|
@@ -3442,91 +4053,151 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3442
4053
|
if (!params) return pattern;
|
|
3443
4054
|
return substituteRouteParams(pattern, params);
|
|
3444
4055
|
};
|
|
4056
|
+
let resolvedRoutes = 0;
|
|
4057
|
+
let totalDynamic = 0;
|
|
3445
4058
|
for (const { manifest } of allManifests) {
|
|
3446
4059
|
if (!manifest.prerenderRoutes) continue;
|
|
3447
|
-
const defs = manifest._prerenderDefs || {};
|
|
3448
4060
|
for (const routeName of manifest.prerenderRoutes) {
|
|
3449
4061
|
const pattern = manifest.routeManifest[routeName];
|
|
3450
|
-
if (
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
4062
|
+
if (pattern && (pattern.includes(":") || pattern.includes("*"))) {
|
|
4063
|
+
totalDynamic++;
|
|
4064
|
+
}
|
|
4065
|
+
}
|
|
4066
|
+
}
|
|
4067
|
+
const paramsStart = performance.now();
|
|
4068
|
+
const progressInterval = totalDynamic > 0 ? setInterval(() => {
|
|
4069
|
+
const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
|
|
4070
|
+
console.log(
|
|
4071
|
+
`[rsc-router] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
|
|
4072
|
+
);
|
|
4073
|
+
}, 5e3) : void 0;
|
|
4074
|
+
try {
|
|
4075
|
+
for (const { manifest } of allManifests) {
|
|
4076
|
+
if (!manifest.prerenderRoutes) continue;
|
|
4077
|
+
const defs = manifest._prerenderDefs || {};
|
|
4078
|
+
const passthroughSet = new Set(manifest.passthroughRoutes || []);
|
|
4079
|
+
for (const routeName of manifest.prerenderRoutes) {
|
|
4080
|
+
const pattern = manifest.routeManifest[routeName];
|
|
4081
|
+
if (!pattern) continue;
|
|
4082
|
+
const def = defs[routeName];
|
|
4083
|
+
const isPassthroughRoute = passthroughSet.has(routeName);
|
|
4084
|
+
const hasDynamic = pattern.includes(":") || pattern.includes("*");
|
|
4085
|
+
if (!hasDynamic) {
|
|
4086
|
+
entries.push({
|
|
4087
|
+
urlPath: pattern.replace(/\/$/, "") || "/",
|
|
4088
|
+
routeName,
|
|
4089
|
+
concurrency: 1,
|
|
4090
|
+
isPassthroughRoute
|
|
4091
|
+
});
|
|
4092
|
+
} else {
|
|
4093
|
+
if (def?.getParams) {
|
|
4094
|
+
const getParamsStart = debug9 ? performance.now() : 0;
|
|
4095
|
+
try {
|
|
4096
|
+
const buildVars = {};
|
|
4097
|
+
const buildEnv = state.resolvedBuildEnv;
|
|
4098
|
+
const getParamsCtx = {
|
|
4099
|
+
build: true,
|
|
4100
|
+
dev: !state.isBuildMode,
|
|
4101
|
+
set: ((keyOrVar, value) => {
|
|
4102
|
+
contextSet(buildVars, keyOrVar, value);
|
|
4103
|
+
}),
|
|
4104
|
+
reverse: getParamsReverse,
|
|
4105
|
+
get env() {
|
|
4106
|
+
if (buildEnv !== void 0) return buildEnv;
|
|
4107
|
+
throw new Error(
|
|
4108
|
+
"[rsc-router] ctx.env is not available during build-time getParams(). Configure buildEnv in your rango() plugin options to enable build-time env access."
|
|
4109
|
+
);
|
|
3485
4110
|
}
|
|
3486
|
-
}
|
|
3487
|
-
|
|
3488
|
-
|
|
4111
|
+
};
|
|
4112
|
+
const paramsList = await def.getParams(getParamsCtx);
|
|
4113
|
+
debug9?.(
|
|
4114
|
+
"getParams %s -> %d params (%sms)",
|
|
3489
4115
|
routeName,
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
isPassthroughRoute
|
|
3493
|
-
});
|
|
3494
|
-
}
|
|
3495
|
-
} catch (err) {
|
|
3496
|
-
if (err.name === "Skip") {
|
|
3497
|
-
console.log(
|
|
3498
|
-
`[rsc-router] SKIP route "${routeName}" - ${err.message}`
|
|
4116
|
+
paramsList.length,
|
|
4117
|
+
(performance.now() - getParamsStart).toFixed(1)
|
|
3499
4118
|
);
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
4119
|
+
const concurrency = def.options?.concurrency ?? 1;
|
|
4120
|
+
const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
|
|
4121
|
+
for (const params of paramsList) {
|
|
4122
|
+
let url = substituteRouteParams(
|
|
4123
|
+
pattern,
|
|
4124
|
+
params,
|
|
4125
|
+
encodePathParam
|
|
4126
|
+
);
|
|
4127
|
+
if (url.includes("*")) {
|
|
4128
|
+
const wildcardValue = params["*"] ?? params.splat;
|
|
4129
|
+
if (wildcardValue !== void 0) {
|
|
4130
|
+
url = url.replace(
|
|
4131
|
+
/\*[^/]*$/,
|
|
4132
|
+
encodePathParam(wildcardValue)
|
|
4133
|
+
);
|
|
4134
|
+
}
|
|
4135
|
+
}
|
|
4136
|
+
entries.push({
|
|
4137
|
+
urlPath: url.replace(/\/$/, "") || "/",
|
|
4138
|
+
routeName,
|
|
4139
|
+
concurrency,
|
|
4140
|
+
...hasBuildVars ? { buildVars } : {},
|
|
4141
|
+
isPassthroughRoute
|
|
4142
|
+
});
|
|
4143
|
+
}
|
|
4144
|
+
resolvedRoutes++;
|
|
4145
|
+
} catch (err) {
|
|
4146
|
+
resolvedRoutes++;
|
|
4147
|
+
if (err.name === "Skip") {
|
|
4148
|
+
console.log(
|
|
4149
|
+
`[rsc-router] SKIP route "${routeName}" - ${err.message}`
|
|
4150
|
+
);
|
|
4151
|
+
notifyOnError(
|
|
4152
|
+
registry,
|
|
4153
|
+
err,
|
|
4154
|
+
"prerender",
|
|
4155
|
+
routeName,
|
|
4156
|
+
void 0,
|
|
4157
|
+
true
|
|
4158
|
+
);
|
|
4159
|
+
continue;
|
|
4160
|
+
}
|
|
4161
|
+
console.error(
|
|
4162
|
+
`[rsc-router] Failed to get params for prerender route "${routeName}": ${err.message}`
|
|
3507
4163
|
);
|
|
3508
|
-
|
|
4164
|
+
notifyOnError(registry, err, "prerender", routeName);
|
|
4165
|
+
throw err;
|
|
3509
4166
|
}
|
|
3510
|
-
|
|
3511
|
-
|
|
4167
|
+
} else {
|
|
4168
|
+
console.warn(
|
|
4169
|
+
`[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
|
|
3512
4170
|
);
|
|
3513
|
-
notifyOnError(registry, err, "prerender", routeName);
|
|
3514
|
-
throw err;
|
|
3515
4171
|
}
|
|
3516
|
-
} else {
|
|
3517
|
-
console.warn(
|
|
3518
|
-
`[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
|
|
3519
|
-
);
|
|
3520
4172
|
}
|
|
3521
4173
|
}
|
|
3522
4174
|
}
|
|
4175
|
+
} finally {
|
|
4176
|
+
if (progressInterval) {
|
|
4177
|
+
clearInterval(progressInterval);
|
|
4178
|
+
const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
|
|
4179
|
+
console.log(
|
|
4180
|
+
`[rsc-router] Resolved prerender params: ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
|
|
4181
|
+
);
|
|
4182
|
+
}
|
|
4183
|
+
}
|
|
4184
|
+
if (entries.length === 0) {
|
|
4185
|
+
debug9?.(
|
|
4186
|
+
"no prerender entries (done in %sms)",
|
|
4187
|
+
(performance.now() - overallStart).toFixed(1)
|
|
4188
|
+
);
|
|
4189
|
+
return;
|
|
3523
4190
|
}
|
|
3524
|
-
if (entries.length === 0) return;
|
|
3525
4191
|
const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
|
|
3526
4192
|
const concurrencyNote = maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
|
|
3527
4193
|
console.log(
|
|
3528
4194
|
`[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
|
|
3529
4195
|
);
|
|
4196
|
+
debug9?.(
|
|
4197
|
+
"prerender loop: %d entries, max concurrency %d",
|
|
4198
|
+
entries.length,
|
|
4199
|
+
maxConcurrency
|
|
4200
|
+
);
|
|
3530
4201
|
const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
|
|
3531
4202
|
const manifestEntries = {};
|
|
3532
4203
|
let doneCount = 0;
|
|
@@ -3546,7 +4217,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3546
4217
|
entry.urlPath,
|
|
3547
4218
|
{},
|
|
3548
4219
|
entry.buildVars,
|
|
3549
|
-
entry.isPassthroughRoute
|
|
4220
|
+
entry.isPassthroughRoute,
|
|
4221
|
+
state.resolvedBuildEnv
|
|
3550
4222
|
);
|
|
3551
4223
|
if (!result) continue;
|
|
3552
4224
|
if (result.passthrough) {
|
|
@@ -3632,10 +4304,22 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3632
4304
|
console.log(
|
|
3633
4305
|
`[rsc-router] Pre-render complete: ${parts.join(", ")} (${totalElapsed}ms total)`
|
|
3634
4306
|
);
|
|
4307
|
+
debug9?.(
|
|
4308
|
+
"expandPrerenderRoutes done: %d done, %d skipped, %sms (overall %sms)",
|
|
4309
|
+
doneCount,
|
|
4310
|
+
skipCount,
|
|
4311
|
+
totalElapsed,
|
|
4312
|
+
(performance.now() - overallStart).toFixed(1)
|
|
4313
|
+
);
|
|
3635
4314
|
}
|
|
3636
4315
|
async function renderStaticHandlers(state, rscEnv, registry) {
|
|
3637
4316
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
|
|
3638
4317
|
return;
|
|
4318
|
+
const overallStart = debug9 ? performance.now() : 0;
|
|
4319
|
+
debug9?.(
|
|
4320
|
+
"renderStaticHandlers: start (%d static module(s))",
|
|
4321
|
+
state.resolvedStaticModules.size
|
|
4322
|
+
);
|
|
3639
4323
|
const manifestEntries = {};
|
|
3640
4324
|
let staticDone = 0;
|
|
3641
4325
|
let staticSkip = 0;
|
|
@@ -3670,7 +4354,9 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3670
4354
|
const result = await routerInstance.renderStaticSegment(
|
|
3671
4355
|
def.handler,
|
|
3672
4356
|
def.$$id,
|
|
3673
|
-
def.$$routePrefix
|
|
4357
|
+
def.$$routePrefix,
|
|
4358
|
+
state.resolvedBuildEnv,
|
|
4359
|
+
!state.isBuildMode
|
|
3674
4360
|
);
|
|
3675
4361
|
if (result) {
|
|
3676
4362
|
const hasHandles = Object.keys(result.handles).length > 0;
|
|
@@ -3723,13 +4409,29 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3723
4409
|
console.log(
|
|
3724
4410
|
`[rsc-router] Static render complete: ${staticParts.join(", ")} (${totalStaticElapsed}ms total)`
|
|
3725
4411
|
);
|
|
4412
|
+
debug9?.(
|
|
4413
|
+
"renderStaticHandlers done: %d done, %d skipped, %sms (overall %sms)",
|
|
4414
|
+
staticDone,
|
|
4415
|
+
staticSkip,
|
|
4416
|
+
totalStaticElapsed,
|
|
4417
|
+
(performance.now() - overallStart).toFixed(1)
|
|
4418
|
+
);
|
|
3726
4419
|
}
|
|
3727
4420
|
|
|
3728
4421
|
// src/vite/discovery/discover-routers.ts
|
|
4422
|
+
var debug10 = createRangoDebugger(NS.discovery);
|
|
3729
4423
|
async function discoverRouters(state, rscEnv) {
|
|
3730
4424
|
if (!state.resolvedEntryPath) return;
|
|
3731
|
-
await
|
|
3732
|
-
|
|
4425
|
+
await timed(
|
|
4426
|
+
debug10,
|
|
4427
|
+
"inner: import entry",
|
|
4428
|
+
() => rscEnv.runner.import(state.resolvedEntryPath)
|
|
4429
|
+
);
|
|
4430
|
+
const serverMod = await timed(
|
|
4431
|
+
debug10,
|
|
4432
|
+
"inner: import @rangojs/router/server",
|
|
4433
|
+
() => rscEnv.runner.import("@rangojs/router/server")
|
|
4434
|
+
);
|
|
3733
4435
|
let registry = serverMod.RouterRegistry;
|
|
3734
4436
|
if (!registry || registry.size === 0) {
|
|
3735
4437
|
try {
|
|
@@ -3771,8 +4473,13 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3771
4473
|
);
|
|
3772
4474
|
}
|
|
3773
4475
|
}
|
|
3774
|
-
const buildMod = await
|
|
4476
|
+
const buildMod = await timed(
|
|
4477
|
+
debug10,
|
|
4478
|
+
"inner: import @rangojs/router/build",
|
|
4479
|
+
() => rscEnv.runner.import("@rangojs/router/build")
|
|
4480
|
+
);
|
|
3775
4481
|
const generateManifestFull = buildMod.generateManifestFull;
|
|
4482
|
+
debug10?.("inner: found %d router(s) in registry", registry.size);
|
|
3776
4483
|
const nestedRouterConflict = findNestedRouterConflict(
|
|
3777
4484
|
[...registry.values()].map((router) => router.__sourceFile).filter(
|
|
3778
4485
|
(sourceFile) => typeof sourceFile === "string"
|
|
@@ -3791,11 +4498,16 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3791
4498
|
let mergedRouteTrailingSlash = {};
|
|
3792
4499
|
let routerMountIndex = 0;
|
|
3793
4500
|
const allManifests = [];
|
|
4501
|
+
const manifestGenStart = debug10 ? performance.now() : 0;
|
|
3794
4502
|
for (const [id, router] of registry) {
|
|
3795
4503
|
if (!router.urlpatterns || !generateManifestFull) {
|
|
3796
4504
|
continue;
|
|
3797
4505
|
}
|
|
3798
|
-
const manifest = generateManifestFull(
|
|
4506
|
+
const manifest = generateManifestFull(
|
|
4507
|
+
router.urlpatterns,
|
|
4508
|
+
routerMountIndex,
|
|
4509
|
+
router.__basename ? { urlPrefix: router.__basename } : void 0
|
|
4510
|
+
);
|
|
3799
4511
|
routerMountIndex++;
|
|
3800
4512
|
allManifests.push({ id, manifest });
|
|
3801
4513
|
const routeCount = Object.keys(manifest.routeManifest).length;
|
|
@@ -3861,7 +4573,13 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3861
4573
|
);
|
|
3862
4574
|
}
|
|
3863
4575
|
}
|
|
4576
|
+
debug10?.(
|
|
4577
|
+
"inner: generated manifests for %d router(s) (%sms)",
|
|
4578
|
+
allManifests.length,
|
|
4579
|
+
(performance.now() - manifestGenStart).toFixed(1)
|
|
4580
|
+
);
|
|
3864
4581
|
let newMergedRouteTrie = null;
|
|
4582
|
+
const trieStart = debug10 ? performance.now() : 0;
|
|
3865
4583
|
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
3866
4584
|
const buildRouteTrie = buildMod.buildRouteTrie;
|
|
3867
4585
|
if (buildRouteTrie && mergedRouteAncestry) {
|
|
@@ -3924,6 +4642,10 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3924
4642
|
}
|
|
3925
4643
|
}
|
|
3926
4644
|
}
|
|
4645
|
+
debug10?.(
|
|
4646
|
+
"inner: trie build done (%sms)",
|
|
4647
|
+
(performance.now() - trieStart).toFixed(1)
|
|
4648
|
+
);
|
|
3927
4649
|
state.mergedRouteManifest = newMergedRouteManifest;
|
|
3928
4650
|
state.mergedPrecomputedEntries = newMergedPrecomputedEntries;
|
|
3929
4651
|
state.perRouterManifests = newPerRouterManifests;
|
|
@@ -3937,7 +4659,7 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3937
4659
|
}
|
|
3938
4660
|
|
|
3939
4661
|
// src/vite/discovery/route-types-writer.ts
|
|
3940
|
-
import { dirname as dirname3, basename, join as
|
|
4662
|
+
import { dirname as dirname3, basename, join as join2, resolve as resolve6 } from "node:path";
|
|
3941
4663
|
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync5, unlinkSync as unlinkSync2 } from "node:fs";
|
|
3942
4664
|
function filterUserNamedRoutes(manifest) {
|
|
3943
4665
|
const filtered = {};
|
|
@@ -3958,7 +4680,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
|
|
|
3958
4680
|
/\.(tsx?|jsx?)$/,
|
|
3959
4681
|
""
|
|
3960
4682
|
);
|
|
3961
|
-
const outPath =
|
|
4683
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3962
4684
|
try {
|
|
3963
4685
|
preContent.set(outPath, readFileSync4(outPath, "utf-8"));
|
|
3964
4686
|
} catch {
|
|
@@ -3971,7 +4693,7 @@ function writeCombinedRouteTypesWithTracking(state, opts) {
|
|
|
3971
4693
|
/\.(tsx?|jsx?)$/,
|
|
3972
4694
|
""
|
|
3973
4695
|
);
|
|
3974
|
-
const outPath =
|
|
4696
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
3975
4697
|
if (!existsSync5(outPath)) continue;
|
|
3976
4698
|
try {
|
|
3977
4699
|
const content = readFileSync4(outPath, "utf-8");
|
|
@@ -3988,7 +4710,7 @@ function writeRouteTypesFiles(state) {
|
|
|
3988
4710
|
const entryDir = dirname3(
|
|
3989
4711
|
resolve6(state.projectRoot, state.resolvedEntryPath)
|
|
3990
4712
|
);
|
|
3991
|
-
const oldCombinedPath =
|
|
4713
|
+
const oldCombinedPath = join2(entryDir, "named-routes.gen.ts");
|
|
3992
4714
|
if (existsSync5(oldCombinedPath)) {
|
|
3993
4715
|
unlinkSync2(oldCombinedPath);
|
|
3994
4716
|
console.log(
|
|
@@ -4013,7 +4735,7 @@ Set an explicit \`id\` on createRouter() or check the call site.`
|
|
|
4013
4735
|
}
|
|
4014
4736
|
const routerDir = dirname3(sourceFile);
|
|
4015
4737
|
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
4016
|
-
const outPath =
|
|
4738
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
4017
4739
|
const userRoutes = filterUserNamedRoutes(routeManifest);
|
|
4018
4740
|
let effectiveSearchSchemas = routeSearchSchemas;
|
|
4019
4741
|
if ((!effectiveSearchSchemas || Object.keys(effectiveSearchSchemas).length === 0) && sourceFile) {
|
|
@@ -4078,7 +4800,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
|
|
|
4078
4800
|
}
|
|
4079
4801
|
const routerDir = dirname3(sourceFile);
|
|
4080
4802
|
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
4081
|
-
const outPath =
|
|
4803
|
+
const outPath = join2(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
4082
4804
|
const source = generateRouteTypesSource(
|
|
4083
4805
|
mergedRoutes,
|
|
4084
4806
|
Object.keys(mergedSearchSchemas).length > 0 ? mergedSearchSchemas : void 0
|
|
@@ -4092,7 +4814,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
|
|
|
4092
4814
|
}
|
|
4093
4815
|
|
|
4094
4816
|
// src/vite/discovery/virtual-module-codegen.ts
|
|
4095
|
-
import { dirname as dirname4, basename as basename2, join as
|
|
4817
|
+
import { dirname as dirname4, basename as basename2, join as join3 } from "node:path";
|
|
4096
4818
|
function generateRoutesManifestModule(state) {
|
|
4097
4819
|
const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
|
|
4098
4820
|
if (hasManifest) {
|
|
@@ -4107,7 +4829,7 @@ function generateRoutesManifestModule(state) {
|
|
|
4107
4829
|
/\.(tsx?|jsx?)$/,
|
|
4108
4830
|
""
|
|
4109
4831
|
);
|
|
4110
|
-
const genPath =
|
|
4832
|
+
const genPath = join3(
|
|
4111
4833
|
routerDir,
|
|
4112
4834
|
`${routerBasename}.named-routes.gen.js`
|
|
4113
4835
|
).replaceAll("\\", "/");
|
|
@@ -4204,7 +4926,7 @@ function generatePerRouterModule(state, routerId) {
|
|
|
4204
4926
|
/\.(tsx?|jsx?)$/,
|
|
4205
4927
|
""
|
|
4206
4928
|
);
|
|
4207
|
-
const genPath =
|
|
4929
|
+
const genPath = join3(
|
|
4208
4930
|
routerDir,
|
|
4209
4931
|
`${routerBasename}.named-routes.gen.js`
|
|
4210
4932
|
).replaceAll("\\", "/");
|
|
@@ -4244,48 +4966,45 @@ function postprocessBundle(state) {
|
|
|
4244
4966
|
);
|
|
4245
4967
|
const evictionTargets = [
|
|
4246
4968
|
{
|
|
4247
|
-
|
|
4969
|
+
infos: state.handlerChunkInfoMap.values(),
|
|
4248
4970
|
fnName: "Prerender",
|
|
4249
4971
|
brand: "prerenderHandler",
|
|
4250
4972
|
label: "handler code from RSC bundle"
|
|
4251
4973
|
},
|
|
4252
4974
|
{
|
|
4253
|
-
|
|
4975
|
+
infos: state.staticHandlerChunkInfoMap.values(),
|
|
4254
4976
|
fnName: "Static",
|
|
4255
4977
|
brand: "staticHandler",
|
|
4256
4978
|
label: "static handler code"
|
|
4257
4979
|
}
|
|
4258
4980
|
];
|
|
4259
4981
|
for (const target of evictionTargets) {
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
|
|
4982
|
+
for (const info of target.infos) {
|
|
4983
|
+
const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
|
|
4984
|
+
try {
|
|
4985
|
+
const code = readFileSync5(chunkPath, "utf-8");
|
|
4986
|
+
const result = evictHandlerCode(
|
|
4987
|
+
code,
|
|
4988
|
+
info.exports,
|
|
4989
|
+
target.fnName,
|
|
4990
|
+
target.brand
|
|
4991
|
+
);
|
|
4992
|
+
if (result) {
|
|
4993
|
+
writeFileSync4(chunkPath, result.code);
|
|
4994
|
+
const savedKB = (result.savedBytes / 1024).toFixed(1);
|
|
4995
|
+
console.log(
|
|
4996
|
+
`[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`
|
|
4997
|
+
);
|
|
4998
|
+
}
|
|
4999
|
+
} catch (replaceErr) {
|
|
5000
|
+
console.warn(
|
|
5001
|
+
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4279
5002
|
);
|
|
4280
5003
|
}
|
|
4281
|
-
} catch (replaceErr) {
|
|
4282
|
-
console.warn(
|
|
4283
|
-
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4284
|
-
);
|
|
4285
5004
|
}
|
|
4286
5005
|
}
|
|
4287
|
-
state.
|
|
4288
|
-
state.
|
|
5006
|
+
state.handlerChunkInfoMap.clear();
|
|
5007
|
+
state.staticHandlerChunkInfoMap.clear();
|
|
4289
5008
|
if (hasPrerenderData && existsSync6(rscEntryPath)) {
|
|
4290
5009
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4291
5010
|
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
@@ -4328,7 +5047,7 @@ function postprocessBundle(state) {
|
|
|
4328
5047
|
}
|
|
4329
5048
|
if (hasStaticData && existsSync6(rscEntryPath)) {
|
|
4330
5049
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4331
|
-
if (!rscCode.includes("
|
|
5050
|
+
if (!rscCode.includes("__static-manifest.js")) {
|
|
4332
5051
|
try {
|
|
4333
5052
|
const manifestEntries = [];
|
|
4334
5053
|
let totalBytes = copyStagedBuildAssets(
|
|
@@ -4366,8 +5085,101 @@ function postprocessBundle(state) {
|
|
|
4366
5085
|
}
|
|
4367
5086
|
}
|
|
4368
5087
|
|
|
5088
|
+
// src/vite/discovery/gate-state.ts
|
|
5089
|
+
function createDiscoveryGate(s, debug11) {
|
|
5090
|
+
let gatePending = false;
|
|
5091
|
+
let gateResolver = () => {
|
|
5092
|
+
};
|
|
5093
|
+
let inProgress = false;
|
|
5094
|
+
let queued = false;
|
|
5095
|
+
let pendingEvents = false;
|
|
5096
|
+
const beginGate = () => {
|
|
5097
|
+
if (gatePending) return;
|
|
5098
|
+
s.discoveryDone = new Promise((resolve10) => {
|
|
5099
|
+
gateResolver = resolve10;
|
|
5100
|
+
});
|
|
5101
|
+
gatePending = true;
|
|
5102
|
+
};
|
|
5103
|
+
const resolveGate = () => {
|
|
5104
|
+
if (!gatePending) return;
|
|
5105
|
+
if (inProgress || queued || pendingEvents) {
|
|
5106
|
+
debug11?.(
|
|
5107
|
+
"hmr: resolveGate deferred \u2014 work in flight (inProgress=%s queued=%s pendingEvents=%s)",
|
|
5108
|
+
inProgress,
|
|
5109
|
+
queued,
|
|
5110
|
+
pendingEvents
|
|
5111
|
+
);
|
|
5112
|
+
return;
|
|
5113
|
+
}
|
|
5114
|
+
gatePending = false;
|
|
5115
|
+
debug11?.("hmr: discoveryDone resolved");
|
|
5116
|
+
gateResolver();
|
|
5117
|
+
};
|
|
5118
|
+
const noteRouteEvent = () => {
|
|
5119
|
+
pendingEvents = true;
|
|
5120
|
+
beginGate();
|
|
5121
|
+
};
|
|
5122
|
+
const runRefreshCycle = async (work) => {
|
|
5123
|
+
if (inProgress) {
|
|
5124
|
+
queued = true;
|
|
5125
|
+
debug11?.("hmr: rediscovery in flight \u2014 queued for a follow-up cycle");
|
|
5126
|
+
return;
|
|
5127
|
+
}
|
|
5128
|
+
pendingEvents = false;
|
|
5129
|
+
inProgress = true;
|
|
5130
|
+
try {
|
|
5131
|
+
await work();
|
|
5132
|
+
} finally {
|
|
5133
|
+
inProgress = false;
|
|
5134
|
+
if (queued) {
|
|
5135
|
+
queued = false;
|
|
5136
|
+
debug11?.("hmr: consuming queued rediscovery");
|
|
5137
|
+
runRefreshCycle(work).catch((err) => {
|
|
5138
|
+
debug11?.(
|
|
5139
|
+
"hmr: queued cycle rejected \u2014 releasing gate (%s)",
|
|
5140
|
+
err instanceof Error ? err.message : String(err)
|
|
5141
|
+
);
|
|
5142
|
+
resolveGate();
|
|
5143
|
+
});
|
|
5144
|
+
} else if (pendingEvents) {
|
|
5145
|
+
debug11?.(
|
|
5146
|
+
"hmr: holding gate for pending events (debounce not yet fired)"
|
|
5147
|
+
);
|
|
5148
|
+
} else {
|
|
5149
|
+
resolveGate();
|
|
5150
|
+
}
|
|
5151
|
+
}
|
|
5152
|
+
};
|
|
5153
|
+
return {
|
|
5154
|
+
beginGate,
|
|
5155
|
+
resolveGate,
|
|
5156
|
+
noteRouteEvent,
|
|
5157
|
+
runRefreshCycle,
|
|
5158
|
+
state: () => ({ gatePending, inProgress, queued, pendingEvents })
|
|
5159
|
+
};
|
|
5160
|
+
}
|
|
5161
|
+
|
|
4369
5162
|
// src/vite/router-discovery.ts
|
|
5163
|
+
var debugDiscovery = createRangoDebugger(NS.discovery);
|
|
5164
|
+
var debugRoutes = createRangoDebugger(NS.routes);
|
|
5165
|
+
var debugBuild = createRangoDebugger(NS.build);
|
|
5166
|
+
var debugDev = createRangoDebugger(NS.dev);
|
|
5167
|
+
var loaderHookRegistered = false;
|
|
5168
|
+
function ensureCloudflareProtocolLoaderRegistered() {
|
|
5169
|
+
if (loaderHookRegistered) return;
|
|
5170
|
+
loaderHookRegistered = true;
|
|
5171
|
+
try {
|
|
5172
|
+
register(
|
|
5173
|
+
new URL("./plugins/cloudflare-protocol-loader-hook.mjs", import.meta.url)
|
|
5174
|
+
);
|
|
5175
|
+
} catch (err) {
|
|
5176
|
+
console.warn(
|
|
5177
|
+
`[rsc-router] Could not register Node ESM loader hook for cloudflare:* imports (${err?.message ?? err}). Falling back to Vite transform only.`
|
|
5178
|
+
);
|
|
5179
|
+
}
|
|
5180
|
+
}
|
|
4370
5181
|
async function createTempRscServer(state, options = {}) {
|
|
5182
|
+
ensureCloudflareProtocolLoaderRegistered();
|
|
4371
5183
|
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
4372
5184
|
return createViteServer({
|
|
4373
5185
|
root: state.projectRoot,
|
|
@@ -4390,6 +5202,7 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4390
5202
|
...options.forceBuild ? [hashClientRefs(state.projectRoot)] : [],
|
|
4391
5203
|
createVersionPlugin(),
|
|
4392
5204
|
createVirtualStubPlugin(),
|
|
5205
|
+
createCloudflareProtocolStubPlugin(),
|
|
4393
5206
|
// Dev prerender must use dev-mode IDs (path-based) to match the workerd
|
|
4394
5207
|
// runtime. forceBuild produces hashed IDs for production bundle consistency.
|
|
4395
5208
|
exposeInternalIds(options.forceBuild ? { forceBuild: true } : void 0),
|
|
@@ -4397,8 +5210,69 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4397
5210
|
]
|
|
4398
5211
|
});
|
|
4399
5212
|
}
|
|
5213
|
+
async function resolveBuildEnv(option, factoryCtx) {
|
|
5214
|
+
if (!option) return null;
|
|
5215
|
+
if (option === "auto") {
|
|
5216
|
+
if (factoryCtx.preset !== "cloudflare") {
|
|
5217
|
+
throw new Error(
|
|
5218
|
+
'[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". Use a factory function or plain object for other presets.'
|
|
5219
|
+
);
|
|
5220
|
+
}
|
|
5221
|
+
try {
|
|
5222
|
+
const userRequire = createRequire2(
|
|
5223
|
+
resolve8(factoryCtx.root, "package.json")
|
|
5224
|
+
);
|
|
5225
|
+
const wranglerPath = userRequire.resolve("wrangler");
|
|
5226
|
+
const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
|
|
5227
|
+
const proxy = await getPlatformProxy();
|
|
5228
|
+
return {
|
|
5229
|
+
env: proxy.env,
|
|
5230
|
+
dispose: proxy.dispose
|
|
5231
|
+
};
|
|
5232
|
+
} catch (err) {
|
|
5233
|
+
throw new Error(
|
|
5234
|
+
`[rsc-router] buildEnv: "auto" requires wrangler to be installed.
|
|
5235
|
+
Install it with: pnpm add -D wrangler
|
|
5236
|
+
${err.message}`
|
|
5237
|
+
);
|
|
5238
|
+
}
|
|
5239
|
+
}
|
|
5240
|
+
if (typeof option === "function") {
|
|
5241
|
+
return await option(factoryCtx);
|
|
5242
|
+
}
|
|
5243
|
+
return { env: option };
|
|
5244
|
+
}
|
|
5245
|
+
async function acquireBuildEnv(s, command, mode) {
|
|
5246
|
+
const option = s.opts?.buildEnv;
|
|
5247
|
+
if (!option) return false;
|
|
5248
|
+
const result = await resolveBuildEnv(option, {
|
|
5249
|
+
root: s.projectRoot,
|
|
5250
|
+
mode,
|
|
5251
|
+
command,
|
|
5252
|
+
preset: s.opts?.preset ?? "node"
|
|
5253
|
+
});
|
|
5254
|
+
if (!result) return false;
|
|
5255
|
+
s.resolvedBuildEnv = result.env;
|
|
5256
|
+
s.buildEnvDispose = result.dispose ?? null;
|
|
5257
|
+
globalThis[BUILD_ENV_GLOBAL_KEY] = result.env;
|
|
5258
|
+
return true;
|
|
5259
|
+
}
|
|
5260
|
+
async function releaseBuildEnv(s) {
|
|
5261
|
+
if (s.buildEnvDispose) {
|
|
5262
|
+
try {
|
|
5263
|
+
await s.buildEnvDispose();
|
|
5264
|
+
} catch (err) {
|
|
5265
|
+
console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
|
|
5266
|
+
}
|
|
5267
|
+
s.buildEnvDispose = null;
|
|
5268
|
+
}
|
|
5269
|
+
s.resolvedBuildEnv = void 0;
|
|
5270
|
+
delete globalThis[BUILD_ENV_GLOBAL_KEY];
|
|
5271
|
+
}
|
|
4400
5272
|
function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
4401
5273
|
const s = createDiscoveryState(entryPath, opts);
|
|
5274
|
+
let viteCommand = "build";
|
|
5275
|
+
let viteMode = "production";
|
|
4402
5276
|
return {
|
|
4403
5277
|
name: "@rangojs/router:discovery",
|
|
4404
5278
|
config() {
|
|
@@ -4407,31 +5281,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4407
5281
|
__RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
|
|
4408
5282
|
}
|
|
4409
5283
|
};
|
|
4410
|
-
if (opts?.enableBuildPrerender) {
|
|
4411
|
-
config.environments = {
|
|
4412
|
-
rsc: {
|
|
4413
|
-
build: {
|
|
4414
|
-
rollupOptions: {
|
|
4415
|
-
output: {
|
|
4416
|
-
manualChunks(id) {
|
|
4417
|
-
if (s.resolvedPrerenderModules?.has(id)) {
|
|
4418
|
-
return "__prerender-handlers";
|
|
4419
|
-
}
|
|
4420
|
-
if (s.resolvedStaticModules?.has(id)) {
|
|
4421
|
-
return "__static-handlers";
|
|
4422
|
-
}
|
|
4423
|
-
}
|
|
4424
|
-
}
|
|
4425
|
-
}
|
|
4426
|
-
}
|
|
4427
|
-
}
|
|
4428
|
-
};
|
|
4429
|
-
}
|
|
4430
5284
|
return config;
|
|
4431
5285
|
},
|
|
4432
5286
|
configResolved(config) {
|
|
4433
5287
|
s.projectRoot = config.root;
|
|
4434
5288
|
s.isBuildMode = config.command === "build";
|
|
5289
|
+
viteCommand = config.command;
|
|
5290
|
+
viteMode = config.mode;
|
|
4435
5291
|
s.userResolveAlias = config.resolve.alias;
|
|
4436
5292
|
if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
|
|
4437
5293
|
s.resolvedEntryPath = opts.routerPathRef.path;
|
|
@@ -4445,12 +5301,6 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4445
5301
|
s.resolvedEntryPath = entries[0];
|
|
4446
5302
|
}
|
|
4447
5303
|
}
|
|
4448
|
-
if (opts?.include || opts?.exclude) {
|
|
4449
|
-
s.scanFilter = createScanFilter(s.projectRoot, {
|
|
4450
|
-
include: opts.include,
|
|
4451
|
-
exclude: opts.exclude
|
|
4452
|
-
});
|
|
4453
|
-
}
|
|
4454
5304
|
if (opts?.staticRouteTypesGeneration !== false) {
|
|
4455
5305
|
s.cachedRouterFiles = findRouterFiles(s.projectRoot, s.scanFilter);
|
|
4456
5306
|
writeCombinedRouteTypesWithTracking(s, { preserveIfLarger: true });
|
|
@@ -4473,6 +5323,9 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4473
5323
|
const discoveryPromise = new Promise((resolve10) => {
|
|
4474
5324
|
resolveDiscovery = resolve10;
|
|
4475
5325
|
});
|
|
5326
|
+
const gate = createDiscoveryGate(s, debugDiscovery);
|
|
5327
|
+
const beginDiscoveryGate = gate.beginGate;
|
|
5328
|
+
const resolveDiscoveryGate = gate.resolveGate;
|
|
4476
5329
|
const getDevServerOrigin = () => server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") || `http://localhost:${server.config.server.port || 5173}`;
|
|
4477
5330
|
let prerenderTempServer = null;
|
|
4478
5331
|
let prerenderNodeRegistry = null;
|
|
@@ -4482,40 +5335,183 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4482
5335
|
});
|
|
4483
5336
|
prerenderTempServer = null;
|
|
4484
5337
|
}
|
|
5338
|
+
releaseBuildEnv(s).catch(() => {
|
|
5339
|
+
});
|
|
4485
5340
|
});
|
|
5341
|
+
async function importEntryAndRegistry(tempRscEnv) {
|
|
5342
|
+
const flagAlreadySet = !!globalThis.__rscRouterDiscoveryActive;
|
|
5343
|
+
if (!flagAlreadySet) {
|
|
5344
|
+
globalThis.__rscRouterDiscoveryActive = true;
|
|
5345
|
+
}
|
|
5346
|
+
try {
|
|
5347
|
+
debugDiscovery?.(
|
|
5348
|
+
"importEntryAndRegistry: importing entry (flag=%s)",
|
|
5349
|
+
globalThis.__rscRouterDiscoveryActive ?? false
|
|
5350
|
+
);
|
|
5351
|
+
await tempRscEnv.runner.import(s.resolvedEntryPath);
|
|
5352
|
+
debugDiscovery?.(
|
|
5353
|
+
"importEntryAndRegistry: entry import OK, fetching RouterRegistry"
|
|
5354
|
+
);
|
|
5355
|
+
const serverMod = await tempRscEnv.runner.import(
|
|
5356
|
+
"@rangojs/router/server"
|
|
5357
|
+
);
|
|
5358
|
+
prerenderNodeRegistry = serverMod.RouterRegistry;
|
|
5359
|
+
debugDiscovery?.(
|
|
5360
|
+
"importEntryAndRegistry: registry size=%d",
|
|
5361
|
+
prerenderNodeRegistry?.size ?? 0
|
|
5362
|
+
);
|
|
5363
|
+
} finally {
|
|
5364
|
+
if (!flagAlreadySet) {
|
|
5365
|
+
delete globalThis.__rscRouterDiscoveryActive;
|
|
5366
|
+
debugDiscovery?.(
|
|
5367
|
+
"importEntryAndRegistry: cleared __rscRouterDiscoveryActive"
|
|
5368
|
+
);
|
|
5369
|
+
}
|
|
5370
|
+
}
|
|
5371
|
+
}
|
|
4486
5372
|
async function getOrCreateTempServer() {
|
|
4487
|
-
if (
|
|
4488
|
-
|
|
5373
|
+
if (prerenderTempServer) {
|
|
5374
|
+
const existingEnv = prerenderTempServer.environments?.rsc;
|
|
5375
|
+
if (existingEnv?.runner) {
|
|
5376
|
+
if (prerenderNodeRegistry) {
|
|
5377
|
+
debugDiscovery?.(
|
|
5378
|
+
"getOrCreateTempServer: cached temp runner reused"
|
|
5379
|
+
);
|
|
5380
|
+
return existingEnv;
|
|
5381
|
+
}
|
|
5382
|
+
debugDiscovery?.(
|
|
5383
|
+
"getOrCreateTempServer: server alive but registry missing \u2014 re-importing"
|
|
5384
|
+
);
|
|
5385
|
+
try {
|
|
5386
|
+
await importEntryAndRegistry(existingEnv);
|
|
5387
|
+
return existingEnv;
|
|
5388
|
+
} catch (err) {
|
|
5389
|
+
debugDiscovery?.(
|
|
5390
|
+
"getOrCreateTempServer: reuse import failed (%s) \u2014 closing orphan and creating fresh",
|
|
5391
|
+
err?.message ?? String(err)
|
|
5392
|
+
);
|
|
5393
|
+
await prerenderTempServer.close().catch(() => {
|
|
5394
|
+
});
|
|
5395
|
+
prerenderTempServer = null;
|
|
5396
|
+
prerenderNodeRegistry = null;
|
|
5397
|
+
}
|
|
5398
|
+
} else {
|
|
5399
|
+
debugDiscovery?.(
|
|
5400
|
+
"getOrCreateTempServer: existing server has no rsc.runner \u2014 closing and recreating"
|
|
5401
|
+
);
|
|
5402
|
+
await prerenderTempServer.close().catch(() => {
|
|
5403
|
+
});
|
|
5404
|
+
prerenderTempServer = null;
|
|
5405
|
+
prerenderNodeRegistry = null;
|
|
5406
|
+
}
|
|
4489
5407
|
}
|
|
5408
|
+
debugDiscovery?.(
|
|
5409
|
+
"getOrCreateTempServer: creating new temp server, entry=%s",
|
|
5410
|
+
s.resolvedEntryPath ?? "(unset)"
|
|
5411
|
+
);
|
|
4490
5412
|
try {
|
|
4491
5413
|
prerenderTempServer = await createTempRscServer(s, {
|
|
4492
5414
|
cacheDir: "node_modules/.vite_prerender"
|
|
4493
5415
|
});
|
|
4494
5416
|
const tempRscEnv = prerenderTempServer.environments?.rsc;
|
|
4495
5417
|
if (tempRscEnv?.runner) {
|
|
4496
|
-
await tempRscEnv
|
|
4497
|
-
const serverMod = await tempRscEnv.runner.import(
|
|
4498
|
-
"@rangojs/router/server"
|
|
4499
|
-
);
|
|
4500
|
-
prerenderNodeRegistry = serverMod.RouterRegistry;
|
|
5418
|
+
await importEntryAndRegistry(tempRscEnv);
|
|
4501
5419
|
return tempRscEnv;
|
|
4502
5420
|
}
|
|
5421
|
+
debugDiscovery?.(
|
|
5422
|
+
"getOrCreateTempServer: tempRscEnv.runner unavailable"
|
|
5423
|
+
);
|
|
4503
5424
|
} catch (err) {
|
|
5425
|
+
debugDiscovery?.(
|
|
5426
|
+
"getOrCreateTempServer: FAILED message=%s",
|
|
5427
|
+
err.message
|
|
5428
|
+
);
|
|
4504
5429
|
console.warn(
|
|
4505
5430
|
`[rsc-router] Failed to create temp runner: ${err.message}`
|
|
4506
5431
|
);
|
|
4507
5432
|
}
|
|
4508
5433
|
return null;
|
|
4509
5434
|
}
|
|
5435
|
+
async function clearTempRegistries(tempRscEnv) {
|
|
5436
|
+
try {
|
|
5437
|
+
const serverMod = await tempRscEnv.runner.import(
|
|
5438
|
+
"@rangojs/router/server"
|
|
5439
|
+
);
|
|
5440
|
+
if (typeof serverMod?.RouterRegistry?.clear === "function") {
|
|
5441
|
+
serverMod.RouterRegistry.clear();
|
|
5442
|
+
}
|
|
5443
|
+
if (typeof serverMod?.HostRouterRegistry?.clear === "function") {
|
|
5444
|
+
serverMod.HostRouterRegistry.clear();
|
|
5445
|
+
}
|
|
5446
|
+
debugDiscovery?.(
|
|
5447
|
+
"clearTempRegistries: cleared RouterRegistry + HostRouterRegistry"
|
|
5448
|
+
);
|
|
5449
|
+
} catch (err) {
|
|
5450
|
+
debugDiscovery?.(
|
|
5451
|
+
"clearTempRegistries: import @rangojs/router/server failed (%s)",
|
|
5452
|
+
err?.message ?? String(err)
|
|
5453
|
+
);
|
|
5454
|
+
}
|
|
5455
|
+
}
|
|
5456
|
+
async function refreshTempRscEnv() {
|
|
5457
|
+
let tempRscEnv = await getOrCreateTempServer();
|
|
5458
|
+
if (!tempRscEnv) return null;
|
|
5459
|
+
const envGraph = tempRscEnv.moduleGraph;
|
|
5460
|
+
const serverGraph = prerenderTempServer?.moduleGraph;
|
|
5461
|
+
const target = envGraph?.invalidateAll ? envGraph : serverGraph?.invalidateAll ? serverGraph : null;
|
|
5462
|
+
if (!target) {
|
|
5463
|
+
debugDiscovery?.(
|
|
5464
|
+
"refreshTempRscEnv: invalidateAll unavailable on env+server graphs, falling back to close+recreate"
|
|
5465
|
+
);
|
|
5466
|
+
if (prerenderTempServer) {
|
|
5467
|
+
await prerenderTempServer.close().catch(() => {
|
|
5468
|
+
});
|
|
5469
|
+
prerenderTempServer = null;
|
|
5470
|
+
prerenderNodeRegistry = null;
|
|
5471
|
+
}
|
|
5472
|
+
return await getOrCreateTempServer();
|
|
5473
|
+
}
|
|
5474
|
+
debugDiscovery?.(
|
|
5475
|
+
"refreshTempRscEnv: invalidating module graph (%s)",
|
|
5476
|
+
envGraph?.invalidateAll ? "env" : "server"
|
|
5477
|
+
);
|
|
5478
|
+
target.invalidateAll();
|
|
5479
|
+
prerenderNodeRegistry = null;
|
|
5480
|
+
await clearTempRegistries(tempRscEnv);
|
|
5481
|
+
await importEntryAndRegistry(tempRscEnv);
|
|
5482
|
+
return tempRscEnv;
|
|
5483
|
+
}
|
|
4510
5484
|
const discover = async () => {
|
|
5485
|
+
const discoverStart = performance.now();
|
|
4511
5486
|
const rscEnv = server.environments?.rsc;
|
|
4512
5487
|
if (!rscEnv?.runner) {
|
|
5488
|
+
debugDiscovery?.(
|
|
5489
|
+
"dev: cloudflare path start, __rscRouterDiscoveryActive=%s",
|
|
5490
|
+
globalThis.__rscRouterDiscoveryActive ?? false
|
|
5491
|
+
);
|
|
4513
5492
|
s.devServerOrigin = getDevServerOrigin();
|
|
4514
5493
|
try {
|
|
4515
|
-
|
|
5494
|
+
await timed(
|
|
5495
|
+
debugDiscovery,
|
|
5496
|
+
"acquireBuildEnv",
|
|
5497
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5498
|
+
);
|
|
5499
|
+
const tempRscEnv = await timed(
|
|
5500
|
+
debugDiscovery,
|
|
5501
|
+
"getOrCreateTempServer",
|
|
5502
|
+
() => getOrCreateTempServer()
|
|
5503
|
+
);
|
|
4516
5504
|
if (tempRscEnv) {
|
|
4517
|
-
await
|
|
4518
|
-
|
|
5505
|
+
await timed(
|
|
5506
|
+
debugDiscovery,
|
|
5507
|
+
"discoverRouters (cloudflare)",
|
|
5508
|
+
() => discoverRouters(s, tempRscEnv)
|
|
5509
|
+
);
|
|
5510
|
+
timedSync(
|
|
5511
|
+
debugDiscovery,
|
|
5512
|
+
"writeRouteTypesFiles",
|
|
5513
|
+
() => writeRouteTypesFiles(s)
|
|
5514
|
+
);
|
|
4519
5515
|
}
|
|
4520
5516
|
} catch (err) {
|
|
4521
5517
|
console.warn(
|
|
@@ -4523,32 +5519,62 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4523
5519
|
${err.stack}`
|
|
4524
5520
|
);
|
|
4525
5521
|
}
|
|
5522
|
+
debugDiscovery?.(
|
|
5523
|
+
"dev discovery done (%sms)",
|
|
5524
|
+
(performance.now() - discoverStart).toFixed(1)
|
|
5525
|
+
);
|
|
4526
5526
|
resolveDiscovery();
|
|
4527
5527
|
return;
|
|
4528
5528
|
}
|
|
4529
5529
|
try {
|
|
4530
|
-
|
|
4531
|
-
|
|
5530
|
+
debugDiscovery?.("dev: node path start");
|
|
5531
|
+
await timed(
|
|
5532
|
+
debugDiscovery,
|
|
5533
|
+
"acquireBuildEnv",
|
|
5534
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5535
|
+
);
|
|
5536
|
+
const serverMod = await timed(
|
|
5537
|
+
debugDiscovery,
|
|
5538
|
+
"import @rangojs/router/server",
|
|
5539
|
+
() => rscEnv.runner.import("@rangojs/router/server")
|
|
4532
5540
|
);
|
|
4533
5541
|
if (serverMod?.setManifestReadyPromise) {
|
|
4534
5542
|
serverMod.setManifestReadyPromise(discoveryPromise);
|
|
4535
5543
|
}
|
|
4536
|
-
await
|
|
5544
|
+
await timed(
|
|
5545
|
+
debugDiscovery,
|
|
5546
|
+
"discoverRouters",
|
|
5547
|
+
() => discoverRouters(s, rscEnv)
|
|
5548
|
+
);
|
|
4537
5549
|
s.devServerOrigin = getDevServerOrigin();
|
|
4538
|
-
|
|
4539
|
-
|
|
5550
|
+
timedSync(
|
|
5551
|
+
debugDiscovery,
|
|
5552
|
+
"writeRouteTypesFiles",
|
|
5553
|
+
() => writeRouteTypesFiles(s)
|
|
5554
|
+
);
|
|
5555
|
+
await timed(
|
|
5556
|
+
debugDiscovery,
|
|
5557
|
+
"propagateDiscoveryState",
|
|
5558
|
+
() => propagateDiscoveryState(rscEnv)
|
|
5559
|
+
);
|
|
4540
5560
|
} catch (err) {
|
|
4541
5561
|
console.warn(
|
|
4542
5562
|
`[rsc-router] Router discovery failed: ${err.message}
|
|
4543
5563
|
${err.stack}`
|
|
4544
5564
|
);
|
|
4545
5565
|
} finally {
|
|
5566
|
+
debugDiscovery?.(
|
|
5567
|
+
"dev discovery done (%sms)",
|
|
5568
|
+
(performance.now() - discoverStart).toFixed(1)
|
|
5569
|
+
);
|
|
4546
5570
|
resolveDiscovery();
|
|
4547
5571
|
}
|
|
4548
5572
|
};
|
|
4549
|
-
|
|
4550
|
-
|
|
4551
|
-
|
|
5573
|
+
beginDiscoveryGate();
|
|
5574
|
+
setTimeout(
|
|
5575
|
+
() => discover().then(resolveDiscoveryGate, resolveDiscoveryGate),
|
|
5576
|
+
0
|
|
5577
|
+
);
|
|
4552
5578
|
let mainRegistry = null;
|
|
4553
5579
|
const propagateDiscoveryState = async (rscEnv) => {
|
|
4554
5580
|
const serverMod = await rscEnv.runner.import("@rangojs/router/server");
|
|
@@ -4583,15 +5609,46 @@ ${err.stack}`
|
|
|
4583
5609
|
}
|
|
4584
5610
|
};
|
|
4585
5611
|
server.middlewares.use("/__rsc_prerender", async (req, res) => {
|
|
5612
|
+
const reqStart = debugDev ? performance.now() : 0;
|
|
5613
|
+
const logResult = (status, note) => {
|
|
5614
|
+
debugDev?.(
|
|
5615
|
+
"/__rsc_prerender %s -> %d %s (%sms)",
|
|
5616
|
+
req.url,
|
|
5617
|
+
status,
|
|
5618
|
+
note,
|
|
5619
|
+
(performance.now() - reqStart).toFixed(1)
|
|
5620
|
+
);
|
|
5621
|
+
};
|
|
4586
5622
|
if (s.discoveryDone) await s.discoveryDone;
|
|
4587
5623
|
const url = new URL(req.url || "/", "http://localhost");
|
|
4588
5624
|
const pathname = url.searchParams.get("pathname");
|
|
4589
5625
|
if (!pathname) {
|
|
4590
5626
|
res.statusCode = 400;
|
|
4591
5627
|
res.end("Missing pathname");
|
|
5628
|
+
logResult(400, "missing pathname");
|
|
4592
5629
|
return;
|
|
4593
5630
|
}
|
|
4594
|
-
|
|
5631
|
+
const rscEnv = server.environments?.rsc;
|
|
5632
|
+
let registry = null;
|
|
5633
|
+
if (rscEnv?.runner && s.resolvedEntryPath) {
|
|
5634
|
+
try {
|
|
5635
|
+
await rscEnv.runner.import(s.resolvedEntryPath);
|
|
5636
|
+
const serverMod = await rscEnv.runner.import(
|
|
5637
|
+
"@rangojs/router/server"
|
|
5638
|
+
);
|
|
5639
|
+
registry = serverMod.RouterRegistry ?? null;
|
|
5640
|
+
} catch (err) {
|
|
5641
|
+
console.warn(
|
|
5642
|
+
`[rsc-router] Dev prerender module refresh failed: ${err.message}`
|
|
5643
|
+
);
|
|
5644
|
+
res.statusCode = 500;
|
|
5645
|
+
res.end(`Prerender handler error: ${err.message}`);
|
|
5646
|
+
logResult(500, "module refresh failed");
|
|
5647
|
+
return;
|
|
5648
|
+
}
|
|
5649
|
+
} else {
|
|
5650
|
+
registry = mainRegistry;
|
|
5651
|
+
}
|
|
4595
5652
|
if (!registry) {
|
|
4596
5653
|
if (!prerenderNodeRegistry) {
|
|
4597
5654
|
await getOrCreateTempServer();
|
|
@@ -4601,6 +5658,7 @@ ${err.stack}`
|
|
|
4601
5658
|
if (!registry || registry.size === 0) {
|
|
4602
5659
|
res.statusCode = 503;
|
|
4603
5660
|
res.end("Prerender runner not available");
|
|
5661
|
+
logResult(503, "no registry");
|
|
4604
5662
|
return;
|
|
4605
5663
|
}
|
|
4606
5664
|
const wantIntercept = url.searchParams.get("intercept") === "1";
|
|
@@ -4613,7 +5671,10 @@ ${err.stack}`
|
|
|
4613
5671
|
pathname,
|
|
4614
5672
|
{},
|
|
4615
5673
|
void 0,
|
|
4616
|
-
wantPassthrough
|
|
5674
|
+
wantPassthrough,
|
|
5675
|
+
s.resolvedBuildEnv,
|
|
5676
|
+
true
|
|
5677
|
+
// devMode: check getParams for passthrough routes
|
|
4617
5678
|
);
|
|
4618
5679
|
if (!result) continue;
|
|
4619
5680
|
if (result.passthrough) continue;
|
|
@@ -4632,6 +5693,7 @@ ${err.stack}`
|
|
|
4632
5693
|
payload = { segments: result.segments, handles: result.handles };
|
|
4633
5694
|
}
|
|
4634
5695
|
res.end(JSON.stringify(payload));
|
|
5696
|
+
logResult(200, `match ${result.routeName}`);
|
|
4635
5697
|
return;
|
|
4636
5698
|
} catch (err) {
|
|
4637
5699
|
console.warn(
|
|
@@ -4641,6 +5703,7 @@ ${err.stack}`
|
|
|
4641
5703
|
}
|
|
4642
5704
|
res.statusCode = 404;
|
|
4643
5705
|
res.end("No prerender match");
|
|
5706
|
+
logResult(404, "no match");
|
|
4644
5707
|
});
|
|
4645
5708
|
if (opts?.staticRouteTypesGeneration !== false) {
|
|
4646
5709
|
const isGeneratedRouteFile = (filePath) => filePath.endsWith(".gen.ts") && (filePath.includes("named-routes.gen.ts") || filePath.includes("urls.gen.ts"));
|
|
@@ -4660,42 +5723,96 @@ ${err.stack}`
|
|
|
4660
5723
|
return true;
|
|
4661
5724
|
};
|
|
4662
5725
|
let routeChangeTimer;
|
|
4663
|
-
let runtimeRediscoveryInProgress = false;
|
|
4664
5726
|
const refreshRuntimeDiscovery = async () => {
|
|
4665
5727
|
const rscEnv = server.environments?.rsc;
|
|
4666
|
-
|
|
4667
|
-
|
|
4668
|
-
|
|
4669
|
-
|
|
4670
|
-
|
|
4671
|
-
|
|
4672
|
-
|
|
4673
|
-
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4678
|
-
|
|
5728
|
+
const hasMainRunner = !!rscEnv?.runner;
|
|
5729
|
+
if (!hasMainRunner && s.perRouterManifests.length === 0) return;
|
|
5730
|
+
await gate.runRefreshCycle(async () => {
|
|
5731
|
+
const hmrStart = performance.now();
|
|
5732
|
+
try {
|
|
5733
|
+
if (hasMainRunner) {
|
|
5734
|
+
await timed(
|
|
5735
|
+
debugDiscovery,
|
|
5736
|
+
"hmr discoverRouters",
|
|
5737
|
+
() => discoverRouters(s, rscEnv)
|
|
5738
|
+
);
|
|
5739
|
+
timedSync(
|
|
5740
|
+
debugDiscovery,
|
|
5741
|
+
"hmr writeRouteTypesFiles",
|
|
5742
|
+
() => writeRouteTypesFiles(s)
|
|
5743
|
+
);
|
|
5744
|
+
await timed(
|
|
5745
|
+
debugDiscovery,
|
|
5746
|
+
"hmr propagateDiscoveryState",
|
|
5747
|
+
() => propagateDiscoveryState(rscEnv)
|
|
5748
|
+
);
|
|
5749
|
+
} else {
|
|
5750
|
+
const tempRscEnv = await timed(
|
|
5751
|
+
debugDiscovery,
|
|
5752
|
+
"hmr refreshTempRscEnv (cloudflare)",
|
|
5753
|
+
() => refreshTempRscEnv()
|
|
5754
|
+
);
|
|
5755
|
+
if (!tempRscEnv) {
|
|
5756
|
+
throw new Error(
|
|
5757
|
+
"temp runner unavailable for cloudflare HMR rediscovery"
|
|
5758
|
+
);
|
|
5759
|
+
}
|
|
5760
|
+
await timed(
|
|
5761
|
+
debugDiscovery,
|
|
5762
|
+
"hmr discoverRouters (cloudflare)",
|
|
5763
|
+
() => discoverRouters(s, tempRscEnv)
|
|
5764
|
+
);
|
|
5765
|
+
timedSync(
|
|
5766
|
+
debugDiscovery,
|
|
5767
|
+
"hmr writeRouteTypesFiles",
|
|
5768
|
+
() => writeRouteTypesFiles(s)
|
|
5769
|
+
);
|
|
5770
|
+
}
|
|
5771
|
+
} catch (err) {
|
|
5772
|
+
console.warn(
|
|
5773
|
+
`[rsc-router] Runtime re-discovery failed: ${err.message}`
|
|
5774
|
+
);
|
|
5775
|
+
} finally {
|
|
5776
|
+
debugDiscovery?.(
|
|
5777
|
+
"hmr re-discovery done (%sms)",
|
|
5778
|
+
(performance.now() - hmrStart).toFixed(1)
|
|
5779
|
+
);
|
|
5780
|
+
}
|
|
5781
|
+
});
|
|
4679
5782
|
};
|
|
4680
5783
|
const scheduleRouteRegeneration = () => {
|
|
4681
5784
|
clearTimeout(routeChangeTimer);
|
|
4682
5785
|
routeChangeTimer = setTimeout(() => {
|
|
4683
5786
|
routeChangeTimer = void 0;
|
|
5787
|
+
const regenStart = debugDiscovery ? performance.now() : 0;
|
|
5788
|
+
const rscEnv = server.environments?.rsc;
|
|
5789
|
+
const skipStaticWrite = !rscEnv?.runner && s.perRouterManifests.length > 0;
|
|
4684
5790
|
try {
|
|
4685
|
-
|
|
4686
|
-
|
|
4687
|
-
|
|
5791
|
+
if (skipStaticWrite) {
|
|
5792
|
+
debugDiscovery?.(
|
|
5793
|
+
"watcher: skipping static write (cloudflare HMR \u2014 runtime rediscovery owns gen file)"
|
|
5794
|
+
);
|
|
5795
|
+
} else {
|
|
5796
|
+
writeCombinedRouteTypesWithTracking(s);
|
|
5797
|
+
if (s.perRouterManifests.length > 0) {
|
|
5798
|
+
supplementGenFilesWithRuntimeRoutes(s);
|
|
5799
|
+
}
|
|
4688
5800
|
}
|
|
4689
5801
|
} catch (err) {
|
|
4690
5802
|
console.error(
|
|
4691
5803
|
`[rsc-router] Route regeneration error: ${err.message}`
|
|
4692
5804
|
);
|
|
4693
5805
|
}
|
|
5806
|
+
debugDiscovery?.(
|
|
5807
|
+
"watcher: regenerated gen files (%sms)",
|
|
5808
|
+
(performance.now() - regenStart).toFixed(1)
|
|
5809
|
+
);
|
|
4694
5810
|
if (s.perRouterManifests.length > 0) {
|
|
4695
5811
|
refreshRuntimeDiscovery().catch((err) => {
|
|
4696
5812
|
console.warn(
|
|
4697
5813
|
`[rsc-router] Runtime re-discovery error: ${err.message}`
|
|
4698
5814
|
);
|
|
5815
|
+
resolveDiscoveryGate();
|
|
4699
5816
|
});
|
|
4700
5817
|
}
|
|
4701
5818
|
}, 100);
|
|
@@ -4713,6 +5830,12 @@ ${err.stack}`
|
|
|
4713
5830
|
const hasUrls = source.includes("urls(");
|
|
4714
5831
|
const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
|
|
4715
5832
|
if (!hasUrls && !hasCreateRouter) return;
|
|
5833
|
+
debugDiscovery?.(
|
|
5834
|
+
"watcher: %s matches (urls=%s, router=%s)",
|
|
5835
|
+
filePath,
|
|
5836
|
+
hasUrls,
|
|
5837
|
+
hasCreateRouter
|
|
5838
|
+
);
|
|
4716
5839
|
if (hasCreateRouter) {
|
|
4717
5840
|
const nestedRouterConflict = findNestedRouterConflict([
|
|
4718
5841
|
...s.cachedRouterFiles ?? [],
|
|
@@ -4726,6 +5849,9 @@ ${err.stack}`
|
|
|
4726
5849
|
}
|
|
4727
5850
|
s.cachedRouterFiles = void 0;
|
|
4728
5851
|
}
|
|
5852
|
+
if (s.perRouterManifests.length > 0) {
|
|
5853
|
+
gate.noteRouteEvent();
|
|
5854
|
+
}
|
|
4729
5855
|
scheduleRouteRegeneration();
|
|
4730
5856
|
} catch {
|
|
4731
5857
|
}
|
|
@@ -4745,14 +5871,31 @@ ${err.stack}`
|
|
|
4745
5871
|
// The manifest data is stored for the virtual module's load hook.
|
|
4746
5872
|
async buildStart() {
|
|
4747
5873
|
if (!s.isBuildMode) return;
|
|
4748
|
-
if (s.mergedRouteManifest !== null)
|
|
5874
|
+
if (s.mergedRouteManifest !== null) {
|
|
5875
|
+
debugDiscovery?.(
|
|
5876
|
+
"build: skip (already discovered, env=%s)",
|
|
5877
|
+
this.environment?.name ?? "?"
|
|
5878
|
+
);
|
|
5879
|
+
return;
|
|
5880
|
+
}
|
|
5881
|
+
const buildStartTime = performance.now();
|
|
5882
|
+
debugDiscovery?.("build: start (env=%s)", this.environment?.name ?? "?");
|
|
4749
5883
|
resetStagedBuildAssets(s.projectRoot);
|
|
4750
5884
|
s.prerenderManifestEntries = null;
|
|
4751
5885
|
s.staticManifestEntries = null;
|
|
5886
|
+
await timed(
|
|
5887
|
+
debugDiscovery,
|
|
5888
|
+
"build acquireBuildEnv",
|
|
5889
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5890
|
+
);
|
|
4752
5891
|
let tempServer = null;
|
|
4753
5892
|
globalThis.__rscRouterDiscoveryActive = true;
|
|
4754
5893
|
try {
|
|
4755
|
-
tempServer = await
|
|
5894
|
+
tempServer = await timed(
|
|
5895
|
+
debugDiscovery,
|
|
5896
|
+
"build createTempRscServer",
|
|
5897
|
+
() => createTempRscServer(s, { forceBuild: true })
|
|
5898
|
+
);
|
|
4756
5899
|
const rscEnv = tempServer.environments?.rsc;
|
|
4757
5900
|
if (!rscEnv?.runner) {
|
|
4758
5901
|
console.warn(
|
|
@@ -4766,8 +5909,16 @@ ${err.stack}`
|
|
|
4766
5909
|
if (tempIdsPlugin?.api?.staticHandlerModules) {
|
|
4767
5910
|
s.resolvedStaticModules = tempIdsPlugin.api.staticHandlerModules;
|
|
4768
5911
|
}
|
|
4769
|
-
await
|
|
4770
|
-
|
|
5912
|
+
await timed(
|
|
5913
|
+
debugDiscovery,
|
|
5914
|
+
"build discoverRouters",
|
|
5915
|
+
() => discoverRouters(s, rscEnv)
|
|
5916
|
+
);
|
|
5917
|
+
timedSync(
|
|
5918
|
+
debugDiscovery,
|
|
5919
|
+
"build writeRouteTypesFiles",
|
|
5920
|
+
() => writeRouteTypesFiles(s)
|
|
5921
|
+
);
|
|
4771
5922
|
} catch (err) {
|
|
4772
5923
|
const sourceFile = err.stack?.split("\n").find(
|
|
4773
5924
|
(line) => line.includes(s.projectRoot) && !line.includes("node_modules")
|
|
@@ -4786,8 +5937,45 @@ ${details}`
|
|
|
4786
5937
|
} finally {
|
|
4787
5938
|
delete globalThis.__rscRouterDiscoveryActive;
|
|
4788
5939
|
if (tempServer) {
|
|
4789
|
-
await
|
|
5940
|
+
await timed(
|
|
5941
|
+
debugDiscovery,
|
|
5942
|
+
"build tempServer.close",
|
|
5943
|
+
() => tempServer.close()
|
|
5944
|
+
);
|
|
4790
5945
|
}
|
|
5946
|
+
await releaseBuildEnv(s);
|
|
5947
|
+
debugDiscovery?.(
|
|
5948
|
+
"build discovery done (%sms)",
|
|
5949
|
+
(performance.now() - buildStartTime).toFixed(1)
|
|
5950
|
+
);
|
|
5951
|
+
}
|
|
5952
|
+
},
|
|
5953
|
+
// Suppress vite's HMR cascade for our own gen-file writes.
|
|
5954
|
+
//
|
|
5955
|
+
// After every cf HMR cycle, refreshTempRscEnv → writeRouteTypesFiles
|
|
5956
|
+
// writes the configured gen files (default `router.named-routes.gen.ts`,
|
|
5957
|
+
// but the source filenames and gen suffix are user-configurable). The
|
|
5958
|
+
// chokidar watcher then fires twice independently: our
|
|
5959
|
+
// `handleRouteFileChange` (already short-circuited by
|
|
5960
|
+
// `consumeSelfGenWrite` inside `maybeHandleGeneratedRouteFileMutation`),
|
|
5961
|
+
// AND vite's own HMR pipeline (which invalidates the gen file's
|
|
5962
|
+
// importers and triggers a second workerd full reload — visible to the
|
|
5963
|
+
// user as a duplicate "[RSCRouter] HMR: version changed" on the client).
|
|
5964
|
+
//
|
|
5965
|
+
// `peekSelfGenWrite` is the authoritative filter: its map only contains
|
|
5966
|
+
// paths that `markSelfGenWrite` has registered, so it natively works
|
|
5967
|
+
// for any configured gen-file name. It is non-consuming so the chokidar
|
|
5968
|
+
// handler that fires later can still consume the same entry. Returning
|
|
5969
|
+
// [] tells vite "no modules invalidated by this change" — safe because
|
|
5970
|
+
// `s.perRouterManifests` is already up-to-date (the write that just
|
|
5971
|
+
// happened is the consequence of our just-completed rediscovery).
|
|
5972
|
+
handleHotUpdate(ctx) {
|
|
5973
|
+
if (peekSelfGenWrite(s, ctx.file)) {
|
|
5974
|
+
debugDiscovery?.(
|
|
5975
|
+
"handleHotUpdate: suppressing self-write HMR cascade for %s",
|
|
5976
|
+
ctx.file
|
|
5977
|
+
);
|
|
5978
|
+
return [];
|
|
4791
5979
|
}
|
|
4792
5980
|
},
|
|
4793
5981
|
// Virtual module: provides the pre-generated route manifest as a JS module
|
|
@@ -4804,17 +5992,36 @@ ${details}`
|
|
|
4804
5992
|
async load(id) {
|
|
4805
5993
|
if (id === "\0" + VIRTUAL_ROUTES_MANIFEST_ID) {
|
|
4806
5994
|
if (s.discoveryDone) {
|
|
4807
|
-
await
|
|
5995
|
+
await timed(
|
|
5996
|
+
debugRoutes,
|
|
5997
|
+
"await discoveryDone (manifest)",
|
|
5998
|
+
() => s.discoveryDone
|
|
5999
|
+
);
|
|
4808
6000
|
}
|
|
4809
|
-
|
|
6001
|
+
const code = await timed(
|
|
6002
|
+
debugRoutes,
|
|
6003
|
+
"generateRoutesManifestModule",
|
|
6004
|
+
() => generateRoutesManifestModule(s)
|
|
6005
|
+
);
|
|
6006
|
+
debugRoutes?.("manifest module emitted (%d bytes)", code?.length ?? 0);
|
|
6007
|
+
return code;
|
|
4810
6008
|
}
|
|
4811
6009
|
const perRouterPrefix = "\0" + VIRTUAL_ROUTES_MANIFEST_ID + "/";
|
|
4812
6010
|
if (id.startsWith(perRouterPrefix)) {
|
|
4813
6011
|
if (s.discoveryDone) {
|
|
4814
|
-
await
|
|
6012
|
+
await timed(
|
|
6013
|
+
debugRoutes,
|
|
6014
|
+
"await discoveryDone (per-router)",
|
|
6015
|
+
() => s.discoveryDone
|
|
6016
|
+
);
|
|
4815
6017
|
}
|
|
4816
6018
|
const routerId = id.slice(perRouterPrefix.length);
|
|
4817
|
-
|
|
6019
|
+
const code = await timed(
|
|
6020
|
+
debugRoutes,
|
|
6021
|
+
`generatePerRouterModule ${routerId}`,
|
|
6022
|
+
() => generatePerRouterModule(s, routerId)
|
|
6023
|
+
);
|
|
6024
|
+
return code;
|
|
4818
6025
|
}
|
|
4819
6026
|
return null;
|
|
4820
6027
|
},
|
|
@@ -4822,28 +6029,44 @@ ${details}`
|
|
|
4822
6029
|
// Used by closeBundle for handler code eviction and prerender data injection.
|
|
4823
6030
|
generateBundle(_options, bundle) {
|
|
4824
6031
|
if (this.environment?.name !== "rsc") return;
|
|
6032
|
+
const genStart = debugBuild ? performance.now() : 0;
|
|
4825
6033
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4826
6034
|
if (chunk.type === "chunk" && chunk.isEntry) {
|
|
4827
6035
|
s.rscEntryFileName = fileName;
|
|
4828
6036
|
break;
|
|
4829
6037
|
}
|
|
4830
6038
|
}
|
|
4831
|
-
if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
|
|
6039
|
+
if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size) {
|
|
6040
|
+
debugBuild?.(
|
|
6041
|
+
"generateBundle (rsc): no handlers to scan (%sms)",
|
|
6042
|
+
(performance.now() - genStart).toFixed(1)
|
|
6043
|
+
);
|
|
4832
6044
|
return;
|
|
6045
|
+
}
|
|
6046
|
+
s.handlerChunkInfoMap.clear();
|
|
6047
|
+
s.staticHandlerChunkInfoMap.clear();
|
|
4833
6048
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4834
6049
|
if (chunk.type !== "chunk") continue;
|
|
4835
|
-
if (
|
|
6050
|
+
if (s.resolvedPrerenderModules?.size) {
|
|
4836
6051
|
const handlers = extractHandlerExportsFromChunk(
|
|
4837
6052
|
chunk.code,
|
|
4838
6053
|
s.resolvedPrerenderModules,
|
|
4839
6054
|
"Prerender",
|
|
4840
|
-
|
|
6055
|
+
false
|
|
4841
6056
|
);
|
|
4842
6057
|
if (handlers.length > 0) {
|
|
4843
|
-
|
|
6058
|
+
const existing = s.handlerChunkInfoMap.get(fileName);
|
|
6059
|
+
if (existing) {
|
|
6060
|
+
existing.exports.push(...handlers);
|
|
6061
|
+
} else {
|
|
6062
|
+
s.handlerChunkInfoMap.set(fileName, {
|
|
6063
|
+
fileName,
|
|
6064
|
+
exports: handlers
|
|
6065
|
+
});
|
|
6066
|
+
}
|
|
4844
6067
|
}
|
|
4845
6068
|
}
|
|
4846
|
-
if (
|
|
6069
|
+
if (s.resolvedStaticModules?.size) {
|
|
4847
6070
|
const handlers = extractHandlerExportsFromChunk(
|
|
4848
6071
|
chunk.code,
|
|
4849
6072
|
s.resolvedStaticModules,
|
|
@@ -4851,10 +6074,25 @@ ${details}`
|
|
|
4851
6074
|
false
|
|
4852
6075
|
);
|
|
4853
6076
|
if (handlers.length > 0) {
|
|
4854
|
-
|
|
6077
|
+
const existing = s.staticHandlerChunkInfoMap.get(fileName);
|
|
6078
|
+
if (existing) {
|
|
6079
|
+
existing.exports.push(...handlers);
|
|
6080
|
+
} else {
|
|
6081
|
+
s.staticHandlerChunkInfoMap.set(fileName, {
|
|
6082
|
+
fileName,
|
|
6083
|
+
exports: handlers
|
|
6084
|
+
});
|
|
6085
|
+
}
|
|
4855
6086
|
}
|
|
4856
6087
|
}
|
|
4857
6088
|
}
|
|
6089
|
+
debugBuild?.(
|
|
6090
|
+
"generateBundle (rsc): scanned %d chunks, %d prerender chunk(s), %d static chunk(s) (%sms)",
|
|
6091
|
+
Object.keys(bundle).length,
|
|
6092
|
+
s.handlerChunkInfoMap.size,
|
|
6093
|
+
s.staticHandlerChunkInfoMap.size,
|
|
6094
|
+
(performance.now() - genStart).toFixed(1)
|
|
6095
|
+
);
|
|
4858
6096
|
},
|
|
4859
6097
|
// Build-time pre-rendering: evict handler code and inject collected prerender data.
|
|
4860
6098
|
// Collection now happens in-process during discoverRouters() via RSC runner.
|
|
@@ -4865,21 +6103,41 @@ ${details}`
|
|
|
4865
6103
|
async handler() {
|
|
4866
6104
|
if (!s.isBuildMode) return;
|
|
4867
6105
|
if (this.environment && this.environment.name !== "rsc") return;
|
|
4868
|
-
|
|
6106
|
+
timedSync(
|
|
6107
|
+
debugBuild,
|
|
6108
|
+
"closeBundle postprocessBundle",
|
|
6109
|
+
() => postprocessBundle(s)
|
|
6110
|
+
);
|
|
4869
6111
|
}
|
|
4870
6112
|
}
|
|
4871
6113
|
};
|
|
4872
6114
|
}
|
|
4873
6115
|
|
|
4874
6116
|
// src/vite/rango.ts
|
|
6117
|
+
var debugConfig = createRangoDebugger(NS.config);
|
|
4875
6118
|
async function rango(options) {
|
|
6119
|
+
const rangoStart = performance.now();
|
|
4876
6120
|
const resolvedOptions = options ?? { preset: "node" };
|
|
4877
6121
|
const preset = resolvedOptions.preset ?? "node";
|
|
4878
6122
|
const showBanner = resolvedOptions.banner ?? true;
|
|
6123
|
+
debugConfig?.("rango(%s) setup start", preset);
|
|
4879
6124
|
const plugins = [];
|
|
4880
|
-
const rangoAliases = getPackageAliases();
|
|
4881
|
-
const excludeDeps =
|
|
4882
|
-
|
|
6125
|
+
const rangoAliases = { ...getPackageAliases(), ...getVendorAliases() };
|
|
6126
|
+
const excludeDeps = [
|
|
6127
|
+
...getExcludeDeps(),
|
|
6128
|
+
// plugin-rsc itself injects these into the client env's
|
|
6129
|
+
// optimizeDeps.include, which overrides exclude for the dep's own
|
|
6130
|
+
// pre-bundle entry. What exclude still controls is how *other*
|
|
6131
|
+
// pre-bundled deps treat imports of these specs (external vs inlined)
|
|
6132
|
+
// via esbuildCjsExternalPlugin. The cjs-to-esm transform in
|
|
6133
|
+
// plugins/cjs-to-esm.ts is the fallback for strict-pnpm consumers,
|
|
6134
|
+
// where client.browser's bare include fails to resolve and Vite ends up
|
|
6135
|
+
// serving the raw CJS file at dev-serve time.
|
|
6136
|
+
"@vitejs/plugin-rsc/browser",
|
|
6137
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
|
|
6138
|
+
];
|
|
6139
|
+
const pkg = getPublishedPackageName();
|
|
6140
|
+
const nested = (spec) => `${pkg} > ${spec}`;
|
|
4883
6141
|
const routerRef = { path: void 0 };
|
|
4884
6142
|
const prerenderEnabled = true;
|
|
4885
6143
|
if (preset === "cloudflare") {
|
|
@@ -4917,7 +6175,7 @@ async function rango(options) {
|
|
|
4917
6175
|
// Pre-bundle rsc-html-stream to prevent discovery during first request
|
|
4918
6176
|
// Exclude rsc-router modules to ensure same Context instance
|
|
4919
6177
|
optimizeDeps: {
|
|
4920
|
-
include: ["rsc-html-stream/client"],
|
|
6178
|
+
include: [nested("rsc-html-stream/client")],
|
|
4921
6179
|
exclude: excludeDeps,
|
|
4922
6180
|
esbuildOptions: sharedEsbuildOptions
|
|
4923
6181
|
}
|
|
@@ -4942,8 +6200,10 @@ async function rango(options) {
|
|
|
4942
6200
|
"react-dom/static.edge",
|
|
4943
6201
|
"react/jsx-runtime",
|
|
4944
6202
|
"react/jsx-dev-runtime",
|
|
4945
|
-
"rsc-html-stream/server",
|
|
4946
|
-
|
|
6203
|
+
nested("rsc-html-stream/server"),
|
|
6204
|
+
nested(
|
|
6205
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
6206
|
+
)
|
|
4947
6207
|
],
|
|
4948
6208
|
exclude: excludeDeps,
|
|
4949
6209
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -4958,7 +6218,9 @@ async function rango(options) {
|
|
|
4958
6218
|
"react",
|
|
4959
6219
|
"react/jsx-runtime",
|
|
4960
6220
|
"react/jsx-dev-runtime",
|
|
4961
|
-
|
|
6221
|
+
nested(
|
|
6222
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
6223
|
+
)
|
|
4962
6224
|
],
|
|
4963
6225
|
exclude: excludeDeps,
|
|
4964
6226
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -4975,6 +6237,7 @@ async function rango(options) {
|
|
|
4975
6237
|
}
|
|
4976
6238
|
});
|
|
4977
6239
|
plugins.push(createVirtualEntriesPlugin(finalEntries));
|
|
6240
|
+
plugins.push(performanceTracksPlugin());
|
|
4978
6241
|
plugins.push(
|
|
4979
6242
|
rsc({
|
|
4980
6243
|
entries: finalEntries,
|
|
@@ -4983,153 +6246,126 @@ async function rango(options) {
|
|
|
4983
6246
|
);
|
|
4984
6247
|
plugins.push(clientRefDedup());
|
|
4985
6248
|
} else {
|
|
4986
|
-
|
|
4987
|
-
|
|
4988
|
-
|
|
4989
|
-
|
|
4990
|
-
|
|
4991
|
-
|
|
4992
|
-
|
|
4993
|
-
const
|
|
4994
|
-
|
|
4995
|
-
|
|
4996
|
-
|
|
4997
|
-
|
|
4998
|
-
|
|
4999
|
-
|
|
5000
|
-
|
|
5001
|
-
routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
|
|
5002
|
-
} else if (candidates.length > 1) {
|
|
5003
|
-
const list = candidates.map(
|
|
5004
|
-
(f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
|
|
5005
|
-
).join("\n");
|
|
5006
|
-
throw new Error(
|
|
5007
|
-
`[rsc-router] Multiple routers found. Specify \`router\` to choose one:
|
|
5008
|
-
${list}`
|
|
5009
|
-
);
|
|
5010
|
-
}
|
|
6249
|
+
plugins.push({
|
|
6250
|
+
name: "@rangojs/router:auto-discover",
|
|
6251
|
+
config(userConfig) {
|
|
6252
|
+
if (routerRef.path) return;
|
|
6253
|
+
const root = userConfig.root ? resolve9(process.cwd(), userConfig.root) : process.cwd();
|
|
6254
|
+
const candidates = findRouterFiles(root);
|
|
6255
|
+
if (candidates.length === 1) {
|
|
6256
|
+
const abs = candidates[0];
|
|
6257
|
+
routerRef.path = (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
|
|
6258
|
+
} else if (candidates.length > 1) {
|
|
6259
|
+
const list = candidates.map(
|
|
6260
|
+
(f) => " - " + (f.startsWith(root) ? f.slice(root.length + 1) : f)
|
|
6261
|
+
).join("\n");
|
|
6262
|
+
throw new Error(`[rsc-router] Multiple routers found:
|
|
6263
|
+
${list}`);
|
|
5011
6264
|
}
|
|
5012
|
-
}
|
|
5013
|
-
}
|
|
5014
|
-
const
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5021
|
-
|
|
5022
|
-
|
|
5023
|
-
|
|
5024
|
-
|
|
5025
|
-
|
|
5026
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
resolve: {
|
|
5043
|
-
alias: rangoAliases
|
|
5044
|
-
},
|
|
5045
|
-
environments: {
|
|
5046
|
-
client: {
|
|
5047
|
-
build: {
|
|
5048
|
-
rollupOptions: {
|
|
5049
|
-
output: {
|
|
5050
|
-
manualChunks: getManualChunks
|
|
5051
|
-
}
|
|
5052
|
-
}
|
|
5053
|
-
},
|
|
5054
|
-
// Always exclude rsc-router modules, conditionally add virtual entry
|
|
5055
|
-
optimizeDeps: {
|
|
5056
|
-
// Pre-bundle React and rsc-html-stream to prevent late discovery
|
|
5057
|
-
// triggering ERR_OUTDATED_OPTIMIZED_DEP on cold starts
|
|
5058
|
-
include: [
|
|
5059
|
-
"react",
|
|
5060
|
-
"react-dom",
|
|
5061
|
-
"react/jsx-runtime",
|
|
5062
|
-
"react/jsx-dev-runtime",
|
|
5063
|
-
"rsc-html-stream/client"
|
|
5064
|
-
],
|
|
5065
|
-
exclude: excludeDeps,
|
|
5066
|
-
esbuildOptions: sharedEsbuildOptions,
|
|
5067
|
-
...useVirtualClient && {
|
|
5068
|
-
// Tell Vite to scan the virtual entry for dependencies
|
|
5069
|
-
entries: [VIRTUAL_IDS.browser]
|
|
5070
|
-
}
|
|
5071
|
-
}
|
|
5072
|
-
},
|
|
5073
|
-
...useVirtualSSR && {
|
|
5074
|
-
ssr: {
|
|
5075
|
-
optimizeDeps: {
|
|
5076
|
-
entries: [VIRTUAL_IDS.ssr],
|
|
5077
|
-
// Pre-bundle all SSR deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
|
|
5078
|
-
include: [
|
|
5079
|
-
"react",
|
|
5080
|
-
"react-dom",
|
|
5081
|
-
"react-dom/server.edge",
|
|
5082
|
-
"react-dom/static.edge",
|
|
5083
|
-
"react/jsx-runtime",
|
|
5084
|
-
"react/jsx-dev-runtime",
|
|
5085
|
-
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
5086
|
-
],
|
|
5087
|
-
exclude: excludeDeps,
|
|
5088
|
-
esbuildOptions: sharedEsbuildOptions
|
|
6265
|
+
}
|
|
6266
|
+
});
|
|
6267
|
+
const finalEntries = {
|
|
6268
|
+
client: VIRTUAL_IDS.browser,
|
|
6269
|
+
ssr: VIRTUAL_IDS.ssr,
|
|
6270
|
+
rsc: VIRTUAL_IDS.rsc
|
|
6271
|
+
};
|
|
6272
|
+
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
6273
|
+
let hasWarnedDuplicate = false;
|
|
6274
|
+
plugins.push({
|
|
6275
|
+
name: "@rangojs/router:rsc-integration",
|
|
6276
|
+
enforce: "pre",
|
|
6277
|
+
config() {
|
|
6278
|
+
return {
|
|
6279
|
+
optimizeDeps: {
|
|
6280
|
+
exclude: excludeDeps,
|
|
6281
|
+
esbuildOptions: sharedEsbuildOptions
|
|
6282
|
+
},
|
|
6283
|
+
build: {
|
|
6284
|
+
rollupOptions: { onwarn }
|
|
6285
|
+
},
|
|
6286
|
+
resolve: {
|
|
6287
|
+
alias: rangoAliases
|
|
6288
|
+
},
|
|
6289
|
+
environments: {
|
|
6290
|
+
client: {
|
|
6291
|
+
build: {
|
|
6292
|
+
rollupOptions: {
|
|
6293
|
+
output: {
|
|
6294
|
+
manualChunks: getManualChunks
|
|
5089
6295
|
}
|
|
5090
6296
|
}
|
|
5091
6297
|
},
|
|
5092
|
-
|
|
5093
|
-
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
6298
|
+
optimizeDeps: {
|
|
6299
|
+
include: [
|
|
6300
|
+
"react",
|
|
6301
|
+
"react-dom",
|
|
6302
|
+
"react/jsx-runtime",
|
|
6303
|
+
"react/jsx-dev-runtime",
|
|
6304
|
+
nested("rsc-html-stream/client")
|
|
6305
|
+
],
|
|
6306
|
+
exclude: excludeDeps,
|
|
6307
|
+
esbuildOptions: sharedEsbuildOptions,
|
|
6308
|
+
entries: [VIRTUAL_IDS.browser]
|
|
6309
|
+
}
|
|
6310
|
+
},
|
|
6311
|
+
ssr: {
|
|
6312
|
+
optimizeDeps: {
|
|
6313
|
+
entries: [VIRTUAL_IDS.ssr],
|
|
6314
|
+
include: [
|
|
6315
|
+
"react",
|
|
6316
|
+
"react-dom",
|
|
6317
|
+
"react-dom/server.edge",
|
|
6318
|
+
"react-dom/static.edge",
|
|
6319
|
+
"react/jsx-runtime",
|
|
6320
|
+
"react/jsx-dev-runtime",
|
|
6321
|
+
nested(
|
|
6322
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
6323
|
+
)
|
|
6324
|
+
],
|
|
6325
|
+
exclude: excludeDeps,
|
|
6326
|
+
esbuildOptions: sharedEsbuildOptions
|
|
6327
|
+
}
|
|
6328
|
+
},
|
|
6329
|
+
rsc: {
|
|
6330
|
+
optimizeDeps: {
|
|
6331
|
+
entries: [VIRTUAL_IDS.rsc],
|
|
6332
|
+
include: [
|
|
6333
|
+
"react",
|
|
6334
|
+
"react/jsx-runtime",
|
|
6335
|
+
"react/jsx-dev-runtime",
|
|
6336
|
+
nested(
|
|
6337
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
6338
|
+
)
|
|
6339
|
+
],
|
|
6340
|
+
esbuildOptions: sharedEsbuildOptions
|
|
5106
6341
|
}
|
|
5107
6342
|
}
|
|
5108
|
-
};
|
|
5109
|
-
},
|
|
5110
|
-
configResolved(config) {
|
|
5111
|
-
if (showBanner) {
|
|
5112
|
-
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
5113
|
-
printBanner(mode, "node", rangoVersion);
|
|
5114
|
-
}
|
|
5115
|
-
const rscMinimalCount = config.plugins.filter(
|
|
5116
|
-
(p) => p.name === "rsc:minimal"
|
|
5117
|
-
).length;
|
|
5118
|
-
if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
|
|
5119
|
-
hasWarnedDuplicate = true;
|
|
5120
|
-
console.warn(
|
|
5121
|
-
"[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your config or use rango({ rsc: false }) for manual configuration."
|
|
5122
|
-
);
|
|
5123
6343
|
}
|
|
6344
|
+
};
|
|
6345
|
+
},
|
|
6346
|
+
configResolved(config) {
|
|
6347
|
+
if (showBanner) {
|
|
6348
|
+
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
6349
|
+
printBanner(mode, "node", rangoVersion);
|
|
5124
6350
|
}
|
|
5125
|
-
|
|
5126
|
-
|
|
5127
|
-
|
|
5128
|
-
|
|
5129
|
-
|
|
5130
|
-
|
|
5131
|
-
|
|
5132
|
-
|
|
6351
|
+
const rscMinimalCount = config.plugins.filter(
|
|
6352
|
+
(p) => p.name === "rsc:minimal"
|
|
6353
|
+
).length;
|
|
6354
|
+
if (rscMinimalCount > 1 && !hasWarnedDuplicate) {
|
|
6355
|
+
hasWarnedDuplicate = true;
|
|
6356
|
+
console.warn(
|
|
6357
|
+
"[rsc-router] Duplicate @vitejs/plugin-rsc detected. Remove rsc() from your vite config \u2014 rango() includes it automatically."
|
|
6358
|
+
);
|
|
6359
|
+
}
|
|
6360
|
+
}
|
|
6361
|
+
});
|
|
6362
|
+
plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
|
|
6363
|
+
plugins.push(performanceTracksPlugin());
|
|
6364
|
+
plugins.push(
|
|
6365
|
+
rsc({
|
|
6366
|
+
entries: finalEntries
|
|
6367
|
+
})
|
|
6368
|
+
);
|
|
5133
6369
|
plugins.push(clientRefDedup());
|
|
5134
6370
|
}
|
|
5135
6371
|
plugins.push({
|
|
@@ -5157,20 +6393,24 @@ ${list}`
|
|
|
5157
6393
|
plugins.push(createVersionPlugin());
|
|
5158
6394
|
const discoveryEntryPath = preset !== "cloudflare" ? routerRef.path : void 0;
|
|
5159
6395
|
const discoveryRouterRef = preset !== "cloudflare" ? routerRef : void 0;
|
|
5160
|
-
|
|
5161
|
-
|
|
5162
|
-
plugins.push(createVersionInjectorPlugin(injectorEntryPath));
|
|
6396
|
+
if (preset === "cloudflare") {
|
|
6397
|
+
plugins.push(createVersionInjectorPlugin(void 0));
|
|
5163
6398
|
}
|
|
5164
6399
|
plugins.push(createCjsToEsmPlugin());
|
|
5165
6400
|
plugins.push(
|
|
5166
6401
|
createRouterDiscoveryPlugin(discoveryEntryPath, {
|
|
5167
6402
|
routerPathRef: discoveryRouterRef,
|
|
5168
6403
|
enableBuildPrerender: prerenderEnabled,
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
exclude: resolvedOptions.exclude
|
|
6404
|
+
buildEnv: options?.buildEnv,
|
|
6405
|
+
preset
|
|
5172
6406
|
})
|
|
5173
6407
|
);
|
|
6408
|
+
debugConfig?.(
|
|
6409
|
+
"rango(%s) setup done: %d plugin(s) (%sms)",
|
|
6410
|
+
preset,
|
|
6411
|
+
plugins.length,
|
|
6412
|
+
(performance.now() - rangoStart).toFixed(1)
|
|
6413
|
+
);
|
|
5174
6414
|
return plugins;
|
|
5175
6415
|
}
|
|
5176
6416
|
|
|
@@ -5181,29 +6421,75 @@ function poke() {
|
|
|
5181
6421
|
apply: "serve",
|
|
5182
6422
|
configureServer(server) {
|
|
5183
6423
|
const stdin = process.stdin;
|
|
5184
|
-
const
|
|
6424
|
+
const debug11 = process.env.RANGO_POKE_DEBUG === "1";
|
|
6425
|
+
const triggerReload = (source) => {
|
|
6426
|
+
server.hot.send({ type: "full-reload", path: "*" });
|
|
6427
|
+
server.config.logger.info(` browser reload (${source})`, {
|
|
6428
|
+
timestamp: true
|
|
6429
|
+
});
|
|
6430
|
+
};
|
|
6431
|
+
const toBuffer = (chunk) => {
|
|
6432
|
+
return typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
6433
|
+
};
|
|
6434
|
+
const formatChunk = (chunk) => {
|
|
6435
|
+
const data = toBuffer(chunk);
|
|
6436
|
+
const hex = Array.from(data).map((byte) => `0x${byte.toString(16).padStart(2, "0")}`).join(" ");
|
|
6437
|
+
const ascii = Array.from(data).map((byte) => {
|
|
6438
|
+
if (byte >= 32 && byte <= 126) return String.fromCharCode(byte);
|
|
6439
|
+
if (byte === 10) return "\\n";
|
|
6440
|
+
if (byte === 13) return "\\r";
|
|
6441
|
+
if (byte === 9) return "\\t";
|
|
6442
|
+
return ".";
|
|
6443
|
+
}).join("");
|
|
6444
|
+
return `len=${data.length} hex=[${hex}] ascii="${ascii}"`;
|
|
6445
|
+
};
|
|
6446
|
+
const readCtrlR = (chunk) => {
|
|
6447
|
+
const data = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
6448
|
+
return data.length === 1 && data[0] === 18;
|
|
6449
|
+
};
|
|
6450
|
+
const readSubmittedCommands = (chunk) => {
|
|
6451
|
+
const text = toBuffer(chunk).toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
6452
|
+
if (!text.includes("\n")) return [];
|
|
6453
|
+
const lines = text.split("\n");
|
|
6454
|
+
lines.pop();
|
|
6455
|
+
return lines;
|
|
6456
|
+
};
|
|
6457
|
+
if (debug11) {
|
|
6458
|
+
server.config.logger.info(
|
|
6459
|
+
` poke debug enabled (isTTY=${stdin.isTTY ? "yes" : "no"}, isRaw=${stdin.isTTY ? stdin.isRaw ? "yes" : "no" : "n/a"})`,
|
|
6460
|
+
{ timestamp: true }
|
|
6461
|
+
);
|
|
6462
|
+
}
|
|
5185
6463
|
if (stdin.isTTY) {
|
|
5186
|
-
|
|
6464
|
+
server.config.logger.info(
|
|
6465
|
+
" poke ready: press e + enter to reload browser (ctrl+r also works when available)",
|
|
6466
|
+
{ timestamp: true }
|
|
6467
|
+
);
|
|
5187
6468
|
}
|
|
5188
6469
|
const onData = (data) => {
|
|
5189
|
-
if (
|
|
5190
|
-
|
|
5191
|
-
process.emit("SIGINT", "SIGINT");
|
|
5192
|
-
return;
|
|
5193
|
-
}
|
|
5194
|
-
if (data[0] === 18) {
|
|
5195
|
-
server.hot.send({ type: "full-reload", path: "*" });
|
|
5196
|
-
server.config.logger.info(" browser reload (ctrl+r)", {
|
|
6470
|
+
if (debug11) {
|
|
6471
|
+
server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
|
|
5197
6472
|
timestamp: true
|
|
5198
6473
|
});
|
|
5199
6474
|
}
|
|
6475
|
+
if (readCtrlR(data)) {
|
|
6476
|
+
triggerReload("ctrl+r");
|
|
6477
|
+
return;
|
|
6478
|
+
}
|
|
6479
|
+
for (const command of readSubmittedCommands(data)) {
|
|
6480
|
+
if (command === "e") {
|
|
6481
|
+
triggerReload("e+enter");
|
|
6482
|
+
return;
|
|
6483
|
+
}
|
|
6484
|
+
if (command === "\x1Br") {
|
|
6485
|
+
triggerReload("option+r+enter");
|
|
6486
|
+
return;
|
|
6487
|
+
}
|
|
6488
|
+
}
|
|
5200
6489
|
};
|
|
5201
6490
|
stdin.on("data", onData);
|
|
5202
6491
|
server.httpServer?.on("close", () => {
|
|
5203
6492
|
stdin.off("data", onData);
|
|
5204
|
-
if (stdin.isTTY && previousRawMode !== null) {
|
|
5205
|
-
stdin.setRawMode(previousRawMode);
|
|
5206
|
-
}
|
|
5207
6493
|
});
|
|
5208
6494
|
}
|
|
5209
6495
|
};
|