@rangojs/router 0.0.0-experimental.debug-cache-fix → 0.0.0-experimental.df7974ff
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/README.md +188 -35
- 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 +130 -47
- 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 +1884 -537
- 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 +7 -5
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/cache-guide/SKILL.md +32 -0
- package/skills/caching/SKILL.md +8 -0
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +54 -20
- 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 +123 -46
- 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 +68 -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 +79 -0
- 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 +19 -1
- package/skills/view-transitions/SKILL.md +212 -0
- package/src/__internal.ts +1 -1
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/event-controller.ts +44 -4
- package/src/browser/navigation-bridge.ts +156 -10
- package/src/browser/navigation-client.ts +128 -53
- package/src/browser/navigation-store.ts +68 -9
- package/src/browser/partial-update.ts +84 -16
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +156 -18
- package/src/browser/prefetch/queue.ts +92 -29
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +72 -8
- package/src/browser/react/NavigationProvider.tsx +82 -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 +60 -9
- package/src/browser/scroll-restoration.ts +38 -33
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/server-action-bridge.ts +8 -6
- package/src/browser/types.ts +46 -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 +211 -72
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/cache/cache-scope.ts +12 -14
- package/src/cache/cf/cf-cache-store.ts +5 -7
- package/src/cache/taint.ts +55 -0
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +89 -231
- package/src/context-var.ts +72 -2
- package/src/handle.ts +40 -0
- package/src/href-client.ts +4 -1
- package/src/index.rsc.ts +6 -1
- package/src/index.ts +49 -6
- 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 +210 -35
- package/src/route-definition/helpers-types.ts +73 -20
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +9 -1
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-types.ts +18 -0
- package/src/router/content-negotiation.ts +100 -1
- package/src/router/handler-context.ts +77 -38
- package/src/router/intercept-resolution.ts +9 -4
- package/src/router/lazy-includes.ts +6 -6
- package/src/router/loader-resolution.ts +159 -21
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +128 -192
- package/src/router/match-handlers.ts +1 -0
- package/src/router/match-middleware/cache-lookup.ts +28 -8
- package/src/router/match-middleware/segment-resolution.ts +53 -0
- package/src/router/match-result.ts +101 -4
- package/src/router/middleware-types.ts +20 -33
- package/src/router/middleware.ts +56 -12
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +101 -17
- package/src/router/prerender-match.ts +110 -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-interfaces.ts +36 -4
- package/src/router/router-options.ts +37 -11
- package/src/router/segment-resolution/fresh.ts +88 -9
- package/src/router/segment-resolution/helpers.ts +29 -24
- package/src/router/segment-resolution/revalidation.ts +219 -108
- 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 +55 -7
- 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 +20 -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 +71 -70
- package/src/server/context.ts +76 -4
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +185 -57
- package/src/ssr/index.tsx +8 -1
- package/src/static-handler.ts +18 -6
- package/src/types/cache-types.ts +4 -4
- package/src/types/handler-context.ts +47 -56
- package/src/types/loader-types.ts +41 -15
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +12 -1
- package/src/types/segments.ts +18 -1
- package/src/urls/include-helper.ts +24 -14
- package/src/urls/path-helper-types.ts +39 -6
- package/src/urls/path-helper.ts +47 -12
- 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 -4
- package/src/vite/index.ts +4 -0
- package/src/vite/plugin-types.ts +60 -5
- 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 +52 -28
- 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/rango.ts +63 -11
- package/src/vite/router-discovery.ts +732 -86
- package/src/vite/utils/banner.ts +1 -1
- 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,6 +383,10 @@ 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);
|
|
@@ -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.df7974ff",
|
|
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) {
|
|
@@ -2317,7 +2629,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2317
2629
|
}
|
|
2318
2630
|
return routeMap;
|
|
2319
2631
|
}
|
|
2320
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
|
|
2632
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
2321
2633
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
2322
2634
|
const realPath = resolve2(filePath);
|
|
2323
2635
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
@@ -2333,7 +2645,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2333
2645
|
return { routes: {}, searchSchemas: {} };
|
|
2334
2646
|
}
|
|
2335
2647
|
let block;
|
|
2336
|
-
if (
|
|
2648
|
+
if (inlineBlock) {
|
|
2649
|
+
block = inlineBlock;
|
|
2650
|
+
} else if (variableName) {
|
|
2337
2651
|
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
2338
2652
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
2339
2653
|
block = extracted;
|
|
@@ -2452,7 +2766,7 @@ Router root: ${conflict.ancestor}
|
|
|
2452
2766
|
Nested router: ${conflict.nested}
|
|
2453
2767
|
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
2454
2768
|
}
|
|
2455
|
-
function
|
|
2769
|
+
function extractUrlsFromRouter(code) {
|
|
2456
2770
|
const sourceFile = ts5.createSourceFile(
|
|
2457
2771
|
"router.tsx",
|
|
2458
2772
|
code,
|
|
@@ -2466,24 +2780,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2466
2780
|
const callee = node.expression;
|
|
2467
2781
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
2468
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
|
+
}
|
|
2469
2795
|
function visit(node) {
|
|
2470
2796
|
if (result) return;
|
|
2471
|
-
if (ts5.isCallExpression(node) &&
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
}
|
|
2476
|
-
|
|
2477
|
-
result = node.arguments[0].text;
|
|
2478
|
-
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) };
|
|
2479
2803
|
}
|
|
2804
|
+
return;
|
|
2480
2805
|
}
|
|
2481
2806
|
if (isCreateRouterCall(node)) {
|
|
2482
2807
|
const callExpr = node;
|
|
2483
|
-
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) {
|
|
2484
2844
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
2485
2845
|
for (const prop of arg.properties) {
|
|
2486
|
-
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)) {
|
|
2487
2847
|
result = prop.initializer.text;
|
|
2488
2848
|
return;
|
|
2489
2849
|
}
|
|
@@ -2496,6 +2856,19 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2496
2856
|
visit(sourceFile);
|
|
2497
2857
|
return result;
|
|
2498
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
|
+
}
|
|
2499
2872
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
2500
2873
|
let routerSource;
|
|
2501
2874
|
try {
|
|
@@ -2503,19 +2876,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
2503
2876
|
} catch {
|
|
2504
2877
|
return { routes: {}, searchSchemas: {} };
|
|
2505
2878
|
}
|
|
2506
|
-
const
|
|
2507
|
-
if (!
|
|
2879
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
2880
|
+
if (!extraction) {
|
|
2508
2881
|
return { routes: {}, searchSchemas: {} };
|
|
2509
2882
|
}
|
|
2510
|
-
const
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
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);
|
|
2515
2907
|
}
|
|
2516
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
2517
2908
|
}
|
|
2518
|
-
|
|
2909
|
+
if (basename3) {
|
|
2910
|
+
result = applyBasenameToRoutes(result, basename3);
|
|
2911
|
+
}
|
|
2912
|
+
return result;
|
|
2519
2913
|
}
|
|
2520
2914
|
function findRouterFiles(root, filter) {
|
|
2521
2915
|
const result = [];
|
|
@@ -2540,25 +2934,15 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
2540
2934
|
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
2541
2935
|
}
|
|
2542
2936
|
for (const routerFilePath of routerFilePaths) {
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
routerSource
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
2553
|
-
if (imported) {
|
|
2554
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2555
|
-
if (!targetFile) continue;
|
|
2556
|
-
result = buildCombinedRouteMapWithSearch(
|
|
2557
|
-
targetFile,
|
|
2558
|
-
imported.exportedName
|
|
2559
|
-
);
|
|
2560
|
-
} else {
|
|
2561
|
-
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;
|
|
2562
2946
|
}
|
|
2563
2947
|
const routerBasename = pathBasename(routerFilePath).replace(
|
|
2564
2948
|
/\.(tsx?|jsx?)$/,
|
|
@@ -2784,6 +3168,73 @@ function createVersionPlugin() {
|
|
|
2784
3168
|
|
|
2785
3169
|
// src/vite/utils/shared-utils.ts
|
|
2786
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
|
|
2787
3238
|
var versionEsbuildPlugin = {
|
|
2788
3239
|
name: "@rangojs/router-version",
|
|
2789
3240
|
setup(build) {
|
|
@@ -2801,7 +3252,7 @@ var versionEsbuildPlugin = {
|
|
|
2801
3252
|
}
|
|
2802
3253
|
};
|
|
2803
3254
|
var sharedEsbuildOptions = {
|
|
2804
|
-
plugins: [versionEsbuildPlugin]
|
|
3255
|
+
plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
|
|
2805
3256
|
};
|
|
2806
3257
|
function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
2807
3258
|
const virtualModules = {};
|
|
@@ -2925,11 +3376,10 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2925
3376
|
if (normalizedId !== normalizedEntry) {
|
|
2926
3377
|
return null;
|
|
2927
3378
|
}
|
|
2928
|
-
const prepend = [
|
|
3379
|
+
const prepend = [
|
|
3380
|
+
`import "virtual:rsc-router/routes-manifest";`
|
|
3381
|
+
];
|
|
2929
3382
|
let newCode = code;
|
|
2930
|
-
if (!code.includes("virtual:rsc-router/routes-manifest")) {
|
|
2931
|
-
prepend.push(`import "virtual:rsc-router/routes-manifest";`);
|
|
2932
|
-
}
|
|
2933
3383
|
const needsVersion = code.includes("createRSCHandler") && !code.includes("@rangojs/router:version") && /createRSCHandler\s*\(\s*\{/.test(code);
|
|
2934
3384
|
if (needsVersion) {
|
|
2935
3385
|
prepend.push(`import { VERSION } from "@rangojs/router:version";`);
|
|
@@ -2938,8 +3388,21 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2938
3388
|
"createRSCHandler({\n version: VERSION,"
|
|
2939
3389
|
);
|
|
2940
3390
|
}
|
|
2941
|
-
|
|
2942
|
-
|
|
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");
|
|
2943
3406
|
return {
|
|
2944
3407
|
code: newCode,
|
|
2945
3408
|
map: null
|
|
@@ -2949,6 +3412,7 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2949
3412
|
}
|
|
2950
3413
|
|
|
2951
3414
|
// src/vite/plugins/cjs-to-esm.ts
|
|
3415
|
+
var debug7 = createRangoDebugger(NS.transform);
|
|
2952
3416
|
function createCjsToEsmPlugin() {
|
|
2953
3417
|
return {
|
|
2954
3418
|
name: "@rangojs/router:cjs-to-esm",
|
|
@@ -2958,6 +3422,7 @@ function createCjsToEsmPlugin() {
|
|
|
2958
3422
|
if (cleanId.includes("vendor/react-server-dom/client.browser.js") || cleanId.includes("vendor\\react-server-dom\\client.browser.js")) {
|
|
2959
3423
|
const isProd = process.env.NODE_ENV === "production";
|
|
2960
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);
|
|
2961
3426
|
return {
|
|
2962
3427
|
code: `export * from "${cjsFile}";`,
|
|
2963
3428
|
map: null
|
|
@@ -2993,6 +3458,7 @@ function createCjsToEsmPlugin() {
|
|
|
2993
3458
|
"export const $1 ="
|
|
2994
3459
|
);
|
|
2995
3460
|
transformed = license + "\n" + transformed;
|
|
3461
|
+
debug7?.("cjs-to-esm body rewrite %s", id);
|
|
2996
3462
|
return {
|
|
2997
3463
|
code: transformed,
|
|
2998
3464
|
map: null
|
|
@@ -3007,6 +3473,8 @@ function createCjsToEsmPlugin() {
|
|
|
3007
3473
|
import { createServer as createViteServer } from "vite";
|
|
3008
3474
|
import { resolve as resolve8 } from "node:path";
|
|
3009
3475
|
import { readFileSync as readFileSync6 } from "node:fs";
|
|
3476
|
+
import { createRequire as createRequire2, register } from "node:module";
|
|
3477
|
+
import { pathToFileURL } from "node:url";
|
|
3010
3478
|
|
|
3011
3479
|
// src/vite/plugins/virtual-stub-plugin.ts
|
|
3012
3480
|
function createVirtualStubPlugin() {
|
|
@@ -3032,9 +3500,117 @@ function createVirtualStubPlugin() {
|
|
|
3032
3500
|
};
|
|
3033
3501
|
}
|
|
3034
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
|
+
|
|
3035
3610
|
// src/vite/plugins/client-ref-hashing.ts
|
|
3036
3611
|
import { relative } from "node:path";
|
|
3037
3612
|
import { createHash as createHash2 } from "node:crypto";
|
|
3613
|
+
var debug8 = createRangoDebugger(NS.transform);
|
|
3038
3614
|
var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
|
|
3039
3615
|
var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
|
|
3040
3616
|
var FS_PREFIX = "/@fs/";
|
|
@@ -3073,6 +3649,7 @@ function transformClientRefs(code, projectRoot) {
|
|
|
3073
3649
|
return hasReplacement ? result : null;
|
|
3074
3650
|
}
|
|
3075
3651
|
function hashClientRefs(projectRoot) {
|
|
3652
|
+
const counter = createCounter(debug8, "hash-client-refs");
|
|
3076
3653
|
return {
|
|
3077
3654
|
name: "@rangojs/router:hash-client-refs",
|
|
3078
3655
|
// Run after the RSC plugin's transform (default enforce is normal)
|
|
@@ -3080,10 +3657,18 @@ function hashClientRefs(projectRoot) {
|
|
|
3080
3657
|
applyToEnvironment(env) {
|
|
3081
3658
|
return env.name === "rsc";
|
|
3082
3659
|
},
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
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
|
+
}
|
|
3087
3672
|
}
|
|
3088
3673
|
};
|
|
3089
3674
|
}
|
|
@@ -3190,8 +3775,8 @@ function createDiscoveryState(entryPath, opts) {
|
|
|
3190
3775
|
perRouterManifestDataMap: /* @__PURE__ */ new Map(),
|
|
3191
3776
|
prerenderManifestEntries: null,
|
|
3192
3777
|
staticManifestEntries: null,
|
|
3193
|
-
|
|
3194
|
-
|
|
3778
|
+
handlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3779
|
+
staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3195
3780
|
rscEntryFileName: null,
|
|
3196
3781
|
resolvedPrerenderModules: void 0,
|
|
3197
3782
|
resolvedStaticModules: void 0,
|
|
@@ -3211,6 +3796,12 @@ function markSelfGenWrite(state, filePath, content) {
|
|
|
3211
3796
|
state.selfWrittenGenFiles.set(filePath, { at: Date.now(), hash });
|
|
3212
3797
|
}
|
|
3213
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) {
|
|
3214
3805
|
const info = state.selfWrittenGenFiles.get(filePath);
|
|
3215
3806
|
if (!info) return false;
|
|
3216
3807
|
if (Date.now() - info.at > state.SELF_WRITE_WINDOW_MS) {
|
|
@@ -3221,7 +3812,7 @@ function consumeSelfGenWrite(state, filePath) {
|
|
|
3221
3812
|
const current = readFileSync3(filePath, "utf-8");
|
|
3222
3813
|
const currentHash = createHash3("sha256").update(current).digest("hex");
|
|
3223
3814
|
if (currentHash === info.hash) {
|
|
3224
|
-
state.selfWrittenGenFiles.delete(filePath);
|
|
3815
|
+
if (consume) state.selfWrittenGenFiles.delete(filePath);
|
|
3225
3816
|
return true;
|
|
3226
3817
|
}
|
|
3227
3818
|
return false;
|
|
@@ -3274,8 +3865,17 @@ function jsonParseExpression(value) {
|
|
|
3274
3865
|
}
|
|
3275
3866
|
|
|
3276
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
|
+
}
|
|
3277
3877
|
var FORBIDDEN_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
|
|
3278
|
-
function contextSet(variables, keyOrVar, value) {
|
|
3878
|
+
function contextSet(variables, keyOrVar, value, options) {
|
|
3279
3879
|
if (typeof keyOrVar === "string") {
|
|
3280
3880
|
if (FORBIDDEN_KEYS.has(keyOrVar)) {
|
|
3281
3881
|
throw new Error(
|
|
@@ -3283,8 +3883,14 @@ function contextSet(variables, keyOrVar, value) {
|
|
|
3283
3883
|
);
|
|
3284
3884
|
}
|
|
3285
3885
|
variables[keyOrVar] = value;
|
|
3886
|
+
if (options?.cache === false) {
|
|
3887
|
+
getNonCacheableKeys(variables).add(keyOrVar);
|
|
3888
|
+
}
|
|
3286
3889
|
} else {
|
|
3287
3890
|
variables[keyOrVar.key] = value;
|
|
3891
|
+
if (options?.cache === false) {
|
|
3892
|
+
getNonCacheableKeys(variables).add(keyOrVar.key);
|
|
3893
|
+
}
|
|
3288
3894
|
}
|
|
3289
3895
|
}
|
|
3290
3896
|
|
|
@@ -3307,13 +3913,31 @@ function encodePathParam(value) {
|
|
|
3307
3913
|
}
|
|
3308
3914
|
function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
3309
3915
|
let result = pattern;
|
|
3916
|
+
let hadOmittedOptional = false;
|
|
3310
3917
|
for (const [key, value] of Object.entries(params)) {
|
|
3311
3918
|
const escaped = escapeRegExp2(key);
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
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 += "/";
|
|
3317
3941
|
}
|
|
3318
3942
|
return result;
|
|
3319
3943
|
}
|
|
@@ -3410,8 +4034,14 @@ function copyStagedBuildAssets(projectRoot, fileNames) {
|
|
|
3410
4034
|
}
|
|
3411
4035
|
|
|
3412
4036
|
// src/vite/discovery/prerender-collection.ts
|
|
4037
|
+
var debug9 = createRangoDebugger(NS.prerender);
|
|
3413
4038
|
async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
3414
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
|
+
);
|
|
3415
4045
|
const entries = [];
|
|
3416
4046
|
const allRoutes = {};
|
|
3417
4047
|
for (const { manifest: m } of allManifests) {
|
|
@@ -3423,91 +4053,151 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3423
4053
|
if (!params) return pattern;
|
|
3424
4054
|
return substituteRouteParams(pattern, params);
|
|
3425
4055
|
};
|
|
4056
|
+
let resolvedRoutes = 0;
|
|
4057
|
+
let totalDynamic = 0;
|
|
3426
4058
|
for (const { manifest } of allManifests) {
|
|
3427
4059
|
if (!manifest.prerenderRoutes) continue;
|
|
3428
|
-
const defs = manifest._prerenderDefs || {};
|
|
3429
4060
|
for (const routeName of manifest.prerenderRoutes) {
|
|
3430
4061
|
const pattern = manifest.routeManifest[routeName];
|
|
3431
|
-
if (
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
|
|
3435
|
-
|
|
3436
|
-
|
|
3437
|
-
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
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
|
+
);
|
|
3466
4110
|
}
|
|
3467
|
-
}
|
|
3468
|
-
|
|
3469
|
-
|
|
4111
|
+
};
|
|
4112
|
+
const paramsList = await def.getParams(getParamsCtx);
|
|
4113
|
+
debug9?.(
|
|
4114
|
+
"getParams %s -> %d params (%sms)",
|
|
3470
4115
|
routeName,
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
isPassthroughRoute
|
|
3474
|
-
});
|
|
3475
|
-
}
|
|
3476
|
-
} catch (err) {
|
|
3477
|
-
if (err.name === "Skip") {
|
|
3478
|
-
console.log(
|
|
3479
|
-
`[rsc-router] SKIP route "${routeName}" - ${err.message}`
|
|
4116
|
+
paramsList.length,
|
|
4117
|
+
(performance.now() - getParamsStart).toFixed(1)
|
|
3480
4118
|
);
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
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}`
|
|
3488
4163
|
);
|
|
3489
|
-
|
|
4164
|
+
notifyOnError(registry, err, "prerender", routeName);
|
|
4165
|
+
throw err;
|
|
3490
4166
|
}
|
|
3491
|
-
|
|
3492
|
-
|
|
4167
|
+
} else {
|
|
4168
|
+
console.warn(
|
|
4169
|
+
`[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
|
|
3493
4170
|
);
|
|
3494
|
-
notifyOnError(registry, err, "prerender", routeName);
|
|
3495
|
-
throw err;
|
|
3496
4171
|
}
|
|
3497
|
-
} else {
|
|
3498
|
-
console.warn(
|
|
3499
|
-
`[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
|
|
3500
|
-
);
|
|
3501
4172
|
}
|
|
3502
4173
|
}
|
|
3503
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;
|
|
3504
4190
|
}
|
|
3505
|
-
if (entries.length === 0) return;
|
|
3506
4191
|
const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
|
|
3507
4192
|
const concurrencyNote = maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
|
|
3508
4193
|
console.log(
|
|
3509
4194
|
`[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
|
|
3510
4195
|
);
|
|
4196
|
+
debug9?.(
|
|
4197
|
+
"prerender loop: %d entries, max concurrency %d",
|
|
4198
|
+
entries.length,
|
|
4199
|
+
maxConcurrency
|
|
4200
|
+
);
|
|
3511
4201
|
const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
|
|
3512
4202
|
const manifestEntries = {};
|
|
3513
4203
|
let doneCount = 0;
|
|
@@ -3527,7 +4217,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3527
4217
|
entry.urlPath,
|
|
3528
4218
|
{},
|
|
3529
4219
|
entry.buildVars,
|
|
3530
|
-
entry.isPassthroughRoute
|
|
4220
|
+
entry.isPassthroughRoute,
|
|
4221
|
+
state.resolvedBuildEnv
|
|
3531
4222
|
);
|
|
3532
4223
|
if (!result) continue;
|
|
3533
4224
|
if (result.passthrough) {
|
|
@@ -3613,10 +4304,22 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3613
4304
|
console.log(
|
|
3614
4305
|
`[rsc-router] Pre-render complete: ${parts.join(", ")} (${totalElapsed}ms total)`
|
|
3615
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
|
+
);
|
|
3616
4314
|
}
|
|
3617
4315
|
async function renderStaticHandlers(state, rscEnv, registry) {
|
|
3618
4316
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
|
|
3619
4317
|
return;
|
|
4318
|
+
const overallStart = debug9 ? performance.now() : 0;
|
|
4319
|
+
debug9?.(
|
|
4320
|
+
"renderStaticHandlers: start (%d static module(s))",
|
|
4321
|
+
state.resolvedStaticModules.size
|
|
4322
|
+
);
|
|
3620
4323
|
const manifestEntries = {};
|
|
3621
4324
|
let staticDone = 0;
|
|
3622
4325
|
let staticSkip = 0;
|
|
@@ -3651,7 +4354,9 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3651
4354
|
const result = await routerInstance.renderStaticSegment(
|
|
3652
4355
|
def.handler,
|
|
3653
4356
|
def.$$id,
|
|
3654
|
-
def.$$routePrefix
|
|
4357
|
+
def.$$routePrefix,
|
|
4358
|
+
state.resolvedBuildEnv,
|
|
4359
|
+
!state.isBuildMode
|
|
3655
4360
|
);
|
|
3656
4361
|
if (result) {
|
|
3657
4362
|
const hasHandles = Object.keys(result.handles).length > 0;
|
|
@@ -3704,13 +4409,29 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3704
4409
|
console.log(
|
|
3705
4410
|
`[rsc-router] Static render complete: ${staticParts.join(", ")} (${totalStaticElapsed}ms total)`
|
|
3706
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
|
+
);
|
|
3707
4419
|
}
|
|
3708
4420
|
|
|
3709
4421
|
// src/vite/discovery/discover-routers.ts
|
|
4422
|
+
var debug10 = createRangoDebugger(NS.discovery);
|
|
3710
4423
|
async function discoverRouters(state, rscEnv) {
|
|
3711
4424
|
if (!state.resolvedEntryPath) return;
|
|
3712
|
-
await
|
|
3713
|
-
|
|
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
|
+
);
|
|
3714
4435
|
let registry = serverMod.RouterRegistry;
|
|
3715
4436
|
if (!registry || registry.size === 0) {
|
|
3716
4437
|
try {
|
|
@@ -3752,8 +4473,13 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3752
4473
|
);
|
|
3753
4474
|
}
|
|
3754
4475
|
}
|
|
3755
|
-
const buildMod = await
|
|
4476
|
+
const buildMod = await timed(
|
|
4477
|
+
debug10,
|
|
4478
|
+
"inner: import @rangojs/router/build",
|
|
4479
|
+
() => rscEnv.runner.import("@rangojs/router/build")
|
|
4480
|
+
);
|
|
3756
4481
|
const generateManifestFull = buildMod.generateManifestFull;
|
|
4482
|
+
debug10?.("inner: found %d router(s) in registry", registry.size);
|
|
3757
4483
|
const nestedRouterConflict = findNestedRouterConflict(
|
|
3758
4484
|
[...registry.values()].map((router) => router.__sourceFile).filter(
|
|
3759
4485
|
(sourceFile) => typeof sourceFile === "string"
|
|
@@ -3772,11 +4498,16 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3772
4498
|
let mergedRouteTrailingSlash = {};
|
|
3773
4499
|
let routerMountIndex = 0;
|
|
3774
4500
|
const allManifests = [];
|
|
4501
|
+
const manifestGenStart = debug10 ? performance.now() : 0;
|
|
3775
4502
|
for (const [id, router] of registry) {
|
|
3776
4503
|
if (!router.urlpatterns || !generateManifestFull) {
|
|
3777
4504
|
continue;
|
|
3778
4505
|
}
|
|
3779
|
-
const manifest = generateManifestFull(
|
|
4506
|
+
const manifest = generateManifestFull(
|
|
4507
|
+
router.urlpatterns,
|
|
4508
|
+
routerMountIndex,
|
|
4509
|
+
router.__basename ? { urlPrefix: router.__basename } : void 0
|
|
4510
|
+
);
|
|
3780
4511
|
routerMountIndex++;
|
|
3781
4512
|
allManifests.push({ id, manifest });
|
|
3782
4513
|
const routeCount = Object.keys(manifest.routeManifest).length;
|
|
@@ -3842,7 +4573,13 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3842
4573
|
);
|
|
3843
4574
|
}
|
|
3844
4575
|
}
|
|
4576
|
+
debug10?.(
|
|
4577
|
+
"inner: generated manifests for %d router(s) (%sms)",
|
|
4578
|
+
allManifests.length,
|
|
4579
|
+
(performance.now() - manifestGenStart).toFixed(1)
|
|
4580
|
+
);
|
|
3845
4581
|
let newMergedRouteTrie = null;
|
|
4582
|
+
const trieStart = debug10 ? performance.now() : 0;
|
|
3846
4583
|
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
3847
4584
|
const buildRouteTrie = buildMod.buildRouteTrie;
|
|
3848
4585
|
if (buildRouteTrie && mergedRouteAncestry) {
|
|
@@ -3905,6 +4642,10 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3905
4642
|
}
|
|
3906
4643
|
}
|
|
3907
4644
|
}
|
|
4645
|
+
debug10?.(
|
|
4646
|
+
"inner: trie build done (%sms)",
|
|
4647
|
+
(performance.now() - trieStart).toFixed(1)
|
|
4648
|
+
);
|
|
3908
4649
|
state.mergedRouteManifest = newMergedRouteManifest;
|
|
3909
4650
|
state.mergedPrecomputedEntries = newMergedPrecomputedEntries;
|
|
3910
4651
|
state.perRouterManifests = newPerRouterManifests;
|
|
@@ -4225,48 +4966,45 @@ function postprocessBundle(state) {
|
|
|
4225
4966
|
);
|
|
4226
4967
|
const evictionTargets = [
|
|
4227
4968
|
{
|
|
4228
|
-
|
|
4969
|
+
infos: state.handlerChunkInfoMap.values(),
|
|
4229
4970
|
fnName: "Prerender",
|
|
4230
4971
|
brand: "prerenderHandler",
|
|
4231
4972
|
label: "handler code from RSC bundle"
|
|
4232
4973
|
},
|
|
4233
4974
|
{
|
|
4234
|
-
|
|
4975
|
+
infos: state.staticHandlerChunkInfoMap.values(),
|
|
4235
4976
|
fnName: "Static",
|
|
4236
4977
|
brand: "staticHandler",
|
|
4237
4978
|
label: "static handler code"
|
|
4238
4979
|
}
|
|
4239
4980
|
];
|
|
4240
4981
|
for (const target of evictionTargets) {
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
|
|
4244
|
-
|
|
4245
|
-
|
|
4246
|
-
|
|
4247
|
-
|
|
4248
|
-
|
|
4249
|
-
|
|
4250
|
-
|
|
4251
|
-
|
|
4252
|
-
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
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}`
|
|
4260
5002
|
);
|
|
4261
5003
|
}
|
|
4262
|
-
} catch (replaceErr) {
|
|
4263
|
-
console.warn(
|
|
4264
|
-
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4265
|
-
);
|
|
4266
5004
|
}
|
|
4267
5005
|
}
|
|
4268
|
-
state.
|
|
4269
|
-
state.
|
|
5006
|
+
state.handlerChunkInfoMap.clear();
|
|
5007
|
+
state.staticHandlerChunkInfoMap.clear();
|
|
4270
5008
|
if (hasPrerenderData && existsSync6(rscEntryPath)) {
|
|
4271
5009
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4272
5010
|
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
@@ -4309,7 +5047,7 @@ function postprocessBundle(state) {
|
|
|
4309
5047
|
}
|
|
4310
5048
|
if (hasStaticData && existsSync6(rscEntryPath)) {
|
|
4311
5049
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4312
|
-
if (!rscCode.includes("
|
|
5050
|
+
if (!rscCode.includes("__static-manifest.js")) {
|
|
4313
5051
|
try {
|
|
4314
5052
|
const manifestEntries = [];
|
|
4315
5053
|
let totalBytes = copyStagedBuildAssets(
|
|
@@ -4347,8 +5085,101 @@ function postprocessBundle(state) {
|
|
|
4347
5085
|
}
|
|
4348
5086
|
}
|
|
4349
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
|
+
|
|
4350
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
|
+
}
|
|
4351
5181
|
async function createTempRscServer(state, options = {}) {
|
|
5182
|
+
ensureCloudflareProtocolLoaderRegistered();
|
|
4352
5183
|
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
4353
5184
|
return createViteServer({
|
|
4354
5185
|
root: state.projectRoot,
|
|
@@ -4371,6 +5202,7 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4371
5202
|
...options.forceBuild ? [hashClientRefs(state.projectRoot)] : [],
|
|
4372
5203
|
createVersionPlugin(),
|
|
4373
5204
|
createVirtualStubPlugin(),
|
|
5205
|
+
createCloudflareProtocolStubPlugin(),
|
|
4374
5206
|
// Dev prerender must use dev-mode IDs (path-based) to match the workerd
|
|
4375
5207
|
// runtime. forceBuild produces hashed IDs for production bundle consistency.
|
|
4376
5208
|
exposeInternalIds(options.forceBuild ? { forceBuild: true } : void 0),
|
|
@@ -4378,8 +5210,69 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4378
5210
|
]
|
|
4379
5211
|
});
|
|
4380
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
|
+
}
|
|
4381
5272
|
function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
4382
5273
|
const s = createDiscoveryState(entryPath, opts);
|
|
5274
|
+
let viteCommand = "build";
|
|
5275
|
+
let viteMode = "production";
|
|
4383
5276
|
return {
|
|
4384
5277
|
name: "@rangojs/router:discovery",
|
|
4385
5278
|
config() {
|
|
@@ -4388,31 +5281,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4388
5281
|
__RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
|
|
4389
5282
|
}
|
|
4390
5283
|
};
|
|
4391
|
-
if (opts?.enableBuildPrerender) {
|
|
4392
|
-
config.environments = {
|
|
4393
|
-
rsc: {
|
|
4394
|
-
build: {
|
|
4395
|
-
rollupOptions: {
|
|
4396
|
-
output: {
|
|
4397
|
-
manualChunks(id) {
|
|
4398
|
-
if (s.resolvedPrerenderModules?.has(id)) {
|
|
4399
|
-
return "__prerender-handlers";
|
|
4400
|
-
}
|
|
4401
|
-
if (s.resolvedStaticModules?.has(id)) {
|
|
4402
|
-
return "__static-handlers";
|
|
4403
|
-
}
|
|
4404
|
-
}
|
|
4405
|
-
}
|
|
4406
|
-
}
|
|
4407
|
-
}
|
|
4408
|
-
}
|
|
4409
|
-
};
|
|
4410
|
-
}
|
|
4411
5284
|
return config;
|
|
4412
5285
|
},
|
|
4413
5286
|
configResolved(config) {
|
|
4414
5287
|
s.projectRoot = config.root;
|
|
4415
5288
|
s.isBuildMode = config.command === "build";
|
|
5289
|
+
viteCommand = config.command;
|
|
5290
|
+
viteMode = config.mode;
|
|
4416
5291
|
s.userResolveAlias = config.resolve.alias;
|
|
4417
5292
|
if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
|
|
4418
5293
|
s.resolvedEntryPath = opts.routerPathRef.path;
|
|
@@ -4448,6 +5323,9 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4448
5323
|
const discoveryPromise = new Promise((resolve10) => {
|
|
4449
5324
|
resolveDiscovery = resolve10;
|
|
4450
5325
|
});
|
|
5326
|
+
const gate = createDiscoveryGate(s, debugDiscovery);
|
|
5327
|
+
const beginDiscoveryGate = gate.beginGate;
|
|
5328
|
+
const resolveDiscoveryGate = gate.resolveGate;
|
|
4451
5329
|
const getDevServerOrigin = () => server.resolvedUrls?.local?.[0]?.replace(/\/$/, "") || `http://localhost:${server.config.server.port || 5173}`;
|
|
4452
5330
|
let prerenderTempServer = null;
|
|
4453
5331
|
let prerenderNodeRegistry = null;
|
|
@@ -4457,40 +5335,183 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4457
5335
|
});
|
|
4458
5336
|
prerenderTempServer = null;
|
|
4459
5337
|
}
|
|
5338
|
+
releaseBuildEnv(s).catch(() => {
|
|
5339
|
+
});
|
|
4460
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
|
+
}
|
|
4461
5372
|
async function getOrCreateTempServer() {
|
|
4462
|
-
if (
|
|
4463
|
-
|
|
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
|
+
}
|
|
4464
5407
|
}
|
|
5408
|
+
debugDiscovery?.(
|
|
5409
|
+
"getOrCreateTempServer: creating new temp server, entry=%s",
|
|
5410
|
+
s.resolvedEntryPath ?? "(unset)"
|
|
5411
|
+
);
|
|
4465
5412
|
try {
|
|
4466
5413
|
prerenderTempServer = await createTempRscServer(s, {
|
|
4467
5414
|
cacheDir: "node_modules/.vite_prerender"
|
|
4468
5415
|
});
|
|
4469
5416
|
const tempRscEnv = prerenderTempServer.environments?.rsc;
|
|
4470
5417
|
if (tempRscEnv?.runner) {
|
|
4471
|
-
await tempRscEnv
|
|
4472
|
-
const serverMod = await tempRscEnv.runner.import(
|
|
4473
|
-
"@rangojs/router/server"
|
|
4474
|
-
);
|
|
4475
|
-
prerenderNodeRegistry = serverMod.RouterRegistry;
|
|
5418
|
+
await importEntryAndRegistry(tempRscEnv);
|
|
4476
5419
|
return tempRscEnv;
|
|
4477
5420
|
}
|
|
5421
|
+
debugDiscovery?.(
|
|
5422
|
+
"getOrCreateTempServer: tempRscEnv.runner unavailable"
|
|
5423
|
+
);
|
|
4478
5424
|
} catch (err) {
|
|
5425
|
+
debugDiscovery?.(
|
|
5426
|
+
"getOrCreateTempServer: FAILED message=%s",
|
|
5427
|
+
err.message
|
|
5428
|
+
);
|
|
4479
5429
|
console.warn(
|
|
4480
5430
|
`[rsc-router] Failed to create temp runner: ${err.message}`
|
|
4481
5431
|
);
|
|
4482
5432
|
}
|
|
4483
5433
|
return null;
|
|
4484
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
|
+
}
|
|
4485
5484
|
const discover = async () => {
|
|
5485
|
+
const discoverStart = performance.now();
|
|
4486
5486
|
const rscEnv = server.environments?.rsc;
|
|
4487
5487
|
if (!rscEnv?.runner) {
|
|
5488
|
+
debugDiscovery?.(
|
|
5489
|
+
"dev: cloudflare path start, __rscRouterDiscoveryActive=%s",
|
|
5490
|
+
globalThis.__rscRouterDiscoveryActive ?? false
|
|
5491
|
+
);
|
|
4488
5492
|
s.devServerOrigin = getDevServerOrigin();
|
|
4489
5493
|
try {
|
|
4490
|
-
|
|
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
|
+
);
|
|
4491
5504
|
if (tempRscEnv) {
|
|
4492
|
-
await
|
|
4493
|
-
|
|
5505
|
+
await timed(
|
|
5506
|
+
debugDiscovery,
|
|
5507
|
+
"discoverRouters (cloudflare)",
|
|
5508
|
+
() => discoverRouters(s, tempRscEnv)
|
|
5509
|
+
);
|
|
5510
|
+
timedSync(
|
|
5511
|
+
debugDiscovery,
|
|
5512
|
+
"writeRouteTypesFiles",
|
|
5513
|
+
() => writeRouteTypesFiles(s)
|
|
5514
|
+
);
|
|
4494
5515
|
}
|
|
4495
5516
|
} catch (err) {
|
|
4496
5517
|
console.warn(
|
|
@@ -4498,32 +5519,62 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4498
5519
|
${err.stack}`
|
|
4499
5520
|
);
|
|
4500
5521
|
}
|
|
5522
|
+
debugDiscovery?.(
|
|
5523
|
+
"dev discovery done (%sms)",
|
|
5524
|
+
(performance.now() - discoverStart).toFixed(1)
|
|
5525
|
+
);
|
|
4501
5526
|
resolveDiscovery();
|
|
4502
5527
|
return;
|
|
4503
5528
|
}
|
|
4504
5529
|
try {
|
|
4505
|
-
|
|
4506
|
-
|
|
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")
|
|
4507
5540
|
);
|
|
4508
5541
|
if (serverMod?.setManifestReadyPromise) {
|
|
4509
5542
|
serverMod.setManifestReadyPromise(discoveryPromise);
|
|
4510
5543
|
}
|
|
4511
|
-
await
|
|
5544
|
+
await timed(
|
|
5545
|
+
debugDiscovery,
|
|
5546
|
+
"discoverRouters",
|
|
5547
|
+
() => discoverRouters(s, rscEnv)
|
|
5548
|
+
);
|
|
4512
5549
|
s.devServerOrigin = getDevServerOrigin();
|
|
4513
|
-
|
|
4514
|
-
|
|
5550
|
+
timedSync(
|
|
5551
|
+
debugDiscovery,
|
|
5552
|
+
"writeRouteTypesFiles",
|
|
5553
|
+
() => writeRouteTypesFiles(s)
|
|
5554
|
+
);
|
|
5555
|
+
await timed(
|
|
5556
|
+
debugDiscovery,
|
|
5557
|
+
"propagateDiscoveryState",
|
|
5558
|
+
() => propagateDiscoveryState(rscEnv)
|
|
5559
|
+
);
|
|
4515
5560
|
} catch (err) {
|
|
4516
5561
|
console.warn(
|
|
4517
5562
|
`[rsc-router] Router discovery failed: ${err.message}
|
|
4518
5563
|
${err.stack}`
|
|
4519
5564
|
);
|
|
4520
5565
|
} finally {
|
|
5566
|
+
debugDiscovery?.(
|
|
5567
|
+
"dev discovery done (%sms)",
|
|
5568
|
+
(performance.now() - discoverStart).toFixed(1)
|
|
5569
|
+
);
|
|
4521
5570
|
resolveDiscovery();
|
|
4522
5571
|
}
|
|
4523
5572
|
};
|
|
4524
|
-
|
|
4525
|
-
|
|
4526
|
-
|
|
5573
|
+
beginDiscoveryGate();
|
|
5574
|
+
setTimeout(
|
|
5575
|
+
() => discover().then(resolveDiscoveryGate, resolveDiscoveryGate),
|
|
5576
|
+
0
|
|
5577
|
+
);
|
|
4527
5578
|
let mainRegistry = null;
|
|
4528
5579
|
const propagateDiscoveryState = async (rscEnv) => {
|
|
4529
5580
|
const serverMod = await rscEnv.runner.import("@rangojs/router/server");
|
|
@@ -4558,15 +5609,46 @@ ${err.stack}`
|
|
|
4558
5609
|
}
|
|
4559
5610
|
};
|
|
4560
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
|
+
};
|
|
4561
5622
|
if (s.discoveryDone) await s.discoveryDone;
|
|
4562
5623
|
const url = new URL(req.url || "/", "http://localhost");
|
|
4563
5624
|
const pathname = url.searchParams.get("pathname");
|
|
4564
5625
|
if (!pathname) {
|
|
4565
5626
|
res.statusCode = 400;
|
|
4566
5627
|
res.end("Missing pathname");
|
|
5628
|
+
logResult(400, "missing pathname");
|
|
4567
5629
|
return;
|
|
4568
5630
|
}
|
|
4569
|
-
|
|
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
|
+
}
|
|
4570
5652
|
if (!registry) {
|
|
4571
5653
|
if (!prerenderNodeRegistry) {
|
|
4572
5654
|
await getOrCreateTempServer();
|
|
@@ -4576,6 +5658,7 @@ ${err.stack}`
|
|
|
4576
5658
|
if (!registry || registry.size === 0) {
|
|
4577
5659
|
res.statusCode = 503;
|
|
4578
5660
|
res.end("Prerender runner not available");
|
|
5661
|
+
logResult(503, "no registry");
|
|
4579
5662
|
return;
|
|
4580
5663
|
}
|
|
4581
5664
|
const wantIntercept = url.searchParams.get("intercept") === "1";
|
|
@@ -4588,7 +5671,10 @@ ${err.stack}`
|
|
|
4588
5671
|
pathname,
|
|
4589
5672
|
{},
|
|
4590
5673
|
void 0,
|
|
4591
|
-
wantPassthrough
|
|
5674
|
+
wantPassthrough,
|
|
5675
|
+
s.resolvedBuildEnv,
|
|
5676
|
+
true
|
|
5677
|
+
// devMode: check getParams for passthrough routes
|
|
4592
5678
|
);
|
|
4593
5679
|
if (!result) continue;
|
|
4594
5680
|
if (result.passthrough) continue;
|
|
@@ -4607,6 +5693,7 @@ ${err.stack}`
|
|
|
4607
5693
|
payload = { segments: result.segments, handles: result.handles };
|
|
4608
5694
|
}
|
|
4609
5695
|
res.end(JSON.stringify(payload));
|
|
5696
|
+
logResult(200, `match ${result.routeName}`);
|
|
4610
5697
|
return;
|
|
4611
5698
|
} catch (err) {
|
|
4612
5699
|
console.warn(
|
|
@@ -4616,6 +5703,7 @@ ${err.stack}`
|
|
|
4616
5703
|
}
|
|
4617
5704
|
res.statusCode = 404;
|
|
4618
5705
|
res.end("No prerender match");
|
|
5706
|
+
logResult(404, "no match");
|
|
4619
5707
|
});
|
|
4620
5708
|
if (opts?.staticRouteTypesGeneration !== false) {
|
|
4621
5709
|
const isGeneratedRouteFile = (filePath) => filePath.endsWith(".gen.ts") && (filePath.includes("named-routes.gen.ts") || filePath.includes("urls.gen.ts"));
|
|
@@ -4635,42 +5723,96 @@ ${err.stack}`
|
|
|
4635
5723
|
return true;
|
|
4636
5724
|
};
|
|
4637
5725
|
let routeChangeTimer;
|
|
4638
|
-
let runtimeRediscoveryInProgress = false;
|
|
4639
5726
|
const refreshRuntimeDiscovery = async () => {
|
|
4640
5727
|
const rscEnv = server.environments?.rsc;
|
|
4641
|
-
|
|
4642
|
-
|
|
4643
|
-
|
|
4644
|
-
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
-
|
|
4648
|
-
|
|
4649
|
-
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
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
|
+
});
|
|
4654
5782
|
};
|
|
4655
5783
|
const scheduleRouteRegeneration = () => {
|
|
4656
5784
|
clearTimeout(routeChangeTimer);
|
|
4657
5785
|
routeChangeTimer = setTimeout(() => {
|
|
4658
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;
|
|
4659
5790
|
try {
|
|
4660
|
-
|
|
4661
|
-
|
|
4662
|
-
|
|
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
|
+
}
|
|
4663
5800
|
}
|
|
4664
5801
|
} catch (err) {
|
|
4665
5802
|
console.error(
|
|
4666
5803
|
`[rsc-router] Route regeneration error: ${err.message}`
|
|
4667
5804
|
);
|
|
4668
5805
|
}
|
|
5806
|
+
debugDiscovery?.(
|
|
5807
|
+
"watcher: regenerated gen files (%sms)",
|
|
5808
|
+
(performance.now() - regenStart).toFixed(1)
|
|
5809
|
+
);
|
|
4669
5810
|
if (s.perRouterManifests.length > 0) {
|
|
4670
5811
|
refreshRuntimeDiscovery().catch((err) => {
|
|
4671
5812
|
console.warn(
|
|
4672
5813
|
`[rsc-router] Runtime re-discovery error: ${err.message}`
|
|
4673
5814
|
);
|
|
5815
|
+
resolveDiscoveryGate();
|
|
4674
5816
|
});
|
|
4675
5817
|
}
|
|
4676
5818
|
}, 100);
|
|
@@ -4688,6 +5830,12 @@ ${err.stack}`
|
|
|
4688
5830
|
const hasUrls = source.includes("urls(");
|
|
4689
5831
|
const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
|
|
4690
5832
|
if (!hasUrls && !hasCreateRouter) return;
|
|
5833
|
+
debugDiscovery?.(
|
|
5834
|
+
"watcher: %s matches (urls=%s, router=%s)",
|
|
5835
|
+
filePath,
|
|
5836
|
+
hasUrls,
|
|
5837
|
+
hasCreateRouter
|
|
5838
|
+
);
|
|
4691
5839
|
if (hasCreateRouter) {
|
|
4692
5840
|
const nestedRouterConflict = findNestedRouterConflict([
|
|
4693
5841
|
...s.cachedRouterFiles ?? [],
|
|
@@ -4701,6 +5849,9 @@ ${err.stack}`
|
|
|
4701
5849
|
}
|
|
4702
5850
|
s.cachedRouterFiles = void 0;
|
|
4703
5851
|
}
|
|
5852
|
+
if (s.perRouterManifests.length > 0) {
|
|
5853
|
+
gate.noteRouteEvent();
|
|
5854
|
+
}
|
|
4704
5855
|
scheduleRouteRegeneration();
|
|
4705
5856
|
} catch {
|
|
4706
5857
|
}
|
|
@@ -4720,14 +5871,31 @@ ${err.stack}`
|
|
|
4720
5871
|
// The manifest data is stored for the virtual module's load hook.
|
|
4721
5872
|
async buildStart() {
|
|
4722
5873
|
if (!s.isBuildMode) return;
|
|
4723
|
-
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 ?? "?");
|
|
4724
5883
|
resetStagedBuildAssets(s.projectRoot);
|
|
4725
5884
|
s.prerenderManifestEntries = null;
|
|
4726
5885
|
s.staticManifestEntries = null;
|
|
5886
|
+
await timed(
|
|
5887
|
+
debugDiscovery,
|
|
5888
|
+
"build acquireBuildEnv",
|
|
5889
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5890
|
+
);
|
|
4727
5891
|
let tempServer = null;
|
|
4728
5892
|
globalThis.__rscRouterDiscoveryActive = true;
|
|
4729
5893
|
try {
|
|
4730
|
-
tempServer = await
|
|
5894
|
+
tempServer = await timed(
|
|
5895
|
+
debugDiscovery,
|
|
5896
|
+
"build createTempRscServer",
|
|
5897
|
+
() => createTempRscServer(s, { forceBuild: true })
|
|
5898
|
+
);
|
|
4731
5899
|
const rscEnv = tempServer.environments?.rsc;
|
|
4732
5900
|
if (!rscEnv?.runner) {
|
|
4733
5901
|
console.warn(
|
|
@@ -4741,8 +5909,16 @@ ${err.stack}`
|
|
|
4741
5909
|
if (tempIdsPlugin?.api?.staticHandlerModules) {
|
|
4742
5910
|
s.resolvedStaticModules = tempIdsPlugin.api.staticHandlerModules;
|
|
4743
5911
|
}
|
|
4744
|
-
await
|
|
4745
|
-
|
|
5912
|
+
await timed(
|
|
5913
|
+
debugDiscovery,
|
|
5914
|
+
"build discoverRouters",
|
|
5915
|
+
() => discoverRouters(s, rscEnv)
|
|
5916
|
+
);
|
|
5917
|
+
timedSync(
|
|
5918
|
+
debugDiscovery,
|
|
5919
|
+
"build writeRouteTypesFiles",
|
|
5920
|
+
() => writeRouteTypesFiles(s)
|
|
5921
|
+
);
|
|
4746
5922
|
} catch (err) {
|
|
4747
5923
|
const sourceFile = err.stack?.split("\n").find(
|
|
4748
5924
|
(line) => line.includes(s.projectRoot) && !line.includes("node_modules")
|
|
@@ -4761,8 +5937,45 @@ ${details}`
|
|
|
4761
5937
|
} finally {
|
|
4762
5938
|
delete globalThis.__rscRouterDiscoveryActive;
|
|
4763
5939
|
if (tempServer) {
|
|
4764
|
-
await
|
|
5940
|
+
await timed(
|
|
5941
|
+
debugDiscovery,
|
|
5942
|
+
"build tempServer.close",
|
|
5943
|
+
() => tempServer.close()
|
|
5944
|
+
);
|
|
4765
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 [];
|
|
4766
5979
|
}
|
|
4767
5980
|
},
|
|
4768
5981
|
// Virtual module: provides the pre-generated route manifest as a JS module
|
|
@@ -4779,17 +5992,36 @@ ${details}`
|
|
|
4779
5992
|
async load(id) {
|
|
4780
5993
|
if (id === "\0" + VIRTUAL_ROUTES_MANIFEST_ID) {
|
|
4781
5994
|
if (s.discoveryDone) {
|
|
4782
|
-
await
|
|
5995
|
+
await timed(
|
|
5996
|
+
debugRoutes,
|
|
5997
|
+
"await discoveryDone (manifest)",
|
|
5998
|
+
() => s.discoveryDone
|
|
5999
|
+
);
|
|
4783
6000
|
}
|
|
4784
|
-
|
|
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;
|
|
4785
6008
|
}
|
|
4786
6009
|
const perRouterPrefix = "\0" + VIRTUAL_ROUTES_MANIFEST_ID + "/";
|
|
4787
6010
|
if (id.startsWith(perRouterPrefix)) {
|
|
4788
6011
|
if (s.discoveryDone) {
|
|
4789
|
-
await
|
|
6012
|
+
await timed(
|
|
6013
|
+
debugRoutes,
|
|
6014
|
+
"await discoveryDone (per-router)",
|
|
6015
|
+
() => s.discoveryDone
|
|
6016
|
+
);
|
|
4790
6017
|
}
|
|
4791
6018
|
const routerId = id.slice(perRouterPrefix.length);
|
|
4792
|
-
|
|
6019
|
+
const code = await timed(
|
|
6020
|
+
debugRoutes,
|
|
6021
|
+
`generatePerRouterModule ${routerId}`,
|
|
6022
|
+
() => generatePerRouterModule(s, routerId)
|
|
6023
|
+
);
|
|
6024
|
+
return code;
|
|
4793
6025
|
}
|
|
4794
6026
|
return null;
|
|
4795
6027
|
},
|
|
@@ -4797,28 +6029,44 @@ ${details}`
|
|
|
4797
6029
|
// Used by closeBundle for handler code eviction and prerender data injection.
|
|
4798
6030
|
generateBundle(_options, bundle) {
|
|
4799
6031
|
if (this.environment?.name !== "rsc") return;
|
|
6032
|
+
const genStart = debugBuild ? performance.now() : 0;
|
|
4800
6033
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4801
6034
|
if (chunk.type === "chunk" && chunk.isEntry) {
|
|
4802
6035
|
s.rscEntryFileName = fileName;
|
|
4803
6036
|
break;
|
|
4804
6037
|
}
|
|
4805
6038
|
}
|
|
4806
|
-
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
|
+
);
|
|
4807
6044
|
return;
|
|
6045
|
+
}
|
|
6046
|
+
s.handlerChunkInfoMap.clear();
|
|
6047
|
+
s.staticHandlerChunkInfoMap.clear();
|
|
4808
6048
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4809
6049
|
if (chunk.type !== "chunk") continue;
|
|
4810
|
-
if (
|
|
6050
|
+
if (s.resolvedPrerenderModules?.size) {
|
|
4811
6051
|
const handlers = extractHandlerExportsFromChunk(
|
|
4812
6052
|
chunk.code,
|
|
4813
6053
|
s.resolvedPrerenderModules,
|
|
4814
6054
|
"Prerender",
|
|
4815
|
-
|
|
6055
|
+
false
|
|
4816
6056
|
);
|
|
4817
6057
|
if (handlers.length > 0) {
|
|
4818
|
-
|
|
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
|
+
}
|
|
4819
6067
|
}
|
|
4820
6068
|
}
|
|
4821
|
-
if (
|
|
6069
|
+
if (s.resolvedStaticModules?.size) {
|
|
4822
6070
|
const handlers = extractHandlerExportsFromChunk(
|
|
4823
6071
|
chunk.code,
|
|
4824
6072
|
s.resolvedStaticModules,
|
|
@@ -4826,10 +6074,25 @@ ${details}`
|
|
|
4826
6074
|
false
|
|
4827
6075
|
);
|
|
4828
6076
|
if (handlers.length > 0) {
|
|
4829
|
-
|
|
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
|
+
}
|
|
4830
6086
|
}
|
|
4831
6087
|
}
|
|
4832
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
|
+
);
|
|
4833
6096
|
},
|
|
4834
6097
|
// Build-time pre-rendering: evict handler code and inject collected prerender data.
|
|
4835
6098
|
// Collection now happens in-process during discoverRouters() via RSC runner.
|
|
@@ -4840,20 +6103,41 @@ ${details}`
|
|
|
4840
6103
|
async handler() {
|
|
4841
6104
|
if (!s.isBuildMode) return;
|
|
4842
6105
|
if (this.environment && this.environment.name !== "rsc") return;
|
|
4843
|
-
|
|
6106
|
+
timedSync(
|
|
6107
|
+
debugBuild,
|
|
6108
|
+
"closeBundle postprocessBundle",
|
|
6109
|
+
() => postprocessBundle(s)
|
|
6110
|
+
);
|
|
4844
6111
|
}
|
|
4845
6112
|
}
|
|
4846
6113
|
};
|
|
4847
6114
|
}
|
|
4848
6115
|
|
|
4849
6116
|
// src/vite/rango.ts
|
|
6117
|
+
var debugConfig = createRangoDebugger(NS.config);
|
|
4850
6118
|
async function rango(options) {
|
|
6119
|
+
const rangoStart = performance.now();
|
|
4851
6120
|
const resolvedOptions = options ?? { preset: "node" };
|
|
4852
6121
|
const preset = resolvedOptions.preset ?? "node";
|
|
4853
6122
|
const showBanner = resolvedOptions.banner ?? true;
|
|
6123
|
+
debugConfig?.("rango(%s) setup start", preset);
|
|
4854
6124
|
const plugins = [];
|
|
4855
|
-
const rangoAliases = getPackageAliases();
|
|
4856
|
-
const excludeDeps =
|
|
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}`;
|
|
4857
6141
|
const routerRef = { path: void 0 };
|
|
4858
6142
|
const prerenderEnabled = true;
|
|
4859
6143
|
if (preset === "cloudflare") {
|
|
@@ -4891,7 +6175,7 @@ async function rango(options) {
|
|
|
4891
6175
|
// Pre-bundle rsc-html-stream to prevent discovery during first request
|
|
4892
6176
|
// Exclude rsc-router modules to ensure same Context instance
|
|
4893
6177
|
optimizeDeps: {
|
|
4894
|
-
include: ["rsc-html-stream/client"],
|
|
6178
|
+
include: [nested("rsc-html-stream/client")],
|
|
4895
6179
|
exclude: excludeDeps,
|
|
4896
6180
|
esbuildOptions: sharedEsbuildOptions
|
|
4897
6181
|
}
|
|
@@ -4916,8 +6200,10 @@ async function rango(options) {
|
|
|
4916
6200
|
"react-dom/static.edge",
|
|
4917
6201
|
"react/jsx-runtime",
|
|
4918
6202
|
"react/jsx-dev-runtime",
|
|
4919
|
-
"rsc-html-stream/server",
|
|
4920
|
-
|
|
6203
|
+
nested("rsc-html-stream/server"),
|
|
6204
|
+
nested(
|
|
6205
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
6206
|
+
)
|
|
4921
6207
|
],
|
|
4922
6208
|
exclude: excludeDeps,
|
|
4923
6209
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -4932,7 +6218,9 @@ async function rango(options) {
|
|
|
4932
6218
|
"react",
|
|
4933
6219
|
"react/jsx-runtime",
|
|
4934
6220
|
"react/jsx-dev-runtime",
|
|
4935
|
-
|
|
6221
|
+
nested(
|
|
6222
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
6223
|
+
)
|
|
4936
6224
|
],
|
|
4937
6225
|
exclude: excludeDeps,
|
|
4938
6226
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -4949,6 +6237,7 @@ async function rango(options) {
|
|
|
4949
6237
|
}
|
|
4950
6238
|
});
|
|
4951
6239
|
plugins.push(createVirtualEntriesPlugin(finalEntries));
|
|
6240
|
+
plugins.push(performanceTracksPlugin());
|
|
4952
6241
|
plugins.push(
|
|
4953
6242
|
rsc({
|
|
4954
6243
|
entries: finalEntries,
|
|
@@ -5012,7 +6301,7 @@ ${list}`);
|
|
|
5012
6301
|
"react-dom",
|
|
5013
6302
|
"react/jsx-runtime",
|
|
5014
6303
|
"react/jsx-dev-runtime",
|
|
5015
|
-
"rsc-html-stream/client"
|
|
6304
|
+
nested("rsc-html-stream/client")
|
|
5016
6305
|
],
|
|
5017
6306
|
exclude: excludeDeps,
|
|
5018
6307
|
esbuildOptions: sharedEsbuildOptions,
|
|
@@ -5029,7 +6318,9 @@ ${list}`);
|
|
|
5029
6318
|
"react-dom/static.edge",
|
|
5030
6319
|
"react/jsx-runtime",
|
|
5031
6320
|
"react/jsx-dev-runtime",
|
|
5032
|
-
|
|
6321
|
+
nested(
|
|
6322
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
6323
|
+
)
|
|
5033
6324
|
],
|
|
5034
6325
|
exclude: excludeDeps,
|
|
5035
6326
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -5042,7 +6333,9 @@ ${list}`);
|
|
|
5042
6333
|
"react",
|
|
5043
6334
|
"react/jsx-runtime",
|
|
5044
6335
|
"react/jsx-dev-runtime",
|
|
5045
|
-
|
|
6336
|
+
nested(
|
|
6337
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
6338
|
+
)
|
|
5046
6339
|
],
|
|
5047
6340
|
esbuildOptions: sharedEsbuildOptions
|
|
5048
6341
|
}
|
|
@@ -5067,6 +6360,7 @@ ${list}`);
|
|
|
5067
6360
|
}
|
|
5068
6361
|
});
|
|
5069
6362
|
plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
|
|
6363
|
+
plugins.push(performanceTracksPlugin());
|
|
5070
6364
|
plugins.push(
|
|
5071
6365
|
rsc({
|
|
5072
6366
|
entries: finalEntries
|
|
@@ -5107,9 +6401,16 @@ ${list}`);
|
|
|
5107
6401
|
createRouterDiscoveryPlugin(discoveryEntryPath, {
|
|
5108
6402
|
routerPathRef: discoveryRouterRef,
|
|
5109
6403
|
enableBuildPrerender: prerenderEnabled,
|
|
5110
|
-
|
|
6404
|
+
buildEnv: options?.buildEnv,
|
|
6405
|
+
preset
|
|
5111
6406
|
})
|
|
5112
6407
|
);
|
|
6408
|
+
debugConfig?.(
|
|
6409
|
+
"rango(%s) setup done: %d plugin(s) (%sms)",
|
|
6410
|
+
preset,
|
|
6411
|
+
plugins.length,
|
|
6412
|
+
(performance.now() - rangoStart).toFixed(1)
|
|
6413
|
+
);
|
|
5113
6414
|
return plugins;
|
|
5114
6415
|
}
|
|
5115
6416
|
|
|
@@ -5120,29 +6421,75 @@ function poke() {
|
|
|
5120
6421
|
apply: "serve",
|
|
5121
6422
|
configureServer(server) {
|
|
5122
6423
|
const stdin = process.stdin;
|
|
5123
|
-
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
|
+
}
|
|
5124
6463
|
if (stdin.isTTY) {
|
|
5125
|
-
|
|
6464
|
+
server.config.logger.info(
|
|
6465
|
+
" poke ready: press e + enter to reload browser (ctrl+r also works when available)",
|
|
6466
|
+
{ timestamp: true }
|
|
6467
|
+
);
|
|
5126
6468
|
}
|
|
5127
6469
|
const onData = (data) => {
|
|
5128
|
-
if (
|
|
5129
|
-
|
|
5130
|
-
process.emit("SIGINT", "SIGINT");
|
|
5131
|
-
return;
|
|
5132
|
-
}
|
|
5133
|
-
if (data[0] === 18) {
|
|
5134
|
-
server.hot.send({ type: "full-reload", path: "*" });
|
|
5135
|
-
server.config.logger.info(" browser reload (ctrl+r)", {
|
|
6470
|
+
if (debug11) {
|
|
6471
|
+
server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
|
|
5136
6472
|
timestamp: true
|
|
5137
6473
|
});
|
|
5138
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
|
+
}
|
|
5139
6489
|
};
|
|
5140
6490
|
stdin.on("data", onData);
|
|
5141
6491
|
server.httpServer?.on("close", () => {
|
|
5142
6492
|
stdin.off("data", onData);
|
|
5143
|
-
if (stdin.isTTY && previousRawMode !== null) {
|
|
5144
|
-
stdin.setRawMode(previousRawMode);
|
|
5145
|
-
}
|
|
5146
6493
|
});
|
|
5147
6494
|
}
|
|
5148
6495
|
};
|