@rangojs/router 0.0.0-experimental.79 → 0.0.0-experimental.7c7e4327
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -4
- package/README.md +301 -797
- package/dist/bin/rango.js +603 -145
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3750 -1160
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +96 -24
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +85 -6
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +228 -33
- package/skills/caching/SKILL.md +336 -19
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +110 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -3
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +87 -56
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +12 -10
- package/skills/hooks/SKILL.md +73 -691
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +75 -19
- package/skills/layout/SKILL.md +40 -19
- package/skills/links/SKILL.md +247 -17
- package/skills/loader/SKILL.md +248 -10
- package/skills/middleware/SKILL.md +25 -13
- package/skills/migrate-nextjs/SKILL.md +205 -20
- package/skills/migrate-react-router/SKILL.md +59 -670
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +29 -2
- package/skills/observability/SKILL.md +202 -0
- package/skills/parallel/SKILL.md +40 -10
- package/skills/ppr/SKILL.md +616 -0
- package/skills/prerender/SKILL.md +72 -60
- package/skills/rango/SKILL.md +318 -26
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +117 -9
- package/skills/router-setup/SKILL.md +44 -9
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +130 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -626
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +74 -15
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +252 -158
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +94 -25
- package/src/browser/navigation-client.ts +144 -79
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +161 -73
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +183 -144
- package/src/browser/prefetch/cache.ts +242 -77
- package/src/browser/prefetch/fetch.ts +325 -69
- package/src/browser/prefetch/queue.ts +61 -12
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +58 -20
- package/src/browser/react/NavigationProvider.tsx +202 -120
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +17 -14
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +25 -3
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +145 -28
- package/src/browser/scroll-restoration.ts +37 -22
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +236 -65
- package/src/browser/types.ts +102 -9
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +203 -154
- package/src/build/generate-route-types.ts +3 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +152 -21
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +456 -62
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +128 -51
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +13 -21
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +58 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +421 -58
- package/src/cache/cache-scope.ts +187 -96
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2202 -372
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +126 -41
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +243 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +13 -21
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +180 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1127 -0
- package/src/client.rsc.tsx +41 -21
- package/src/client.tsx +33 -61
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +108 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +18 -6
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +67 -37
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +97 -12
- package/src/index.ts +98 -14
- package/src/internal-debug.ts +11 -10
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +78 -10
- package/src/redirect-origin.ts +114 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +65 -39
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +304 -309
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +87 -59
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +12 -1
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +41 -20
- package/src/route-types.ts +19 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +73 -25
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +129 -30
- package/src/router/handler-context.ts +27 -42
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +39 -20
- package/src/router/lazy-includes.ts +82 -59
- package/src/router/loader-resolution.ts +167 -72
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +74 -40
- package/src/router/match-api.ts +80 -55
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +159 -285
- package/src/router/match-middleware/cache-store.ts +64 -52
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +69 -79
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +7 -134
- package/src/router/middleware.ts +298 -172
- package/src/router/navigation-snapshot.ts +7 -56
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +181 -150
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +112 -67
- package/src/router/preview-match.ts +6 -2
- package/src/router/request-classification.ts +50 -69
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +14 -3
- package/src/router/router-context.ts +6 -29
- package/src/router/router-interfaces.ts +115 -36
- package/src/router/router-options.ts +166 -5
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +131 -86
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +139 -39
- package/src/router/segment-resolution/loader-mask.ts +67 -0
- package/src/router/segment-resolution/loader-snapshot.ts +251 -0
- package/src/router/segment-resolution/revalidation.ts +272 -320
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +160 -200
- package/src/router/telemetry.ts +105 -20
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +215 -0
- package/src/router/trie-matching.ts +171 -59
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +157 -71
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +291 -217
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +114 -38
- package/src/rsc/manifest-init.ts +29 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +124 -13
- package/src/rsc/redirect-guard.ts +100 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +421 -76
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +282 -116
- package/src/rsc/shell-capture.ts +1158 -0
- package/src/rsc/shell-serve.ts +150 -0
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +53 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-loader-promise.ts +49 -4
- package/src/segment-system.tsx +350 -149
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +208 -51
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +21 -38
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +395 -176
- package/src/ssr/index.tsx +458 -178
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +10 -13
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +813 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +105 -0
- package/src/testing/internal/context.ts +371 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +110 -62
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +11 -9
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +135 -14
- package/src/urls/include-helper.ts +19 -64
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +63 -17
- package/src/urls/path-helper.ts +22 -106
- package/src/urls/pattern-types.ts +72 -19
- package/src/urls/response-types.ts +22 -29
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +292 -107
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +8 -7
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +127 -86
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +96 -68
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +45 -1
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +4 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +210 -10
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- 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 +194 -0
- package/src/vite/plugins/expose-action-id.ts +48 -95
- package/src/vite/plugins/expose-id-utils.ts +88 -55
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +505 -486
- package/src/vite/plugins/performance-tracks.ts +26 -25
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +37 -40
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +236 -138
- package/src/vite/router-discovery.ts +927 -136
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +71 -43
- package/src/vite/utils/shared-utils.ts +142 -43
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug logging for the Rango Vite plugin.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper over the `debug` package (the same one Vite uses for its
|
|
5
|
+
* own `vite:*` namespaces). Enable with either:
|
|
6
|
+
*
|
|
7
|
+
* DEBUG='rango:*' vite dev
|
|
8
|
+
* vite --debug rango:* # vite prepends `vite:`, we bridge it
|
|
9
|
+
*
|
|
10
|
+
* Returns `undefined` when no matching namespace is enabled, so call sites
|
|
11
|
+
* can guard expensive diagnostics with a simple truthiness check:
|
|
12
|
+
*
|
|
13
|
+
* const debug = createRangoDebugger(NS.routes);
|
|
14
|
+
* if (debug) debug("built manifest (%d routes) in %dms", n, ms);
|
|
15
|
+
*
|
|
16
|
+
* Back-compat: INTERNAL_RANGO_DEBUG=1 still enables all rango namespaces.
|
|
17
|
+
*
|
|
18
|
+
* Vite CLI note: `vite --debug <feat>` rewrites to `DEBUG=vite:<feat>` — it
|
|
19
|
+
* always prefixes with `vite:` and cannot enable bare `rango:*` namespaces.
|
|
20
|
+
* We work around this by registering a shadow `vite:rango:*` instance for
|
|
21
|
+
* each debugger, so either invocation works.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import debugFactory from "debug";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Canonical debug namespaces. Import as `NS.xxx` instead of string literals
|
|
28
|
+
* so typos become type errors and the full set lives in one place.
|
|
29
|
+
*/
|
|
30
|
+
export const NS = {
|
|
31
|
+
config: "rango:config",
|
|
32
|
+
discovery: "rango:discovery",
|
|
33
|
+
routes: "rango:routes",
|
|
34
|
+
prerender: "rango:prerender",
|
|
35
|
+
build: "rango:build",
|
|
36
|
+
dev: "rango:dev",
|
|
37
|
+
transform: "rango:transform",
|
|
38
|
+
chunks: "rango:chunks",
|
|
39
|
+
} as const;
|
|
40
|
+
|
|
41
|
+
// Back-compat: the legacy INTERNAL_RANGO_DEBUG env var enabled per-site
|
|
42
|
+
// console.logs in this plugin. Map it to `rango:*` so those call sites can
|
|
43
|
+
// be migrated to the `debug` pipeline without breaking existing setups.
|
|
44
|
+
// Uses debug.enable() rather than mutating process.env because the `debug`
|
|
45
|
+
// package already snapshotted DEBUG when it was imported above.
|
|
46
|
+
if (process.env.INTERNAL_RANGO_DEBUG) {
|
|
47
|
+
const existing = debugFactory.disable();
|
|
48
|
+
debugFactory.enable(existing ? `${existing},rango:*` : "rango:*");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type Debugger = (formatter: string, ...args: unknown[]) => void;
|
|
52
|
+
|
|
53
|
+
export function createRangoDebugger(namespace: string): Debugger | undefined {
|
|
54
|
+
const primary = debugFactory(namespace);
|
|
55
|
+
// Shadow namespace so `vite --debug rango:*` (which expands to
|
|
56
|
+
// DEBUG=vite:rango:*) and `vite --debug` (DEBUG=vite:*) both pick us up.
|
|
57
|
+
const shadow = debugFactory(`vite:${namespace}`);
|
|
58
|
+
if (primary.enabled) return primary as Debugger;
|
|
59
|
+
if (shadow.enabled) return shadow as Debugger;
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Measure an async block and log its duration via `debug`. No-ops (still
|
|
65
|
+
* runs `fn`) when the namespace is disabled, so production cost is a single
|
|
66
|
+
* `.enabled` check per call.
|
|
67
|
+
*
|
|
68
|
+
* await timed(debug, "discover routers", () => discoverRouters(state));
|
|
69
|
+
*/
|
|
70
|
+
export async function timed<T>(
|
|
71
|
+
debug: Debugger | undefined,
|
|
72
|
+
label: string,
|
|
73
|
+
fn: () => T | Promise<T>,
|
|
74
|
+
): Promise<T> {
|
|
75
|
+
if (!debug) return await fn();
|
|
76
|
+
const start = performance.now();
|
|
77
|
+
try {
|
|
78
|
+
return await fn();
|
|
79
|
+
} finally {
|
|
80
|
+
debug("%s (%sms)", label, (performance.now() - start).toFixed(1));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Synchronous variant of `timed`. Use for sync call sites — wrapping them
|
|
86
|
+
* with the async `timed` would create a floating promise that discards any
|
|
87
|
+
* throw, bypassing the surrounding try/catch.
|
|
88
|
+
*/
|
|
89
|
+
export function timedSync<T>(
|
|
90
|
+
debug: Debugger | undefined,
|
|
91
|
+
label: string,
|
|
92
|
+
fn: () => T,
|
|
93
|
+
): T {
|
|
94
|
+
if (!debug) return fn();
|
|
95
|
+
const start = performance.now();
|
|
96
|
+
try {
|
|
97
|
+
return fn();
|
|
98
|
+
} finally {
|
|
99
|
+
debug("%s (%sms)", label, (performance.now() - start).toFixed(1));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Aggregate counter for high-frequency call sites (typically Vite
|
|
105
|
+
* `transform` hooks that run on many files). Per-call logging would
|
|
106
|
+
* drown real signal; this collects totals and reports once on flush.
|
|
107
|
+
*
|
|
108
|
+
* const counter = createCounter(debug, "use-cache-transform");
|
|
109
|
+
* // inside transform():
|
|
110
|
+
* return counter?.time(id, () => doWork()) ?? doWork();
|
|
111
|
+
* // or manually:
|
|
112
|
+
* counter?.record(id, ms);
|
|
113
|
+
* // flush on buildEnd (counter resets, so multi-env builds each get
|
|
114
|
+
* // their own summary line):
|
|
115
|
+
* counter?.flush();
|
|
116
|
+
*
|
|
117
|
+
* Returns `undefined` when the namespace is disabled so call sites pay
|
|
118
|
+
* nothing when off.
|
|
119
|
+
*/
|
|
120
|
+
export interface Counter {
|
|
121
|
+
record(file: string, ms: number): void;
|
|
122
|
+
/**
|
|
123
|
+
* Convenience: time a sync or async block and record it. Propagates
|
|
124
|
+
* throws; records regardless of outcome. Returns the function's result.
|
|
125
|
+
*/
|
|
126
|
+
time<T>(file: string, fn: () => T): T;
|
|
127
|
+
time<T>(file: string, fn: () => Promise<T>): Promise<T>;
|
|
128
|
+
flush(): void;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function createCounter(
|
|
132
|
+
debug: Debugger | undefined,
|
|
133
|
+
label: string,
|
|
134
|
+
): Counter | undefined {
|
|
135
|
+
if (!debug) return undefined;
|
|
136
|
+
let n = 0;
|
|
137
|
+
let totalMs = 0;
|
|
138
|
+
let slowestMs = 0;
|
|
139
|
+
let slowestFile = "";
|
|
140
|
+
const record = (file: string, ms: number): void => {
|
|
141
|
+
n++;
|
|
142
|
+
totalMs += ms;
|
|
143
|
+
if (ms > slowestMs) {
|
|
144
|
+
slowestMs = ms;
|
|
145
|
+
slowestFile = file;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
return {
|
|
149
|
+
record,
|
|
150
|
+
time<T>(file: string, fn: () => T | Promise<T>): T | Promise<T> {
|
|
151
|
+
const start = performance.now();
|
|
152
|
+
let out: T | Promise<T>;
|
|
153
|
+
try {
|
|
154
|
+
out = fn();
|
|
155
|
+
} catch (err) {
|
|
156
|
+
record(file, performance.now() - start);
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
if (out && typeof (out as any).then === "function") {
|
|
160
|
+
return (out as Promise<T>).finally(() =>
|
|
161
|
+
record(file, performance.now() - start),
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
record(file, performance.now() - start);
|
|
165
|
+
return out;
|
|
166
|
+
},
|
|
167
|
+
flush(): void {
|
|
168
|
+
if (n === 0) return;
|
|
169
|
+
debug(
|
|
170
|
+
"%s: %d files, %sms total, slowest %sms %s",
|
|
171
|
+
label,
|
|
172
|
+
n,
|
|
173
|
+
totalMs.toFixed(1),
|
|
174
|
+
slowestMs.toFixed(1),
|
|
175
|
+
slowestFile,
|
|
176
|
+
);
|
|
177
|
+
// Reset so buildEnd firing once per environment (Vite 6+ multi-env)
|
|
178
|
+
// gives one log line per env rather than silently dropping later data.
|
|
179
|
+
n = 0;
|
|
180
|
+
totalMs = 0;
|
|
181
|
+
slowestMs = 0;
|
|
182
|
+
slowestFile = "";
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
@@ -9,6 +9,7 @@ import { resolve } from "node:path";
|
|
|
9
9
|
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
10
10
|
import { evictHandlerCode } from "../utils/bundle-analysis.js";
|
|
11
11
|
import { copyStagedBuildAssets } from "../utils/prerender-utils.js";
|
|
12
|
+
import { jsonParseExpression } from "../utils/manifest-utils.js";
|
|
12
13
|
import type { DiscoveryState } from "./state.js";
|
|
13
14
|
|
|
14
15
|
/**
|
|
@@ -71,12 +72,12 @@ export function postprocessBundle(state: DiscoveryState): void {
|
|
|
71
72
|
writeFileSync(chunkPath, result.code);
|
|
72
73
|
const savedKB = (result.savedBytes / 1024).toFixed(1);
|
|
73
74
|
console.log(
|
|
74
|
-
`[
|
|
75
|
+
`[rango] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`,
|
|
75
76
|
);
|
|
76
77
|
}
|
|
77
78
|
} catch (replaceErr: any) {
|
|
78
79
|
console.warn(
|
|
79
|
-
`[
|
|
80
|
+
`[rango] Failed to evict ${target.label}: ${replaceErr.message}`,
|
|
80
81
|
);
|
|
81
82
|
}
|
|
82
83
|
}
|
|
@@ -104,7 +105,7 @@ export function postprocessBundle(state: DiscoveryState): void {
|
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
const manifestCode = [
|
|
107
|
-
`const m
|
|
108
|
+
`const m=${jsonParseExpression(manifestMap)};`,
|
|
108
109
|
`export function loadPrerenderAsset(s){return import(s)}`,
|
|
109
110
|
`export default m;`,
|
|
110
111
|
"",
|
|
@@ -121,11 +122,11 @@ export function postprocessBundle(state: DiscoveryState): void {
|
|
|
121
122
|
|
|
122
123
|
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
123
124
|
console.log(
|
|
124
|
-
`[
|
|
125
|
+
`[rango] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderManifestEntries!).length} entries)`,
|
|
125
126
|
);
|
|
126
127
|
} catch (err: any) {
|
|
127
128
|
throw new Error(
|
|
128
|
-
`[
|
|
129
|
+
`[rango] Failed to write prerender assets: ${err.message}`,
|
|
129
130
|
);
|
|
130
131
|
}
|
|
131
132
|
}
|
|
@@ -169,11 +170,11 @@ export function postprocessBundle(state: DiscoveryState): void {
|
|
|
169
170
|
|
|
170
171
|
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
171
172
|
console.log(
|
|
172
|
-
`[
|
|
173
|
+
`[rango] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticManifestEntries!).length} entries)`,
|
|
173
174
|
);
|
|
174
175
|
} catch (err: any) {
|
|
175
176
|
throw new Error(
|
|
176
|
-
`[
|
|
177
|
+
`[rango] Failed to write static assets: ${err.message}`,
|
|
177
178
|
);
|
|
178
179
|
}
|
|
179
180
|
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev prerender result cache — memoizes /__rsc_prerender responses between
|
|
3
|
+
* HMR edits (issue #654).
|
|
4
|
+
*
|
|
5
|
+
* Freshness invariant (why identity keying is correct): the endpoint
|
|
6
|
+
* re-imports the user's entry module through a Vite module runner on every
|
|
7
|
+
* request. When ANY module in the entry → router → urls → handler chain was
|
|
8
|
+
* invalidated (file edit propagates up the importer graph), that import
|
|
9
|
+
* re-executes the entry, `createRouter()` re-runs, and `RouterRegistry.set`
|
|
10
|
+
* (router.ts) replaces the router instance with a NEW object. When nothing
|
|
11
|
+
* was invalidated, the import is a module-cache hit and the instance is the
|
|
12
|
+
* SAME object. Router-instance identity therefore IS the HMR generation:
|
|
13
|
+
* keying the cache on it gives "serve cached until an edit invalidates the
|
|
14
|
+
* chain" without any watcher bookkeeping, and the WeakMap lets every stale
|
|
15
|
+
* generation's bucket be garbage-collected the moment the registry drops
|
|
16
|
+
* the old instance.
|
|
17
|
+
*
|
|
18
|
+
* Staleness envelope: a cached body can only go stale through NON-module
|
|
19
|
+
* inputs (a getParams() reading a database, fs content outside the module
|
|
20
|
+
* graph). Production freezes those at build time, so serving them frozen
|
|
21
|
+
* between edits makes dev MORE faithful to production, not less — the
|
|
22
|
+
* pre-#654 behavior of re-rendering per request was the anomaly.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import type { SerializedSegmentData } from "../../cache/types.js";
|
|
26
|
+
|
|
27
|
+
/** Structural slice of `matchForPrerender`'s result the payload derivation needs. */
|
|
28
|
+
export interface DevPrerenderMatchPayloadSource {
|
|
29
|
+
segments: SerializedSegmentData[];
|
|
30
|
+
handles: string;
|
|
31
|
+
interceptSegments?: SerializedSegmentData[];
|
|
32
|
+
interceptHandles?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Serialized response bodies for the two endpoint variants of one render. */
|
|
36
|
+
export interface DevPrerenderPayloadBodies {
|
|
37
|
+
/** `intercept != 1` response: the route's own segments + handles. */
|
|
38
|
+
main: string;
|
|
39
|
+
/**
|
|
40
|
+
* `intercept=1` response: main + intercept segments with the MERGED handle
|
|
41
|
+
* string. Falls back to `main` byte-for-byte when the route has no
|
|
42
|
+
* intercept segments — mirroring the endpoint's historical behavior.
|
|
43
|
+
*/
|
|
44
|
+
intercept: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface DevPrerenderCache {
|
|
48
|
+
get(router: object, key: string): string | undefined;
|
|
49
|
+
set(router: object, key: string, body: string): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Derive both variant bodies from one matchForPrerender result, so a single
|
|
54
|
+
* render warms the main AND intercept cache keys (matchForPrerender computes
|
|
55
|
+
* intercept segments unconditionally either way — see prerender-match.ts
|
|
56
|
+
* step 14).
|
|
57
|
+
*/
|
|
58
|
+
export function payloadBodiesFromResult(
|
|
59
|
+
result: DevPrerenderMatchPayloadSource,
|
|
60
|
+
): DevPrerenderPayloadBodies {
|
|
61
|
+
const main = JSON.stringify({
|
|
62
|
+
segments: result.segments,
|
|
63
|
+
handles: result.handles,
|
|
64
|
+
});
|
|
65
|
+
const intercept = result.interceptSegments?.length
|
|
66
|
+
? JSON.stringify({
|
|
67
|
+
segments: [...result.segments, ...result.interceptSegments],
|
|
68
|
+
handles: result.interceptHandles ?? "",
|
|
69
|
+
})
|
|
70
|
+
: main;
|
|
71
|
+
return { main, intercept };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Cache key for one endpoint request shape. `pathname` and `routeName` come
|
|
76
|
+
* straight from the query; `passthrough` selects the getParams-checked match
|
|
77
|
+
* path; `intercept` selects which variant body is served. All four dimensions
|
|
78
|
+
* change the response, so all four are in the key.
|
|
79
|
+
*/
|
|
80
|
+
export function devPrerenderCacheKey(
|
|
81
|
+
pathname: string,
|
|
82
|
+
opts: { intercept: boolean; passthrough: boolean; routeName: string | null },
|
|
83
|
+
): string {
|
|
84
|
+
return `${pathname}|i=${opts.intercept ? 1 : 0}|p=${opts.passthrough ? 1 : 0}|r=${opts.routeName ?? ""}`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Per-router FIFO cap: a dev session that visits an unbounded set of
|
|
89
|
+
* prerendered pathnames (e.g. crawling param routes) must not grow one
|
|
90
|
+
* bucket without limit. 500 rendered payloads is far beyond any interactive
|
|
91
|
+
* session; eviction order does not matter for correctness (a miss just
|
|
92
|
+
* re-renders).
|
|
93
|
+
*/
|
|
94
|
+
const MAX_ENTRIES_PER_ROUTER = 500;
|
|
95
|
+
|
|
96
|
+
export function createDevPrerenderCache(
|
|
97
|
+
maxEntriesPerRouter: number = MAX_ENTRIES_PER_ROUTER,
|
|
98
|
+
): DevPrerenderCache {
|
|
99
|
+
const buckets = new WeakMap<object, Map<string, string>>();
|
|
100
|
+
return {
|
|
101
|
+
get(router: object, key: string): string | undefined {
|
|
102
|
+
return buckets.get(router)?.get(key);
|
|
103
|
+
},
|
|
104
|
+
set(router: object, key: string, body: string): void {
|
|
105
|
+
let bucket = buckets.get(router);
|
|
106
|
+
if (!bucket) {
|
|
107
|
+
bucket = new Map();
|
|
108
|
+
buckets.set(router, bucket);
|
|
109
|
+
}
|
|
110
|
+
if (!bucket.has(key) && bucket.size >= maxEntriesPerRouter) {
|
|
111
|
+
const oldest = bucket.keys().next().value;
|
|
112
|
+
if (oldest !== undefined) bucket.delete(oldest);
|
|
113
|
+
}
|
|
114
|
+
bucket.set(key, body);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|