@rangojs/router 0.5.1 → 0.6.0
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 +5 -1
- package/dist/bin/rango.js +343 -125
- package/dist/types/browser/event-controller.d.ts +6 -0
- package/dist/types/browser/react/use-router.d.ts +10 -3
- package/dist/types/browser/react/use-search-params.d.ts +57 -10
- package/dist/types/browser/types.d.ts +22 -0
- package/dist/types/build/merge-full-manifests.d.ts +3 -0
- package/dist/types/build/route-trie.d.ts +4 -73
- package/dist/types/build/route-types/per-module-writer.d.ts +6 -4
- package/dist/types/build/route-types/router-processing.d.ts +2 -3
- package/dist/types/cache/cache-exec-scope.d.ts +31 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
- package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
- package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
- package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
- package/dist/types/cache/taint.d.ts +12 -6
- package/dist/types/client-urls/client-root.d.ts +38 -0
- package/dist/types/client-urls/client-urls.d.ts +5 -0
- package/dist/types/client-urls/navigation.d.ts +38 -0
- package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
- package/dist/types/client-urls/server-projection.d.ts +62 -0
- package/dist/types/client-urls/types.d.ts +144 -0
- package/dist/types/client.d.ts +12 -4
- package/dist/types/client.rsc.d.ts +4 -1
- package/dist/types/decode-loader-results.d.ts +37 -0
- package/dist/types/errors.d.ts +1 -0
- package/dist/types/handles/is-thenable.d.ts +2 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/loader-redirect.d.ts +27 -0
- package/dist/types/outlet-context.d.ts +12 -0
- package/dist/types/outlet-provider.d.ts +3 -1
- package/dist/types/redirect-origin.d.ts +4 -0
- package/dist/types/route-content-wrapper.d.ts +42 -1
- package/dist/types/route-definition/helpers-types.d.ts +13 -2
- package/dist/types/router/error-handling.d.ts +35 -1
- package/dist/types/router/intercept-resolution.d.ts +12 -0
- package/dist/types/router/loader-resolution.d.ts +24 -2
- package/dist/types/router/revalidation.d.ts +7 -0
- package/dist/{types.backup/build/route-trie.d.ts → types/router/route-trie-builder.d.ts} +4 -16
- package/dist/types/router/router-interfaces.d.ts +20 -0
- package/dist/types/router/segment-resolution/helpers.d.ts +1 -1
- package/dist/types/router/trie-matching.d.ts +1 -1
- package/dist/types/rsc/helpers.d.ts +3 -0
- package/dist/types/rsc/manifest-init.d.ts +5 -5
- package/dist/types/rsc/render-pipeline.d.ts +9 -0
- package/dist/types/rsc/routine-plan.d.ts +124 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
- package/dist/types/rsc/shell-capture.d.ts +9 -0
- package/dist/types/rsc/shell-serve.d.ts +11 -0
- package/dist/types/rsc/types.d.ts +30 -0
- package/dist/types/segment-system.d.ts +2 -0
- package/dist/types/server/context.d.ts +10 -0
- package/dist/types/server/handle-store.d.ts +34 -3
- package/dist/types/server/request-context.d.ts +14 -1
- package/dist/types/server.d.ts +1 -0
- package/dist/types/ssr/index.d.ts +22 -0
- package/dist/types/ssr/ssr-root.d.ts +10 -0
- package/dist/types/testing/dom.entry.d.ts +1 -1
- package/dist/types/testing/render-route.d.ts +16 -6
- package/dist/types/testing/run-loader.d.ts +9 -0
- package/dist/types/types/boundaries.d.ts +22 -0
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/loader-types.d.ts +57 -5
- package/dist/types/types/segments.d.ts +7 -0
- package/dist/types/urls/path-helper-types.d.ts +10 -4
- package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
- package/dist/types/vite/discovery/discover-routers.d.ts +1 -1
- package/dist/types/vite/discovery/state.d.ts +8 -1
- package/dist/types/vite/encryption-key.d.ts +2 -0
- package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
- package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
- package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
- package/dist/types/vite/utils/shared-utils.d.ts +12 -0
- package/dist/vite/index.js +5101 -2056
- package/package.json +3 -3
- package/skills/breadcrumbs/SKILL.md +39 -9
- package/skills/caching/SKILL.md +1 -1
- package/skills/catalog.json +7 -1
- package/skills/client-urls/SKILL.md +338 -0
- package/skills/comparison/references/framework-comparison.md +23 -9
- package/skills/hooks/SKILL.md +2 -2
- package/skills/hooks/data.md +11 -2
- package/skills/hooks/handle-and-actions.md +7 -0
- package/skills/hooks/outlets.md +26 -5
- package/skills/hooks/urls.md +40 -3
- package/skills/loader/SKILL.md +132 -20
- package/skills/migrate-nextjs/SKILL.md +70 -10
- package/skills/migrate-react-router/SKILL.md +49 -13
- package/skills/migrate-react-router/component-migration.md +18 -13
- package/skills/migrate-react-router/data-and-actions.md +14 -3
- package/skills/migrate-react-router/route-mapping.md +15 -2
- package/skills/mime-routes/SKILL.md +3 -1
- package/skills/parallel/SKILL.md +32 -1
- package/skills/ppr/SKILL.md +16 -6
- package/skills/prerender/SKILL.md +8 -4
- package/skills/rango/SKILL.md +21 -17
- package/skills/react-compiler/SKILL.md +3 -3
- package/skills/response-routes/SKILL.md +4 -2
- package/skills/route/SKILL.md +5 -2
- package/skills/router-setup/SKILL.md +16 -2
- package/skills/scripts/SKILL.md +16 -6
- package/skills/shell-manifest/SKILL.md +16 -7
- package/skills/testing/SKILL.md +2 -2
- package/skills/testing/client-components.md +6 -0
- package/skills/testing/handles.md +30 -8
- package/skills/testing/loader.md +51 -49
- package/skills/testing/middleware.md +1 -1
- package/skills/theme/SKILL.md +8 -5
- package/skills/typesafety/generated-files-and-cli.md +16 -9
- package/skills/typesafety/route-types.md +5 -1
- package/skills/use-cache/SKILL.md +47 -0
- package/src/bin/rango.ts +7 -3
- package/src/browser/event-controller.ts +40 -15
- package/src/browser/navigation-bridge.ts +6 -0
- package/src/browser/navigation-client.ts +5 -0
- package/src/browser/partial-update.ts +77 -10
- package/src/browser/react/NavigationProvider.tsx +7 -0
- package/src/browser/react/use-router.ts +40 -11
- package/src/browser/react/use-search-params.ts +140 -17
- package/src/browser/rsc-router.tsx +59 -0
- package/src/browser/server-action-bridge.ts +26 -0
- package/src/browser/types.ts +22 -0
- package/src/build/merge-full-manifests.ts +161 -0
- package/src/build/route-trie.ts +9 -332
- package/src/build/route-types/include-resolution.ts +66 -11
- package/src/build/route-types/per-module-writer.ts +11 -6
- package/src/build/route-types/router-processing.ts +184 -153
- package/src/build/runtime-discovery.ts +23 -12
- package/src/cache/cache-exec-scope.ts +47 -0
- package/src/cache/cache-runtime.ts +113 -40
- package/src/cache/cf/cf-cache-constants.ts +8 -1
- package/src/cache/cf/cf-cache-store.ts +41 -64
- package/src/cache/cf/cf-cache-types.ts +1 -1
- package/src/cache/cf/cf-kv-utils.ts +38 -0
- package/src/cache/segment-codec.ts +21 -5
- package/src/cache/taint.ts +28 -9
- package/src/client-urls/client-root.tsx +168 -0
- package/src/client-urls/client-urls.ts +698 -0
- package/src/client-urls/navigation.ts +237 -0
- package/src/client-urls/revalidation-protocol.ts +56 -0
- package/src/client-urls/server-projection.ts +579 -0
- package/src/client-urls/types.ts +195 -0
- package/src/client.rsc.tsx +12 -0
- package/src/client.tsx +49 -6
- package/src/decode-loader-results.ts +113 -0
- package/src/errors.ts +14 -0
- package/src/handles/deferred-resolution.ts +14 -7
- package/src/handles/is-thenable.ts +2 -4
- package/src/index.ts +1 -0
- package/src/loader-redirect.tsx +64 -0
- package/src/outlet-context.ts +12 -0
- package/src/outlet-provider.tsx +15 -1
- package/src/redirect-origin.ts +29 -0
- package/src/route-content-wrapper.tsx +96 -3
- package/src/route-definition/dsl-helpers.ts +28 -3
- package/src/route-definition/helpers-types.ts +13 -0
- package/src/route-definition/redirect.ts +17 -18
- package/src/router/error-handling.ts +65 -11
- package/src/router/intercept-resolution.ts +29 -0
- package/src/router/loader-resolution.ts +261 -28
- package/src/router/match-middleware/cache-lookup.ts +24 -15
- package/src/router/match-result.ts +7 -0
- package/src/router/revalidation.ts +24 -11
- package/src/router/route-trie-builder.ts +334 -0
- package/src/router/router-interfaces.ts +38 -0
- package/src/router/segment-resolution/fresh.ts +47 -0
- package/src/router/segment-resolution/helpers.ts +9 -11
- package/src/router/segment-resolution/loader-cache.ts +14 -24
- package/src/router/segment-resolution/revalidation.ts +20 -1
- package/src/router/trie-matching.ts +3 -3
- package/src/router.ts +46 -1
- package/src/rsc/full-payload.ts +6 -0
- package/src/rsc/handler.ts +36 -12
- package/src/rsc/helpers.ts +13 -0
- package/src/rsc/loader-fetch.ts +2 -2
- package/src/rsc/manifest-init.ts +28 -9
- package/src/rsc/progressive-enhancement.ts +247 -70
- package/src/rsc/render-pipeline.ts +68 -24
- package/src/rsc/routine-plan.ts +359 -0
- package/src/rsc/rsc-rendering.ts +569 -302
- package/src/rsc/server-action.ts +180 -71
- package/src/rsc/shell-capture-constants.ts +18 -0
- package/src/rsc/shell-capture.ts +104 -21
- package/src/rsc/shell-serve.ts +15 -2
- package/src/rsc/ssr-setup.ts +10 -1
- package/src/rsc/types.ts +31 -2
- package/src/segment-system.tsx +83 -26
- package/src/server/context.ts +10 -0
- package/src/server/cookie-store.ts +19 -19
- package/src/server/handle-store.ts +185 -48
- package/src/server/request-context.ts +36 -6
- package/src/server.ts +7 -0
- package/src/ssr/index.tsx +37 -2
- package/src/ssr/ssr-root.tsx +30 -2
- package/src/testing/dom.entry.ts +1 -1
- package/src/testing/render-route.tsx +22 -8
- package/src/testing/run-loader.ts +51 -13
- package/src/types/boundaries.ts +19 -0
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +60 -5
- package/src/types/segments.ts +7 -0
- package/src/urls/include-helper.ts +22 -4
- package/src/urls/path-helper-types.ts +14 -1
- package/src/use-loader.tsx +67 -6
- package/src/vite/discovery/client-urls-projection.ts +322 -0
- package/src/vite/discovery/discover-routers.ts +43 -17
- package/src/vite/discovery/state.ts +11 -1
- package/src/vite/discovery/virtual-module-codegen.ts +20 -0
- package/src/vite/encryption-key.ts +29 -0
- package/src/vite/plugins/expose-action-id.ts +2 -2
- package/src/vite/plugins/expose-internal-ids.ts +46 -0
- package/src/vite/plugins/server-ref-hashing.ts +74 -0
- package/src/vite/plugins/server-reference-pattern.ts +10 -0
- package/src/vite/plugins/virtual-entries.ts +12 -3
- package/src/vite/rango.ts +9 -0
- package/src/vite/router-discovery.ts +184 -14
- package/src/vite/utils/shared-utils.ts +12 -7
- package/dist/types.backup/__internal.d.ts +0 -127
- package/dist/types.backup/bin/rango.d.ts +0 -1
- package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
- package/dist/types.backup/browser/action-fence.d.ts +0 -33
- package/dist/types.backup/browser/app-shell.d.ts +0 -34
- package/dist/types.backup/browser/app-version.d.ts +0 -6
- package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
- package/dist/types.backup/browser/cookie-name.d.ts +0 -66
- package/dist/types.backup/browser/event-controller.d.ts +0 -221
- package/dist/types.backup/browser/history-state.d.ts +0 -26
- package/dist/types.backup/browser/index.d.ts +0 -1
- package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
- package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
- package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
- package/dist/types.backup/browser/logging.d.ts +0 -33
- package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
- package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
- package/dist/types.backup/browser/navigation-client.d.ts +0 -17
- package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
- package/dist/types.backup/browser/navigation-store.d.ts +0 -95
- package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
- package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
- package/dist/types.backup/browser/partial-update.d.ts +0 -61
- package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
- package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
- package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
- package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
- package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
- package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
- package/dist/types.backup/browser/rango-state.d.ts +0 -52
- package/dist/types.backup/browser/react/Link.d.ts +0 -140
- package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
- package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
- package/dist/types.backup/browser/react/context.d.ts +0 -54
- package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
- package/dist/types.backup/browser/react/index.d.ts +0 -1
- package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
- package/dist/types.backup/browser/react/location-state.d.ts +0 -29
- package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
- package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
- package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
- package/dist/types.backup/browser/react/use-action.d.ts +0 -61
- package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
- package/dist/types.backup/browser/react/use-href.d.ts +0 -32
- package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
- package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
- package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
- package/dist/types.backup/browser/react/use-params.d.ts +0 -21
- package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
- package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
- package/dist/types.backup/browser/react/use-router.d.ts +0 -23
- package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
- package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
- package/dist/types.backup/browser/response-adapter.d.ts +0 -58
- package/dist/types.backup/browser/rsc-router.d.ts +0 -141
- package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
- package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
- package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
- package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
- package/dist/types.backup/browser/types.d.ts +0 -530
- package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
- package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
- package/dist/types.backup/build/generate-manifest.d.ts +0 -100
- package/dist/types.backup/build/generate-route-types.d.ts +0 -8
- package/dist/types.backup/build/index.d.ts +0 -21
- package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
- package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
- package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
- package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
- package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
- package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
- package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
- package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
- package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
- package/dist/types.backup/cache/background-task.d.ts +0 -21
- package/dist/types.backup/cache/cache-error.d.ts +0 -71
- package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
- package/dist/types.backup/cache/cache-policy.d.ts +0 -59
- package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
- package/dist/types.backup/cache/cache-scope.d.ts +0 -134
- package/dist/types.backup/cache/cache-tag.d.ts +0 -79
- package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
- package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
- package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
- package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
- package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
- package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
- package/dist/types.backup/cache/cf/index.d.ts +0 -3
- package/dist/types.backup/cache/document-cache.d.ts +0 -69
- package/dist/types.backup/cache/handle-capture.d.ts +0 -23
- package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
- package/dist/types.backup/cache/index.d.ts +0 -7
- package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
- package/dist/types.backup/cache/profile-registry.d.ts +0 -40
- package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
- package/dist/types.backup/cache/segment-codec.d.ts +0 -78
- package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
- package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
- package/dist/types.backup/cache/taint.d.ts +0 -71
- package/dist/types.backup/cache/types.d.ts +0 -407
- package/dist/types.backup/cache/vercel/index.d.ts +0 -1
- package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
- package/dist/types.backup/client.d.ts +0 -184
- package/dist/types.backup/client.rsc.d.ts +0 -39
- package/dist/types.backup/cloudflare/index.d.ts +0 -7
- package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
- package/dist/types.backup/component-utils.d.ts +0 -46
- package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
- package/dist/types.backup/context-var.d.ts +0 -84
- package/dist/types.backup/debug.d.ts +0 -57
- package/dist/types.backup/decode-loader-results.d.ts +0 -5
- package/dist/types.backup/default-error-boundary.d.ts +0 -10
- package/dist/types.backup/defer.d.ts +0 -89
- package/dist/types.backup/deps/browser.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
- package/dist/types.backup/deps/rsc.d.ts +0 -1
- package/dist/types.backup/deps/ssr.d.ts +0 -1
- package/dist/types.backup/encode-kv.d.ts +0 -35
- package/dist/types.backup/errors.d.ts +0 -226
- package/dist/types.backup/escape-script.d.ts +0 -44
- package/dist/types.backup/handle.d.ts +0 -93
- package/dist/types.backup/handles/MetaTags.d.ts +0 -17
- package/dist/types.backup/handles/Scripts.d.ts +0 -38
- package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
- package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
- package/dist/types.backup/handles/is-thenable.d.ts +0 -12
- package/dist/types.backup/handles/meta.d.ts +0 -43
- package/dist/types.backup/handles/script.d.ts +0 -139
- package/dist/types.backup/host/cookie-handler.d.ts +0 -8
- package/dist/types.backup/host/errors.d.ts +0 -40
- package/dist/types.backup/host/index.d.ts +0 -33
- package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
- package/dist/types.backup/host/router.d.ts +0 -12
- package/dist/types.backup/host/testing.d.ts +0 -41
- package/dist/types.backup/host/types.d.ts +0 -148
- package/dist/types.backup/host/utils.d.ts +0 -20
- package/dist/types.backup/href-client.d.ts +0 -214
- package/dist/types.backup/index.d.ts +0 -112
- package/dist/types.backup/index.rsc.d.ts +0 -51
- package/dist/types.backup/internal-debug.d.ts +0 -1
- package/dist/types.backup/loader-store.d.ts +0 -193
- package/dist/types.backup/loader.d.ts +0 -18
- package/dist/types.backup/loader.rsc.d.ts +0 -18
- package/dist/types.backup/missing-id-error.d.ts +0 -1
- package/dist/types.backup/outlet-context.d.ts +0 -12
- package/dist/types.backup/outlet-provider.d.ts +0 -12
- package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
- package/dist/types.backup/prerender/param-hash.d.ts +0 -6
- package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
- package/dist/types.backup/prerender/store.d.ts +0 -62
- package/dist/types.backup/prerender.d.ts +0 -292
- package/dist/types.backup/redirect-origin.d.ts +0 -55
- package/dist/types.backup/regex-escape.d.ts +0 -6
- package/dist/types.backup/render-error-thrower.d.ts +0 -13
- package/dist/types.backup/response-utils.d.ts +0 -35
- package/dist/types.backup/reverse.d.ts +0 -206
- package/dist/types.backup/root-error-boundary.d.ts +0 -32
- package/dist/types.backup/route-content-wrapper.d.ts +0 -40
- package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
- package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
- package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
- package/dist/types.backup/route-definition/index.d.ts +0 -7
- package/dist/types.backup/route-definition/redirect.d.ts +0 -48
- package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
- package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
- package/dist/types.backup/route-definition.d.ts +0 -1
- package/dist/types.backup/route-map-builder.d.ts +0 -127
- package/dist/types.backup/route-name.d.ts +0 -27
- package/dist/types.backup/route-types.d.ts +0 -172
- package/dist/types.backup/router/basename.d.ts +0 -10
- package/dist/types.backup/router/content-negotiation.d.ts +0 -91
- package/dist/types.backup/router/debug-manifest.d.ts +0 -7
- package/dist/types.backup/router/error-handling.d.ts +0 -76
- package/dist/types.backup/router/find-match.d.ts +0 -19
- package/dist/types.backup/router/handler-context.d.ts +0 -41
- package/dist/types.backup/router/instrument.d.ts +0 -161
- package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
- package/dist/types.backup/router/lazy-includes.d.ts +0 -26
- package/dist/types.backup/router/loader-resolution.d.ts +0 -63
- package/dist/types.backup/router/logging.d.ts +0 -41
- package/dist/types.backup/router/manifest.d.ts +0 -8
- package/dist/types.backup/router/match-api.d.ts +0 -19
- package/dist/types.backup/router/match-context.d.ts +0 -184
- package/dist/types.backup/router/match-handlers.d.ts +0 -49
- package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
- package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
- package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
- package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
- package/dist/types.backup/router/match-pipelines.d.ts +0 -103
- package/dist/types.backup/router/match-result.d.ts +0 -114
- package/dist/types.backup/router/metrics.d.ts +0 -6
- package/dist/types.backup/router/middleware-types.d.ts +0 -74
- package/dist/types.backup/router/middleware.d.ts +0 -116
- package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
- package/dist/types.backup/router/params-util.d.ts +0 -8
- package/dist/types.backup/router/parse-pattern.d.ts +0 -38
- package/dist/types.backup/router/pattern-matching.d.ts +0 -169
- package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
- package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
- package/dist/types.backup/router/prerender-match.d.ts +0 -50
- package/dist/types.backup/router/preview-match.d.ts +0 -22
- package/dist/types.backup/router/request-classification.d.ts +0 -104
- package/dist/types.backup/router/revalidation.d.ts +0 -57
- package/dist/types.backup/router/route-snapshot.d.ts +0 -112
- package/dist/types.backup/router/router-context.d.ts +0 -137
- package/dist/types.backup/router/router-interfaces.d.ts +0 -432
- package/dist/types.backup/router/router-options.d.ts +0 -738
- package/dist/types.backup/router/router-registry.d.ts +0 -15
- package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
- package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
- package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
- package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
- package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
- package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
- package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
- package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
- package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
- package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
- package/dist/types.backup/router/segment-resolution.d.ts +0 -3
- package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
- package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
- package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
- package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
- package/dist/types.backup/router/telemetry.d.ts +0 -215
- package/dist/types.backup/router/timeout.d.ts +0 -68
- package/dist/types.backup/router/tracing.d.ts +0 -125
- package/dist/types.backup/router/trie-matching.d.ts +0 -32
- package/dist/types.backup/router/types.d.ts +0 -98
- package/dist/types.backup/router/url-params.d.ts +0 -26
- package/dist/types.backup/router.d.ts +0 -7
- package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
- package/dist/types.backup/rsc/full-payload.d.ts +0 -22
- package/dist/types.backup/rsc/handler-context.d.ts +0 -31
- package/dist/types.backup/rsc/handler.d.ts +0 -9
- package/dist/types.backup/rsc/helpers.d.ts +0 -213
- package/dist/types.backup/rsc/index.d.ts +0 -17
- package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
- package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
- package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
- package/dist/types.backup/rsc/nonce.d.ts +0 -28
- package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
- package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
- package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
- package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
- package/dist/types.backup/rsc/response-error.d.ts +0 -19
- package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
- package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
- package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
- package/dist/types.backup/rsc/server-action.d.ts +0 -68
- package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
- package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
- package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
- package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
- package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
- package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
- package/dist/types.backup/rsc/types.d.ts +0 -290
- package/dist/types.backup/runtime-env.d.ts +0 -1
- package/dist/types.backup/search-params.d.ts +0 -125
- package/dist/types.backup/segment-content-promise.d.ts +0 -13
- package/dist/types.backup/segment-fragments.d.ts +0 -56
- package/dist/types.backup/segment-loader-promise.d.ts +0 -22
- package/dist/types.backup/segment-system.d.ts +0 -84
- package/dist/types.backup/serialize.d.ts +0 -164
- package/dist/types.backup/server/context.d.ts +0 -494
- package/dist/types.backup/server/cookie-parse.d.ts +0 -10
- package/dist/types.backup/server/cookie-store.d.ts +0 -107
- package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
- package/dist/types.backup/server/handle-store.d.ts +0 -100
- package/dist/types.backup/server/loader-registry.d.ts +0 -32
- package/dist/types.backup/server/request-context.d.ts +0 -596
- package/dist/types.backup/server/root-layout.d.ts +0 -3
- package/dist/types.backup/server.d.ts +0 -15
- package/dist/types.backup/ssr/index.d.ts +0 -233
- package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
- package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
- package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
- package/dist/types.backup/static-handler.d.ts +0 -57
- package/dist/types.backup/testing/cache-status.d.ts +0 -63
- package/dist/types.backup/testing/collect-handle.d.ts +0 -20
- package/dist/types.backup/testing/dispatch.d.ts +0 -123
- package/dist/types.backup/testing/dom.entry.d.ts +0 -15
- package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
- package/dist/types.backup/testing/e2e/index.d.ts +0 -30
- package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
- package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
- package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
- package/dist/types.backup/testing/e2e/server.d.ts +0 -35
- package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
- package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
- package/dist/types.backup/testing/flight-tree.d.ts +0 -192
- package/dist/types.backup/testing/flight.d.ts +0 -115
- package/dist/types.backup/testing/flight.entry.d.ts +0 -27
- package/dist/types.backup/testing/generated-routes.d.ts +0 -66
- package/dist/types.backup/testing/index.d.ts +0 -52
- package/dist/types.backup/testing/internal/context.d.ts +0 -225
- package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
- package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
- package/dist/types.backup/testing/render-handler.d.ts +0 -160
- package/dist/types.backup/testing/render-route.d.ts +0 -246
- package/dist/types.backup/testing/run-loader.d.ts +0 -186
- package/dist/types.backup/testing/run-middleware.d.ts +0 -132
- package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
- package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
- package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
- package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
- package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
- package/dist/types.backup/testing/vitest.d.ts +0 -205
- package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
- package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
- package/dist/types.backup/theme/constants.d.ts +0 -39
- package/dist/types.backup/theme/index.d.ts +0 -29
- package/dist/types.backup/theme/theme-context.d.ts +0 -21
- package/dist/types.backup/theme/theme-script.d.ts +0 -26
- package/dist/types.backup/theme/types.d.ts +0 -162
- package/dist/types.backup/theme/use-theme.d.ts +0 -8
- package/dist/types.backup/types/boundaries.d.ts +0 -93
- package/dist/types.backup/types/cache-types.d.ts +0 -191
- package/dist/types.backup/types/error-types.d.ts +0 -114
- package/dist/types.backup/types/global-namespace.d.ts +0 -90
- package/dist/types.backup/types/handler-context.d.ts +0 -658
- package/dist/types.backup/types/index.d.ts +0 -11
- package/dist/types.backup/types/loader-types.d.ts +0 -182
- package/dist/types.backup/types/request-scope.d.ts +0 -93
- package/dist/types.backup/types/route-config.d.ts +0 -105
- package/dist/types.backup/types/route-entry.d.ts +0 -95
- package/dist/types.backup/types/segments.d.ts +0 -234
- package/dist/types.backup/types.d.ts +0 -1
- package/dist/types.backup/urls/include-helper.d.ts +0 -17
- package/dist/types.backup/urls/include-provider.d.ts +0 -27
- package/dist/types.backup/urls/index.d.ts +0 -6
- package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
- package/dist/types.backup/urls/path-helper.d.ts +0 -12
- package/dist/types.backup/urls/pattern-types.d.ts +0 -166
- package/dist/types.backup/urls/response-types.d.ts +0 -67
- package/dist/types.backup/urls/type-extraction.d.ts +0 -157
- package/dist/types.backup/urls/urls-function.d.ts +0 -24
- package/dist/types.backup/urls.d.ts +0 -1
- package/dist/types.backup/use-loader.d.ts +0 -150
- package/dist/types.backup/vercel/index.d.ts +0 -10
- package/dist/types.backup/vercel/tracing.d.ts +0 -70
- package/dist/types.backup/vite/debug.d.ts +0 -80
- package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
- package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
- package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
- package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
- package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
- package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
- package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
- package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
- package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
- package/dist/types.backup/vite/discovery/state.d.ts +0 -162
- package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
- package/dist/types.backup/vite/index.d.ts +0 -11
- package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
- package/dist/types.backup/vite/plugin-types.d.ts +0 -298
- package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
- package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
- package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
- package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
- package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
- package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
- package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
- package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
- package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
- package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
- package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
- package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
- package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
- package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
- package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
- package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
- package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
- package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
- package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
- package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
- package/dist/types.backup/vite/rango.d.ts +0 -29
- package/dist/types.backup/vite/router-discovery.d.ts +0 -23
- package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
- package/dist/types.backup/vite/utils/banner.d.ts +0 -2
- package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
- package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
- package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
- package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
- package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
- package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
- package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
- package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { ScanFilter } from "../../build/generate-route-types.js";
|
|
10
|
+
import type { ClientUrlProjection } from "../../client-urls/server-projection.js";
|
|
10
11
|
|
|
11
12
|
export const VIRTUAL_ROUTES_MANIFEST_ID = "virtual:rsc-router/routes-manifest";
|
|
12
13
|
|
|
@@ -79,6 +80,11 @@ export interface ShellPrerenderCandidate {
|
|
|
79
80
|
| { ttl?: number; swr?: number; tags?: string[]; captureTimeout?: number };
|
|
80
81
|
}
|
|
81
82
|
|
|
83
|
+
export interface ClientUrlDiscoveryState {
|
|
84
|
+
clientUrlSourceByReferenceId: Map<string, string>;
|
|
85
|
+
clientUrlProjectionMap: Map<string, ClientUrlProjection>;
|
|
86
|
+
}
|
|
87
|
+
|
|
82
88
|
export interface DiscoveryState {
|
|
83
89
|
resolvedEntryPath: string | undefined;
|
|
84
90
|
projectRoot: string;
|
|
@@ -109,6 +115,8 @@ export interface DiscoveryState {
|
|
|
109
115
|
perRouterTrieMap: Map<string, any>;
|
|
110
116
|
perRouterPrecomputedMap: Map<string, PrecomputedEntry[]>;
|
|
111
117
|
perRouterManifestDataMap: Map<string, Record<string, string>>;
|
|
118
|
+
clientUrlSourceByReferenceId?: Map<string, string>;
|
|
119
|
+
clientUrlProjectionMap?: Map<string, ClientUrlProjection>;
|
|
112
120
|
|
|
113
121
|
prerenderManifestEntries: Record<string, string> | null;
|
|
114
122
|
staticManifestEntries: Record<string, string> | null;
|
|
@@ -164,7 +172,7 @@ export interface DiscoveryState {
|
|
|
164
172
|
export function createDiscoveryState(
|
|
165
173
|
entryPath: string | undefined,
|
|
166
174
|
opts: PluginOptions | undefined,
|
|
167
|
-
): DiscoveryState {
|
|
175
|
+
): DiscoveryState & ClientUrlDiscoveryState {
|
|
168
176
|
return {
|
|
169
177
|
resolvedEntryPath: entryPath,
|
|
170
178
|
projectRoot: "",
|
|
@@ -182,6 +190,8 @@ export function createDiscoveryState(
|
|
|
182
190
|
perRouterTrieMap: new Map(),
|
|
183
191
|
perRouterPrecomputedMap: new Map(),
|
|
184
192
|
perRouterManifestDataMap: new Map(),
|
|
193
|
+
clientUrlSourceByReferenceId: new Map(),
|
|
194
|
+
clientUrlProjectionMap: new Map(),
|
|
185
195
|
|
|
186
196
|
prerenderManifestEntries: null,
|
|
187
197
|
staticManifestEntries: null,
|
|
@@ -44,6 +44,7 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
44
44
|
const hasManifest =
|
|
45
45
|
state.mergedRouteManifest &&
|
|
46
46
|
Object.keys(state.mergedRouteManifest).length > 0;
|
|
47
|
+
const hasClientUrlModules = Boolean(state.clientUrlSourceByReferenceId?.size);
|
|
47
48
|
|
|
48
49
|
if (hasManifest) {
|
|
49
50
|
// Build gen file import statements for each router with a sourceFile.
|
|
@@ -83,6 +84,9 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
83
84
|
"setRouterManifest",
|
|
84
85
|
...(state.isBuildMode ? ["registerRouterManifestLoader"] : []),
|
|
85
86
|
"clearAllRouterData",
|
|
87
|
+
...(hasClientUrlModules
|
|
88
|
+
? ["clearClientUrlProjections", "setClientUrlProjection"]
|
|
89
|
+
: []),
|
|
86
90
|
];
|
|
87
91
|
const lines = [
|
|
88
92
|
`import { ${serverImports.join(", ")} } from "@rangojs/router/server";`,
|
|
@@ -95,6 +99,16 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
95
99
|
`clearAllRouterData();`,
|
|
96
100
|
];
|
|
97
101
|
|
|
102
|
+
if (hasClientUrlModules) {
|
|
103
|
+
lines.push(`clearClientUrlProjections();`);
|
|
104
|
+
for (const [referenceId, projection] of state.clientUrlProjectionMap ??
|
|
105
|
+
[]) {
|
|
106
|
+
lines.push(
|
|
107
|
+
`setClientUrlProjection(${JSON.stringify(referenceId)}, ${jsonParseExpression(projection)});`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
98
112
|
if (varIdx > 0) {
|
|
99
113
|
lines.push(
|
|
100
114
|
`function __flat(r) { const o = {}; for (const [k, v] of Object.entries(r)) o[k] = typeof v === "string" ? v : v.path; return o; }`,
|
|
@@ -169,6 +183,12 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
169
183
|
}
|
|
170
184
|
|
|
171
185
|
const lines: string[] = [];
|
|
186
|
+
if (hasClientUrlModules) {
|
|
187
|
+
lines.push(
|
|
188
|
+
`import { clearClientUrlProjections } from "@rangojs/router/server";`,
|
|
189
|
+
`clearClientUrlProjections();`,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
172
192
|
if (!state.isBuildMode) {
|
|
173
193
|
const origin =
|
|
174
194
|
state.devServerOrigin ||
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
// plugin-rsc encrypts inline-action bound args with a key read from
|
|
4
|
+
// `virtual:vite-rsc/encryption-key`, which defaults to a fresh random key PER
|
|
5
|
+
// plugin instance. The build-discovery temp server (which renders Static/
|
|
6
|
+
// Prerender output) is a separate plugin instance from the main build, so by
|
|
7
|
+
// default it encrypts prerendered bound args with a key the runtime never has --
|
|
8
|
+
// `decryptActionBoundArgs` then fails on invocation. We hand both the SAME key
|
|
9
|
+
// via plugin-rsc's `defineEncryptionKey` so build-time-encrypted bound args
|
|
10
|
+
// decrypt at runtime.
|
|
11
|
+
//
|
|
12
|
+
// Cached per process so the temp server (created during the main build's
|
|
13
|
+
// buildStart) and the main build share one key. Overridable via
|
|
14
|
+
// RANGO_ENCRYPTION_KEY for a stable key across builds/deploys; otherwise a fresh
|
|
15
|
+
// key is generated per build (matching plugin-rsc's default posture, where the
|
|
16
|
+
// key is emitted into the build output regardless).
|
|
17
|
+
let cachedKey: string | undefined;
|
|
18
|
+
|
|
19
|
+
export function buildEncryptionKey(): string {
|
|
20
|
+
cachedKey ??=
|
|
21
|
+
process.env.RANGO_ENCRYPTION_KEY ?? randomBytes(32).toString("base64");
|
|
22
|
+
return cachedKey;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// The value plugin-rsc inlines as `export default () => (<expr>)`. A JSON string
|
|
26
|
+
// literal, so the emitted runtime key module is a plain base64 string.
|
|
27
|
+
export function defineEncryptionKeyExpr(): string {
|
|
28
|
+
return JSON.stringify(buildEncryptionKey());
|
|
29
|
+
}
|
|
@@ -3,6 +3,7 @@ import MagicString from "magic-string";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import { normalizePath } from "./expose-id-utils.js";
|
|
6
|
+
import { registerServerReferenceRegex } from "./server-reference-pattern.js";
|
|
6
7
|
import { createRangoDebugger, createCounter, NS } from "../debug.js";
|
|
7
8
|
|
|
8
9
|
const debug = createRangoDebugger(NS.transform);
|
|
@@ -133,8 +134,7 @@ function applyRegisterReferenceWrapping(
|
|
|
133
134
|
return false;
|
|
134
135
|
}
|
|
135
136
|
|
|
136
|
-
const pattern =
|
|
137
|
-
/registerServerReference\(([^,]+),\s*"([^"]+)",\s*"([^"]+)"\)/g;
|
|
137
|
+
const pattern = registerServerReferenceRegex();
|
|
138
138
|
|
|
139
139
|
let hasChanges = false;
|
|
140
140
|
let match: RegExpExecArray | null;
|
|
@@ -68,6 +68,52 @@ const VIRTUAL_HANDLER_PREFIX = "virtual:handler-extract:";
|
|
|
68
68
|
// Consolidated plugin
|
|
69
69
|
// ---------------------------------------------------------------------------
|
|
70
70
|
|
|
71
|
+
interface RscScanPluginApi {
|
|
72
|
+
manager?: { isScanBuild?: boolean };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Stub export-only loader modules before plugin-rsc reduces scan modules to
|
|
77
|
+
* imports. The regular post transform remains authoritative outside scan builds.
|
|
78
|
+
*
|
|
79
|
+
* Handles and location-state definitions are intentionally excluded: handle
|
|
80
|
+
* collect functions run in the browser, and location-state definitions are
|
|
81
|
+
* callable browser objects. Their dependencies must remain visible to non-RSC
|
|
82
|
+
* validation rather than being hidden behind an opaque scan stub.
|
|
83
|
+
*/
|
|
84
|
+
export function createLoaderScanStubPlugin(): Plugin {
|
|
85
|
+
let projectRoot = "";
|
|
86
|
+
let rscApi: RscScanPluginApi | undefined;
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
name: "@rangojs/router:loader-scan-stubs",
|
|
90
|
+
apply: "build",
|
|
91
|
+
configResolved(config) {
|
|
92
|
+
projectRoot = config.root;
|
|
93
|
+
rscApi = config.plugins.find((plugin) => plugin.name === "rsc:minimal")
|
|
94
|
+
?.api as RscScanPluginApi | undefined;
|
|
95
|
+
},
|
|
96
|
+
transform(code, id) {
|
|
97
|
+
if (
|
|
98
|
+
!rscApi?.manager?.isScanBuild ||
|
|
99
|
+
this.environment?.name === "rsc" ||
|
|
100
|
+
id.includes("/node_modules/") ||
|
|
101
|
+
!code.includes("createLoader") ||
|
|
102
|
+
!hasCreateLoaderImport(code)
|
|
103
|
+
) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const fnNames = getImportedFnNames(code, "createLoader");
|
|
108
|
+
const bindings = collectCreateExportBindings(code, fnNames);
|
|
109
|
+
const filePath = normalizePath(path.relative(projectRoot, id));
|
|
110
|
+
return (
|
|
111
|
+
generateClientLoaderStubs(bindings, code, filePath, true) ?? undefined
|
|
112
|
+
);
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
71
117
|
export function exposeInternalIds(options?: { forceBuild?: boolean }): Plugin {
|
|
72
118
|
let config: ResolvedConfig;
|
|
73
119
|
let isBuild = false;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
import { createRangoDebugger, createCounter, NS } from "../debug.js";
|
|
3
|
+
import { computeProductionHash } from "./client-ref-hashing.js";
|
|
4
|
+
import { registerServerReferenceRegex } from "./server-reference-pattern.js";
|
|
5
|
+
|
|
6
|
+
const debug = createRangoDebugger(NS.transform);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Replace dev-style server-reference ids with their production hashes. The temp
|
|
10
|
+
* server renders Static/Prerender in a dev/serve Vite server, so plugin-rsc mints
|
|
11
|
+
* a dev-style id (e.g. "/src/urls/prerender.tsx"); rewriting only the id (group 2)
|
|
12
|
+
* leaves the hoisted function and its trailing encrypted .bind(...) untouched.
|
|
13
|
+
* Exported for testing; used by hashServerRefs. Returns null if nothing changed.
|
|
14
|
+
*/
|
|
15
|
+
export function transformServerRefs(
|
|
16
|
+
code: string,
|
|
17
|
+
projectRoot: string,
|
|
18
|
+
): string | null {
|
|
19
|
+
if (!code.includes("registerServerReference")) return null;
|
|
20
|
+
|
|
21
|
+
let hasReplacement = false;
|
|
22
|
+
const result = code.replace(
|
|
23
|
+
registerServerReferenceRegex(),
|
|
24
|
+
(match, _value: string, refKey: string) => {
|
|
25
|
+
// The temp server is not a long-lived HMR server, so ids are bare; strip a
|
|
26
|
+
// query suffix defensively so the hash matches plugin-rsc's manifest key.
|
|
27
|
+
const cleanKey = refKey.split("?")[0]!;
|
|
28
|
+
const hash = computeProductionHash(projectRoot, cleanKey);
|
|
29
|
+
if (hash === cleanKey) return match;
|
|
30
|
+
hasReplacement = true;
|
|
31
|
+
return match.replace(`"${refKey}"`, `"${hash}"`);
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return hasReplacement ? result : null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Server-side analog of hashClientRefs. Runs in the build-discovery temp server
|
|
40
|
+
* (a dev/serve Vite server, where plugin-rsc mints dev-style ids), rewriting
|
|
41
|
+
* registerServerReference ids to production hashes AFTER plugin-rsc's
|
|
42
|
+
* rsc:use-server transform (enforce:"post"), so the Flight serializer bakes the
|
|
43
|
+
* production hash into the stored prerender/static payloads.
|
|
44
|
+
*
|
|
45
|
+
* Without this, a server-created action embedded in a prerendered/static Flight
|
|
46
|
+
* is stored with a dev-style id that the production hash-keyed server-references
|
|
47
|
+
* manifest cannot resolve -> "server reference not found" on a build-time-cache
|
|
48
|
+
* hit. Mirrors hashClientRefs, which already does exactly this for the client
|
|
49
|
+
* half of the same payload (which is why client refs in stored Flight are
|
|
50
|
+
* already production hashes while server refs were not).
|
|
51
|
+
*/
|
|
52
|
+
export function hashServerRefs(projectRoot: string): Plugin {
|
|
53
|
+
const counter = createCounter(debug, "hash-server-refs");
|
|
54
|
+
return {
|
|
55
|
+
name: "@rangojs/router:hash-server-refs",
|
|
56
|
+
enforce: "post",
|
|
57
|
+
applyToEnvironment(env) {
|
|
58
|
+
return env.name === "rsc";
|
|
59
|
+
},
|
|
60
|
+
buildEnd() {
|
|
61
|
+
counter?.flush();
|
|
62
|
+
},
|
|
63
|
+
transform(code, id) {
|
|
64
|
+
const start = counter ? performance.now() : 0;
|
|
65
|
+
try {
|
|
66
|
+
const result = transformServerRefs(code, projectRoot);
|
|
67
|
+
if (result === null) return;
|
|
68
|
+
return { code: result, map: null };
|
|
69
|
+
} finally {
|
|
70
|
+
counter?.record(id, performance.now() - start);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// plugin-rsc's rsc:use-server transform emits inline/exported server references
|
|
2
|
+
// as `registerServerReference(<value>, "<id>", "<name>")`, where <value> is a
|
|
3
|
+
// hoisted identifier (no top-level comma) and a trailing `.bind(null,
|
|
4
|
+
// encryptActionBoundArgs(...))` lies OUTSIDE the call. Two plugins parse this
|
|
5
|
+
// same shape -- expose-action-id ($id wrapping) and server-ref-hashing (id ->
|
|
6
|
+
// production hash) -- so the pattern has a single owner here. Returns a fresh
|
|
7
|
+
// /g RegExp per call to avoid sharing lastIndex state across callers.
|
|
8
|
+
export function registerServerReferenceRegex(): RegExp {
|
|
9
|
+
return /registerServerReference\(([^,]+),\s*"([^"]+)",\s*"([^"]+)"\)/g;
|
|
10
|
+
}
|
|
@@ -154,14 +154,23 @@ import {
|
|
|
154
154
|
decodeAction,
|
|
155
155
|
decodeFormState,
|
|
156
156
|
} from "@rangojs/router/internal/deps/rsc";
|
|
157
|
-
import { router } from "${routerPath}";
|
|
158
|
-
import { createRSCHandler } from "@rangojs/router/internal/rsc-handler";
|
|
159
|
-
import { VERSION } from "@rangojs/router:version";
|
|
160
157
|
|
|
161
158
|
// Startup bootstrap imports (routes + loader manifests). See
|
|
162
159
|
// RSC_ENTRY_BOOTSTRAP_IMPORTS — the same list the custom-entry injector uses.
|
|
160
|
+
//
|
|
161
|
+
// ORDER IS LOAD-BEARING: the bootstrap imports MUST precede the router import.
|
|
162
|
+
// The routes-manifest module installs client URL projections
|
|
163
|
+
// (setClientUrlProjection), and createRouter().routes(clientUrlsReference)
|
|
164
|
+
// consults them at router-module evaluation. Router-first would silently push
|
|
165
|
+
// every clientUrls() app onto the deferred-subscription path and change mount
|
|
166
|
+
// registration order with no error. The custom-entry injector keeps the same
|
|
167
|
+
// guarantee by PREPENDING this list at file top (version-injector.ts).
|
|
163
168
|
${bootstrapImports}
|
|
164
169
|
|
|
170
|
+
import { router } from "${routerPath}";
|
|
171
|
+
import { createRSCHandler } from "@rangojs/router/internal/rsc-handler";
|
|
172
|
+
import { VERSION } from "@rangojs/router:version";
|
|
173
|
+
|
|
165
174
|
// Lazily create the handler on first request so that ESM live bindings
|
|
166
175
|
// have resolved by the time we read \`router\`. During HMR the module may
|
|
167
176
|
// re-evaluate before router.tsx finishes, leaving the import undefined.
|
package/src/vite/rango.ts
CHANGED
|
@@ -2,7 +2,9 @@ import { type PluginOption } from "vite";
|
|
|
2
2
|
import { readFileSync, existsSync } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { exposeActionId } from "./plugins/expose-action-id.js";
|
|
5
|
+
import { defineEncryptionKeyExpr } from "./encryption-key.js";
|
|
5
6
|
import {
|
|
7
|
+
createLoaderScanStubPlugin,
|
|
6
8
|
exposeInternalIds,
|
|
7
9
|
exposeRouterId,
|
|
8
10
|
} from "./plugins/expose-internal-ids.js";
|
|
@@ -275,6 +277,9 @@ export async function rango(options?: RangoOptions): Promise<PluginOption[]> {
|
|
|
275
277
|
entries: finalEntries,
|
|
276
278
|
serverHandler: false,
|
|
277
279
|
clientChunks,
|
|
280
|
+
// Share one encryption key with the build-discovery temp server so
|
|
281
|
+
// build-time prerender/static inline-action bound args decrypt at runtime.
|
|
282
|
+
defineEncryptionKey: defineEncryptionKeyExpr(),
|
|
278
283
|
}) as PluginOption,
|
|
279
284
|
);
|
|
280
285
|
plugins.push(clientRefDedup());
|
|
@@ -521,6 +526,9 @@ export async function rango(options?: RangoOptions): Promise<PluginOption[]> {
|
|
|
521
526
|
rsc({
|
|
522
527
|
entries: finalEntries,
|
|
523
528
|
clientChunks,
|
|
529
|
+
// Share one encryption key with the build-discovery temp server so
|
|
530
|
+
// build-time prerender/static inline-action bound args decrypt at runtime.
|
|
531
|
+
defineEncryptionKey: defineEncryptionKeyExpr(),
|
|
524
532
|
}) as PluginOption,
|
|
525
533
|
);
|
|
526
534
|
plugins.push(clientRefDedup());
|
|
@@ -551,6 +559,7 @@ export async function rango(options?: RangoOptions): Promise<PluginOption[]> {
|
|
|
551
559
|
},
|
|
552
560
|
});
|
|
553
561
|
|
|
562
|
+
plugins.push(createLoaderScanStubPlugin());
|
|
554
563
|
plugins.push(exposeActionId());
|
|
555
564
|
plugins.push(useCacheTransform());
|
|
556
565
|
plugins.push(exposeInternalIds());
|
|
@@ -45,6 +45,8 @@ import {
|
|
|
45
45
|
exposeRouterId,
|
|
46
46
|
} from "./plugins/expose-internal-ids.js";
|
|
47
47
|
import { hashClientRefs } from "./plugins/client-ref-hashing.js";
|
|
48
|
+
import { hashServerRefs } from "./plugins/server-ref-hashing.js";
|
|
49
|
+
import { defineEncryptionKeyExpr } from "./encryption-key.js";
|
|
48
50
|
import { extractHandlerExportsFromChunk } from "./utils/bundle-analysis.js";
|
|
49
51
|
import {
|
|
50
52
|
createDiscoveryState,
|
|
@@ -57,6 +59,10 @@ import {
|
|
|
57
59
|
peekSelfGenWrite,
|
|
58
60
|
} from "./discovery/self-gen-tracking.js";
|
|
59
61
|
import { discoverRouters } from "./discovery/discover-routers.js";
|
|
62
|
+
import {
|
|
63
|
+
recordClientUrlsModule,
|
|
64
|
+
refreshRecordedClientUrlProjections,
|
|
65
|
+
} from "./discovery/client-urls-projection.js";
|
|
60
66
|
import { runShellPrerenderPhase } from "./discovery/shell-prerender-phase.js";
|
|
61
67
|
import { describeDiscoveryFailure } from "./discovery/discovery-errors.js";
|
|
62
68
|
import {
|
|
@@ -224,9 +230,26 @@ async function createTempRscServer(
|
|
|
224
230
|
ssr: "virtual:entry-ssr",
|
|
225
231
|
rsc: state.resolvedEntryPath!,
|
|
226
232
|
},
|
|
233
|
+
// The temp server renders Static/Prerender output and encrypts inline-
|
|
234
|
+
// action bound args. Give it the SAME key as the main build/dev runtime
|
|
235
|
+
// (defineEncryptionKeyExpr is process-cached) so those args decrypt at
|
|
236
|
+
// invocation. Unconditional, NOT build-only: under Cloudflare/workerd dev
|
|
237
|
+
// the RSC env has no module runner, so prerender is rendered by THIS temp
|
|
238
|
+
// server (via /__rsc_prerender), and the action decrypts in the main
|
|
239
|
+
// runtime with the rango.ts key -- gating on forceBuild left dev encrypting
|
|
240
|
+
// with the temp server's own random key, failing decryptActionBoundArgs.
|
|
241
|
+
// (hashServerRefs stays build-only: dev keeps dev-style ids the dev runtime
|
|
242
|
+
// resolves directly.)
|
|
243
|
+
defineEncryptionKey: defineEncryptionKeyExpr(),
|
|
227
244
|
}),
|
|
228
|
-
// hashClientRefs only in build mode — production bundles
|
|
229
|
-
|
|
245
|
+
// hashClientRefs/hashServerRefs only in build mode — production bundles
|
|
246
|
+
// need hashed refs. hashServerRefs is the server-side analog: it rewrites
|
|
247
|
+
// registerServerReference dev-style ids to production hashes so a
|
|
248
|
+
// server-created action embedded in prerendered/static Flight resolves
|
|
249
|
+
// against the production manifest on a build-time-cache hit.
|
|
250
|
+
...(options.forceBuild
|
|
251
|
+
? [hashClientRefs(state.projectRoot), hashServerRefs(state.projectRoot)]
|
|
252
|
+
: []),
|
|
230
253
|
createVersionPlugin(),
|
|
231
254
|
// Before the stub plugin, so "virtual:entry-ssr" resolves to the real
|
|
232
255
|
// SSR entry when the shell endpoint needs it (see the option doc).
|
|
@@ -254,6 +277,13 @@ async function createTempRscServer(
|
|
|
254
277
|
// runtime. forceBuild produces hashed IDs for production bundle consistency.
|
|
255
278
|
exposeInternalIds(options.forceBuild ? { forceBuild: true } : undefined),
|
|
256
279
|
exposeRouterId(),
|
|
280
|
+
{
|
|
281
|
+
name: "@rangojs/router:client-urls-source-tracking",
|
|
282
|
+
enforce: "pre",
|
|
283
|
+
transform(code, id) {
|
|
284
|
+
recordClientUrlsModule(state, code, id);
|
|
285
|
+
},
|
|
286
|
+
},
|
|
257
287
|
// Forwarded user resolution plugins (e.g. vite-tsconfig-paths). Stripped
|
|
258
288
|
// to resolveId/load and placed last so framework resolution runs first;
|
|
259
289
|
// Vite re-sorts by `enforce`, so `enforce: "pre"` resolvers still lead.
|
|
@@ -408,8 +438,12 @@ export function createRouterDiscoveryPlugin(
|
|
|
408
438
|
// internal-debug module so FE debug no longer depends on Vite delivering the
|
|
409
439
|
// `__RANGO_DEBUG__` define to the client (which it does only as an injected
|
|
410
440
|
// global whose presence varies across consumer setups). Runs in dev and build.
|
|
411
|
-
transform
|
|
412
|
-
|
|
441
|
+
transform: {
|
|
442
|
+
order: "pre",
|
|
443
|
+
handler(code, id) {
|
|
444
|
+
recordClientUrlsModule(s, code, id);
|
|
445
|
+
return injectClientDebugFlag(id);
|
|
446
|
+
},
|
|
413
447
|
},
|
|
414
448
|
|
|
415
449
|
configResolved(config) {
|
|
@@ -861,7 +895,11 @@ export function createRouterDiscoveryPlugin(
|
|
|
861
895
|
optimizerHashBefore =
|
|
862
896
|
tempRscEnv.depsOptimizer?.metadata?.browserHash;
|
|
863
897
|
await timed(debugDiscovery, "discoverRouters (cloudflare)", () =>
|
|
864
|
-
discoverRouters(
|
|
898
|
+
discoverRouters(
|
|
899
|
+
s,
|
|
900
|
+
tempRscEnv,
|
|
901
|
+
(prerenderTempServer?.environments as any)?.ssr,
|
|
902
|
+
),
|
|
865
903
|
);
|
|
866
904
|
timedSync(debugDiscovery, "writeRouteTypesFiles", () =>
|
|
867
905
|
writeRouteTypesFiles(s),
|
|
@@ -916,7 +954,7 @@ export function createRouterDiscoveryPlugin(
|
|
|
916
954
|
// requests during discovery on the Node path, so arming
|
|
917
955
|
// manifestReadyPromise after discovery is sufficient here.
|
|
918
956
|
const serverMod = await timed(debugDiscovery, "discoverRouters", () =>
|
|
919
|
-
discoverRouters(s, rscEnv),
|
|
957
|
+
discoverRouters(s, rscEnv, (server.environments as any)?.ssr),
|
|
920
958
|
);
|
|
921
959
|
if (serverMod?.setManifestReadyPromise) {
|
|
922
960
|
serverMod.setManifestReadyPromise(discoveryPromise);
|
|
@@ -1533,7 +1571,7 @@ export function createRouterDiscoveryPlugin(
|
|
|
1533
1571
|
try {
|
|
1534
1572
|
if (hasMainRunner) {
|
|
1535
1573
|
await timed(debugDiscovery, "hmr discoverRouters", () =>
|
|
1536
|
-
discoverRouters(s, rscEnv),
|
|
1574
|
+
discoverRouters(s, rscEnv, (server.environments as any)?.ssr),
|
|
1537
1575
|
);
|
|
1538
1576
|
timedSync(debugDiscovery, "hmr writeRouteTypesFiles", () =>
|
|
1539
1577
|
writeRouteTypesFiles(s),
|
|
@@ -1560,7 +1598,12 @@ export function createRouterDiscoveryPlugin(
|
|
|
1560
1598
|
await timed(
|
|
1561
1599
|
debugDiscovery,
|
|
1562
1600
|
"hmr discoverRouters (cloudflare)",
|
|
1563
|
-
() =>
|
|
1601
|
+
() =>
|
|
1602
|
+
discoverRouters(
|
|
1603
|
+
s,
|
|
1604
|
+
tempRscEnv,
|
|
1605
|
+
(prerenderTempServer?.environments as any)?.ssr,
|
|
1606
|
+
),
|
|
1564
1607
|
);
|
|
1565
1608
|
timedSync(debugDiscovery, "hmr writeRouteTypesFiles", () =>
|
|
1566
1609
|
writeRouteTypesFiles(s),
|
|
@@ -1705,12 +1748,54 @@ export function createRouterDiscoveryPlugin(
|
|
|
1705
1748
|
|
|
1706
1749
|
const scheduleRouteRegeneration = () => {
|
|
1707
1750
|
clearTimeout(routeChangeTimer);
|
|
1708
|
-
routeChangeTimer = setTimeout(() => {
|
|
1751
|
+
routeChangeTimer = setTimeout(async () => {
|
|
1709
1752
|
routeChangeTimer = undefined;
|
|
1710
1753
|
const regenStart = debugDiscovery ? performance.now() : 0;
|
|
1711
1754
|
const rscEnv = (server.environments as any)?.rsc;
|
|
1712
1755
|
const skipStaticWrite =
|
|
1713
1756
|
!rscEnv?.runner && s.perRouterManifests.length > 0;
|
|
1757
|
+
// Refresh clientUrls projections + state BEFORE any gen-file
|
|
1758
|
+
// write below: the write invalidates the routes-manifest virtual
|
|
1759
|
+
// module, whose regenerated code replays state.clientUrlProjectionMap
|
|
1760
|
+
// (clear + set). A stale map at that moment bakes stale literals
|
|
1761
|
+
// that clobber the runtime registry before the re-discovery entry
|
|
1762
|
+
// import materializes the client mount (node HMR served old
|
|
1763
|
+
// client-urls patterns until restart). Lenient: import failures
|
|
1764
|
+
// keep last-known state; discoverRouters' strict pass reports.
|
|
1765
|
+
if (rscEnv?.runner && s.clientUrlSourceByReferenceId?.size) {
|
|
1766
|
+
try {
|
|
1767
|
+
const serverMod = await rscEnv.runner.import(
|
|
1768
|
+
"@rangojs/router/server",
|
|
1769
|
+
);
|
|
1770
|
+
await refreshRecordedClientUrlProjections(
|
|
1771
|
+
s,
|
|
1772
|
+
(server.environments as any)?.ssr,
|
|
1773
|
+
serverMod,
|
|
1774
|
+
);
|
|
1775
|
+
// Force the routes-manifest virtual module to re-transform:
|
|
1776
|
+
// its generated code REPLAYS projections (clear + set) on
|
|
1777
|
+
// every rsc program reload, and self-gen-write suppression
|
|
1778
|
+
// keeps its cached transform alive through this cycle — a
|
|
1779
|
+
// stale replay after propagateDiscoveryState would clobber
|
|
1780
|
+
// the refreshed registry as the realm's last write and the
|
|
1781
|
+
// next router evaluation would materialize the old mount.
|
|
1782
|
+
for (const virtualId of [
|
|
1783
|
+
VIRTUAL_ROUTES_MANIFEST_ID,
|
|
1784
|
+
`\0${VIRTUAL_ROUTES_MANIFEST_ID}`,
|
|
1785
|
+
]) {
|
|
1786
|
+
const virtualMod =
|
|
1787
|
+
rscEnv.moduleGraph?.getModuleById?.(virtualId);
|
|
1788
|
+
if (virtualMod) {
|
|
1789
|
+
rscEnv.moduleGraph.invalidateModule(virtualMod);
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
} catch (err: any) {
|
|
1793
|
+
debugDiscovery?.(
|
|
1794
|
+
"watcher: clientUrls projection pre-refresh failed: %s",
|
|
1795
|
+
err?.message,
|
|
1796
|
+
);
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1714
1799
|
try {
|
|
1715
1800
|
// In cloudflare dev with a populated runtime manifest, the
|
|
1716
1801
|
// static parser produces a strictly smaller (and actively
|
|
@@ -1799,7 +1884,19 @@ export function createRouterDiscoveryPlugin(
|
|
|
1799
1884
|
const isUseClient =
|
|
1800
1885
|
trimmed.startsWith('"use client"') ||
|
|
1801
1886
|
trimmed.startsWith("'use client'");
|
|
1802
|
-
|
|
1887
|
+
// clientUrls() modules are "use client" by contract yet define
|
|
1888
|
+
// routes: their edits must re-run discovery (server projection +
|
|
1889
|
+
// generated types), so only bail on use-client files WITHOUT a
|
|
1890
|
+
// clientUrls() definition. Scar: before this carve-out, editing a
|
|
1891
|
+
// clientUrls module's route shape in dev left the serving router on
|
|
1892
|
+
// the stale projection — the old pattern kept matching and the new
|
|
1893
|
+
// one 404ed until a full restart.
|
|
1894
|
+
let hasClientUrls = source.includes("clientUrls(");
|
|
1895
|
+
if (hasClientUrls) {
|
|
1896
|
+
hasClientUrls =
|
|
1897
|
+
firstCodeMatchIndex(source, /\bclientUrls\(/g) >= 0;
|
|
1898
|
+
}
|
|
1899
|
+
if (!inRecoveryMode && isUseClient && !hasClientUrls) return;
|
|
1803
1900
|
// Cheap raw pre-check first; only when a candidate token is present
|
|
1804
1901
|
// do we confirm it occurs in real code (not a comment/string) via a
|
|
1805
1902
|
// single allocation-free code-region scan. Most saved files contain
|
|
@@ -1813,24 +1910,97 @@ export function createRouterDiscoveryPlugin(
|
|
|
1813
1910
|
hasCreateRouter =
|
|
1814
1911
|
firstCodeMatchIndex(source, /\bcreateRouter\s*[<(]/g) >= 0;
|
|
1815
1912
|
}
|
|
1816
|
-
|
|
1913
|
+
// hasClientUrls counts here too: in a clientUrls() module the only
|
|
1914
|
+
// `urls(` token sits INSIDE the `clientUrls(` identifier, which the
|
|
1915
|
+
// code scan correctly rejects as a sub-identifier match — so
|
|
1916
|
+
// without this the file would silently fail the sniff.
|
|
1917
|
+
if (
|
|
1918
|
+
!inRecoveryMode &&
|
|
1919
|
+
!hasUrls &&
|
|
1920
|
+
!hasCreateRouter &&
|
|
1921
|
+
!hasClientUrls
|
|
1922
|
+
) {
|
|
1923
|
+
return;
|
|
1924
|
+
}
|
|
1817
1925
|
if (inRecoveryMode) {
|
|
1818
1926
|
debugDiscovery?.(
|
|
1819
|
-
"watcher: recovery rediscovery for %s (urls=%s, router=%s, useClient=%s) [LASTERR %s]",
|
|
1927
|
+
"watcher: recovery rediscovery for %s (urls=%s, router=%s, clientUrls=%s, useClient=%s) [LASTERR %s]",
|
|
1820
1928
|
filePath,
|
|
1821
1929
|
hasUrls,
|
|
1822
1930
|
hasCreateRouter,
|
|
1931
|
+
hasClientUrls,
|
|
1823
1932
|
isUseClient,
|
|
1824
1933
|
s.lastDiscoveryError!.message,
|
|
1825
1934
|
);
|
|
1826
1935
|
} else {
|
|
1827
1936
|
debugDiscovery?.(
|
|
1828
|
-
"watcher: %s matches (urls=%s, router=%s)",
|
|
1937
|
+
"watcher: %s matches (urls=%s, router=%s, clientUrls=%s)",
|
|
1829
1938
|
filePath,
|
|
1830
1939
|
hasUrls,
|
|
1831
1940
|
hasCreateRouter,
|
|
1941
|
+
hasClientUrls,
|
|
1832
1942
|
);
|
|
1833
1943
|
}
|
|
1944
|
+
// A "use client" clientUrls module is an HMR-accepted client
|
|
1945
|
+
// boundary in the rsc graph: its edit never invalidates the router
|
|
1946
|
+
// module that materialized its projection, so the re-discovery
|
|
1947
|
+
// entry import would cache-hit and keep serving the stale mount
|
|
1948
|
+
// (old patterns 200, new patterns 404 until restart). Invalidate
|
|
1949
|
+
// the entry + router sources so the import re-creates the routers
|
|
1950
|
+
// against the refreshed projection (installed by the pre-entry
|
|
1951
|
+
// refresh in discover-routers.ts).
|
|
1952
|
+
if (isUseClient && hasClientUrls) {
|
|
1953
|
+
const rscGraph = (server.environments as any)?.rsc?.moduleGraph;
|
|
1954
|
+
if (rscGraph?.getModulesByFile) {
|
|
1955
|
+
// Importers must be invalidated too: the virtual RSC entry
|
|
1956
|
+
// holds a live `import { router }` binding, and re-evaluating
|
|
1957
|
+
// router.tsx alone leaves that binding on the OLD instance —
|
|
1958
|
+
// the request pipeline would keep serving the stale mount.
|
|
1959
|
+
// Same blast radius as a server urls edit (Vite's own
|
|
1960
|
+
// file-change invalidation propagates upward identically).
|
|
1961
|
+
const invalidateWithImporters = (
|
|
1962
|
+
mod: any,
|
|
1963
|
+
seen: Set<any>,
|
|
1964
|
+
): void => {
|
|
1965
|
+
if (!mod || seen.has(mod)) return;
|
|
1966
|
+
seen.add(mod);
|
|
1967
|
+
rscGraph.invalidateModule(mod);
|
|
1968
|
+
for (const importer of mod.importers ?? []) {
|
|
1969
|
+
invalidateWithImporters(importer, seen);
|
|
1970
|
+
}
|
|
1971
|
+
};
|
|
1972
|
+
const routerSourceFiles = new Set<string>();
|
|
1973
|
+
if (s.resolvedEntryPath) {
|
|
1974
|
+
routerSourceFiles.add(resolve(s.resolvedEntryPath));
|
|
1975
|
+
}
|
|
1976
|
+
for (const entry of s.perRouterManifests) {
|
|
1977
|
+
if (entry.sourceFile) {
|
|
1978
|
+
routerSourceFiles.add(resolve(entry.sourceFile));
|
|
1979
|
+
}
|
|
1980
|
+
}
|
|
1981
|
+
const seen = new Set<any>();
|
|
1982
|
+
for (const file of routerSourceFiles) {
|
|
1983
|
+
const mods = rscGraph.getModulesByFile(
|
|
1984
|
+
file.replaceAll("\\", "/"),
|
|
1985
|
+
);
|
|
1986
|
+
if (!mods) {
|
|
1987
|
+
debugDiscovery?.(
|
|
1988
|
+
"watcher: clientUrls invalidation found no rsc modules for %s",
|
|
1989
|
+
file,
|
|
1990
|
+
);
|
|
1991
|
+
continue;
|
|
1992
|
+
}
|
|
1993
|
+
for (const mod of mods) {
|
|
1994
|
+
invalidateWithImporters(mod, seen);
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
debugDiscovery?.(
|
|
1998
|
+
"watcher: clientUrls edit invalidated %d rsc module(s) for %d router file(s)",
|
|
1999
|
+
seen.size,
|
|
2000
|
+
routerSourceFiles.size,
|
|
2001
|
+
);
|
|
2002
|
+
}
|
|
2003
|
+
}
|
|
1834
2004
|
// Invalidate cache when a router file changes (new router added/removed)
|
|
1835
2005
|
if (hasCreateRouter) {
|
|
1836
2006
|
const nestedRouterConflict = findNestedRouterConflict([
|
|
@@ -1943,7 +2113,7 @@ export function createRouterDiscoveryPlugin(
|
|
|
1943
2113
|
}
|
|
1944
2114
|
|
|
1945
2115
|
await timed(debugDiscovery, "build discoverRouters", () =>
|
|
1946
|
-
discoverRouters(s, rscEnv),
|
|
2116
|
+
discoverRouters(s, rscEnv, (tempServer.environments as any)?.ssr),
|
|
1947
2117
|
);
|
|
1948
2118
|
// Update named-routes.gen.ts from runtime discovery.
|
|
1949
2119
|
// The runtime manifest includes dynamically generated routes
|