@rangojs/router 0.0.0-experimental.b9cb8739 → 0.0.0-experimental.bdaf10aa
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 +303 -741
- package/dist/bin/rango.js +730 -184
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +4344 -1335
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +86 -15
- 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 +251 -24
- package/skills/caching/SKILL.md +375 -17
- 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 +364 -0
- 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 +94 -18
- package/skills/layout/SKILL.md +62 -19
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +302 -54
- package/skills/middleware/SKILL.md +59 -16
- package/skills/migrate-nextjs/SKILL.md +745 -0
- package/skills/migrate-react-router/SKILL.md +153 -0
- 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 +225 -10
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +178 -124
- package/skills/rango/SKILL.md +318 -24
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +138 -49
- package/skills/route/SKILL.md +172 -9
- package/skills/router-setup/SKILL.md +131 -11
- 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 -616
- 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 +1 -66
- 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/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 +257 -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 +132 -33
- package/src/browser/navigation-client.ts +218 -68
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +203 -80
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +241 -127
- package/src/browser/prefetch/cache.ts +271 -44
- package/src/browser/prefetch/fetch.ts +367 -40
- package/src/browser/prefetch/queue.ts +144 -23
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +121 -16
- package/src/browser/react/NavigationProvider.tsx +240 -122
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- 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 +23 -69
- 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 +46 -11
- 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 +272 -80
- package/src/browser/scroll-restoration.ts +56 -22
- package/src/browser/segment-reconciler.ts +44 -7
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +244 -71
- package/src/browser/types.ts +136 -12
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +207 -158
- package/src/build/generate-route-types.ts +6 -1
- package/src/build/index.ts +11 -3
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +198 -41
- 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 +464 -63
- 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 +336 -110
- package/src/build/route-types/scan-filter.ts +9 -2
- 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 +454 -97
- package/src/cache/cache-scope.ts +235 -103
- 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 +2446 -170
- 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 +11 -17
- package/src/cache/document-cache.ts +144 -49
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +24 -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/taint.ts +55 -0
- package/src/cache/types.ts +194 -99
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1132 -0
- package/src/client.rsc.tsx +41 -21
- package/src/client.tsx +116 -290
- 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 +84 -2
- package/src/debug.ts +2 -2
- 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 +104 -34
- 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 +100 -13
- package/src/index.ts +143 -19
- 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 +37 -41
- package/src/prerender.ts +215 -86
- 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 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +485 -303
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +153 -77
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +53 -12
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +48 -21
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +130 -29
- package/src/router/handler-context.ts +83 -39
- package/src/router/instrument.ts +355 -0
- package/src/router/intercept-resolution.ts +50 -24
- package/src/router/lazy-includes.ts +89 -63
- package/src/router/loader-resolution.ts +286 -56
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +105 -56
- package/src/router/match-api.ts +178 -218
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +211 -165
- package/src/router/match-middleware/background-revalidation.ts +66 -22
- package/src/router/match-middleware/cache-lookup.ts +214 -263
- package/src/router/match-middleware/cache-store.ts +105 -50
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +128 -44
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +301 -177
- 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 +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 +203 -58
- package/src/router/preview-match.ts +35 -103
- package/src/router/request-classification.ts +291 -0
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +256 -0
- package/src/router/router-context.ts +11 -29
- package/src/router/router-interfaces.ts +146 -35
- package/src/router/router-options.ts +202 -15
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +301 -78
- package/src/router/segment-resolution/helpers.ts +115 -30
- package/src/router/segment-resolution/loader-cache.ts +156 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +477 -385
- 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 +8 -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 +10 -63
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +210 -71
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +682 -508
- 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 +127 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +138 -15
- 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 +509 -73
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +287 -113
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +62 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +167 -0
- package/src/segment-system.tsx +449 -132
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +367 -61
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +152 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +558 -173
- package/src/ssr/index.tsx +491 -174
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +27 -18
- 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 +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +234 -82
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +137 -14
- package/src/urls/include-helper.ts +40 -75
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +102 -23
- package/src/urls/path-helper.ts +62 -111
- package/src/urls/pattern-types.ts +84 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +346 -89
- 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 +36 -38
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +130 -85
- 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 +214 -132
- 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 +57 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +15 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +234 -62
- 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 +49 -98
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- 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 +553 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- 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 +46 -37
- package/src/vite/plugins/virtual-entries.ts +138 -27
- package/src/vite/rango.ts +353 -303
- package/src/vite/router-discovery.ts +1090 -166
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +4 -4
- 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 +98 -38
- package/src/vite/utils/shared-utils.ts +144 -44
- 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
|
@@ -2,22 +2,65 @@ import type { Plugin } from "vite";
|
|
|
2
2
|
import MagicString from "magic-string";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
normalizePath,
|
|
7
|
+
findMatchingParen,
|
|
8
|
+
findCallParenAfterGenerics,
|
|
9
|
+
skipStringOrComment,
|
|
10
|
+
} from "../expose-id-utils.js";
|
|
11
|
+
import { escapeRegExp } from "../../../regex-escape.js";
|
|
12
|
+
import {
|
|
13
|
+
getImportedFnNames,
|
|
14
|
+
buildUnsupportedShapeWarning,
|
|
15
|
+
} from "./export-analysis.js";
|
|
16
|
+
import { codeMatchIndices } from "../../../build/route-types/source-scan.js";
|
|
17
|
+
import { createRangoDebugger, createCounter, NS } from "../../debug.js";
|
|
18
|
+
|
|
19
|
+
const debug = createRangoDebugger(NS.transform);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Advance past leading whitespace and a single leading line/block comment so a
|
|
23
|
+
* `createRouter(/* opts *\/ { ... })` call still resolves to its `{`. Only the
|
|
24
|
+
* first comment-or-whitespace run is skipped (enough for the common prefix
|
|
25
|
+
* case); a non-trivia token after it stops the scan.
|
|
26
|
+
*/
|
|
27
|
+
function skipLeadingTrivia(code: string, start: number, end: number): number {
|
|
28
|
+
let i = start;
|
|
29
|
+
while (i < end) {
|
|
30
|
+
const skipped = skipStringOrComment(code, i);
|
|
31
|
+
// skipStringOrComment only advances for strings/comments, not whitespace.
|
|
32
|
+
if (skipped > i) {
|
|
33
|
+
i = skipped;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (/\s/.test(code[i])) {
|
|
37
|
+
i++;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
return i;
|
|
43
|
+
}
|
|
7
44
|
|
|
8
45
|
export function transformRouter(
|
|
9
46
|
code: string,
|
|
10
47
|
filePath: string,
|
|
11
48
|
routerFnNames: string[],
|
|
12
49
|
absolutePath?: string,
|
|
50
|
+
warn?: (message: string) => void,
|
|
13
51
|
): { code: string; map: ReturnType<MagicString["generateMap"]> } | null {
|
|
52
|
+
// Match only the callee identifier; the generic list (which may be nested,
|
|
53
|
+
// e.g. createRouter<Config<Env>>(...)) and the opening paren are located
|
|
54
|
+
// separately via findCallParenAfterGenerics so a nested `>` does not defeat
|
|
55
|
+
// the scan (a `<[^>]*>` regex stopped at the first `>`).
|
|
14
56
|
const pat = new RegExp(
|
|
15
|
-
`\\b(?:${routerFnNames.map(
|
|
57
|
+
`\\b(?:${routerFnNames.map(escapeRegExp).join("|")})\\b`,
|
|
16
58
|
"g",
|
|
17
59
|
);
|
|
18
60
|
let match: RegExpExecArray | null;
|
|
19
61
|
const s = new MagicString(code);
|
|
20
62
|
let changed = false;
|
|
63
|
+
const unsupportedSites: Array<{ line: number; column: number }> = [];
|
|
21
64
|
|
|
22
65
|
// Compute the import path for the generated route names file.
|
|
23
66
|
// filePath is relative to project root (e.g., "src/router.tsx")
|
|
@@ -25,45 +68,76 @@ export function transformRouter(
|
|
|
25
68
|
const routeNamesImport = `./${basename}.named-routes.gen.js`;
|
|
26
69
|
const routeNamesVar = `__rsc_rn`;
|
|
27
70
|
|
|
71
|
+
// Only inject at call sites in REAL code, not inside comments or string
|
|
72
|
+
// literals — e.g. a `createRouter({ ... })` snippet in a JSDoc example must
|
|
73
|
+
// not get a `$$id`/`.named-routes.gen` import injected. The sibling analysis
|
|
74
|
+
// path (export-analysis.ts) already uses this same comment/string-aware scan;
|
|
75
|
+
// the raw `pat.exec(code)` loop below would otherwise match in comments too.
|
|
76
|
+
const codeOffsets = new Set(codeMatchIndices(code, pat));
|
|
77
|
+
pat.lastIndex = 0;
|
|
78
|
+
|
|
28
79
|
while ((match = pat.exec(code)) !== null) {
|
|
80
|
+
if (!codeOffsets.has(match.index)) continue;
|
|
29
81
|
const callStart = match.index;
|
|
30
|
-
const
|
|
82
|
+
const calleeEnd = match.index + match[0].length;
|
|
83
|
+
|
|
84
|
+
// Resolve the call's opening paren, skipping an optional (possibly nested)
|
|
85
|
+
// generic argument list. A non-call reference (e.g. a bare identifier or a
|
|
86
|
+
// type position) yields -1 and is skipped.
|
|
87
|
+
const parenPos = findCallParenAfterGenerics(code, calleeEnd);
|
|
88
|
+
if (parenPos === -1) continue;
|
|
31
89
|
|
|
32
|
-
// Scope the $$id check to within this call's arguments only,
|
|
33
|
-
// not the entire remaining file.
|
|
34
90
|
const closeParen = findMatchingParen(code, parenPos + 1);
|
|
35
91
|
const callArgs = code.slice(parenPos + 1, closeParen);
|
|
36
92
|
|
|
37
|
-
// Skip
|
|
38
|
-
|
|
93
|
+
// Skip ONLY a call we already injected into. The injected marker is the
|
|
94
|
+
// unique `$$routeNames: <var>` property; a bare `$$id` substring check
|
|
95
|
+
// would also match a user value/comment that merely contains the text
|
|
96
|
+
// "$$id" (e.g. `createRouter({ meta: { note: "see $$id docs" } })`),
|
|
97
|
+
// silently dropping named-route wiring for a legitimate config.
|
|
98
|
+
if (callArgs.includes(`$$routeNames: ${routeNamesVar}`)) continue;
|
|
39
99
|
|
|
40
|
-
|
|
100
|
+
const sourceFilePath = absolutePath ?? filePath;
|
|
41
101
|
const lineNumber = code.slice(0, callStart).split("\n").length;
|
|
42
102
|
const hash = createHash("sha256")
|
|
43
103
|
.update(`${filePath}:${lineNumber}`)
|
|
44
104
|
.digest("hex")
|
|
45
105
|
.slice(0, 8);
|
|
46
|
-
|
|
47
|
-
changed = true;
|
|
48
|
-
// $$sourceFile uses the absolute path so that downstream consumers
|
|
49
|
-
// (virtual-module-codegen, runtime-discovery) can resolve gen file
|
|
50
|
-
// imports correctly via path.dirname / path.join.
|
|
51
|
-
const sourceFilePath = absolutePath ?? filePath;
|
|
52
106
|
const injected = ` $$id: "${hash}", $$sourceFile: "${sourceFilePath}", $$routeNames: ${routeNamesVar},`;
|
|
53
107
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
108
|
+
// Skip a leading comment/whitespace run so `createRouter(/* c *\/ {...})`
|
|
109
|
+
// and a newline-then-comment prefix still resolve to the object literal.
|
|
110
|
+
// findMatchingParen returns one past the close `)`, so the matching paren
|
|
111
|
+
// sits at closeParen - 1 and empty args resolve to that `)`.
|
|
112
|
+
const argsContentStart = skipLeadingTrivia(code, parenPos + 1, closeParen);
|
|
113
|
+
const firstArgChar = code[argsContentStart];
|
|
114
|
+
|
|
115
|
+
if (firstArgChar === "{") {
|
|
116
|
+
changed = true;
|
|
117
|
+
s.appendRight(argsContentStart + 1, injected);
|
|
118
|
+
} else if (argsContentStart >= closeParen - 1) {
|
|
119
|
+
// Empty args: createRouter(). Wrap a fresh config object.
|
|
120
|
+
changed = true;
|
|
59
121
|
s.appendRight(parenPos + 1, `{${injected} }`);
|
|
122
|
+
} else {
|
|
123
|
+
// Unsupported argument shape (bare identifier, spread, call, etc.). No
|
|
124
|
+
// stable $$id can be injected here. Record it so the plugin can warn —
|
|
125
|
+
// and crucially do NOT mark changed, so a dead named-routes.gen import is
|
|
126
|
+
// not prepended for a call we never touched.
|
|
127
|
+
const lastNl = code.lastIndexOf("\n", callStart - 1);
|
|
128
|
+
const column = callStart - (lastNl + 1) + 1;
|
|
129
|
+
unsupportedSites.push({ line: lineNumber, column });
|
|
60
130
|
}
|
|
61
131
|
}
|
|
62
132
|
|
|
133
|
+
if (unsupportedSites.length > 0 && warn) {
|
|
134
|
+
warn(
|
|
135
|
+
buildUnsupportedShapeWarning(filePath, "createRouter", unsupportedSites),
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
63
139
|
if (!changed) return null;
|
|
64
140
|
|
|
65
|
-
// Prepend the static import as the first line. MagicString tracks the
|
|
66
|
-
// offset so all downstream source maps remain correct.
|
|
67
141
|
s.prepend(
|
|
68
142
|
`import { NamedRoutes as ${routeNamesVar} } from "${routeNamesImport}";\n`,
|
|
69
143
|
);
|
|
@@ -82,17 +156,17 @@ export function transformRouter(
|
|
|
82
156
|
*/
|
|
83
157
|
export function exposeRouterId(): Plugin {
|
|
84
158
|
let projectRoot = "";
|
|
159
|
+
const counter = createCounter(debug, "expose-router-id");
|
|
85
160
|
return {
|
|
86
161
|
name: "@rangojs/router:expose-router-id",
|
|
87
162
|
configResolved(config) {
|
|
88
163
|
projectRoot = config.root;
|
|
89
164
|
},
|
|
165
|
+
buildEnd() {
|
|
166
|
+
counter?.flush();
|
|
167
|
+
},
|
|
90
168
|
transform(code, id) {
|
|
91
169
|
if (!code.includes("createRouter")) return null;
|
|
92
|
-
// Accepts both @rangojs/router and @rangojs/router/server subpath.
|
|
93
|
-
// NOTE: detectImports in expose-id-utils has a stricter check that
|
|
94
|
-
// excludes /server for its router flag -- that's intentional since
|
|
95
|
-
// detectImports is only used in exposeInternalIds, not here.
|
|
96
170
|
if (
|
|
97
171
|
!/import\s*\{[^}]*\bcreateRouter\b[^}]*\}\s*from\s*["']@rangojs\/router(?:\/server)?["']/.test(
|
|
98
172
|
code,
|
|
@@ -102,9 +176,24 @@ export function exposeRouterId(): Plugin {
|
|
|
102
176
|
}
|
|
103
177
|
if (id.includes("node_modules")) return null;
|
|
104
178
|
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
179
|
+
const start = counter ? performance.now() : 0;
|
|
180
|
+
try {
|
|
181
|
+
const filePath = normalizePath(path.relative(projectRoot, id));
|
|
182
|
+
const routerFnNames = getImportedFnNames(code, "createRouter");
|
|
183
|
+
const warn =
|
|
184
|
+
typeof this.warn === "function"
|
|
185
|
+
? (message: string) => this.warn(message)
|
|
186
|
+
: undefined;
|
|
187
|
+
return transformRouter(
|
|
188
|
+
code,
|
|
189
|
+
filePath,
|
|
190
|
+
routerFnNames,
|
|
191
|
+
normalizePath(id),
|
|
192
|
+
warn,
|
|
193
|
+
);
|
|
194
|
+
} finally {
|
|
195
|
+
counter?.record(id, performance.now() - start);
|
|
196
|
+
}
|
|
108
197
|
},
|
|
109
198
|
};
|
|
110
199
|
}
|