@rangojs/router 0.0.0-experimental.14 → 0.0.0-experimental.141
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 +17 -0
- package/README.md +432 -7
- package/dist/bin/rango.js +2073 -213
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +7258 -2714
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +140 -67
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +487 -0
- package/skills/caching/SKILL.md +357 -25
- 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 +246 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -10
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +207 -15
- package/skills/layout/SKILL.md +146 -6
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +616 -54
- package/skills/middleware/SKILL.md +217 -37
- package/skills/migrate-nextjs/SKILL.md +611 -0
- package/skills/migrate-react-router/SKILL.md +927 -0
- package/skills/mime-routes/SKILL.md +42 -11
- package/skills/observability/SKILL.md +194 -0
- package/skills/parallel/SKILL.md +284 -3
- package/skills/ppr/SKILL.md +293 -0
- package/skills/prerender/SKILL.md +437 -52
- package/skills/rango/SKILL.md +369 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +263 -121
- package/skills/route/SKILL.md +350 -21
- package/skills/router-setup/SKILL.md +246 -33
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +126 -222
- 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 +9 -8
- package/skills/typesafety/SKILL.md +532 -103
- package/skills/use-cache/SKILL.md +367 -0
- 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 +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +293 -202
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +245 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +184 -118
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +412 -364
- package/src/browser/prefetch/cache.ts +359 -0
- package/src/browser/prefetch/fetch.ts +452 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +275 -68
- package/src/browser/react/NavigationProvider.tsx +265 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +300 -72
- package/src/browser/scroll-restoration.ts +138 -50
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +223 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +252 -161
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +225 -42
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +60 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +525 -0
- package/src/cache/cache-scope.ts +298 -332
- package/src/cache/cache-tag.ts +103 -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 +2508 -158
- 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 +17 -17
- package/src/cache/document-cache.ts +199 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +111 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +363 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +248 -0
- package/src/cache/shell-snapshot.ts +368 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +222 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1113 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- 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 +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +173 -35
- package/src/index.ts +241 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +100 -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 +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +505 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +263 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +245 -0
- package/src/router/handler-context.ts +377 -125
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +59 -28
- package/src/router/lazy-includes.ts +254 -0
- package/src/router/loader-resolution.ts +421 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +131 -57
- package/src/router/match-api.ts +167 -246
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +505 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +547 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +278 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +246 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +554 -0
- package/src/router/router-options.ts +779 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +772 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +250 -0
- package/src/router/segment-resolution/loader-mask.ts +44 -0
- package/src/router/segment-resolution/revalidation.ts +1331 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- 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 +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +781 -2378
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +905 -1142
- package/src/rsc/helpers.ts +275 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +502 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +527 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-capture.ts +897 -0
- package/src/rsc/shell-serve.ts +124 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +149 -0
- package/src/segment-system.tsx +349 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +459 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +310 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +848 -157
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +443 -135
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +701 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +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 +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +413 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +160 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1341
- package/src/use-loader.tsx +406 -141
- 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 +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- 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 +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +23 -2255
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +303 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- 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/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +263 -0
- package/src/vite/plugins/virtual-entries.ts +234 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +560 -0
- package/src/vite/router-discovery.ts +1638 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- 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 +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +249 -0
- package/src/vite/utils/shared-utils.ts +269 -0
- package/CLAUDE.md +0 -43
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/react/use-client-cache.ts +0 -56
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/handles/index.ts +0 -6
- package/src/href-context.ts +0 -33
- package/src/network-error-thrower.tsx +0 -21
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- package/src/vite/package-resolution.ts +0 -125
- package/src/vite/virtual-entries.ts +0 -114
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel OpenTelemetry tracing integration.
|
|
3
|
+
*
|
|
4
|
+
* Bridges the router's performance phases (request, middleware, action,
|
|
5
|
+
* loaders, handler, render, ssr) onto OpenTelemetry spans so they show up in
|
|
6
|
+
* Vercel's trace waterfall next to the platform's automatic spans, with correct
|
|
7
|
+
* nesting. Vercel exposes tracing through OpenTelemetry (not a native import-free
|
|
8
|
+
* API like Cloudflare), so this is a thin convenience over `createOTelTracing`:
|
|
9
|
+
* it reads the global OTel tracer that `@vercel/otel`'s `registerOTel()` installs.
|
|
10
|
+
*
|
|
11
|
+
* Usage (vercel preset). A Rango/Vite app does NOT auto-load `instrumentation.ts`
|
|
12
|
+
* the way Next.js does, so export the tracing config from there and import it —
|
|
13
|
+
* the import is what runs `registerOTel()`. A standalone `registerOTel()` that
|
|
14
|
+
* nothing imports is a silent no-op (the tracer never registers, spans drop):
|
|
15
|
+
*
|
|
16
|
+
* // instrumentation.ts
|
|
17
|
+
* import { registerOTel } from "@vercel/otel";
|
|
18
|
+
* import { createVercelTracing } from "@rangojs/router/vercel";
|
|
19
|
+
* registerOTel({ serviceName: "my-app" });
|
|
20
|
+
* export const tracing = createVercelTracing();
|
|
21
|
+
*
|
|
22
|
+
* // router.tsx — importing `tracing` runs instrumentation.ts (and registerOTel)
|
|
23
|
+
* import { createRouter } from "@rangojs/router";
|
|
24
|
+
* import { tracing } from "./instrumentation.js";
|
|
25
|
+
* export const router = createRouter({ tracing });
|
|
26
|
+
*
|
|
27
|
+
* Two runtime caveats inherited from the platform:
|
|
28
|
+
* - Node.js runtime only. Vercel custom spans are unsupported on the Edge
|
|
29
|
+
* runtime; `startActiveSpan` also needs an AsyncLocalStorage context manager
|
|
30
|
+
* (which @vercel/otel configures on Node) for spans to nest correctly.
|
|
31
|
+
* - `registerOTel()` must run before the first request. Reading the tracer via
|
|
32
|
+
* `trace.getTracer` here is safe even if it runs first — the API's proxy
|
|
33
|
+
* tracer delegates to the provider once registered — but no provider means
|
|
34
|
+
* every span is a no-op (the request behaves exactly as if tracing were off).
|
|
35
|
+
*
|
|
36
|
+
* Whether spans are actually exported is governed by your OTel setup / Vercel
|
|
37
|
+
* tracing destination, not by this adapter.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
import { trace } from "@opentelemetry/api";
|
|
41
|
+
import {
|
|
42
|
+
createOTelTracing,
|
|
43
|
+
type OTelActiveSpanTracer,
|
|
44
|
+
} from "../router/telemetry-otel.js";
|
|
45
|
+
import type {
|
|
46
|
+
RouterTracingConfig,
|
|
47
|
+
TracePhaseToggles,
|
|
48
|
+
} from "../router/tracing.js";
|
|
49
|
+
|
|
50
|
+
/** Options for createVercelTracing. */
|
|
51
|
+
export interface VercelTracingOptions {
|
|
52
|
+
/** Master switch. Defaults to true. */
|
|
53
|
+
enabled?: boolean;
|
|
54
|
+
/** Per-phase span toggles. Omitted phases default to enabled. */
|
|
55
|
+
spans?: TracePhaseToggles;
|
|
56
|
+
/**
|
|
57
|
+
* OTel instrumentation-scope name passed to `trace.getTracer()`. Defaults to
|
|
58
|
+
* `"rango"`. Ignored when `tracer` is provided.
|
|
59
|
+
*/
|
|
60
|
+
tracerName?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Explicit tracer override. Defaults to the global OTel tracer
|
|
63
|
+
* (`trace.getTracer(tracerName)`) — the provider `@vercel/otel`'s
|
|
64
|
+
* `registerOTel()` installs. Pass this to bridge onto a tracer you own.
|
|
65
|
+
*/
|
|
66
|
+
tracer?: OTelActiveSpanTracer;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Create the tracing config for a Vercel router. Pass the result to
|
|
71
|
+
* `createRouter({ tracing })`. Spans are emitted for the request, middleware,
|
|
72
|
+
* action, loaders, handler, render, and ssr phases; pass `spans` to turn
|
|
73
|
+
* individual phases off.
|
|
74
|
+
*
|
|
75
|
+
* @see createOTelTracing (`@rangojs/router`) for the underlying adapter on any
|
|
76
|
+
* platform with an OpenTelemetry SDK.
|
|
77
|
+
* @see createCloudflareTracing (`@rangojs/router/cloudflare`) for the same slot
|
|
78
|
+
* using Cloudflare Workers native custom spans.
|
|
79
|
+
*/
|
|
80
|
+
export function createVercelTracing(
|
|
81
|
+
options: VercelTracingOptions = {},
|
|
82
|
+
): RouterTracingConfig {
|
|
83
|
+
const { tracerName = "rango", tracer, enabled, spans } = options;
|
|
84
|
+
return createOTelTracing(tracer ?? trace.getTracer(tracerName), {
|
|
85
|
+
enabled,
|
|
86
|
+
spans,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundle Post-Processing
|
|
3
|
+
*
|
|
4
|
+
* Handles handler code eviction from prerender/static chunks and
|
|
5
|
+
* injection of collected prerender/static data into the RSC entry bundle.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { resolve } from "node:path";
|
|
9
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
10
|
+
import { evictHandlerCode } from "../utils/bundle-analysis.js";
|
|
11
|
+
import { copyStagedBuildAssets } from "../utils/prerender-utils.js";
|
|
12
|
+
import { jsonParseExpression } from "../utils/manifest-utils.js";
|
|
13
|
+
import type { DiscoveryState } from "./state.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Post-process the RSC bundle: evict handler code and inject
|
|
17
|
+
* prerender/static data as importable asset modules.
|
|
18
|
+
*/
|
|
19
|
+
export function postprocessBundle(state: DiscoveryState): void {
|
|
20
|
+
const hasPrerenderData =
|
|
21
|
+
state.prerenderManifestEntries &&
|
|
22
|
+
Object.keys(state.prerenderManifestEntries).length > 0;
|
|
23
|
+
const hasStaticData =
|
|
24
|
+
state.staticManifestEntries &&
|
|
25
|
+
Object.keys(state.staticManifestEntries).length > 0;
|
|
26
|
+
if (!hasPrerenderData && !hasStaticData) return;
|
|
27
|
+
|
|
28
|
+
// Find RSC entry (recorded in generateBundle, fallback to dist/rsc/index.js)
|
|
29
|
+
const rscEntryPath = resolve(
|
|
30
|
+
state.projectRoot,
|
|
31
|
+
"dist/rsc",
|
|
32
|
+
state.rscEntryFileName ?? "index.js",
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
// 1. Evict handler code from whichever chunks contain handler exports.
|
|
36
|
+
// handlerChunkInfoMap/staticHandlerChunkInfoMap are populated by generateBundle
|
|
37
|
+
// after the production RSC build. In Vite 6 multi-environment builds, the
|
|
38
|
+
// RSC build runs twice (analysis + production). The maps are cleared at the
|
|
39
|
+
// start of each generateBundle pass so only production data is used here.
|
|
40
|
+
const evictionTargets: Array<{
|
|
41
|
+
infos: Iterable<import("./state.js").ChunkInfo>;
|
|
42
|
+
fnName: string;
|
|
43
|
+
brand: string;
|
|
44
|
+
label: string;
|
|
45
|
+
}> = [
|
|
46
|
+
{
|
|
47
|
+
infos: state.handlerChunkInfoMap.values(),
|
|
48
|
+
fnName: "Prerender",
|
|
49
|
+
brand: "prerenderHandler",
|
|
50
|
+
label: "handler code from RSC bundle",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
infos: state.staticHandlerChunkInfoMap.values(),
|
|
54
|
+
fnName: "Static",
|
|
55
|
+
brand: "staticHandler",
|
|
56
|
+
label: "static handler code",
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
for (const target of evictionTargets) {
|
|
61
|
+
for (const info of target.infos) {
|
|
62
|
+
const chunkPath = resolve(state.projectRoot, "dist/rsc", info.fileName);
|
|
63
|
+
try {
|
|
64
|
+
const code = readFileSync(chunkPath, "utf-8");
|
|
65
|
+
const result = evictHandlerCode(
|
|
66
|
+
code,
|
|
67
|
+
info.exports,
|
|
68
|
+
target.fnName,
|
|
69
|
+
target.brand,
|
|
70
|
+
);
|
|
71
|
+
if (result) {
|
|
72
|
+
writeFileSync(chunkPath, result.code);
|
|
73
|
+
const savedKB = (result.savedBytes / 1024).toFixed(1);
|
|
74
|
+
console.log(
|
|
75
|
+
`[rango] Evicted ${target.label} (${savedKB} KB saved): ${info.fileName}`,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
} catch (replaceErr: any) {
|
|
79
|
+
console.warn(
|
|
80
|
+
`[rango] Failed to evict ${target.label}: ${replaceErr.message}`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
state.handlerChunkInfoMap.clear();
|
|
86
|
+
state.staticHandlerChunkInfoMap.clear();
|
|
87
|
+
|
|
88
|
+
// 2. Write prerender data as separate importable asset modules
|
|
89
|
+
// and inject a lazy manifest loader into the RSC entry.
|
|
90
|
+
if (hasPrerenderData && existsSync(rscEntryPath)) {
|
|
91
|
+
const rscCode = readFileSync(rscEntryPath, "utf-8");
|
|
92
|
+
// Check for the specific injection marker to avoid double-injection.
|
|
93
|
+
if (!rscCode.includes("__prerender-manifest.js")) {
|
|
94
|
+
try {
|
|
95
|
+
let totalBytes = copyStagedBuildAssets(
|
|
96
|
+
state.projectRoot,
|
|
97
|
+
Object.values(state.prerenderManifestEntries!),
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
const manifestMap: Record<string, string> = {};
|
|
101
|
+
for (const [key, assetFileName] of Object.entries(
|
|
102
|
+
state.prerenderManifestEntries!,
|
|
103
|
+
)) {
|
|
104
|
+
manifestMap[key] = `./assets/${assetFileName}`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const manifestCode = [
|
|
108
|
+
`const m=${jsonParseExpression(manifestMap)};`,
|
|
109
|
+
`export function loadPrerenderAsset(s){return import(s)}`,
|
|
110
|
+
`export default m;`,
|
|
111
|
+
"",
|
|
112
|
+
].join("\n");
|
|
113
|
+
const manifestPath = resolve(
|
|
114
|
+
state.projectRoot,
|
|
115
|
+
"dist/rsc/__prerender-manifest.js",
|
|
116
|
+
);
|
|
117
|
+
writeFileSync(manifestPath, manifestCode);
|
|
118
|
+
totalBytes += Buffer.byteLength(manifestCode);
|
|
119
|
+
|
|
120
|
+
const injection = `globalThis.__loadPrerenderManifestModule = () => import("./__prerender-manifest.js");\n`;
|
|
121
|
+
writeFileSync(rscEntryPath, injection + rscCode);
|
|
122
|
+
|
|
123
|
+
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
124
|
+
console.log(
|
|
125
|
+
`[rango] Wrote prerender assets (${totalKB} KB total, ${Object.keys(state.prerenderManifestEntries!).length} entries)`,
|
|
126
|
+
);
|
|
127
|
+
} catch (err: any) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`[rango] Failed to write prerender assets: ${err.message}`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// 3. Write static handler data as separate importable asset modules
|
|
136
|
+
// and inject a __STATIC_MANIFEST import into the RSC entry.
|
|
137
|
+
if (hasStaticData && existsSync(rscEntryPath)) {
|
|
138
|
+
const rscCode = readFileSync(rscEntryPath, "utf-8");
|
|
139
|
+
if (!rscCode.includes("__static-manifest.js")) {
|
|
140
|
+
try {
|
|
141
|
+
const manifestEntries: string[] = [];
|
|
142
|
+
let totalBytes = copyStagedBuildAssets(
|
|
143
|
+
state.projectRoot,
|
|
144
|
+
Object.values(state.staticManifestEntries!),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
for (const [handlerId, assetFileName] of Object.entries(
|
|
148
|
+
state.staticManifestEntries!,
|
|
149
|
+
)) {
|
|
150
|
+
manifestEntries.push(
|
|
151
|
+
`${JSON.stringify(handlerId)}:()=>import("./assets/${assetFileName}")`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Set the global inside the manifest module so it is assigned
|
|
156
|
+
// during module evaluation (before dependent modules like
|
|
157
|
+
// segment-resolution.ts run their top-level initializers).
|
|
158
|
+
const manifestCode = `const m={${manifestEntries.join(",")}};globalThis.__STATIC_MANIFEST=m;export default m;\n`;
|
|
159
|
+
const manifestPath = resolve(
|
|
160
|
+
state.projectRoot,
|
|
161
|
+
"dist/rsc/__static-manifest.js",
|
|
162
|
+
);
|
|
163
|
+
writeFileSync(manifestPath, manifestCode);
|
|
164
|
+
totalBytes += Buffer.byteLength(manifestCode);
|
|
165
|
+
|
|
166
|
+
// The import ensures the manifest module is evaluated early.
|
|
167
|
+
// The global is already set inside the module itself.
|
|
168
|
+
const injection = `import "./__static-manifest.js";\n`;
|
|
169
|
+
writeFileSync(rscEntryPath, injection + rscCode);
|
|
170
|
+
|
|
171
|
+
const totalKB = (totalBytes / 1024).toFixed(1);
|
|
172
|
+
console.log(
|
|
173
|
+
`[rango] Wrote static assets (${totalKB} KB total, ${Object.keys(state.staticManifestEntries!).length} entries)`,
|
|
174
|
+
);
|
|
175
|
+
} catch (err: any) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
`[rango] Failed to write static assets: ${err.message}`,
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|