@rangojs/router 0.0.0-experimental.e16b7c00 → 0.0.0-experimental.e9c0b2f2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -0
- package/README.md +64 -6
- 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 +195 -52
- 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/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -28
- 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/{src/handles/index.ts → dist/handles/index.d.ts} +1 -2
- 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/testing/vitest.js +82 -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 +1165 -310
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/index.named-routes.gen.ts +103 -0
- package/dist/vite/package-resolution.d.ts +43 -0
- package/dist/vite/package-resolution.d.ts.map +1 -0
- package/dist/vite/package-resolution.js +112 -0
- package/dist/vite/package-resolution.js.map +1 -0
- package/dist/vite/virtual-entries.d.ts +25 -0
- package/dist/vite/virtual-entries.d.ts.map +1 -0
- package/dist/vite/virtual-entries.js +110 -0
- package/dist/vite/virtual-entries.js.map +1 -0
- package/package.json +71 -7
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +61 -1
- package/skills/bundle-analysis/SKILL.md +2 -2
- package/skills/cache-guide/SKILL.md +2 -2
- package/skills/caching/SKILL.md +92 -10
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +4 -2
- package/skills/document-cache/SKILL.md +2 -2
- package/skills/handler-use/SKILL.md +1 -1
- package/skills/hooks/SKILL.md +40 -29
- package/skills/host-router/SKILL.md +80 -3
- package/skills/intercept/SKILL.md +5 -3
- package/skills/layout/SKILL.md +11 -6
- package/skills/loader/SKILL.md +25 -19
- package/skills/middleware/SKILL.md +4 -2
- package/skills/migrate-nextjs/SKILL.md +3 -1
- package/skills/migrate-react-router/SKILL.md +4 -2
- package/skills/mime-routes/SKILL.md +2 -2
- package/skills/observability/SKILL.md +61 -4
- package/skills/parallel/SKILL.md +9 -4
- package/skills/prerender/SKILL.md +31 -10
- package/skills/rango/SKILL.md +31 -10
- package/skills/response-routes/SKILL.md +63 -45
- package/skills/route/SKILL.md +14 -2
- package/skills/router-setup/SKILL.md +27 -3
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +25 -1
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/typesafety/SKILL.md +6 -5
- package/skills/use-cache/SKILL.md +10 -9
- package/skills/vercel/SKILL.md +128 -0
- package/src/__augment-tests__/augmented.check.ts +2 -3
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +1 -1
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +115 -89
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/navigation-bridge.ts +16 -52
- package/src/browser/navigation-client.ts +84 -69
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +25 -74
- package/src/browser/navigation-transaction.ts +0 -32
- package/src/browser/partial-update.ts +81 -127
- package/src/browser/prefetch/cache.ts +99 -72
- package/src/browser/prefetch/fetch.ts +176 -34
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +30 -7
- package/src/browser/react/NavigationProvider.tsx +32 -95
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +17 -2
- package/src/browser/react/index.ts +0 -51
- package/src/browser/react/location-state-shared.ts +14 -15
- package/src/browser/react/location-state.ts +0 -1
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +0 -5
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +10 -5
- package/src/browser/react/use-params.ts +0 -2
- package/src/browser/react/use-router.ts +6 -4
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +0 -13
- package/src/browser/response-adapter.ts +41 -4
- package/src/browser/rsc-router.tsx +43 -18
- package/src/browser/scroll-restoration.ts +8 -3
- package/src/browser/server-action-bridge.ts +194 -28
- package/src/browser/types.ts +40 -21
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/generate-route-types.ts +1 -1
- package/src/build/index.ts +8 -4
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +117 -15
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +12 -1
- package/src/build/route-types/include-resolution.ts +116 -22
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +15 -2
- package/src/build/route-types/router-processing.ts +77 -41
- package/src/build/route-types/source-scan.ts +105 -7
- package/src/cache/cache-key-utils.ts +29 -13
- package/src/cache/cache-policy.ts +42 -62
- package/src/cache/cache-runtime.ts +126 -30
- package/src/cache/cache-scope.ts +118 -43
- package/src/cache/cache-tag.ts +7 -39
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +1257 -537
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +6 -19
- package/src/cache/document-cache.ts +32 -32
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +20 -24
- package/src/cache/memory-segment-store.ts +3 -48
- package/src/cache/profile-registry.ts +31 -31
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +9 -17
- package/src/cache/tag-invalidation.ts +29 -5
- package/src/cache/types.ts +14 -104
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +855 -0
- package/src/client.rsc.tsx +42 -22
- package/src/client.tsx +31 -58
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +13 -1
- package/src/decode-loader-results.ts +18 -2
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +0 -3
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +28 -18
- package/src/handles/MetaTags.tsx +56 -19
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +37 -8
- package/src/handles/is-thenable.ts +19 -0
- package/src/handles/meta.ts +51 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +6 -0
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +1 -65
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +6 -2
- package/src/href-client.ts +7 -12
- package/src/index.rsc.ts +75 -8
- package/src/index.ts +60 -4
- package/src/internal-debug.ts +2 -4
- package/src/loader.rsc.ts +19 -9
- package/src/loader.ts +12 -4
- package/src/network-error-thrower.tsx +1 -6
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +58 -3
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/response-utils.ts +25 -0
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +1 -44
- package/src/route-definition/dsl-helpers.ts +39 -21
- package/src/route-definition/helpers-types.ts +3 -3
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/route-map-builder.ts +0 -16
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +58 -23
- package/src/router/error-handling.ts +44 -17
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +6 -1
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +35 -2
- package/src/router/lazy-includes.ts +7 -44
- package/src/router/loader-resolution.ts +139 -73
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +0 -20
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +57 -58
- package/src/router/match-middleware/background-revalidation.ts +6 -7
- package/src/router/match-middleware/cache-lookup.ts +115 -194
- package/src/router/match-middleware/cache-store.ts +28 -32
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +1 -52
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +0 -116
- package/src/router/middleware.ts +175 -90
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +47 -89
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prerender-match.ts +101 -64
- package/src/router/request-classification.ts +25 -35
- package/src/router/revalidation.ts +75 -81
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +3 -28
- package/src/router/router-interfaces.ts +38 -7
- package/src/router/router-options.ts +111 -4
- package/src/router/segment-resolution/fresh.ts +66 -78
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +57 -23
- package/src/router/segment-resolution/revalidation.ts +212 -304
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/telemetry-otel.ts +161 -199
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +163 -64
- package/src/router/types.ts +1 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +87 -37
- package/src/rsc/handler-context.ts +1 -0
- package/src/rsc/handler.ts +232 -153
- package/src/rsc/helpers.ts +97 -4
- package/src/rsc/index.ts +1 -4
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +11 -15
- package/src/rsc/progressive-enhancement.ts +59 -9
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +57 -147
- package/src/rsc/rsc-rendering.ts +64 -24
- package/src/rsc/runtime-warnings.ts +14 -0
- package/src/rsc/server-action.ts +244 -81
- package/src/rsc/types.ts +15 -3
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +31 -26
- package/src/segment-loader-promise.ts +31 -4
- package/src/segment-system.tsx +89 -89
- package/src/server/context.ts +32 -0
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +52 -1
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +21 -42
- package/src/server/request-context.ts +189 -131
- package/src/ssr/index.tsx +19 -18
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +701 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +343 -0
- package/src/testing/render-route.tsx +581 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +20 -58
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +3 -3
- package/src/types/error-types.ts +25 -89
- package/src/types/global-namespace.ts +15 -15
- package/src/types/handler-context.ts +44 -14
- package/src/types/index.ts +0 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +0 -13
- package/src/urls/include-helper.ts +0 -4
- package/src/urls/index.ts +1 -8
- package/src/urls/path-helper-types.ts +8 -2
- package/src/urls/path-helper.ts +0 -54
- package/src/urls/type-extraction.ts +33 -24
- package/src/urls/urls-function.ts +0 -13
- package/src/use-loader.tsx +0 -186
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/discovery/bundle-postprocess.ts +2 -1
- package/src/vite/discovery/discover-routers.ts +33 -42
- package/src/vite/discovery/prerender-collection.ts +33 -46
- package/src/vite/discovery/state.ts +12 -1
- package/src/vite/discovery/virtual-module-codegen.ts +1 -11
- package/src/vite/index.ts +2 -0
- package/src/vite/plugin-types.ts +143 -10
- package/src/vite/plugins/cjs-to-esm.ts +8 -12
- package/src/vite/plugins/client-ref-dedup.ts +0 -11
- package/src/vite/plugins/client-ref-hashing.ts +0 -10
- package/src/vite/plugins/cloudflare-protocol-stub.ts +0 -20
- package/src/vite/plugins/expose-action-id.ts +2 -73
- package/src/vite/plugins/expose-id-utils.ts +85 -56
- package/src/vite/plugins/expose-ids/export-analysis.ts +30 -43
- package/src/vite/plugins/expose-ids/handler-transform.ts +5 -31
- package/src/vite/plugins/expose-ids/loader-transform.ts +12 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +98 -26
- package/src/vite/plugins/expose-internal-ids.ts +10 -1
- package/src/vite/plugins/performance-tracks.ts +0 -3
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +21 -46
- package/src/vite/plugins/vercel-output.ts +295 -0
- package/src/vite/plugins/version-injector.ts +0 -20
- package/src/vite/plugins/version-plugin.ts +6 -66
- package/src/vite/plugins/virtual-entries.ts +70 -17
- package/src/vite/rango.ts +135 -134
- package/src/vite/router-discovery.ts +21 -8
- package/src/vite/utils/ast-handler-extract.ts +11 -20
- package/src/vite/utils/bundle-analysis.ts +6 -13
- package/src/vite/utils/client-chunks.ts +0 -6
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +0 -22
- package/src/vite/utils/manifest-utils.ts +4 -75
- package/src/vite/utils/package-resolution.ts +1 -73
- package/src/vite/utils/prerender-utils.ts +54 -40
- package/src/vite/utils/shared-utils.ts +8 -37
- package/src/browser/shallow.ts +0 -40
- package/src/router/middleware-cookies.ts +0 -55
package/dist/vite/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/vite/rango.ts
|
|
2
2
|
import { readFileSync as readFileSync7 } from "node:fs";
|
|
3
|
-
import { resolve as
|
|
3
|
+
import { resolve as resolve10 } from "node:path";
|
|
4
4
|
|
|
5
5
|
// src/vite/plugins/expose-action-id.ts
|
|
6
6
|
import MagicString from "magic-string";
|
|
@@ -10,6 +10,13 @@ import fs from "node:fs";
|
|
|
10
10
|
// src/vite/plugins/expose-id-utils.ts
|
|
11
11
|
import path from "node:path";
|
|
12
12
|
import crypto from "node:crypto";
|
|
13
|
+
|
|
14
|
+
// src/regex-escape.ts
|
|
15
|
+
function escapeRegExp(input) {
|
|
16
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/vite/plugins/expose-id-utils.ts
|
|
13
20
|
function normalizePath(p) {
|
|
14
21
|
return p.split(path.sep).join("/");
|
|
15
22
|
}
|
|
@@ -158,7 +165,9 @@ function countArgs(code, startPos, endPos) {
|
|
|
158
165
|
while (i < endPos) {
|
|
159
166
|
const skipped = skipStringOrComment(code, i);
|
|
160
167
|
if (skipped > i) {
|
|
161
|
-
|
|
168
|
+
const ch = code[i];
|
|
169
|
+
const isComment = ch === "/" && i + 1 < code.length && (code[i + 1] === "/" || code[i + 1] === "*");
|
|
170
|
+
if (!isComment) hasContent = true;
|
|
162
171
|
i = skipped;
|
|
163
172
|
continue;
|
|
164
173
|
}
|
|
@@ -187,8 +196,59 @@ function findStatementEnd(code, pos) {
|
|
|
187
196
|
}
|
|
188
197
|
return i;
|
|
189
198
|
}
|
|
190
|
-
function
|
|
191
|
-
|
|
199
|
+
function findCallParenAfterGenerics(code, afterCalleeIndex) {
|
|
200
|
+
let i = afterCalleeIndex;
|
|
201
|
+
while (i < code.length) {
|
|
202
|
+
const skipped = skipStringOrComment(code, i);
|
|
203
|
+
if (skipped > i) {
|
|
204
|
+
i = skipped;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (/\s/.test(code[i])) {
|
|
208
|
+
i++;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
if (i >= code.length) return -1;
|
|
214
|
+
if (code[i] === "(") return i;
|
|
215
|
+
if (code[i] === "<") {
|
|
216
|
+
let depth = 0;
|
|
217
|
+
while (i < code.length) {
|
|
218
|
+
const skipped = skipStringOrComment(code, i);
|
|
219
|
+
if (skipped > i) {
|
|
220
|
+
i = skipped;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const ch = code[i];
|
|
224
|
+
if (ch === "<") {
|
|
225
|
+
depth++;
|
|
226
|
+
} else if (ch === ">") {
|
|
227
|
+
depth--;
|
|
228
|
+
if (depth === 0) {
|
|
229
|
+
i++;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
i++;
|
|
234
|
+
}
|
|
235
|
+
if (depth !== 0) return -1;
|
|
236
|
+
while (i < code.length) {
|
|
237
|
+
const skipped = skipStringOrComment(code, i);
|
|
238
|
+
if (skipped > i) {
|
|
239
|
+
i = skipped;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (/\s/.test(code[i])) {
|
|
243
|
+
i++;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
if (i < code.length && code[i] === "(") return i;
|
|
249
|
+
return -1;
|
|
250
|
+
}
|
|
251
|
+
return -1;
|
|
192
252
|
}
|
|
193
253
|
|
|
194
254
|
// src/vite/debug.ts
|
|
@@ -431,7 +491,6 @@ function exposeActionId() {
|
|
|
431
491
|
counterTransform?.record(id, performance.now() - start);
|
|
432
492
|
}
|
|
433
493
|
},
|
|
434
|
-
// Build mode: renderChunk runs after all transforms and bundling complete
|
|
435
494
|
renderChunk(code, chunk) {
|
|
436
495
|
const start = counterRender ? performance.now() : 0;
|
|
437
496
|
try {
|
|
@@ -473,10 +532,10 @@ import path4 from "node:path";
|
|
|
473
532
|
function isDirectivePrologueStatement(node) {
|
|
474
533
|
return node?.type === "ExpressionStatement" && typeof node.directive === "string";
|
|
475
534
|
}
|
|
476
|
-
function findImportInsertionPos(code,
|
|
535
|
+
function findImportInsertionPos(code, parseAst5) {
|
|
477
536
|
let program;
|
|
478
537
|
try {
|
|
479
|
-
program =
|
|
538
|
+
program = parseAst5(code, { lang: "tsx" });
|
|
480
539
|
} catch {
|
|
481
540
|
return 0;
|
|
482
541
|
}
|
|
@@ -513,10 +572,10 @@ function walkNode(node, parent, ancestors, enter) {
|
|
|
513
572
|
}
|
|
514
573
|
ancestors.pop();
|
|
515
574
|
}
|
|
516
|
-
function findHandlerCalls(code, fnName,
|
|
575
|
+
function findHandlerCalls(code, fnName, parseAst5) {
|
|
517
576
|
let program;
|
|
518
577
|
try {
|
|
519
|
-
program =
|
|
578
|
+
program = parseAst5(code, { lang: "tsx" });
|
|
520
579
|
} catch {
|
|
521
580
|
return [];
|
|
522
581
|
}
|
|
@@ -588,18 +647,18 @@ function getImportedLocalNamesFromProgram(program, importedName) {
|
|
|
588
647
|
}
|
|
589
648
|
return localNames;
|
|
590
649
|
}
|
|
591
|
-
function getImportedLocalNames(code, importedName,
|
|
650
|
+
function getImportedLocalNames(code, importedName, parseAst5) {
|
|
592
651
|
try {
|
|
593
|
-
const program =
|
|
652
|
+
const program = parseAst5(code, { lang: "tsx" });
|
|
594
653
|
return getImportedLocalNamesFromProgram(program, importedName);
|
|
595
654
|
} catch {
|
|
596
655
|
return /* @__PURE__ */ new Set();
|
|
597
656
|
}
|
|
598
657
|
}
|
|
599
|
-
function extractImportDeclarations(code,
|
|
658
|
+
function extractImportDeclarations(code, parseAst5) {
|
|
600
659
|
let program;
|
|
601
660
|
try {
|
|
602
|
-
program =
|
|
661
|
+
program = parseAst5(code, { lang: "tsx" });
|
|
603
662
|
} catch {
|
|
604
663
|
return [];
|
|
605
664
|
}
|
|
@@ -623,13 +682,18 @@ function isInertExpression(node) {
|
|
|
623
682
|
(e) => e === null || isInertExpression(e)
|
|
624
683
|
);
|
|
625
684
|
case "ObjectExpression":
|
|
626
|
-
return (node.properties ?? []).every(
|
|
627
|
-
(p
|
|
628
|
-
|
|
685
|
+
return (node.properties ?? []).every((p) => {
|
|
686
|
+
if (p.type === "SpreadElement" || p.type === "RestElement") {
|
|
687
|
+
return isInertExpression(p.argument);
|
|
688
|
+
}
|
|
689
|
+
return p.type === "Property" && (!p.computed || isInertExpression(p.key)) && isInertExpression(p.value);
|
|
690
|
+
});
|
|
629
691
|
case "UnaryExpression":
|
|
630
692
|
return isInertExpression(node.argument);
|
|
631
693
|
case "BinaryExpression":
|
|
632
694
|
return isInertExpression(node.left) && isInertExpression(node.right);
|
|
695
|
+
case "LogicalExpression":
|
|
696
|
+
return isInertExpression(node.left) && isInertExpression(node.right);
|
|
633
697
|
case "ConditionalExpression":
|
|
634
698
|
return isInertExpression(node.test) && isInertExpression(node.consequent) && isInertExpression(node.alternate);
|
|
635
699
|
case "SpreadElement":
|
|
@@ -651,10 +715,10 @@ function isSafeVariableDeclaration(node, handlerNames) {
|
|
|
651
715
|
(d) => isSafeDeclaratorInit(d.init) && !(d.init?.type === "CallExpression" && d.init.callee?.type === "Identifier" && handlerNames.has(d.init.callee.name))
|
|
652
716
|
);
|
|
653
717
|
}
|
|
654
|
-
function extractModuleLevelDeclarations(code,
|
|
718
|
+
function extractModuleLevelDeclarations(code, parseAst5, handlerNames) {
|
|
655
719
|
let program;
|
|
656
720
|
try {
|
|
657
|
-
program =
|
|
721
|
+
program = parseAst5(code, { lang: "tsx" });
|
|
658
722
|
} catch {
|
|
659
723
|
return [];
|
|
660
724
|
}
|
|
@@ -685,17 +749,17 @@ function extractModuleLevelDeclarations(code, parseAst4, handlerNames) {
|
|
|
685
749
|
}
|
|
686
750
|
return declarations;
|
|
687
751
|
}
|
|
688
|
-
function transformInlineHandlers(fnName, virtualPrefix, s, code, filePath, virtualRegistry, moduleId,
|
|
689
|
-
const sites = findHandlerCalls(code, fnName,
|
|
752
|
+
function transformInlineHandlers(fnName, virtualPrefix, s, code, filePath, virtualRegistry, moduleId, parseAst5) {
|
|
753
|
+
const sites = findHandlerCalls(code, fnName, parseAst5);
|
|
690
754
|
const inlineSites = sites.filter((site) => site.exportInfo === null);
|
|
691
755
|
if (inlineSites.length === 0) return false;
|
|
692
|
-
const imports = extractImportDeclarations(code,
|
|
693
|
-
const staticNames = getImportedLocalNames(code, "Static",
|
|
694
|
-
const prerenderNames = getImportedLocalNames(code, "Prerender",
|
|
756
|
+
const imports = extractImportDeclarations(code, parseAst5);
|
|
757
|
+
const staticNames = getImportedLocalNames(code, "Static", parseAst5);
|
|
758
|
+
const prerenderNames = getImportedLocalNames(code, "Prerender", parseAst5);
|
|
695
759
|
const handlerNames = /* @__PURE__ */ new Set([...staticNames, ...prerenderNames]);
|
|
696
760
|
const declarations = extractModuleLevelDeclarations(
|
|
697
761
|
code,
|
|
698
|
-
|
|
762
|
+
parseAst5,
|
|
699
763
|
handlerNames
|
|
700
764
|
);
|
|
701
765
|
const importStatements = [];
|
|
@@ -718,7 +782,7 @@ function transformInlineHandlers(fnName, virtualPrefix, s, code, filePath, virtu
|
|
|
718
782
|
}
|
|
719
783
|
if (importStatements.length > 0) {
|
|
720
784
|
const importBlock = importStatements.join("\n") + "\n";
|
|
721
|
-
const insertionPos = findImportInsertionPos(code,
|
|
785
|
+
const insertionPos = findImportInsertionPos(code, parseAst5);
|
|
722
786
|
if (insertionPos === 0) {
|
|
723
787
|
s.prepend(importBlock);
|
|
724
788
|
} else {
|
|
@@ -751,25 +815,55 @@ function isLineTerminator(ch) {
|
|
|
751
815
|
const c = ch.charCodeAt(0);
|
|
752
816
|
return c === 10 || c === 13 || c === 8232 || c === 8233;
|
|
753
817
|
}
|
|
818
|
+
var REGEX_PRECEDING_KEYWORDS = /* @__PURE__ */ new Set([
|
|
819
|
+
"return",
|
|
820
|
+
"typeof",
|
|
821
|
+
"instanceof",
|
|
822
|
+
"in",
|
|
823
|
+
"of",
|
|
824
|
+
"new",
|
|
825
|
+
"delete",
|
|
826
|
+
"void",
|
|
827
|
+
"do",
|
|
828
|
+
"else",
|
|
829
|
+
"yield",
|
|
830
|
+
"await",
|
|
831
|
+
"case",
|
|
832
|
+
"throw"
|
|
833
|
+
]);
|
|
834
|
+
function isRegexPositionAt(code, slashPos, prevChar) {
|
|
835
|
+
if (prevChar === void 0) return true;
|
|
836
|
+
if (prevChar === ")" || prevChar === "]" || prevChar === "}") return false;
|
|
837
|
+
if (!/[\w$]/.test(prevChar)) return true;
|
|
838
|
+
let k = slashPos - 1;
|
|
839
|
+
while (k >= 0 && /\s/.test(code[k])) k--;
|
|
840
|
+
const wordEnd = k + 1;
|
|
841
|
+
while (k >= 0 && /[\w$]/.test(code[k])) k--;
|
|
842
|
+
return REGEX_PRECEDING_KEYWORDS.has(code.slice(k + 1, wordEnd));
|
|
843
|
+
}
|
|
754
844
|
function makeCodeClassifier(code) {
|
|
755
845
|
const n = code.length;
|
|
756
846
|
let i = 0;
|
|
757
847
|
let skipStart = -1;
|
|
758
848
|
let skipEnd = -1;
|
|
849
|
+
let lastSig;
|
|
759
850
|
return (q) => {
|
|
760
851
|
if (q >= skipStart && q < skipEnd) return false;
|
|
761
852
|
while (i < n && i <= q) {
|
|
762
853
|
const c = code[i];
|
|
763
854
|
const d = i + 1 < n ? code[i + 1] : "";
|
|
764
855
|
let end = -1;
|
|
856
|
+
let transparent = false;
|
|
765
857
|
if (c === "/" && d === "/") {
|
|
766
858
|
let j = i + 2;
|
|
767
859
|
while (j < n && !isLineTerminator(code[j])) j++;
|
|
768
860
|
end = j;
|
|
861
|
+
transparent = true;
|
|
769
862
|
} else if (c === "/" && d === "*") {
|
|
770
863
|
let j = i + 2;
|
|
771
864
|
while (j < n && !(code[j] === "*" && code[j + 1] === "/")) j++;
|
|
772
865
|
end = Math.min(n, j + 2);
|
|
866
|
+
transparent = true;
|
|
773
867
|
} else if (c === '"' || c === "'" || c === "`") {
|
|
774
868
|
let j = i + 1;
|
|
775
869
|
while (j < n) {
|
|
@@ -784,6 +878,29 @@ function makeCodeClassifier(code) {
|
|
|
784
878
|
j++;
|
|
785
879
|
}
|
|
786
880
|
end = j;
|
|
881
|
+
} else if (c === "/" && d !== "/" && d !== "*" && isRegexPositionAt(code, i, lastSig)) {
|
|
882
|
+
let j = i + 1;
|
|
883
|
+
let inClass = false;
|
|
884
|
+
let closed = false;
|
|
885
|
+
while (j < n && !isLineTerminator(code[j])) {
|
|
886
|
+
const r = code[j];
|
|
887
|
+
if (r === "\\") {
|
|
888
|
+
j += 2;
|
|
889
|
+
continue;
|
|
890
|
+
}
|
|
891
|
+
if (r === "[") inClass = true;
|
|
892
|
+
else if (r === "]") inClass = false;
|
|
893
|
+
else if (r === "/" && !inClass) {
|
|
894
|
+
j++;
|
|
895
|
+
closed = true;
|
|
896
|
+
break;
|
|
897
|
+
}
|
|
898
|
+
j++;
|
|
899
|
+
}
|
|
900
|
+
if (closed) {
|
|
901
|
+
while (j < n && /[a-z]/.test(code[j])) j++;
|
|
902
|
+
end = j;
|
|
903
|
+
}
|
|
787
904
|
}
|
|
788
905
|
if (end >= 0) {
|
|
789
906
|
if (q < end) {
|
|
@@ -792,7 +909,9 @@ function makeCodeClassifier(code) {
|
|
|
792
909
|
return false;
|
|
793
910
|
}
|
|
794
911
|
i = end;
|
|
912
|
+
if (!transparent) lastSig = "x";
|
|
795
913
|
} else {
|
|
914
|
+
if (!/\s/.test(c)) lastSig = c;
|
|
796
915
|
i++;
|
|
797
916
|
}
|
|
798
917
|
}
|
|
@@ -851,13 +970,23 @@ function isExportOnlyFile(code, bindings) {
|
|
|
851
970
|
return true;
|
|
852
971
|
}
|
|
853
972
|
function createCallPattern(fnNames) {
|
|
854
|
-
return new RegExp(
|
|
855
|
-
|
|
856
|
-
|
|
973
|
+
return new RegExp(`\\b(?:${fnNames.map(escapeRegExp).join("|")})\\b`, "g");
|
|
974
|
+
}
|
|
975
|
+
function createCallStartIndices(code, fnNames) {
|
|
976
|
+
return codeMatchIndices(code, createCallPattern(fnNames)).filter(
|
|
977
|
+
(index) => findCallParenAfterGenerics(
|
|
978
|
+
code,
|
|
979
|
+
index + matchedNameLength(code, index)
|
|
980
|
+
) !== -1
|
|
857
981
|
);
|
|
858
982
|
}
|
|
983
|
+
function matchedNameLength(code, index) {
|
|
984
|
+
let i = index;
|
|
985
|
+
while (i < code.length && /[A-Za-z0-9_$]/.test(code[i])) i++;
|
|
986
|
+
return i - index;
|
|
987
|
+
}
|
|
859
988
|
function countCreateCallsForNames(code, fnNames) {
|
|
860
|
-
return
|
|
989
|
+
return createCallStartIndices(code, fnNames).length;
|
|
861
990
|
}
|
|
862
991
|
function offsetToLineColumn(code, index) {
|
|
863
992
|
let line = 1;
|
|
@@ -873,7 +1002,7 @@ function offsetToLineColumn(code, index) {
|
|
|
873
1002
|
}
|
|
874
1003
|
function findUnsupportedCreateCallSites(code, fnNames, supportedBindings) {
|
|
875
1004
|
const supported = new Set(supportedBindings.map((b) => b.callExprStart));
|
|
876
|
-
return
|
|
1005
|
+
return createCallStartIndices(code, fnNames).filter((index) => !supported.has(index)).map((index) => offsetToLineColumn(code, index));
|
|
877
1006
|
}
|
|
878
1007
|
function getImportedFnNames(code, importedName) {
|
|
879
1008
|
const importPattern = /import\s*\{([^}]*)\}\s*from\s*["']@rangojs\/router(?:\/[^"']*)?["']/g;
|
|
@@ -1067,11 +1196,13 @@ function generateClientLoaderStubs(bindings, code, filePath, isBuild) {
|
|
|
1067
1196
|
if (!isExportOnlyFile(code, bindings)) return null;
|
|
1068
1197
|
const lines = [];
|
|
1069
1198
|
for (const binding of bindings) {
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1199
|
+
const primaryName = binding.exportNames[0];
|
|
1200
|
+
const loaderId = makeStubId(filePath, primaryName, isBuild);
|
|
1201
|
+
lines.push(
|
|
1202
|
+
`export const ${primaryName} = { __brand: "loader", $$id: "${loaderId}" };`
|
|
1203
|
+
);
|
|
1204
|
+
for (const alias of binding.exportNames.slice(1)) {
|
|
1205
|
+
lines.push(`export const ${alias} = ${primaryName};`);
|
|
1075
1206
|
}
|
|
1076
1207
|
}
|
|
1077
1208
|
return { code: lines.join("\n") + "\n" };
|
|
@@ -1092,22 +1223,13 @@ ${binding.localName}.$$id = "${loaderId}";`;
|
|
|
1092
1223
|
}
|
|
1093
1224
|
|
|
1094
1225
|
// src/vite/plugins/expose-ids/handler-transform.ts
|
|
1095
|
-
function
|
|
1096
|
-
const content = code.slice(startPos, endPos).trim();
|
|
1097
|
-
return { hasArgs: content.length > 0 };
|
|
1098
|
-
}
|
|
1099
|
-
function transformHandles(bindings, s, code, filePath, isBuild) {
|
|
1226
|
+
function transformHandles(bindings, s, filePath, isBuild) {
|
|
1100
1227
|
let hasChanges = false;
|
|
1101
1228
|
for (const binding of bindings) {
|
|
1102
1229
|
const exportName = binding.exportNames[0];
|
|
1103
|
-
const args = analyzeCreateHandleArgs(
|
|
1104
|
-
code,
|
|
1105
|
-
binding.callOpenParenPos + 1,
|
|
1106
|
-
binding.callCloseParenPos
|
|
1107
|
-
);
|
|
1108
1230
|
const handleId = makeStubId(filePath, exportName, isBuild);
|
|
1109
1231
|
let paramInjection;
|
|
1110
|
-
if (
|
|
1232
|
+
if (binding.argCount === 0) {
|
|
1111
1233
|
paramInjection = `undefined, "${handleId}"`;
|
|
1112
1234
|
} else {
|
|
1113
1235
|
paramInjection = `, "${handleId}"`;
|
|
@@ -1182,36 +1304,68 @@ import MagicString2 from "magic-string";
|
|
|
1182
1304
|
import path3 from "node:path";
|
|
1183
1305
|
import { createHash } from "node:crypto";
|
|
1184
1306
|
var debug2 = createRangoDebugger(NS.transform);
|
|
1185
|
-
function
|
|
1307
|
+
function skipLeadingTrivia(code, start, end) {
|
|
1308
|
+
let i = start;
|
|
1309
|
+
while (i < end) {
|
|
1310
|
+
const skipped = skipStringOrComment(code, i);
|
|
1311
|
+
if (skipped > i) {
|
|
1312
|
+
i = skipped;
|
|
1313
|
+
continue;
|
|
1314
|
+
}
|
|
1315
|
+
if (/\s/.test(code[i])) {
|
|
1316
|
+
i++;
|
|
1317
|
+
continue;
|
|
1318
|
+
}
|
|
1319
|
+
break;
|
|
1320
|
+
}
|
|
1321
|
+
return i;
|
|
1322
|
+
}
|
|
1323
|
+
function transformRouter(code, filePath, routerFnNames, absolutePath, warn) {
|
|
1186
1324
|
const pat = new RegExp(
|
|
1187
|
-
`\\b(?:${routerFnNames.map(
|
|
1325
|
+
`\\b(?:${routerFnNames.map(escapeRegExp).join("|")})\\b`,
|
|
1188
1326
|
"g"
|
|
1189
1327
|
);
|
|
1190
1328
|
let match;
|
|
1191
1329
|
const s = new MagicString2(code);
|
|
1192
1330
|
let changed = false;
|
|
1331
|
+
const unsupportedSites = [];
|
|
1193
1332
|
const basename2 = path3.basename(filePath).replace(/\.(tsx?|jsx?)$/, "");
|
|
1194
1333
|
const routeNamesImport = `./${basename2}.named-routes.gen.js`;
|
|
1195
1334
|
const routeNamesVar = `__rsc_rn`;
|
|
1335
|
+
const codeOffsets = new Set(codeMatchIndices(code, pat));
|
|
1336
|
+
pat.lastIndex = 0;
|
|
1196
1337
|
while ((match = pat.exec(code)) !== null) {
|
|
1338
|
+
if (!codeOffsets.has(match.index)) continue;
|
|
1197
1339
|
const callStart = match.index;
|
|
1198
|
-
const
|
|
1340
|
+
const calleeEnd = match.index + match[0].length;
|
|
1341
|
+
const parenPos = findCallParenAfterGenerics(code, calleeEnd);
|
|
1342
|
+
if (parenPos === -1) continue;
|
|
1199
1343
|
const closeParen = findMatchingParen(code, parenPos + 1);
|
|
1200
1344
|
const callArgs = code.slice(parenPos + 1, closeParen);
|
|
1201
|
-
if (callArgs.includes(
|
|
1345
|
+
if (callArgs.includes(`$$routeNames: ${routeNamesVar}`)) continue;
|
|
1346
|
+
const sourceFilePath = absolutePath ?? filePath;
|
|
1202
1347
|
const lineNumber = code.slice(0, callStart).split("\n").length;
|
|
1203
1348
|
const hash = createHash("sha256").update(`${filePath}:${lineNumber}`).digest("hex").slice(0, 8);
|
|
1204
|
-
changed = true;
|
|
1205
|
-
const sourceFilePath = absolutePath ?? filePath;
|
|
1206
1349
|
const injected = ` $$id: "${hash}", $$sourceFile: "${sourceFilePath}", $$routeNames: ${routeNamesVar},`;
|
|
1207
|
-
const
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1350
|
+
const argsContentStart = skipLeadingTrivia(code, parenPos + 1, closeParen);
|
|
1351
|
+
const firstArgChar = code[argsContentStart];
|
|
1352
|
+
if (firstArgChar === "{") {
|
|
1353
|
+
changed = true;
|
|
1354
|
+
s.appendRight(argsContentStart + 1, injected);
|
|
1355
|
+
} else if (argsContentStart >= closeParen - 1) {
|
|
1356
|
+
changed = true;
|
|
1212
1357
|
s.appendRight(parenPos + 1, `{${injected} }`);
|
|
1358
|
+
} else {
|
|
1359
|
+
const lastNl = code.lastIndexOf("\n", callStart - 1);
|
|
1360
|
+
const column = callStart - (lastNl + 1) + 1;
|
|
1361
|
+
unsupportedSites.push({ line: lineNumber, column });
|
|
1213
1362
|
}
|
|
1214
1363
|
}
|
|
1364
|
+
if (unsupportedSites.length > 0 && warn) {
|
|
1365
|
+
warn(
|
|
1366
|
+
buildUnsupportedShapeWarning(filePath, "createRouter", unsupportedSites)
|
|
1367
|
+
);
|
|
1368
|
+
}
|
|
1215
1369
|
if (!changed) return null;
|
|
1216
1370
|
s.prepend(
|
|
1217
1371
|
`import { NamedRoutes as ${routeNamesVar} } from "${routeNamesImport}";
|
|
@@ -1245,11 +1399,13 @@ function exposeRouterId() {
|
|
|
1245
1399
|
try {
|
|
1246
1400
|
const filePath = normalizePath(path3.relative(projectRoot, id));
|
|
1247
1401
|
const routerFnNames = getImportedFnNames(code, "createRouter");
|
|
1402
|
+
const warn = typeof this.warn === "function" ? (message) => this.warn(message) : void 0;
|
|
1248
1403
|
return transformRouter(
|
|
1249
1404
|
code,
|
|
1250
1405
|
filePath,
|
|
1251
1406
|
routerFnNames,
|
|
1252
|
-
normalizePath(id)
|
|
1407
|
+
normalizePath(id),
|
|
1408
|
+
warn
|
|
1253
1409
|
);
|
|
1254
1410
|
} finally {
|
|
1255
1411
|
counter?.record(id, performance.now() - start);
|
|
@@ -1345,6 +1501,7 @@ ${lazyImports.join(",\n")}
|
|
|
1345
1501
|
// --------------- Loader pre-scan (build mode) ---------------
|
|
1346
1502
|
async buildStart() {
|
|
1347
1503
|
if (!isBuild) return;
|
|
1504
|
+
if (this.environment && this.environment.name !== "rsc") return;
|
|
1348
1505
|
const fs2 = await import("node:fs/promises");
|
|
1349
1506
|
const SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", "dist", "build", "coverage"]);
|
|
1350
1507
|
async function scanDir(dir) {
|
|
@@ -1729,7 +1886,6 @@ ${lazyImports.join(",\n")}
|
|
|
1729
1886
|
changed = transformHandles(
|
|
1730
1887
|
getBindings(code, fnNames),
|
|
1731
1888
|
s,
|
|
1732
|
-
code,
|
|
1733
1889
|
filePath,
|
|
1734
1890
|
isBuild
|
|
1735
1891
|
) || changed;
|
|
@@ -1806,8 +1962,8 @@ function useCacheTransform() {
|
|
|
1806
1962
|
} = rscTransforms;
|
|
1807
1963
|
let ast;
|
|
1808
1964
|
try {
|
|
1809
|
-
const { parseAst:
|
|
1810
|
-
ast =
|
|
1965
|
+
const { parseAst: parseAst5 } = await import("vite");
|
|
1966
|
+
ast = parseAst5(code, { lang: "tsx" });
|
|
1811
1967
|
} catch {
|
|
1812
1968
|
return;
|
|
1813
1969
|
}
|
|
@@ -1841,7 +1997,7 @@ function useCacheTransform() {
|
|
|
1841
1997
|
};
|
|
1842
1998
|
}
|
|
1843
1999
|
function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLayoutOrTemplate, transformWrapExport) {
|
|
1844
|
-
const
|
|
2000
|
+
const unconfirmedExports = [];
|
|
1845
2001
|
const { exportNames, output } = transformWrapExport(code, ast, {
|
|
1846
2002
|
runtime: (value, name) => {
|
|
1847
2003
|
const funcId = isBuild ? hashId(filePath, name) : `${filePath}#${name}`;
|
|
@@ -1850,16 +2006,17 @@ function transformFileLevelUseCache(code, ast, filePath, sourceId, isBuild, isLa
|
|
|
1850
2006
|
rejectNonAsyncFunction: false,
|
|
1851
2007
|
filter: (name, meta) => {
|
|
1852
2008
|
if (name === "default" && isLayoutOrTemplate) return false;
|
|
1853
|
-
if (meta.isFunction
|
|
1854
|
-
|
|
2009
|
+
if (meta.isFunction !== true) {
|
|
2010
|
+
unconfirmedExports.push(name);
|
|
1855
2011
|
return false;
|
|
1856
2012
|
}
|
|
1857
2013
|
return true;
|
|
1858
2014
|
}
|
|
1859
2015
|
});
|
|
1860
|
-
if (
|
|
2016
|
+
if (unconfirmedExports.length > 0) {
|
|
2017
|
+
const plural = unconfirmedExports.length > 1;
|
|
1861
2018
|
throw new Error(
|
|
1862
|
-
`[rango:use-cache] File-level "use cache" in ${sourceId}
|
|
2019
|
+
`[rango:use-cache] File-level "use cache" in ${sourceId} only wraps exports that are statically-confirmed functions. ${plural ? "These exports are" : "This export is"} not: ${unconfirmedExports.map((n) => `"${n}"`).join(", ")}. Declare them directly (export async function foo() {} or export const foo = async () => {}). A factory or otherwise statically-indeterminate initializer (export const foo = makeCached(fn)) is rejected even if it returns a function at runtime -- rewrite it as a direct async function, or move non-function exports to a separate module.`
|
|
1863
2020
|
);
|
|
1864
2021
|
}
|
|
1865
2022
|
if (exportNames.length === 0) {
|
|
@@ -1997,7 +2154,6 @@ function clientRefDedup() {
|
|
|
1997
2154
|
if (this.environment?.name !== "client") return;
|
|
1998
2155
|
if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
|
|
1999
2156
|
if (!source.includes("/node_modules/")) return;
|
|
2000
|
-
if (!importer) return;
|
|
2001
2157
|
const packageName = extractPackageName(source);
|
|
2002
2158
|
if (!packageName) return;
|
|
2003
2159
|
if (clientExclude.includes(packageName)) return;
|
|
@@ -2039,11 +2195,16 @@ async function initializeApp() {
|
|
|
2039
2195
|
createTemporaryReferenceSet,
|
|
2040
2196
|
};
|
|
2041
2197
|
|
|
2042
|
-
|
|
2198
|
+
// initBrowserApp resolves the initial payload and returns the browser app
|
|
2199
|
+
// context, including strictMode (default true) from createRouter. StrictMode
|
|
2200
|
+
// is the default; createRouter({ strictMode: false }) ships the opt-out in the
|
|
2201
|
+
// payload metadata. StrictMode emits no DOM, so toggling never changes markup.
|
|
2202
|
+
const { strictMode } = await initBrowserApp({ rscStream, deps });
|
|
2043
2203
|
|
|
2204
|
+
const app = createElement(Rango);
|
|
2044
2205
|
hydrateRoot(
|
|
2045
2206
|
document,
|
|
2046
|
-
createElement(StrictMode, null,
|
|
2207
|
+
strictMode === false ? app : createElement(StrictMode, null, app)
|
|
2047
2208
|
);
|
|
2048
2209
|
}
|
|
2049
2210
|
|
|
@@ -2096,6 +2257,11 @@ export default function handler(request, env) {
|
|
|
2096
2257
|
_handler = createRSCHandler({
|
|
2097
2258
|
router,
|
|
2098
2259
|
version: VERSION,
|
|
2260
|
+
// Forward the router's CSP nonce provider. createRSCHandler reads the
|
|
2261
|
+
// provider only from options.nonce; without this, createRouter({ nonce })
|
|
2262
|
+
// is silently dropped on the Node preset (the Cloudflare path wires it via
|
|
2263
|
+
// router.fetch). router.nonce is undefined when unconfigured, a safe no-op.
|
|
2264
|
+
nonce: router.nonce,
|
|
2099
2265
|
deps: {
|
|
2100
2266
|
renderToReadableStream,
|
|
2101
2267
|
decodeReply,
|
|
@@ -2112,6 +2278,63 @@ export default function handler(request, env) {
|
|
|
2112
2278
|
}
|
|
2113
2279
|
`.trim();
|
|
2114
2280
|
}
|
|
2281
|
+
function getVirtualEntryRSCHost(hostEntryPath) {
|
|
2282
|
+
return `
|
|
2283
|
+
import * as __hostEntry from "${hostEntryPath}";
|
|
2284
|
+
import { NoRouteMatchError } from "@rangojs/router/host";
|
|
2285
|
+
|
|
2286
|
+
// Register every sub-app's fetchable loaders + route manifests at startup, same
|
|
2287
|
+
// as the single-router entry. Discovery's host fallback populates these for all
|
|
2288
|
+
// mounted sub-apps, so the aggregate manifests cover the whole host tree.
|
|
2289
|
+
import "virtual:rsc-router/loader-manifest";
|
|
2290
|
+
import "virtual:rsc-router/routes-manifest";
|
|
2291
|
+
|
|
2292
|
+
// The host entry module must export the HostRouter instance (createHostRouter()),
|
|
2293
|
+
// as a default export or a named \`hostRouter\`/\`router\` export. A Cloudflare-style
|
|
2294
|
+
// \`export default { fetch }\` object is not a HostRouter and is rejected here.
|
|
2295
|
+
// We require BOTH .match() and .host(): a regular createRouter() also exposes
|
|
2296
|
+
// .match(), so matching on .match() alone would accept an ordinary router and then
|
|
2297
|
+
// return its MatchResult (not a Response) at runtime. .host() is unique to a
|
|
2298
|
+
// HostRouter, so it disambiguates a mistaken \`hostRouter\` path at build time.
|
|
2299
|
+
// Exports are read dynamically (m[name]) so Rollup does not emit IMPORT_IS_UNDEFINED
|
|
2300
|
+
// warnings for the named exports a default-only host module legitimately omits.
|
|
2301
|
+
const __resolveHostRouter = (m) => {
|
|
2302
|
+
for (const name of ["default", "hostRouter", "router"]) {
|
|
2303
|
+
const candidate = m[name];
|
|
2304
|
+
if (
|
|
2305
|
+
candidate &&
|
|
2306
|
+
typeof candidate.match === "function" &&
|
|
2307
|
+
typeof candidate.host === "function"
|
|
2308
|
+
)
|
|
2309
|
+
return candidate;
|
|
2310
|
+
}
|
|
2311
|
+
return undefined;
|
|
2312
|
+
};
|
|
2313
|
+
const hostRouter = __resolveHostRouter(__hostEntry);
|
|
2314
|
+
|
|
2315
|
+
if (!hostRouter) {
|
|
2316
|
+
throw new Error(
|
|
2317
|
+
"[rango] The host entry (${hostEntryPath}) must export a HostRouter instance (createHostRouter()) for the node/vercel preset: a default export, or a named 'hostRouter'/'router' export. An ordinary createRouter() is not a host router (it has no .host()), and a Cloudflare-style 'export default { fetch }' object is not supported on this preset."
|
|
2318
|
+
);
|
|
2319
|
+
}
|
|
2320
|
+
|
|
2321
|
+
// input = { env, ctx } from the launcher / node server. The host router threads
|
|
2322
|
+
// it unchanged to each matched sub-app's handler and cache factory.
|
|
2323
|
+
// On node/vercel rango owns this entry, so there is no user worker to translate
|
|
2324
|
+
// an unmatched host into a response: catch NoRouteMatchError and return 404
|
|
2325
|
+
// (parity with the documented Cloudflare catch). Other errors propagate.
|
|
2326
|
+
export default async function handler(request, input) {
|
|
2327
|
+
try {
|
|
2328
|
+
return await hostRouter.match(request, input);
|
|
2329
|
+
} catch (err) {
|
|
2330
|
+
if (err instanceof NoRouteMatchError) {
|
|
2331
|
+
return new Response("Not Found", { status: 404 });
|
|
2332
|
+
}
|
|
2333
|
+
throw err;
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
`.trim();
|
|
2337
|
+
}
|
|
2115
2338
|
var VIRTUAL_IDS = {
|
|
2116
2339
|
browser: "virtual:rsc-router/entry.browser.js",
|
|
2117
2340
|
ssr: "virtual:rsc-router/entry.ssr.js",
|
|
@@ -2130,7 +2353,7 @@ import { resolve } from "node:path";
|
|
|
2130
2353
|
// package.json
|
|
2131
2354
|
var package_default = {
|
|
2132
2355
|
name: "@rangojs/router",
|
|
2133
|
-
version: "0.0.0-experimental.
|
|
2356
|
+
version: "0.0.0-experimental.e9c0b2f2",
|
|
2134
2357
|
description: "Django-inspired RSC router with composable URL patterns",
|
|
2135
2358
|
keywords: [
|
|
2136
2359
|
"react",
|
|
@@ -2240,6 +2463,16 @@ var package_default = {
|
|
|
2240
2463
|
"react-server": "./src/cache/cache-runtime.ts",
|
|
2241
2464
|
default: "./src/cache/cache-runtime.ts"
|
|
2242
2465
|
},
|
|
2466
|
+
"./cloudflare": {
|
|
2467
|
+
types: "./src/cloudflare/index.ts",
|
|
2468
|
+
"react-server": "./src/cloudflare/index.ts",
|
|
2469
|
+
default: "./src/cloudflare/index.ts"
|
|
2470
|
+
},
|
|
2471
|
+
"./vercel": {
|
|
2472
|
+
types: "./src/vercel/index.ts",
|
|
2473
|
+
"react-server": "./src/vercel/index.ts",
|
|
2474
|
+
default: "./src/vercel/index.ts"
|
|
2475
|
+
},
|
|
2243
2476
|
"./theme": {
|
|
2244
2477
|
types: "./src/theme/index.ts",
|
|
2245
2478
|
default: "./src/theme/index.ts"
|
|
@@ -2256,6 +2489,31 @@ var package_default = {
|
|
|
2256
2489
|
"./host/testing": {
|
|
2257
2490
|
types: "./src/host/testing.ts",
|
|
2258
2491
|
default: "./src/host/testing.ts"
|
|
2492
|
+
},
|
|
2493
|
+
"./testing": {
|
|
2494
|
+
types: "./src/testing/index.ts",
|
|
2495
|
+
default: "./src/testing/index.ts"
|
|
2496
|
+
},
|
|
2497
|
+
"./testing/vitest": {
|
|
2498
|
+
types: "./src/testing/vitest.ts",
|
|
2499
|
+
default: "./dist/testing/vitest.js"
|
|
2500
|
+
},
|
|
2501
|
+
"./testing/dom": {
|
|
2502
|
+
types: "./src/testing/dom.entry.ts",
|
|
2503
|
+
default: "./src/testing/dom.entry.ts"
|
|
2504
|
+
},
|
|
2505
|
+
"./testing/e2e": {
|
|
2506
|
+
types: "./src/testing/e2e/index.ts",
|
|
2507
|
+
default: "./src/testing/e2e/index.ts"
|
|
2508
|
+
},
|
|
2509
|
+
"./testing/flight": {
|
|
2510
|
+
types: "./src/testing/flight.entry.ts",
|
|
2511
|
+
"react-server": "./src/testing/flight.entry.ts",
|
|
2512
|
+
default: "./src/testing/flight.entry.ts"
|
|
2513
|
+
},
|
|
2514
|
+
"./testing/flight-matchers": {
|
|
2515
|
+
types: "./src/testing/flight-matchers.ts",
|
|
2516
|
+
default: "./src/testing/flight-matchers.ts"
|
|
2259
2517
|
}
|
|
2260
2518
|
},
|
|
2261
2519
|
publishConfig: {
|
|
@@ -2263,51 +2521,80 @@ var package_default = {
|
|
|
2263
2521
|
tag: "experimental"
|
|
2264
2522
|
},
|
|
2265
2523
|
scripts: {
|
|
2266
|
-
build: "pnpm
|
|
2524
|
+
build: "pnpm exec 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 exec esbuild src/testing/vitest.ts --bundle --format=esm --outfile=dist/testing/vitest.js --platform=node --packages=external && pnpm exec 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",
|
|
2267
2525
|
prepublishOnly: "pnpm build",
|
|
2268
2526
|
typecheck: "tsc --noEmit && tsc -p tsconfig.strict-check.json --noEmit && tsc -p tsconfig.augment-check.json --noEmit",
|
|
2269
2527
|
test: "playwright test",
|
|
2270
2528
|
"test:ui": "playwright test --ui",
|
|
2271
2529
|
"test:hmr-local": "playwright test --project=dev-warmup --project=hmr-routes --project=hmr-basename --project=hmr-prerender --no-deps --workers=1",
|
|
2272
2530
|
"test:unit": "vitest run",
|
|
2273
|
-
"test:unit:watch": "vitest"
|
|
2531
|
+
"test:unit:watch": "vitest",
|
|
2532
|
+
"test:unit:rsc": "vitest run --config vitest.rsc.config.ts"
|
|
2274
2533
|
},
|
|
2275
2534
|
dependencies: {
|
|
2276
2535
|
"@types/debug": "^4.1.12",
|
|
2277
2536
|
"@vitejs/plugin-rsc": "^0.5.26",
|
|
2278
2537
|
debug: "^4.4.1",
|
|
2279
2538
|
"magic-string": "^0.30.17",
|
|
2280
|
-
picomatch: "^4.0.
|
|
2281
|
-
"rsc-html-stream": "^0.0.7"
|
|
2539
|
+
picomatch: "^4.0.4",
|
|
2540
|
+
"rsc-html-stream": "^0.0.7",
|
|
2541
|
+
srvx: "^0.11.15",
|
|
2542
|
+
tinyexec: "^0.3.2"
|
|
2282
2543
|
},
|
|
2283
2544
|
devDependencies: {
|
|
2545
|
+
"@opentelemetry/api": "^1.9.0",
|
|
2284
2546
|
"@playwright/test": "^1.49.1",
|
|
2285
2547
|
"@shared/e2e": "workspace:*",
|
|
2548
|
+
"@testing-library/dom": "^10.4.1",
|
|
2549
|
+
"@testing-library/react": "^16.3.2",
|
|
2286
2550
|
"@types/node": "^24.10.1",
|
|
2287
2551
|
"@types/react": "catalog:",
|
|
2288
2552
|
"@types/react-dom": "catalog:",
|
|
2289
2553
|
esbuild: "^0.27.0",
|
|
2554
|
+
"happy-dom": "^20.10.1",
|
|
2290
2555
|
jiti: "^2.6.1",
|
|
2291
2556
|
react: "catalog:",
|
|
2292
2557
|
"react-dom": "catalog:",
|
|
2293
|
-
tinyexec: "^0.3.2",
|
|
2294
2558
|
typescript: "^5.3.0",
|
|
2295
2559
|
vitest: "^4.0.0"
|
|
2296
2560
|
},
|
|
2297
2561
|
peerDependencies: {
|
|
2298
2562
|
"@cloudflare/vite-plugin": "^1.38.0",
|
|
2563
|
+
"@opentelemetry/api": "^1.9.0",
|
|
2564
|
+
"@playwright/test": "^1.49.1",
|
|
2565
|
+
"@testing-library/react": ">=16",
|
|
2566
|
+
"@vercel/functions": "^3.0.0",
|
|
2299
2567
|
"@vitejs/plugin-rsc": "^0.5.26",
|
|
2300
2568
|
react: ">=19.2.6 <20",
|
|
2301
2569
|
"react-dom": ">=19.2.6 <20",
|
|
2302
|
-
vite: "^8.0.0"
|
|
2570
|
+
vite: "^8.0.0",
|
|
2571
|
+
vitest: ">=3"
|
|
2303
2572
|
},
|
|
2304
2573
|
peerDependenciesMeta: {
|
|
2305
2574
|
"@cloudflare/vite-plugin": {
|
|
2306
2575
|
optional: true
|
|
2307
2576
|
},
|
|
2577
|
+
"@opentelemetry/api": {
|
|
2578
|
+
optional: true
|
|
2579
|
+
},
|
|
2580
|
+
"@playwright/test": {
|
|
2581
|
+
optional: true
|
|
2582
|
+
},
|
|
2583
|
+
"@testing-library/react": {
|
|
2584
|
+
optional: true
|
|
2585
|
+
},
|
|
2586
|
+
"@vercel/functions": {
|
|
2587
|
+
optional: true
|
|
2588
|
+
},
|
|
2308
2589
|
vite: {
|
|
2309
2590
|
optional: true
|
|
2591
|
+
},
|
|
2592
|
+
vitest: {
|
|
2593
|
+
optional: true
|
|
2310
2594
|
}
|
|
2595
|
+
},
|
|
2596
|
+
engines: {
|
|
2597
|
+
node: "^20.19.0 || >=22.12.0"
|
|
2311
2598
|
}
|
|
2312
2599
|
};
|
|
2313
2600
|
|
|
@@ -2381,10 +2668,10 @@ function extractParamsFromPattern(pattern) {
|
|
|
2381
2668
|
function formatRouteEntry(key, pattern, _params, search) {
|
|
2382
2669
|
const hasSearch = search && Object.keys(search).length > 0;
|
|
2383
2670
|
if (!hasSearch) {
|
|
2384
|
-
return ` ${key}:
|
|
2671
|
+
return ` ${key}: ${JSON.stringify(pattern)},`;
|
|
2385
2672
|
}
|
|
2386
|
-
const searchBody = Object.entries(search).map(([k, v]) => `${k}:
|
|
2387
|
-
return ` ${key}: { path:
|
|
2673
|
+
const searchBody = Object.entries(search).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ");
|
|
2674
|
+
return ` ${key}: { path: ${JSON.stringify(pattern)}, search: { ${searchBody} } },`;
|
|
2388
2675
|
}
|
|
2389
2676
|
|
|
2390
2677
|
// src/build/route-types/ast-route-extraction.ts
|
|
@@ -2410,8 +2697,8 @@ function extractObjectStringProperties(node) {
|
|
|
2410
2697
|
}
|
|
2411
2698
|
|
|
2412
2699
|
// src/build/route-types/ast-route-extraction.ts
|
|
2413
|
-
function extractRoutesFromSource(code) {
|
|
2414
|
-
const sourceFile = ts2.createSourceFile(
|
|
2700
|
+
function extractRoutesFromSource(code, sourceFileArg) {
|
|
2701
|
+
const sourceFile = sourceFileArg ?? ts2.createSourceFile(
|
|
2415
2702
|
"input.tsx",
|
|
2416
2703
|
code,
|
|
2417
2704
|
ts2.ScriptTarget.Latest,
|
|
@@ -2491,16 +2778,44 @@ export const NamedRoutes = {
|
|
|
2491
2778
|
${objectBody}
|
|
2492
2779
|
} as const;
|
|
2493
2780
|
|
|
2781
|
+
// Aliased so the augmentation below does not pay a homomorphic mapped-type
|
|
2782
|
+
// instantiation per route; \`as const\` already makes the members readonly.
|
|
2783
|
+
type NamedRoutesShape = typeof NamedRoutes;
|
|
2784
|
+
|
|
2494
2785
|
declare global {
|
|
2495
2786
|
namespace Rango {
|
|
2496
|
-
interface GeneratedRouteMap extends
|
|
2787
|
+
interface GeneratedRouteMap extends NamedRoutesShape {}
|
|
2497
2788
|
}
|
|
2498
2789
|
}
|
|
2499
2790
|
`;
|
|
2500
2791
|
}
|
|
2501
2792
|
|
|
2502
2793
|
// src/build/route-types/scan-filter.ts
|
|
2794
|
+
import { join, relative } from "node:path";
|
|
2503
2795
|
import picomatch from "picomatch";
|
|
2796
|
+
var DEFAULT_EXCLUDE_PATTERNS = [
|
|
2797
|
+
"**/__tests__/**",
|
|
2798
|
+
"**/__mocks__/**",
|
|
2799
|
+
"**/dist/**",
|
|
2800
|
+
"**/coverage/**",
|
|
2801
|
+
"**/*.test.{ts,tsx,js,jsx}",
|
|
2802
|
+
"**/*.spec.{ts,tsx,js,jsx}"
|
|
2803
|
+
];
|
|
2804
|
+
function createScanFilter(root, opts) {
|
|
2805
|
+
const { include, exclude } = opts;
|
|
2806
|
+
const hasInclude = include && include.length > 0;
|
|
2807
|
+
const hasCustomExclude = exclude !== void 0;
|
|
2808
|
+
if (!hasInclude && !hasCustomExclude) return void 0;
|
|
2809
|
+
const effectiveExclude = exclude ?? DEFAULT_EXCLUDE_PATTERNS;
|
|
2810
|
+
const includeMatcher = hasInclude ? picomatch(include) : null;
|
|
2811
|
+
const excludeMatcher = effectiveExclude.length > 0 ? picomatch(effectiveExclude) : null;
|
|
2812
|
+
return (absolutePath) => {
|
|
2813
|
+
const rel = relative(root, absolutePath);
|
|
2814
|
+
if (excludeMatcher && excludeMatcher(rel)) return false;
|
|
2815
|
+
if (includeMatcher) return includeMatcher(rel);
|
|
2816
|
+
return true;
|
|
2817
|
+
};
|
|
2818
|
+
}
|
|
2504
2819
|
|
|
2505
2820
|
// src/build/route-types/per-module-writer.ts
|
|
2506
2821
|
import ts4 from "typescript";
|
|
@@ -2509,6 +2824,33 @@ import ts4 from "typescript";
|
|
|
2509
2824
|
import { readFileSync, existsSync as existsSync2 } from "node:fs";
|
|
2510
2825
|
import { dirname, resolve as resolve2 } from "node:path";
|
|
2511
2826
|
import ts3 from "typescript";
|
|
2827
|
+
function createScanMemo() {
|
|
2828
|
+
return { files: /* @__PURE__ */ new Map(), blockSourceFiles: /* @__PURE__ */ new Map() };
|
|
2829
|
+
}
|
|
2830
|
+
function parseBlock(memo, block) {
|
|
2831
|
+
if (memo) {
|
|
2832
|
+
const cached = memo.blockSourceFiles.get(block);
|
|
2833
|
+
if (cached) return cached;
|
|
2834
|
+
}
|
|
2835
|
+
const sf = ts3.createSourceFile(
|
|
2836
|
+
"input.tsx",
|
|
2837
|
+
block,
|
|
2838
|
+
ts3.ScriptTarget.Latest,
|
|
2839
|
+
true,
|
|
2840
|
+
ts3.ScriptKind.TSX
|
|
2841
|
+
);
|
|
2842
|
+
if (memo) memo.blockSourceFiles.set(block, sf);
|
|
2843
|
+
return sf;
|
|
2844
|
+
}
|
|
2845
|
+
function readSourceMemoized(memo, realPath) {
|
|
2846
|
+
if (memo) {
|
|
2847
|
+
const cached = memo.files.get(realPath);
|
|
2848
|
+
if (cached !== void 0) return cached;
|
|
2849
|
+
}
|
|
2850
|
+
const source = readFileSync(realPath, "utf-8");
|
|
2851
|
+
if (memo) memo.files.set(realPath, source);
|
|
2852
|
+
return source;
|
|
2853
|
+
}
|
|
2512
2854
|
function extractNamePrefixFromInclude(node) {
|
|
2513
2855
|
if (node.arguments.length >= 3) {
|
|
2514
2856
|
const thirdArg = node.arguments[2];
|
|
@@ -2524,8 +2866,8 @@ function extractNamePrefixFromInclude(node) {
|
|
|
2524
2866
|
}
|
|
2525
2867
|
return null;
|
|
2526
2868
|
}
|
|
2527
|
-
function extractIncludesWithDiagnostics(code) {
|
|
2528
|
-
const sourceFile = ts3.createSourceFile(
|
|
2869
|
+
function extractIncludesWithDiagnostics(code, sourceFileArg) {
|
|
2870
|
+
const sourceFile = sourceFileArg ?? ts3.createSourceFile(
|
|
2529
2871
|
"input.tsx",
|
|
2530
2872
|
code,
|
|
2531
2873
|
ts3.ScriptTarget.Latest,
|
|
@@ -2579,7 +2921,7 @@ function extractIncludesWithDiagnostics(code) {
|
|
|
2579
2921
|
return { resolved, unresolvable };
|
|
2580
2922
|
}
|
|
2581
2923
|
function resolveImportedVariable(code, localName) {
|
|
2582
|
-
const importRegex = /import\s
|
|
2924
|
+
const importRegex = /import\s*(?:[\w$]+\s*,\s*)?\{([^}]+)\}\s*from\s*["']([^"']+)["']/g;
|
|
2583
2925
|
let match;
|
|
2584
2926
|
while ((match = importRegex.exec(code)) !== null) {
|
|
2585
2927
|
const imports = match[1];
|
|
@@ -2616,8 +2958,8 @@ function resolveImportPath(importSpec, fromFile) {
|
|
|
2616
2958
|
}
|
|
2617
2959
|
return null;
|
|
2618
2960
|
}
|
|
2619
|
-
function extractUrlsBlockForVariable(code, varName) {
|
|
2620
|
-
const sourceFile = ts3.createSourceFile(
|
|
2961
|
+
function extractUrlsBlockForVariable(code, varName, sourceFileArg) {
|
|
2962
|
+
const sourceFile = sourceFileArg ?? ts3.createSourceFile(
|
|
2621
2963
|
"input.tsx",
|
|
2622
2964
|
code,
|
|
2623
2965
|
ts3.ScriptTarget.Latest,
|
|
@@ -2639,16 +2981,20 @@ function extractUrlsBlockForVariable(code, varName) {
|
|
|
2639
2981
|
visit(sourceFile);
|
|
2640
2982
|
return result;
|
|
2641
2983
|
}
|
|
2642
|
-
function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut, diagnosticsOut) {
|
|
2984
|
+
function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSchemasOut, diagnosticsOut, memo) {
|
|
2643
2985
|
const routeMap = {};
|
|
2644
|
-
const
|
|
2986
|
+
const blockSourceFile = parseBlock(memo, block);
|
|
2987
|
+
const localRoutes = extractRoutesFromSource(block, blockSourceFile);
|
|
2645
2988
|
for (const { name, pattern, search } of localRoutes) {
|
|
2646
2989
|
routeMap[name] = pattern;
|
|
2647
2990
|
if (search && searchSchemasOut) {
|
|
2648
2991
|
searchSchemasOut[name] = search;
|
|
2649
2992
|
}
|
|
2650
2993
|
}
|
|
2651
|
-
const { resolved: includes, unresolvable } = extractIncludesWithDiagnostics(
|
|
2994
|
+
const { resolved: includes, unresolvable } = extractIncludesWithDiagnostics(
|
|
2995
|
+
block,
|
|
2996
|
+
blockSourceFile
|
|
2997
|
+
);
|
|
2652
2998
|
if (diagnosticsOut) {
|
|
2653
2999
|
for (const entry of unresolvable) {
|
|
2654
3000
|
diagnosticsOut.push({ ...entry, sourceFile: filePath });
|
|
@@ -2675,12 +3021,15 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2675
3021
|
targetFile,
|
|
2676
3022
|
imported.exportedName,
|
|
2677
3023
|
visited,
|
|
2678
|
-
diagnosticsOut
|
|
3024
|
+
diagnosticsOut,
|
|
3025
|
+
void 0,
|
|
3026
|
+
memo
|
|
2679
3027
|
);
|
|
2680
3028
|
} else {
|
|
2681
3029
|
const sameFileBlock = extractUrlsBlockForVariable(
|
|
2682
3030
|
fullSource,
|
|
2683
|
-
variableName
|
|
3031
|
+
variableName,
|
|
3032
|
+
parseBlock(memo, fullSource)
|
|
2684
3033
|
);
|
|
2685
3034
|
if (!sameFileBlock) {
|
|
2686
3035
|
if (diagnosticsOut) {
|
|
@@ -2698,7 +3047,9 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2698
3047
|
filePath,
|
|
2699
3048
|
variableName,
|
|
2700
3049
|
visited,
|
|
2701
|
-
diagnosticsOut
|
|
3050
|
+
diagnosticsOut,
|
|
3051
|
+
void 0,
|
|
3052
|
+
memo
|
|
2702
3053
|
);
|
|
2703
3054
|
}
|
|
2704
3055
|
if (namePrefix === null) {
|
|
@@ -2722,8 +3073,9 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2722
3073
|
}
|
|
2723
3074
|
return routeMap;
|
|
2724
3075
|
}
|
|
2725
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
3076
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock, memo) {
|
|
2726
3077
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
3078
|
+
memo = memo ?? createScanMemo();
|
|
2727
3079
|
const realPath = resolve2(filePath);
|
|
2728
3080
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
2729
3081
|
if (visited.has(key)) {
|
|
@@ -2733,7 +3085,7 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2733
3085
|
visited.add(key);
|
|
2734
3086
|
let source;
|
|
2735
3087
|
try {
|
|
2736
|
-
source =
|
|
3088
|
+
source = readSourceMemoized(memo, realPath);
|
|
2737
3089
|
} catch {
|
|
2738
3090
|
return { routes: {}, searchSchemas: {} };
|
|
2739
3091
|
}
|
|
@@ -2741,7 +3093,11 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2741
3093
|
if (inlineBlock) {
|
|
2742
3094
|
block = inlineBlock;
|
|
2743
3095
|
} else if (variableName) {
|
|
2744
|
-
const extracted = extractUrlsBlockForVariable(
|
|
3096
|
+
const extracted = extractUrlsBlockForVariable(
|
|
3097
|
+
source,
|
|
3098
|
+
variableName,
|
|
3099
|
+
parseBlock(memo, source)
|
|
3100
|
+
);
|
|
2745
3101
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
2746
3102
|
block = extracted;
|
|
2747
3103
|
} else {
|
|
@@ -2754,7 +3110,8 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2754
3110
|
realPath,
|
|
2755
3111
|
visited,
|
|
2756
3112
|
searchSchemas,
|
|
2757
|
-
diagnosticsOut
|
|
3113
|
+
diagnosticsOut,
|
|
3114
|
+
memo
|
|
2758
3115
|
);
|
|
2759
3116
|
visited.delete(key);
|
|
2760
3117
|
return { routes, searchSchemas };
|
|
@@ -2769,7 +3126,7 @@ import {
|
|
|
2769
3126
|
readdirSync
|
|
2770
3127
|
} from "node:fs";
|
|
2771
3128
|
import {
|
|
2772
|
-
join,
|
|
3129
|
+
join as join2,
|
|
2773
3130
|
dirname as dirname2,
|
|
2774
3131
|
resolve as resolve3,
|
|
2775
3132
|
sep,
|
|
@@ -2792,7 +3149,10 @@ var ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
|
|
|
2792
3149
|
function isRoutableSourceFile(name) {
|
|
2793
3150
|
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
|
|
2794
3151
|
}
|
|
2795
|
-
function
|
|
3152
|
+
function isExcludedScanDir(name) {
|
|
3153
|
+
return name === "node_modules" || name === "dist" || name === "coverage" || name === "__tests__" || name === "__mocks__" || name.startsWith(".");
|
|
3154
|
+
}
|
|
3155
|
+
function findCallSiteFilesRecursive(dir, pattern, patternG, stopAtMatchDir, filter, results) {
|
|
2796
3156
|
let entries;
|
|
2797
3157
|
try {
|
|
2798
3158
|
entries = readdirSync(dir, { withFileTypes: true });
|
|
@@ -2803,32 +3163,36 @@ function findRouterFilesRecursive(dir, filter, results) {
|
|
|
2803
3163
|
return;
|
|
2804
3164
|
}
|
|
2805
3165
|
const childDirs = [];
|
|
2806
|
-
const
|
|
3166
|
+
const matchesInDir = [];
|
|
2807
3167
|
for (const entry of entries) {
|
|
2808
|
-
const fullPath =
|
|
3168
|
+
const fullPath = join2(dir, entry.name);
|
|
2809
3169
|
if (entry.isDirectory()) {
|
|
2810
|
-
if (entry.name
|
|
2811
|
-
continue;
|
|
2812
|
-
childDirs.push(fullPath);
|
|
3170
|
+
if (!isExcludedScanDir(entry.name)) childDirs.push(fullPath);
|
|
2813
3171
|
continue;
|
|
2814
3172
|
}
|
|
2815
3173
|
if (!isRoutableSourceFile(entry.name)) continue;
|
|
2816
3174
|
if (filter && !filter(fullPath)) continue;
|
|
2817
3175
|
try {
|
|
2818
3176
|
const source = readFileSync2(fullPath, "utf-8");
|
|
2819
|
-
if (
|
|
2820
|
-
|
|
3177
|
+
if (pattern.test(source) && firstCodeMatchIndex(source, patternG) >= 0) {
|
|
3178
|
+
matchesInDir.push(fullPath);
|
|
2821
3179
|
}
|
|
2822
3180
|
} catch {
|
|
2823
3181
|
continue;
|
|
2824
3182
|
}
|
|
2825
3183
|
}
|
|
2826
|
-
|
|
2827
|
-
|
|
2828
|
-
|
|
2829
|
-
|
|
2830
|
-
|
|
2831
|
-
|
|
3184
|
+
results.push(...matchesInDir);
|
|
3185
|
+
if (!stopAtMatchDir || matchesInDir.length === 0) {
|
|
3186
|
+
for (const childDir of childDirs) {
|
|
3187
|
+
findCallSiteFilesRecursive(
|
|
3188
|
+
childDir,
|
|
3189
|
+
pattern,
|
|
3190
|
+
patternG,
|
|
3191
|
+
stopAtMatchDir,
|
|
3192
|
+
filter,
|
|
3193
|
+
results
|
|
3194
|
+
);
|
|
3195
|
+
}
|
|
2832
3196
|
}
|
|
2833
3197
|
}
|
|
2834
3198
|
function findNestedRouterConflict(routerFiles) {
|
|
@@ -2965,7 +3329,7 @@ function applyBasenameToRoutes(result, basename2) {
|
|
|
2965
3329
|
}
|
|
2966
3330
|
function genFileTsPath(sourceFile) {
|
|
2967
3331
|
const base = pathBasename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
2968
|
-
return
|
|
3332
|
+
return join2(dirname2(sourceFile), `${base}.named-routes.gen.ts`);
|
|
2969
3333
|
}
|
|
2970
3334
|
function resolveSearchSchemas(publicRouteNames, runtimeSchemas, sourceFile) {
|
|
2971
3335
|
if (runtimeSchemas && Object.keys(runtimeSchemas).length > 0) {
|
|
@@ -3026,12 +3390,33 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
3026
3390
|
}
|
|
3027
3391
|
function findRouterFiles(root, filter) {
|
|
3028
3392
|
const result = [];
|
|
3029
|
-
|
|
3393
|
+
findCallSiteFilesRecursive(
|
|
3394
|
+
root,
|
|
3395
|
+
ROUTER_CALL_PATTERN,
|
|
3396
|
+
ROUTER_CALL_PATTERN_G,
|
|
3397
|
+
true,
|
|
3398
|
+
filter,
|
|
3399
|
+
result
|
|
3400
|
+
);
|
|
3401
|
+
return result;
|
|
3402
|
+
}
|
|
3403
|
+
var HOST_ROUTER_CALL_PATTERN = /\bcreateHostRouter\s*[<(]/;
|
|
3404
|
+
var HOST_ROUTER_CALL_PATTERN_G = /\bcreateHostRouter\s*[<(]/g;
|
|
3405
|
+
function findHostRouterFiles(root, filter) {
|
|
3406
|
+
const result = [];
|
|
3407
|
+
findCallSiteFilesRecursive(
|
|
3408
|
+
root,
|
|
3409
|
+
HOST_ROUTER_CALL_PATTERN,
|
|
3410
|
+
HOST_ROUTER_CALL_PATTERN_G,
|
|
3411
|
+
false,
|
|
3412
|
+
filter,
|
|
3413
|
+
result
|
|
3414
|
+
);
|
|
3030
3415
|
return result;
|
|
3031
3416
|
}
|
|
3032
3417
|
function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
3033
3418
|
try {
|
|
3034
|
-
const oldCombinedPath =
|
|
3419
|
+
const oldCombinedPath = join2(root, "src", "named-routes.gen.ts");
|
|
3035
3420
|
if (existsSync3(oldCombinedPath)) {
|
|
3036
3421
|
unlinkSync(oldCombinedPath);
|
|
3037
3422
|
console.log(
|
|
@@ -3092,7 +3477,28 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
3092
3477
|
}
|
|
3093
3478
|
|
|
3094
3479
|
// src/vite/plugins/version-plugin.ts
|
|
3480
|
+
import { parseAst as parseAst4 } from "vite";
|
|
3481
|
+
|
|
3482
|
+
// src/vite/utils/directive-prologue.ts
|
|
3095
3483
|
import { parseAst as parseAst3 } from "vite";
|
|
3484
|
+
function hasUseClientDirective(source) {
|
|
3485
|
+
let program;
|
|
3486
|
+
try {
|
|
3487
|
+
program = parseAst3(source, { lang: "tsx" });
|
|
3488
|
+
} catch {
|
|
3489
|
+
return false;
|
|
3490
|
+
}
|
|
3491
|
+
for (const node of program.body ?? []) {
|
|
3492
|
+
if (node?.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
|
|
3493
|
+
if (node.expression.value === "use client") return true;
|
|
3494
|
+
continue;
|
|
3495
|
+
}
|
|
3496
|
+
break;
|
|
3497
|
+
}
|
|
3498
|
+
return false;
|
|
3499
|
+
}
|
|
3500
|
+
|
|
3501
|
+
// src/vite/plugins/version-plugin.ts
|
|
3096
3502
|
function isCodeModule(id) {
|
|
3097
3503
|
return /\.(tsx?|jsx?)($|\?)/.test(id);
|
|
3098
3504
|
}
|
|
@@ -3100,23 +3506,13 @@ function normalizeModuleId(id) {
|
|
|
3100
3506
|
return id.split("?", 1)[0];
|
|
3101
3507
|
}
|
|
3102
3508
|
function getClientModuleSignature(source) {
|
|
3509
|
+
if (!hasUseClientDirective(source)) return void 0;
|
|
3103
3510
|
let program;
|
|
3104
3511
|
try {
|
|
3105
|
-
program =
|
|
3512
|
+
program = parseAst4(source, { lang: "tsx" });
|
|
3106
3513
|
} catch {
|
|
3107
3514
|
return void 0;
|
|
3108
3515
|
}
|
|
3109
|
-
let isUseClient = false;
|
|
3110
|
-
for (const node of program.body ?? []) {
|
|
3111
|
-
if (node?.type === "ExpressionStatement" && node.expression?.type === "Literal" && typeof node.expression.value === "string") {
|
|
3112
|
-
if (node.expression.value === "use client") {
|
|
3113
|
-
isUseClient = true;
|
|
3114
|
-
}
|
|
3115
|
-
continue;
|
|
3116
|
-
}
|
|
3117
|
-
break;
|
|
3118
|
-
}
|
|
3119
|
-
if (!isUseClient) return void 0;
|
|
3120
3516
|
const exports = /* @__PURE__ */ new Set();
|
|
3121
3517
|
let hasDefault = false;
|
|
3122
3518
|
let hasExportAll = false;
|
|
@@ -3241,7 +3637,6 @@ function createVersionPlugin() {
|
|
|
3241
3637
|
}
|
|
3242
3638
|
return null;
|
|
3243
3639
|
},
|
|
3244
|
-
// Track RSC module changes and update version
|
|
3245
3640
|
async hotUpdate(ctx) {
|
|
3246
3641
|
if (!isDev) return;
|
|
3247
3642
|
const isRscModule = this.environment?.name === "rsc";
|
|
@@ -3318,9 +3713,6 @@ function performanceTracksOptimizeDepsPlugin() {
|
|
|
3318
3713
|
const RSDW_CLIENT_RE = /react-server-dom-webpack-client\.browser\.(development|production)\.js$/;
|
|
3319
3714
|
return {
|
|
3320
3715
|
name: "@rangojs/router:performance-tracks-optimize-deps",
|
|
3321
|
-
// Vite 8 optimizes deps with Rolldown (Rollup-style plugin pipeline), so the
|
|
3322
|
-
// pre-bundled RSDW client is patched via load() rather than esbuild's onLoad.
|
|
3323
|
-
// Returning code overrides Rolldown's default filesystem read for the module.
|
|
3324
3716
|
async load(id) {
|
|
3325
3717
|
const cleanId = id.split("?")[0] ?? id;
|
|
3326
3718
|
if (!RSDW_CLIENT_RE.test(cleanId)) return null;
|
|
@@ -3408,7 +3800,7 @@ function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
|
3408
3800
|
if (virtualId === VIRTUAL_IDS.rsc && routerPathRef?.path) {
|
|
3409
3801
|
const raw = routerPathRef.path.startsWith(".") ? "/" + routerPathRef.path.slice(2) : routerPathRef.path;
|
|
3410
3802
|
const absoluteRouterPath = raw.replaceAll("\\", "/");
|
|
3411
|
-
return getVirtualEntryRSC(absoluteRouterPath);
|
|
3803
|
+
return routerPathRef.kind === "host" ? getVirtualEntryRSCHost(absoluteRouterPath) : getVirtualEntryRSC(absoluteRouterPath);
|
|
3412
3804
|
}
|
|
3413
3805
|
}
|
|
3414
3806
|
return null;
|
|
@@ -3463,7 +3855,7 @@ function getManualChunks(id) {
|
|
|
3463
3855
|
}
|
|
3464
3856
|
|
|
3465
3857
|
// src/vite/plugins/client-ref-hashing.ts
|
|
3466
|
-
import { relative } from "node:path";
|
|
3858
|
+
import { relative as relative2 } from "node:path";
|
|
3467
3859
|
import { createHash as createHash2 } from "node:crypto";
|
|
3468
3860
|
var debug7 = createRangoDebugger(NS.transform);
|
|
3469
3861
|
var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
|
|
@@ -3480,10 +3872,10 @@ function computeProductionHash(projectRoot, refKey) {
|
|
|
3480
3872
|
const absPath = decodeURIComponent(
|
|
3481
3873
|
refKey.slice(CLIENT_IN_SERVER_PKG_PROXY_PREFIX.length)
|
|
3482
3874
|
);
|
|
3483
|
-
toHash =
|
|
3875
|
+
toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
|
|
3484
3876
|
} else if (refKey.startsWith(FS_PREFIX)) {
|
|
3485
3877
|
const absPath = refKey.slice(FS_PREFIX.length - 1);
|
|
3486
|
-
toHash =
|
|
3878
|
+
toHash = relative2(projectRoot, absPath).replaceAll("\\", "/");
|
|
3487
3879
|
} else if (refKey.startsWith("/")) {
|
|
3488
3880
|
toHash = refKey.slice(1);
|
|
3489
3881
|
} else {
|
|
@@ -3510,7 +3902,6 @@ function hashClientRefs(projectRoot) {
|
|
|
3510
3902
|
const counter = createCounter(debug7, "hash-client-refs");
|
|
3511
3903
|
return {
|
|
3512
3904
|
name: "@rangojs/router:hash-client-refs",
|
|
3513
|
-
// Run after the RSC plugin's transform (default enforce is normal)
|
|
3514
3905
|
enforce: "post",
|
|
3515
3906
|
applyToEnvironment(env) {
|
|
3516
3907
|
return env.name === "rsc";
|
|
@@ -3588,6 +3979,190 @@ function resolveClientChunks(option, ctx) {
|
|
|
3588
3979
|
return option;
|
|
3589
3980
|
}
|
|
3590
3981
|
|
|
3982
|
+
// src/vite/plugins/vercel-output.ts
|
|
3983
|
+
import { rm, mkdir, cp, writeFile } from "node:fs/promises";
|
|
3984
|
+
import { existsSync as existsSync4 } from "node:fs";
|
|
3985
|
+
import { resolve as resolve4, join as join3 } from "node:path";
|
|
3986
|
+
import { createRequire as createRequire2 } from "node:module";
|
|
3987
|
+
import { pathToFileURL } from "node:url";
|
|
3988
|
+
var LAUNCHER_SOURCE = `import { toNodeHandler } from "srvx/node";
|
|
3989
|
+
import { waitUntil } from "@vercel/functions";
|
|
3990
|
+
import rscHandler from "./rsc/index.js";
|
|
3991
|
+
|
|
3992
|
+
// The Vercel Node launcher invokes a Node (req, res) handler, not a Web fetch
|
|
3993
|
+
// handler. srvx's toNodeHandler bridges the Rango Web fetch handler and pipes
|
|
3994
|
+
// the streamed Response to the Node response (set supportsResponseStreaming).
|
|
3995
|
+
const onVercel = Boolean(process.env.VERCEL);
|
|
3996
|
+
|
|
3997
|
+
const fetchHandler = (request) =>
|
|
3998
|
+
rscHandler(request, {
|
|
3999
|
+
env: process.env,
|
|
4000
|
+
// Forward Vercel's waitUntil so cache writes / revalidation run off the
|
|
4001
|
+
// response path. Omitted off-platform so those writes settle inline.
|
|
4002
|
+
ctx: onVercel ? { waitUntil } : undefined,
|
|
4003
|
+
});
|
|
4004
|
+
|
|
4005
|
+
export default toNodeHandler(fetchHandler);
|
|
4006
|
+
`;
|
|
4007
|
+
function assertVercelNodeRuntime(runtime) {
|
|
4008
|
+
if (runtime != null && !runtime.startsWith("nodejs")) {
|
|
4009
|
+
throw new Error(
|
|
4010
|
+
`[rango] preset "vercel": runtime "${runtime}" is not supported. This preset emits a Node serverless function; use a "nodejs*" runtime (default "nodejs22.x"). The Edge runtime is not supported.`
|
|
4011
|
+
);
|
|
4012
|
+
}
|
|
4013
|
+
}
|
|
4014
|
+
async function assemble(root, options) {
|
|
4015
|
+
const vercel = options.vercel ?? {};
|
|
4016
|
+
assertVercelNodeRuntime(vercel.runtime);
|
|
4017
|
+
const dist = join3(root, "dist");
|
|
4018
|
+
for (const dir of ["client", "rsc", "ssr"]) {
|
|
4019
|
+
if (!existsSync4(join3(dist, dir))) {
|
|
4020
|
+
throw new Error(
|
|
4021
|
+
`[rango] preset "vercel": missing dist/${dir}. Run the production build first.`
|
|
4022
|
+
);
|
|
4023
|
+
}
|
|
4024
|
+
}
|
|
4025
|
+
const functionName = vercel.functionName ?? "index";
|
|
4026
|
+
const out = join3(root, ".vercel", "output");
|
|
4027
|
+
const funcDir = join3(out, "functions", `${functionName}.func`);
|
|
4028
|
+
await rm(out, { recursive: true, force: true });
|
|
4029
|
+
await mkdir(funcDir, { recursive: true });
|
|
4030
|
+
await cp(join3(dist, "client"), join3(out, "static"), { recursive: true });
|
|
4031
|
+
await cp(join3(dist, "rsc"), join3(funcDir, "rsc"), { recursive: true });
|
|
4032
|
+
await cp(join3(dist, "ssr"), join3(funcDir, "ssr"), { recursive: true });
|
|
4033
|
+
if (existsSync4(join3(dist, "static"))) {
|
|
4034
|
+
await cp(join3(dist, "static"), join3(funcDir, "static"), {
|
|
4035
|
+
recursive: true
|
|
4036
|
+
});
|
|
4037
|
+
}
|
|
4038
|
+
const rangoRequire = createRequire2(import.meta.url);
|
|
4039
|
+
let srvxNodePath;
|
|
4040
|
+
try {
|
|
4041
|
+
srvxNodePath = rangoRequire.resolve("srvx/node");
|
|
4042
|
+
} catch {
|
|
4043
|
+
throw new Error(
|
|
4044
|
+
'[rango] preset "vercel" requires "srvx" (a dependency of @rangojs/router). Reinstall dependencies.'
|
|
4045
|
+
);
|
|
4046
|
+
}
|
|
4047
|
+
const appRequire = createRequire2(join3(root, "package.json"));
|
|
4048
|
+
const resolveEsbuildPath = () => {
|
|
4049
|
+
try {
|
|
4050
|
+
const viteRequire = createRequire2(appRequire.resolve("vite"));
|
|
4051
|
+
return viteRequire.resolve("esbuild");
|
|
4052
|
+
} catch {
|
|
4053
|
+
}
|
|
4054
|
+
try {
|
|
4055
|
+
return appRequire.resolve("esbuild");
|
|
4056
|
+
} catch {
|
|
4057
|
+
}
|
|
4058
|
+
return rangoRequire.resolve("esbuild");
|
|
4059
|
+
};
|
|
4060
|
+
let esbuildModule;
|
|
4061
|
+
try {
|
|
4062
|
+
esbuildModule = await import(pathToFileURL(resolveEsbuildPath()).href);
|
|
4063
|
+
} catch {
|
|
4064
|
+
throw new Error(
|
|
4065
|
+
'[rango] preset "vercel" requires "esbuild" to bundle the function launcher. It ships with Vite; reinstall dependencies (or add esbuild to your app dependencies).'
|
|
4066
|
+
);
|
|
4067
|
+
}
|
|
4068
|
+
const esbuildBuild = esbuildModule.build ?? esbuildModule.default?.build;
|
|
4069
|
+
if (typeof esbuildBuild !== "function") {
|
|
4070
|
+
throw new Error('[rango] preset "vercel": could not load esbuild.build.');
|
|
4071
|
+
}
|
|
4072
|
+
try {
|
|
4073
|
+
await esbuildBuild({
|
|
4074
|
+
stdin: {
|
|
4075
|
+
contents: LAUNCHER_SOURCE,
|
|
4076
|
+
resolveDir: root,
|
|
4077
|
+
sourcefile: "func-entry.mjs",
|
|
4078
|
+
loader: "js"
|
|
4079
|
+
},
|
|
4080
|
+
outfile: join3(funcDir, "index.mjs"),
|
|
4081
|
+
bundle: true,
|
|
4082
|
+
format: "esm",
|
|
4083
|
+
platform: "node",
|
|
4084
|
+
target: "node18",
|
|
4085
|
+
alias: { "srvx/node": srvxNodePath },
|
|
4086
|
+
plugins: [
|
|
4087
|
+
{
|
|
4088
|
+
name: "external-rsc-entry",
|
|
4089
|
+
setup(b) {
|
|
4090
|
+
b.onResolve({ filter: /^\.\/rsc\/index\.js$/ }, () => ({
|
|
4091
|
+
path: "./rsc/index.js",
|
|
4092
|
+
external: true
|
|
4093
|
+
}));
|
|
4094
|
+
}
|
|
4095
|
+
}
|
|
4096
|
+
]
|
|
4097
|
+
});
|
|
4098
|
+
} catch (error) {
|
|
4099
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
4100
|
+
if (/@vercel\/functions/.test(message)) {
|
|
4101
|
+
throw new Error(
|
|
4102
|
+
'[rango] preset "vercel": could not resolve "@vercel/functions". Add it to your app dependencies (it also backs VercelCacheStore).\n' + message
|
|
4103
|
+
);
|
|
4104
|
+
}
|
|
4105
|
+
throw error;
|
|
4106
|
+
}
|
|
4107
|
+
await writeFile(
|
|
4108
|
+
join3(funcDir, "package.json"),
|
|
4109
|
+
JSON.stringify({ type: "module" }, null, 2) + "\n"
|
|
4110
|
+
);
|
|
4111
|
+
const vcConfig = {
|
|
4112
|
+
runtime: vercel.runtime ?? "nodejs22.x",
|
|
4113
|
+
handler: "index.mjs",
|
|
4114
|
+
launcherType: "Nodejs",
|
|
4115
|
+
shouldAddHelpers: false,
|
|
4116
|
+
supportsResponseStreaming: true,
|
|
4117
|
+
maxDuration: vercel.maxDuration ?? 30
|
|
4118
|
+
};
|
|
4119
|
+
if (vercel.memory != null) vcConfig.memory = vercel.memory;
|
|
4120
|
+
if (vercel.regions != null) vcConfig.regions = vercel.regions;
|
|
4121
|
+
await writeFile(
|
|
4122
|
+
join3(funcDir, ".vc-config.json"),
|
|
4123
|
+
JSON.stringify(vcConfig, null, 2) + "\n"
|
|
4124
|
+
);
|
|
4125
|
+
await writeFile(
|
|
4126
|
+
join3(out, "config.json"),
|
|
4127
|
+
JSON.stringify(
|
|
4128
|
+
{
|
|
4129
|
+
version: 3,
|
|
4130
|
+
routes: [
|
|
4131
|
+
{ handle: "filesystem" },
|
|
4132
|
+
{ src: "/(.*)", dest: `/${functionName}` }
|
|
4133
|
+
]
|
|
4134
|
+
},
|
|
4135
|
+
null,
|
|
4136
|
+
2
|
|
4137
|
+
) + "\n"
|
|
4138
|
+
);
|
|
4139
|
+
console.log(
|
|
4140
|
+
`[rango] assembled .vercel/output (function: ${functionName}.func)`
|
|
4141
|
+
);
|
|
4142
|
+
}
|
|
4143
|
+
function createVercelOutputPlugin(options) {
|
|
4144
|
+
let root = process.cwd();
|
|
4145
|
+
let isBuild = false;
|
|
4146
|
+
return {
|
|
4147
|
+
name: "@rangojs/router:vercel-output",
|
|
4148
|
+
configResolved(config) {
|
|
4149
|
+
root = resolve4(config.root);
|
|
4150
|
+
isBuild = config.command === "build";
|
|
4151
|
+
},
|
|
4152
|
+
// buildApp runs once after the whole multi-environment build (rsc, client,
|
|
4153
|
+
// ssr), so dist/ is complete here. closeBundle is unusable for this: it
|
|
4154
|
+
// fires per environment, and twice for ssr (the server-reference scan and
|
|
4155
|
+
// the real build), so it would run before dist/client exists.
|
|
4156
|
+
buildApp: {
|
|
4157
|
+
order: "post",
|
|
4158
|
+
async handler() {
|
|
4159
|
+
if (!isBuild) return;
|
|
4160
|
+
await assemble(root, options);
|
|
4161
|
+
}
|
|
4162
|
+
}
|
|
4163
|
+
};
|
|
4164
|
+
}
|
|
4165
|
+
|
|
3591
4166
|
// src/vite/utils/banner.ts
|
|
3592
4167
|
var rangoVersion = package_default.version;
|
|
3593
4168
|
var _bannerPrinted = false;
|
|
@@ -3615,7 +4190,7 @@ ${dim} ${reset}${bold}\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550$
|
|
|
3615
4190
|
}
|
|
3616
4191
|
|
|
3617
4192
|
// src/vite/plugins/version-injector.ts
|
|
3618
|
-
import { resolve as
|
|
4193
|
+
import { resolve as resolve5 } from "node:path";
|
|
3619
4194
|
import * as Vite2 from "vite";
|
|
3620
4195
|
function createVersionInjectorPlugin(rscEntryPath) {
|
|
3621
4196
|
let resolvedEntryPath = "";
|
|
@@ -3626,7 +4201,7 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
3626
4201
|
let entryPath = rscEntryPath;
|
|
3627
4202
|
if (!entryPath) entryPath = resolveRscEntryFromConfig(config);
|
|
3628
4203
|
if (entryPath) {
|
|
3629
|
-
resolvedEntryPath =
|
|
4204
|
+
resolvedEntryPath = resolve5(config.root, entryPath);
|
|
3630
4205
|
}
|
|
3631
4206
|
},
|
|
3632
4207
|
transform(code, id) {
|
|
@@ -3674,13 +4249,17 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
3674
4249
|
// src/vite/plugins/cjs-to-esm.ts
|
|
3675
4250
|
var debug8 = createRangoDebugger(NS.transform);
|
|
3676
4251
|
function createCjsToEsmPlugin() {
|
|
4252
|
+
let isProduction = false;
|
|
3677
4253
|
return {
|
|
3678
4254
|
name: "@rangojs/router:cjs-to-esm",
|
|
3679
4255
|
enforce: "pre",
|
|
4256
|
+
configResolved(config) {
|
|
4257
|
+
isProduction = config.isProduction;
|
|
4258
|
+
},
|
|
3680
4259
|
transform(code, id) {
|
|
3681
4260
|
const cleanId = id.split("?")[0].replaceAll("\\", "/");
|
|
3682
4261
|
if (cleanId.includes("vendor/react-server-dom/client.browser.js")) {
|
|
3683
|
-
const isProd =
|
|
4262
|
+
const isProd = isProduction;
|
|
3684
4263
|
const cjsFile = isProd ? "./cjs/react-server-dom-webpack-client.browser.production.js" : "./cjs/react-server-dom-webpack-client.browser.development.js";
|
|
3685
4264
|
debug8?.("cjs-to-esm entry redirect %s", id);
|
|
3686
4265
|
return {
|
|
@@ -3731,10 +4310,10 @@ function createCjsToEsmPlugin() {
|
|
|
3731
4310
|
|
|
3732
4311
|
// src/vite/router-discovery.ts
|
|
3733
4312
|
import { createServer as createViteServer } from "vite";
|
|
3734
|
-
import { resolve as
|
|
4313
|
+
import { resolve as resolve9 } from "node:path";
|
|
3735
4314
|
import { readFileSync as readFileSync6 } from "node:fs";
|
|
3736
|
-
import { createRequire as
|
|
3737
|
-
import { pathToFileURL } from "node:url";
|
|
4315
|
+
import { createRequire as createRequire3, register } from "node:module";
|
|
4316
|
+
import { pathToFileURL as pathToFileURL2 } from "node:url";
|
|
3738
4317
|
|
|
3739
4318
|
// src/vite/plugins/virtual-stub-plugin.ts
|
|
3740
4319
|
function createVirtualStubPlugin() {
|
|
@@ -4019,7 +4598,50 @@ function checkSelfGenWrite(state, filePath, consume) {
|
|
|
4019
4598
|
}
|
|
4020
4599
|
}
|
|
4021
4600
|
|
|
4022
|
-
// src/
|
|
4601
|
+
// src/router/logging.ts
|
|
4602
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4603
|
+
|
|
4604
|
+
// src/internal-debug.ts
|
|
4605
|
+
var INTERNAL_RANGO_DEBUG = typeof __RANGO_DEBUG__ !== "undefined" ? __RANGO_DEBUG__ : typeof process !== "undefined" && Boolean(process.env?.INTERNAL_RANGO_DEBUG);
|
|
4606
|
+
|
|
4607
|
+
// src/router/logging.ts
|
|
4608
|
+
var routerLogContext = new AsyncLocalStorage();
|
|
4609
|
+
|
|
4610
|
+
// src/router/pattern-matching.ts
|
|
4611
|
+
function parsePattern(pattern) {
|
|
4612
|
+
const segments = [];
|
|
4613
|
+
const segmentRegex = /\/(:([a-zA-Z_][a-zA-Z0-9_]*)(\(([^)]+)\))?(\?)?([^/]*)|(\*)|([^/]+))/g;
|
|
4614
|
+
let match;
|
|
4615
|
+
while ((match = segmentRegex.exec(pattern)) !== null) {
|
|
4616
|
+
const [
|
|
4617
|
+
,
|
|
4618
|
+
,
|
|
4619
|
+
paramName,
|
|
4620
|
+
,
|
|
4621
|
+
constraint,
|
|
4622
|
+
optional,
|
|
4623
|
+
suffix,
|
|
4624
|
+
wildcard,
|
|
4625
|
+
staticText
|
|
4626
|
+
] = match;
|
|
4627
|
+
if (wildcard) {
|
|
4628
|
+
segments.push({ type: "wildcard", value: "*", optional: false });
|
|
4629
|
+
} else if (paramName) {
|
|
4630
|
+
segments.push({
|
|
4631
|
+
type: "param",
|
|
4632
|
+
value: paramName,
|
|
4633
|
+
optional: optional === "?",
|
|
4634
|
+
constraint: constraint ? constraint.split("|") : void 0,
|
|
4635
|
+
suffix: suffix || void 0
|
|
4636
|
+
});
|
|
4637
|
+
} else if (staticText) {
|
|
4638
|
+
segments.push({ type: "static", value: staticText, optional: false });
|
|
4639
|
+
}
|
|
4640
|
+
}
|
|
4641
|
+
return segments;
|
|
4642
|
+
}
|
|
4643
|
+
|
|
4644
|
+
// src/build/prefix-tree-utils.ts
|
|
4023
4645
|
function flattenLeafEntries(prefixTree, routeManifest, result) {
|
|
4024
4646
|
function visit(node, ancestorStaticPrefixes) {
|
|
4025
4647
|
const children = node.children || {};
|
|
@@ -4060,6 +4682,219 @@ function buildRouteToStaticPrefix(prefixTree, result) {
|
|
|
4060
4682
|
visit(node);
|
|
4061
4683
|
}
|
|
4062
4684
|
}
|
|
4685
|
+
|
|
4686
|
+
// src/build/route-trie.ts
|
|
4687
|
+
function buildRouteTrie(routeManifest, routeAncestry, routeToStaticPrefix, routeTrailingSlash, prerenderRouteNames, passthroughRouteNames, responseTypeRoutes) {
|
|
4688
|
+
const root = {};
|
|
4689
|
+
for (const [routeName, pattern] of Object.entries(routeManifest)) {
|
|
4690
|
+
const ancestry = routeAncestry[routeName] || [];
|
|
4691
|
+
const staticPrefix = routeToStaticPrefix[routeName] || "";
|
|
4692
|
+
const trailingSlash = routeTrailingSlash?.[routeName];
|
|
4693
|
+
const responseType = responseTypeRoutes?.[routeName];
|
|
4694
|
+
const hasTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
|
|
4695
|
+
const normalizedPattern = hasTrailingSlash ? pattern.slice(0, -1) : pattern;
|
|
4696
|
+
const segments = parsePattern(normalizedPattern);
|
|
4697
|
+
insertRoute(root, segments, 0, {
|
|
4698
|
+
n: routeName,
|
|
4699
|
+
sp: staticPrefix,
|
|
4700
|
+
a: ancestry,
|
|
4701
|
+
...trailingSlash ? { ts: trailingSlash } : {},
|
|
4702
|
+
...prerenderRouteNames?.has(routeName) ? { pr: true } : {},
|
|
4703
|
+
...passthroughRouteNames?.has(routeName) ? { pt: true } : {},
|
|
4704
|
+
...responseType ? { rt: responseType } : {}
|
|
4705
|
+
});
|
|
4706
|
+
}
|
|
4707
|
+
sortSuffixParams(root);
|
|
4708
|
+
return root;
|
|
4709
|
+
}
|
|
4710
|
+
function sortSuffixParams(node) {
|
|
4711
|
+
if (node.xp) {
|
|
4712
|
+
const sorted = {};
|
|
4713
|
+
for (const suffix of Object.keys(node.xp).sort(
|
|
4714
|
+
(a, b) => b.length - a.length
|
|
4715
|
+
)) {
|
|
4716
|
+
sorted[suffix] = node.xp[suffix];
|
|
4717
|
+
}
|
|
4718
|
+
node.xp = sorted;
|
|
4719
|
+
for (const child of Object.values(node.xp)) {
|
|
4720
|
+
sortSuffixParams(child.c);
|
|
4721
|
+
}
|
|
4722
|
+
}
|
|
4723
|
+
if (node.s) {
|
|
4724
|
+
for (const child of Object.values(node.s)) {
|
|
4725
|
+
sortSuffixParams(child);
|
|
4726
|
+
}
|
|
4727
|
+
}
|
|
4728
|
+
if (node.p) {
|
|
4729
|
+
sortSuffixParams(node.p.c);
|
|
4730
|
+
}
|
|
4731
|
+
}
|
|
4732
|
+
function buildPerRouterTrie(manifest) {
|
|
4733
|
+
const ancestry = manifest._routeAncestry;
|
|
4734
|
+
if (!ancestry || Object.keys(ancestry).length === 0) {
|
|
4735
|
+
return null;
|
|
4736
|
+
}
|
|
4737
|
+
const routeToStaticPrefix = {};
|
|
4738
|
+
for (const name of Object.keys(manifest.routeManifest)) {
|
|
4739
|
+
routeToStaticPrefix[name] = "";
|
|
4740
|
+
}
|
|
4741
|
+
if (manifest.prefixTree) {
|
|
4742
|
+
buildRouteToStaticPrefix(manifest.prefixTree, routeToStaticPrefix);
|
|
4743
|
+
}
|
|
4744
|
+
return buildRouteTrie(
|
|
4745
|
+
manifest.routeManifest,
|
|
4746
|
+
ancestry,
|
|
4747
|
+
routeToStaticPrefix,
|
|
4748
|
+
manifest.routeTrailingSlash,
|
|
4749
|
+
manifest.prerenderRoutes ? new Set(manifest.prerenderRoutes) : void 0,
|
|
4750
|
+
manifest.passthroughRoutes ? new Set(manifest.passthroughRoutes) : void 0,
|
|
4751
|
+
manifest.responseTypeRoutes
|
|
4752
|
+
);
|
|
4753
|
+
}
|
|
4754
|
+
function insertRoute(node, segments, index, leaf) {
|
|
4755
|
+
const constraints = {};
|
|
4756
|
+
for (const seg of segments) {
|
|
4757
|
+
if (seg.type === "param") {
|
|
4758
|
+
if (seg.constraint) {
|
|
4759
|
+
constraints[seg.value] = seg.constraint;
|
|
4760
|
+
}
|
|
4761
|
+
}
|
|
4762
|
+
}
|
|
4763
|
+
const leafBase = {
|
|
4764
|
+
...leaf,
|
|
4765
|
+
...Object.keys(constraints).length > 0 ? { cv: constraints } : {}
|
|
4766
|
+
};
|
|
4767
|
+
insertSegments(node, segments, index, leafBase, []);
|
|
4768
|
+
}
|
|
4769
|
+
function toVariant(leaf, responseType) {
|
|
4770
|
+
return leaf.pa ? { routeKey: leaf.n, responseType, pa: leaf.pa } : { routeKey: leaf.n, responseType };
|
|
4771
|
+
}
|
|
4772
|
+
function mergeLeaves(existing, leaf) {
|
|
4773
|
+
if (!existing) return leaf;
|
|
4774
|
+
if (existing.rt && leaf.rt) {
|
|
4775
|
+
const merged = leaf;
|
|
4776
|
+
merged.nv = existing.nv || [];
|
|
4777
|
+
merged.nv.push(toVariant(existing, existing.rt));
|
|
4778
|
+
return merged;
|
|
4779
|
+
}
|
|
4780
|
+
if (leaf.rt && !existing.rt) {
|
|
4781
|
+
if (!existing.nv) {
|
|
4782
|
+
existing.nv = [];
|
|
4783
|
+
existing.rf = true;
|
|
4784
|
+
}
|
|
4785
|
+
existing.nv.push(toVariant(leaf, leaf.rt));
|
|
4786
|
+
return existing;
|
|
4787
|
+
}
|
|
4788
|
+
if (!leaf.rt && existing.rt) {
|
|
4789
|
+
if (!leaf.nv) leaf.nv = [];
|
|
4790
|
+
if (existing.nv) leaf.nv.push(...existing.nv);
|
|
4791
|
+
leaf.nv.push(toVariant(existing, existing.rt));
|
|
4792
|
+
return leaf;
|
|
4793
|
+
}
|
|
4794
|
+
return leaf;
|
|
4795
|
+
}
|
|
4796
|
+
function mergeLeaf(node, leaf) {
|
|
4797
|
+
node.r = mergeLeaves(node.r, leaf);
|
|
4798
|
+
}
|
|
4799
|
+
function buildLeaf(leafBase, paramNames) {
|
|
4800
|
+
return paramNames.length > 0 ? { ...leafBase, pa: [...paramNames] } : { ...leafBase };
|
|
4801
|
+
}
|
|
4802
|
+
function insertSegments(node, segments, index, leafBase, paramNames) {
|
|
4803
|
+
if (index >= segments.length) {
|
|
4804
|
+
mergeLeaf(node, buildLeaf(leafBase, paramNames));
|
|
4805
|
+
return;
|
|
4806
|
+
}
|
|
4807
|
+
const segment = segments[index];
|
|
4808
|
+
if (segment.type === "static") {
|
|
4809
|
+
if (!node.s) node.s = {};
|
|
4810
|
+
if (!node.s[segment.value]) node.s[segment.value] = {};
|
|
4811
|
+
insertSegments(
|
|
4812
|
+
node.s[segment.value],
|
|
4813
|
+
segments,
|
|
4814
|
+
index + 1,
|
|
4815
|
+
leafBase,
|
|
4816
|
+
paramNames
|
|
4817
|
+
);
|
|
4818
|
+
} else if (segment.type === "param") {
|
|
4819
|
+
if (segment.optional) {
|
|
4820
|
+
insertSegments(node, segments, index + 1, leafBase, paramNames);
|
|
4821
|
+
}
|
|
4822
|
+
if (segment.suffix) {
|
|
4823
|
+
if (!node.xp) node.xp = {};
|
|
4824
|
+
if (!node.xp[segment.suffix]) {
|
|
4825
|
+
node.xp[segment.suffix] = { n: segment.value, c: {} };
|
|
4826
|
+
}
|
|
4827
|
+
insertSegments(node.xp[segment.suffix].c, segments, index + 1, leafBase, [
|
|
4828
|
+
...paramNames,
|
|
4829
|
+
segment.value
|
|
4830
|
+
]);
|
|
4831
|
+
} else {
|
|
4832
|
+
if (!node.p) {
|
|
4833
|
+
node.p = { n: segment.value, c: {} };
|
|
4834
|
+
}
|
|
4835
|
+
insertSegments(node.p.c, segments, index + 1, leafBase, [
|
|
4836
|
+
...paramNames,
|
|
4837
|
+
segment.value
|
|
4838
|
+
]);
|
|
4839
|
+
}
|
|
4840
|
+
} else if (segment.type === "wildcard") {
|
|
4841
|
+
const wildLeaf = {
|
|
4842
|
+
...buildLeaf(leafBase, paramNames),
|
|
4843
|
+
pn: "*"
|
|
4844
|
+
};
|
|
4845
|
+
const existing = node.w ? { ...node.w } : void 0;
|
|
4846
|
+
const merged = mergeLeaves(existing, wildLeaf);
|
|
4847
|
+
node.w = merged;
|
|
4848
|
+
}
|
|
4849
|
+
}
|
|
4850
|
+
|
|
4851
|
+
// src/build/collect-fallback-refs.ts
|
|
4852
|
+
var CLIENT_REF = /* @__PURE__ */ Symbol.for("react.client.reference");
|
|
4853
|
+
var MAX_DEPTH = 40;
|
|
4854
|
+
var SYNTHETIC_PROPS = {
|
|
4855
|
+
error: new Error("rango: build-time fallback-chunk discovery"),
|
|
4856
|
+
reset: () => {
|
|
4857
|
+
},
|
|
4858
|
+
pathname: "/",
|
|
4859
|
+
info: { componentStack: "" }
|
|
4860
|
+
};
|
|
4861
|
+
function isReactNodeLike(v) {
|
|
4862
|
+
return Array.isArray(v) || typeof v === "object" && v !== null && "$$typeof" in v;
|
|
4863
|
+
}
|
|
4864
|
+
function walkElementTree(node, report, depth) {
|
|
4865
|
+
if (node == null || depth > MAX_DEPTH) return;
|
|
4866
|
+
if (Array.isArray(node)) {
|
|
4867
|
+
for (const child of node) walkElementTree(child, report, depth + 1);
|
|
4868
|
+
return;
|
|
4869
|
+
}
|
|
4870
|
+
if (typeof node !== "object") return;
|
|
4871
|
+
const el = node;
|
|
4872
|
+
const type = el.type;
|
|
4873
|
+
if (type?.$$typeof === CLIENT_REF && typeof type.$$id === "string") {
|
|
4874
|
+
report(type.$$id.split("#")[0]);
|
|
4875
|
+
}
|
|
4876
|
+
const props = el.props;
|
|
4877
|
+
if (props && typeof props === "object") {
|
|
4878
|
+
walkElementTree(props.children, report, depth + 1);
|
|
4879
|
+
for (const key in props) {
|
|
4880
|
+
if (key === "children") continue;
|
|
4881
|
+
const value = props[key];
|
|
4882
|
+
if (isReactNodeLike(value)) walkElementTree(value, report, depth + 1);
|
|
4883
|
+
}
|
|
4884
|
+
}
|
|
4885
|
+
}
|
|
4886
|
+
function collectFallbackClientRefs(boundary, report) {
|
|
4887
|
+
try {
|
|
4888
|
+
let node = boundary;
|
|
4889
|
+
if (typeof node === "function") {
|
|
4890
|
+
node = node(SYNTHETIC_PROPS);
|
|
4891
|
+
}
|
|
4892
|
+
walkElementTree(node, report, 0);
|
|
4893
|
+
} catch {
|
|
4894
|
+
}
|
|
4895
|
+
}
|
|
4896
|
+
|
|
4897
|
+
// src/vite/utils/manifest-utils.ts
|
|
4063
4898
|
function jsonParseExpression(value) {
|
|
4064
4899
|
const json = JSON.stringify(value);
|
|
4065
4900
|
const escaped = json.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
@@ -4067,6 +4902,9 @@ function jsonParseExpression(value) {
|
|
|
4067
4902
|
}
|
|
4068
4903
|
|
|
4069
4904
|
// src/context-var.ts
|
|
4905
|
+
function hasContextVars(variables) {
|
|
4906
|
+
return Object.keys(variables).length > 0 || Object.getOwnPropertySymbols(variables).length > 0;
|
|
4907
|
+
}
|
|
4070
4908
|
var NON_CACHEABLE_KEYS = /* @__PURE__ */ Symbol.for(
|
|
4071
4909
|
"rango:non-cacheable-keys"
|
|
4072
4910
|
);
|
|
@@ -4100,16 +4938,13 @@ function contextSet(variables, keyOrVar, value, options) {
|
|
|
4100
4938
|
import { createHash as createHash4 } from "node:crypto";
|
|
4101
4939
|
import {
|
|
4102
4940
|
copyFileSync,
|
|
4103
|
-
existsSync as
|
|
4941
|
+
existsSync as existsSync5,
|
|
4104
4942
|
mkdirSync,
|
|
4105
4943
|
rmSync,
|
|
4106
4944
|
statSync,
|
|
4107
4945
|
writeFileSync as writeFileSync2
|
|
4108
4946
|
} from "node:fs";
|
|
4109
|
-
import { resolve as
|
|
4110
|
-
function escapeRegExp2(str) {
|
|
4111
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4112
|
-
}
|
|
4947
|
+
import { resolve as resolve6 } from "node:path";
|
|
4113
4948
|
function encodePathParam(value) {
|
|
4114
4949
|
return String(value).split("/").map((segment) => encodeURIComponent(segment)).join("/");
|
|
4115
4950
|
}
|
|
@@ -4117,7 +4952,7 @@ function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
|
4117
4952
|
let result = pattern;
|
|
4118
4953
|
let hadOmittedOptional = false;
|
|
4119
4954
|
for (const [key, value] of Object.entries(params)) {
|
|
4120
|
-
const escaped =
|
|
4955
|
+
const escaped = escapeRegExp(key);
|
|
4121
4956
|
if (value === "") {
|
|
4122
4957
|
result = result.replace(
|
|
4123
4958
|
new RegExp(`:${escaped}(\\([^)]*\\))?(?!\\?)`),
|
|
@@ -4150,13 +4985,24 @@ async function runWithConcurrency(items, concurrency, fn) {
|
|
|
4150
4985
|
return;
|
|
4151
4986
|
}
|
|
4152
4987
|
let nextIndex = 0;
|
|
4988
|
+
let firstError;
|
|
4989
|
+
let failed = false;
|
|
4153
4990
|
async function worker() {
|
|
4154
|
-
while (nextIndex < items.length) {
|
|
4991
|
+
while (nextIndex < items.length && !failed) {
|
|
4155
4992
|
const idx = nextIndex++;
|
|
4156
|
-
|
|
4993
|
+
try {
|
|
4994
|
+
await fn(items[idx]);
|
|
4995
|
+
} catch (err) {
|
|
4996
|
+
if (!failed) {
|
|
4997
|
+
failed = true;
|
|
4998
|
+
firstError = err;
|
|
4999
|
+
}
|
|
5000
|
+
return;
|
|
5001
|
+
}
|
|
4157
5002
|
}
|
|
4158
5003
|
}
|
|
4159
5004
|
await Promise.all(Array.from({ length: limit }, () => worker()));
|
|
5005
|
+
if (failed) throw firstError;
|
|
4160
5006
|
}
|
|
4161
5007
|
function groupByConcurrency(entries) {
|
|
4162
5008
|
const map = /* @__PURE__ */ new Map();
|
|
@@ -4203,8 +5049,25 @@ function notifyOnError(registry, error, phase, routeKey, pathname, skipped) {
|
|
|
4203
5049
|
break;
|
|
4204
5050
|
}
|
|
4205
5051
|
}
|
|
5052
|
+
function resolvePrerenderError(registry, error, onError, label, elapsed, phase, routeKey, pathname) {
|
|
5053
|
+
const isSkip = error?.name === "Skip";
|
|
5054
|
+
if (isSkip || onError === "warn") {
|
|
5055
|
+
if (isSkip) {
|
|
5056
|
+
console.log(`[rango] SKIP ${label} (${elapsed}ms) - ${error.message}`);
|
|
5057
|
+
} else {
|
|
5058
|
+
console.warn(
|
|
5059
|
+
`[rango] WARN ${label} (${elapsed}ms) - render error, not pre-rendered (prerender.onError: "warn"): ${error.message}`
|
|
5060
|
+
);
|
|
5061
|
+
}
|
|
5062
|
+
notifyOnError(registry, error, phase, routeKey, pathname, true);
|
|
5063
|
+
return;
|
|
5064
|
+
}
|
|
5065
|
+
console.error(`[rango] FAIL ${label} (${elapsed}ms) - ${error.message}`);
|
|
5066
|
+
notifyOnError(registry, error, phase, routeKey, pathname);
|
|
5067
|
+
throw error;
|
|
5068
|
+
}
|
|
4206
5069
|
function getStagedAssetDir(projectRoot) {
|
|
4207
|
-
return
|
|
5070
|
+
return resolve6(projectRoot, "node_modules/.rangojs-router-build/rsc-assets");
|
|
4208
5071
|
}
|
|
4209
5072
|
function resetStagedBuildAssets(projectRoot) {
|
|
4210
5073
|
rmSync(getStagedAssetDir(projectRoot), { recursive: true, force: true });
|
|
@@ -4214,8 +5077,8 @@ function stageBuildAssetModule(projectRoot, prefix, exportValue) {
|
|
|
4214
5077
|
mkdirSync(stagedDir, { recursive: true });
|
|
4215
5078
|
const contentHash = createHash4("sha256").update(exportValue).digest("hex").slice(0, 8);
|
|
4216
5079
|
const fileName = `${prefix}-${contentHash}.js`;
|
|
4217
|
-
const filePath =
|
|
4218
|
-
if (!
|
|
5080
|
+
const filePath = resolve6(stagedDir, fileName);
|
|
5081
|
+
if (!existsSync5(filePath)) {
|
|
4219
5082
|
writeFileSync2(filePath, `export default ${exportValue};
|
|
4220
5083
|
`);
|
|
4221
5084
|
}
|
|
@@ -4223,12 +5086,12 @@ function stageBuildAssetModule(projectRoot, prefix, exportValue) {
|
|
|
4223
5086
|
}
|
|
4224
5087
|
function copyStagedBuildAssets(projectRoot, fileNames) {
|
|
4225
5088
|
const stagedDir = getStagedAssetDir(projectRoot);
|
|
4226
|
-
const distAssetsDir =
|
|
5089
|
+
const distAssetsDir = resolve6(projectRoot, "dist/rsc/assets");
|
|
4227
5090
|
mkdirSync(distAssetsDir, { recursive: true });
|
|
4228
5091
|
let totalBytes = 0;
|
|
4229
5092
|
for (const fileName of new Set(fileNames)) {
|
|
4230
|
-
const stagedPath =
|
|
4231
|
-
const distPath =
|
|
5093
|
+
const stagedPath = resolve6(stagedDir, fileName);
|
|
5094
|
+
const distPath = resolve6(distAssetsDir, fileName);
|
|
4232
5095
|
copyFileSync(stagedPath, distPath);
|
|
4233
5096
|
totalBytes += statSync(stagedPath).size;
|
|
4234
5097
|
}
|
|
@@ -4319,7 +5182,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
4319
5182
|
(performance.now() - getParamsStart).toFixed(1)
|
|
4320
5183
|
);
|
|
4321
5184
|
const concurrency = def.options?.concurrency ?? 1;
|
|
4322
|
-
const hasBuildVars =
|
|
5185
|
+
const hasBuildVars = hasContextVars(buildVars);
|
|
4323
5186
|
for (const params of paramsList) {
|
|
4324
5187
|
let url = substituteRouteParams(
|
|
4325
5188
|
pattern,
|
|
@@ -4404,6 +5267,7 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
4404
5267
|
const manifestEntries = {};
|
|
4405
5268
|
let doneCount = 0;
|
|
4406
5269
|
let skipCount = 0;
|
|
5270
|
+
const prerenderOnError = state.opts?.prerenderOnError ?? "fail";
|
|
4407
5271
|
const startTotal = performance.now();
|
|
4408
5272
|
const groups = groupByConcurrency(entries);
|
|
4409
5273
|
for (const group of groups) {
|
|
@@ -4446,10 +5310,9 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
4446
5310
|
const interceptKey = `${result.routeName}/${paramHash}/i`;
|
|
4447
5311
|
const interceptValue = JSON.stringify({
|
|
4448
5312
|
segments: [...result.segments, ...result.interceptSegments],
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
}
|
|
5313
|
+
// interceptHandles is the pre-encoded MERGED (main + intercept)
|
|
5314
|
+
// handle string (the producer merged before encoding).
|
|
5315
|
+
handles: result.interceptHandles ?? ""
|
|
4453
5316
|
});
|
|
4454
5317
|
manifestEntries[interceptKey] = stageBuildAssetModule(
|
|
4455
5318
|
state.projectRoot,
|
|
@@ -4464,34 +5327,19 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
4464
5327
|
doneCount++;
|
|
4465
5328
|
break;
|
|
4466
5329
|
} catch (err) {
|
|
4467
|
-
if (err.name === "Skip") {
|
|
4468
|
-
const elapsed2 = (performance.now() - startUrl).toFixed(0);
|
|
4469
|
-
console.log(
|
|
4470
|
-
`[rango] SKIP ${entry.urlPath.padEnd(40)} (${elapsed2}ms) - ${err.message}`
|
|
4471
|
-
);
|
|
4472
|
-
skipCount++;
|
|
4473
|
-
notifyOnError(
|
|
4474
|
-
registry,
|
|
4475
|
-
err,
|
|
4476
|
-
"prerender",
|
|
4477
|
-
entry.routeName,
|
|
4478
|
-
entry.urlPath,
|
|
4479
|
-
true
|
|
4480
|
-
);
|
|
4481
|
-
break;
|
|
4482
|
-
}
|
|
4483
5330
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
4484
|
-
|
|
4485
|
-
`[rango] FAIL ${entry.urlPath.padEnd(40)} (${elapsed}ms) - ${err.message}`
|
|
4486
|
-
);
|
|
4487
|
-
notifyOnError(
|
|
5331
|
+
resolvePrerenderError(
|
|
4488
5332
|
registry,
|
|
4489
5333
|
err,
|
|
5334
|
+
prerenderOnError,
|
|
5335
|
+
entry.urlPath.padEnd(40),
|
|
5336
|
+
elapsed,
|
|
4490
5337
|
"prerender",
|
|
4491
5338
|
entry.routeName,
|
|
4492
5339
|
entry.urlPath
|
|
4493
5340
|
);
|
|
4494
|
-
|
|
5341
|
+
skipCount++;
|
|
5342
|
+
break;
|
|
4495
5343
|
}
|
|
4496
5344
|
}
|
|
4497
5345
|
}
|
|
@@ -4526,6 +5374,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
4526
5374
|
let staticDone = 0;
|
|
4527
5375
|
let staticSkip = 0;
|
|
4528
5376
|
let totalStaticCount = 0;
|
|
5377
|
+
const prerenderOnError = state.opts?.prerenderOnError ?? "fail";
|
|
4529
5378
|
for (const [, exportNames] of state.resolvedStaticModules) {
|
|
4530
5379
|
totalStaticCount += exportNames.length;
|
|
4531
5380
|
}
|
|
@@ -4559,7 +5408,7 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
4559
5408
|
!state.isBuildMode
|
|
4560
5409
|
);
|
|
4561
5410
|
if (result) {
|
|
4562
|
-
const hasHandles =
|
|
5411
|
+
const hasHandles = result.handles !== "";
|
|
4563
5412
|
const exportValue = hasHandles ? JSON.stringify(result) : JSON.stringify(result.encoded);
|
|
4564
5413
|
manifestEntries[def.$$id] = stageBuildAssetModule(
|
|
4565
5414
|
state.projectRoot,
|
|
@@ -4573,22 +5422,18 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
4573
5422
|
break;
|
|
4574
5423
|
}
|
|
4575
5424
|
} catch (err) {
|
|
4576
|
-
if (err.name === "Skip") {
|
|
4577
|
-
const elapsed2 = (performance.now() - startHandler).toFixed(0);
|
|
4578
|
-
console.log(
|
|
4579
|
-
`[rango] SKIP ${name.padEnd(40)} (${elapsed2}ms) - ${err.message}`
|
|
4580
|
-
);
|
|
4581
|
-
staticSkip++;
|
|
4582
|
-
notifyOnError(registry, err, "static", void 0, void 0, true);
|
|
4583
|
-
handled = true;
|
|
4584
|
-
break;
|
|
4585
|
-
}
|
|
4586
5425
|
const elapsed = (performance.now() - startHandler).toFixed(0);
|
|
4587
|
-
|
|
4588
|
-
|
|
5426
|
+
resolvePrerenderError(
|
|
5427
|
+
registry,
|
|
5428
|
+
err,
|
|
5429
|
+
prerenderOnError,
|
|
5430
|
+
name.padEnd(40),
|
|
5431
|
+
elapsed,
|
|
5432
|
+
"static"
|
|
4589
5433
|
);
|
|
4590
|
-
|
|
4591
|
-
|
|
5434
|
+
staticSkip++;
|
|
5435
|
+
handled = true;
|
|
5436
|
+
break;
|
|
4592
5437
|
}
|
|
4593
5438
|
}
|
|
4594
5439
|
if (!handled) {
|
|
@@ -4762,8 +5607,8 @@ async function discoverRouters(state, rscEnv) {
|
|
|
4762
5607
|
computeProductionHash(state.projectRoot, refKey)
|
|
4763
5608
|
) : void 0;
|
|
4764
5609
|
const collectFromBoundaryNode = (node) => {
|
|
4765
|
-
if (collectClientFallbackRef
|
|
4766
|
-
|
|
5610
|
+
if (collectClientFallbackRef) {
|
|
5611
|
+
collectFallbackClientRefs(node, collectClientFallbackRef);
|
|
4767
5612
|
}
|
|
4768
5613
|
};
|
|
4769
5614
|
const manifestGenStart = debug10 ? performance.now() : 0;
|
|
@@ -4822,18 +5667,14 @@ async function discoverRouters(state, rscEnv) {
|
|
|
4822
5667
|
if (manifest.routeTrailingSlash) {
|
|
4823
5668
|
Object.assign(mergedRouteTrailingSlash, manifest.routeTrailingSlash);
|
|
4824
5669
|
}
|
|
4825
|
-
flattenLeafEntries(
|
|
4826
|
-
manifest.prefixTree,
|
|
4827
|
-
manifest.routeManifest,
|
|
4828
|
-
newMergedPrecomputedEntries
|
|
4829
|
-
);
|
|
4830
|
-
newPerRouterManifestDataMap.set(id, manifest.routeManifest);
|
|
4831
5670
|
const routerPrecomputed = [];
|
|
4832
5671
|
flattenLeafEntries(
|
|
4833
5672
|
manifest.prefixTree,
|
|
4834
5673
|
manifest.routeManifest,
|
|
4835
5674
|
routerPrecomputed
|
|
4836
5675
|
);
|
|
5676
|
+
newMergedPrecomputedEntries.push(...routerPrecomputed);
|
|
5677
|
+
newPerRouterManifestDataMap.set(id, manifest.routeManifest);
|
|
4837
5678
|
newPerRouterPrecomputedMap.set(id, routerPrecomputed);
|
|
4838
5679
|
console.log(
|
|
4839
5680
|
`[rango] Router "${id}" -> ${routeCount} routes (${staticRoutes} static, ${dynamicRoutes} dynamic)`
|
|
@@ -4857,8 +5698,7 @@ async function discoverRouters(state, rscEnv) {
|
|
|
4857
5698
|
let newMergedRouteTrie = null;
|
|
4858
5699
|
const trieStart = debug10 ? performance.now() : 0;
|
|
4859
5700
|
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
4860
|
-
|
|
4861
|
-
if (buildRouteTrie && mergedRouteAncestry) {
|
|
5701
|
+
if (mergedRouteAncestry) {
|
|
4862
5702
|
const routeToStaticPrefix = {};
|
|
4863
5703
|
for (const { manifest } of allManifests) {
|
|
4864
5704
|
for (const name of Object.keys(manifest.routeManifest)) {
|
|
@@ -4896,25 +5736,10 @@ async function discoverRouters(state, rscEnv) {
|
|
|
4896
5736
|
mergedResponseTypeRoutes
|
|
4897
5737
|
);
|
|
4898
5738
|
for (const { id, manifest } of allManifests) {
|
|
4899
|
-
|
|
4900
|
-
|
|
4901
|
-
|
|
4902
|
-
for (const name of Object.keys(manifest.routeManifest)) {
|
|
4903
|
-
perRouterStaticPrefix[name] = "";
|
|
5739
|
+
const perRouterTrie = buildPerRouterTrie(manifest);
|
|
5740
|
+
if (perRouterTrie) {
|
|
5741
|
+
newPerRouterTrieMap.set(id, perRouterTrie);
|
|
4904
5742
|
}
|
|
4905
|
-
buildRouteToStaticPrefix(manifest.prefixTree, perRouterStaticPrefix);
|
|
4906
|
-
const perRouterPrerenderNames = manifest.prerenderRoutes ? new Set(manifest.prerenderRoutes) : void 0;
|
|
4907
|
-
const perRouterPassthroughNames = manifest.passthroughRoutes ? new Set(manifest.passthroughRoutes) : void 0;
|
|
4908
|
-
const perRouterTrie = buildRouteTrie(
|
|
4909
|
-
manifest.routeManifest,
|
|
4910
|
-
manifest._routeAncestry,
|
|
4911
|
-
perRouterStaticPrefix,
|
|
4912
|
-
manifest.routeTrailingSlash,
|
|
4913
|
-
perRouterPrerenderNames,
|
|
4914
|
-
perRouterPassthroughNames,
|
|
4915
|
-
manifest.responseTypeRoutes
|
|
4916
|
-
);
|
|
4917
|
-
newPerRouterTrieMap.set(id, perRouterTrie);
|
|
4918
5743
|
}
|
|
4919
5744
|
}
|
|
4920
5745
|
}
|
|
@@ -4935,8 +5760,8 @@ async function discoverRouters(state, rscEnv) {
|
|
|
4935
5760
|
}
|
|
4936
5761
|
|
|
4937
5762
|
// src/vite/discovery/route-types-writer.ts
|
|
4938
|
-
import { dirname as dirname3, join as
|
|
4939
|
-
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as
|
|
5763
|
+
import { dirname as dirname3, join as join4, resolve as resolve7 } from "node:path";
|
|
5764
|
+
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync6, unlinkSync as unlinkSync2 } from "node:fs";
|
|
4940
5765
|
function filterUserNamedRoutes(manifest) {
|
|
4941
5766
|
const filtered = {};
|
|
4942
5767
|
for (const [name, pattern] of Object.entries(manifest)) {
|
|
@@ -4947,7 +5772,7 @@ function filterUserNamedRoutes(manifest) {
|
|
|
4947
5772
|
return filtered;
|
|
4948
5773
|
}
|
|
4949
5774
|
function writeGenFileIfChanged(state, outPath, source, opts) {
|
|
4950
|
-
const existing =
|
|
5775
|
+
const existing = existsSync6(outPath) ? readFileSync4(outPath, "utf-8") : null;
|
|
4951
5776
|
if (existing === source) return;
|
|
4952
5777
|
markSelfGenWrite(state, outPath, source);
|
|
4953
5778
|
writeFileSync3(outPath, source);
|
|
@@ -4965,10 +5790,10 @@ function writeRouteTypesFiles(state) {
|
|
|
4965
5790
|
if (state.perRouterManifests.length === 0) return;
|
|
4966
5791
|
try {
|
|
4967
5792
|
const entryDir = dirname3(
|
|
4968
|
-
|
|
5793
|
+
resolve7(state.projectRoot, state.resolvedEntryPath)
|
|
4969
5794
|
);
|
|
4970
|
-
const oldCombinedPath =
|
|
4971
|
-
if (
|
|
5795
|
+
const oldCombinedPath = join4(entryDir, "named-routes.gen.ts");
|
|
5796
|
+
if (existsSync6(oldCombinedPath)) {
|
|
4972
5797
|
unlinkSync2(oldCombinedPath);
|
|
4973
5798
|
console.log(
|
|
4974
5799
|
`[rango] Removed stale combined route types: ${oldCombinedPath}`
|
|
@@ -5049,7 +5874,7 @@ function supplementGenFilesWithRuntimeRoutes(state) {
|
|
|
5049
5874
|
}
|
|
5050
5875
|
|
|
5051
5876
|
// src/vite/discovery/virtual-module-codegen.ts
|
|
5052
|
-
import { dirname as dirname4, basename, join as
|
|
5877
|
+
import { dirname as dirname4, basename, join as join5 } from "node:path";
|
|
5053
5878
|
function generateRoutesManifestModule(state) {
|
|
5054
5879
|
const hasManifest = state.mergedRouteManifest && Object.keys(state.mergedRouteManifest).length > 0;
|
|
5055
5880
|
if (hasManifest) {
|
|
@@ -5064,7 +5889,7 @@ function generateRoutesManifestModule(state) {
|
|
|
5064
5889
|
/\.(tsx?|jsx?)$/,
|
|
5065
5890
|
""
|
|
5066
5891
|
);
|
|
5067
|
-
const genPath =
|
|
5892
|
+
const genPath = join5(
|
|
5068
5893
|
routerDir,
|
|
5069
5894
|
`${routerBasename}.named-routes.gen.js`
|
|
5070
5895
|
).replaceAll("\\", "/");
|
|
@@ -5149,7 +5974,7 @@ function generatePerRouterModule(state, routerId) {
|
|
|
5149
5974
|
/\.(tsx?|jsx?)$/,
|
|
5150
5975
|
""
|
|
5151
5976
|
);
|
|
5152
|
-
const genPath =
|
|
5977
|
+
const genPath = join5(
|
|
5153
5978
|
routerDir,
|
|
5154
5979
|
`${routerBasename}.named-routes.gen.js`
|
|
5155
5980
|
).replaceAll("\\", "/");
|
|
@@ -5172,17 +5997,17 @@ function generatePerRouterModule(state, routerId) {
|
|
|
5172
5997
|
`export const precomputedEntries = ${jsonParseExpression(entries)};`
|
|
5173
5998
|
);
|
|
5174
5999
|
}
|
|
5175
|
-
return lines.join("\n") || "
|
|
6000
|
+
return lines.join("\n") || "";
|
|
5176
6001
|
}
|
|
5177
6002
|
|
|
5178
6003
|
// src/vite/discovery/bundle-postprocess.ts
|
|
5179
|
-
import { resolve as
|
|
5180
|
-
import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as
|
|
6004
|
+
import { resolve as resolve8 } from "node:path";
|
|
6005
|
+
import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync7 } from "node:fs";
|
|
5181
6006
|
function postprocessBundle(state) {
|
|
5182
6007
|
const hasPrerenderData = state.prerenderManifestEntries && Object.keys(state.prerenderManifestEntries).length > 0;
|
|
5183
6008
|
const hasStaticData = state.staticManifestEntries && Object.keys(state.staticManifestEntries).length > 0;
|
|
5184
6009
|
if (!hasPrerenderData && !hasStaticData) return;
|
|
5185
|
-
const rscEntryPath =
|
|
6010
|
+
const rscEntryPath = resolve8(
|
|
5186
6011
|
state.projectRoot,
|
|
5187
6012
|
"dist/rsc",
|
|
5188
6013
|
state.rscEntryFileName ?? "index.js"
|
|
@@ -5203,7 +6028,7 @@ function postprocessBundle(state) {
|
|
|
5203
6028
|
];
|
|
5204
6029
|
for (const target of evictionTargets) {
|
|
5205
6030
|
for (const info of target.infos) {
|
|
5206
|
-
const chunkPath =
|
|
6031
|
+
const chunkPath = resolve8(state.projectRoot, "dist/rsc", info.fileName);
|
|
5207
6032
|
try {
|
|
5208
6033
|
const code = readFileSync5(chunkPath, "utf-8");
|
|
5209
6034
|
const result = evictHandlerCode(
|
|
@@ -5228,7 +6053,7 @@ function postprocessBundle(state) {
|
|
|
5228
6053
|
}
|
|
5229
6054
|
state.handlerChunkInfoMap.clear();
|
|
5230
6055
|
state.staticHandlerChunkInfoMap.clear();
|
|
5231
|
-
if (hasPrerenderData &&
|
|
6056
|
+
if (hasPrerenderData && existsSync7(rscEntryPath)) {
|
|
5232
6057
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
5233
6058
|
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
5234
6059
|
try {
|
|
@@ -5243,12 +6068,12 @@ function postprocessBundle(state) {
|
|
|
5243
6068
|
manifestMap[key] = `./assets/${assetFileName}`;
|
|
5244
6069
|
}
|
|
5245
6070
|
const manifestCode = [
|
|
5246
|
-
`const m
|
|
6071
|
+
`const m=${jsonParseExpression(manifestMap)};`,
|
|
5247
6072
|
`export function loadPrerenderAsset(s){return import(s)}`,
|
|
5248
6073
|
`export default m;`,
|
|
5249
6074
|
""
|
|
5250
6075
|
].join("\n");
|
|
5251
|
-
const manifestPath =
|
|
6076
|
+
const manifestPath = resolve8(
|
|
5252
6077
|
state.projectRoot,
|
|
5253
6078
|
"dist/rsc/__prerender-manifest.js"
|
|
5254
6079
|
);
|
|
@@ -5268,7 +6093,7 @@ function postprocessBundle(state) {
|
|
|
5268
6093
|
}
|
|
5269
6094
|
}
|
|
5270
6095
|
}
|
|
5271
|
-
if (hasStaticData &&
|
|
6096
|
+
if (hasStaticData && existsSync7(rscEntryPath)) {
|
|
5272
6097
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
5273
6098
|
if (!rscCode.includes("__static-manifest.js")) {
|
|
5274
6099
|
try {
|
|
@@ -5286,7 +6111,7 @@ function postprocessBundle(state) {
|
|
|
5286
6111
|
}
|
|
5287
6112
|
const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;
|
|
5288
6113
|
`;
|
|
5289
|
-
const manifestPath =
|
|
6114
|
+
const manifestPath = resolve8(
|
|
5290
6115
|
state.projectRoot,
|
|
5291
6116
|
"dist/rsc/__static-manifest.js"
|
|
5292
6117
|
);
|
|
@@ -5318,8 +6143,8 @@ function createDiscoveryGate(s, debug11) {
|
|
|
5318
6143
|
let pendingEvents = false;
|
|
5319
6144
|
const beginGate = () => {
|
|
5320
6145
|
if (gatePending) return;
|
|
5321
|
-
s.discoveryDone = new Promise((
|
|
5322
|
-
gateResolver =
|
|
6146
|
+
s.discoveryDone = new Promise((resolve11) => {
|
|
6147
|
+
gateResolver = resolve11;
|
|
5323
6148
|
});
|
|
5324
6149
|
gatePending = true;
|
|
5325
6150
|
};
|
|
@@ -5411,15 +6236,15 @@ function selectForwardableResolvePlugins(plugins) {
|
|
|
5411
6236
|
}
|
|
5412
6237
|
function pickForwardedRunnerConfig(config) {
|
|
5413
6238
|
const r = config.resolve ?? {};
|
|
5414
|
-
const
|
|
5415
|
-
if (r.alias !== void 0)
|
|
5416
|
-
if (r.dedupe !== void 0)
|
|
5417
|
-
if (r.conditions !== void 0)
|
|
5418
|
-
if (r.mainFields !== void 0)
|
|
5419
|
-
if (r.extensions !== void 0)
|
|
6239
|
+
const resolve11 = {};
|
|
6240
|
+
if (r.alias !== void 0) resolve11.alias = r.alias;
|
|
6241
|
+
if (r.dedupe !== void 0) resolve11.dedupe = r.dedupe;
|
|
6242
|
+
if (r.conditions !== void 0) resolve11.conditions = r.conditions;
|
|
6243
|
+
if (r.mainFields !== void 0) resolve11.mainFields = r.mainFields;
|
|
6244
|
+
if (r.extensions !== void 0) resolve11.extensions = r.extensions;
|
|
5420
6245
|
if (r.preserveSymlinks !== void 0)
|
|
5421
|
-
|
|
5422
|
-
if (r.tsconfigPaths !== void 0)
|
|
6246
|
+
resolve11.preserveSymlinks = r.preserveSymlinks;
|
|
6247
|
+
if (r.tsconfigPaths !== void 0) resolve11.tsconfigPaths = r.tsconfigPaths;
|
|
5423
6248
|
const userOxc = config.oxc;
|
|
5424
6249
|
const userJsx = userOxc && typeof userOxc === "object" && typeof userOxc.jsx === "object" && userOxc.jsx !== null ? userOxc.jsx : {};
|
|
5425
6250
|
const oxc = userOxc && typeof userOxc === "object" ? {
|
|
@@ -5427,7 +6252,7 @@ function pickForwardedRunnerConfig(config) {
|
|
|
5427
6252
|
jsx: { ...userJsx, runtime: "automatic", importSource: "react" }
|
|
5428
6253
|
} : { jsx: { runtime: "automatic", importSource: "react" } };
|
|
5429
6254
|
return {
|
|
5430
|
-
resolve:
|
|
6255
|
+
resolve: resolve11,
|
|
5431
6256
|
define: config.define,
|
|
5432
6257
|
oxc
|
|
5433
6258
|
};
|
|
@@ -5505,11 +6330,11 @@ async function resolveBuildEnv(option, factoryCtx) {
|
|
|
5505
6330
|
);
|
|
5506
6331
|
}
|
|
5507
6332
|
try {
|
|
5508
|
-
const userRequire =
|
|
5509
|
-
|
|
6333
|
+
const userRequire = createRequire3(
|
|
6334
|
+
resolve9(factoryCtx.root, "package.json")
|
|
5510
6335
|
);
|
|
5511
6336
|
const wranglerPath = userRequire.resolve("wrangler");
|
|
5512
|
-
const { getPlatformProxy } = await import(
|
|
6337
|
+
const { getPlatformProxy } = await import(pathToFileURL2(wranglerPath).href);
|
|
5513
6338
|
const proxy = await getPlatformProxy();
|
|
5514
6339
|
return {
|
|
5515
6340
|
env: proxy.env,
|
|
@@ -5571,6 +6396,7 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
5571
6396
|
},
|
|
5572
6397
|
configResolved(config) {
|
|
5573
6398
|
s.projectRoot = config.root;
|
|
6399
|
+
s.scanFilter = opts?.discovery ? createScanFilter(s.projectRoot, opts.discovery) : void 0;
|
|
5574
6400
|
s.isBuildMode = config.command === "build";
|
|
5575
6401
|
viteCommand = config.command;
|
|
5576
6402
|
viteMode = config.mode;
|
|
@@ -5605,8 +6431,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
5605
6431
|
if (globalThis.__rscRouterDiscoveryActive) return;
|
|
5606
6432
|
s.devServer = server;
|
|
5607
6433
|
let resolveDiscovery;
|
|
5608
|
-
const discoveryPromise = new Promise((
|
|
5609
|
-
resolveDiscovery =
|
|
6434
|
+
const discoveryPromise = new Promise((resolve11) => {
|
|
6435
|
+
resolveDiscovery = resolve11;
|
|
5610
6436
|
});
|
|
5611
6437
|
const gate = createDiscoveryGate(s, debugDiscovery);
|
|
5612
6438
|
const beginDiscoveryGate = gate.beginGate;
|
|
@@ -5962,10 +6788,9 @@ ${err.stack}`
|
|
|
5962
6788
|
if (wantIntercept && result.interceptSegments?.length) {
|
|
5963
6789
|
payload = {
|
|
5964
6790
|
segments: [...result.segments, ...result.interceptSegments],
|
|
5965
|
-
handles
|
|
5966
|
-
|
|
5967
|
-
|
|
5968
|
-
}
|
|
6791
|
+
// Pre-encoded MERGED handle string from the producer (handles are
|
|
6792
|
+
// Flight-encoded so Promise/ReactNode values survive the wire).
|
|
6793
|
+
handles: result.interceptHandles ?? ""
|
|
5969
6794
|
};
|
|
5970
6795
|
} else {
|
|
5971
6796
|
payload = { segments: result.segments, handles: result.handles };
|
|
@@ -5974,9 +6799,11 @@ ${err.stack}`
|
|
|
5974
6799
|
logResult(200, `match ${result.routeName}`);
|
|
5975
6800
|
return;
|
|
5976
6801
|
} catch (err) {
|
|
5977
|
-
|
|
5978
|
-
|
|
5979
|
-
|
|
6802
|
+
if (err?.name !== "Skip") {
|
|
6803
|
+
console.warn(
|
|
6804
|
+
`[rango] Dev prerender error for ${pathname} (serving live instead): ${err.message}`
|
|
6805
|
+
);
|
|
6806
|
+
}
|
|
5980
6807
|
}
|
|
5981
6808
|
}
|
|
5982
6809
|
res.statusCode = 404;
|
|
@@ -6183,7 +7010,7 @@ ${err.stack}`
|
|
|
6183
7010
|
if (hasCreateRouter) {
|
|
6184
7011
|
const nestedRouterConflict = findNestedRouterConflict([
|
|
6185
7012
|
...s.cachedRouterFiles ?? [],
|
|
6186
|
-
|
|
7013
|
+
resolve9(filePath)
|
|
6187
7014
|
]);
|
|
6188
7015
|
if (nestedRouterConflict) {
|
|
6189
7016
|
server.config.logger.error(
|
|
@@ -6495,7 +7322,11 @@ async function rango(options) {
|
|
|
6495
7322
|
];
|
|
6496
7323
|
const pkg = getPublishedPackageName();
|
|
6497
7324
|
const nested = (spec) => `${pkg} > ${spec}`;
|
|
6498
|
-
const routerRef = {
|
|
7325
|
+
const routerRef = {
|
|
7326
|
+
path: void 0,
|
|
7327
|
+
kind: "router"
|
|
7328
|
+
};
|
|
7329
|
+
const explicitHostRouter = preset !== "cloudflare" ? resolvedOptions.hostRouter : void 0;
|
|
6499
7330
|
const prerenderEnabled = true;
|
|
6500
7331
|
if (preset === "cloudflare") {
|
|
6501
7332
|
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
@@ -6508,8 +7339,6 @@ async function rango(options) {
|
|
|
6508
7339
|
enforce: "pre",
|
|
6509
7340
|
config() {
|
|
6510
7341
|
return {
|
|
6511
|
-
// Exclude rsc-router modules from optimization to prevent module duplication
|
|
6512
|
-
// This ensures the same Context instance is used by both browser entry and RSC proxy modules
|
|
6513
7342
|
optimizeDeps: {
|
|
6514
7343
|
exclude: excludeDeps,
|
|
6515
7344
|
rolldownOptions: sharedRolldownOptions
|
|
@@ -6532,21 +7361,12 @@ async function rango(options) {
|
|
|
6532
7361
|
client: {
|
|
6533
7362
|
build: {
|
|
6534
7363
|
rollupOptions: {
|
|
6535
|
-
// FILE_NAME_CONFLICT (and any other client-build warning) is
|
|
6536
|
-
// emitted by the CLIENT environment build, which consults THIS
|
|
6537
|
-
// env's onwarn -- Vite 8's environment builds do NOT propagate
|
|
6538
|
-
// the top-level build.rollupOptions.onwarn into the client env.
|
|
6539
|
-
// Wire it here so the suppression runs where the conflicts
|
|
6540
|
-
// originate (the top-level handler is invoked 0x for these; the
|
|
6541
|
-
// client-env handler is invoked for all of them).
|
|
6542
7364
|
onwarn,
|
|
6543
7365
|
output: {
|
|
6544
7366
|
manualChunks: getManualChunks
|
|
6545
7367
|
}
|
|
6546
7368
|
}
|
|
6547
7369
|
},
|
|
6548
|
-
// Pre-bundle rsc-html-stream to prevent discovery during first request
|
|
6549
|
-
// Exclude rsc-router modules to ensure same Context instance
|
|
6550
7370
|
optimizeDeps: {
|
|
6551
7371
|
include: [nested("rsc-html-stream/client")],
|
|
6552
7372
|
exclude: excludeDeps,
|
|
@@ -6554,12 +7374,9 @@ async function rango(options) {
|
|
|
6554
7374
|
}
|
|
6555
7375
|
},
|
|
6556
7376
|
ssr: {
|
|
6557
|
-
// Build SSR inside RSC directory so wrangler can deploy self-contained dist/rsc
|
|
6558
7377
|
build: {
|
|
6559
7378
|
outDir: "./dist/rsc/ssr"
|
|
6560
7379
|
},
|
|
6561
|
-
// Pre-bundle SSR entry and React for proper module linking with childEnvironments
|
|
6562
|
-
// All deps must be listed to avoid late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
|
|
6563
7380
|
optimizeDeps: {
|
|
6564
7381
|
entries: [finalEntries.ssr],
|
|
6565
7382
|
include: [
|
|
@@ -6579,10 +7396,7 @@ async function rango(options) {
|
|
|
6579
7396
|
}
|
|
6580
7397
|
},
|
|
6581
7398
|
rsc: {
|
|
6582
|
-
// RSC environment needs exclude list and esbuild options
|
|
6583
|
-
// Exclude rsc-router modules to prevent createContext in RSC environment
|
|
6584
7399
|
optimizeDeps: {
|
|
6585
|
-
// Pre-bundle all RSC deps to prevent late discovery triggering ERR_OUTDATED_OPTIMIZED_DEP
|
|
6586
7400
|
include: [
|
|
6587
7401
|
"react",
|
|
6588
7402
|
"react/jsx-runtime",
|
|
@@ -6620,17 +7434,41 @@ async function rango(options) {
|
|
|
6620
7434
|
name: "@rangojs/router:auto-discover",
|
|
6621
7435
|
config(userConfig) {
|
|
6622
7436
|
if (routerRef.path) return;
|
|
6623
|
-
const root = userConfig.root ?
|
|
7437
|
+
const root = userConfig.root ? resolve10(process.cwd(), userConfig.root) : process.cwd();
|
|
7438
|
+
const toRootRelative = (abs) => (abs.startsWith(root) ? "./" + abs.slice(root.length + 1) : abs).replaceAll("\\", "/");
|
|
7439
|
+
const bulletList = (files) => files.map((f) => " - " + toRootRelative(f)).join("\n");
|
|
7440
|
+
if (explicitHostRouter) {
|
|
7441
|
+
routerRef.path = explicitHostRouter.replaceAll("\\", "/");
|
|
7442
|
+
routerRef.kind = "host";
|
|
7443
|
+
return;
|
|
7444
|
+
}
|
|
7445
|
+
const hostCandidates = findHostRouterFiles(root);
|
|
7446
|
+
if (hostCandidates.length === 1) {
|
|
7447
|
+
routerRef.path = toRootRelative(hostCandidates[0]);
|
|
7448
|
+
routerRef.kind = "host";
|
|
7449
|
+
return;
|
|
7450
|
+
}
|
|
7451
|
+
if (hostCandidates.length > 1) {
|
|
7452
|
+
throw new Error(
|
|
7453
|
+
`[rango] Multiple host routers found:
|
|
7454
|
+
${bulletList(hostCandidates)}
|
|
7455
|
+
|
|
7456
|
+
Set the \`hostRouter\` option to the entry to serve, e.g. rango({ preset: "${preset}", hostRouter: "./src/worker.rsc.tsx" }).`
|
|
7457
|
+
);
|
|
7458
|
+
}
|
|
6624
7459
|
const candidates = findRouterFiles(root);
|
|
6625
7460
|
if (candidates.length === 1) {
|
|
6626
|
-
|
|
6627
|
-
routerRef.
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
6631
|
-
|
|
6632
|
-
|
|
6633
|
-
${
|
|
7461
|
+
routerRef.path = toRootRelative(candidates[0]);
|
|
7462
|
+
routerRef.kind = "router";
|
|
7463
|
+
return;
|
|
7464
|
+
}
|
|
7465
|
+
if (candidates.length > 1) {
|
|
7466
|
+
throw new Error(
|
|
7467
|
+
`[rango] Multiple routers found:
|
|
7468
|
+
${bulletList(candidates)}
|
|
7469
|
+
|
|
7470
|
+
If this is a multi-app host router, export a createHostRouter() instance and set the \`hostRouter\` option (e.g. rango({ preset: "${preset}", hostRouter: "./src/worker.rsc.tsx" })), or use preset: "cloudflare" where you own the worker entry.`
|
|
7471
|
+
);
|
|
6634
7472
|
}
|
|
6635
7473
|
}
|
|
6636
7474
|
});
|
|
@@ -6644,8 +7482,12 @@ ${list}`);
|
|
|
6644
7482
|
plugins.push({
|
|
6645
7483
|
name: "@rangojs/router:rsc-integration",
|
|
6646
7484
|
enforce: "pre",
|
|
6647
|
-
config() {
|
|
7485
|
+
config(_userConfig, configEnv) {
|
|
7486
|
+
const vercelDefine = preset === "vercel" && configEnv.command === "build" ? { "process.env.NODE_ENV": JSON.stringify("production") } : void 0;
|
|
7487
|
+
const vercelServerEnv = preset === "vercel" ? { resolve: { noExternal: true } } : void 0;
|
|
7488
|
+
const vercelServerInclude = preset === "vercel" && configEnv.command === "serve" ? ["@vercel/functions"] : [];
|
|
6648
7489
|
return {
|
|
7490
|
+
...vercelDefine ? { define: vercelDefine } : {},
|
|
6649
7491
|
optimizeDeps: {
|
|
6650
7492
|
exclude: excludeDeps,
|
|
6651
7493
|
rolldownOptions: sharedRolldownOptions
|
|
@@ -6668,13 +7510,6 @@ ${list}`);
|
|
|
6668
7510
|
client: {
|
|
6669
7511
|
build: {
|
|
6670
7512
|
rollupOptions: {
|
|
6671
|
-
// FILE_NAME_CONFLICT (and any other client-build warning) is
|
|
6672
|
-
// emitted by the CLIENT environment build, which consults THIS
|
|
6673
|
-
// env's onwarn -- Vite 8's environment builds do NOT propagate
|
|
6674
|
-
// the top-level build.rollupOptions.onwarn into the client env.
|
|
6675
|
-
// Wire it here so the suppression runs where the conflicts
|
|
6676
|
-
// originate (the top-level handler is invoked 0x for these; the
|
|
6677
|
-
// client-env handler is invoked for all of them).
|
|
6678
7513
|
onwarn,
|
|
6679
7514
|
output: {
|
|
6680
7515
|
manualChunks: getManualChunks
|
|
@@ -6695,6 +7530,7 @@ ${list}`);
|
|
|
6695
7530
|
}
|
|
6696
7531
|
},
|
|
6697
7532
|
ssr: {
|
|
7533
|
+
...vercelServerEnv ?? {},
|
|
6698
7534
|
optimizeDeps: {
|
|
6699
7535
|
entries: [VIRTUAL_IDS.ssr],
|
|
6700
7536
|
include: [
|
|
@@ -6706,13 +7542,15 @@ ${list}`);
|
|
|
6706
7542
|
"react/jsx-dev-runtime",
|
|
6707
7543
|
nested(
|
|
6708
7544
|
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
6709
|
-
)
|
|
7545
|
+
),
|
|
7546
|
+
...vercelServerInclude
|
|
6710
7547
|
],
|
|
6711
7548
|
exclude: excludeDeps,
|
|
6712
7549
|
rolldownOptions: sharedRolldownOptions
|
|
6713
7550
|
}
|
|
6714
7551
|
},
|
|
6715
7552
|
rsc: {
|
|
7553
|
+
...vercelServerEnv ?? {},
|
|
6716
7554
|
optimizeDeps: {
|
|
6717
7555
|
entries: [VIRTUAL_IDS.rsc],
|
|
6718
7556
|
include: [
|
|
@@ -6721,8 +7559,15 @@ ${list}`);
|
|
|
6721
7559
|
"react/jsx-dev-runtime",
|
|
6722
7560
|
nested(
|
|
6723
7561
|
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
6724
|
-
)
|
|
7562
|
+
),
|
|
7563
|
+
...vercelServerInclude
|
|
6725
7564
|
],
|
|
7565
|
+
// Vite 8 does not propagate the top-level optimizeDeps.exclude
|
|
7566
|
+
// (set in config()) to non-client envs, so the rsc env must set
|
|
7567
|
+
// it explicitly — mirroring the node ssr env and the cloudflare
|
|
7568
|
+
// rsc env. Without it a strict-pnpm npm-installed app can try to
|
|
7569
|
+
// pre-bundle the router's own subpath entries and fail.
|
|
7570
|
+
exclude: excludeDeps,
|
|
6726
7571
|
rolldownOptions: sharedRolldownOptions
|
|
6727
7572
|
}
|
|
6728
7573
|
}
|
|
@@ -6732,7 +7577,11 @@ ${list}`);
|
|
|
6732
7577
|
configResolved(config) {
|
|
6733
7578
|
if (showBanner) {
|
|
6734
7579
|
const mode = config.command === "serve" ? process.argv.includes("preview") ? "preview" : "dev" : "build";
|
|
6735
|
-
printBanner(
|
|
7580
|
+
printBanner(
|
|
7581
|
+
mode,
|
|
7582
|
+
preset === "vercel" ? "vercel" : "node",
|
|
7583
|
+
rangoVersion
|
|
7584
|
+
);
|
|
6736
7585
|
}
|
|
6737
7586
|
const rscMinimalCount = config.plugins.filter(
|
|
6738
7587
|
(p) => p.name === "rsc:minimal"
|
|
@@ -6765,8 +7614,7 @@ ${list}`);
|
|
|
6765
7614
|
return;
|
|
6766
7615
|
try {
|
|
6767
7616
|
const source = readFileSync7(file, "utf-8");
|
|
6768
|
-
|
|
6769
|
-
if (trimmed.startsWith('"use client"') || trimmed.startsWith("'use client'")) {
|
|
7617
|
+
if (hasUseClientDirective(source)) {
|
|
6770
7618
|
return [];
|
|
6771
7619
|
}
|
|
6772
7620
|
} catch {
|
|
@@ -6790,9 +7638,16 @@ ${list}`);
|
|
|
6790
7638
|
enableBuildPrerender: prerenderEnabled,
|
|
6791
7639
|
buildEnv: options?.buildEnv,
|
|
6792
7640
|
preset,
|
|
7641
|
+
prerenderOnError: options?.prerender?.onError,
|
|
7642
|
+
discovery: options?.discovery,
|
|
6793
7643
|
clientChunkCtx
|
|
6794
7644
|
})
|
|
6795
7645
|
);
|
|
7646
|
+
if (preset === "vercel") {
|
|
7647
|
+
plugins.push(
|
|
7648
|
+
createVercelOutputPlugin(resolvedOptions)
|
|
7649
|
+
);
|
|
7650
|
+
}
|
|
6796
7651
|
debugConfig?.(
|
|
6797
7652
|
"rango(%s) setup done: %d plugin(s) (%sms)",
|
|
6798
7653
|
preset,
|
|
@@ -6805,7 +7660,7 @@ ${list}`);
|
|
|
6805
7660
|
// src/vite/plugins/refresh-cmd.ts
|
|
6806
7661
|
function poke() {
|
|
6807
7662
|
return {
|
|
6808
|
-
name: "
|
|
7663
|
+
name: "@rangojs/router:poke",
|
|
6809
7664
|
apply: "serve",
|
|
6810
7665
|
configureServer(server) {
|
|
6811
7666
|
const stdin = process.stdin;
|