@rangojs/router 0.0.0-experimental.a769fbe7 → 0.0.0-experimental.ac99d918
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 +211 -43
- package/dist/bin/rango.js +279 -102
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3313 -1160
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +62 -11
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +63 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +222 -30
- package/skills/caching/SKILL.md +263 -8
- package/skills/composability/SKILL.md +27 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +250 -30
- package/skills/host-router/SKILL.md +124 -22
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +49 -5
- package/skills/layout/SKILL.md +35 -9
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +223 -9
- package/skills/middleware/SKILL.md +52 -13
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +77 -7
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +250 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +122 -47
- package/skills/route/SKILL.md +66 -5
- package/skills/router-setup/SKILL.md +38 -3
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/typesafety/SKILL.md +319 -27
- package/skills/use-cache/SKILL.md +36 -5
- package/skills/vercel/SKILL.md +107 -0
- package/skills/view-transitions/SKILL.md +294 -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/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +81 -147
- 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/navigation-bridge.ts +66 -14
- package/src/browser/navigation-client.ts +172 -109
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +76 -67
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/partial-update.ts +79 -93
- package/src/browser/prefetch/cache.ts +180 -62
- package/src/browser/prefetch/fetch.ts +252 -39
- package/src/browser/prefetch/queue.ts +42 -8
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +72 -10
- package/src/browser/react/NavigationProvider.tsx +83 -31
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +49 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +166 -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-link-status.ts +0 -4
- package/src/browser/react/use-navigation.ts +22 -5
- 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 +52 -1
- package/src/browser/rsc-router.tsx +111 -24
- package/src/browser/scroll-restoration.ts +29 -19
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +176 -62
- package/src/browser/types.ts +60 -11
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +6 -0
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +137 -32
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +333 -94
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-policy.ts +68 -28
- package/src/cache/cache-runtime.ts +134 -32
- package/src/cache/cache-scope.ts +100 -74
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2256 -241
- package/src/cache/cf/index.ts +6 -16
- package/src/cache/document-cache.ts +61 -20
- package/src/cache/handle-snapshot.ts +63 -0
- package/src/cache/index.ts +22 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +6 -30
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +0 -16
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +33 -100
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +799 -0
- package/src/client.rsc.tsx +6 -21
- package/src/client.tsx +108 -290
- package/src/component-utils.ts +19 -0
- package/src/context-var.ts +17 -5
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/browser.ts +0 -1
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +30 -4
- package/src/handle.ts +70 -22
- package/src/handles/MetaTags.tsx +0 -14
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/handles/meta.ts +0 -39
- package/src/host/cookie-handler.ts +0 -36
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +7 -50
- 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 +69 -10
- package/src/index.ts +112 -14
- package/src/internal-debug.ts +2 -4
- 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/network-error-thrower.tsx +1 -6
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +10 -11
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +198 -82
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +7 -72
- package/src/route-definition/dsl-helpers.ts +413 -275
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +107 -32
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +50 -8
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +108 -9
- package/src/router/error-handling.ts +13 -17
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +46 -30
- package/src/router/intercept-resolution.ts +23 -23
- package/src/router/lazy-includes.ts +15 -52
- package/src/router/loader-resolution.ts +207 -30
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +40 -42
- package/src/router/match-api.ts +120 -204
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +0 -7
- package/src/router/match-middleware/cache-lookup.ts +161 -262
- package/src/router/match-middleware/cache-store.ts +3 -33
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +45 -14
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +87 -39
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +7 -140
- package/src/router/middleware.ts +169 -140
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +109 -63
- package/src/router/prerender-match.ts +190 -54
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +63 -55
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +0 -27
- package/src/router/router-interfaces.ts +100 -35
- package/src/router/router-options.ts +91 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +119 -65
- package/src/router/segment-resolution/helpers.ts +34 -0
- package/src/router/segment-resolution/loader-cache.ts +40 -37
- package/src/router/segment-resolution/revalidation.ts +329 -305
- 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 +36 -0
- package/src/router/segment-resolution.ts +4 -1
- package/src/router/segment-wrappers.ts +0 -3
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +0 -20
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/trie-matching.ts +91 -46
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +128 -42
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +492 -409
- package/src/rsc/helpers.ts +162 -46
- package/src/rsc/index.ts +1 -1
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +18 -3
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +28 -4
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +90 -63
- package/src/rsc/rsc-rendering.ts +53 -56
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +74 -69
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +22 -9
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -20
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +208 -201
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +211 -52
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +26 -24
- package/src/server/loader-registry.ts +10 -28
- package/src/server/request-context.ts +289 -124
- package/src/ssr/index.tsx +22 -15
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -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 +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -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 +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -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 +0 -52
- package/src/theme/ThemeScript.tsx +0 -6
- package/src/theme/constants.ts +0 -12
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +0 -14
- 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 +124 -70
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +40 -11
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +12 -7
- package/src/types/segments.ts +36 -15
- package/src/urls/include-helper.ts +33 -70
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +58 -11
- package/src/urls/path-helper.ts +57 -111
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -18
- package/src/use-loader.tsx +346 -89
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +192 -99
- 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 +51 -4
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +8 -0
- package/src/vite/plugin-types.ts +236 -6
- package/src/vite/plugins/cjs-to-esm.ts +8 -18
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/plugins/expose-action-id.ts +48 -95
- package/src/vite/plugins/expose-id-utils.ts +11 -50
- package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
- package/src/vite/plugins/expose-internal-ids.ts +554 -317
- package/src/vite/plugins/performance-tracks.ts +65 -207
- 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 +258 -0
- package/src/vite/plugins/version-injector.ts +21 -25
- package/src/vite/plugins/version-plugin.ts +32 -23
- package/src/vite/plugins/virtual-entries.ts +46 -17
- package/src/vite/rango.ts +207 -125
- package/src/vite/router-discovery.ts +931 -133
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/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 +27 -29
- package/src/vite/utils/shared-utils.ts +97 -44
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/debug-channel.ts +0 -93
- 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/router/middleware-cookies.ts +0 -55
package/dist/bin/rango.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __esm = (fn, res) => function __init() {
|
|
5
|
-
|
|
4
|
+
var __esm = (fn, res, err) => function __init() {
|
|
5
|
+
if (err) throw err[0];
|
|
6
|
+
try {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
} catch (e) {
|
|
9
|
+
throw err = [e], e;
|
|
10
|
+
}
|
|
6
11
|
};
|
|
7
12
|
var __export = (target, all) => {
|
|
8
13
|
for (var name in all)
|
|
@@ -22,10 +27,10 @@ function extractParamsFromPattern(pattern) {
|
|
|
22
27
|
function formatRouteEntry(key, pattern, _params, search) {
|
|
23
28
|
const hasSearch = search && Object.keys(search).length > 0;
|
|
24
29
|
if (!hasSearch) {
|
|
25
|
-
return ` ${key}:
|
|
30
|
+
return ` ${key}: ${JSON.stringify(pattern)},`;
|
|
26
31
|
}
|
|
27
|
-
const searchBody = Object.entries(search).map(([k, v]) => `${k}:
|
|
28
|
-
return ` ${key}: { path:
|
|
32
|
+
const searchBody = Object.entries(search).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ");
|
|
33
|
+
return ` ${key}: { path: ${JSON.stringify(pattern)}, search: { ${searchBody} } },`;
|
|
29
34
|
}
|
|
30
35
|
var init_param_extraction = __esm({
|
|
31
36
|
"src/build/route-types/param-extraction.ts"() {
|
|
@@ -139,7 +144,7 @@ function generatePerModuleTypesSource(routes) {
|
|
|
139
144
|
const valid = routes.filter(({ name }) => {
|
|
140
145
|
if (!name || /["'\\`\n\r]/.test(name)) {
|
|
141
146
|
console.warn(
|
|
142
|
-
`[
|
|
147
|
+
`[rango] Skipping route with invalid name: ${JSON.stringify(name)}`
|
|
143
148
|
);
|
|
144
149
|
return false;
|
|
145
150
|
}
|
|
@@ -149,7 +154,7 @@ function generatePerModuleTypesSource(routes) {
|
|
|
149
154
|
for (const { name, pattern, params, search } of valid) {
|
|
150
155
|
if (deduped.has(name)) {
|
|
151
156
|
console.warn(
|
|
152
|
-
`[
|
|
157
|
+
`[rango] Duplicate route name "${name}" \u2014 keeping first definition`
|
|
153
158
|
);
|
|
154
159
|
continue;
|
|
155
160
|
}
|
|
@@ -186,7 +191,7 @@ ${objectBody}
|
|
|
186
191
|
} as const;
|
|
187
192
|
|
|
188
193
|
declare global {
|
|
189
|
-
namespace
|
|
194
|
+
namespace Rango {
|
|
190
195
|
interface GeneratedRouteMap extends Readonly<typeof NamedRoutes> {}
|
|
191
196
|
}
|
|
192
197
|
}
|
|
@@ -211,14 +216,15 @@ function findTsFiles(dir, filter) {
|
|
|
211
216
|
entries = readdirSync(dir, { withFileTypes: true });
|
|
212
217
|
} catch (err) {
|
|
213
218
|
console.warn(
|
|
214
|
-
`[
|
|
219
|
+
`[rango] Failed to scan directory ${dir}: ${err.message}`
|
|
215
220
|
);
|
|
216
221
|
return results;
|
|
217
222
|
}
|
|
218
223
|
for (const entry of entries) {
|
|
219
224
|
const fullPath = join(dir, entry.name);
|
|
220
225
|
if (entry.isDirectory()) {
|
|
221
|
-
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
226
|
+
if (entry.name === "node_modules" || entry.name.startsWith(".") || entry.name === "dist" || entry.name === "build" || entry.name === "coverage")
|
|
227
|
+
continue;
|
|
222
228
|
results.push(...findTsFiles(fullPath, filter));
|
|
223
229
|
} else if ((entry.name.endsWith(".ts") || entry.name.endsWith(".tsx") || entry.name.endsWith(".js") || entry.name.endsWith(".jsx")) && !entry.name.includes(".gen.")) {
|
|
224
230
|
if (filter && !filter(fullPath)) continue;
|
|
@@ -450,12 +456,12 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
|
|
|
450
456
|
}
|
|
451
457
|
return routeMap;
|
|
452
458
|
}
|
|
453
|
-
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut) {
|
|
459
|
+
function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock) {
|
|
454
460
|
visited = visited ?? /* @__PURE__ */ new Set();
|
|
455
461
|
const realPath = resolve(filePath);
|
|
456
462
|
const key = variableName ? `${realPath}:${variableName}` : realPath;
|
|
457
463
|
if (visited.has(key)) {
|
|
458
|
-
console.warn(`[
|
|
464
|
+
console.warn(`[rango] Circular include detected, skipping: ${key}`);
|
|
459
465
|
return { routes: {}, searchSchemas: {} };
|
|
460
466
|
}
|
|
461
467
|
visited.add(key);
|
|
@@ -466,7 +472,9 @@ function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagno
|
|
|
466
472
|
return { routes: {}, searchSchemas: {} };
|
|
467
473
|
}
|
|
468
474
|
let block;
|
|
469
|
-
if (
|
|
475
|
+
if (inlineBlock) {
|
|
476
|
+
block = inlineBlock;
|
|
477
|
+
} else if (variableName) {
|
|
470
478
|
const extracted = extractUrlsBlockForVariable(source, variableName);
|
|
471
479
|
if (!extracted) return { routes: {}, searchSchemas: {} };
|
|
472
480
|
block = extracted;
|
|
@@ -540,12 +548,12 @@ function writePerModuleRouteTypesForFile(filePath) {
|
|
|
540
548
|
} else {
|
|
541
549
|
routes = extractRoutesFromSource(source);
|
|
542
550
|
}
|
|
543
|
-
const genPath = filePath.replace(/\.(tsx?)$/, ".gen.ts");
|
|
551
|
+
const genPath = filePath.replace(/\.(tsx?|jsx?)$/, ".gen.ts");
|
|
544
552
|
if (routes.length === 0) {
|
|
545
553
|
if (varNames.length > 0 && !existsSync2(genPath)) {
|
|
546
554
|
writeFileSync(genPath, generatePerModuleTypesSource([]));
|
|
547
555
|
console.log(
|
|
548
|
-
`[
|
|
556
|
+
`[rango] Generated route types (placeholder) -> ${genPath}`
|
|
549
557
|
);
|
|
550
558
|
}
|
|
551
559
|
return;
|
|
@@ -554,11 +562,11 @@ function writePerModuleRouteTypesForFile(filePath) {
|
|
|
554
562
|
const existing = existsSync2(genPath) ? readFileSync2(genPath, "utf-8") : null;
|
|
555
563
|
if (existing !== genSource) {
|
|
556
564
|
writeFileSync(genPath, genSource);
|
|
557
|
-
console.log(`[
|
|
565
|
+
console.log(`[rango] Generated route types -> ${genPath}`);
|
|
558
566
|
}
|
|
559
567
|
} catch (err) {
|
|
560
568
|
console.warn(
|
|
561
|
-
`[
|
|
569
|
+
`[rango] Failed to generate route types for ${filePath}: ${err.message}`
|
|
562
570
|
);
|
|
563
571
|
}
|
|
564
572
|
}
|
|
@@ -573,6 +581,75 @@ var init_per_module_writer = __esm({
|
|
|
573
581
|
}
|
|
574
582
|
});
|
|
575
583
|
|
|
584
|
+
// src/build/route-types/source-scan.ts
|
|
585
|
+
function isLineTerminator(ch) {
|
|
586
|
+
const c = ch.charCodeAt(0);
|
|
587
|
+
return c === 10 || c === 13 || c === 8232 || c === 8233;
|
|
588
|
+
}
|
|
589
|
+
function makeCodeClassifier(code) {
|
|
590
|
+
const n = code.length;
|
|
591
|
+
let i = 0;
|
|
592
|
+
let skipStart = -1;
|
|
593
|
+
let skipEnd = -1;
|
|
594
|
+
return (q) => {
|
|
595
|
+
if (q >= skipStart && q < skipEnd) return false;
|
|
596
|
+
while (i < n && i <= q) {
|
|
597
|
+
const c = code[i];
|
|
598
|
+
const d = i + 1 < n ? code[i + 1] : "";
|
|
599
|
+
let end = -1;
|
|
600
|
+
if (c === "/" && d === "/") {
|
|
601
|
+
let j = i + 2;
|
|
602
|
+
while (j < n && !isLineTerminator(code[j])) j++;
|
|
603
|
+
end = j;
|
|
604
|
+
} else if (c === "/" && d === "*") {
|
|
605
|
+
let j = i + 2;
|
|
606
|
+
while (j < n && !(code[j] === "*" && code[j + 1] === "/")) j++;
|
|
607
|
+
end = Math.min(n, j + 2);
|
|
608
|
+
} else if (c === '"' || c === "'" || c === "`") {
|
|
609
|
+
let j = i + 1;
|
|
610
|
+
while (j < n) {
|
|
611
|
+
if (code[j] === "\\") {
|
|
612
|
+
j += 2;
|
|
613
|
+
continue;
|
|
614
|
+
}
|
|
615
|
+
if (code[j] === c) {
|
|
616
|
+
j++;
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
j++;
|
|
620
|
+
}
|
|
621
|
+
end = j;
|
|
622
|
+
}
|
|
623
|
+
if (end >= 0) {
|
|
624
|
+
if (q < end) {
|
|
625
|
+
skipStart = i;
|
|
626
|
+
skipEnd = end;
|
|
627
|
+
return false;
|
|
628
|
+
}
|
|
629
|
+
i = end;
|
|
630
|
+
} else {
|
|
631
|
+
i++;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
return true;
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
function firstCodeMatchIndex(code, pattern) {
|
|
638
|
+
const inCode = makeCodeClassifier(code);
|
|
639
|
+
pattern.lastIndex = 0;
|
|
640
|
+
let m;
|
|
641
|
+
while ((m = pattern.exec(code)) !== null) {
|
|
642
|
+
if (inCode(m.index)) return m.index;
|
|
643
|
+
if (pattern.lastIndex <= m.index) pattern.lastIndex = m.index + 1;
|
|
644
|
+
}
|
|
645
|
+
return -1;
|
|
646
|
+
}
|
|
647
|
+
var init_source_scan = __esm({
|
|
648
|
+
"src/build/route-types/source-scan.ts"() {
|
|
649
|
+
"use strict";
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
|
|
576
653
|
// src/build/route-types/router-processing.ts
|
|
577
654
|
import {
|
|
578
655
|
readFileSync as readFileSync3,
|
|
@@ -609,7 +686,7 @@ function findRouterFilesRecursive(dir, filter, results) {
|
|
|
609
686
|
entries = readdirSync2(dir, { withFileTypes: true });
|
|
610
687
|
} catch (err) {
|
|
611
688
|
console.warn(
|
|
612
|
-
`[
|
|
689
|
+
`[rango] Failed to scan directory ${dir}: ${err.message}`
|
|
613
690
|
);
|
|
614
691
|
return;
|
|
615
692
|
}
|
|
@@ -627,7 +704,7 @@ function findRouterFilesRecursive(dir, filter, results) {
|
|
|
627
704
|
if (filter && !filter(fullPath)) continue;
|
|
628
705
|
try {
|
|
629
706
|
const source = readFileSync3(fullPath, "utf-8");
|
|
630
|
-
if (ROUTER_CALL_PATTERN.test(source)) {
|
|
707
|
+
if (ROUTER_CALL_PATTERN.test(source) && firstCodeMatchIndex(source, ROUTER_CALL_PATTERN_G) >= 0) {
|
|
631
708
|
routerFilesInDir.push(fullPath);
|
|
632
709
|
}
|
|
633
710
|
} catch {
|
|
@@ -665,13 +742,13 @@ function findNestedRouterConflict(routerFiles) {
|
|
|
665
742
|
}
|
|
666
743
|
return null;
|
|
667
744
|
}
|
|
668
|
-
function formatNestedRouterConflictError(conflict, prefix = "[
|
|
745
|
+
function formatNestedRouterConflictError(conflict, prefix = "[rango]") {
|
|
669
746
|
return `${prefix} Nested router roots are not supported.
|
|
670
747
|
Router root: ${conflict.ancestor}
|
|
671
748
|
Nested router: ${conflict.nested}
|
|
672
749
|
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
673
750
|
}
|
|
674
|
-
function
|
|
751
|
+
function extractUrlsFromRouter(code) {
|
|
675
752
|
const sourceFile = ts5.createSourceFile(
|
|
676
753
|
"router.tsx",
|
|
677
754
|
code,
|
|
@@ -685,24 +762,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
685
762
|
const callee = node.expression;
|
|
686
763
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
687
764
|
}
|
|
765
|
+
function isInlineBuilder(node) {
|
|
766
|
+
return ts5.isArrowFunction(node) || ts5.isFunctionExpression(node);
|
|
767
|
+
}
|
|
768
|
+
function isRoutesOnCreateRouter(node) {
|
|
769
|
+
if (!ts5.isPropertyAccessExpression(node.expression) || node.expression.name.text !== "routes")
|
|
770
|
+
return false;
|
|
771
|
+
let inner = node.expression.expression;
|
|
772
|
+
while (ts5.isCallExpression(inner) && ts5.isPropertyAccessExpression(inner.expression)) {
|
|
773
|
+
inner = inner.expression.expression;
|
|
774
|
+
}
|
|
775
|
+
return isCreateRouterCall(inner);
|
|
776
|
+
}
|
|
688
777
|
function visit(node) {
|
|
689
778
|
if (result) return;
|
|
690
|
-
if (ts5.isCallExpression(node) &&
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
result = node.arguments[0].text;
|
|
697
|
-
return;
|
|
779
|
+
if (ts5.isCallExpression(node) && node.arguments.length >= 1 && isRoutesOnCreateRouter(node)) {
|
|
780
|
+
const arg = node.arguments[0];
|
|
781
|
+
if (ts5.isIdentifier(arg)) {
|
|
782
|
+
result = { kind: "variable", name: arg.text };
|
|
783
|
+
} else if (isInlineBuilder(arg)) {
|
|
784
|
+
result = { kind: "inline", block: arg.getText(sourceFile) };
|
|
698
785
|
}
|
|
786
|
+
return;
|
|
699
787
|
}
|
|
700
788
|
if (isCreateRouterCall(node)) {
|
|
701
789
|
const callExpr = node;
|
|
702
|
-
for (const
|
|
790
|
+
for (const callArg of callExpr.arguments) {
|
|
791
|
+
if (ts5.isObjectLiteralExpression(callArg)) {
|
|
792
|
+
for (const prop of callArg.properties) {
|
|
793
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "urls") {
|
|
794
|
+
if (ts5.isIdentifier(prop.initializer)) {
|
|
795
|
+
result = { kind: "variable", name: prop.initializer.text };
|
|
796
|
+
} else if (isInlineBuilder(prop.initializer)) {
|
|
797
|
+
result = {
|
|
798
|
+
kind: "inline",
|
|
799
|
+
block: prop.initializer.getText(sourceFile)
|
|
800
|
+
};
|
|
801
|
+
}
|
|
802
|
+
return;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
ts5.forEachChild(node, visit);
|
|
809
|
+
}
|
|
810
|
+
visit(sourceFile);
|
|
811
|
+
return result;
|
|
812
|
+
}
|
|
813
|
+
function extractBasenameFromRouter(code) {
|
|
814
|
+
const sourceFile = ts5.createSourceFile(
|
|
815
|
+
"router.tsx",
|
|
816
|
+
code,
|
|
817
|
+
ts5.ScriptTarget.Latest,
|
|
818
|
+
true,
|
|
819
|
+
ts5.ScriptKind.TSX
|
|
820
|
+
);
|
|
821
|
+
let result;
|
|
822
|
+
function visit(node) {
|
|
823
|
+
if (result !== void 0) return;
|
|
824
|
+
if (ts5.isCallExpression(node) && ts5.isIdentifier(node.expression) && node.expression.text === "createRouter") {
|
|
825
|
+
for (const arg of node.arguments) {
|
|
703
826
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
704
827
|
for (const prop of arg.properties) {
|
|
705
|
-
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "
|
|
828
|
+
if (ts5.isPropertyAssignment(prop) && ts5.isIdentifier(prop.name) && prop.name.text === "basename" && ts5.isStringLiteral(prop.initializer)) {
|
|
706
829
|
result = prop.initializer.text;
|
|
707
830
|
return;
|
|
708
831
|
}
|
|
@@ -715,6 +838,38 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
715
838
|
visit(sourceFile);
|
|
716
839
|
return result;
|
|
717
840
|
}
|
|
841
|
+
function applyBasenameToRoutes(result, basename) {
|
|
842
|
+
const prefixed = {};
|
|
843
|
+
for (const [name, pattern] of Object.entries(result.routes)) {
|
|
844
|
+
if (pattern === "/") {
|
|
845
|
+
prefixed[name] = basename;
|
|
846
|
+
} else if (basename.endsWith("/") && pattern.startsWith("/")) {
|
|
847
|
+
prefixed[name] = basename + pattern.slice(1);
|
|
848
|
+
} else {
|
|
849
|
+
prefixed[name] = basename + pattern;
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return { routes: prefixed, searchSchemas: result.searchSchemas };
|
|
853
|
+
}
|
|
854
|
+
function genFileTsPath(sourceFile) {
|
|
855
|
+
const base = pathBasename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
856
|
+
return join2(dirname2(sourceFile), `${base}.named-routes.gen.ts`);
|
|
857
|
+
}
|
|
858
|
+
function resolveSearchSchemas(publicRouteNames, runtimeSchemas, sourceFile) {
|
|
859
|
+
if (runtimeSchemas && Object.keys(runtimeSchemas).length > 0) {
|
|
860
|
+
return runtimeSchemas;
|
|
861
|
+
}
|
|
862
|
+
const staticParsed = buildCombinedRouteMapForRouterFile(sourceFile);
|
|
863
|
+
if (Object.keys(staticParsed.searchSchemas).length === 0) {
|
|
864
|
+
return runtimeSchemas;
|
|
865
|
+
}
|
|
866
|
+
const filtered = {};
|
|
867
|
+
for (const name of publicRouteNames) {
|
|
868
|
+
const schema = staticParsed.searchSchemas[name];
|
|
869
|
+
if (schema) filtered[name] = schema;
|
|
870
|
+
}
|
|
871
|
+
return Object.keys(filtered).length > 0 ? filtered : runtimeSchemas;
|
|
872
|
+
}
|
|
718
873
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
719
874
|
let routerSource;
|
|
720
875
|
try {
|
|
@@ -722,19 +877,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
722
877
|
} catch {
|
|
723
878
|
return { routes: {}, searchSchemas: {} };
|
|
724
879
|
}
|
|
725
|
-
const
|
|
726
|
-
if (!
|
|
880
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
881
|
+
if (!extraction) {
|
|
727
882
|
return { routes: {}, searchSchemas: {} };
|
|
728
883
|
}
|
|
729
|
-
const
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
884
|
+
const rawBasename = extractBasenameFromRouter(routerSource);
|
|
885
|
+
const basename = rawBasename ? ("/" + rawBasename.replace(/^\/+|\/+$/g, "")).replace(/^\/$/, "") : void 0;
|
|
886
|
+
let result;
|
|
887
|
+
if (extraction.kind === "inline") {
|
|
888
|
+
result = buildCombinedRouteMapWithSearch(
|
|
889
|
+
routerFilePath,
|
|
890
|
+
void 0,
|
|
891
|
+
void 0,
|
|
892
|
+
void 0,
|
|
893
|
+
extraction.block
|
|
894
|
+
);
|
|
895
|
+
} else {
|
|
896
|
+
const imported = resolveImportedVariable(routerSource, extraction.name);
|
|
897
|
+
if (imported) {
|
|
898
|
+
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
899
|
+
if (!targetFile) {
|
|
900
|
+
return { routes: {}, searchSchemas: {} };
|
|
901
|
+
}
|
|
902
|
+
result = buildCombinedRouteMapWithSearch(
|
|
903
|
+
targetFile,
|
|
904
|
+
imported.exportedName
|
|
905
|
+
);
|
|
906
|
+
} else {
|
|
907
|
+
result = buildCombinedRouteMapWithSearch(routerFilePath, extraction.name);
|
|
734
908
|
}
|
|
735
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
736
909
|
}
|
|
737
|
-
|
|
910
|
+
if (basename) {
|
|
911
|
+
result = applyBasenameToRoutes(result, basename);
|
|
912
|
+
}
|
|
913
|
+
return result;
|
|
738
914
|
}
|
|
739
915
|
function detectUnresolvableIncludes(routerFilePath) {
|
|
740
916
|
const realPath = resolve2(routerFilePath);
|
|
@@ -744,9 +920,20 @@ function detectUnresolvableIncludes(routerFilePath) {
|
|
|
744
920
|
} catch {
|
|
745
921
|
return [];
|
|
746
922
|
}
|
|
747
|
-
const
|
|
748
|
-
if (!
|
|
749
|
-
const
|
|
923
|
+
const extraction = extractUrlsFromRouter(source);
|
|
924
|
+
if (!extraction) return [];
|
|
925
|
+
const diagnostics = [];
|
|
926
|
+
if (extraction.kind === "inline") {
|
|
927
|
+
buildCombinedRouteMapWithSearch(
|
|
928
|
+
realPath,
|
|
929
|
+
void 0,
|
|
930
|
+
/* @__PURE__ */ new Set(),
|
|
931
|
+
diagnostics,
|
|
932
|
+
extraction.block
|
|
933
|
+
);
|
|
934
|
+
return diagnostics;
|
|
935
|
+
}
|
|
936
|
+
const imported = resolveImportedVariable(source, extraction.name);
|
|
750
937
|
let targetFile;
|
|
751
938
|
let exportedName;
|
|
752
939
|
if (imported) {
|
|
@@ -766,9 +953,8 @@ function detectUnresolvableIncludes(routerFilePath) {
|
|
|
766
953
|
exportedName = imported.exportedName;
|
|
767
954
|
} else {
|
|
768
955
|
targetFile = realPath;
|
|
769
|
-
exportedName =
|
|
956
|
+
exportedName = extraction.name;
|
|
770
957
|
}
|
|
771
|
-
const diagnostics = [];
|
|
772
958
|
buildCombinedRouteMapWithSearch(
|
|
773
959
|
targetFile,
|
|
774
960
|
exportedName,
|
|
@@ -804,7 +990,7 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
804
990
|
if (existsSync3(oldCombinedPath)) {
|
|
805
991
|
unlinkSync(oldCombinedPath);
|
|
806
992
|
console.log(
|
|
807
|
-
`[
|
|
993
|
+
`[rango] Removed stale combined route types: ${oldCombinedPath}`
|
|
808
994
|
);
|
|
809
995
|
}
|
|
810
996
|
} catch {
|
|
@@ -816,38 +1002,22 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
816
1002
|
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
817
1003
|
}
|
|
818
1004
|
for (const routerFilePath of routerFilePaths) {
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
routerSource
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
829
|
-
if (imported) {
|
|
830
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
831
|
-
if (!targetFile) continue;
|
|
832
|
-
result = buildCombinedRouteMapWithSearch(
|
|
833
|
-
targetFile,
|
|
834
|
-
imported.exportedName
|
|
835
|
-
);
|
|
836
|
-
} else {
|
|
837
|
-
result = buildCombinedRouteMapWithSearch(routerFilePath, urlsVarName);
|
|
1005
|
+
const result = buildCombinedRouteMapForRouterFile(routerFilePath);
|
|
1006
|
+
if (Object.keys(result.routes).length === 0 && Object.keys(result.searchSchemas).length === 0) {
|
|
1007
|
+
let routerSource;
|
|
1008
|
+
try {
|
|
1009
|
+
routerSource = readFileSync3(routerFilePath, "utf-8");
|
|
1010
|
+
} catch {
|
|
1011
|
+
continue;
|
|
1012
|
+
}
|
|
1013
|
+
if (!extractUrlsFromRouter(routerSource)) continue;
|
|
838
1014
|
}
|
|
839
|
-
const
|
|
840
|
-
/\.(tsx?|jsx?)$/,
|
|
841
|
-
""
|
|
842
|
-
);
|
|
843
|
-
const outPath = join2(
|
|
844
|
-
dirname2(routerFilePath),
|
|
845
|
-
`${routerBasename}.named-routes.gen.ts`
|
|
846
|
-
);
|
|
1015
|
+
const outPath = genFileTsPath(routerFilePath);
|
|
847
1016
|
const existing = existsSync3(outPath) ? readFileSync3(outPath, "utf-8") : null;
|
|
848
1017
|
if (Object.keys(result.routes).length === 0) {
|
|
849
1018
|
if (!existing) {
|
|
850
1019
|
const emptySource = generateRouteTypesSource({});
|
|
1020
|
+
opts?.onWrite?.(outPath, emptySource);
|
|
851
1021
|
writeFileSync2(outPath, emptySource);
|
|
852
1022
|
}
|
|
853
1023
|
continue;
|
|
@@ -867,22 +1037,25 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
867
1037
|
continue;
|
|
868
1038
|
}
|
|
869
1039
|
}
|
|
1040
|
+
opts?.onWrite?.(outPath, source);
|
|
870
1041
|
writeFileSync2(outPath, source);
|
|
871
1042
|
console.log(
|
|
872
|
-
`[
|
|
1043
|
+
`[rango] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
|
|
873
1044
|
);
|
|
874
1045
|
}
|
|
875
1046
|
}
|
|
876
1047
|
}
|
|
877
|
-
var ROUTER_CALL_PATTERN;
|
|
1048
|
+
var ROUTER_CALL_PATTERN, ROUTER_CALL_PATTERN_G;
|
|
878
1049
|
var init_router_processing = __esm({
|
|
879
1050
|
"src/build/route-types/router-processing.ts"() {
|
|
880
1051
|
"use strict";
|
|
881
1052
|
init_codegen();
|
|
1053
|
+
init_source_scan();
|
|
882
1054
|
init_include_resolution();
|
|
883
1055
|
init_per_module_writer();
|
|
884
1056
|
init_route_name();
|
|
885
1057
|
ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
|
|
1058
|
+
ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
|
|
886
1059
|
}
|
|
887
1060
|
});
|
|
888
1061
|
|
|
@@ -920,7 +1093,7 @@ import {
|
|
|
920
1093
|
import { createElement, StrictMode } from "react";
|
|
921
1094
|
import { hydrateRoot } from "react-dom/client";
|
|
922
1095
|
import { rscStream } from "@rangojs/router/internal/deps/html-stream-client";
|
|
923
|
-
import { initBrowserApp,
|
|
1096
|
+
import { initBrowserApp, Rango } from "@rangojs/router/browser";
|
|
924
1097
|
|
|
925
1098
|
async function initializeApp() {
|
|
926
1099
|
const deps = {
|
|
@@ -935,7 +1108,7 @@ async function initializeApp() {
|
|
|
935
1108
|
|
|
936
1109
|
hydrateRoot(
|
|
937
1110
|
document,
|
|
938
|
-
createElement(StrictMode, null, createElement(
|
|
1111
|
+
createElement(StrictMode, null, createElement(Rango))
|
|
939
1112
|
);
|
|
940
1113
|
}
|
|
941
1114
|
|
|
@@ -967,7 +1140,8 @@ export const renderHTML = createSSRHandler({
|
|
|
967
1140
|
// src/vite/plugins/version-plugin.ts
|
|
968
1141
|
var version_plugin_exports = {};
|
|
969
1142
|
__export(version_plugin_exports, {
|
|
970
|
-
createVersionPlugin: () => createVersionPlugin
|
|
1143
|
+
createVersionPlugin: () => createVersionPlugin,
|
|
1144
|
+
isViteDepCachePath: () => isViteDepCachePath
|
|
971
1145
|
});
|
|
972
1146
|
import { parseAst } from "vite";
|
|
973
1147
|
function isCodeModule(id) {
|
|
@@ -979,7 +1153,7 @@ function normalizeModuleId(id) {
|
|
|
979
1153
|
function getClientModuleSignature(source) {
|
|
980
1154
|
let program;
|
|
981
1155
|
try {
|
|
982
|
-
program = parseAst(source, {
|
|
1156
|
+
program = parseAst(source, { lang: "tsx" });
|
|
983
1157
|
} catch {
|
|
984
1158
|
return void 0;
|
|
985
1159
|
}
|
|
@@ -1062,11 +1236,12 @@ function createVersionPlugin() {
|
|
|
1062
1236
|
let currentVersion = buildVersion;
|
|
1063
1237
|
let isDev = false;
|
|
1064
1238
|
let server = null;
|
|
1239
|
+
let resolvedCacheDir;
|
|
1065
1240
|
const clientModuleSignatures = /* @__PURE__ */ new Map();
|
|
1066
1241
|
let versionCounter = 0;
|
|
1067
1242
|
const bumpVersion = (reason) => {
|
|
1068
1243
|
currentVersion = Date.now().toString(16) + String(++versionCounter);
|
|
1069
|
-
console.log(`[
|
|
1244
|
+
console.log(`[rango] ${reason}, version updated: ${currentVersion}`);
|
|
1070
1245
|
const rscEnv = server?.environments?.rsc;
|
|
1071
1246
|
const versionMod = rscEnv?.moduleGraph?.getModuleById(
|
|
1072
1247
|
"\0" + VIRTUAL_IDS.version
|
|
@@ -1080,6 +1255,7 @@ function createVersionPlugin() {
|
|
|
1080
1255
|
enforce: "pre",
|
|
1081
1256
|
configResolved(config) {
|
|
1082
1257
|
isDev = config.command === "serve";
|
|
1258
|
+
resolvedCacheDir = config.cacheDir ? String(config.cacheDir).replace(/\\/g, "/") : void 0;
|
|
1083
1259
|
},
|
|
1084
1260
|
configureServer(devServer) {
|
|
1085
1261
|
server = devServer;
|
|
@@ -1116,11 +1292,11 @@ function createVersionPlugin() {
|
|
|
1116
1292
|
}
|
|
1117
1293
|
return null;
|
|
1118
1294
|
},
|
|
1119
|
-
// Track RSC module changes and update version
|
|
1120
1295
|
async hotUpdate(ctx) {
|
|
1121
1296
|
if (!isDev) return;
|
|
1122
1297
|
const isRscModule = this.environment?.name === "rsc";
|
|
1123
1298
|
if (!isRscModule) return;
|
|
1299
|
+
if (isViteDepCachePath(ctx.file, resolvedCacheDir)) return;
|
|
1124
1300
|
if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
|
|
1125
1301
|
return;
|
|
1126
1302
|
}
|
|
@@ -1150,6 +1326,17 @@ function createVersionPlugin() {
|
|
|
1150
1326
|
}
|
|
1151
1327
|
};
|
|
1152
1328
|
}
|
|
1329
|
+
function isViteDepCachePath(filePath, cacheDir) {
|
|
1330
|
+
if (!filePath) return false;
|
|
1331
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
1332
|
+
if (cacheDir) {
|
|
1333
|
+
const normalizedCacheDir = cacheDir.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
1334
|
+
if (normalized === normalizedCacheDir || normalized.startsWith(normalizedCacheDir + "/")) {
|
|
1335
|
+
return true;
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
return /\/node_modules\/\.vite[^/]*\//.test(normalized) || normalized.includes("/.vite-isolated/");
|
|
1339
|
+
}
|
|
1153
1340
|
var init_version_plugin = __esm({
|
|
1154
1341
|
"src/vite/plugins/version-plugin.ts"() {
|
|
1155
1342
|
"use strict";
|
|
@@ -1195,7 +1382,7 @@ var runtime_discovery_exports = {};
|
|
|
1195
1382
|
__export(runtime_discovery_exports, {
|
|
1196
1383
|
discoverAndWriteRouteTypes: () => discoverAndWriteRouteTypes
|
|
1197
1384
|
});
|
|
1198
|
-
import {
|
|
1385
|
+
import { resolve as resolve3 } from "node:path";
|
|
1199
1386
|
import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
|
|
1200
1387
|
async function discoverAndWriteRouteTypes(opts) {
|
|
1201
1388
|
let createViteServer;
|
|
@@ -1305,22 +1492,12 @@ This means createRouter() stack trace parsing matched an internal frame.
|
|
|
1305
1492
|
Set an explicit \`id\` on createRouter() or check the call site.`
|
|
1306
1493
|
);
|
|
1307
1494
|
}
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
if (schema) filtered[name] = schema;
|
|
1315
|
-
}
|
|
1316
|
-
if (Object.keys(filtered).length > 0) {
|
|
1317
|
-
routeSearchSchemas = filtered;
|
|
1318
|
-
}
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
const routerDir = dirname3(sourceFile);
|
|
1322
|
-
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
1323
|
-
const outPath = join3(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
1495
|
+
routeSearchSchemas = resolveSearchSchemas(
|
|
1496
|
+
Object.keys(routeManifest),
|
|
1497
|
+
routeSearchSchemas,
|
|
1498
|
+
sourceFile
|
|
1499
|
+
);
|
|
1500
|
+
const outPath = genFileTsPath(sourceFile);
|
|
1324
1501
|
const source = generateRouteTypesSource(
|
|
1325
1502
|
routeManifest,
|
|
1326
1503
|
routeSearchSchemas && Object.keys(routeSearchSchemas).length > 0 ? routeSearchSchemas : void 0
|
|
@@ -1357,7 +1534,7 @@ var init_runtime_discovery = __esm({
|
|
|
1357
1534
|
|
|
1358
1535
|
// src/bin/rango.ts
|
|
1359
1536
|
init_generate_route_types();
|
|
1360
|
-
import { resolve as resolve4, dirname as
|
|
1537
|
+
import { resolve as resolve4, dirname as dirname3 } from "node:path";
|
|
1361
1538
|
import { readFileSync as readFileSync5, statSync, existsSync as existsSync5 } from "node:fs";
|
|
1362
1539
|
var [command, ...rawArgs] = process.argv.slice(2);
|
|
1363
1540
|
if (command === "generate") {
|
|
@@ -1428,12 +1605,12 @@ Examples:
|
|
|
1428
1605
|
);
|
|
1429
1606
|
}
|
|
1430
1607
|
function findProjectRoot(fromPath) {
|
|
1431
|
-
let dir =
|
|
1432
|
-
while (dir !==
|
|
1608
|
+
let dir = dirname3(resolve4(fromPath));
|
|
1609
|
+
while (dir !== dirname3(dir)) {
|
|
1433
1610
|
if (existsSync5(resolve4(dir, "package.json")) || existsSync5(resolve4(dir, "vite.config.ts")) || existsSync5(resolve4(dir, "vite.config.js"))) {
|
|
1434
1611
|
return dir;
|
|
1435
1612
|
}
|
|
1436
|
-
dir =
|
|
1613
|
+
dir = dirname3(dir);
|
|
1437
1614
|
}
|
|
1438
1615
|
return process.cwd();
|
|
1439
1616
|
}
|