@rangojs/router 0.0.0-experimental.9c9afef3 → 0.0.0-experimental.9eb4192e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -38
- package/dist/bin/rango.js +130 -47
- package/dist/vite/index.js +1543 -574
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +7 -5
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/handler-use/SKILL.md +362 -0
- package/skills/hooks/SKILL.md +28 -20
- package/skills/intercept/SKILL.md +20 -0
- package/skills/layout/SKILL.md +22 -0
- package/skills/links/SKILL.md +91 -17
- package/skills/loader/SKILL.md +35 -2
- package/skills/middleware/SKILL.md +34 -3
- package/skills/migrate-nextjs/SKILL.md +560 -0
- package/skills/migrate-react-router/SKILL.md +765 -0
- package/skills/parallel/SKILL.md +59 -0
- package/skills/prerender/SKILL.md +110 -68
- package/skills/rango/SKILL.md +24 -22
- package/skills/response-routes/SKILL.md +8 -0
- package/skills/route/SKILL.md +24 -0
- package/skills/router-setup/SKILL.md +35 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/typesafety/SKILL.md +3 -1
- package/src/__internal.ts +1 -1
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/navigation-bridge.ts +87 -6
- package/src/browser/navigation-client.ts +128 -68
- package/src/browser/navigation-store.ts +68 -9
- package/src/browser/partial-update.ts +60 -7
- package/src/browser/prefetch/cache.ts +129 -21
- package/src/browser/prefetch/fetch.ts +156 -18
- package/src/browser/prefetch/queue.ts +36 -5
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +72 -8
- package/src/browser/react/NavigationProvider.tsx +57 -11
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/use-handle.ts +9 -58
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +11 -1
- package/src/browser/react/use-router.ts +29 -9
- package/src/browser/rsc-router.tsx +60 -9
- package/src/browser/scroll-restoration.ts +10 -8
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/server-action-bridge.ts +8 -17
- package/src/browser/types.ts +37 -5
- package/src/build/generate-manifest.ts +6 -6
- package/src/build/generate-route-types.ts +3 -0
- package/src/build/route-trie.ts +50 -24
- package/src/build/route-types/include-resolution.ts +8 -1
- package/src/build/route-types/router-processing.ts +211 -72
- package/src/build/route-types/scan-filter.ts +8 -1
- package/src/cache/cf/cf-cache-store.ts +5 -7
- package/src/client.tsx +84 -230
- package/src/handle.ts +40 -0
- package/src/index.rsc.ts +6 -1
- package/src/index.ts +49 -6
- package/src/outlet-context.ts +1 -1
- package/src/prerender/store.ts +5 -4
- package/src/prerender.ts +138 -77
- package/src/response-utils.ts +28 -0
- package/src/reverse.ts +27 -2
- package/src/route-definition/dsl-helpers.ts +210 -35
- package/src/route-definition/helpers-types.ts +61 -14
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +9 -1
- package/src/route-definition/resolve-handler-use.ts +155 -0
- package/src/route-types.ts +18 -0
- package/src/router/content-negotiation.ts +100 -1
- package/src/router/handler-context.ts +70 -17
- package/src/router/intercept-resolution.ts +9 -4
- package/src/router/lazy-includes.ts +6 -6
- package/src/router/loader-resolution.ts +153 -21
- package/src/router/manifest.ts +22 -13
- package/src/router/match-api.ts +127 -192
- package/src/router/match-middleware/cache-lookup.ts +28 -8
- package/src/router/match-middleware/segment-resolution.ts +53 -0
- package/src/router/match-result.ts +82 -4
- package/src/router/middleware-types.ts +2 -28
- package/src/router/middleware.ts +32 -7
- package/src/router/navigation-snapshot.ts +182 -0
- package/src/router/pattern-matching.ts +60 -9
- package/src/router/prerender-match.ts +110 -10
- package/src/router/preview-match.ts +30 -102
- package/src/router/request-classification.ts +310 -0
- package/src/router/route-snapshot.ts +245 -0
- package/src/router/router-interfaces.ts +36 -4
- package/src/router/router-options.ts +37 -11
- package/src/router/segment-resolution/fresh.ts +70 -5
- package/src/router/segment-resolution/revalidation.ts +87 -9
- package/src/router/trie-matching.ts +10 -4
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +54 -7
- package/src/rsc/handler.ts +478 -395
- package/src/rsc/helpers.ts +69 -41
- package/src/rsc/loader-fetch.ts +18 -3
- package/src/rsc/manifest-init.ts +5 -1
- package/src/rsc/progressive-enhancement.ts +14 -3
- package/src/rsc/response-route-handler.ts +14 -1
- package/src/rsc/rsc-rendering.ts +15 -2
- package/src/rsc/server-action.ts +10 -2
- package/src/rsc/ssr-setup.ts +2 -2
- package/src/rsc/types.ts +6 -4
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +11 -61
- package/src/server/context.ts +65 -5
- package/src/server/handle-store.ts +19 -0
- package/src/server/loader-registry.ts +9 -8
- package/src/server/request-context.ts +142 -55
- package/src/ssr/index.tsx +3 -0
- package/src/static-handler.ts +18 -6
- package/src/types/cache-types.ts +4 -4
- package/src/types/handler-context.ts +17 -43
- package/src/types/loader-types.ts +37 -11
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +12 -1
- package/src/types/segments.ts +1 -1
- package/src/urls/include-helper.ts +24 -14
- package/src/urls/path-helper-types.ts +39 -6
- package/src/urls/path-helper.ts +47 -12
- package/src/urls/pattern-types.ts +12 -0
- package/src/urls/response-types.ts +18 -16
- package/src/use-loader.tsx +77 -5
- package/src/vite/debug.ts +140 -0
- package/src/vite/discovery/bundle-postprocess.ts +30 -33
- package/src/vite/discovery/discover-routers.ts +36 -4
- package/src/vite/discovery/prerender-collection.ts +175 -74
- package/src/vite/discovery/state.ts +13 -4
- package/src/vite/index.ts +4 -0
- package/src/vite/plugin-types.ts +60 -5
- package/src/vite/plugins/cjs-to-esm.ts +11 -0
- package/src/vite/plugins/client-ref-dedup.ts +21 -0
- package/src/vite/plugins/client-ref-hashing.ts +16 -4
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/plugins/expose-action-id.ts +52 -28
- package/src/vite/plugins/expose-id-utils.ts +12 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +30 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +563 -316
- package/src/vite/plugins/performance-tracks.ts +71 -170
- package/src/vite/plugins/refresh-cmd.ts +88 -26
- package/src/vite/plugins/use-cache-transform.ts +57 -43
- package/src/vite/rango.ts +62 -14
- package/src/vite/router-discovery.ts +389 -59
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +37 -5
- package/src/vite/utils/shared-utils.ts +3 -2
- package/dist/__internal.d.ts +0 -83
- package/dist/__internal.d.ts.map +0 -1
- package/dist/__internal.js +0 -19
- package/dist/__internal.js.map +0 -1
- package/dist/__mocks__/version.d.ts +0 -7
- package/dist/__mocks__/version.d.ts.map +0 -1
- package/dist/__mocks__/version.js +0 -7
- package/dist/__mocks__/version.js.map +0 -1
- package/dist/__tests__/client-href.test.d.ts +0 -2
- package/dist/__tests__/client-href.test.d.ts.map +0 -1
- package/dist/__tests__/client-href.test.js +0 -74
- package/dist/__tests__/client-href.test.js.map +0 -1
- package/dist/__tests__/component-utils.test.d.ts +0 -2
- package/dist/__tests__/component-utils.test.d.ts.map +0 -1
- package/dist/__tests__/component-utils.test.js +0 -51
- package/dist/__tests__/component-utils.test.js.map +0 -1
- package/dist/__tests__/event-controller.test.d.ts +0 -2
- package/dist/__tests__/event-controller.test.d.ts.map +0 -1
- package/dist/__tests__/event-controller.test.js +0 -538
- package/dist/__tests__/event-controller.test.js.map +0 -1
- package/dist/__tests__/helpers/route-tree.d.ts +0 -118
- package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
- package/dist/__tests__/helpers/route-tree.js +0 -374
- package/dist/__tests__/helpers/route-tree.js.map +0 -1
- package/dist/__tests__/match-result.test.d.ts +0 -2
- package/dist/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/__tests__/match-result.test.js +0 -154
- package/dist/__tests__/match-result.test.js.map +0 -1
- package/dist/__tests__/navigation-store.test.d.ts +0 -2
- package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
- package/dist/__tests__/navigation-store.test.js +0 -440
- package/dist/__tests__/navigation-store.test.js.map +0 -1
- package/dist/__tests__/partial-update.test.d.ts +0 -2
- package/dist/__tests__/partial-update.test.d.ts.map +0 -1
- package/dist/__tests__/partial-update.test.js +0 -1009
- package/dist/__tests__/partial-update.test.js.map +0 -1
- package/dist/__tests__/reverse-types.test.d.ts +0 -8
- package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
- package/dist/__tests__/reverse-types.test.js +0 -656
- package/dist/__tests__/reverse-types.test.js.map +0 -1
- package/dist/__tests__/route-definition.test.d.ts +0 -2
- package/dist/__tests__/route-definition.test.d.ts.map +0 -1
- package/dist/__tests__/route-definition.test.js +0 -55
- package/dist/__tests__/route-definition.test.js.map +0 -1
- package/dist/__tests__/router-helpers.test.d.ts +0 -2
- package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
- package/dist/__tests__/router-helpers.test.js +0 -377
- package/dist/__tests__/router-helpers.test.js.map +0 -1
- package/dist/__tests__/router-integration-2.test.d.ts +0 -2
- package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration-2.test.js +0 -426
- package/dist/__tests__/router-integration-2.test.js.map +0 -1
- package/dist/__tests__/router-integration.test.d.ts +0 -2
- package/dist/__tests__/router-integration.test.d.ts.map +0 -1
- package/dist/__tests__/router-integration.test.js +0 -1051
- package/dist/__tests__/router-integration.test.js.map +0 -1
- package/dist/__tests__/search-params.test.d.ts +0 -5
- package/dist/__tests__/search-params.test.d.ts.map +0 -1
- package/dist/__tests__/search-params.test.js +0 -306
- package/dist/__tests__/search-params.test.js.map +0 -1
- package/dist/__tests__/segment-system.test.d.ts +0 -2
- package/dist/__tests__/segment-system.test.d.ts.map +0 -1
- package/dist/__tests__/segment-system.test.js +0 -627
- package/dist/__tests__/segment-system.test.js.map +0 -1
- package/dist/__tests__/static-handler-types.test.d.ts +0 -8
- package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
- package/dist/__tests__/static-handler-types.test.js +0 -63
- package/dist/__tests__/static-handler-types.test.js.map +0 -1
- package/dist/__tests__/urls.test.d.ts +0 -2
- package/dist/__tests__/urls.test.d.ts.map +0 -1
- package/dist/__tests__/urls.test.js +0 -421
- package/dist/__tests__/urls.test.js.map +0 -1
- package/dist/__tests__/use-mount.test.d.ts +0 -2
- package/dist/__tests__/use-mount.test.d.ts.map +0 -1
- package/dist/__tests__/use-mount.test.js +0 -35
- package/dist/__tests__/use-mount.test.js.map +0 -1
- package/dist/bin/rango.d.ts +0 -2
- package/dist/bin/rango.d.ts.map +0 -1
- package/dist/bin/rango.js.map +0 -1
- package/dist/browser/event-controller.d.ts +0 -191
- package/dist/browser/event-controller.d.ts.map +0 -1
- package/dist/browser/event-controller.js +0 -559
- package/dist/browser/event-controller.js.map +0 -1
- package/dist/browser/index.d.ts +0 -2
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/index.js +0 -14
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/link-interceptor.d.ts +0 -38
- package/dist/browser/link-interceptor.d.ts.map +0 -1
- package/dist/browser/link-interceptor.js +0 -99
- package/dist/browser/link-interceptor.js.map +0 -1
- package/dist/browser/logging.d.ts +0 -10
- package/dist/browser/logging.d.ts.map +0 -1
- package/dist/browser/logging.js +0 -29
- package/dist/browser/logging.js.map +0 -1
- package/dist/browser/lru-cache.d.ts +0 -17
- package/dist/browser/lru-cache.d.ts.map +0 -1
- package/dist/browser/lru-cache.js +0 -50
- package/dist/browser/lru-cache.js.map +0 -1
- package/dist/browser/merge-segment-loaders.d.ts +0 -39
- package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
- package/dist/browser/merge-segment-loaders.js +0 -102
- package/dist/browser/merge-segment-loaders.js.map +0 -1
- package/dist/browser/navigation-bridge.d.ts +0 -102
- package/dist/browser/navigation-bridge.d.ts.map +0 -1
- package/dist/browser/navigation-bridge.js +0 -708
- package/dist/browser/navigation-bridge.js.map +0 -1
- package/dist/browser/navigation-client.d.ts +0 -25
- package/dist/browser/navigation-client.d.ts.map +0 -1
- package/dist/browser/navigation-client.js +0 -157
- package/dist/browser/navigation-client.js.map +0 -1
- package/dist/browser/navigation-store.d.ts +0 -101
- package/dist/browser/navigation-store.d.ts.map +0 -1
- package/dist/browser/navigation-store.js +0 -625
- package/dist/browser/navigation-store.js.map +0 -1
- package/dist/browser/partial-update.d.ts +0 -75
- package/dist/browser/partial-update.d.ts.map +0 -1
- package/dist/browser/partial-update.js +0 -426
- package/dist/browser/partial-update.js.map +0 -1
- package/dist/browser/react/Link.d.ts +0 -86
- package/dist/browser/react/Link.d.ts.map +0 -1
- package/dist/browser/react/Link.js +0 -128
- package/dist/browser/react/Link.js.map +0 -1
- package/dist/browser/react/NavigationProvider.d.ts +0 -63
- package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
- package/dist/browser/react/NavigationProvider.js +0 -216
- package/dist/browser/react/NavigationProvider.js.map +0 -1
- package/dist/browser/react/ScrollRestoration.d.ts +0 -75
- package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
- package/dist/browser/react/ScrollRestoration.js +0 -57
- package/dist/browser/react/ScrollRestoration.js.map +0 -1
- package/dist/browser/react/context.d.ts +0 -46
- package/dist/browser/react/context.d.ts.map +0 -1
- package/dist/browser/react/context.js +0 -10
- package/dist/browser/react/context.js.map +0 -1
- package/dist/browser/react/index.d.ts +0 -11
- package/dist/browser/react/index.d.ts.map +0 -1
- package/dist/browser/react/index.js +0 -22
- package/dist/browser/react/index.js.map +0 -1
- package/dist/browser/react/location-state-shared.d.ts +0 -63
- package/dist/browser/react/location-state-shared.d.ts.map +0 -1
- package/dist/browser/react/location-state-shared.js +0 -81
- package/dist/browser/react/location-state-shared.js.map +0 -1
- package/dist/browser/react/location-state.d.ts +0 -23
- package/dist/browser/react/location-state.d.ts.map +0 -1
- package/dist/browser/react/location-state.js +0 -29
- package/dist/browser/react/location-state.js.map +0 -1
- package/dist/browser/react/mount-context.d.ts +0 -24
- package/dist/browser/react/mount-context.d.ts.map +0 -1
- package/dist/browser/react/mount-context.js +0 -24
- package/dist/browser/react/mount-context.js.map +0 -1
- package/dist/browser/react/use-action.d.ts +0 -64
- package/dist/browser/react/use-action.d.ts.map +0 -1
- package/dist/browser/react/use-action.js +0 -134
- package/dist/browser/react/use-action.js.map +0 -1
- package/dist/browser/react/use-client-cache.d.ts +0 -41
- package/dist/browser/react/use-client-cache.d.ts.map +0 -1
- package/dist/browser/react/use-client-cache.js +0 -39
- package/dist/browser/react/use-client-cache.js.map +0 -1
- package/dist/browser/react/use-handle.d.ts +0 -31
- package/dist/browser/react/use-handle.d.ts.map +0 -1
- package/dist/browser/react/use-handle.js +0 -144
- package/dist/browser/react/use-handle.js.map +0 -1
- package/dist/browser/react/use-href.d.ts +0 -33
- package/dist/browser/react/use-href.d.ts.map +0 -1
- package/dist/browser/react/use-href.js +0 -39
- package/dist/browser/react/use-href.js.map +0 -1
- package/dist/browser/react/use-link-status.d.ts +0 -37
- package/dist/browser/react/use-link-status.d.ts.map +0 -1
- package/dist/browser/react/use-link-status.js +0 -99
- package/dist/browser/react/use-link-status.js.map +0 -1
- package/dist/browser/react/use-mount.d.ts +0 -25
- package/dist/browser/react/use-mount.d.ts.map +0 -1
- package/dist/browser/react/use-mount.js +0 -30
- package/dist/browser/react/use-mount.js.map +0 -1
- package/dist/browser/react/use-navigation.d.ts +0 -27
- package/dist/browser/react/use-navigation.d.ts.map +0 -1
- package/dist/browser/react/use-navigation.js +0 -87
- package/dist/browser/react/use-navigation.js.map +0 -1
- package/dist/browser/react/use-segments.d.ts +0 -38
- package/dist/browser/react/use-segments.d.ts.map +0 -1
- package/dist/browser/react/use-segments.js +0 -130
- package/dist/browser/react/use-segments.js.map +0 -1
- package/dist/browser/request-controller.d.ts +0 -26
- package/dist/browser/request-controller.d.ts.map +0 -1
- package/dist/browser/request-controller.js +0 -147
- package/dist/browser/request-controller.js.map +0 -1
- package/dist/browser/rsc-router.d.ts +0 -129
- package/dist/browser/rsc-router.d.ts.map +0 -1
- package/dist/browser/rsc-router.js +0 -195
- package/dist/browser/rsc-router.js.map +0 -1
- package/dist/browser/scroll-restoration.d.ts +0 -93
- package/dist/browser/scroll-restoration.d.ts.map +0 -1
- package/dist/browser/scroll-restoration.js +0 -321
- package/dist/browser/scroll-restoration.js.map +0 -1
- package/dist/browser/segment-structure-assert.d.ts +0 -17
- package/dist/browser/segment-structure-assert.d.ts.map +0 -1
- package/dist/browser/segment-structure-assert.js +0 -59
- package/dist/browser/segment-structure-assert.js.map +0 -1
- package/dist/browser/server-action-bridge.d.ts +0 -26
- package/dist/browser/server-action-bridge.d.ts.map +0 -1
- package/dist/browser/server-action-bridge.js +0 -668
- package/dist/browser/server-action-bridge.js.map +0 -1
- package/dist/browser/shallow.d.ts +0 -12
- package/dist/browser/shallow.d.ts.map +0 -1
- package/dist/browser/shallow.js +0 -34
- package/dist/browser/shallow.js.map +0 -1
- package/dist/browser/types.d.ts +0 -369
- package/dist/browser/types.d.ts.map +0 -1
- package/dist/browser/types.js +0 -2
- package/dist/browser/types.js.map +0 -1
- package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
- package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-cli.test.js +0 -237
- package/dist/build/__tests__/generate-cli.test.js.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-manifest.test.js +0 -119
- package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
- package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
- package/dist/build/__tests__/generate-route-types.test.js +0 -620
- package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
- package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
- package/dist/build/__tests__/per-router-manifest.test.js +0 -308
- package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
- package/dist/build/generate-manifest.d.ts +0 -81
- package/dist/build/generate-manifest.d.ts.map +0 -1
- package/dist/build/generate-manifest.js +0 -276
- package/dist/build/generate-manifest.js.map +0 -1
- package/dist/build/generate-route-types.d.ts +0 -115
- package/dist/build/generate-route-types.d.ts.map +0 -1
- package/dist/build/generate-route-types.js +0 -740
- package/dist/build/generate-route-types.js.map +0 -1
- package/dist/build/index.d.ts +0 -21
- package/dist/build/index.d.ts.map +0 -1
- package/dist/build/index.js +0 -21
- package/dist/build/index.js.map +0 -1
- package/dist/build/route-trie.d.ts +0 -71
- package/dist/build/route-trie.d.ts.map +0 -1
- package/dist/build/route-trie.js +0 -175
- package/dist/build/route-trie.js.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
- package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
- package/dist/cache/__tests__/cache-scope.test.js +0 -208
- package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
- package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
- package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
- package/dist/cache/__tests__/document-cache.test.js +0 -345
- package/dist/cache/__tests__/document-cache.test.js.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
- package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
- package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
- package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
- package/dist/cache/__tests__/memory-store.test.js +0 -367
- package/dist/cache/__tests__/memory-store.test.js.map +0 -1
- package/dist/cache/cache-scope.d.ts +0 -102
- package/dist/cache/cache-scope.d.ts.map +0 -1
- package/dist/cache/cache-scope.js +0 -440
- package/dist/cache/cache-scope.js.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
- package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
- package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
- package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
- package/dist/cache/cf/cf-cache-store.d.ts +0 -165
- package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
- package/dist/cache/cf/cf-cache-store.js +0 -242
- package/dist/cache/cf/cf-cache-store.js.map +0 -1
- package/dist/cache/cf/index.d.ts +0 -14
- package/dist/cache/cf/index.d.ts.map +0 -1
- package/dist/cache/cf/index.js +0 -17
- package/dist/cache/cf/index.js.map +0 -1
- package/dist/cache/document-cache.d.ts +0 -64
- package/dist/cache/document-cache.d.ts.map +0 -1
- package/dist/cache/document-cache.js +0 -228
- package/dist/cache/document-cache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -19
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -21
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/memory-segment-store.d.ts +0 -110
- package/dist/cache/memory-segment-store.d.ts.map +0 -1
- package/dist/cache/memory-segment-store.js +0 -117
- package/dist/cache/memory-segment-store.js.map +0 -1
- package/dist/cache/memory-store.d.ts +0 -41
- package/dist/cache/memory-store.d.ts.map +0 -1
- package/dist/cache/memory-store.js +0 -191
- package/dist/cache/memory-store.js.map +0 -1
- package/dist/cache/types.d.ts +0 -317
- package/dist/cache/types.d.ts.map +0 -1
- package/dist/cache/types.js +0 -12
- package/dist/cache/types.js.map +0 -1
- package/dist/client.d.ts +0 -248
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -367
- package/dist/client.js.map +0 -1
- package/dist/client.rsc.d.ts +0 -26
- package/dist/client.rsc.d.ts.map +0 -1
- package/dist/client.rsc.js +0 -46
- package/dist/client.rsc.js.map +0 -1
- package/dist/component-utils.d.ts +0 -36
- package/dist/component-utils.d.ts.map +0 -1
- package/dist/component-utils.js +0 -61
- package/dist/component-utils.js.map +0 -1
- package/dist/components/DefaultDocument.d.ts +0 -13
- package/dist/components/DefaultDocument.d.ts.map +0 -1
- package/dist/components/DefaultDocument.js +0 -15
- package/dist/components/DefaultDocument.js.map +0 -1
- package/dist/debug.d.ts +0 -58
- package/dist/debug.d.ts.map +0 -1
- package/dist/debug.js +0 -157
- package/dist/debug.js.map +0 -1
- package/dist/default-error-boundary.d.ts +0 -11
- package/dist/default-error-boundary.d.ts.map +0 -1
- package/dist/default-error-boundary.js +0 -45
- package/dist/default-error-boundary.js.map +0 -1
- package/dist/deps/browser.d.ts +0 -2
- package/dist/deps/browser.d.ts.map +0 -1
- package/dist/deps/browser.js +0 -3
- package/dist/deps/browser.js.map +0 -1
- package/dist/deps/html-stream-client.d.ts +0 -2
- package/dist/deps/html-stream-client.d.ts.map +0 -1
- package/dist/deps/html-stream-client.js +0 -3
- package/dist/deps/html-stream-client.js.map +0 -1
- package/dist/deps/html-stream-server.d.ts +0 -2
- package/dist/deps/html-stream-server.d.ts.map +0 -1
- package/dist/deps/html-stream-server.js +0 -3
- package/dist/deps/html-stream-server.js.map +0 -1
- package/dist/deps/rsc.d.ts +0 -2
- package/dist/deps/rsc.d.ts.map +0 -1
- package/dist/deps/rsc.js +0 -4
- package/dist/deps/rsc.js.map +0 -1
- package/dist/deps/ssr.d.ts +0 -2
- package/dist/deps/ssr.d.ts.map +0 -1
- package/dist/deps/ssr.js +0 -3
- package/dist/deps/ssr.js.map +0 -1
- package/dist/errors.d.ts +0 -174
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -241
- package/dist/errors.js.map +0 -1
- package/dist/handle.d.ts +0 -78
- package/dist/handle.d.ts.map +0 -1
- package/dist/handle.js +0 -82
- package/dist/handle.js.map +0 -1
- package/dist/handles/MetaTags.d.ts +0 -14
- package/dist/handles/MetaTags.d.ts.map +0 -1
- package/dist/handles/MetaTags.js +0 -136
- package/dist/handles/MetaTags.js.map +0 -1
- package/dist/handles/index.d.ts +0 -6
- package/dist/handles/index.d.ts.map +0 -1
- package/dist/handles/index.js +0 -6
- package/dist/handles/index.js.map +0 -1
- package/dist/handles/meta.d.ts +0 -39
- package/dist/handles/meta.d.ts.map +0 -1
- package/dist/handles/meta.js +0 -202
- package/dist/handles/meta.js.map +0 -1
- package/dist/host/__tests__/errors.test.d.ts +0 -2
- package/dist/host/__tests__/errors.test.d.ts.map +0 -1
- package/dist/host/__tests__/errors.test.js +0 -76
- package/dist/host/__tests__/errors.test.js.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
- package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
- package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
- package/dist/host/__tests__/pattern-matcher.test.js +0 -251
- package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
- package/dist/host/__tests__/router.test.d.ts +0 -2
- package/dist/host/__tests__/router.test.d.ts.map +0 -1
- package/dist/host/__tests__/router.test.js +0 -241
- package/dist/host/__tests__/router.test.js.map +0 -1
- package/dist/host/__tests__/testing.test.d.ts +0 -2
- package/dist/host/__tests__/testing.test.d.ts.map +0 -1
- package/dist/host/__tests__/testing.test.js +0 -64
- package/dist/host/__tests__/testing.test.js.map +0 -1
- package/dist/host/__tests__/utils.test.d.ts +0 -2
- package/dist/host/__tests__/utils.test.d.ts.map +0 -1
- package/dist/host/__tests__/utils.test.js +0 -29
- package/dist/host/__tests__/utils.test.js.map +0 -1
- package/dist/host/cookie-handler.d.ts +0 -34
- package/dist/host/cookie-handler.d.ts.map +0 -1
- package/dist/host/cookie-handler.js +0 -124
- package/dist/host/cookie-handler.js.map +0 -1
- package/dist/host/errors.d.ts +0 -56
- package/dist/host/errors.d.ts.map +0 -1
- package/dist/host/errors.js +0 -79
- package/dist/host/errors.js.map +0 -1
- package/dist/host/index.d.ts +0 -29
- package/dist/host/index.d.ts.map +0 -1
- package/dist/host/index.js +0 -32
- package/dist/host/index.js.map +0 -1
- package/dist/host/pattern-matcher.d.ts +0 -36
- package/dist/host/pattern-matcher.d.ts.map +0 -1
- package/dist/host/pattern-matcher.js +0 -172
- package/dist/host/pattern-matcher.js.map +0 -1
- package/dist/host/router.d.ts +0 -26
- package/dist/host/router.d.ts.map +0 -1
- package/dist/host/router.js +0 -218
- package/dist/host/router.js.map +0 -1
- package/dist/host/testing.d.ts +0 -36
- package/dist/host/testing.d.ts.map +0 -1
- package/dist/host/testing.js +0 -55
- package/dist/host/testing.js.map +0 -1
- package/dist/host/types.d.ts +0 -115
- package/dist/host/types.d.ts.map +0 -1
- package/dist/host/types.js +0 -7
- package/dist/host/types.js.map +0 -1
- package/dist/host/utils.d.ts +0 -21
- package/dist/host/utils.d.ts.map +0 -1
- package/dist/host/utils.js +0 -23
- package/dist/host/utils.js.map +0 -1
- package/dist/href-client.d.ts +0 -131
- package/dist/href-client.d.ts.map +0 -1
- package/dist/href-client.js +0 -64
- package/dist/href-client.js.map +0 -1
- package/dist/href-context.d.ts +0 -29
- package/dist/href-context.d.ts.map +0 -1
- package/dist/href-context.js +0 -21
- package/dist/href-context.js.map +0 -1
- package/dist/index.d.ts +0 -73
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -91
- package/dist/index.js.map +0 -1
- package/dist/index.rsc.d.ts +0 -32
- package/dist/index.rsc.d.ts.map +0 -1
- package/dist/index.rsc.js +0 -40
- package/dist/index.rsc.js.map +0 -1
- package/dist/internal-debug.d.ts +0 -2
- package/dist/internal-debug.d.ts.map +0 -1
- package/dist/internal-debug.js +0 -5
- package/dist/internal-debug.js.map +0 -1
- package/dist/loader.d.ts +0 -14
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -20
- package/dist/loader.js.map +0 -1
- package/dist/loader.rsc.d.ts +0 -19
- package/dist/loader.rsc.d.ts.map +0 -1
- package/dist/loader.rsc.js +0 -99
- package/dist/loader.rsc.js.map +0 -1
- package/dist/network-error-thrower.d.ts +0 -17
- package/dist/network-error-thrower.d.ts.map +0 -1
- package/dist/network-error-thrower.js +0 -14
- package/dist/network-error-thrower.js.map +0 -1
- package/dist/outlet-context.d.ts +0 -13
- package/dist/outlet-context.d.ts.map +0 -1
- package/dist/outlet-context.js +0 -3
- package/dist/outlet-context.js.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
- package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
- package/dist/prerender/__tests__/param-hash.test.js +0 -148
- package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
- package/dist/prerender/param-hash.d.ts +0 -16
- package/dist/prerender/param-hash.d.ts.map +0 -1
- package/dist/prerender/param-hash.js +0 -36
- package/dist/prerender/param-hash.js.map +0 -1
- package/dist/prerender/store.d.ts +0 -38
- package/dist/prerender/store.d.ts.map +0 -1
- package/dist/prerender/store.js +0 -61
- package/dist/prerender/store.js.map +0 -1
- package/dist/prerender.d.ts +0 -66
- package/dist/prerender.d.ts.map +0 -1
- package/dist/prerender.js +0 -57
- package/dist/prerender.js.map +0 -1
- package/dist/reverse.d.ts +0 -196
- package/dist/reverse.d.ts.map +0 -1
- package/dist/reverse.js +0 -78
- package/dist/reverse.js.map +0 -1
- package/dist/root-error-boundary.d.ts +0 -33
- package/dist/root-error-boundary.d.ts.map +0 -1
- package/dist/root-error-boundary.js +0 -165
- package/dist/root-error-boundary.js.map +0 -1
- package/dist/route-content-wrapper.d.ts +0 -46
- package/dist/route-content-wrapper.d.ts.map +0 -1
- package/dist/route-content-wrapper.js +0 -77
- package/dist/route-content-wrapper.js.map +0 -1
- package/dist/route-definition.d.ts +0 -421
- package/dist/route-definition.d.ts.map +0 -1
- package/dist/route-definition.js +0 -868
- package/dist/route-definition.js.map +0 -1
- package/dist/route-map-builder.d.ts +0 -155
- package/dist/route-map-builder.d.ts.map +0 -1
- package/dist/route-map-builder.js +0 -237
- package/dist/route-map-builder.js.map +0 -1
- package/dist/route-types.d.ts +0 -165
- package/dist/route-types.d.ts.map +0 -1
- package/dist/route-types.js +0 -7
- package/dist/route-types.js.map +0 -1
- package/dist/router/__tests__/handler-context.test.d.ts +0 -2
- package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/handler-context.test.js +0 -65
- package/dist/router/__tests__/handler-context.test.js.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
- package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
- package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
- package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
- package/dist/router/__tests__/match-context.test.d.ts +0 -2
- package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-context.test.js +0 -92
- package/dist/router/__tests__/match-context.test.js.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
- package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-pipelines.test.js +0 -417
- package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
- package/dist/router/__tests__/match-result.test.d.ts +0 -2
- package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
- package/dist/router/__tests__/match-result.test.js +0 -457
- package/dist/router/__tests__/match-result.test.js.map +0 -1
- package/dist/router/__tests__/on-error.test.d.ts +0 -2
- package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
- package/dist/router/__tests__/on-error.test.js +0 -678
- package/dist/router/__tests__/on-error.test.js.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
- package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
- package/dist/router/__tests__/pattern-matching.test.js +0 -629
- package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
- package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
- package/dist/router/error-handling.d.ts +0 -77
- package/dist/router/error-handling.d.ts.map +0 -1
- package/dist/router/error-handling.js +0 -202
- package/dist/router/error-handling.js.map +0 -1
- package/dist/router/handler-context.d.ts +0 -20
- package/dist/router/handler-context.d.ts.map +0 -1
- package/dist/router/handler-context.js +0 -198
- package/dist/router/handler-context.js.map +0 -1
- package/dist/router/intercept-resolution.d.ts +0 -66
- package/dist/router/intercept-resolution.d.ts.map +0 -1
- package/dist/router/intercept-resolution.js +0 -246
- package/dist/router/intercept-resolution.js.map +0 -1
- package/dist/router/loader-resolution.d.ts +0 -64
- package/dist/router/loader-resolution.d.ts.map +0 -1
- package/dist/router/loader-resolution.js +0 -284
- package/dist/router/loader-resolution.js.map +0 -1
- package/dist/router/logging.d.ts +0 -15
- package/dist/router/logging.d.ts.map +0 -1
- package/dist/router/logging.js +0 -99
- package/dist/router/logging.js.map +0 -1
- package/dist/router/manifest.d.ts +0 -22
- package/dist/router/manifest.d.ts.map +0 -1
- package/dist/router/manifest.js +0 -181
- package/dist/router/manifest.js.map +0 -1
- package/dist/router/match-api.d.ts +0 -35
- package/dist/router/match-api.d.ts.map +0 -1
- package/dist/router/match-api.js +0 -406
- package/dist/router/match-api.js.map +0 -1
- package/dist/router/match-context.d.ts +0 -206
- package/dist/router/match-context.d.ts.map +0 -1
- package/dist/router/match-context.js +0 -17
- package/dist/router/match-context.js.map +0 -1
- package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
- package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
- package/dist/router/match-middleware/background-revalidation.js +0 -75
- package/dist/router/match-middleware/background-revalidation.js.map +0 -1
- package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
- package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-lookup.js +0 -257
- package/dist/router/match-middleware/cache-lookup.js.map +0 -1
- package/dist/router/match-middleware/cache-store.d.ts +0 -113
- package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
- package/dist/router/match-middleware/cache-store.js +0 -108
- package/dist/router/match-middleware/cache-store.js.map +0 -1
- package/dist/router/match-middleware/index.d.ts +0 -81
- package/dist/router/match-middleware/index.d.ts.map +0 -1
- package/dist/router/match-middleware/index.js +0 -80
- package/dist/router/match-middleware/index.js.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
- package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/intercept-resolution.js +0 -134
- package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
- package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
- package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
- package/dist/router/match-middleware/segment-resolution.js +0 -53
- package/dist/router/match-middleware/segment-resolution.js.map +0 -1
- package/dist/router/match-pipelines.d.ts +0 -147
- package/dist/router/match-pipelines.d.ts.map +0 -1
- package/dist/router/match-pipelines.js +0 -82
- package/dist/router/match-pipelines.js.map +0 -1
- package/dist/router/match-result.d.ts +0 -126
- package/dist/router/match-result.d.ts.map +0 -1
- package/dist/router/match-result.js +0 -93
- package/dist/router/match-result.js.map +0 -1
- package/dist/router/metrics.d.ts +0 -20
- package/dist/router/metrics.d.ts.map +0 -1
- package/dist/router/metrics.js +0 -47
- package/dist/router/metrics.js.map +0 -1
- package/dist/router/middleware.d.ts +0 -249
- package/dist/router/middleware.d.ts.map +0 -1
- package/dist/router/middleware.js +0 -434
- package/dist/router/middleware.js.map +0 -1
- package/dist/router/middleware.test.d.ts +0 -2
- package/dist/router/middleware.test.d.ts.map +0 -1
- package/dist/router/middleware.test.js +0 -816
- package/dist/router/middleware.test.js.map +0 -1
- package/dist/router/pattern-matching.d.ts +0 -149
- package/dist/router/pattern-matching.d.ts.map +0 -1
- package/dist/router/pattern-matching.js +0 -349
- package/dist/router/pattern-matching.js.map +0 -1
- package/dist/router/revalidation.d.ts +0 -44
- package/dist/router/revalidation.d.ts.map +0 -1
- package/dist/router/revalidation.js +0 -147
- package/dist/router/revalidation.js.map +0 -1
- package/dist/router/router-context.d.ts +0 -135
- package/dist/router/router-context.d.ts.map +0 -1
- package/dist/router/router-context.js +0 -36
- package/dist/router/router-context.js.map +0 -1
- package/dist/router/segment-resolution.d.ts +0 -127
- package/dist/router/segment-resolution.d.ts.map +0 -1
- package/dist/router/segment-resolution.js +0 -919
- package/dist/router/segment-resolution.js.map +0 -1
- package/dist/router/trie-matching.d.ts +0 -40
- package/dist/router/trie-matching.d.ts.map +0 -1
- package/dist/router/trie-matching.js +0 -127
- package/dist/router/trie-matching.js.map +0 -1
- package/dist/router/types.d.ts +0 -136
- package/dist/router/types.d.ts.map +0 -1
- package/dist/router/types.js +0 -7
- package/dist/router/types.js.map +0 -1
- package/dist/router.d.ts +0 -753
- package/dist/router.d.ts.map +0 -1
- package/dist/router.gen.d.ts +0 -6
- package/dist/router.gen.d.ts.map +0 -1
- package/dist/router.gen.js +0 -6
- package/dist/router.gen.js.map +0 -1
- package/dist/router.js +0 -1304
- package/dist/router.js.map +0 -1
- package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
- package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
- package/dist/rsc/__tests__/helpers.test.js +0 -140
- package/dist/rsc/__tests__/helpers.test.js.map +0 -1
- package/dist/rsc/handler.d.ts +0 -45
- package/dist/rsc/handler.d.ts.map +0 -1
- package/dist/rsc/handler.js +0 -1172
- package/dist/rsc/handler.js.map +0 -1
- package/dist/rsc/helpers.d.ts +0 -16
- package/dist/rsc/helpers.d.ts.map +0 -1
- package/dist/rsc/helpers.js +0 -55
- package/dist/rsc/helpers.js.map +0 -1
- package/dist/rsc/index.d.ts +0 -22
- package/dist/rsc/index.d.ts.map +0 -1
- package/dist/rsc/index.js +0 -23
- package/dist/rsc/index.js.map +0 -1
- package/dist/rsc/nonce.d.ts +0 -9
- package/dist/rsc/nonce.d.ts.map +0 -1
- package/dist/rsc/nonce.js +0 -18
- package/dist/rsc/nonce.js.map +0 -1
- package/dist/rsc/types.d.ts +0 -206
- package/dist/rsc/types.d.ts.map +0 -1
- package/dist/rsc/types.js +0 -8
- package/dist/rsc/types.js.map +0 -1
- package/dist/search-params.d.ts +0 -103
- package/dist/search-params.d.ts.map +0 -1
- package/dist/search-params.js +0 -74
- package/dist/search-params.js.map +0 -1
- package/dist/segment-system.d.ts +0 -75
- package/dist/segment-system.d.ts.map +0 -1
- package/dist/segment-system.js +0 -336
- package/dist/segment-system.js.map +0 -1
- package/dist/server/context.d.ts +0 -245
- package/dist/server/context.d.ts.map +0 -1
- package/dist/server/context.js +0 -197
- package/dist/server/context.js.map +0 -1
- package/dist/server/fetchable-loader-store.d.ts +0 -18
- package/dist/server/fetchable-loader-store.d.ts.map +0 -1
- package/dist/server/fetchable-loader-store.js +0 -18
- package/dist/server/fetchable-loader-store.js.map +0 -1
- package/dist/server/handle-store.d.ts +0 -85
- package/dist/server/handle-store.d.ts.map +0 -1
- package/dist/server/handle-store.js +0 -142
- package/dist/server/handle-store.js.map +0 -1
- package/dist/server/loader-registry.d.ts +0 -55
- package/dist/server/loader-registry.d.ts.map +0 -1
- package/dist/server/loader-registry.js +0 -132
- package/dist/server/loader-registry.js.map +0 -1
- package/dist/server/request-context.d.ts +0 -226
- package/dist/server/request-context.d.ts.map +0 -1
- package/dist/server/request-context.js +0 -290
- package/dist/server/request-context.js.map +0 -1
- package/dist/server/root-layout.d.ts +0 -4
- package/dist/server/root-layout.d.ts.map +0 -1
- package/dist/server/root-layout.js +0 -5
- package/dist/server/root-layout.js.map +0 -1
- package/dist/server.d.ts +0 -15
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -20
- package/dist/server.js.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
- package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
- package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
- package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
- package/dist/ssr/index.d.ts +0 -98
- package/dist/ssr/index.d.ts.map +0 -1
- package/dist/ssr/index.js +0 -158
- package/dist/ssr/index.js.map +0 -1
- package/dist/static-handler.d.ts +0 -50
- package/dist/static-handler.d.ts.map +0 -1
- package/dist/static-handler.gen.d.ts +0 -5
- package/dist/static-handler.gen.d.ts.map +0 -1
- package/dist/static-handler.gen.js +0 -5
- package/dist/static-handler.gen.js.map +0 -1
- package/dist/static-handler.js +0 -29
- package/dist/static-handler.js.map +0 -1
- package/dist/theme/ThemeProvider.d.ts +0 -20
- package/dist/theme/ThemeProvider.d.ts.map +0 -1
- package/dist/theme/ThemeProvider.js +0 -240
- package/dist/theme/ThemeProvider.js.map +0 -1
- package/dist/theme/ThemeScript.d.ts +0 -48
- package/dist/theme/ThemeScript.d.ts.map +0 -1
- package/dist/theme/ThemeScript.js +0 -13
- package/dist/theme/ThemeScript.js.map +0 -1
- package/dist/theme/__tests__/theme.test.d.ts +0 -2
- package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
- package/dist/theme/__tests__/theme.test.js +0 -103
- package/dist/theme/__tests__/theme.test.js.map +0 -1
- package/dist/theme/constants.d.ts +0 -29
- package/dist/theme/constants.d.ts.map +0 -1
- package/dist/theme/constants.js +0 -48
- package/dist/theme/constants.js.map +0 -1
- package/dist/theme/index.d.ts +0 -31
- package/dist/theme/index.d.ts.map +0 -1
- package/dist/theme/index.js +0 -36
- package/dist/theme/index.js.map +0 -1
- package/dist/theme/theme-context.d.ts +0 -40
- package/dist/theme/theme-context.d.ts.map +0 -1
- package/dist/theme/theme-context.js +0 -60
- package/dist/theme/theme-context.js.map +0 -1
- package/dist/theme/theme-script.d.ts +0 -27
- package/dist/theme/theme-script.d.ts.map +0 -1
- package/dist/theme/theme-script.js +0 -147
- package/dist/theme/theme-script.js.map +0 -1
- package/dist/theme/types.d.ts +0 -163
- package/dist/theme/types.d.ts.map +0 -1
- package/dist/theme/types.js +0 -11
- package/dist/theme/types.js.map +0 -1
- package/dist/theme/use-theme.d.ts +0 -12
- package/dist/theme/use-theme.d.ts.map +0 -1
- package/dist/theme/use-theme.js +0 -40
- package/dist/theme/use-theme.js.map +0 -1
- package/dist/types.d.ts +0 -1479
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +0 -1
- package/dist/urls.d.ts +0 -441
- package/dist/urls.d.ts.map +0 -1
- package/dist/urls.gen.d.ts +0 -8
- package/dist/urls.gen.d.ts.map +0 -1
- package/dist/urls.gen.js +0 -8
- package/dist/urls.gen.js.map +0 -1
- package/dist/urls.js +0 -443
- package/dist/urls.js.map +0 -1
- package/dist/use-loader.d.ts +0 -127
- package/dist/use-loader.d.ts.map +0 -1
- package/dist/use-loader.js +0 -237
- package/dist/use-loader.js.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
- package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
- package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
- package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
- package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
- package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
- package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
- package/dist/vite/__tests__/expose-router-id.test.js +0 -39
- package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
- package/dist/vite/ast-handler-extract.d.ts +0 -49
- package/dist/vite/ast-handler-extract.d.ts.map +0 -1
- package/dist/vite/ast-handler-extract.js +0 -249
- package/dist/vite/ast-handler-extract.js.map +0 -1
- package/dist/vite/expose-action-id.d.ts +0 -19
- package/dist/vite/expose-action-id.d.ts.map +0 -1
- package/dist/vite/expose-action-id.js +0 -250
- package/dist/vite/expose-action-id.js.map +0 -1
- package/dist/vite/expose-id-utils.d.ts +0 -69
- package/dist/vite/expose-id-utils.d.ts.map +0 -1
- package/dist/vite/expose-id-utils.js +0 -289
- package/dist/vite/expose-id-utils.js.map +0 -1
- package/dist/vite/expose-internal-ids.d.ts +0 -22
- package/dist/vite/expose-internal-ids.d.ts.map +0 -1
- package/dist/vite/expose-internal-ids.js +0 -886
- package/dist/vite/expose-internal-ids.js.map +0 -1
- package/dist/vite/index.d.ts +0 -149
- package/dist/vite/index.d.ts.map +0 -1
- package/dist/vite/index.js.map +0 -1
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/dist/vite/package-resolution.d.ts +0 -43
- package/dist/vite/package-resolution.d.ts.map +0 -1
- package/dist/vite/package-resolution.js +0 -112
- package/dist/vite/package-resolution.js.map +0 -1
- package/dist/vite/virtual-entries.d.ts +0 -25
- package/dist/vite/virtual-entries.d.ts.map +0 -1
- package/dist/vite/virtual-entries.js +0 -110
- package/dist/vite/virtual-entries.js.map +0 -1
- package/src/browser/debug-channel.ts +0 -93
package/dist/vite/index.js
CHANGED
|
@@ -9,18 +9,21 @@ import fs from "node:fs";
|
|
|
9
9
|
|
|
10
10
|
// src/vite/plugins/expose-id-utils.ts
|
|
11
11
|
import path from "node:path";
|
|
12
|
-
import
|
|
12
|
+
import crypto from "node:crypto";
|
|
13
13
|
function normalizePath(p) {
|
|
14
14
|
return p.split(path.sep).join("/");
|
|
15
15
|
}
|
|
16
16
|
function hashId(filePath, exportName) {
|
|
17
17
|
const input = `${filePath}#${exportName}`;
|
|
18
|
-
const hash =
|
|
18
|
+
const hash = crypto.createHash("sha256").update(input).digest("hex");
|
|
19
19
|
return `${hash.slice(0, 8)}#${exportName}`;
|
|
20
20
|
}
|
|
21
|
+
function makeStubId(filePath, exportName, isBuild) {
|
|
22
|
+
return isBuild ? hashId(filePath, exportName) : `${filePath}#${exportName}`;
|
|
23
|
+
}
|
|
21
24
|
function hashInlineId(filePath, lineNumber, index) {
|
|
22
25
|
const input = index !== void 0 && index > 0 ? `${filePath}:${lineNumber}:${index}` : `${filePath}:${lineNumber}`;
|
|
23
|
-
return
|
|
26
|
+
return crypto.createHash("sha256").update(input).digest("hex").slice(0, 8);
|
|
24
27
|
}
|
|
25
28
|
function buildExportMap(program) {
|
|
26
29
|
const exportMap = /* @__PURE__ */ new Map();
|
|
@@ -188,7 +191,71 @@ function escapeRegExp(input) {
|
|
|
188
191
|
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
189
192
|
}
|
|
190
193
|
|
|
194
|
+
// src/vite/debug.ts
|
|
195
|
+
import debugFactory from "debug";
|
|
196
|
+
if (process.env.INTERNAL_RANGO_DEBUG) {
|
|
197
|
+
const existing = debugFactory.disable();
|
|
198
|
+
debugFactory.enable(existing ? `${existing},rango:*` : "rango:*");
|
|
199
|
+
}
|
|
200
|
+
function createRangoDebugger(namespace) {
|
|
201
|
+
const primary = debugFactory(namespace);
|
|
202
|
+
const shadow = debugFactory(`vite:${namespace}`);
|
|
203
|
+
if (primary.enabled) return primary;
|
|
204
|
+
if (shadow.enabled) return shadow;
|
|
205
|
+
return void 0;
|
|
206
|
+
}
|
|
207
|
+
async function timed(debug11, label, fn) {
|
|
208
|
+
if (!debug11) return await fn();
|
|
209
|
+
const start = performance.now();
|
|
210
|
+
try {
|
|
211
|
+
return await fn();
|
|
212
|
+
} finally {
|
|
213
|
+
debug11("%s (%sms)", label, (performance.now() - start).toFixed(1));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function timedSync(debug11, label, fn) {
|
|
217
|
+
if (!debug11) return fn();
|
|
218
|
+
const start = performance.now();
|
|
219
|
+
try {
|
|
220
|
+
return fn();
|
|
221
|
+
} finally {
|
|
222
|
+
debug11("%s (%sms)", label, (performance.now() - start).toFixed(1));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function createCounter(debug11, label) {
|
|
226
|
+
if (!debug11) return void 0;
|
|
227
|
+
let n = 0;
|
|
228
|
+
let totalMs = 0;
|
|
229
|
+
let slowestMs = 0;
|
|
230
|
+
let slowestFile = "";
|
|
231
|
+
let flushed = false;
|
|
232
|
+
return {
|
|
233
|
+
record(file, ms) {
|
|
234
|
+
n++;
|
|
235
|
+
totalMs += ms;
|
|
236
|
+
if (ms > slowestMs) {
|
|
237
|
+
slowestMs = ms;
|
|
238
|
+
slowestFile = file;
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
flush() {
|
|
242
|
+
if (flushed) return;
|
|
243
|
+
flushed = true;
|
|
244
|
+
if (n === 0) return;
|
|
245
|
+
debug11(
|
|
246
|
+
"%s: %d files, %sms total, slowest %sms %s",
|
|
247
|
+
label,
|
|
248
|
+
n,
|
|
249
|
+
totalMs.toFixed(1),
|
|
250
|
+
slowestMs.toFixed(1),
|
|
251
|
+
slowestFile
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
191
257
|
// src/vite/plugins/expose-action-id.ts
|
|
258
|
+
var debug = createRangoDebugger("rango:transform");
|
|
192
259
|
function getRscPluginApi(config) {
|
|
193
260
|
let plugin = config.plugins.find((p) => p.name === "rsc:minimal");
|
|
194
261
|
if (!plugin) {
|
|
@@ -277,6 +344,8 @@ function exposeActionId() {
|
|
|
277
344
|
let isBuild = false;
|
|
278
345
|
let hashToFileMap;
|
|
279
346
|
let rscPluginApi;
|
|
347
|
+
const counterTransform = createCounter(debug, "expose-action-id transform");
|
|
348
|
+
const counterRender = createCounter(debug, "expose-action-id renderChunk");
|
|
280
349
|
return {
|
|
281
350
|
name: "@rangojs/router:expose-action-id",
|
|
282
351
|
// Run after all other plugins (including RSC plugin's transforms)
|
|
@@ -286,6 +355,10 @@ function exposeActionId() {
|
|
|
286
355
|
isBuild = config.command === "build";
|
|
287
356
|
rscPluginApi = getRscPluginApi(config);
|
|
288
357
|
},
|
|
358
|
+
buildEnd() {
|
|
359
|
+
counterTransform?.flush();
|
|
360
|
+
counterRender?.flush();
|
|
361
|
+
},
|
|
289
362
|
buildStart() {
|
|
290
363
|
if (!rscPluginApi) {
|
|
291
364
|
rscPluginApi = getRscPluginApi(config);
|
|
@@ -322,28 +395,42 @@ function exposeActionId() {
|
|
|
322
395
|
if (id.includes("/node_modules/")) {
|
|
323
396
|
return;
|
|
324
397
|
}
|
|
325
|
-
|
|
398
|
+
const start = counterTransform ? performance.now() : 0;
|
|
399
|
+
try {
|
|
400
|
+
return transformServerReferences(code, id);
|
|
401
|
+
} finally {
|
|
402
|
+
counterTransform?.record(id, performance.now() - start);
|
|
403
|
+
}
|
|
326
404
|
},
|
|
327
405
|
// Build mode: renderChunk runs after all transforms and bundling complete
|
|
328
406
|
renderChunk(code, chunk) {
|
|
329
|
-
const
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
const
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
code
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
407
|
+
const start = counterRender ? performance.now() : 0;
|
|
408
|
+
try {
|
|
409
|
+
const isRscEnv = this.environment?.name === "rsc";
|
|
410
|
+
const effectiveMap = isRscEnv ? hashToFileMap : void 0;
|
|
411
|
+
if (isRscEnv && hashToFileMap) {
|
|
412
|
+
const s = new MagicString(code);
|
|
413
|
+
const changed1 = applyServerReferenceWrapping(code, s, effectiveMap);
|
|
414
|
+
const changed2 = applyRegisterReferenceWrapping(
|
|
415
|
+
code,
|
|
416
|
+
s,
|
|
417
|
+
hashToFileMap
|
|
418
|
+
);
|
|
419
|
+
if (changed1 || changed2) {
|
|
420
|
+
return {
|
|
421
|
+
code: s.toString(),
|
|
422
|
+
map: s.generateMap({
|
|
423
|
+
source: chunk.fileName,
|
|
424
|
+
includeContent: true
|
|
425
|
+
})
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return null;
|
|
343
429
|
}
|
|
344
|
-
return
|
|
430
|
+
return transformServerReferences(code, chunk.fileName, effectiveMap);
|
|
431
|
+
} finally {
|
|
432
|
+
counterRender?.record(chunk.fileName, performance.now() - start);
|
|
345
433
|
}
|
|
346
|
-
return transformServerReferences(code, chunk.fileName, effectiveMap);
|
|
347
434
|
}
|
|
348
435
|
};
|
|
349
436
|
}
|
|
@@ -910,9 +997,7 @@ function generateWholeFileStubs(cfg, bindings, code, filePath, isBuild) {
|
|
|
910
997
|
});
|
|
911
998
|
return { code: stubs.join("\n") + "\n", map: null };
|
|
912
999
|
}
|
|
913
|
-
function
|
|
914
|
-
if (bindings.length === 0) return null;
|
|
915
|
-
const s = new MagicString2(code);
|
|
1000
|
+
function stubHandlerExprs(cfg, bindings, s, filePath, isBuild) {
|
|
916
1001
|
let hasChanges = false;
|
|
917
1002
|
for (const binding of bindings) {
|
|
918
1003
|
const exportName = binding.exportNames[0];
|
|
@@ -924,15 +1009,7 @@ function generateExprStubs(cfg, bindings, code, filePath, sourceId, isBuild) {
|
|
|
924
1009
|
);
|
|
925
1010
|
hasChanges = true;
|
|
926
1011
|
}
|
|
927
|
-
|
|
928
|
-
return {
|
|
929
|
-
code: s.toString(),
|
|
930
|
-
map: s.generateMap({
|
|
931
|
-
source: sourceId,
|
|
932
|
-
includeContent: true,
|
|
933
|
-
hires: "boundary"
|
|
934
|
-
})
|
|
935
|
-
};
|
|
1012
|
+
return hasChanges;
|
|
936
1013
|
}
|
|
937
1014
|
function transformHandlerIds(cfg, bindings, s, filePath, isBuild) {
|
|
938
1015
|
let hasChanges = false;
|
|
@@ -960,6 +1037,7 @@ ${binding.localName}.$$id = "${handlerId}";`;
|
|
|
960
1037
|
import MagicString3 from "magic-string";
|
|
961
1038
|
import path3 from "node:path";
|
|
962
1039
|
import { createHash } from "node:crypto";
|
|
1040
|
+
var debug2 = createRangoDebugger("rango:transform");
|
|
963
1041
|
function transformRouter(code, filePath, routerFnNames, absolutePath) {
|
|
964
1042
|
const pat = new RegExp(
|
|
965
1043
|
`\\b(?:${routerFnNames.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\s*(?:<[^>]*>)?\\s*\\(`,
|
|
@@ -1002,11 +1080,15 @@ function transformRouter(code, filePath, routerFnNames, absolutePath) {
|
|
|
1002
1080
|
}
|
|
1003
1081
|
function exposeRouterId() {
|
|
1004
1082
|
let projectRoot = "";
|
|
1083
|
+
const counter = createCounter(debug2, "expose-router-id");
|
|
1005
1084
|
return {
|
|
1006
1085
|
name: "@rangojs/router:expose-router-id",
|
|
1007
1086
|
configResolved(config) {
|
|
1008
1087
|
projectRoot = config.root;
|
|
1009
1088
|
},
|
|
1089
|
+
buildEnd() {
|
|
1090
|
+
counter?.flush();
|
|
1091
|
+
},
|
|
1010
1092
|
transform(code, id) {
|
|
1011
1093
|
if (!code.includes("createRouter")) return null;
|
|
1012
1094
|
if (!/import\s*\{[^}]*\bcreateRouter\b[^}]*\}\s*from\s*["']@rangojs\/router(?:\/server)?["']/.test(
|
|
@@ -1015,14 +1097,25 @@ function exposeRouterId() {
|
|
|
1015
1097
|
return null;
|
|
1016
1098
|
}
|
|
1017
1099
|
if (id.includes("node_modules")) return null;
|
|
1018
|
-
const
|
|
1019
|
-
|
|
1020
|
-
|
|
1100
|
+
const start = counter ? performance.now() : 0;
|
|
1101
|
+
try {
|
|
1102
|
+
const filePath = normalizePath(path3.relative(projectRoot, id));
|
|
1103
|
+
const routerFnNames = getImportedFnNames(code, "createRouter");
|
|
1104
|
+
return transformRouter(
|
|
1105
|
+
code,
|
|
1106
|
+
filePath,
|
|
1107
|
+
routerFnNames,
|
|
1108
|
+
normalizePath(id)
|
|
1109
|
+
);
|
|
1110
|
+
} finally {
|
|
1111
|
+
counter?.record(id, performance.now() - start);
|
|
1112
|
+
}
|
|
1021
1113
|
}
|
|
1022
1114
|
};
|
|
1023
1115
|
}
|
|
1024
1116
|
|
|
1025
1117
|
// src/vite/plugins/expose-internal-ids.ts
|
|
1118
|
+
var debug3 = createRangoDebugger("rango:transform");
|
|
1026
1119
|
var VIRTUAL_LOADER_MANIFEST = "virtual:rsc-router/loader-manifest";
|
|
1027
1120
|
var RESOLVED_VIRTUAL_LOADER_MANIFEST = "\0" + VIRTUAL_LOADER_MANIFEST;
|
|
1028
1121
|
var VIRTUAL_HANDLER_PREFIX = "virtual:handler-extract:";
|
|
@@ -1035,9 +1128,13 @@ function exposeInternalIds(options) {
|
|
|
1035
1128
|
const staticHandlerModules = /* @__PURE__ */ new Map();
|
|
1036
1129
|
const virtualHandlers = /* @__PURE__ */ new Map();
|
|
1037
1130
|
const unsupportedShapeWarnings = /* @__PURE__ */ new Set();
|
|
1131
|
+
const counter = createCounter(debug3, "expose-internal-ids");
|
|
1038
1132
|
return {
|
|
1039
1133
|
name: "@rangojs/router:expose-internal-ids",
|
|
1040
1134
|
enforce: "post",
|
|
1135
|
+
buildEnd() {
|
|
1136
|
+
counter?.flush();
|
|
1137
|
+
},
|
|
1041
1138
|
api: {
|
|
1042
1139
|
prerenderHandlerModules,
|
|
1043
1140
|
staticHandlerModules
|
|
@@ -1151,11 +1248,13 @@ ${lazyImports.join(",\n")}
|
|
|
1151
1248
|
// --------------- Unified transform ---------------
|
|
1152
1249
|
transform(code, id) {
|
|
1153
1250
|
if (id.includes("/node_modules/")) return;
|
|
1154
|
-
const
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
this.
|
|
1158
|
-
|
|
1251
|
+
const __t0 = counter ? performance.now() : 0;
|
|
1252
|
+
try {
|
|
1253
|
+
const filePath = normalizePath(path4.relative(projectRoot, id));
|
|
1254
|
+
const isRscEnv = this.environment?.name === "rsc";
|
|
1255
|
+
if (id.includes(".named-routes.gen.") && !isRscEnv && this.environment?.name === "client") {
|
|
1256
|
+
this.warn(
|
|
1257
|
+
`
|
|
1159
1258
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1160
1259
|
!! !!
|
|
1161
1260
|
!! WARNING: NamedRoutes imported in a CLIENT component! !!
|
|
@@ -1175,228 +1274,373 @@ ${lazyImports.join(",\n")}
|
|
|
1175
1274
|
!! !!
|
|
1176
1275
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1177
1276
|
`
|
|
1178
|
-
|
|
1179
|
-
}
|
|
1180
|
-
if (!code.includes("@rangojs/router")) return;
|
|
1181
|
-
const has = detectImports(code);
|
|
1182
|
-
const hasLoaderCode = has.loader && code.includes("createLoader");
|
|
1183
|
-
const hasHandleCode = has.handle && code.includes("createHandle");
|
|
1184
|
-
const hasLocationStateCode = has.locationState && code.includes("createLocationState");
|
|
1185
|
-
const hasPrerenderHandlerCode = has.prerenderHandler && code.includes("Prerender");
|
|
1186
|
-
const hasStaticHandlerCode = has.staticHandler && code.includes("Static");
|
|
1187
|
-
if (!hasLoaderCode && !hasHandleCode && !hasLocationStateCode && !hasPrerenderHandlerCode && !hasStaticHandlerCode) {
|
|
1188
|
-
return;
|
|
1189
|
-
}
|
|
1190
|
-
const _fnNamesCache = /* @__PURE__ */ new Map();
|
|
1191
|
-
const _bindingsCache = /* @__PURE__ */ new Map();
|
|
1192
|
-
let _cachedAst;
|
|
1193
|
-
let _astParseFailed = false;
|
|
1194
|
-
let _astCodeRef = code;
|
|
1195
|
-
const getFnNames = (canonicalName) => {
|
|
1196
|
-
let result = _fnNamesCache.get(canonicalName);
|
|
1197
|
-
if (!result) {
|
|
1198
|
-
result = getImportedFnNames(code, canonicalName);
|
|
1199
|
-
_fnNamesCache.set(canonicalName, result);
|
|
1277
|
+
);
|
|
1200
1278
|
}
|
|
1201
|
-
return
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1279
|
+
if (!code.includes("@rangojs/router")) return;
|
|
1280
|
+
const has = detectImports(code);
|
|
1281
|
+
const hasLoaderCode = has.loader && code.includes("createLoader");
|
|
1282
|
+
const hasHandleCode = has.handle && code.includes("createHandle");
|
|
1283
|
+
const hasLocationStateCode = has.locationState && code.includes("createLocationState");
|
|
1284
|
+
const hasPrerenderHandlerCode = has.prerenderHandler && code.includes("Prerender");
|
|
1285
|
+
const hasStaticHandlerCode = has.staticHandler && code.includes("Static");
|
|
1286
|
+
if (!hasLoaderCode && !hasHandleCode && !hasLocationStateCode && !hasPrerenderHandlerCode && !hasStaticHandlerCode) {
|
|
1287
|
+
return;
|
|
1208
1288
|
}
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1289
|
+
const _fnNamesCache = /* @__PURE__ */ new Map();
|
|
1290
|
+
const _bindingsCache = /* @__PURE__ */ new Map();
|
|
1291
|
+
let _cachedAst;
|
|
1292
|
+
let _astParseFailed = false;
|
|
1293
|
+
let _astCodeRef = code;
|
|
1294
|
+
const getFnNames = (canonicalName) => {
|
|
1295
|
+
let result = _fnNamesCache.get(canonicalName);
|
|
1296
|
+
if (!result) {
|
|
1297
|
+
result = getImportedFnNames(code, canonicalName);
|
|
1298
|
+
_fnNamesCache.set(canonicalName, result);
|
|
1299
|
+
}
|
|
1300
|
+
return result;
|
|
1301
|
+
};
|
|
1302
|
+
const lazyAst = () => {
|
|
1303
|
+
if (code !== _astCodeRef) {
|
|
1304
|
+
_cachedAst = void 0;
|
|
1305
|
+
_astParseFailed = false;
|
|
1306
|
+
_astCodeRef = code;
|
|
1307
|
+
}
|
|
1308
|
+
if (_cachedAst !== void 0 || _astParseFailed) return _cachedAst;
|
|
1309
|
+
try {
|
|
1310
|
+
_cachedAst = parseAst2(code, { jsx: true });
|
|
1311
|
+
} catch {
|
|
1312
|
+
_astParseFailed = true;
|
|
1313
|
+
}
|
|
1314
|
+
return _cachedAst;
|
|
1315
|
+
};
|
|
1316
|
+
const getBindings = (currentCode, fnNames) => {
|
|
1317
|
+
const key = fnNames.join("\0");
|
|
1318
|
+
let result = _bindingsCache.get(key);
|
|
1319
|
+
if (!result) {
|
|
1320
|
+
result = collectCreateExportBindings(
|
|
1321
|
+
currentCode,
|
|
1322
|
+
fnNames,
|
|
1323
|
+
lazyAst()
|
|
1324
|
+
);
|
|
1325
|
+
_bindingsCache.set(key, result);
|
|
1326
|
+
}
|
|
1327
|
+
return result;
|
|
1328
|
+
};
|
|
1329
|
+
for (const cfg of STRICT_CREATE_CONFIGS) {
|
|
1330
|
+
const hasCode = cfg.fnName === "createLoader" ? hasLoaderCode : cfg.fnName === "createHandle" ? hasHandleCode : hasLocationStateCode;
|
|
1331
|
+
if (!hasCode) continue;
|
|
1332
|
+
const fnNames = getFnNames(cfg.fnName);
|
|
1333
|
+
const totalCalls = countCreateCallsForNames(code, fnNames);
|
|
1334
|
+
const supportedBindings = getBindings(code, fnNames).length;
|
|
1335
|
+
if (totalCalls <= supportedBindings) continue;
|
|
1336
|
+
const warnKey = `${id}::${cfg.fnName}`;
|
|
1337
|
+
if (unsupportedShapeWarnings.has(warnKey)) continue;
|
|
1338
|
+
unsupportedShapeWarnings.add(warnKey);
|
|
1339
|
+
this.warn(buildUnsupportedShapeWarning(filePath, cfg.fnName));
|
|
1214
1340
|
}
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1341
|
+
if (hasLoaderCode && isRscEnv) {
|
|
1342
|
+
const fnNames = getFnNames("createLoader");
|
|
1343
|
+
const bindings = getBindings(code, fnNames);
|
|
1344
|
+
for (const binding of bindings) {
|
|
1345
|
+
const exportName = binding.exportNames[0];
|
|
1346
|
+
const hashedId = hashId(filePath, exportName);
|
|
1347
|
+
loaderRegistry.set(hashedId, {
|
|
1348
|
+
filePath,
|
|
1349
|
+
exportName
|
|
1350
|
+
});
|
|
1351
|
+
}
|
|
1223
1352
|
}
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
const totalCalls = countCreateCallsForNames(code, fnNames);
|
|
1231
|
-
const supportedBindings = getBindings(code, fnNames).length;
|
|
1232
|
-
if (totalCalls <= supportedBindings) continue;
|
|
1233
|
-
const warnKey = `${id}::${cfg.fnName}`;
|
|
1234
|
-
if (unsupportedShapeWarnings.has(warnKey)) continue;
|
|
1235
|
-
unsupportedShapeWarnings.add(warnKey);
|
|
1236
|
-
this.warn(buildUnsupportedShapeWarning(filePath, cfg.fnName));
|
|
1237
|
-
}
|
|
1238
|
-
if (hasLoaderCode && isRscEnv) {
|
|
1239
|
-
const fnNames = getFnNames("createLoader");
|
|
1240
|
-
const bindings = getBindings(code, fnNames);
|
|
1241
|
-
for (const binding of bindings) {
|
|
1242
|
-
const exportName = binding.exportNames[0];
|
|
1243
|
-
const hashedId = hashId(filePath, exportName);
|
|
1244
|
-
loaderRegistry.set(hashedId, {
|
|
1353
|
+
if (hasLoaderCode && !isRscEnv) {
|
|
1354
|
+
const fnNames = getFnNames("createLoader");
|
|
1355
|
+
const bindings = getBindings(code, fnNames);
|
|
1356
|
+
const stubResult = generateClientLoaderStubs(
|
|
1357
|
+
bindings,
|
|
1358
|
+
code,
|
|
1245
1359
|
filePath,
|
|
1246
|
-
|
|
1247
|
-
|
|
1360
|
+
isBuild
|
|
1361
|
+
);
|
|
1362
|
+
if (stubResult) return stubResult;
|
|
1248
1363
|
}
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
}
|
|
1261
|
-
if (hasPrerenderHandlerCode && !isRscEnv) {
|
|
1262
|
-
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1263
|
-
const bindings = getBindings(code, fnNames);
|
|
1264
|
-
const wholeFile = generateWholeFileStubs(
|
|
1265
|
-
PRERENDER_CONFIG,
|
|
1266
|
-
bindings,
|
|
1267
|
-
code,
|
|
1268
|
-
filePath,
|
|
1269
|
-
isBuild
|
|
1270
|
-
);
|
|
1271
|
-
if (wholeFile) return wholeFile;
|
|
1272
|
-
const exprStubs = generateExprStubs(
|
|
1273
|
-
PRERENDER_CONFIG,
|
|
1274
|
-
bindings,
|
|
1275
|
-
code,
|
|
1276
|
-
filePath,
|
|
1277
|
-
id,
|
|
1278
|
-
isBuild
|
|
1279
|
-
);
|
|
1280
|
-
if (exprStubs) return exprStubs;
|
|
1281
|
-
}
|
|
1282
|
-
if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
|
|
1283
|
-
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1284
|
-
const exportNames = getBindings(code, fnNames).map(
|
|
1285
|
-
(b) => b.exportNames[0]
|
|
1286
|
-
);
|
|
1287
|
-
if (exportNames.length > 0) {
|
|
1288
|
-
prerenderHandlerModules.set(id, exportNames);
|
|
1364
|
+
if (hasPrerenderHandlerCode && !isRscEnv) {
|
|
1365
|
+
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1366
|
+
const bindings = getBindings(code, fnNames);
|
|
1367
|
+
const wholeFile = generateWholeFileStubs(
|
|
1368
|
+
PRERENDER_CONFIG,
|
|
1369
|
+
bindings,
|
|
1370
|
+
code,
|
|
1371
|
+
filePath,
|
|
1372
|
+
isBuild
|
|
1373
|
+
);
|
|
1374
|
+
if (wholeFile) return wholeFile;
|
|
1289
1375
|
}
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
const
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
const
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1376
|
+
if (hasPrerenderHandlerCode && isRscEnv && isBuild) {
|
|
1377
|
+
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1378
|
+
const exportNames = getBindings(code, fnNames).map(
|
|
1379
|
+
(b) => b.exportNames[0]
|
|
1380
|
+
);
|
|
1381
|
+
if (exportNames.length > 0) {
|
|
1382
|
+
prerenderHandlerModules.set(id, exportNames);
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
let changed = false;
|
|
1386
|
+
const handlerConfigs = [
|
|
1387
|
+
hasStaticHandlerCode && STATIC_CONFIG,
|
|
1388
|
+
hasPrerenderHandlerCode && PRERENDER_CONFIG
|
|
1389
|
+
].filter((c) => !!c).map((cfg) => {
|
|
1390
|
+
const fnNames = getFnNames(cfg.fnName);
|
|
1391
|
+
return { cfg, fnNames };
|
|
1392
|
+
});
|
|
1393
|
+
for (const { cfg, fnNames } of handlerConfigs) {
|
|
1394
|
+
const totalCalls = countCreateCallsForNames(code, fnNames);
|
|
1395
|
+
const supportedBindings = getBindings(code, fnNames).length;
|
|
1396
|
+
if (totalCalls > supportedBindings) {
|
|
1397
|
+
const iterS = new MagicString4(code);
|
|
1398
|
+
const result = transformInlineHandlers(
|
|
1399
|
+
cfg.fnName,
|
|
1400
|
+
VIRTUAL_HANDLER_PREFIX,
|
|
1401
|
+
iterS,
|
|
1402
|
+
code,
|
|
1403
|
+
filePath,
|
|
1404
|
+
virtualHandlers,
|
|
1405
|
+
id,
|
|
1406
|
+
parseAst2
|
|
1407
|
+
);
|
|
1408
|
+
if (result) {
|
|
1409
|
+
changed = true;
|
|
1410
|
+
code = iterS.toString();
|
|
1411
|
+
_bindingsCache.clear();
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
if (hasStaticHandlerCode && !isRscEnv) {
|
|
1416
|
+
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1417
|
+
const bindings = getBindings(code, fnNames);
|
|
1418
|
+
const wholeFile = generateWholeFileStubs(
|
|
1419
|
+
STATIC_CONFIG,
|
|
1420
|
+
bindings,
|
|
1308
1421
|
code,
|
|
1309
1422
|
filePath,
|
|
1310
|
-
|
|
1311
|
-
id,
|
|
1312
|
-
parseAst2
|
|
1423
|
+
isBuild
|
|
1313
1424
|
);
|
|
1314
|
-
if (
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1425
|
+
if (wholeFile) return wholeFile;
|
|
1426
|
+
}
|
|
1427
|
+
if (!isRscEnv && (hasPrerenderHandlerCode || hasStaticHandlerCode)) {
|
|
1428
|
+
const prerenderFnNames = hasPrerenderHandlerCode ? getFnNames(PRERENDER_CONFIG.fnName) : [];
|
|
1429
|
+
const staticFnNames = hasStaticHandlerCode ? getFnNames(STATIC_CONFIG.fnName) : [];
|
|
1430
|
+
const loaderFnNames = hasLoaderCode ? getFnNames("createLoader") : [];
|
|
1431
|
+
const handleFnNames = hasHandleCode ? getFnNames("createHandle") : [];
|
|
1432
|
+
const lsFnNames = hasLocationStateCode ? getFnNames("createLocationState") : [];
|
|
1433
|
+
const allBindings = [];
|
|
1434
|
+
for (const fnNames of [
|
|
1435
|
+
prerenderFnNames,
|
|
1436
|
+
staticFnNames,
|
|
1437
|
+
loaderFnNames,
|
|
1438
|
+
handleFnNames,
|
|
1439
|
+
lsFnNames
|
|
1440
|
+
]) {
|
|
1441
|
+
if (fnNames.length > 0) {
|
|
1442
|
+
allBindings.push(...getBindings(code, fnNames));
|
|
1443
|
+
}
|
|
1444
|
+
}
|
|
1445
|
+
let canStubWholeFile = allBindings.length > 0 && isExportOnlyFile(code, allBindings);
|
|
1446
|
+
if (canStubWholeFile && (handleFnNames.length > 0 || lsFnNames.length > 0)) {
|
|
1447
|
+
const exportedLocals = new Set(allBindings.map((b) => b.localName));
|
|
1448
|
+
const strippedBindings = [];
|
|
1449
|
+
const localDeclPattern = /(?:^|;|\n)\s*(?:const|let|var|function)\s+(\w+)/g;
|
|
1450
|
+
let declMatch;
|
|
1451
|
+
while ((declMatch = localDeclPattern.exec(code)) !== null) {
|
|
1452
|
+
const name = declMatch[1];
|
|
1453
|
+
if (!exportedLocals.has(name) && !/^_c\d*$/.test(name)) {
|
|
1454
|
+
strippedBindings.push(name);
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
const importPattern = /import\s*\{([^}]*)\}\s*from\s*["'](?!@rangojs\/router)[^"']*["']/g;
|
|
1458
|
+
let importMatch;
|
|
1459
|
+
while ((importMatch = importPattern.exec(code)) !== null) {
|
|
1460
|
+
for (const spec of importMatch[1].split(",")) {
|
|
1461
|
+
const m = spec.trim().match(/^[A-Za-z_$][\w$]*(?:\s+as\s+([A-Za-z_$][\w$]*))?$/);
|
|
1462
|
+
if (m)
|
|
1463
|
+
strippedBindings.push(m[1] || m[0].trim().split(/\s/)[0]);
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
const defaultImportPattern = /import\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
|
|
1467
|
+
while ((importMatch = defaultImportPattern.exec(code)) !== null) {
|
|
1468
|
+
strippedBindings.push(importMatch[1]);
|
|
1469
|
+
}
|
|
1470
|
+
const nsImportPattern = /import\s+\*\s+as\s+([A-Za-z_$][\w$]*)\s+from\s*["'](?!@rangojs\/router)[^"']*["']/g;
|
|
1471
|
+
while ((importMatch = nsImportPattern.exec(code)) !== null) {
|
|
1472
|
+
strippedBindings.push(importMatch[1]);
|
|
1473
|
+
}
|
|
1474
|
+
if (strippedBindings.length > 0) {
|
|
1475
|
+
const preservedBindings = allBindings.filter((b) => {
|
|
1476
|
+
const fc = code.slice(b.callExprStart, b.callOpenParenPos + 1);
|
|
1477
|
+
return handleFnNames.some((n) => fc.includes(n)) || lsFnNames.some((n) => fc.includes(n));
|
|
1478
|
+
});
|
|
1479
|
+
const strippedRe = new RegExp(
|
|
1480
|
+
`\\b(?:${strippedBindings.join("|")})\\b`
|
|
1481
|
+
);
|
|
1482
|
+
canStubWholeFile = !preservedBindings.some((b) => {
|
|
1483
|
+
const expr = code.slice(
|
|
1484
|
+
b.callExprStart,
|
|
1485
|
+
b.callCloseParenPos + 1
|
|
1486
|
+
);
|
|
1487
|
+
return strippedRe.test(expr);
|
|
1488
|
+
});
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
if (canStubWholeFile) {
|
|
1492
|
+
const lines = [];
|
|
1493
|
+
const neededImports = [];
|
|
1494
|
+
if (handleFnNames.length > 0) neededImports.push("createHandle");
|
|
1495
|
+
if (lsFnNames.length > 0) neededImports.push("createLocationState");
|
|
1496
|
+
if (neededImports.length > 0) {
|
|
1497
|
+
lines.push(
|
|
1498
|
+
`import { ${neededImports.join(", ")} } from "@rangojs/router";`
|
|
1499
|
+
);
|
|
1500
|
+
}
|
|
1501
|
+
for (const binding of allBindings) {
|
|
1502
|
+
const fnCall = code.slice(
|
|
1503
|
+
binding.callExprStart,
|
|
1504
|
+
binding.callOpenParenPos + 1
|
|
1505
|
+
);
|
|
1506
|
+
const isHandle = handleFnNames.some((n) => fnCall.includes(n));
|
|
1507
|
+
const isLocationState = lsFnNames.some((n) => fnCall.includes(n));
|
|
1508
|
+
const primaryName = binding.exportNames[0];
|
|
1509
|
+
const stubId = makeStubId(filePath, primaryName, isBuild);
|
|
1510
|
+
if (isHandle || isLocationState) {
|
|
1511
|
+
const rawArgs = code.slice(
|
|
1512
|
+
binding.callOpenParenPos + 1,
|
|
1513
|
+
binding.callCloseParenPos
|
|
1514
|
+
).replace(/\b_c\d*\s*=\s*/g, "");
|
|
1515
|
+
const canonicalName = isHandle ? "createHandle" : "createLocationState";
|
|
1516
|
+
const activeFnNames = isHandle ? handleFnNames : lsFnNames;
|
|
1517
|
+
let rawCallee = code.slice(
|
|
1518
|
+
binding.callExprStart,
|
|
1519
|
+
binding.callOpenParenPos
|
|
1520
|
+
);
|
|
1521
|
+
for (const alias of activeFnNames) {
|
|
1522
|
+
if (alias !== canonicalName && rawCallee.startsWith(alias)) {
|
|
1523
|
+
rawCallee = canonicalName + rawCallee.slice(alias.length);
|
|
1524
|
+
break;
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
if (isHandle) {
|
|
1528
|
+
const idParam = binding.argCount === 0 ? `undefined, "${stubId}"` : `, "${stubId}"`;
|
|
1529
|
+
lines.push(
|
|
1530
|
+
`export const ${primaryName} = ${rawCallee}(${rawArgs}${idParam});`
|
|
1531
|
+
);
|
|
1532
|
+
lines.push(`${primaryName}.$$id = "${stubId}";`);
|
|
1533
|
+
} else {
|
|
1534
|
+
lines.push(
|
|
1535
|
+
`export const ${primaryName} = ${rawCallee}(${rawArgs});`
|
|
1536
|
+
);
|
|
1537
|
+
lines.push(
|
|
1538
|
+
`${primaryName}.__rsc_ls_key = "__rsc_ls_${stubId}";`
|
|
1539
|
+
);
|
|
1540
|
+
}
|
|
1541
|
+
for (const name of binding.exportNames.slice(1)) {
|
|
1542
|
+
lines.push(`export const ${name} = ${primaryName};`);
|
|
1543
|
+
}
|
|
1544
|
+
} else {
|
|
1545
|
+
let brand = "loader";
|
|
1546
|
+
if (prerenderFnNames.some((n) => fnCall.includes(n))) {
|
|
1547
|
+
brand = PRERENDER_CONFIG.brand;
|
|
1548
|
+
} else if (staticFnNames.some((n) => fnCall.includes(n))) {
|
|
1549
|
+
brand = STATIC_CONFIG.brand;
|
|
1550
|
+
}
|
|
1551
|
+
lines.push(
|
|
1552
|
+
`export const ${primaryName} = { __brand: "${brand}", $$id: "${stubId}" };`
|
|
1553
|
+
);
|
|
1554
|
+
for (const name of binding.exportNames.slice(1)) {
|
|
1555
|
+
lines.push(`export const ${name} = ${primaryName};`);
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
return { code: lines.join("\n") + "\n", map: null };
|
|
1318
1560
|
}
|
|
1319
1561
|
}
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
filePath,
|
|
1329
|
-
isBuild
|
|
1330
|
-
);
|
|
1331
|
-
if (wholeFile) return wholeFile;
|
|
1332
|
-
const exprStubs = generateExprStubs(
|
|
1333
|
-
STATIC_CONFIG,
|
|
1334
|
-
bindings,
|
|
1335
|
-
code,
|
|
1336
|
-
filePath,
|
|
1337
|
-
id,
|
|
1338
|
-
isBuild
|
|
1339
|
-
);
|
|
1340
|
-
if (exprStubs) return exprStubs;
|
|
1341
|
-
}
|
|
1342
|
-
if (hasStaticHandlerCode && isRscEnv && isBuild) {
|
|
1343
|
-
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1344
|
-
const exportNames = getBindings(code, fnNames).map(
|
|
1345
|
-
(b) => b.exportNames[0]
|
|
1346
|
-
);
|
|
1347
|
-
if (exportNames.length > 0) {
|
|
1348
|
-
staticHandlerModules.set(id, exportNames);
|
|
1562
|
+
if (hasStaticHandlerCode && isRscEnv && isBuild) {
|
|
1563
|
+
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1564
|
+
const exportNames = getBindings(code, fnNames).map(
|
|
1565
|
+
(b) => b.exportNames[0]
|
|
1566
|
+
);
|
|
1567
|
+
if (exportNames.length > 0) {
|
|
1568
|
+
staticHandlerModules.set(id, exportNames);
|
|
1569
|
+
}
|
|
1349
1570
|
}
|
|
1571
|
+
const s = new MagicString4(code);
|
|
1572
|
+
if (hasLoaderCode) {
|
|
1573
|
+
const fnNames = getFnNames("createLoader");
|
|
1574
|
+
changed = transformLoaders(
|
|
1575
|
+
getBindings(code, fnNames),
|
|
1576
|
+
s,
|
|
1577
|
+
filePath,
|
|
1578
|
+
isBuild
|
|
1579
|
+
) || changed;
|
|
1580
|
+
}
|
|
1581
|
+
if (hasHandleCode) {
|
|
1582
|
+
const fnNames = getFnNames("createHandle");
|
|
1583
|
+
changed = transformHandles(
|
|
1584
|
+
getBindings(code, fnNames),
|
|
1585
|
+
s,
|
|
1586
|
+
code,
|
|
1587
|
+
filePath,
|
|
1588
|
+
isBuild
|
|
1589
|
+
) || changed;
|
|
1590
|
+
}
|
|
1591
|
+
if (hasLocationStateCode) {
|
|
1592
|
+
const fnNames = getFnNames("createLocationState");
|
|
1593
|
+
changed = transformLocationState(
|
|
1594
|
+
getBindings(code, fnNames),
|
|
1595
|
+
s,
|
|
1596
|
+
filePath,
|
|
1597
|
+
isBuild
|
|
1598
|
+
) || changed;
|
|
1599
|
+
}
|
|
1600
|
+
if (hasPrerenderHandlerCode) {
|
|
1601
|
+
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1602
|
+
const bindings = getBindings(code, fnNames);
|
|
1603
|
+
if (isRscEnv) {
|
|
1604
|
+
changed = transformHandlerIds(
|
|
1605
|
+
PRERENDER_CONFIG,
|
|
1606
|
+
bindings,
|
|
1607
|
+
s,
|
|
1608
|
+
filePath,
|
|
1609
|
+
isBuild
|
|
1610
|
+
) || changed;
|
|
1611
|
+
} else {
|
|
1612
|
+
changed = stubHandlerExprs(
|
|
1613
|
+
PRERENDER_CONFIG,
|
|
1614
|
+
bindings,
|
|
1615
|
+
s,
|
|
1616
|
+
filePath,
|
|
1617
|
+
isBuild
|
|
1618
|
+
) || changed;
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
if (hasStaticHandlerCode) {
|
|
1622
|
+
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1623
|
+
const bindings = getBindings(code, fnNames);
|
|
1624
|
+
if (isRscEnv) {
|
|
1625
|
+
changed = transformHandlerIds(
|
|
1626
|
+
STATIC_CONFIG,
|
|
1627
|
+
bindings,
|
|
1628
|
+
s,
|
|
1629
|
+
filePath,
|
|
1630
|
+
isBuild
|
|
1631
|
+
) || changed;
|
|
1632
|
+
} else {
|
|
1633
|
+
changed = stubHandlerExprs(STATIC_CONFIG, bindings, s, filePath, isBuild) || changed;
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
if (!changed) return;
|
|
1637
|
+
return {
|
|
1638
|
+
code: s.toString(),
|
|
1639
|
+
map: s.generateMap({ source: id, includeContent: true })
|
|
1640
|
+
};
|
|
1641
|
+
} finally {
|
|
1642
|
+
counter?.record(id, performance.now() - __t0);
|
|
1350
1643
|
}
|
|
1351
|
-
const s = new MagicString4(code);
|
|
1352
|
-
if (hasLoaderCode) {
|
|
1353
|
-
const fnNames = getFnNames("createLoader");
|
|
1354
|
-
changed = transformLoaders(getBindings(code, fnNames), s, filePath, isBuild) || changed;
|
|
1355
|
-
}
|
|
1356
|
-
if (hasHandleCode) {
|
|
1357
|
-
const fnNames = getFnNames("createHandle");
|
|
1358
|
-
changed = transformHandles(
|
|
1359
|
-
getBindings(code, fnNames),
|
|
1360
|
-
s,
|
|
1361
|
-
code,
|
|
1362
|
-
filePath,
|
|
1363
|
-
isBuild
|
|
1364
|
-
) || changed;
|
|
1365
|
-
}
|
|
1366
|
-
if (hasLocationStateCode) {
|
|
1367
|
-
const fnNames = getFnNames("createLocationState");
|
|
1368
|
-
changed = transformLocationState(
|
|
1369
|
-
getBindings(code, fnNames),
|
|
1370
|
-
s,
|
|
1371
|
-
filePath,
|
|
1372
|
-
isBuild
|
|
1373
|
-
) || changed;
|
|
1374
|
-
}
|
|
1375
|
-
if (hasPrerenderHandlerCode && isRscEnv) {
|
|
1376
|
-
const fnNames = getFnNames(PRERENDER_CONFIG.fnName);
|
|
1377
|
-
changed = transformHandlerIds(
|
|
1378
|
-
PRERENDER_CONFIG,
|
|
1379
|
-
getBindings(code, fnNames),
|
|
1380
|
-
s,
|
|
1381
|
-
filePath,
|
|
1382
|
-
isBuild
|
|
1383
|
-
) || changed;
|
|
1384
|
-
}
|
|
1385
|
-
if (hasStaticHandlerCode && isRscEnv) {
|
|
1386
|
-
const fnNames = getFnNames(STATIC_CONFIG.fnName);
|
|
1387
|
-
changed = transformHandlerIds(
|
|
1388
|
-
STATIC_CONFIG,
|
|
1389
|
-
getBindings(code, fnNames),
|
|
1390
|
-
s,
|
|
1391
|
-
filePath,
|
|
1392
|
-
isBuild
|
|
1393
|
-
) || changed;
|
|
1394
|
-
}
|
|
1395
|
-
if (!changed) return;
|
|
1396
|
-
return {
|
|
1397
|
-
code: s.toString(),
|
|
1398
|
-
map: s.generateMap({ source: id, includeContent: true })
|
|
1399
|
-
};
|
|
1400
1644
|
}
|
|
1401
1645
|
};
|
|
1402
1646
|
}
|
|
@@ -1404,12 +1648,14 @@ ${lazyImports.join(",\n")}
|
|
|
1404
1648
|
// src/vite/plugins/use-cache-transform.ts
|
|
1405
1649
|
import path5 from "node:path";
|
|
1406
1650
|
import MagicString5 from "magic-string";
|
|
1651
|
+
var debug4 = createRangoDebugger("rango:transform");
|
|
1407
1652
|
var CACHE_RUNTIME_IMPORT = "@rangojs/router/cache-runtime";
|
|
1408
1653
|
var LAYOUT_TEMPLATE_PATTERN = /\/(layout|template)\.(tsx?|jsx?)$/;
|
|
1409
1654
|
function useCacheTransform() {
|
|
1410
1655
|
let projectRoot = "";
|
|
1411
1656
|
let isBuild = false;
|
|
1412
1657
|
let rscTransforms = null;
|
|
1658
|
+
const counter = createCounter(debug4, "use-cache");
|
|
1413
1659
|
return {
|
|
1414
1660
|
name: "@rangojs/router:use-cache",
|
|
1415
1661
|
enforce: "post",
|
|
@@ -1417,53 +1663,61 @@ function useCacheTransform() {
|
|
|
1417
1663
|
projectRoot = config.root;
|
|
1418
1664
|
isBuild = config.command === "build";
|
|
1419
1665
|
},
|
|
1666
|
+
buildEnd() {
|
|
1667
|
+
counter?.flush();
|
|
1668
|
+
},
|
|
1420
1669
|
async transform(code, id) {
|
|
1421
1670
|
if (this.environment?.name !== "rsc") return;
|
|
1422
1671
|
if (!code.includes("use cache")) return;
|
|
1423
1672
|
if (id.includes("/node_modules/") || id.startsWith("\0")) return;
|
|
1424
1673
|
if (!/\.(tsx?|jsx?|mjs)$/.test(id)) return;
|
|
1425
|
-
|
|
1674
|
+
const start = counter ? performance.now() : 0;
|
|
1675
|
+
try {
|
|
1676
|
+
if (!rscTransforms) {
|
|
1677
|
+
try {
|
|
1678
|
+
rscTransforms = await import("@vitejs/plugin-rsc/transforms");
|
|
1679
|
+
} catch {
|
|
1680
|
+
return;
|
|
1681
|
+
}
|
|
1682
|
+
}
|
|
1683
|
+
const {
|
|
1684
|
+
hasDirective,
|
|
1685
|
+
transformWrapExport,
|
|
1686
|
+
transformHoistInlineDirective
|
|
1687
|
+
} = rscTransforms;
|
|
1688
|
+
let ast;
|
|
1426
1689
|
try {
|
|
1427
|
-
|
|
1690
|
+
const { parseAst: parseAst4 } = await import("vite");
|
|
1691
|
+
ast = parseAst4(code);
|
|
1428
1692
|
} catch {
|
|
1429
1693
|
return;
|
|
1430
1694
|
}
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
hasDirective,
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
const isLayoutOrTemplate = LAYOUT_TEMPLATE_PATTERN.test(id);
|
|
1446
|
-
if (hasDirective(ast.body, "use cache")) {
|
|
1447
|
-
return transformFileLevelUseCache(
|
|
1695
|
+
const filePath = normalizePath(path5.relative(projectRoot, id));
|
|
1696
|
+
const isLayoutOrTemplate = LAYOUT_TEMPLATE_PATTERN.test(id);
|
|
1697
|
+
if (hasDirective(ast.body, "use cache")) {
|
|
1698
|
+
return transformFileLevelUseCache(
|
|
1699
|
+
code,
|
|
1700
|
+
ast,
|
|
1701
|
+
filePath,
|
|
1702
|
+
id,
|
|
1703
|
+
isBuild,
|
|
1704
|
+
isLayoutOrTemplate,
|
|
1705
|
+
transformWrapExport
|
|
1706
|
+
);
|
|
1707
|
+
}
|
|
1708
|
+
const functionResult = transformFunctionLevelUseCache(
|
|
1448
1709
|
code,
|
|
1449
1710
|
ast,
|
|
1450
1711
|
filePath,
|
|
1451
1712
|
id,
|
|
1452
1713
|
isBuild,
|
|
1453
|
-
|
|
1454
|
-
transformWrapExport
|
|
1714
|
+
transformHoistInlineDirective
|
|
1455
1715
|
);
|
|
1716
|
+
warnOnNearMissDirectives(ast, id, this.warn.bind(this));
|
|
1717
|
+
if (functionResult) return functionResult;
|
|
1718
|
+
} finally {
|
|
1719
|
+
counter?.record(id, performance.now() - start);
|
|
1456
1720
|
}
|
|
1457
|
-
const functionResult = transformFunctionLevelUseCache(
|
|
1458
|
-
code,
|
|
1459
|
-
ast,
|
|
1460
|
-
filePath,
|
|
1461
|
-
id,
|
|
1462
|
-
isBuild,
|
|
1463
|
-
transformHoistInlineDirective
|
|
1464
|
-
);
|
|
1465
|
-
warnOnNearMissDirectives(ast, id, this.warn.bind(this));
|
|
1466
|
-
if (functionResult) return functionResult;
|
|
1467
1721
|
}
|
|
1468
1722
|
};
|
|
1469
1723
|
}
|
|
@@ -1586,6 +1840,7 @@ function warnOnNearMissDirectives(ast, fileId, warn) {
|
|
|
1586
1840
|
}
|
|
1587
1841
|
|
|
1588
1842
|
// src/vite/plugins/client-ref-dedup.ts
|
|
1843
|
+
var debug5 = createRangoDebugger("rango:transform");
|
|
1589
1844
|
var CLIENT_IN_SERVER_PROXY_PREFIX = "virtual:vite-rsc/client-in-server-package-proxy/";
|
|
1590
1845
|
function extractPackageName(absolutePath) {
|
|
1591
1846
|
const marker = "/node_modules/";
|
|
@@ -1602,6 +1857,8 @@ function extractPackageName(absolutePath) {
|
|
|
1602
1857
|
}
|
|
1603
1858
|
function clientRefDedup() {
|
|
1604
1859
|
let clientExclude = [];
|
|
1860
|
+
let hits = 0;
|
|
1861
|
+
const dedupedPackages = /* @__PURE__ */ new Set();
|
|
1605
1862
|
return {
|
|
1606
1863
|
name: "@rangojs/router:client-ref-dedup",
|
|
1607
1864
|
enforce: "pre",
|
|
@@ -1610,6 +1867,16 @@ function clientRefDedup() {
|
|
|
1610
1867
|
const clientEnv = config.environments?.["client"];
|
|
1611
1868
|
clientExclude = clientEnv?.optimizeDeps?.exclude ?? config.optimizeDeps?.exclude ?? [];
|
|
1612
1869
|
},
|
|
1870
|
+
buildEnd() {
|
|
1871
|
+
if (debug5 && hits > 0) {
|
|
1872
|
+
debug5(
|
|
1873
|
+
"client-ref-dedup: %d redirects across %d packages (%s)",
|
|
1874
|
+
hits,
|
|
1875
|
+
dedupedPackages.size,
|
|
1876
|
+
[...dedupedPackages].join(",")
|
|
1877
|
+
);
|
|
1878
|
+
}
|
|
1879
|
+
},
|
|
1613
1880
|
resolveId(source, importer, options) {
|
|
1614
1881
|
if (this.environment?.name !== "client") return;
|
|
1615
1882
|
if (!importer?.includes(CLIENT_IN_SERVER_PROXY_PREFIX)) return;
|
|
@@ -1618,6 +1885,10 @@ function clientRefDedup() {
|
|
|
1618
1885
|
const packageName = extractPackageName(source);
|
|
1619
1886
|
if (!packageName) return;
|
|
1620
1887
|
if (clientExclude.includes(packageName)) return;
|
|
1888
|
+
if (debug5) {
|
|
1889
|
+
hits++;
|
|
1890
|
+
dedupedPackages.add(packageName);
|
|
1891
|
+
}
|
|
1621
1892
|
return `\0rango:dedup/${packageName}`;
|
|
1622
1893
|
},
|
|
1623
1894
|
load(id) {
|
|
@@ -1740,12 +2011,13 @@ function getVirtualVersionContent(version) {
|
|
|
1740
2011
|
|
|
1741
2012
|
// src/vite/utils/package-resolution.ts
|
|
1742
2013
|
import { existsSync } from "node:fs";
|
|
2014
|
+
import { createRequire } from "node:module";
|
|
1743
2015
|
import { resolve } from "node:path";
|
|
1744
2016
|
|
|
1745
2017
|
// package.json
|
|
1746
2018
|
var package_default = {
|
|
1747
2019
|
name: "@rangojs/router",
|
|
1748
|
-
version: "0.0.0-experimental.
|
|
2020
|
+
version: "0.0.0-experimental.9eb4192e",
|
|
1749
2021
|
description: "Django-inspired RSC router with composable URL patterns",
|
|
1750
2022
|
keywords: [
|
|
1751
2023
|
"react",
|
|
@@ -1878,22 +2150,24 @@ var package_default = {
|
|
|
1878
2150
|
tag: "experimental"
|
|
1879
2151
|
},
|
|
1880
2152
|
scripts: {
|
|
1881
|
-
build: "pnpm dlx esbuild src/vite/index.ts --bundle --format=esm --outfile=dist/vite/index.js --platform=node --packages=external && pnpm dlx esbuild src/bin/rango.ts --bundle --format=esm --outfile=dist/bin/rango.js --platform=node --packages=external --banner:js='#!/usr/bin/env node' && chmod +x dist/bin/rango.js",
|
|
2153
|
+
build: "pnpm dlx esbuild src/vite/index.ts --bundle --format=esm --outfile=dist/vite/index.js --platform=node --packages=external && mkdir -p dist/vite/plugins && cp src/vite/plugins/cloudflare-protocol-loader-hook.mjs dist/vite/plugins/cloudflare-protocol-loader-hook.mjs && pnpm dlx esbuild src/bin/rango.ts --bundle --format=esm --outfile=dist/bin/rango.js --platform=node --packages=external --banner:js='#!/usr/bin/env node' && chmod +x dist/bin/rango.js",
|
|
1882
2154
|
prepublishOnly: "pnpm build",
|
|
1883
|
-
typecheck: "tsc --noEmit",
|
|
2155
|
+
typecheck: "tsc --noEmit && tsc -p tsconfig.strict-check.json --noEmit",
|
|
1884
2156
|
test: "playwright test",
|
|
1885
2157
|
"test:ui": "playwright test --ui",
|
|
1886
2158
|
"test:unit": "vitest run",
|
|
1887
2159
|
"test:unit:watch": "vitest"
|
|
1888
2160
|
},
|
|
1889
2161
|
dependencies: {
|
|
1890
|
-
"@vitejs/plugin-rsc": "^0.5.
|
|
2162
|
+
"@vitejs/plugin-rsc": "^0.5.23",
|
|
2163
|
+
debug: "^4.4.1",
|
|
1891
2164
|
"magic-string": "^0.30.17",
|
|
1892
2165
|
picomatch: "^4.0.3",
|
|
1893
2166
|
"rsc-html-stream": "^0.0.7"
|
|
1894
2167
|
},
|
|
1895
2168
|
devDependencies: {
|
|
1896
2169
|
"@playwright/test": "^1.49.1",
|
|
2170
|
+
"@types/debug": "^4.1.12",
|
|
1897
2171
|
"@types/node": "^24.10.1",
|
|
1898
2172
|
"@types/react": "catalog:",
|
|
1899
2173
|
"@types/react-dom": "catalog:",
|
|
@@ -1907,7 +2181,7 @@ var package_default = {
|
|
|
1907
2181
|
},
|
|
1908
2182
|
peerDependencies: {
|
|
1909
2183
|
"@cloudflare/vite-plugin": "^1.25.0",
|
|
1910
|
-
"@vitejs/plugin-rsc": "^0.5.
|
|
2184
|
+
"@vitejs/plugin-rsc": "^0.5.23",
|
|
1911
2185
|
react: "^18.0.0 || ^19.0.0",
|
|
1912
2186
|
vite: "^7.3.0"
|
|
1913
2187
|
},
|
|
@@ -1922,6 +2196,7 @@ var package_default = {
|
|
|
1922
2196
|
};
|
|
1923
2197
|
|
|
1924
2198
|
// src/vite/utils/package-resolution.ts
|
|
2199
|
+
var require2 = createRequire(import.meta.url);
|
|
1925
2200
|
var VIRTUAL_PACKAGE_NAME = "@rangojs/router";
|
|
1926
2201
|
function getPublishedPackageName() {
|
|
1927
2202
|
return package_default.name;
|
|
@@ -1962,6 +2237,20 @@ function getPackageAliases() {
|
|
|
1962
2237
|
}
|
|
1963
2238
|
return aliases;
|
|
1964
2239
|
}
|
|
2240
|
+
function getVendorAliases() {
|
|
2241
|
+
const specs = [
|
|
2242
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge",
|
|
2243
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
2244
|
+
];
|
|
2245
|
+
const aliases = {};
|
|
2246
|
+
for (const spec of specs) {
|
|
2247
|
+
try {
|
|
2248
|
+
aliases[spec] = require2.resolve(spec);
|
|
2249
|
+
} catch {
|
|
2250
|
+
}
|
|
2251
|
+
}
|
|
2252
|
+
return aliases;
|
|
2253
|
+
}
|
|
1965
2254
|
|
|
1966
2255
|
// src/build/route-types/param-extraction.ts
|
|
1967
2256
|
function extractParamsFromPattern(pattern) {
|
|
@@ -2317,7 +2606,7 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
2317
2606
|
}
|
|
2318
2607
|
return routeMap;
|
|
2319
2608
|
}
|
|
2320
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
|
|
2609
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
2321
2610
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
2322
2611
|
const realPath = resolve2(filePath);
|
|
2323
2612
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
@@ -2333,7 +2622,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
2333
2622
|
return { routes: {}, searchSchemas: {} };
|
|
2334
2623
|
}
|
|
2335
2624
|
let block;
|
|
2336
|
-
if (
|
|
2625
|
+
if (inlineBlock) {
|
|
2626
|
+
block = inlineBlock;
|
|
2627
|
+
} else if (variableName) {
|
|
2337
2628
|
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
2338
2629
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
2339
2630
|
block = extracted;
|
|
@@ -2452,7 +2743,7 @@ Router root: ${conflict.ancestor}
|
|
|
2452
2743
|
Nested router: ${conflict.nested}
|
|
2453
2744
|
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
2454
2745
|
}
|
|
2455
|
-
function
|
|
2746
|
+
function extractUrlsFromRouter(code) {
|
|
2456
2747
|
const sourceFile = ts5.createSourceFile(
|
|
2457
2748
|
"router.tsx",
|
|
2458
2749
|
code,
|
|
@@ -2466,24 +2757,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2466
2757
|
const callee = node.expression;
|
|
2467
2758
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
2468
2759
|
}
|
|
2760
|
+
function isInlineBuilder(node) {
|
|
2761
|
+
return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
|
|
2762
|
+
}
|
|
2763
|
+
function isRoutesOnCreateRouter(node) {
|
|
2764
|
+
if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
|
|
2765
|
+
return false;
|
|
2766
|
+
let inner = node.expression.expression;
|
|
2767
|
+
while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
|
|
2768
|
+
inner = inner.expression.expression;
|
|
2769
|
+
}
|
|
2770
|
+
return isCreateRouterCall(inner);
|
|
2771
|
+
}
|
|
2469
2772
|
function visit(node) {
|
|
2470
2773
|
if (result) return;
|
|
2471
|
-
if (ts5.isCallExpression(node) &&
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
}
|
|
2476
|
-
|
|
2477
|
-
result = node.arguments[0].text;
|
|
2478
|
-
return;
|
|
2774
|
+
if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
|
|
2775
|
+
const arg = node.arguments[0];
|
|
2776
|
+
if (ts5.isIdentifier(arg)) {
|
|
2777
|
+
result = { kind: "variable", name: arg.text };
|
|
2778
|
+
} else if (isInlineBuilder(arg)) {
|
|
2779
|
+
result = { kind: "inline", block: arg.getText(sourceFile) };
|
|
2479
2780
|
}
|
|
2781
|
+
return;
|
|
2480
2782
|
}
|
|
2481
2783
|
if (isCreateRouterCall(node)) {
|
|
2482
2784
|
const callExpr = node;
|
|
2483
|
-
for (const
|
|
2785
|
+
for (const callArg of callExpr.arguments) {
|
|
2786
|
+
if (ts5.isObjectLiteralExpression(callArg)) {
|
|
2787
|
+
for (const prop of callArg.properties) {
|
|
2788
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
|
|
2789
|
+
if (ts5.isIdentifier(prop.initializer)) {
|
|
2790
|
+
result = { kind: "variable", name: prop.initializer.text };
|
|
2791
|
+
} else if (isInlineBuilder(prop.initializer)) {
|
|
2792
|
+
result = {
|
|
2793
|
+
kind: "inline",
|
|
2794
|
+
block: prop.initializer.getText(sourceFile)
|
|
2795
|
+
};
|
|
2796
|
+
}
|
|
2797
|
+
return;
|
|
2798
|
+
}
|
|
2799
|
+
}
|
|
2800
|
+
}
|
|
2801
|
+
}
|
|
2802
|
+
}
|
|
2803
|
+
ts5.forEachChild(node, visit);
|
|
2804
|
+
}
|
|
2805
|
+
visit(sourceFile);
|
|
2806
|
+
return result;
|
|
2807
|
+
}
|
|
2808
|
+
function extractBasenameFromRouter(code) {
|
|
2809
|
+
const sourceFile = ts5.createSourceFile(
|
|
2810
|
+
"router.tsx",
|
|
2811
|
+
code,
|
|
2812
|
+
ts5.ScriptTarget.Latest,
|
|
2813
|
+
true,
|
|
2814
|
+
ts5.ScriptKind.TSX
|
|
2815
|
+
);
|
|
2816
|
+
let result;
|
|
2817
|
+
function visit(node) {
|
|
2818
|
+
if (result !== void 0) return;
|
|
2819
|
+
if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
|
|
2820
|
+
for (const arg of node.arguments) {
|
|
2484
2821
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
2485
2822
|
for (const prop of arg.properties) {
|
|
2486
|
-
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "
|
|
2823
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
|
|
2487
2824
|
result = prop.initializer.text;
|
|
2488
2825
|
return;
|
|
2489
2826
|
}
|
|
@@ -2496,6 +2833,19 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
2496
2833
|
visit(sourceFile);
|
|
2497
2834
|
return result;
|
|
2498
2835
|
}
|
|
2836
|
+
function applyBasenameToRoutes(result, basename3) {
|
|
2837
|
+
const prefixed = {};
|
|
2838
|
+
for (const [name, pattern] of Object.entries(result.routes)) {
|
|
2839
|
+
if (pattern === "/") {
|
|
2840
|
+
prefixed[name] = basename3;
|
|
2841
|
+
} else if (basename3.endsWith("/") && pattern.startsWith("/")) {
|
|
2842
|
+
prefixed[name] = basename3 + pattern.slice(1);
|
|
2843
|
+
} else {
|
|
2844
|
+
prefixed[name] = basename3 + pattern;
|
|
2845
|
+
}
|
|
2846
|
+
}
|
|
2847
|
+
return { routes: prefixed, searchSchemas: result.searchSchemas };
|
|
2848
|
+
}
|
|
2499
2849
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
2500
2850
|
let routerSource;
|
|
2501
2851
|
try {
|
|
@@ -2503,19 +2853,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
2503
2853
|
} catch {
|
|
2504
2854
|
return { routes: {}, searchSchemas: {} };
|
|
2505
2855
|
}
|
|
2506
|
-
const
|
|
2507
|
-
if (!
|
|
2856
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
2857
|
+
if (!extraction) {
|
|
2508
2858
|
return { routes: {}, searchSchemas: {} };
|
|
2509
2859
|
}
|
|
2510
|
-
const
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2860
|
+
const rawBasename = extractBasenameFromRouter(routerSource);
|
|
2861
|
+
const basename3 = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
|
|
2862
|
+
let result;
|
|
2863
|
+
if (extraction.kind === "inline") {
|
|
2864
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2865
|
+
routerFilePath,
|
|
2866
|
+
void 0,
|
|
2867
|
+
void 0,
|
|
2868
|
+
void 0,
|
|
2869
|
+
extraction.block
|
|
2870
|
+
);
|
|
2871
|
+
} else {
|
|
2872
|
+
const imported = resolveImportedVariable(routerSource, extraction.name);
|
|
2873
|
+
if (imported) {
|
|
2874
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2875
|
+
if (!targetFile) {
|
|
2876
|
+
return { routes: {}, searchSchemas: {} };
|
|
2877
|
+
}
|
|
2878
|
+
result = buildCombinedRouteMapWithSearch(
|
|
2879
|
+
targetFile,
|
|
2880
|
+
imported.exportedName
|
|
2881
|
+
);
|
|
2882
|
+
} else {
|
|
2883
|
+
result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
|
|
2515
2884
|
}
|
|
2516
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
2517
2885
|
}
|
|
2518
|
-
|
|
2886
|
+
if (basename3) {
|
|
2887
|
+
result = applyBasenameToRoutes(result, basename3);
|
|
2888
|
+
}
|
|
2889
|
+
return result;
|
|
2519
2890
|
}
|
|
2520
2891
|
function findRouterFiles(root, filter) {
|
|
2521
2892
|
const result = [];
|
|
@@ -2540,25 +2911,15 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
2540
2911
|
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
2541
2912
|
}
|
|
2542
2913
|
for (const routerFilePath of routerFilePaths) {
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
routerSource
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
2553
|
-
if (imported) {
|
|
2554
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
2555
|
-
if (!targetFile) continue;
|
|
2556
|
-
result = buildCombinedRouteMapWithSearch(
|
|
2557
|
-
targetFile,
|
|
2558
|
-
imported.exportedName
|
|
2559
|
-
);
|
|
2560
|
-
} else {
|
|
2561
|
-
result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
2914
|
+
const result = buildCombinedRouteMapForRouterFile(routerFilePath);
|
|
2915
|
+
if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
|
|
2916
|
+
let routerSource;
|
|
2917
|
+
try {
|
|
2918
|
+
routerSource = readFileSync2(routerFilePath, "utf-8");
|
|
2919
|
+
} catch {
|
|
2920
|
+
continue;
|
|
2921
|
+
}
|
|
2922
|
+
if (!extractUrlsFromRouter(routerSource)) continue;
|
|
2562
2923
|
}
|
|
2563
2924
|
const routerBasename = pathBasename(routerFilePath).replace(
|
|
2564
2925
|
/\.(tsx?|jsx?)$/,
|
|
@@ -2712,9 +3073,9 @@ function createVersionPlugin() {
|
|
|
2712
3073
|
configResolved(config) {
|
|
2713
3074
|
isDev = config.command === "serve";
|
|
2714
3075
|
},
|
|
2715
|
-
configureServer(
|
|
2716
|
-
server =
|
|
2717
|
-
|
|
3076
|
+
configureServer(devServer) {
|
|
3077
|
+
server = devServer;
|
|
3078
|
+
devServer.watcher.on("unlink", (filePath) => {
|
|
2718
3079
|
if (!isDev) return;
|
|
2719
3080
|
if (!clientModuleSignatures.has(filePath)) return;
|
|
2720
3081
|
clientModuleSignatures.delete(filePath);
|
|
@@ -2784,6 +3145,73 @@ function createVersionPlugin() {
|
|
|
2784
3145
|
|
|
2785
3146
|
// src/vite/utils/shared-utils.ts
|
|
2786
3147
|
import * as Vite from "vite";
|
|
3148
|
+
|
|
3149
|
+
// src/vite/plugins/performance-tracks.ts
|
|
3150
|
+
import { readFile } from "node:fs/promises";
|
|
3151
|
+
var debug6 = createRangoDebugger("rango:transform");
|
|
3152
|
+
var RSDW_PATCH_RE = /((?:var|let|const)\s+\w+\s*=\s*root\._children\s*,\s*(\w+)\s*=\s*root\._debugInfo\s*[;,])/;
|
|
3153
|
+
function buildPatchReplacement(match, debugInfoVar) {
|
|
3154
|
+
return `${match}
|
|
3155
|
+
if (${debugInfoVar} && 0 === ${debugInfoVar}.length && "fulfilled" === root.status) {
|
|
3156
|
+
var _resolved = "function" === typeof resolveLazy ? resolveLazy(root.value) : root.value;
|
|
3157
|
+
if ("object" === typeof _resolved && null !== _resolved && isArrayImpl(_resolved._debugInfo)) {
|
|
3158
|
+
${debugInfoVar} = _resolved._debugInfo;
|
|
3159
|
+
}
|
|
3160
|
+
}`;
|
|
3161
|
+
}
|
|
3162
|
+
function patchRsdwClientDebugInfoRecovery(code) {
|
|
3163
|
+
const match = code.match(RSDW_PATCH_RE);
|
|
3164
|
+
if (!match) {
|
|
3165
|
+
return { code, debugInfoVar: null };
|
|
3166
|
+
}
|
|
3167
|
+
return {
|
|
3168
|
+
code: code.replace(match[1], buildPatchReplacement(match[1], match[2])),
|
|
3169
|
+
debugInfoVar: match[2]
|
|
3170
|
+
};
|
|
3171
|
+
}
|
|
3172
|
+
function performanceTracksOptimizeDepsPlugin() {
|
|
3173
|
+
return {
|
|
3174
|
+
name: "@rangojs/router:performance-tracks-optimize-deps",
|
|
3175
|
+
setup(build) {
|
|
3176
|
+
build.onLoad(
|
|
3177
|
+
{
|
|
3178
|
+
filter: /react-server-dom-webpack-client\.browser\.(development|production)\.js$/
|
|
3179
|
+
},
|
|
3180
|
+
async (args) => {
|
|
3181
|
+
const code = await readFile(args.path, "utf8");
|
|
3182
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
3183
|
+
return {
|
|
3184
|
+
contents: patched.code,
|
|
3185
|
+
loader: "js"
|
|
3186
|
+
};
|
|
3187
|
+
}
|
|
3188
|
+
);
|
|
3189
|
+
}
|
|
3190
|
+
};
|
|
3191
|
+
}
|
|
3192
|
+
function performanceTracksPlugin() {
|
|
3193
|
+
const counter = createCounter(debug6, "performance-tracks");
|
|
3194
|
+
return {
|
|
3195
|
+
name: "@rangojs/router:performance-tracks",
|
|
3196
|
+
buildEnd() {
|
|
3197
|
+
counter?.flush();
|
|
3198
|
+
},
|
|
3199
|
+
transform(code, id) {
|
|
3200
|
+
if (!id.includes("react-server-dom") || !id.includes("client")) return;
|
|
3201
|
+
const start = counter ? performance.now() : 0;
|
|
3202
|
+
try {
|
|
3203
|
+
const patched = patchRsdwClientDebugInfoRecovery(code);
|
|
3204
|
+
if (!patched.debugInfoVar) return;
|
|
3205
|
+
debug6?.("patched RSDW client (var: %s)", patched.debugInfoVar);
|
|
3206
|
+
return patched.code;
|
|
3207
|
+
} finally {
|
|
3208
|
+
counter?.record(id, performance.now() - start);
|
|
3209
|
+
}
|
|
3210
|
+
}
|
|
3211
|
+
};
|
|
3212
|
+
}
|
|
3213
|
+
|
|
3214
|
+
// src/vite/utils/shared-utils.ts
|
|
2787
3215
|
var versionEsbuildPlugin = {
|
|
2788
3216
|
name: "@rangojs/router-version",
|
|
2789
3217
|
setup(build) {
|
|
@@ -2801,7 +3229,7 @@ var versionEsbuildPlugin = {
|
|
|
2801
3229
|
}
|
|
2802
3230
|
};
|
|
2803
3231
|
var sharedEsbuildOptions = {
|
|
2804
|
-
plugins: [versionEsbuildPlugin]
|
|
3232
|
+
plugins: [versionEsbuildPlugin, performanceTracksOptimizeDepsPlugin()]
|
|
2805
3233
|
};
|
|
2806
3234
|
function createVirtualEntriesPlugin(entries, routerPathRef) {
|
|
2807
3235
|
const virtualModules = {};
|
|
@@ -2949,15 +3377,22 @@ function createVersionInjectorPlugin(rscEntryPath) {
|
|
|
2949
3377
|
}
|
|
2950
3378
|
|
|
2951
3379
|
// src/vite/plugins/cjs-to-esm.ts
|
|
3380
|
+
var debug7 = createRangoDebugger("rango:transform");
|
|
2952
3381
|
function createCjsToEsmPlugin() {
|
|
3382
|
+
const counter = createCounter(debug7, "cjs-to-esm");
|
|
2953
3383
|
return {
|
|
2954
3384
|
name: "@rangojs/router:cjs-to-esm",
|
|
2955
3385
|
enforce: "pre",
|
|
3386
|
+
buildEnd() {
|
|
3387
|
+
counter?.flush();
|
|
3388
|
+
},
|
|
2956
3389
|
transform(code, id) {
|
|
2957
3390
|
const cleanId = id.split("?")[0];
|
|
3391
|
+
const __t0 = counter ? performance.now() : 0;
|
|
2958
3392
|
if (cleanId.includes("vendor/react-server-dom/client.browser.js") || cleanId.includes("vendor\\react-server-dom\\client.browser.js")) {
|
|
2959
3393
|
const isProd = process.env.NODE_ENV === "production";
|
|
2960
3394
|
const cjsFile = isProd ? "./cjs/react-server-dom-webpack-client.browser.production.js" : "./cjs/react-server-dom-webpack-client.browser.development.js";
|
|
3395
|
+
counter?.record(id, performance.now() - __t0);
|
|
2961
3396
|
return {
|
|
2962
3397
|
code: `export * from "${cjsFile}";`,
|
|
2963
3398
|
map: null
|
|
@@ -2993,6 +3428,7 @@ function createCjsToEsmPlugin() {
|
|
|
2993
3428
|
"export const $1 ="
|
|
2994
3429
|
);
|
|
2995
3430
|
transformed = license + "\n" + transformed;
|
|
3431
|
+
counter?.record(id, performance.now() - __t0);
|
|
2996
3432
|
return {
|
|
2997
3433
|
code: transformed,
|
|
2998
3434
|
map: null
|
|
@@ -3007,6 +3443,8 @@ function createCjsToEsmPlugin() {
|
|
|
3007
3443
|
import { createServer as createViteServer } from "vite";
|
|
3008
3444
|
import { resolve as resolve8 } from "node:path";
|
|
3009
3445
|
import { readFileSync as readFileSync6 } from "node:fs";
|
|
3446
|
+
import { createRequire as createRequire2, register } from "node:module";
|
|
3447
|
+
import { pathToFileURL } from "node:url";
|
|
3010
3448
|
|
|
3011
3449
|
// src/vite/plugins/virtual-stub-plugin.ts
|
|
3012
3450
|
function createVirtualStubPlugin() {
|
|
@@ -3032,9 +3470,117 @@ function createVirtualStubPlugin() {
|
|
|
3032
3470
|
};
|
|
3033
3471
|
}
|
|
3034
3472
|
|
|
3473
|
+
// src/vite/plugins/cloudflare-protocol-stub.ts
|
|
3474
|
+
var VIRTUAL_PREFIX = "virtual:rango-cloudflare-stub-";
|
|
3475
|
+
var NULL_PREFIX = "\0" + VIRTUAL_PREFIX;
|
|
3476
|
+
var CF_PREFIX = "cloudflare:";
|
|
3477
|
+
var BUILD_ENV_GLOBAL_KEY = "__rango_build_env__";
|
|
3478
|
+
var SOURCE_EXT_RE = /\.[mc]?[jt]sx?$/;
|
|
3479
|
+
var IMPORT_NODE_TYPES = /* @__PURE__ */ new Set([
|
|
3480
|
+
"ImportDeclaration",
|
|
3481
|
+
"ImportExpression",
|
|
3482
|
+
"ExportNamedDeclaration",
|
|
3483
|
+
"ExportAllDeclaration"
|
|
3484
|
+
]);
|
|
3485
|
+
var STUBS = {
|
|
3486
|
+
"cloudflare:workers": `
|
|
3487
|
+
export class DurableObject { constructor(_ctx, _env) {} }
|
|
3488
|
+
export class WorkerEntrypoint { constructor(_ctx, _env) {} }
|
|
3489
|
+
export class WorkflowEntrypoint { constructor(_ctx, _env) {} }
|
|
3490
|
+
export class RpcTarget {}
|
|
3491
|
+
export const env = globalThis[${JSON.stringify(BUILD_ENV_GLOBAL_KEY)}] ?? {};
|
|
3492
|
+
export default {};
|
|
3493
|
+
`,
|
|
3494
|
+
"cloudflare:email": `
|
|
3495
|
+
export class EmailMessage { constructor(_from, _to, _raw) {} }
|
|
3496
|
+
export default {};
|
|
3497
|
+
`,
|
|
3498
|
+
"cloudflare:sockets": `
|
|
3499
|
+
export function connect() { return {}; }
|
|
3500
|
+
export default {};
|
|
3501
|
+
`,
|
|
3502
|
+
"cloudflare:workflows": `
|
|
3503
|
+
export class NonRetryableError extends Error {
|
|
3504
|
+
constructor(message, name) { super(message); this.name = name ?? "NonRetryableError"; }
|
|
3505
|
+
}
|
|
3506
|
+
export default {};
|
|
3507
|
+
`
|
|
3508
|
+
};
|
|
3509
|
+
var FALLBACK_STUB = `export default {};
|
|
3510
|
+
`;
|
|
3511
|
+
function createCloudflareProtocolStubPlugin() {
|
|
3512
|
+
return {
|
|
3513
|
+
name: "@rangojs/router:cloudflare-protocol-stub",
|
|
3514
|
+
transform(code, id) {
|
|
3515
|
+
const cleanId = id.split("?")[0] ?? id;
|
|
3516
|
+
if (!SOURCE_EXT_RE.test(cleanId)) return null;
|
|
3517
|
+
if (!code.includes(CF_PREFIX)) return null;
|
|
3518
|
+
let ast;
|
|
3519
|
+
try {
|
|
3520
|
+
ast = this.parse(code);
|
|
3521
|
+
} catch {
|
|
3522
|
+
return null;
|
|
3523
|
+
}
|
|
3524
|
+
const hits = [];
|
|
3525
|
+
walk(ast, (node) => {
|
|
3526
|
+
if (!IMPORT_NODE_TYPES.has(node.type)) return;
|
|
3527
|
+
const source = node.source;
|
|
3528
|
+
if (!source || source.type !== "Literal") return;
|
|
3529
|
+
if (typeof source.value !== "string") return;
|
|
3530
|
+
if (!source.value.startsWith(CF_PREFIX)) return;
|
|
3531
|
+
if (typeof source.start !== "number" || typeof source.end !== "number")
|
|
3532
|
+
return;
|
|
3533
|
+
hits.push({
|
|
3534
|
+
start: source.start,
|
|
3535
|
+
end: source.end,
|
|
3536
|
+
value: source.value
|
|
3537
|
+
});
|
|
3538
|
+
});
|
|
3539
|
+
if (hits.length === 0) return null;
|
|
3540
|
+
hits.sort((a, b) => b.start - a.start);
|
|
3541
|
+
let out = code;
|
|
3542
|
+
for (const hit of hits) {
|
|
3543
|
+
const submodule = hit.value.slice(CF_PREFIX.length);
|
|
3544
|
+
const quote = code[hit.start] === "'" ? "'" : '"';
|
|
3545
|
+
out = out.slice(0, hit.start) + quote + VIRTUAL_PREFIX + submodule + quote + out.slice(hit.end);
|
|
3546
|
+
}
|
|
3547
|
+
return { code: out, map: null };
|
|
3548
|
+
},
|
|
3549
|
+
resolveId(id) {
|
|
3550
|
+
if (id.startsWith(VIRTUAL_PREFIX)) {
|
|
3551
|
+
return "\0" + id;
|
|
3552
|
+
}
|
|
3553
|
+
return null;
|
|
3554
|
+
},
|
|
3555
|
+
load(id) {
|
|
3556
|
+
if (!id.startsWith(NULL_PREFIX)) return null;
|
|
3557
|
+
const submodule = id.slice(NULL_PREFIX.length);
|
|
3558
|
+
const specifier = CF_PREFIX + submodule;
|
|
3559
|
+
return STUBS[specifier] ?? FALLBACK_STUB;
|
|
3560
|
+
}
|
|
3561
|
+
};
|
|
3562
|
+
}
|
|
3563
|
+
function walk(node, visit) {
|
|
3564
|
+
if (!node || typeof node !== "object") return;
|
|
3565
|
+
if (Array.isArray(node)) {
|
|
3566
|
+
for (const child of node) walk(child, visit);
|
|
3567
|
+
return;
|
|
3568
|
+
}
|
|
3569
|
+
const n = node;
|
|
3570
|
+
if (typeof n.type !== "string") return;
|
|
3571
|
+
visit(n);
|
|
3572
|
+
for (const key in n) {
|
|
3573
|
+
if (key === "loc" || key === "start" || key === "end" || key === "range") {
|
|
3574
|
+
continue;
|
|
3575
|
+
}
|
|
3576
|
+
walk(n[key], visit);
|
|
3577
|
+
}
|
|
3578
|
+
}
|
|
3579
|
+
|
|
3035
3580
|
// src/vite/plugins/client-ref-hashing.ts
|
|
3036
3581
|
import { relative } from "node:path";
|
|
3037
3582
|
import { createHash as createHash2 } from "node:crypto";
|
|
3583
|
+
var debug8 = createRangoDebugger("rango:transform");
|
|
3038
3584
|
var CLIENT_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-package-proxy/";
|
|
3039
3585
|
var CLIENT_IN_SERVER_PKG_PROXY_PREFIX = "/@id/__x00__virtual:vite-rsc/client-in-server-package-proxy/";
|
|
3040
3586
|
var FS_PREFIX = "/@fs/";
|
|
@@ -3073,6 +3619,7 @@ function transformClientRefs(code, projectRoot) {
|
|
|
3073
3619
|
return hasReplacement ? result : null;
|
|
3074
3620
|
}
|
|
3075
3621
|
function hashClientRefs(projectRoot) {
|
|
3622
|
+
const counter = createCounter(debug8, "hash-client-refs");
|
|
3076
3623
|
return {
|
|
3077
3624
|
name: "@rangojs/router:hash-client-refs",
|
|
3078
3625
|
// Run after the RSC plugin's transform (default enforce is normal)
|
|
@@ -3080,10 +3627,18 @@ function hashClientRefs(projectRoot) {
|
|
|
3080
3627
|
applyToEnvironment(env) {
|
|
3081
3628
|
return env.name === "rsc";
|
|
3082
3629
|
},
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3630
|
+
buildEnd() {
|
|
3631
|
+
counter?.flush();
|
|
3632
|
+
},
|
|
3633
|
+
transform(code, id) {
|
|
3634
|
+
const start = counter ? performance.now() : 0;
|
|
3635
|
+
try {
|
|
3636
|
+
const result = transformClientRefs(code, projectRoot);
|
|
3637
|
+
if (result === null) return;
|
|
3638
|
+
return { code: result, map: null };
|
|
3639
|
+
} finally {
|
|
3640
|
+
counter?.record(id, performance.now() - start);
|
|
3641
|
+
}
|
|
3087
3642
|
}
|
|
3088
3643
|
};
|
|
3089
3644
|
}
|
|
@@ -3190,8 +3745,8 @@ function createDiscoveryState(entryPath, opts) {
|
|
|
3190
3745
|
perRouterManifestDataMap: /* @__PURE__ */ new Map(),
|
|
3191
3746
|
prerenderManifestEntries: null,
|
|
3192
3747
|
staticManifestEntries: null,
|
|
3193
|
-
|
|
3194
|
-
|
|
3748
|
+
handlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3749
|
+
staticHandlerChunkInfoMap: /* @__PURE__ */ new Map(),
|
|
3195
3750
|
rscEntryFileName: null,
|
|
3196
3751
|
resolvedPrerenderModules: void 0,
|
|
3197
3752
|
resolvedStaticModules: void 0,
|
|
@@ -3322,13 +3877,31 @@ function encodePathParam(value) {
|
|
|
3322
3877
|
}
|
|
3323
3878
|
function substituteRouteParams(pattern, params, encode = encodeURIComponent) {
|
|
3324
3879
|
let result = pattern;
|
|
3880
|
+
let hadOmittedOptional = false;
|
|
3325
3881
|
for (const [key, value] of Object.entries(params)) {
|
|
3326
3882
|
const escaped = escapeRegExp2(key);
|
|
3327
|
-
|
|
3328
|
-
|
|
3329
|
-
|
|
3330
|
-
|
|
3331
|
-
|
|
3883
|
+
if (value === "") {
|
|
3884
|
+
result = result.replace(
|
|
3885
|
+
new RegExp(`:${escaped}(\\([^)]*\\))?(?!\\?)`),
|
|
3886
|
+
""
|
|
3887
|
+
);
|
|
3888
|
+
result = result.replace(`*${key}`, "");
|
|
3889
|
+
} else {
|
|
3890
|
+
result = result.replace(
|
|
3891
|
+
new RegExp(`:${escaped}(\\([^)]*\\))?\\??`),
|
|
3892
|
+
encode(value)
|
|
3893
|
+
);
|
|
3894
|
+
result = result.replace(`*${key}`, encode(value));
|
|
3895
|
+
}
|
|
3896
|
+
}
|
|
3897
|
+
result = result.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)(\([^)]*\))?\?/g, () => {
|
|
3898
|
+
hadOmittedOptional = true;
|
|
3899
|
+
return "";
|
|
3900
|
+
});
|
|
3901
|
+
if (hadOmittedOptional) {
|
|
3902
|
+
const hadTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
|
|
3903
|
+
result = result.replace(/\/\/+/g, "/").replace(/\/+$/, "") || "/";
|
|
3904
|
+
if (hadTrailingSlash && !result.endsWith("/")) result += "/";
|
|
3332
3905
|
}
|
|
3333
3906
|
return result;
|
|
3334
3907
|
}
|
|
@@ -3425,8 +3998,14 @@ function copyStagedBuildAssets(projectRoot, fileNames) {
|
|
|
3425
3998
|
}
|
|
3426
3999
|
|
|
3427
4000
|
// src/vite/discovery/prerender-collection.ts
|
|
4001
|
+
var debug9 = createRangoDebugger("rango:prerender");
|
|
3428
4002
|
async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
3429
4003
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode) return;
|
|
4004
|
+
const overallStart = debug9 ? performance.now() : 0;
|
|
4005
|
+
debug9?.(
|
|
4006
|
+
"expandPrerenderRoutes: start (%d router manifest(s))",
|
|
4007
|
+
allManifests.length
|
|
4008
|
+
);
|
|
3430
4009
|
const entries = [];
|
|
3431
4010
|
const allRoutes = {};
|
|
3432
4011
|
for (const { manifest: m } of allManifests) {
|
|
@@ -3438,91 +4017,151 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3438
4017
|
if (!params) return pattern;
|
|
3439
4018
|
return substituteRouteParams(pattern, params);
|
|
3440
4019
|
};
|
|
4020
|
+
let resolvedRoutes = 0;
|
|
4021
|
+
let totalDynamic = 0;
|
|
3441
4022
|
for (const { manifest } of allManifests) {
|
|
3442
4023
|
if (!manifest.prerenderRoutes) continue;
|
|
3443
|
-
const defs = manifest._prerenderDefs || {};
|
|
3444
4024
|
for (const routeName of manifest.prerenderRoutes) {
|
|
3445
4025
|
const pattern = manifest.routeManifest[routeName];
|
|
3446
|
-
if (
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
4026
|
+
if (pattern && (pattern.includes(":") || pattern.includes("*"))) {
|
|
4027
|
+
totalDynamic++;
|
|
4028
|
+
}
|
|
4029
|
+
}
|
|
4030
|
+
}
|
|
4031
|
+
const paramsStart = performance.now();
|
|
4032
|
+
const progressInterval = totalDynamic > 0 ? setInterval(() => {
|
|
4033
|
+
const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
|
|
4034
|
+
console.log(
|
|
4035
|
+
`[rsc-router] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
|
|
4036
|
+
);
|
|
4037
|
+
}, 5e3) : void 0;
|
|
4038
|
+
try {
|
|
4039
|
+
for (const { manifest } of allManifests) {
|
|
4040
|
+
if (!manifest.prerenderRoutes) continue;
|
|
4041
|
+
const defs = manifest._prerenderDefs || {};
|
|
4042
|
+
const passthroughSet = new Set(manifest.passthroughRoutes || []);
|
|
4043
|
+
for (const routeName of manifest.prerenderRoutes) {
|
|
4044
|
+
const pattern = manifest.routeManifest[routeName];
|
|
4045
|
+
if (!pattern) continue;
|
|
4046
|
+
const def = defs[routeName];
|
|
4047
|
+
const isPassthroughRoute = passthroughSet.has(routeName);
|
|
4048
|
+
const hasDynamic = pattern.includes(":") || pattern.includes("*");
|
|
4049
|
+
if (!hasDynamic) {
|
|
4050
|
+
entries.push({
|
|
4051
|
+
urlPath: pattern.replace(/\/$/, "") || "/",
|
|
4052
|
+
routeName,
|
|
4053
|
+
concurrency: 1,
|
|
4054
|
+
isPassthroughRoute
|
|
4055
|
+
});
|
|
4056
|
+
} else {
|
|
4057
|
+
if (def?.getParams) {
|
|
4058
|
+
const getParamsStart = debug9 ? performance.now() : 0;
|
|
4059
|
+
try {
|
|
4060
|
+
const buildVars = {};
|
|
4061
|
+
const buildEnv = state.resolvedBuildEnv;
|
|
4062
|
+
const getParamsCtx = {
|
|
4063
|
+
build: true,
|
|
4064
|
+
dev: !state.isBuildMode,
|
|
4065
|
+
set: ((keyOrVar, value) => {
|
|
4066
|
+
contextSet(buildVars, keyOrVar, value);
|
|
4067
|
+
}),
|
|
4068
|
+
reverse: getParamsReverse,
|
|
4069
|
+
get env() {
|
|
4070
|
+
if (buildEnv !== void 0) return buildEnv;
|
|
4071
|
+
throw new Error(
|
|
4072
|
+
"[rsc-router] ctx.env is not available during build-time getParams(). Configure buildEnv in your rango() plugin options to enable build-time env access."
|
|
4073
|
+
);
|
|
3481
4074
|
}
|
|
3482
|
-
}
|
|
3483
|
-
|
|
3484
|
-
|
|
4075
|
+
};
|
|
4076
|
+
const paramsList = await def.getParams(getParamsCtx);
|
|
4077
|
+
debug9?.(
|
|
4078
|
+
"getParams %s -> %d params (%sms)",
|
|
3485
4079
|
routeName,
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
isPassthroughRoute
|
|
3489
|
-
});
|
|
3490
|
-
}
|
|
3491
|
-
} catch (err) {
|
|
3492
|
-
if (err.name === "Skip") {
|
|
3493
|
-
console.log(
|
|
3494
|
-
`[rsc-router] SKIP route "${routeName}" - ${err.message}`
|
|
4080
|
+
paramsList.length,
|
|
4081
|
+
(performance.now() - getParamsStart).toFixed(1)
|
|
3495
4082
|
);
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
4083
|
+
const concurrency = def.options?.concurrency ?? 1;
|
|
4084
|
+
const hasBuildVars = Object.keys(buildVars).length > 0 || Object.getOwnPropertySymbols(buildVars).length > 0;
|
|
4085
|
+
for (const params of paramsList) {
|
|
4086
|
+
let url = substituteRouteParams(
|
|
4087
|
+
pattern,
|
|
4088
|
+
params,
|
|
4089
|
+
encodePathParam
|
|
4090
|
+
);
|
|
4091
|
+
if (url.includes("*")) {
|
|
4092
|
+
const wildcardValue = params["*"] ?? params.splat;
|
|
4093
|
+
if (wildcardValue !== void 0) {
|
|
4094
|
+
url = url.replace(
|
|
4095
|
+
/\*[^/]*$/,
|
|
4096
|
+
encodePathParam(wildcardValue)
|
|
4097
|
+
);
|
|
4098
|
+
}
|
|
4099
|
+
}
|
|
4100
|
+
entries.push({
|
|
4101
|
+
urlPath: url.replace(/\/$/, "") || "/",
|
|
4102
|
+
routeName,
|
|
4103
|
+
concurrency,
|
|
4104
|
+
...hasBuildVars ? { buildVars } : {},
|
|
4105
|
+
isPassthroughRoute
|
|
4106
|
+
});
|
|
4107
|
+
}
|
|
4108
|
+
resolvedRoutes++;
|
|
4109
|
+
} catch (err) {
|
|
4110
|
+
resolvedRoutes++;
|
|
4111
|
+
if (err.name === "Skip") {
|
|
4112
|
+
console.log(
|
|
4113
|
+
`[rsc-router] SKIP route "${routeName}" - ${err.message}`
|
|
4114
|
+
);
|
|
4115
|
+
notifyOnError(
|
|
4116
|
+
registry,
|
|
4117
|
+
err,
|
|
4118
|
+
"prerender",
|
|
4119
|
+
routeName,
|
|
4120
|
+
void 0,
|
|
4121
|
+
true
|
|
4122
|
+
);
|
|
4123
|
+
continue;
|
|
4124
|
+
}
|
|
4125
|
+
console.error(
|
|
4126
|
+
`[rsc-router] Failed to get params for prerender route "${routeName}": ${err.message}`
|
|
3503
4127
|
);
|
|
3504
|
-
|
|
4128
|
+
notifyOnError(registry, err, "prerender", routeName);
|
|
4129
|
+
throw err;
|
|
3505
4130
|
}
|
|
3506
|
-
|
|
3507
|
-
|
|
4131
|
+
} else {
|
|
4132
|
+
console.warn(
|
|
4133
|
+
`[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
|
|
3508
4134
|
);
|
|
3509
|
-
notifyOnError(registry, err, "prerender", routeName);
|
|
3510
|
-
throw err;
|
|
3511
4135
|
}
|
|
3512
|
-
} else {
|
|
3513
|
-
console.warn(
|
|
3514
|
-
`[rsc-router] Dynamic prerender route "${routeName}" has no getParams(), skipping`
|
|
3515
|
-
);
|
|
3516
4136
|
}
|
|
3517
4137
|
}
|
|
3518
4138
|
}
|
|
4139
|
+
} finally {
|
|
4140
|
+
if (progressInterval) {
|
|
4141
|
+
clearInterval(progressInterval);
|
|
4142
|
+
const elapsed = ((performance.now() - paramsStart) / 1e3).toFixed(1);
|
|
4143
|
+
console.log(
|
|
4144
|
+
`[rsc-router] Resolved prerender params: ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`
|
|
4145
|
+
);
|
|
4146
|
+
}
|
|
4147
|
+
}
|
|
4148
|
+
if (entries.length === 0) {
|
|
4149
|
+
debug9?.(
|
|
4150
|
+
"no prerender entries (done in %sms)",
|
|
4151
|
+
(performance.now() - overallStart).toFixed(1)
|
|
4152
|
+
);
|
|
4153
|
+
return;
|
|
3519
4154
|
}
|
|
3520
|
-
if (entries.length === 0) return;
|
|
3521
4155
|
const maxConcurrency = Math.max(...entries.map((e) => e.concurrency));
|
|
3522
4156
|
const concurrencyNote = maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
|
|
3523
4157
|
console.log(
|
|
3524
4158
|
`[rsc-router] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`
|
|
3525
4159
|
);
|
|
4160
|
+
debug9?.(
|
|
4161
|
+
"prerender loop: %d entries, max concurrency %d",
|
|
4162
|
+
entries.length,
|
|
4163
|
+
maxConcurrency
|
|
4164
|
+
);
|
|
3526
4165
|
const { hashParams } = await rscEnv.runner.import("@rangojs/router/build");
|
|
3527
4166
|
const manifestEntries = {};
|
|
3528
4167
|
let doneCount = 0;
|
|
@@ -3542,7 +4181,8 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3542
4181
|
entry.urlPath,
|
|
3543
4182
|
{},
|
|
3544
4183
|
entry.buildVars,
|
|
3545
|
-
entry.isPassthroughRoute
|
|
4184
|
+
entry.isPassthroughRoute,
|
|
4185
|
+
state.resolvedBuildEnv
|
|
3546
4186
|
);
|
|
3547
4187
|
if (!result) continue;
|
|
3548
4188
|
if (result.passthrough) {
|
|
@@ -3628,10 +4268,22 @@ async function expandPrerenderRoutes(state, rscEnv, registry, allManifests) {
|
|
|
3628
4268
|
console.log(
|
|
3629
4269
|
`[rsc-router] Pre-render complete: ${parts.join(", ")} (${totalElapsed}ms total)`
|
|
3630
4270
|
);
|
|
4271
|
+
debug9?.(
|
|
4272
|
+
"expandPrerenderRoutes done: %d done, %d skipped, %sms (overall %sms)",
|
|
4273
|
+
doneCount,
|
|
4274
|
+
skipCount,
|
|
4275
|
+
totalElapsed,
|
|
4276
|
+
(performance.now() - overallStart).toFixed(1)
|
|
4277
|
+
);
|
|
3631
4278
|
}
|
|
3632
4279
|
async function renderStaticHandlers(state, rscEnv, registry) {
|
|
3633
4280
|
if (!state.opts?.enableBuildPrerender || !state.isBuildMode || !state.resolvedStaticModules?.size)
|
|
3634
4281
|
return;
|
|
4282
|
+
const overallStart = debug9 ? performance.now() : 0;
|
|
4283
|
+
debug9?.(
|
|
4284
|
+
"renderStaticHandlers: start (%d static module(s))",
|
|
4285
|
+
state.resolvedStaticModules.size
|
|
4286
|
+
);
|
|
3635
4287
|
const manifestEntries = {};
|
|
3636
4288
|
let staticDone = 0;
|
|
3637
4289
|
let staticSkip = 0;
|
|
@@ -3666,7 +4318,9 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3666
4318
|
const result = await routerInstance.renderStaticSegment(
|
|
3667
4319
|
def.handler,
|
|
3668
4320
|
def.$$id,
|
|
3669
|
-
def.$$routePrefix
|
|
4321
|
+
def.$$routePrefix,
|
|
4322
|
+
state.resolvedBuildEnv,
|
|
4323
|
+
!state.isBuildMode
|
|
3670
4324
|
);
|
|
3671
4325
|
if (result) {
|
|
3672
4326
|
const hasHandles = Object.keys(result.handles).length > 0;
|
|
@@ -3719,13 +4373,29 @@ async function renderStaticHandlers(state, rscEnv, registry) {
|
|
|
3719
4373
|
console.log(
|
|
3720
4374
|
`[rsc-router] Static render complete: ${staticParts.join(", ")} (${totalStaticElapsed}ms total)`
|
|
3721
4375
|
);
|
|
4376
|
+
debug9?.(
|
|
4377
|
+
"renderStaticHandlers done: %d done, %d skipped, %sms (overall %sms)",
|
|
4378
|
+
staticDone,
|
|
4379
|
+
staticSkip,
|
|
4380
|
+
totalStaticElapsed,
|
|
4381
|
+
(performance.now() - overallStart).toFixed(1)
|
|
4382
|
+
);
|
|
3722
4383
|
}
|
|
3723
4384
|
|
|
3724
4385
|
// src/vite/discovery/discover-routers.ts
|
|
4386
|
+
var debug10 = createRangoDebugger("rango:discovery");
|
|
3725
4387
|
async function discoverRouters(state, rscEnv) {
|
|
3726
4388
|
if (!state.resolvedEntryPath) return;
|
|
3727
|
-
await
|
|
3728
|
-
|
|
4389
|
+
await timed(
|
|
4390
|
+
debug10,
|
|
4391
|
+
"inner: import entry",
|
|
4392
|
+
() => rscEnv.runner.import(state.resolvedEntryPath)
|
|
4393
|
+
);
|
|
4394
|
+
const serverMod = await timed(
|
|
4395
|
+
debug10,
|
|
4396
|
+
"inner: import @rangojs/router/server",
|
|
4397
|
+
() => rscEnv.runner.import("@rangojs/router/server")
|
|
4398
|
+
);
|
|
3729
4399
|
let registry = serverMod.RouterRegistry;
|
|
3730
4400
|
if (!registry || registry.size === 0) {
|
|
3731
4401
|
try {
|
|
@@ -3767,8 +4437,13 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3767
4437
|
);
|
|
3768
4438
|
}
|
|
3769
4439
|
}
|
|
3770
|
-
const buildMod = await
|
|
4440
|
+
const buildMod = await timed(
|
|
4441
|
+
debug10,
|
|
4442
|
+
"inner: import @rangojs/router/build",
|
|
4443
|
+
() => rscEnv.runner.import("@rangojs/router/build")
|
|
4444
|
+
);
|
|
3771
4445
|
const generateManifestFull = buildMod.generateManifestFull;
|
|
4446
|
+
debug10?.("inner: found %d router(s) in registry", registry.size);
|
|
3772
4447
|
const nestedRouterConflict = findNestedRouterConflict(
|
|
3773
4448
|
[...registry.values()].map((router) => router.__sourceFile).filter(
|
|
3774
4449
|
(sourceFile) => typeof sourceFile === "string"
|
|
@@ -3787,11 +4462,16 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3787
4462
|
let mergedRouteTrailingSlash = {};
|
|
3788
4463
|
let routerMountIndex = 0;
|
|
3789
4464
|
const allManifests = [];
|
|
4465
|
+
const manifestGenStart = debug10 ? performance.now() : 0;
|
|
3790
4466
|
for (const [id, router] of registry) {
|
|
3791
4467
|
if (!router.urlpatterns || !generateManifestFull) {
|
|
3792
4468
|
continue;
|
|
3793
4469
|
}
|
|
3794
|
-
const manifest = generateManifestFull(
|
|
4470
|
+
const manifest = generateManifestFull(
|
|
4471
|
+
router.urlpatterns,
|
|
4472
|
+
routerMountIndex,
|
|
4473
|
+
router.__basename ? { urlPrefix: router.__basename } : void 0
|
|
4474
|
+
);
|
|
3795
4475
|
routerMountIndex++;
|
|
3796
4476
|
allManifests.push({ id, manifest });
|
|
3797
4477
|
const routeCount = Object.keys(manifest.routeManifest).length;
|
|
@@ -3857,7 +4537,13 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3857
4537
|
);
|
|
3858
4538
|
}
|
|
3859
4539
|
}
|
|
4540
|
+
debug10?.(
|
|
4541
|
+
"inner: generated manifests for %d router(s) (%sms)",
|
|
4542
|
+
allManifests.length,
|
|
4543
|
+
(performance.now() - manifestGenStart).toFixed(1)
|
|
4544
|
+
);
|
|
3860
4545
|
let newMergedRouteTrie = null;
|
|
4546
|
+
const trieStart = debug10 ? performance.now() : 0;
|
|
3861
4547
|
if (Object.keys(newMergedRouteManifest).length > 0) {
|
|
3862
4548
|
const buildRouteTrie = buildMod.buildRouteTrie;
|
|
3863
4549
|
if (buildRouteTrie && mergedRouteAncestry) {
|
|
@@ -3920,6 +4606,10 @@ async function discoverRouters(state, rscEnv) {
|
|
|
3920
4606
|
}
|
|
3921
4607
|
}
|
|
3922
4608
|
}
|
|
4609
|
+
debug10?.(
|
|
4610
|
+
"inner: trie build done (%sms)",
|
|
4611
|
+
(performance.now() - trieStart).toFixed(1)
|
|
4612
|
+
);
|
|
3923
4613
|
state.mergedRouteManifest = newMergedRouteManifest;
|
|
3924
4614
|
state.mergedPrecomputedEntries = newMergedPrecomputedEntries;
|
|
3925
4615
|
state.perRouterManifests = newPerRouterManifests;
|
|
@@ -4240,48 +4930,45 @@ function postprocessBundle(state) {
|
|
|
4240
4930
|
);
|
|
4241
4931
|
const evictionTargets = [
|
|
4242
4932
|
{
|
|
4243
|
-
|
|
4933
|
+
infos: state.handlerChunkInfoMap.values(),
|
|
4244
4934
|
fnName: "Prerender",
|
|
4245
4935
|
brand: "prerenderHandler",
|
|
4246
4936
|
label: "handler code from RSC bundle"
|
|
4247
4937
|
},
|
|
4248
4938
|
{
|
|
4249
|
-
|
|
4939
|
+
infos: state.staticHandlerChunkInfoMap.values(),
|
|
4250
4940
|
fnName: "Static",
|
|
4251
4941
|
brand: "staticHandler",
|
|
4252
4942
|
label: "static handler code"
|
|
4253
4943
|
}
|
|
4254
4944
|
];
|
|
4255
4945
|
for (const target of evictionTargets) {
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4946
|
+
for (const info of target.infos) {
|
|
4947
|
+
const chunkPath = resolve7(state.projectRoot, "dist/rsc", info.fileName);
|
|
4948
|
+
try {
|
|
4949
|
+
const code = readFileSync5(chunkPath, "utf-8");
|
|
4950
|
+
const result = evictHandlerCode(
|
|
4951
|
+
code,
|
|
4952
|
+
info.exports,
|
|
4953
|
+
target.fnName,
|
|
4954
|
+
target.brand
|
|
4955
|
+
);
|
|
4956
|
+
if (result) {
|
|
4957
|
+
writeFileSync4(chunkPath, result.code);
|
|
4958
|
+
const savedKB = (result.savedBytes / 1024).toFixed(1);
|
|
4959
|
+
console.log(
|
|
4960
|
+
`[rsc-router] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`
|
|
4961
|
+
);
|
|
4962
|
+
}
|
|
4963
|
+
} catch (replaceErr) {
|
|
4964
|
+
console.warn(
|
|
4965
|
+
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4275
4966
|
);
|
|
4276
4967
|
}
|
|
4277
|
-
} catch (replaceErr) {
|
|
4278
|
-
console.warn(
|
|
4279
|
-
`[rsc-router] Failed to evict ${target.label}: ${replaceErr.message}`
|
|
4280
|
-
);
|
|
4281
4968
|
}
|
|
4282
4969
|
}
|
|
4283
|
-
state.
|
|
4284
|
-
state.
|
|
4970
|
+
state.handlerChunkInfoMap.clear();
|
|
4971
|
+
state.staticHandlerChunkInfoMap.clear();
|
|
4285
4972
|
if (hasPrerenderData && existsSync6(rscEntryPath)) {
|
|
4286
4973
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4287
4974
|
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
@@ -4324,7 +5011,7 @@ function postprocessBundle(state) {
|
|
|
4324
5011
|
}
|
|
4325
5012
|
if (hasStaticData && existsSync6(rscEntryPath)) {
|
|
4326
5013
|
const rscCode = readFileSync5(rscEntryPath, "utf-8");
|
|
4327
|
-
if (!rscCode.includes("
|
|
5014
|
+
if (!rscCode.includes("__static-manifest.js")) {
|
|
4328
5015
|
try {
|
|
4329
5016
|
const manifestEntries = [];
|
|
4330
5017
|
let totalBytes = copyStagedBuildAssets(
|
|
@@ -4363,7 +5050,26 @@ function postprocessBundle(state) {
|
|
|
4363
5050
|
}
|
|
4364
5051
|
|
|
4365
5052
|
// src/vite/router-discovery.ts
|
|
5053
|
+
var debugDiscovery = createRangoDebugger("rango:discovery");
|
|
5054
|
+
var debugRoutes = createRangoDebugger("rango:routes");
|
|
5055
|
+
var debugBuild = createRangoDebugger("rango:build");
|
|
5056
|
+
var debugDev = createRangoDebugger("rango:dev");
|
|
5057
|
+
var loaderHookRegistered = false;
|
|
5058
|
+
function ensureCloudflareProtocolLoaderRegistered() {
|
|
5059
|
+
if (loaderHookRegistered) return;
|
|
5060
|
+
loaderHookRegistered = true;
|
|
5061
|
+
try {
|
|
5062
|
+
register(
|
|
5063
|
+
new URL("./plugins/cloudflare-protocol-loader-hook.mjs", import.meta.url)
|
|
5064
|
+
);
|
|
5065
|
+
} catch (err) {
|
|
5066
|
+
console.warn(
|
|
5067
|
+
`[rsc-router] Could not register Node ESM loader hook for cloudflare:* imports (${err?.message ?? err}). Falling back to Vite transform only.`
|
|
5068
|
+
);
|
|
5069
|
+
}
|
|
5070
|
+
}
|
|
4366
5071
|
async function createTempRscServer(state, options = {}) {
|
|
5072
|
+
ensureCloudflareProtocolLoaderRegistered();
|
|
4367
5073
|
const { default: rsc } = await import("@vitejs/plugin-rsc");
|
|
4368
5074
|
return createViteServer({
|
|
4369
5075
|
root: state.projectRoot,
|
|
@@ -4386,6 +5092,7 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4386
5092
|
...options.forceBuild ? [hashClientRefs(state.projectRoot)] : [],
|
|
4387
5093
|
createVersionPlugin(),
|
|
4388
5094
|
createVirtualStubPlugin(),
|
|
5095
|
+
createCloudflareProtocolStubPlugin(),
|
|
4389
5096
|
// Dev prerender must use dev-mode IDs (path-based) to match the workerd
|
|
4390
5097
|
// runtime. forceBuild produces hashed IDs for production bundle consistency.
|
|
4391
5098
|
exposeInternalIds(options.forceBuild ? { forceBuild: true } : void 0),
|
|
@@ -4393,8 +5100,69 @@ async function createTempRscServer(state, options = {}) {
|
|
|
4393
5100
|
]
|
|
4394
5101
|
});
|
|
4395
5102
|
}
|
|
5103
|
+
async function resolveBuildEnv(option, factoryCtx) {
|
|
5104
|
+
if (!option) return null;
|
|
5105
|
+
if (option === "auto") {
|
|
5106
|
+
if (factoryCtx.preset !== "cloudflare") {
|
|
5107
|
+
throw new Error(
|
|
5108
|
+
'[rsc-router] buildEnv: "auto" is only supported with preset: "cloudflare". Use a factory function or plain object for other presets.'
|
|
5109
|
+
);
|
|
5110
|
+
}
|
|
5111
|
+
try {
|
|
5112
|
+
const userRequire = createRequire2(
|
|
5113
|
+
resolve8(factoryCtx.root, "package.json")
|
|
5114
|
+
);
|
|
5115
|
+
const wranglerPath = userRequire.resolve("wrangler");
|
|
5116
|
+
const { getPlatformProxy } = await import(pathToFileURL(wranglerPath).href);
|
|
5117
|
+
const proxy = await getPlatformProxy();
|
|
5118
|
+
return {
|
|
5119
|
+
env: proxy.env,
|
|
5120
|
+
dispose: proxy.dispose
|
|
5121
|
+
};
|
|
5122
|
+
} catch (err) {
|
|
5123
|
+
throw new Error(
|
|
5124
|
+
`[rsc-router] buildEnv: "auto" requires wrangler to be installed.
|
|
5125
|
+
Install it with: pnpm add -D wrangler
|
|
5126
|
+
${err.message}`
|
|
5127
|
+
);
|
|
5128
|
+
}
|
|
5129
|
+
}
|
|
5130
|
+
if (typeof option === "function") {
|
|
5131
|
+
return await option(factoryCtx);
|
|
5132
|
+
}
|
|
5133
|
+
return { env: option };
|
|
5134
|
+
}
|
|
5135
|
+
async function acquireBuildEnv(s, command, mode) {
|
|
5136
|
+
const option = s.opts?.buildEnv;
|
|
5137
|
+
if (!option) return false;
|
|
5138
|
+
const result = await resolveBuildEnv(option, {
|
|
5139
|
+
root: s.projectRoot,
|
|
5140
|
+
mode,
|
|
5141
|
+
command,
|
|
5142
|
+
preset: s.opts?.preset ?? "node"
|
|
5143
|
+
});
|
|
5144
|
+
if (!result) return false;
|
|
5145
|
+
s.resolvedBuildEnv = result.env;
|
|
5146
|
+
s.buildEnvDispose = result.dispose ?? null;
|
|
5147
|
+
globalThis[BUILD_ENV_GLOBAL_KEY] = result.env;
|
|
5148
|
+
return true;
|
|
5149
|
+
}
|
|
5150
|
+
async function releaseBuildEnv(s) {
|
|
5151
|
+
if (s.buildEnvDispose) {
|
|
5152
|
+
try {
|
|
5153
|
+
await s.buildEnvDispose();
|
|
5154
|
+
} catch (err) {
|
|
5155
|
+
console.warn(`[rsc-router] buildEnv dispose failed: ${err.message}`);
|
|
5156
|
+
}
|
|
5157
|
+
s.buildEnvDispose = null;
|
|
5158
|
+
}
|
|
5159
|
+
s.resolvedBuildEnv = void 0;
|
|
5160
|
+
delete globalThis[BUILD_ENV_GLOBAL_KEY];
|
|
5161
|
+
}
|
|
4396
5162
|
function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
4397
5163
|
const s = createDiscoveryState(entryPath, opts);
|
|
5164
|
+
let viteCommand = "build";
|
|
5165
|
+
let viteMode = "production";
|
|
4398
5166
|
return {
|
|
4399
5167
|
name: "@rangojs/router:discovery",
|
|
4400
5168
|
config() {
|
|
@@ -4403,31 +5171,13 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4403
5171
|
__RANGO_DEBUG__: JSON.stringify(!!process.env.INTERNAL_RANGO_DEBUG)
|
|
4404
5172
|
}
|
|
4405
5173
|
};
|
|
4406
|
-
if (opts?.enableBuildPrerender) {
|
|
4407
|
-
config.environments = {
|
|
4408
|
-
rsc: {
|
|
4409
|
-
build: {
|
|
4410
|
-
rollupOptions: {
|
|
4411
|
-
output: {
|
|
4412
|
-
manualChunks(id) {
|
|
4413
|
-
if (s.resolvedPrerenderModules?.has(id)) {
|
|
4414
|
-
return "__prerender-handlers";
|
|
4415
|
-
}
|
|
4416
|
-
if (s.resolvedStaticModules?.has(id)) {
|
|
4417
|
-
return "__static-handlers";
|
|
4418
|
-
}
|
|
4419
|
-
}
|
|
4420
|
-
}
|
|
4421
|
-
}
|
|
4422
|
-
}
|
|
4423
|
-
}
|
|
4424
|
-
};
|
|
4425
|
-
}
|
|
4426
5174
|
return config;
|
|
4427
5175
|
},
|
|
4428
5176
|
configResolved(config) {
|
|
4429
5177
|
s.projectRoot = config.root;
|
|
4430
5178
|
s.isBuildMode = config.command === "build";
|
|
5179
|
+
viteCommand = config.command;
|
|
5180
|
+
viteMode = config.mode;
|
|
4431
5181
|
s.userResolveAlias = config.resolve.alias;
|
|
4432
5182
|
if (!s.resolvedEntryPath && opts?.routerPathRef?.path) {
|
|
4433
5183
|
s.resolvedEntryPath = opts.routerPathRef.path;
|
|
@@ -4472,6 +5222,8 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4472
5222
|
});
|
|
4473
5223
|
prerenderTempServer = null;
|
|
4474
5224
|
}
|
|
5225
|
+
releaseBuildEnv(s).catch(() => {
|
|
5226
|
+
});
|
|
4475
5227
|
});
|
|
4476
5228
|
async function getOrCreateTempServer() {
|
|
4477
5229
|
if (prerenderNodeRegistry) {
|
|
@@ -4498,14 +5250,33 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4498
5250
|
return null;
|
|
4499
5251
|
}
|
|
4500
5252
|
const discover = async () => {
|
|
5253
|
+
const discoverStart = performance.now();
|
|
4501
5254
|
const rscEnv = server.environments?.rsc;
|
|
4502
5255
|
if (!rscEnv?.runner) {
|
|
5256
|
+
debugDiscovery?.("dev: no rsc runner (cloudflare path)");
|
|
4503
5257
|
s.devServerOrigin = getDevServerOrigin();
|
|
4504
5258
|
try {
|
|
4505
|
-
|
|
5259
|
+
await timed(
|
|
5260
|
+
debugDiscovery,
|
|
5261
|
+
"acquireBuildEnv",
|
|
5262
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5263
|
+
);
|
|
5264
|
+
const tempRscEnv = await timed(
|
|
5265
|
+
debugDiscovery,
|
|
5266
|
+
"getOrCreateTempServer",
|
|
5267
|
+
() => getOrCreateTempServer()
|
|
5268
|
+
);
|
|
4506
5269
|
if (tempRscEnv) {
|
|
4507
|
-
await
|
|
4508
|
-
|
|
5270
|
+
await timed(
|
|
5271
|
+
debugDiscovery,
|
|
5272
|
+
"discoverRouters (cloudflare)",
|
|
5273
|
+
() => discoverRouters(s, tempRscEnv)
|
|
5274
|
+
);
|
|
5275
|
+
timedSync(
|
|
5276
|
+
debugDiscovery,
|
|
5277
|
+
"writeRouteTypesFiles",
|
|
5278
|
+
() => writeRouteTypesFiles(s)
|
|
5279
|
+
);
|
|
4509
5280
|
}
|
|
4510
5281
|
} catch (err) {
|
|
4511
5282
|
console.warn(
|
|
@@ -4513,26 +5284,54 @@ function createRouterDiscoveryPlugin(entryPath, opts) {
|
|
|
4513
5284
|
${err.stack}`
|
|
4514
5285
|
);
|
|
4515
5286
|
}
|
|
5287
|
+
debugDiscovery?.(
|
|
5288
|
+
"dev discovery done (%sms)",
|
|
5289
|
+
(performance.now() - discoverStart).toFixed(1)
|
|
5290
|
+
);
|
|
4516
5291
|
resolveDiscovery();
|
|
4517
5292
|
return;
|
|
4518
5293
|
}
|
|
4519
5294
|
try {
|
|
4520
|
-
|
|
4521
|
-
|
|
5295
|
+
debugDiscovery?.("dev: node path start");
|
|
5296
|
+
await timed(
|
|
5297
|
+
debugDiscovery,
|
|
5298
|
+
"acquireBuildEnv",
|
|
5299
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5300
|
+
);
|
|
5301
|
+
const serverMod = await timed(
|
|
5302
|
+
debugDiscovery,
|
|
5303
|
+
"import @rangojs/router/server",
|
|
5304
|
+
() => rscEnv.runner.import("@rangojs/router/server")
|
|
4522
5305
|
);
|
|
4523
5306
|
if (serverMod?.setManifestReadyPromise) {
|
|
4524
5307
|
serverMod.setManifestReadyPromise(discoveryPromise);
|
|
4525
5308
|
}
|
|
4526
|
-
await
|
|
5309
|
+
await timed(
|
|
5310
|
+
debugDiscovery,
|
|
5311
|
+
"discoverRouters",
|
|
5312
|
+
() => discoverRouters(s, rscEnv)
|
|
5313
|
+
);
|
|
4527
5314
|
s.devServerOrigin = getDevServerOrigin();
|
|
4528
|
-
|
|
4529
|
-
|
|
5315
|
+
timedSync(
|
|
5316
|
+
debugDiscovery,
|
|
5317
|
+
"writeRouteTypesFiles",
|
|
5318
|
+
() => writeRouteTypesFiles(s)
|
|
5319
|
+
);
|
|
5320
|
+
await timed(
|
|
5321
|
+
debugDiscovery,
|
|
5322
|
+
"propagateDiscoveryState",
|
|
5323
|
+
() => propagateDiscoveryState(rscEnv)
|
|
5324
|
+
);
|
|
4530
5325
|
} catch (err) {
|
|
4531
5326
|
console.warn(
|
|
4532
5327
|
`[rsc-router] Router discovery failed: ${err.message}
|
|
4533
5328
|
${err.stack}`
|
|
4534
5329
|
);
|
|
4535
5330
|
} finally {
|
|
5331
|
+
debugDiscovery?.(
|
|
5332
|
+
"dev discovery done (%sms)",
|
|
5333
|
+
(performance.now() - discoverStart).toFixed(1)
|
|
5334
|
+
);
|
|
4536
5335
|
resolveDiscovery();
|
|
4537
5336
|
}
|
|
4538
5337
|
};
|
|
@@ -4573,15 +5372,46 @@ ${err.stack}`
|
|
|
4573
5372
|
}
|
|
4574
5373
|
};
|
|
4575
5374
|
server.middlewares.use("/__rsc_prerender", async (req, res) => {
|
|
5375
|
+
const reqStart = debugDev ? performance.now() : 0;
|
|
5376
|
+
const logResult = (status, note) => {
|
|
5377
|
+
debugDev?.(
|
|
5378
|
+
"/__rsc_prerender %s -> %d %s (%sms)",
|
|
5379
|
+
req.url,
|
|
5380
|
+
status,
|
|
5381
|
+
note,
|
|
5382
|
+
(performance.now() - reqStart).toFixed(1)
|
|
5383
|
+
);
|
|
5384
|
+
};
|
|
4576
5385
|
if (s.discoveryDone) await s.discoveryDone;
|
|
4577
5386
|
const url = new URL(req.url || "/", "http://localhost");
|
|
4578
5387
|
const pathname = url.searchParams.get("pathname");
|
|
4579
5388
|
if (!pathname) {
|
|
4580
5389
|
res.statusCode = 400;
|
|
4581
5390
|
res.end("Missing pathname");
|
|
5391
|
+
logResult(400, "missing pathname");
|
|
4582
5392
|
return;
|
|
4583
5393
|
}
|
|
4584
|
-
|
|
5394
|
+
const rscEnv = server.environments?.rsc;
|
|
5395
|
+
let registry = null;
|
|
5396
|
+
if (rscEnv?.runner && s.resolvedEntryPath) {
|
|
5397
|
+
try {
|
|
5398
|
+
await rscEnv.runner.import(s.resolvedEntryPath);
|
|
5399
|
+
const serverMod = await rscEnv.runner.import(
|
|
5400
|
+
"@rangojs/router/server"
|
|
5401
|
+
);
|
|
5402
|
+
registry = serverMod.RouterRegistry ?? null;
|
|
5403
|
+
} catch (err) {
|
|
5404
|
+
console.warn(
|
|
5405
|
+
`[rsc-router] Dev prerender module refresh failed: ${err.message}`
|
|
5406
|
+
);
|
|
5407
|
+
res.statusCode = 500;
|
|
5408
|
+
res.end(`Prerender handler error: ${err.message}`);
|
|
5409
|
+
logResult(500, "module refresh failed");
|
|
5410
|
+
return;
|
|
5411
|
+
}
|
|
5412
|
+
} else {
|
|
5413
|
+
registry = mainRegistry;
|
|
5414
|
+
}
|
|
4585
5415
|
if (!registry) {
|
|
4586
5416
|
if (!prerenderNodeRegistry) {
|
|
4587
5417
|
await getOrCreateTempServer();
|
|
@@ -4591,6 +5421,7 @@ ${err.stack}`
|
|
|
4591
5421
|
if (!registry || registry.size === 0) {
|
|
4592
5422
|
res.statusCode = 503;
|
|
4593
5423
|
res.end("Prerender runner not available");
|
|
5424
|
+
logResult(503, "no registry");
|
|
4594
5425
|
return;
|
|
4595
5426
|
}
|
|
4596
5427
|
const wantIntercept = url.searchParams.get("intercept") === "1";
|
|
@@ -4603,7 +5434,10 @@ ${err.stack}`
|
|
|
4603
5434
|
pathname,
|
|
4604
5435
|
{},
|
|
4605
5436
|
void 0,
|
|
4606
|
-
wantPassthrough
|
|
5437
|
+
wantPassthrough,
|
|
5438
|
+
s.resolvedBuildEnv,
|
|
5439
|
+
true
|
|
5440
|
+
// devMode: check getParams for passthrough routes
|
|
4607
5441
|
);
|
|
4608
5442
|
if (!result) continue;
|
|
4609
5443
|
if (result.passthrough) continue;
|
|
@@ -4622,6 +5456,7 @@ ${err.stack}`
|
|
|
4622
5456
|
payload = { segments: result.segments, handles: result.handles };
|
|
4623
5457
|
}
|
|
4624
5458
|
res.end(JSON.stringify(payload));
|
|
5459
|
+
logResult(200, `match ${result.routeName}`);
|
|
4625
5460
|
return;
|
|
4626
5461
|
} catch (err) {
|
|
4627
5462
|
console.warn(
|
|
@@ -4631,6 +5466,7 @@ ${err.stack}`
|
|
|
4631
5466
|
}
|
|
4632
5467
|
res.statusCode = 404;
|
|
4633
5468
|
res.end("No prerender match");
|
|
5469
|
+
logResult(404, "no match");
|
|
4634
5470
|
});
|
|
4635
5471
|
if (opts?.staticRouteTypesGeneration !== false) {
|
|
4636
5472
|
const isGeneratedRouteFile = (filePath) => filePath.endsWith(".gen.ts") && (filePath.includes("named-routes.gen.ts") || filePath.includes("urls.gen.ts"));
|
|
@@ -4655,15 +5491,32 @@ ${err.stack}`
|
|
|
4655
5491
|
const rscEnv = server.environments?.rsc;
|
|
4656
5492
|
if (!rscEnv?.runner || runtimeRediscoveryInProgress) return;
|
|
4657
5493
|
runtimeRediscoveryInProgress = true;
|
|
5494
|
+
const hmrStart = performance.now();
|
|
4658
5495
|
try {
|
|
4659
|
-
await
|
|
4660
|
-
|
|
4661
|
-
|
|
5496
|
+
await timed(
|
|
5497
|
+
debugDiscovery,
|
|
5498
|
+
"hmr discoverRouters",
|
|
5499
|
+
() => discoverRouters(s, rscEnv)
|
|
5500
|
+
);
|
|
5501
|
+
timedSync(
|
|
5502
|
+
debugDiscovery,
|
|
5503
|
+
"hmr writeRouteTypesFiles",
|
|
5504
|
+
() => writeRouteTypesFiles(s)
|
|
5505
|
+
);
|
|
5506
|
+
await timed(
|
|
5507
|
+
debugDiscovery,
|
|
5508
|
+
"hmr propagateDiscoveryState",
|
|
5509
|
+
() => propagateDiscoveryState(rscEnv)
|
|
5510
|
+
);
|
|
4662
5511
|
} catch (err) {
|
|
4663
5512
|
console.warn(
|
|
4664
5513
|
`[rsc-router] Runtime re-discovery failed: ${err.message}`
|
|
4665
5514
|
);
|
|
4666
5515
|
} finally {
|
|
5516
|
+
debugDiscovery?.(
|
|
5517
|
+
"hmr re-discovery done (%sms)",
|
|
5518
|
+
(performance.now() - hmrStart).toFixed(1)
|
|
5519
|
+
);
|
|
4667
5520
|
runtimeRediscoveryInProgress = false;
|
|
4668
5521
|
}
|
|
4669
5522
|
};
|
|
@@ -4671,6 +5524,7 @@ ${err.stack}`
|
|
|
4671
5524
|
clearTimeout(routeChangeTimer);
|
|
4672
5525
|
routeChangeTimer = setTimeout(() => {
|
|
4673
5526
|
routeChangeTimer = void 0;
|
|
5527
|
+
const regenStart = debugDiscovery ? performance.now() : 0;
|
|
4674
5528
|
try {
|
|
4675
5529
|
writeCombinedRouteTypesWithTracking(s);
|
|
4676
5530
|
if (s.perRouterManifests.length > 0) {
|
|
@@ -4681,6 +5535,10 @@ ${err.stack}`
|
|
|
4681
5535
|
`[rsc-router] Route regeneration error: ${err.message}`
|
|
4682
5536
|
);
|
|
4683
5537
|
}
|
|
5538
|
+
debugDiscovery?.(
|
|
5539
|
+
"watcher: regenerated gen files (%sms)",
|
|
5540
|
+
(performance.now() - regenStart).toFixed(1)
|
|
5541
|
+
);
|
|
4684
5542
|
if (s.perRouterManifests.length > 0) {
|
|
4685
5543
|
refreshRuntimeDiscovery().catch((err) => {
|
|
4686
5544
|
console.warn(
|
|
@@ -4703,6 +5561,12 @@ ${err.stack}`
|
|
|
4703
5561
|
const hasUrls = source.includes("urls(");
|
|
4704
5562
|
const hasCreateRouter = /\bcreateRouter\s*[<(]/.test(source);
|
|
4705
5563
|
if (!hasUrls && !hasCreateRouter) return;
|
|
5564
|
+
debugDiscovery?.(
|
|
5565
|
+
"watcher: %s matches (urls=%s, router=%s)",
|
|
5566
|
+
filePath,
|
|
5567
|
+
hasUrls,
|
|
5568
|
+
hasCreateRouter
|
|
5569
|
+
);
|
|
4706
5570
|
if (hasCreateRouter) {
|
|
4707
5571
|
const nestedRouterConflict = findNestedRouterConflict([
|
|
4708
5572
|
...s.cachedRouterFiles ?? [],
|
|
@@ -4735,14 +5599,31 @@ ${err.stack}`
|
|
|
4735
5599
|
// The manifest data is stored for the virtual module's load hook.
|
|
4736
5600
|
async buildStart() {
|
|
4737
5601
|
if (!s.isBuildMode) return;
|
|
4738
|
-
if (s.mergedRouteManifest !== null)
|
|
5602
|
+
if (s.mergedRouteManifest !== null) {
|
|
5603
|
+
debugDiscovery?.(
|
|
5604
|
+
"build: skip (already discovered, env=%s)",
|
|
5605
|
+
this.environment?.name ?? "?"
|
|
5606
|
+
);
|
|
5607
|
+
return;
|
|
5608
|
+
}
|
|
5609
|
+
const buildStartTime = performance.now();
|
|
5610
|
+
debugDiscovery?.("build: start (env=%s)", this.environment?.name ?? "?");
|
|
4739
5611
|
resetStagedBuildAssets(s.projectRoot);
|
|
4740
5612
|
s.prerenderManifestEntries = null;
|
|
4741
5613
|
s.staticManifestEntries = null;
|
|
5614
|
+
await timed(
|
|
5615
|
+
debugDiscovery,
|
|
5616
|
+
"build acquireBuildEnv",
|
|
5617
|
+
() => acquireBuildEnv(s, viteCommand, viteMode)
|
|
5618
|
+
);
|
|
4742
5619
|
let tempServer = null;
|
|
4743
5620
|
globalThis.__rscRouterDiscoveryActive = true;
|
|
4744
5621
|
try {
|
|
4745
|
-
tempServer = await
|
|
5622
|
+
tempServer = await timed(
|
|
5623
|
+
debugDiscovery,
|
|
5624
|
+
"build createTempRscServer",
|
|
5625
|
+
() => createTempRscServer(s, { forceBuild: true })
|
|
5626
|
+
);
|
|
4746
5627
|
const rscEnv = tempServer.environments?.rsc;
|
|
4747
5628
|
if (!rscEnv?.runner) {
|
|
4748
5629
|
console.warn(
|
|
@@ -4756,8 +5637,16 @@ ${err.stack}`
|
|
|
4756
5637
|
if (tempIdsPlugin?.api?.staticHandlerModules) {
|
|
4757
5638
|
s.resolvedStaticModules = tempIdsPlugin.api.staticHandlerModules;
|
|
4758
5639
|
}
|
|
4759
|
-
await
|
|
4760
|
-
|
|
5640
|
+
await timed(
|
|
5641
|
+
debugDiscovery,
|
|
5642
|
+
"build discoverRouters",
|
|
5643
|
+
() => discoverRouters(s, rscEnv)
|
|
5644
|
+
);
|
|
5645
|
+
timedSync(
|
|
5646
|
+
debugDiscovery,
|
|
5647
|
+
"build writeRouteTypesFiles",
|
|
5648
|
+
() => writeRouteTypesFiles(s)
|
|
5649
|
+
);
|
|
4761
5650
|
} catch (err) {
|
|
4762
5651
|
const sourceFile = err.stack?.split("\n").find(
|
|
4763
5652
|
(line) => line.includes(s.projectRoot) && !line.includes("node_modules")
|
|
@@ -4776,8 +5665,17 @@ ${details}`
|
|
|
4776
5665
|
} finally {
|
|
4777
5666
|
delete globalThis.__rscRouterDiscoveryActive;
|
|
4778
5667
|
if (tempServer) {
|
|
4779
|
-
await
|
|
5668
|
+
await timed(
|
|
5669
|
+
debugDiscovery,
|
|
5670
|
+
"build tempServer.close",
|
|
5671
|
+
() => tempServer.close()
|
|
5672
|
+
);
|
|
4780
5673
|
}
|
|
5674
|
+
await releaseBuildEnv(s);
|
|
5675
|
+
debugDiscovery?.(
|
|
5676
|
+
"build discovery done (%sms)",
|
|
5677
|
+
(performance.now() - buildStartTime).toFixed(1)
|
|
5678
|
+
);
|
|
4781
5679
|
}
|
|
4782
5680
|
},
|
|
4783
5681
|
// Virtual module: provides the pre-generated route manifest as a JS module
|
|
@@ -4794,17 +5692,36 @@ ${details}`
|
|
|
4794
5692
|
async load(id) {
|
|
4795
5693
|
if (id === "\0" + VIRTUAL_ROUTES_MANIFEST_ID) {
|
|
4796
5694
|
if (s.discoveryDone) {
|
|
4797
|
-
await
|
|
5695
|
+
await timed(
|
|
5696
|
+
debugRoutes,
|
|
5697
|
+
"await discoveryDone (manifest)",
|
|
5698
|
+
() => Promise.resolve(s.discoveryDone)
|
|
5699
|
+
);
|
|
4798
5700
|
}
|
|
4799
|
-
|
|
5701
|
+
const code = await timed(
|
|
5702
|
+
debugRoutes,
|
|
5703
|
+
"generateRoutesManifestModule",
|
|
5704
|
+
() => generateRoutesManifestModule(s)
|
|
5705
|
+
);
|
|
5706
|
+
debugRoutes?.("manifest module emitted (%d bytes)", code?.length ?? 0);
|
|
5707
|
+
return code;
|
|
4800
5708
|
}
|
|
4801
5709
|
const perRouterPrefix = "\0" + VIRTUAL_ROUTES_MANIFEST_ID + "/";
|
|
4802
5710
|
if (id.startsWith(perRouterPrefix)) {
|
|
4803
5711
|
if (s.discoveryDone) {
|
|
4804
|
-
await
|
|
5712
|
+
await timed(
|
|
5713
|
+
debugRoutes,
|
|
5714
|
+
"await discoveryDone (per-router)",
|
|
5715
|
+
() => Promise.resolve(s.discoveryDone)
|
|
5716
|
+
);
|
|
4805
5717
|
}
|
|
4806
5718
|
const routerId = id.slice(perRouterPrefix.length);
|
|
4807
|
-
|
|
5719
|
+
const code = await timed(
|
|
5720
|
+
debugRoutes,
|
|
5721
|
+
`generatePerRouterModule ${routerId}`,
|
|
5722
|
+
() => generatePerRouterModule(s, routerId)
|
|
5723
|
+
);
|
|
5724
|
+
return code;
|
|
4808
5725
|
}
|
|
4809
5726
|
return null;
|
|
4810
5727
|
},
|
|
@@ -4812,28 +5729,44 @@ ${details}`
|
|
|
4812
5729
|
// Used by closeBundle for handler code eviction and prerender data injection.
|
|
4813
5730
|
generateBundle(_options, bundle) {
|
|
4814
5731
|
if (this.environment?.name !== "rsc") return;
|
|
5732
|
+
const genStart = debugBuild ? performance.now() : 0;
|
|
4815
5733
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4816
5734
|
if (chunk.type === "chunk" && chunk.isEntry) {
|
|
4817
5735
|
s.rscEntryFileName = fileName;
|
|
4818
5736
|
break;
|
|
4819
5737
|
}
|
|
4820
5738
|
}
|
|
4821
|
-
if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size)
|
|
5739
|
+
if (!s.resolvedPrerenderModules?.size && !s.resolvedStaticModules?.size) {
|
|
5740
|
+
debugBuild?.(
|
|
5741
|
+
"generateBundle (rsc): no handlers to scan (%sms)",
|
|
5742
|
+
(performance.now() - genStart).toFixed(1)
|
|
5743
|
+
);
|
|
4822
5744
|
return;
|
|
5745
|
+
}
|
|
5746
|
+
s.handlerChunkInfoMap.clear();
|
|
5747
|
+
s.staticHandlerChunkInfoMap.clear();
|
|
4823
5748
|
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
4824
5749
|
if (chunk.type !== "chunk") continue;
|
|
4825
|
-
if (
|
|
5750
|
+
if (s.resolvedPrerenderModules?.size) {
|
|
4826
5751
|
const handlers = extractHandlerExportsFromChunk(
|
|
4827
5752
|
chunk.code,
|
|
4828
5753
|
s.resolvedPrerenderModules,
|
|
4829
5754
|
"Prerender",
|
|
4830
|
-
|
|
5755
|
+
false
|
|
4831
5756
|
);
|
|
4832
5757
|
if (handlers.length > 0) {
|
|
4833
|
-
|
|
5758
|
+
const existing = s.handlerChunkInfoMap.get(fileName);
|
|
5759
|
+
if (existing) {
|
|
5760
|
+
existing.exports.push(...handlers);
|
|
5761
|
+
} else {
|
|
5762
|
+
s.handlerChunkInfoMap.set(fileName, {
|
|
5763
|
+
fileName,
|
|
5764
|
+
exports: handlers
|
|
5765
|
+
});
|
|
5766
|
+
}
|
|
4834
5767
|
}
|
|
4835
5768
|
}
|
|
4836
|
-
if (
|
|
5769
|
+
if (s.resolvedStaticModules?.size) {
|
|
4837
5770
|
const handlers = extractHandlerExportsFromChunk(
|
|
4838
5771
|
chunk.code,
|
|
4839
5772
|
s.resolvedStaticModules,
|
|
@@ -4841,10 +5774,25 @@ ${details}`
|
|
|
4841
5774
|
false
|
|
4842
5775
|
);
|
|
4843
5776
|
if (handlers.length > 0) {
|
|
4844
|
-
|
|
5777
|
+
const existing = s.staticHandlerChunkInfoMap.get(fileName);
|
|
5778
|
+
if (existing) {
|
|
5779
|
+
existing.exports.push(...handlers);
|
|
5780
|
+
} else {
|
|
5781
|
+
s.staticHandlerChunkInfoMap.set(fileName, {
|
|
5782
|
+
fileName,
|
|
5783
|
+
exports: handlers
|
|
5784
|
+
});
|
|
5785
|
+
}
|
|
4845
5786
|
}
|
|
4846
5787
|
}
|
|
4847
5788
|
}
|
|
5789
|
+
debugBuild?.(
|
|
5790
|
+
"generateBundle (rsc): scanned %d chunks, %d prerender chunk(s), %d static chunk(s) (%sms)",
|
|
5791
|
+
Object.keys(bundle).length,
|
|
5792
|
+
s.handlerChunkInfoMap.size,
|
|
5793
|
+
s.staticHandlerChunkInfoMap.size,
|
|
5794
|
+
(performance.now() - genStart).toFixed(1)
|
|
5795
|
+
);
|
|
4848
5796
|
},
|
|
4849
5797
|
// Build-time pre-rendering: evict handler code and inject collected prerender data.
|
|
4850
5798
|
// Collection now happens in-process during discoverRouters() via RSC runner.
|
|
@@ -4855,82 +5803,41 @@ ${details}`
|
|
|
4855
5803
|
async handler() {
|
|
4856
5804
|
if (!s.isBuildMode) return;
|
|
4857
5805
|
if (this.environment && this.environment.name !== "rsc") return;
|
|
4858
|
-
|
|
5806
|
+
timedSync(
|
|
5807
|
+
debugBuild,
|
|
5808
|
+
"closeBundle postprocessBundle",
|
|
5809
|
+
() => postprocessBundle(s)
|
|
5810
|
+
);
|
|
4859
5811
|
}
|
|
4860
5812
|
}
|
|
4861
5813
|
};
|
|
4862
5814
|
}
|
|
4863
5815
|
|
|
4864
|
-
// src/vite/plugins/performance-tracks.ts
|
|
4865
|
-
var DEBUG_ID_HEADER = "X-RSC-Debug-Id";
|
|
4866
|
-
var DEBUG_C2S_EVENT = "rango:perf-c2s";
|
|
4867
|
-
var base64ToBytes = (base64) => new Uint8Array(Buffer.from(base64, "base64"));
|
|
4868
|
-
var devServer = null;
|
|
4869
|
-
var sessions = /* @__PURE__ */ new Map();
|
|
4870
|
-
function performanceTracksPlugin() {
|
|
4871
|
-
return {
|
|
4872
|
-
name: "@rangojs/router:performance-tracks",
|
|
4873
|
-
apply: "serve",
|
|
4874
|
-
configureServer(server) {
|
|
4875
|
-
devServer = server;
|
|
4876
|
-
const hot = server.environments.client.hot;
|
|
4877
|
-
hot.on(DEBUG_C2S_EVENT, (payload) => {
|
|
4878
|
-
const session = sessions.get(payload.i);
|
|
4879
|
-
if ("d" in payload) {
|
|
4880
|
-
if (session?.cmdController) {
|
|
4881
|
-
try {
|
|
4882
|
-
session.cmdController.close();
|
|
4883
|
-
} catch {
|
|
4884
|
-
}
|
|
4885
|
-
delete session.cmdController;
|
|
4886
|
-
}
|
|
4887
|
-
return;
|
|
4888
|
-
}
|
|
4889
|
-
if ("b" in payload) {
|
|
4890
|
-
if (session?.cmdController) {
|
|
4891
|
-
try {
|
|
4892
|
-
session.cmdController.enqueue(base64ToBytes(payload.b));
|
|
4893
|
-
} catch {
|
|
4894
|
-
delete session.cmdController;
|
|
4895
|
-
}
|
|
4896
|
-
}
|
|
4897
|
-
return;
|
|
4898
|
-
}
|
|
4899
|
-
});
|
|
4900
|
-
return () => {
|
|
4901
|
-
server.middlewares.use((req, _res, next) => {
|
|
4902
|
-
const existingId = req.headers[DEBUG_ID_HEADER.toLowerCase()];
|
|
4903
|
-
const isHtml = req.headers.accept?.includes("text/html");
|
|
4904
|
-
if (!existingId && !isHtml) {
|
|
4905
|
-
next();
|
|
4906
|
-
return;
|
|
4907
|
-
}
|
|
4908
|
-
const debugId = existingId || crypto.randomUUID();
|
|
4909
|
-
if (!existingId) {
|
|
4910
|
-
const lowerName = DEBUG_ID_HEADER.toLowerCase();
|
|
4911
|
-
req.headers[lowerName] = debugId;
|
|
4912
|
-
if (req.rawHeaders) {
|
|
4913
|
-
req.rawHeaders.push(DEBUG_ID_HEADER, debugId);
|
|
4914
|
-
}
|
|
4915
|
-
}
|
|
4916
|
-
if (!sessions.has(debugId)) {
|
|
4917
|
-
sessions.set(debugId, { pendingChunks: [], ended: false });
|
|
4918
|
-
}
|
|
4919
|
-
next();
|
|
4920
|
-
});
|
|
4921
|
-
};
|
|
4922
|
-
}
|
|
4923
|
-
};
|
|
4924
|
-
}
|
|
4925
|
-
|
|
4926
5816
|
// src/vite/rango.ts
|
|
5817
|
+
var debugConfig = createRangoDebugger("rango:config");
|
|
4927
5818
|
async function rango(options) {
|
|
5819
|
+
const rangoStart = performance.now();
|
|
4928
5820
|
const resolvedOptions = options ?? { preset: "node" };
|
|
4929
5821
|
const preset = resolvedOptions.preset ?? "node";
|
|
4930
5822
|
const showBanner = resolvedOptions.banner ?? true;
|
|
5823
|
+
debugConfig?.("rango(%s) setup start", preset);
|
|
4931
5824
|
const plugins = [];
|
|
4932
|
-
const rangoAliases = getPackageAliases();
|
|
4933
|
-
const excludeDeps =
|
|
5825
|
+
const rangoAliases = { ...getPackageAliases(), ...getVendorAliases() };
|
|
5826
|
+
const excludeDeps = [
|
|
5827
|
+
...getExcludeDeps(),
|
|
5828
|
+
// plugin-rsc itself injects these into the client env's
|
|
5829
|
+
// optimizeDeps.include, which overrides exclude for the dep's own
|
|
5830
|
+
// pre-bundle entry. What exclude still controls is how *other*
|
|
5831
|
+
// pre-bundled deps treat imports of these specs (external vs inlined)
|
|
5832
|
+
// via esbuildCjsExternalPlugin. The cjs-to-esm transform in
|
|
5833
|
+
// plugins/cjs-to-esm.ts is the fallback for strict-pnpm consumers,
|
|
5834
|
+
// where client.browser's bare include fails to resolve and Vite ends up
|
|
5835
|
+
// serving the raw CJS file at dev-serve time.
|
|
5836
|
+
"@vitejs/plugin-rsc/browser",
|
|
5837
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.browser"
|
|
5838
|
+
];
|
|
5839
|
+
const pkg = getPublishedPackageName();
|
|
5840
|
+
const nested = (spec) => `${pkg} > ${spec}`;
|
|
4934
5841
|
const routerRef = { path: void 0 };
|
|
4935
5842
|
const prerenderEnabled = true;
|
|
4936
5843
|
if (preset === "cloudflare") {
|
|
@@ -4968,7 +5875,7 @@ async function rango(options) {
|
|
|
4968
5875
|
// Pre-bundle rsc-html-stream to prevent discovery during first request
|
|
4969
5876
|
// Exclude rsc-router modules to ensure same Context instance
|
|
4970
5877
|
optimizeDeps: {
|
|
4971
|
-
include: ["rsc-html-stream/client"],
|
|
5878
|
+
include: [nested("rsc-html-stream/client")],
|
|
4972
5879
|
exclude: excludeDeps,
|
|
4973
5880
|
esbuildOptions: sharedEsbuildOptions
|
|
4974
5881
|
}
|
|
@@ -4993,8 +5900,10 @@ async function rango(options) {
|
|
|
4993
5900
|
"react-dom/static.edge",
|
|
4994
5901
|
"react/jsx-runtime",
|
|
4995
5902
|
"react/jsx-dev-runtime",
|
|
4996
|
-
"rsc-html-stream/server",
|
|
4997
|
-
|
|
5903
|
+
nested("rsc-html-stream/server"),
|
|
5904
|
+
nested(
|
|
5905
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
5906
|
+
)
|
|
4998
5907
|
],
|
|
4999
5908
|
exclude: excludeDeps,
|
|
5000
5909
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -5009,7 +5918,9 @@ async function rango(options) {
|
|
|
5009
5918
|
"react",
|
|
5010
5919
|
"react/jsx-runtime",
|
|
5011
5920
|
"react/jsx-dev-runtime",
|
|
5012
|
-
|
|
5921
|
+
nested(
|
|
5922
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
5923
|
+
)
|
|
5013
5924
|
],
|
|
5014
5925
|
exclude: excludeDeps,
|
|
5015
5926
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -5026,6 +5937,7 @@ async function rango(options) {
|
|
|
5026
5937
|
}
|
|
5027
5938
|
});
|
|
5028
5939
|
plugins.push(createVirtualEntriesPlugin(finalEntries));
|
|
5940
|
+
plugins.push(performanceTracksPlugin());
|
|
5029
5941
|
plugins.push(
|
|
5030
5942
|
rsc({
|
|
5031
5943
|
entries: finalEntries,
|
|
@@ -5089,7 +6001,7 @@ ${list}`);
|
|
|
5089
6001
|
"react-dom",
|
|
5090
6002
|
"react/jsx-runtime",
|
|
5091
6003
|
"react/jsx-dev-runtime",
|
|
5092
|
-
"rsc-html-stream/client"
|
|
6004
|
+
nested("rsc-html-stream/client")
|
|
5093
6005
|
],
|
|
5094
6006
|
exclude: excludeDeps,
|
|
5095
6007
|
esbuildOptions: sharedEsbuildOptions,
|
|
@@ -5106,7 +6018,9 @@ ${list}`);
|
|
|
5106
6018
|
"react-dom/static.edge",
|
|
5107
6019
|
"react/jsx-runtime",
|
|
5108
6020
|
"react/jsx-dev-runtime",
|
|
5109
|
-
|
|
6021
|
+
nested(
|
|
6022
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/client.edge"
|
|
6023
|
+
)
|
|
5110
6024
|
],
|
|
5111
6025
|
exclude: excludeDeps,
|
|
5112
6026
|
esbuildOptions: sharedEsbuildOptions
|
|
@@ -5119,7 +6033,9 @@ ${list}`);
|
|
|
5119
6033
|
"react",
|
|
5120
6034
|
"react/jsx-runtime",
|
|
5121
6035
|
"react/jsx-dev-runtime",
|
|
5122
|
-
|
|
6036
|
+
nested(
|
|
6037
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge"
|
|
6038
|
+
)
|
|
5123
6039
|
],
|
|
5124
6040
|
esbuildOptions: sharedEsbuildOptions
|
|
5125
6041
|
}
|
|
@@ -5144,6 +6060,7 @@ ${list}`);
|
|
|
5144
6060
|
}
|
|
5145
6061
|
});
|
|
5146
6062
|
plugins.push(createVirtualEntriesPlugin(finalEntries, routerRef));
|
|
6063
|
+
plugins.push(performanceTracksPlugin());
|
|
5147
6064
|
plugins.push(
|
|
5148
6065
|
rsc({
|
|
5149
6066
|
entries: finalEntries
|
|
@@ -5184,10 +6101,16 @@ ${list}`);
|
|
|
5184
6101
|
createRouterDiscoveryPlugin(discoveryEntryPath, {
|
|
5185
6102
|
routerPathRef: discoveryRouterRef,
|
|
5186
6103
|
enableBuildPrerender: prerenderEnabled,
|
|
5187
|
-
|
|
6104
|
+
buildEnv: options?.buildEnv,
|
|
6105
|
+
preset
|
|
5188
6106
|
})
|
|
5189
6107
|
);
|
|
5190
|
-
|
|
6108
|
+
debugConfig?.(
|
|
6109
|
+
"rango(%s) setup done: %d plugin(s) (%sms)",
|
|
6110
|
+
preset,
|
|
6111
|
+
plugins.length,
|
|
6112
|
+
(performance.now() - rangoStart).toFixed(1)
|
|
6113
|
+
);
|
|
5191
6114
|
return plugins;
|
|
5192
6115
|
}
|
|
5193
6116
|
|
|
@@ -5198,29 +6121,75 @@ function poke() {
|
|
|
5198
6121
|
apply: "serve",
|
|
5199
6122
|
configureServer(server) {
|
|
5200
6123
|
const stdin = process.stdin;
|
|
5201
|
-
const
|
|
6124
|
+
const debug11 = process.env.RANGO_POKE_DEBUG === "1";
|
|
6125
|
+
const triggerReload = (source) => {
|
|
6126
|
+
server.hot.send({ type: "full-reload", path: "*" });
|
|
6127
|
+
server.config.logger.info(` browser reload (${source})`, {
|
|
6128
|
+
timestamp: true
|
|
6129
|
+
});
|
|
6130
|
+
};
|
|
6131
|
+
const toBuffer = (chunk) => {
|
|
6132
|
+
return typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
6133
|
+
};
|
|
6134
|
+
const formatChunk = (chunk) => {
|
|
6135
|
+
const data = toBuffer(chunk);
|
|
6136
|
+
const hex = Array.from(data).map((byte) => `0x${byte.toString(16).padStart(2, "0")}`).join(" ");
|
|
6137
|
+
const ascii = Array.from(data).map((byte) => {
|
|
6138
|
+
if (byte >= 32 && byte <= 126) return String.fromCharCode(byte);
|
|
6139
|
+
if (byte === 10) return "\\n";
|
|
6140
|
+
if (byte === 13) return "\\r";
|
|
6141
|
+
if (byte === 9) return "\\t";
|
|
6142
|
+
return ".";
|
|
6143
|
+
}).join("");
|
|
6144
|
+
return `len=${data.length} hex=[${hex}] ascii="${ascii}"`;
|
|
6145
|
+
};
|
|
6146
|
+
const readCtrlR = (chunk) => {
|
|
6147
|
+
const data = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
6148
|
+
return data.length === 1 && data[0] === 18;
|
|
6149
|
+
};
|
|
6150
|
+
const readSubmittedCommands = (chunk) => {
|
|
6151
|
+
const text = toBuffer(chunk).toString("utf8").replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
6152
|
+
if (!text.includes("\n")) return [];
|
|
6153
|
+
const lines = text.split("\n");
|
|
6154
|
+
lines.pop();
|
|
6155
|
+
return lines;
|
|
6156
|
+
};
|
|
6157
|
+
if (debug11) {
|
|
6158
|
+
server.config.logger.info(
|
|
6159
|
+
` poke debug enabled (isTTY=${stdin.isTTY ? "yes" : "no"}, isRaw=${stdin.isTTY ? stdin.isRaw ? "yes" : "no" : "n/a"})`,
|
|
6160
|
+
{ timestamp: true }
|
|
6161
|
+
);
|
|
6162
|
+
}
|
|
5202
6163
|
if (stdin.isTTY) {
|
|
5203
|
-
|
|
6164
|
+
server.config.logger.info(
|
|
6165
|
+
" poke ready: press e + enter to reload browser (ctrl+r also works when available)",
|
|
6166
|
+
{ timestamp: true }
|
|
6167
|
+
);
|
|
5204
6168
|
}
|
|
5205
6169
|
const onData = (data) => {
|
|
5206
|
-
if (
|
|
5207
|
-
|
|
5208
|
-
process.emit("SIGINT", "SIGINT");
|
|
5209
|
-
return;
|
|
5210
|
-
}
|
|
5211
|
-
if (data[0] === 18) {
|
|
5212
|
-
server.hot.send({ type: "full-reload", path: "*" });
|
|
5213
|
-
server.config.logger.info(" browser reload (ctrl+r)", {
|
|
6170
|
+
if (debug11) {
|
|
6171
|
+
server.config.logger.info(` poke stdin ${formatChunk(data)}`, {
|
|
5214
6172
|
timestamp: true
|
|
5215
6173
|
});
|
|
5216
6174
|
}
|
|
6175
|
+
if (readCtrlR(data)) {
|
|
6176
|
+
triggerReload("ctrl+r");
|
|
6177
|
+
return;
|
|
6178
|
+
}
|
|
6179
|
+
for (const command of readSubmittedCommands(data)) {
|
|
6180
|
+
if (command === "e") {
|
|
6181
|
+
triggerReload("e+enter");
|
|
6182
|
+
return;
|
|
6183
|
+
}
|
|
6184
|
+
if (command === "\x1Br") {
|
|
6185
|
+
triggerReload("option+r+enter");
|
|
6186
|
+
return;
|
|
6187
|
+
}
|
|
6188
|
+
}
|
|
5217
6189
|
};
|
|
5218
6190
|
stdin.on("data", onData);
|
|
5219
6191
|
server.httpServer?.on("close", () => {
|
|
5220
6192
|
stdin.off("data", onData);
|
|
5221
|
-
if (stdin.isTTY && previousRawMode !== null) {
|
|
5222
|
-
stdin.setRawMode(previousRawMode);
|
|
5223
|
-
}
|
|
5224
6193
|
});
|
|
5225
6194
|
}
|
|
5226
6195
|
};
|