@rangojs/router 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/bin/rango.js +343 -125
- package/dist/types/browser/event-controller.d.ts +6 -0
- package/dist/types/browser/react/use-router.d.ts +10 -3
- package/dist/types/browser/react/use-search-params.d.ts +57 -10
- package/dist/types/browser/types.d.ts +22 -0
- package/dist/types/build/merge-full-manifests.d.ts +3 -0
- package/dist/types/build/route-trie.d.ts +4 -73
- package/dist/types/build/route-types/per-module-writer.d.ts +6 -4
- package/dist/types/build/route-types/router-processing.d.ts +2 -3
- package/dist/types/cache/cache-exec-scope.d.ts +31 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
- package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
- package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
- package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
- package/dist/types/cache/taint.d.ts +12 -6
- package/dist/types/client-urls/client-root.d.ts +38 -0
- package/dist/types/client-urls/client-urls.d.ts +5 -0
- package/dist/types/client-urls/navigation.d.ts +38 -0
- package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
- package/dist/types/client-urls/server-projection.d.ts +62 -0
- package/dist/types/client-urls/types.d.ts +144 -0
- package/dist/types/client.d.ts +12 -4
- package/dist/types/client.rsc.d.ts +4 -1
- package/dist/types/decode-loader-results.d.ts +37 -0
- package/dist/types/errors.d.ts +1 -0
- package/dist/types/handles/is-thenable.d.ts +2 -4
- package/dist/types/index.d.ts +1 -1
- package/dist/types/loader-redirect.d.ts +27 -0
- package/dist/types/outlet-context.d.ts +12 -0
- package/dist/types/outlet-provider.d.ts +3 -1
- package/dist/types/redirect-origin.d.ts +4 -0
- package/dist/types/route-content-wrapper.d.ts +42 -1
- package/dist/types/route-definition/helpers-types.d.ts +13 -2
- package/dist/types/router/error-handling.d.ts +35 -1
- package/dist/types/router/intercept-resolution.d.ts +12 -0
- package/dist/types/router/loader-resolution.d.ts +24 -2
- package/dist/types/router/revalidation.d.ts +7 -0
- package/dist/{types.backup/build/route-trie.d.ts → types/router/route-trie-builder.d.ts} +4 -16
- package/dist/types/router/router-interfaces.d.ts +20 -0
- package/dist/types/router/segment-resolution/helpers.d.ts +1 -1
- package/dist/types/router/trie-matching.d.ts +1 -1
- package/dist/types/rsc/helpers.d.ts +3 -0
- package/dist/types/rsc/manifest-init.d.ts +5 -5
- package/dist/types/rsc/render-pipeline.d.ts +9 -0
- package/dist/types/rsc/routine-plan.d.ts +124 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
- package/dist/types/rsc/shell-capture.d.ts +9 -0
- package/dist/types/rsc/shell-serve.d.ts +11 -0
- package/dist/types/rsc/types.d.ts +30 -0
- package/dist/types/segment-system.d.ts +2 -0
- package/dist/types/server/context.d.ts +10 -0
- package/dist/types/server/handle-store.d.ts +34 -3
- package/dist/types/server/request-context.d.ts +14 -1
- package/dist/types/server.d.ts +1 -0
- package/dist/types/ssr/index.d.ts +22 -0
- package/dist/types/ssr/ssr-root.d.ts +10 -0
- package/dist/types/testing/dom.entry.d.ts +1 -1
- package/dist/types/testing/render-route.d.ts +16 -6
- package/dist/types/testing/run-loader.d.ts +9 -0
- package/dist/types/types/boundaries.d.ts +22 -0
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/loader-types.d.ts +57 -5
- package/dist/types/types/segments.d.ts +7 -0
- package/dist/types/urls/path-helper-types.d.ts +10 -4
- package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
- package/dist/types/vite/discovery/discover-routers.d.ts +1 -1
- package/dist/types/vite/discovery/state.d.ts +8 -1
- package/dist/types/vite/encryption-key.d.ts +2 -0
- package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
- package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
- package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
- package/dist/types/vite/utils/shared-utils.d.ts +12 -0
- package/dist/vite/index.js +5101 -2056
- package/package.json +3 -3
- package/skills/breadcrumbs/SKILL.md +39 -9
- package/skills/caching/SKILL.md +1 -1
- package/skills/catalog.json +7 -1
- package/skills/client-urls/SKILL.md +338 -0
- package/skills/comparison/references/framework-comparison.md +23 -9
- package/skills/hooks/SKILL.md +2 -2
- package/skills/hooks/data.md +11 -2
- package/skills/hooks/handle-and-actions.md +7 -0
- package/skills/hooks/outlets.md +26 -5
- package/skills/hooks/urls.md +40 -3
- package/skills/loader/SKILL.md +132 -20
- package/skills/migrate-nextjs/SKILL.md +70 -10
- package/skills/migrate-react-router/SKILL.md +49 -13
- package/skills/migrate-react-router/component-migration.md +18 -13
- package/skills/migrate-react-router/data-and-actions.md +14 -3
- package/skills/migrate-react-router/route-mapping.md +15 -2
- package/skills/mime-routes/SKILL.md +3 -1
- package/skills/parallel/SKILL.md +32 -1
- package/skills/ppr/SKILL.md +16 -6
- package/skills/prerender/SKILL.md +8 -4
- package/skills/rango/SKILL.md +21 -17
- package/skills/react-compiler/SKILL.md +3 -3
- package/skills/response-routes/SKILL.md +4 -2
- package/skills/route/SKILL.md +5 -2
- package/skills/router-setup/SKILL.md +16 -2
- package/skills/scripts/SKILL.md +16 -6
- package/skills/shell-manifest/SKILL.md +16 -7
- package/skills/testing/SKILL.md +2 -2
- package/skills/testing/client-components.md +6 -0
- package/skills/testing/handles.md +30 -8
- package/skills/testing/loader.md +51 -49
- package/skills/testing/middleware.md +1 -1
- package/skills/theme/SKILL.md +8 -5
- package/skills/typesafety/generated-files-and-cli.md +16 -9
- package/skills/typesafety/route-types.md +5 -1
- package/skills/use-cache/SKILL.md +47 -0
- package/src/bin/rango.ts +7 -3
- package/src/browser/event-controller.ts +40 -15
- package/src/browser/navigation-bridge.ts +6 -0
- package/src/browser/navigation-client.ts +5 -0
- package/src/browser/partial-update.ts +77 -10
- package/src/browser/react/NavigationProvider.tsx +7 -0
- package/src/browser/react/use-router.ts +40 -11
- package/src/browser/react/use-search-params.ts +140 -17
- package/src/browser/rsc-router.tsx +59 -0
- package/src/browser/server-action-bridge.ts +26 -0
- package/src/browser/types.ts +22 -0
- package/src/build/merge-full-manifests.ts +161 -0
- package/src/build/route-trie.ts +9 -332
- package/src/build/route-types/include-resolution.ts +66 -11
- package/src/build/route-types/per-module-writer.ts +11 -6
- package/src/build/route-types/router-processing.ts +184 -153
- package/src/build/runtime-discovery.ts +23 -12
- package/src/cache/cache-exec-scope.ts +47 -0
- package/src/cache/cache-runtime.ts +113 -40
- package/src/cache/cf/cf-cache-constants.ts +8 -1
- package/src/cache/cf/cf-cache-store.ts +41 -64
- package/src/cache/cf/cf-cache-types.ts +1 -1
- package/src/cache/cf/cf-kv-utils.ts +38 -0
- package/src/cache/segment-codec.ts +21 -5
- package/src/cache/taint.ts +28 -9
- package/src/client-urls/client-root.tsx +168 -0
- package/src/client-urls/client-urls.ts +698 -0
- package/src/client-urls/navigation.ts +237 -0
- package/src/client-urls/revalidation-protocol.ts +56 -0
- package/src/client-urls/server-projection.ts +579 -0
- package/src/client-urls/types.ts +195 -0
- package/src/client.rsc.tsx +12 -0
- package/src/client.tsx +49 -6
- package/src/decode-loader-results.ts +113 -0
- package/src/errors.ts +14 -0
- package/src/handles/deferred-resolution.ts +14 -7
- package/src/handles/is-thenable.ts +2 -4
- package/src/index.ts +1 -0
- package/src/loader-redirect.tsx +64 -0
- package/src/outlet-context.ts +12 -0
- package/src/outlet-provider.tsx +15 -1
- package/src/redirect-origin.ts +29 -0
- package/src/route-content-wrapper.tsx +96 -3
- package/src/route-definition/dsl-helpers.ts +28 -3
- package/src/route-definition/helpers-types.ts +13 -0
- package/src/route-definition/redirect.ts +17 -18
- package/src/router/error-handling.ts +65 -11
- package/src/router/intercept-resolution.ts +29 -0
- package/src/router/loader-resolution.ts +261 -28
- package/src/router/match-middleware/cache-lookup.ts +24 -15
- package/src/router/match-result.ts +7 -0
- package/src/router/revalidation.ts +24 -11
- package/src/router/route-trie-builder.ts +334 -0
- package/src/router/router-interfaces.ts +38 -0
- package/src/router/segment-resolution/fresh.ts +47 -0
- package/src/router/segment-resolution/helpers.ts +9 -11
- package/src/router/segment-resolution/loader-cache.ts +14 -24
- package/src/router/segment-resolution/revalidation.ts +20 -1
- package/src/router/trie-matching.ts +3 -3
- package/src/router.ts +46 -1
- package/src/rsc/full-payload.ts +6 -0
- package/src/rsc/handler.ts +36 -12
- package/src/rsc/helpers.ts +13 -0
- package/src/rsc/loader-fetch.ts +2 -2
- package/src/rsc/manifest-init.ts +28 -9
- package/src/rsc/progressive-enhancement.ts +247 -70
- package/src/rsc/render-pipeline.ts +68 -24
- package/src/rsc/routine-plan.ts +359 -0
- package/src/rsc/rsc-rendering.ts +569 -302
- package/src/rsc/server-action.ts +180 -71
- package/src/rsc/shell-capture-constants.ts +18 -0
- package/src/rsc/shell-capture.ts +104 -21
- package/src/rsc/shell-serve.ts +15 -2
- package/src/rsc/ssr-setup.ts +10 -1
- package/src/rsc/types.ts +31 -2
- package/src/segment-system.tsx +83 -26
- package/src/server/context.ts +10 -0
- package/src/server/cookie-store.ts +19 -19
- package/src/server/handle-store.ts +185 -48
- package/src/server/request-context.ts +36 -6
- package/src/server.ts +7 -0
- package/src/ssr/index.tsx +37 -2
- package/src/ssr/ssr-root.tsx +30 -2
- package/src/testing/dom.entry.ts +1 -1
- package/src/testing/render-route.tsx +22 -8
- package/src/testing/run-loader.ts +51 -13
- package/src/types/boundaries.ts +19 -0
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +60 -5
- package/src/types/segments.ts +7 -0
- package/src/urls/include-helper.ts +22 -4
- package/src/urls/path-helper-types.ts +14 -1
- package/src/use-loader.tsx +67 -6
- package/src/vite/discovery/client-urls-projection.ts +322 -0
- package/src/vite/discovery/discover-routers.ts +43 -17
- package/src/vite/discovery/state.ts +11 -1
- package/src/vite/discovery/virtual-module-codegen.ts +20 -0
- package/src/vite/encryption-key.ts +29 -0
- package/src/vite/plugins/expose-action-id.ts +2 -2
- package/src/vite/plugins/expose-internal-ids.ts +46 -0
- package/src/vite/plugins/server-ref-hashing.ts +74 -0
- package/src/vite/plugins/server-reference-pattern.ts +10 -0
- package/src/vite/plugins/virtual-entries.ts +12 -3
- package/src/vite/rango.ts +9 -0
- package/src/vite/router-discovery.ts +184 -14
- package/src/vite/utils/shared-utils.ts +12 -7
- package/dist/types.backup/__internal.d.ts +0 -127
- package/dist/types.backup/bin/rango.d.ts +0 -1
- package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
- package/dist/types.backup/browser/action-fence.d.ts +0 -33
- package/dist/types.backup/browser/app-shell.d.ts +0 -34
- package/dist/types.backup/browser/app-version.d.ts +0 -6
- package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
- package/dist/types.backup/browser/cookie-name.d.ts +0 -66
- package/dist/types.backup/browser/event-controller.d.ts +0 -221
- package/dist/types.backup/browser/history-state.d.ts +0 -26
- package/dist/types.backup/browser/index.d.ts +0 -1
- package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
- package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
- package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
- package/dist/types.backup/browser/logging.d.ts +0 -33
- package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
- package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
- package/dist/types.backup/browser/navigation-client.d.ts +0 -17
- package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
- package/dist/types.backup/browser/navigation-store.d.ts +0 -95
- package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
- package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
- package/dist/types.backup/browser/partial-update.d.ts +0 -61
- package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
- package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
- package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
- package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
- package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
- package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
- package/dist/types.backup/browser/rango-state.d.ts +0 -52
- package/dist/types.backup/browser/react/Link.d.ts +0 -140
- package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
- package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
- package/dist/types.backup/browser/react/context.d.ts +0 -54
- package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
- package/dist/types.backup/browser/react/index.d.ts +0 -1
- package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
- package/dist/types.backup/browser/react/location-state.d.ts +0 -29
- package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
- package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
- package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
- package/dist/types.backup/browser/react/use-action.d.ts +0 -61
- package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
- package/dist/types.backup/browser/react/use-href.d.ts +0 -32
- package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
- package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
- package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
- package/dist/types.backup/browser/react/use-params.d.ts +0 -21
- package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
- package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
- package/dist/types.backup/browser/react/use-router.d.ts +0 -23
- package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
- package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
- package/dist/types.backup/browser/response-adapter.d.ts +0 -58
- package/dist/types.backup/browser/rsc-router.d.ts +0 -141
- package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
- package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
- package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
- package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
- package/dist/types.backup/browser/types.d.ts +0 -530
- package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
- package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
- package/dist/types.backup/build/generate-manifest.d.ts +0 -100
- package/dist/types.backup/build/generate-route-types.d.ts +0 -8
- package/dist/types.backup/build/index.d.ts +0 -21
- package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
- package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
- package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
- package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
- package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
- package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
- package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
- package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
- package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
- package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
- package/dist/types.backup/cache/background-task.d.ts +0 -21
- package/dist/types.backup/cache/cache-error.d.ts +0 -71
- package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
- package/dist/types.backup/cache/cache-policy.d.ts +0 -59
- package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
- package/dist/types.backup/cache/cache-scope.d.ts +0 -134
- package/dist/types.backup/cache/cache-tag.d.ts +0 -79
- package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
- package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
- package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
- package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
- package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
- package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
- package/dist/types.backup/cache/cf/index.d.ts +0 -3
- package/dist/types.backup/cache/document-cache.d.ts +0 -69
- package/dist/types.backup/cache/handle-capture.d.ts +0 -23
- package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
- package/dist/types.backup/cache/index.d.ts +0 -7
- package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
- package/dist/types.backup/cache/profile-registry.d.ts +0 -40
- package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
- package/dist/types.backup/cache/segment-codec.d.ts +0 -78
- package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
- package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
- package/dist/types.backup/cache/taint.d.ts +0 -71
- package/dist/types.backup/cache/types.d.ts +0 -407
- package/dist/types.backup/cache/vercel/index.d.ts +0 -1
- package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
- package/dist/types.backup/client.d.ts +0 -184
- package/dist/types.backup/client.rsc.d.ts +0 -39
- package/dist/types.backup/cloudflare/index.d.ts +0 -7
- package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
- package/dist/types.backup/component-utils.d.ts +0 -46
- package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
- package/dist/types.backup/context-var.d.ts +0 -84
- package/dist/types.backup/debug.d.ts +0 -57
- package/dist/types.backup/decode-loader-results.d.ts +0 -5
- package/dist/types.backup/default-error-boundary.d.ts +0 -10
- package/dist/types.backup/defer.d.ts +0 -89
- package/dist/types.backup/deps/browser.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
- package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
- package/dist/types.backup/deps/rsc.d.ts +0 -1
- package/dist/types.backup/deps/ssr.d.ts +0 -1
- package/dist/types.backup/encode-kv.d.ts +0 -35
- package/dist/types.backup/errors.d.ts +0 -226
- package/dist/types.backup/escape-script.d.ts +0 -44
- package/dist/types.backup/handle.d.ts +0 -93
- package/dist/types.backup/handles/MetaTags.d.ts +0 -17
- package/dist/types.backup/handles/Scripts.d.ts +0 -38
- package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
- package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
- package/dist/types.backup/handles/is-thenable.d.ts +0 -12
- package/dist/types.backup/handles/meta.d.ts +0 -43
- package/dist/types.backup/handles/script.d.ts +0 -139
- package/dist/types.backup/host/cookie-handler.d.ts +0 -8
- package/dist/types.backup/host/errors.d.ts +0 -40
- package/dist/types.backup/host/index.d.ts +0 -33
- package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
- package/dist/types.backup/host/router.d.ts +0 -12
- package/dist/types.backup/host/testing.d.ts +0 -41
- package/dist/types.backup/host/types.d.ts +0 -148
- package/dist/types.backup/host/utils.d.ts +0 -20
- package/dist/types.backup/href-client.d.ts +0 -214
- package/dist/types.backup/index.d.ts +0 -112
- package/dist/types.backup/index.rsc.d.ts +0 -51
- package/dist/types.backup/internal-debug.d.ts +0 -1
- package/dist/types.backup/loader-store.d.ts +0 -193
- package/dist/types.backup/loader.d.ts +0 -18
- package/dist/types.backup/loader.rsc.d.ts +0 -18
- package/dist/types.backup/missing-id-error.d.ts +0 -1
- package/dist/types.backup/outlet-context.d.ts +0 -12
- package/dist/types.backup/outlet-provider.d.ts +0 -12
- package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
- package/dist/types.backup/prerender/param-hash.d.ts +0 -6
- package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
- package/dist/types.backup/prerender/store.d.ts +0 -62
- package/dist/types.backup/prerender.d.ts +0 -292
- package/dist/types.backup/redirect-origin.d.ts +0 -55
- package/dist/types.backup/regex-escape.d.ts +0 -6
- package/dist/types.backup/render-error-thrower.d.ts +0 -13
- package/dist/types.backup/response-utils.d.ts +0 -35
- package/dist/types.backup/reverse.d.ts +0 -206
- package/dist/types.backup/root-error-boundary.d.ts +0 -32
- package/dist/types.backup/route-content-wrapper.d.ts +0 -40
- package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
- package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
- package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
- package/dist/types.backup/route-definition/index.d.ts +0 -7
- package/dist/types.backup/route-definition/redirect.d.ts +0 -48
- package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
- package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
- package/dist/types.backup/route-definition.d.ts +0 -1
- package/dist/types.backup/route-map-builder.d.ts +0 -127
- package/dist/types.backup/route-name.d.ts +0 -27
- package/dist/types.backup/route-types.d.ts +0 -172
- package/dist/types.backup/router/basename.d.ts +0 -10
- package/dist/types.backup/router/content-negotiation.d.ts +0 -91
- package/dist/types.backup/router/debug-manifest.d.ts +0 -7
- package/dist/types.backup/router/error-handling.d.ts +0 -76
- package/dist/types.backup/router/find-match.d.ts +0 -19
- package/dist/types.backup/router/handler-context.d.ts +0 -41
- package/dist/types.backup/router/instrument.d.ts +0 -161
- package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
- package/dist/types.backup/router/lazy-includes.d.ts +0 -26
- package/dist/types.backup/router/loader-resolution.d.ts +0 -63
- package/dist/types.backup/router/logging.d.ts +0 -41
- package/dist/types.backup/router/manifest.d.ts +0 -8
- package/dist/types.backup/router/match-api.d.ts +0 -19
- package/dist/types.backup/router/match-context.d.ts +0 -184
- package/dist/types.backup/router/match-handlers.d.ts +0 -49
- package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
- package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
- package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
- package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
- package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
- package/dist/types.backup/router/match-pipelines.d.ts +0 -103
- package/dist/types.backup/router/match-result.d.ts +0 -114
- package/dist/types.backup/router/metrics.d.ts +0 -6
- package/dist/types.backup/router/middleware-types.d.ts +0 -74
- package/dist/types.backup/router/middleware.d.ts +0 -116
- package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
- package/dist/types.backup/router/params-util.d.ts +0 -8
- package/dist/types.backup/router/parse-pattern.d.ts +0 -38
- package/dist/types.backup/router/pattern-matching.d.ts +0 -169
- package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
- package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
- package/dist/types.backup/router/prerender-match.d.ts +0 -50
- package/dist/types.backup/router/preview-match.d.ts +0 -22
- package/dist/types.backup/router/request-classification.d.ts +0 -104
- package/dist/types.backup/router/revalidation.d.ts +0 -57
- package/dist/types.backup/router/route-snapshot.d.ts +0 -112
- package/dist/types.backup/router/router-context.d.ts +0 -137
- package/dist/types.backup/router/router-interfaces.d.ts +0 -432
- package/dist/types.backup/router/router-options.d.ts +0 -738
- package/dist/types.backup/router/router-registry.d.ts +0 -15
- package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
- package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
- package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
- package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
- package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
- package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
- package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
- package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
- package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
- package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
- package/dist/types.backup/router/segment-resolution.d.ts +0 -3
- package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
- package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
- package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
- package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
- package/dist/types.backup/router/telemetry.d.ts +0 -215
- package/dist/types.backup/router/timeout.d.ts +0 -68
- package/dist/types.backup/router/tracing.d.ts +0 -125
- package/dist/types.backup/router/trie-matching.d.ts +0 -32
- package/dist/types.backup/router/types.d.ts +0 -98
- package/dist/types.backup/router/url-params.d.ts +0 -26
- package/dist/types.backup/router.d.ts +0 -7
- package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
- package/dist/types.backup/rsc/full-payload.d.ts +0 -22
- package/dist/types.backup/rsc/handler-context.d.ts +0 -31
- package/dist/types.backup/rsc/handler.d.ts +0 -9
- package/dist/types.backup/rsc/helpers.d.ts +0 -213
- package/dist/types.backup/rsc/index.d.ts +0 -17
- package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
- package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
- package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
- package/dist/types.backup/rsc/nonce.d.ts +0 -28
- package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
- package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
- package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
- package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
- package/dist/types.backup/rsc/response-error.d.ts +0 -19
- package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
- package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
- package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
- package/dist/types.backup/rsc/server-action.d.ts +0 -68
- package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
- package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
- package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
- package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
- package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
- package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
- package/dist/types.backup/rsc/types.d.ts +0 -290
- package/dist/types.backup/runtime-env.d.ts +0 -1
- package/dist/types.backup/search-params.d.ts +0 -125
- package/dist/types.backup/segment-content-promise.d.ts +0 -13
- package/dist/types.backup/segment-fragments.d.ts +0 -56
- package/dist/types.backup/segment-loader-promise.d.ts +0 -22
- package/dist/types.backup/segment-system.d.ts +0 -84
- package/dist/types.backup/serialize.d.ts +0 -164
- package/dist/types.backup/server/context.d.ts +0 -494
- package/dist/types.backup/server/cookie-parse.d.ts +0 -10
- package/dist/types.backup/server/cookie-store.d.ts +0 -107
- package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
- package/dist/types.backup/server/handle-store.d.ts +0 -100
- package/dist/types.backup/server/loader-registry.d.ts +0 -32
- package/dist/types.backup/server/request-context.d.ts +0 -596
- package/dist/types.backup/server/root-layout.d.ts +0 -3
- package/dist/types.backup/server.d.ts +0 -15
- package/dist/types.backup/ssr/index.d.ts +0 -233
- package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
- package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
- package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
- package/dist/types.backup/static-handler.d.ts +0 -57
- package/dist/types.backup/testing/cache-status.d.ts +0 -63
- package/dist/types.backup/testing/collect-handle.d.ts +0 -20
- package/dist/types.backup/testing/dispatch.d.ts +0 -123
- package/dist/types.backup/testing/dom.entry.d.ts +0 -15
- package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
- package/dist/types.backup/testing/e2e/index.d.ts +0 -30
- package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
- package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
- package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
- package/dist/types.backup/testing/e2e/server.d.ts +0 -35
- package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
- package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
- package/dist/types.backup/testing/flight-tree.d.ts +0 -192
- package/dist/types.backup/testing/flight.d.ts +0 -115
- package/dist/types.backup/testing/flight.entry.d.ts +0 -27
- package/dist/types.backup/testing/generated-routes.d.ts +0 -66
- package/dist/types.backup/testing/index.d.ts +0 -52
- package/dist/types.backup/testing/internal/context.d.ts +0 -225
- package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
- package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
- package/dist/types.backup/testing/render-handler.d.ts +0 -160
- package/dist/types.backup/testing/render-route.d.ts +0 -246
- package/dist/types.backup/testing/run-loader.d.ts +0 -186
- package/dist/types.backup/testing/run-middleware.d.ts +0 -132
- package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
- package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
- package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
- package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
- package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
- package/dist/types.backup/testing/vitest.d.ts +0 -205
- package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
- package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
- package/dist/types.backup/theme/constants.d.ts +0 -39
- package/dist/types.backup/theme/index.d.ts +0 -29
- package/dist/types.backup/theme/theme-context.d.ts +0 -21
- package/dist/types.backup/theme/theme-script.d.ts +0 -26
- package/dist/types.backup/theme/types.d.ts +0 -162
- package/dist/types.backup/theme/use-theme.d.ts +0 -8
- package/dist/types.backup/types/boundaries.d.ts +0 -93
- package/dist/types.backup/types/cache-types.d.ts +0 -191
- package/dist/types.backup/types/error-types.d.ts +0 -114
- package/dist/types.backup/types/global-namespace.d.ts +0 -90
- package/dist/types.backup/types/handler-context.d.ts +0 -658
- package/dist/types.backup/types/index.d.ts +0 -11
- package/dist/types.backup/types/loader-types.d.ts +0 -182
- package/dist/types.backup/types/request-scope.d.ts +0 -93
- package/dist/types.backup/types/route-config.d.ts +0 -105
- package/dist/types.backup/types/route-entry.d.ts +0 -95
- package/dist/types.backup/types/segments.d.ts +0 -234
- package/dist/types.backup/types.d.ts +0 -1
- package/dist/types.backup/urls/include-helper.d.ts +0 -17
- package/dist/types.backup/urls/include-provider.d.ts +0 -27
- package/dist/types.backup/urls/index.d.ts +0 -6
- package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
- package/dist/types.backup/urls/path-helper.d.ts +0 -12
- package/dist/types.backup/urls/pattern-types.d.ts +0 -166
- package/dist/types.backup/urls/response-types.d.ts +0 -67
- package/dist/types.backup/urls/type-extraction.d.ts +0 -157
- package/dist/types.backup/urls/urls-function.d.ts +0 -24
- package/dist/types.backup/urls.d.ts +0 -1
- package/dist/types.backup/use-loader.d.ts +0 -150
- package/dist/types.backup/vercel/index.d.ts +0 -10
- package/dist/types.backup/vercel/tracing.d.ts +0 -70
- package/dist/types.backup/vite/debug.d.ts +0 -80
- package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
- package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
- package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
- package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
- package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
- package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
- package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
- package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
- package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
- package/dist/types.backup/vite/discovery/state.d.ts +0 -162
- package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
- package/dist/types.backup/vite/index.d.ts +0 -11
- package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
- package/dist/types.backup/vite/plugin-types.d.ts +0 -298
- package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
- package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
- package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
- package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
- package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
- package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
- package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
- package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
- package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
- package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
- package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
- package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
- package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
- package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
- package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
- package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
- package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
- package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
- package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
- package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
- package/dist/types.backup/vite/rango.d.ts +0 -29
- package/dist/types.backup/vite/router-discovery.d.ts +0 -23
- package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
- package/dist/types.backup/vite/utils/banner.d.ts +0 -2
- package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
- package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
- package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
- package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
- package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
- package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
- package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
- package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
package/src/build/route-trie.ts
CHANGED
|
@@ -1,153 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build-time Route Trie Construction
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* route matching at runtime.
|
|
4
|
+
* Adapts generated manifests to the runtime-owned route trie builder.
|
|
6
5
|
*/
|
|
7
6
|
|
|
8
|
-
import {
|
|
9
|
-
parsePattern,
|
|
10
|
-
type ParsedSegment,
|
|
11
|
-
} from "../router/pattern-matching.js";
|
|
12
|
-
import { buildRouteToStaticPrefix } from "./prefix-tree-utils.js";
|
|
7
|
+
import { buildRouteTrie, type TrieNode } from "../router/route-trie-builder.js";
|
|
13
8
|
import type { FullManifest } from "./generate-manifest.js";
|
|
9
|
+
import { buildRouteToStaticPrefix } from "./prefix-tree-utils.js";
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
* (the trie match extracts params under the PRIMARY leaf's pa). Omitted when the
|
|
22
|
-
* variant has no params; absent/identical pa means no re-key is needed.
|
|
23
|
-
*/
|
|
24
|
-
export interface NegotiateVariant {
|
|
25
|
-
routeKey: string;
|
|
26
|
-
responseType: string;
|
|
27
|
-
pa?: string[];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface TrieLeaf {
|
|
31
|
-
/** Route name (e.g., "site.l1_500") */
|
|
32
|
-
n: string;
|
|
33
|
-
/** Static prefix of the entry (e.g., "/site") */
|
|
34
|
-
sp: string;
|
|
35
|
-
/** Constraint validation: paramName -> allowed values */
|
|
36
|
-
cv?: Record<string, string[]>;
|
|
37
|
-
/** Ordered param names for this route (positional) */
|
|
38
|
-
pa?: string[];
|
|
39
|
-
/** Trailing slash mode */
|
|
40
|
-
ts?: string;
|
|
41
|
-
/** Route has pre-rendered data available */
|
|
42
|
-
pr?: true;
|
|
43
|
-
/** Passthrough: handler kept in bundle for live fallback on unknown params */
|
|
44
|
-
pt?: true;
|
|
45
|
-
/** Response type for non-RSC routes (json, text, image, any) */
|
|
46
|
-
rt?: string;
|
|
47
|
-
/** Negotiate variants: response-type routes sharing this path */
|
|
48
|
-
nv?: NegotiateVariant[];
|
|
49
|
-
/** RSC-first: RSC route was defined before response-type variants */
|
|
50
|
-
rf?: true;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface TrieNode {
|
|
54
|
-
/** Route terminal at this node */
|
|
55
|
-
r?: TrieLeaf;
|
|
56
|
-
/** Static segment children */
|
|
57
|
-
s?: Record<string, TrieNode>;
|
|
58
|
-
/** Param child: { n: paramName, c: child node } */
|
|
59
|
-
p?: { n: string; c: TrieNode };
|
|
60
|
-
/** Suffix-param children keyed by suffix (e.g., ".html" → { n: "productId", c: ... }) */
|
|
61
|
-
xp?: Record<string, { n: string; c: TrieNode }>;
|
|
62
|
-
/**
|
|
63
|
-
* Wildcard terminal: leaf + paramName (`pn`). `pn` is "*" for the bare `/*`
|
|
64
|
-
* form and the param name for a named catch-all (`:name+`/`:name*`). `w1`
|
|
65
|
-
* marks a one-or-more catch-all (`:name+`): the runtime walker then rejects
|
|
66
|
-
* the zero-segment/empty-remainder case. Absent `w1` is zero-or-more.
|
|
67
|
-
*/
|
|
68
|
-
w?: TrieLeaf & { pn: string; w1?: true };
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Build a route trie from build-time manifest data.
|
|
73
|
-
*
|
|
74
|
-
* @param routeManifest - Map of route name to full URL pattern
|
|
75
|
-
* @param routeToStaticPrefix - Map of route name to its entry's staticPrefix
|
|
76
|
-
* @param routeTrailingSlash - Optional map of route name to trailing slash mode
|
|
77
|
-
* @param prerenderRouteNames - Optional set of prerendered route names (sets leaf.pr)
|
|
78
|
-
* @param passthroughRouteNames - Optional set of passthrough route names (sets leaf.pt)
|
|
79
|
-
* @param responseTypeRoutes - Optional map of route name to response type (sets leaf.rt)
|
|
80
|
-
*/
|
|
81
|
-
export function buildRouteTrie(
|
|
82
|
-
routeManifest: Record<string, string>,
|
|
83
|
-
routeToStaticPrefix: Record<string, string>,
|
|
84
|
-
routeTrailingSlash?: Record<string, string>,
|
|
85
|
-
prerenderRouteNames?: Set<string>,
|
|
86
|
-
passthroughRouteNames?: Set<string>,
|
|
87
|
-
responseTypeRoutes?: Record<string, string>,
|
|
88
|
-
): TrieNode {
|
|
89
|
-
const root: TrieNode = {};
|
|
90
|
-
|
|
91
|
-
for (const [routeName, pattern] of Object.entries(routeManifest)) {
|
|
92
|
-
const staticPrefix = routeToStaticPrefix[routeName] || "";
|
|
93
|
-
const trailingSlash = routeTrailingSlash?.[routeName];
|
|
94
|
-
const responseType = responseTypeRoutes?.[routeName];
|
|
95
|
-
|
|
96
|
-
// Detect and strip trailing slash from pattern for parsing
|
|
97
|
-
const hasTrailingSlash = pattern.length > 1 && pattern.endsWith("/");
|
|
98
|
-
const normalizedPattern = hasTrailingSlash ? pattern.slice(0, -1) : pattern;
|
|
99
|
-
|
|
100
|
-
const segments = parsePattern(normalizedPattern);
|
|
101
|
-
insertRoute(root, segments, 0, {
|
|
102
|
-
n: routeName,
|
|
103
|
-
sp: staticPrefix,
|
|
104
|
-
...(trailingSlash ? { ts: trailingSlash } : {}),
|
|
105
|
-
...(prerenderRouteNames?.has(routeName) ? { pr: true } : {}),
|
|
106
|
-
...(passthroughRouteNames?.has(routeName) ? { pt: true } : {}),
|
|
107
|
-
...(responseType ? { rt: responseType } : {}),
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
sortSuffixParams(root);
|
|
112
|
-
return root;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Sort every node's suffix-param map (`node.xp`) by descending suffix length so
|
|
117
|
-
* the matcher tries the most specific suffix first. Overlapping suffixes like
|
|
118
|
-
* `.min.js` and `.js` must resolve by specificity, not route declaration order:
|
|
119
|
-
* a request for `/app.min.js` should match `:file.min.js`, not `:file.js`.
|
|
120
|
-
*
|
|
121
|
-
* This started as a bug — `walkTrie` iterates `node.xp` in object order and
|
|
122
|
-
* returns the first suffix the segment ends with, so the winner depended on
|
|
123
|
-
* which route was declared first. Sorting at build time fixes it allocation-free
|
|
124
|
-
* on the match hot path: the serialized production trie preserves this key order
|
|
125
|
-
* through JSON.parse, so dev (per-request rebuild) and production match
|
|
126
|
-
* identically. Array.prototype.sort is stable (ES2019+), so equal-length
|
|
127
|
-
* suffixes keep their declaration order — the router's existing tiebreak.
|
|
128
|
-
*/
|
|
129
|
-
function sortSuffixParams(node: TrieNode): void {
|
|
130
|
-
if (node.xp) {
|
|
131
|
-
const sorted: Record<string, { n: string; c: TrieNode }> = {};
|
|
132
|
-
for (const suffix of Object.keys(node.xp).sort(
|
|
133
|
-
(a, b) => b.length - a.length,
|
|
134
|
-
)) {
|
|
135
|
-
sorted[suffix] = node.xp[suffix];
|
|
136
|
-
}
|
|
137
|
-
node.xp = sorted;
|
|
138
|
-
for (const child of Object.values(node.xp)) {
|
|
139
|
-
sortSuffixParams(child.c);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (node.s) {
|
|
143
|
-
for (const child of Object.values(node.s)) {
|
|
144
|
-
sortSuffixParams(child);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
if (node.p) {
|
|
148
|
-
sortSuffixParams(node.p.c);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
11
|
+
export { buildRouteTrie };
|
|
12
|
+
export type {
|
|
13
|
+
NegotiateVariant,
|
|
14
|
+
TrieLeaf,
|
|
15
|
+
TrieNode,
|
|
16
|
+
} from "../router/route-trie-builder.js";
|
|
151
17
|
|
|
152
18
|
/**
|
|
153
19
|
* Build a per-router trie from a generated manifest. This is the single
|
|
@@ -186,192 +52,3 @@ export function buildPerRouterTrie(manifest: FullManifest): TrieNode | null {
|
|
|
186
52
|
manifest.responseTypeRoutes,
|
|
187
53
|
);
|
|
188
54
|
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Insert a route into the trie. Optional params expand into two branches at
|
|
192
|
-
* registration time (skip-first, then present), so each terminal lives at the
|
|
193
|
-
* correct depth for its number of bound params and carries a branch-local
|
|
194
|
-
* `pa` listing only those names. The trie's single-slot `node.p` is reused
|
|
195
|
-
* across branches because matching ignores `node.p.n` — the leaf's `pa` is
|
|
196
|
-
* the source of truth for naming. Skip-first ordering lets `mergeLeaf`'s
|
|
197
|
-
* last-wins rule produce greedy-leftmost semantics for free at any shared
|
|
198
|
-
* terminal depth.
|
|
199
|
-
*/
|
|
200
|
-
function insertRoute(
|
|
201
|
-
node: TrieNode,
|
|
202
|
-
segments: ParsedSegment[],
|
|
203
|
-
index: number,
|
|
204
|
-
leaf: Omit<TrieLeaf, "cv" | "pa">,
|
|
205
|
-
): void {
|
|
206
|
-
// cv (full constraint map) is route-level and identical on every terminal,
|
|
207
|
-
// so compute it once on the shared base.
|
|
208
|
-
const constraints: Record<string, string[]> = {};
|
|
209
|
-
|
|
210
|
-
for (const seg of segments) {
|
|
211
|
-
if (seg.type === "param") {
|
|
212
|
-
if (seg.constraint) {
|
|
213
|
-
constraints[seg.value] = seg.constraint;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const leafBase: Omit<TrieLeaf, "pa"> = {
|
|
219
|
-
...leaf,
|
|
220
|
-
...(Object.keys(constraints).length > 0 ? { cv: constraints } : {}),
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
insertSegments(node, segments, index, leafBase, []);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Merge a new leaf with an existing leaf, handling content negotiation.
|
|
228
|
-
* When an RSC route and response-type routes share the same URL pattern,
|
|
229
|
-
* the RSC route becomes the primary leaf and response-type routes are
|
|
230
|
-
* appended to the nv (negotiate variants) array.
|
|
231
|
-
* Multiple response types on the same path are supported (json + text + xml).
|
|
232
|
-
*/
|
|
233
|
-
/**
|
|
234
|
-
* Build a negotiate-variant entry from a leaf being folded into another leaf's
|
|
235
|
-
* nv list. Carries the variant's positional param names (`pa`) so the runtime
|
|
236
|
-
* can re-key matched params under the variant's names; omitted when the variant
|
|
237
|
-
* has none (the common case where primary and variant share the same names is a
|
|
238
|
-
* no-op re-key regardless).
|
|
239
|
-
*/
|
|
240
|
-
function toVariant(leaf: TrieLeaf, responseType: string): NegotiateVariant {
|
|
241
|
-
return leaf.pa
|
|
242
|
-
? { routeKey: leaf.n, responseType, pa: leaf.pa }
|
|
243
|
-
: { routeKey: leaf.n, responseType };
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
function mergeLeaves(existing: TrieLeaf | undefined, leaf: TrieLeaf): TrieLeaf {
|
|
247
|
-
if (!existing) return leaf;
|
|
248
|
-
|
|
249
|
-
if (existing.rt && leaf.rt) {
|
|
250
|
-
// Both are response-type: preserve old as variant
|
|
251
|
-
const merged = leaf;
|
|
252
|
-
merged.nv = existing.nv || [];
|
|
253
|
-
merged.nv.push(toVariant(existing, existing.rt));
|
|
254
|
-
return merged;
|
|
255
|
-
}
|
|
256
|
-
if (leaf.rt && !existing.rt) {
|
|
257
|
-
// RSC primary exists, new leaf is response-type: append variant
|
|
258
|
-
// RSC was defined first (it was already the existing leaf)
|
|
259
|
-
if (!existing.nv) {
|
|
260
|
-
existing.nv = [];
|
|
261
|
-
existing.rf = true;
|
|
262
|
-
}
|
|
263
|
-
existing.nv.push(toVariant(leaf, leaf.rt));
|
|
264
|
-
return existing;
|
|
265
|
-
}
|
|
266
|
-
if (!leaf.rt && existing.rt) {
|
|
267
|
-
// Response-type was primary, new leaf is RSC: swap and move old to variants
|
|
268
|
-
// RSC was defined second (response-type was already the existing leaf)
|
|
269
|
-
if (!leaf.nv) leaf.nv = [];
|
|
270
|
-
if (existing.nv) leaf.nv.push(...existing.nv);
|
|
271
|
-
leaf.nv.push(toVariant(existing, existing.rt));
|
|
272
|
-
// rf intentionally not set — RSC came after response-type variants
|
|
273
|
-
return leaf;
|
|
274
|
-
}
|
|
275
|
-
// Both RSC (last wins): overwrite
|
|
276
|
-
return leaf;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function mergeLeaf(node: TrieNode, leaf: TrieLeaf): void {
|
|
280
|
-
node.r = mergeLeaves(node.r, leaf);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function buildLeaf(
|
|
284
|
-
leafBase: Omit<TrieLeaf, "pa">,
|
|
285
|
-
paramNames: string[],
|
|
286
|
-
): TrieLeaf {
|
|
287
|
-
return paramNames.length > 0
|
|
288
|
-
? { ...leafBase, pa: [...paramNames] }
|
|
289
|
-
: { ...leafBase };
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function insertSegments(
|
|
293
|
-
node: TrieNode,
|
|
294
|
-
segments: ParsedSegment[],
|
|
295
|
-
index: number,
|
|
296
|
-
leafBase: Omit<TrieLeaf, "pa">,
|
|
297
|
-
paramNames: string[],
|
|
298
|
-
): void {
|
|
299
|
-
// Base case: all segments consumed, add terminal with branch-local pa
|
|
300
|
-
if (index >= segments.length) {
|
|
301
|
-
mergeLeaf(node, buildLeaf(leafBase, paramNames));
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const segment = segments[index];
|
|
306
|
-
|
|
307
|
-
if (segment.type === "static") {
|
|
308
|
-
if (!node.s) node.s = {};
|
|
309
|
-
if (!node.s[segment.value]) node.s[segment.value] = {};
|
|
310
|
-
insertSegments(
|
|
311
|
-
node.s[segment.value],
|
|
312
|
-
segments,
|
|
313
|
-
index + 1,
|
|
314
|
-
leafBase,
|
|
315
|
-
paramNames,
|
|
316
|
-
);
|
|
317
|
-
} else if (segment.type === "param") {
|
|
318
|
-
if (segment.optional) {
|
|
319
|
-
// SKIP first: continue at the same node without binding this name.
|
|
320
|
-
// Skip-first ordering means the present-branch's TAKE overwrites any
|
|
321
|
-
// shared terminal later, giving greedy-leftmost semantics.
|
|
322
|
-
insertSegments(node, segments, index + 1, leafBase, paramNames);
|
|
323
|
-
}
|
|
324
|
-
if (segment.suffix) {
|
|
325
|
-
// Suffix param: keyed by suffix string (e.g., ".html")
|
|
326
|
-
if (!node.xp) node.xp = {};
|
|
327
|
-
if (!node.xp[segment.suffix]) {
|
|
328
|
-
node.xp[segment.suffix] = { n: segment.value, c: {} };
|
|
329
|
-
}
|
|
330
|
-
insertSegments(node.xp[segment.suffix].c, segments, index + 1, leafBase, [
|
|
331
|
-
...paramNames,
|
|
332
|
-
segment.value,
|
|
333
|
-
]);
|
|
334
|
-
} else {
|
|
335
|
-
if (!node.p) {
|
|
336
|
-
node.p = { n: segment.value, c: {} };
|
|
337
|
-
}
|
|
338
|
-
insertSegments(node.p.c, segments, index + 1, leafBase, [
|
|
339
|
-
...paramNames,
|
|
340
|
-
segment.value,
|
|
341
|
-
]);
|
|
342
|
-
}
|
|
343
|
-
} else if (segment.type === "wildcard") {
|
|
344
|
-
// Wildcard consumes all remaining segments. Carry any params bound before
|
|
345
|
-
// the wildcard in pa so they zip correctly against paramValues at match.
|
|
346
|
-
// `pn` is "*" for the bare `/*` and the param name for a named catch-all;
|
|
347
|
-
// `w1` marks the one-or-more variant (`:name+`) so the walker rejects the
|
|
348
|
-
// empty-remainder case.
|
|
349
|
-
const wildLeaf: TrieLeaf & { pn: string; w1?: true } = {
|
|
350
|
-
...buildLeaf(leafBase, paramNames),
|
|
351
|
-
pn: segment.value,
|
|
352
|
-
...(segment.oneOrMore ? { w1: true as const } : {}),
|
|
353
|
-
};
|
|
354
|
-
const existing = node.w;
|
|
355
|
-
// Merge when there's no existing wildcard, when this is a response-type
|
|
356
|
-
// content-negotiation variant of the same catch-all (one side carries `rt`),
|
|
357
|
-
// or when it's the SAME catch-all identity (same param name + arity).
|
|
358
|
-
// Otherwise two DISTINCT catch-all forms (`/x/*` vs `/x/:p+`) would collide on
|
|
359
|
-
// the single wildcard slot with no non-lossy merge — so keep the first-declared
|
|
360
|
-
// (matching the regex matcher's declaration-order tiebreak) rather than let
|
|
361
|
-
// mergeLeaves' last-wins overwrite silently drop its `pn`/`w1` identity (which
|
|
362
|
-
// stranded the first route and fell through to a corrupt regex-fallback redirect).
|
|
363
|
-
const canMerge =
|
|
364
|
-
existing === undefined ||
|
|
365
|
-
Boolean(existing.rt) ||
|
|
366
|
-
Boolean(wildLeaf.rt) ||
|
|
367
|
-
(existing.pn === wildLeaf.pn &&
|
|
368
|
-
Boolean(existing.w1) === Boolean(wildLeaf.w1));
|
|
369
|
-
if (canMerge) {
|
|
370
|
-
const merged = mergeLeaves(
|
|
371
|
-
existing ? ({ ...existing } as TrieLeaf) : undefined,
|
|
372
|
-
wildLeaf,
|
|
373
|
-
);
|
|
374
|
-
node.w = merged as TrieLeaf & { pn: string; w1?: true };
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
@@ -77,6 +77,14 @@ function readSourceMemoized(
|
|
|
77
77
|
return source;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
function isUrlsDefinitionCall(node: ts.CallExpression): boolean {
|
|
81
|
+
const callee = node.expression;
|
|
82
|
+
return (
|
|
83
|
+
ts.isIdentifier(callee) &&
|
|
84
|
+
(callee.text === "urls" || callee.text === "clientUrls")
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
80
88
|
// ---------------------------------------------------------------------------
|
|
81
89
|
// AST-based include() parsing
|
|
82
90
|
// ---------------------------------------------------------------------------
|
|
@@ -206,10 +214,9 @@ function extractDynamicImportSpecifier(node: ts.Expression): string | null {
|
|
|
206
214
|
}
|
|
207
215
|
|
|
208
216
|
/**
|
|
209
|
-
* Resolve a module's `export default` to either a same-file
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
* (`() => import("./mod")`), whose convention is `export default urls(...)`.
|
|
217
|
+
* Resolve a module's `export default` to either a same-file route variable name
|
|
218
|
+
* (`export default shopPatterns`) or an inline urls()/clientUrls() call block.
|
|
219
|
+
* Used for default imports and to walk async include modules.
|
|
213
220
|
*/
|
|
214
221
|
function resolveDefaultExportTarget(
|
|
215
222
|
code: string,
|
|
@@ -223,11 +230,8 @@ function resolveDefaultExportTarget(
|
|
|
223
230
|
const expr = node.expression;
|
|
224
231
|
if (ts.isIdentifier(expr)) {
|
|
225
232
|
result = { variableName: expr.text };
|
|
226
|
-
} else if (ts.isCallExpression(expr)) {
|
|
227
|
-
|
|
228
|
-
if (ts.isIdentifier(callee) && callee.text === "urls") {
|
|
229
|
-
result = { inlineBlock: expr.getText(sourceFile) };
|
|
230
|
-
}
|
|
233
|
+
} else if (ts.isCallExpression(expr) && isUrlsDefinitionCall(expr)) {
|
|
234
|
+
result = { inlineBlock: expr.getText(sourceFile) };
|
|
231
235
|
}
|
|
232
236
|
return;
|
|
233
237
|
}
|
|
@@ -358,6 +362,16 @@ export function resolveImportedVariable(
|
|
|
358
362
|
code: string,
|
|
359
363
|
localName: string,
|
|
360
364
|
): { specifier: string; exportedName: string } | null {
|
|
365
|
+
const defaultImportRegex =
|
|
366
|
+
/import\s+([\w$]+)\s*(?:,\s*\{[^}]*\})?\s+from\s*["']([^"']+)["']/g;
|
|
367
|
+
let defaultMatch;
|
|
368
|
+
|
|
369
|
+
while ((defaultMatch = defaultImportRegex.exec(code)) !== null) {
|
|
370
|
+
if (defaultMatch[1] === localName) {
|
|
371
|
+
return { specifier: defaultMatch[2], exportedName: "default" };
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
361
375
|
// Allow an optional leading default binding before the named-import brace so
|
|
362
376
|
// a combined `import Foo, { bar } from "..."` is matched (the named members
|
|
363
377
|
// are the only part we resolve; the default binding is skipped). Without the
|
|
@@ -453,8 +467,7 @@ function extractUrlsBlockForVariable(
|
|
|
453
467
|
node.initializer &&
|
|
454
468
|
ts.isCallExpression(node.initializer)
|
|
455
469
|
) {
|
|
456
|
-
|
|
457
|
-
if (ts.isIdentifier(callee) && callee.text === "urls") {
|
|
470
|
+
if (isUrlsDefinitionCall(node.initializer)) {
|
|
458
471
|
result = node.initializer.getText(sourceFile);
|
|
459
472
|
return;
|
|
460
473
|
}
|
|
@@ -780,6 +793,48 @@ export function buildCombinedRouteMapWithSearch(
|
|
|
780
793
|
let block: string;
|
|
781
794
|
if (inlineBlock) {
|
|
782
795
|
block = inlineBlock;
|
|
796
|
+
} else if (variableName === "default") {
|
|
797
|
+
const defaultTarget = resolveDefaultExportTarget(
|
|
798
|
+
source,
|
|
799
|
+
parseBlock(memo, source),
|
|
800
|
+
);
|
|
801
|
+
if (!defaultTarget) {
|
|
802
|
+
visited.delete(key);
|
|
803
|
+
return { routes: {}, searchSchemas: {} };
|
|
804
|
+
}
|
|
805
|
+
if (defaultTarget.inlineBlock) {
|
|
806
|
+
block = defaultTarget.inlineBlock;
|
|
807
|
+
} else {
|
|
808
|
+
const targetName = defaultTarget.variableName!;
|
|
809
|
+
const imported = resolveImportedVariable(source, targetName);
|
|
810
|
+
if (imported) {
|
|
811
|
+
const targetFile = resolveImportPath(imported.specifier, realPath);
|
|
812
|
+
if (!targetFile) {
|
|
813
|
+
visited.delete(key);
|
|
814
|
+
return { routes: {}, searchSchemas: {} };
|
|
815
|
+
}
|
|
816
|
+
const result = buildCombinedRouteMapWithSearch(
|
|
817
|
+
targetFile,
|
|
818
|
+
imported.exportedName,
|
|
819
|
+
visited,
|
|
820
|
+
diagnosticsOut,
|
|
821
|
+
undefined,
|
|
822
|
+
memo,
|
|
823
|
+
);
|
|
824
|
+
visited.delete(key);
|
|
825
|
+
return result;
|
|
826
|
+
}
|
|
827
|
+
const extracted = extractUrlsBlockForVariable(
|
|
828
|
+
source,
|
|
829
|
+
targetName,
|
|
830
|
+
parseBlock(memo, source),
|
|
831
|
+
);
|
|
832
|
+
if (!extracted) {
|
|
833
|
+
visited.delete(key);
|
|
834
|
+
return { routes: {}, searchSchemas: {} };
|
|
835
|
+
}
|
|
836
|
+
block = extracted;
|
|
837
|
+
}
|
|
783
838
|
} else if (variableName) {
|
|
784
839
|
const extracted = extractUrlsBlockForVariable(
|
|
785
840
|
source,
|
|
@@ -12,8 +12,9 @@ import { findTsFiles } from "./scan-filter.js";
|
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Generate per-module route type files by statically parsing url module source.
|
|
15
|
-
* Scans for files containing `urls(` and writes a sibling
|
|
16
|
-
* extracted route name/pattern pairs. Only writes when
|
|
15
|
+
* Scans for files containing `urls(` or `clientUrls(` and writes a sibling
|
|
16
|
+
* `.gen.ts` with the extracted route name/pattern pairs. Only writes when
|
|
17
|
+
* content has changed.
|
|
17
18
|
*/
|
|
18
19
|
export function writePerModuleRouteTypes(
|
|
19
20
|
root: string,
|
|
@@ -26,7 +27,7 @@ export function writePerModuleRouteTypes(
|
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
|
-
* Find all variable names assigned to urls() calls in source
|
|
30
|
+
* Find all variable names assigned to urls() or clientUrls() calls in source.
|
|
30
31
|
* e.g. `export const patterns = urls(...)` -> ["patterns"]
|
|
31
32
|
*/
|
|
32
33
|
export function findUrlsVariableNames(code: string): string[] {
|
|
@@ -47,7 +48,10 @@ export function findUrlsVariableNames(code: string): string[] {
|
|
|
47
48
|
ts.isCallExpression(node.initializer)
|
|
48
49
|
) {
|
|
49
50
|
const callee = node.initializer.expression;
|
|
50
|
-
if (
|
|
51
|
+
if (
|
|
52
|
+
ts.isIdentifier(callee) &&
|
|
53
|
+
(callee.text === "urls" || callee.text === "clientUrls")
|
|
54
|
+
) {
|
|
51
55
|
names.push(node.name.text);
|
|
52
56
|
}
|
|
53
57
|
}
|
|
@@ -61,12 +65,13 @@ export function findUrlsVariableNames(code: string): string[] {
|
|
|
61
65
|
/**
|
|
62
66
|
* Generate per-module route types for a single url module file.
|
|
63
67
|
* Follows include() calls recursively to produce the full route tree.
|
|
64
|
-
* No-ops if the file doesn't contain `urls(` or has no named
|
|
68
|
+
* No-ops if the file doesn't contain `urls(`/`clientUrls(` or has no named
|
|
69
|
+
* routes.
|
|
65
70
|
*/
|
|
66
71
|
export function writePerModuleRouteTypesForFile(filePath: string): void {
|
|
67
72
|
try {
|
|
68
73
|
const source = readFileSync(filePath, "utf-8");
|
|
69
|
-
if (!source.includes("urls(")) return;
|
|
74
|
+
if (!source.includes("urls(") && !source.includes("clientUrls(")) return;
|
|
70
75
|
|
|
71
76
|
const varNames = findUrlsVariableNames(source);
|
|
72
77
|
|