@rangojs/router 0.0.0-experimental.31 → 0.0.0-experimental.3232cd17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/README.md +198 -44
- package/dist/bin/rango.js +287 -105
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3248 -1117
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +73 -21
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +107 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +245 -21
- package/skills/caching/SKILL.md +302 -6
- 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 +270 -30
- package/skills/host-router/SKILL.md +82 -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 +294 -30
- 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 +203 -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 +97 -5
- package/skills/router-setup/SKILL.md +90 -5
- 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 +329 -27
- package/skills/use-cache/SKILL.md +36 -5
- 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 +67 -40
- 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 +86 -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/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +148 -19
- package/src/browser/navigation-client.ts +187 -67
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +76 -67
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/partial-update.ts +123 -94
- package/src/browser/prefetch/cache.ts +214 -36
- package/src/browser/prefetch/fetch.ts +260 -38
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +126 -20
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +93 -11
- package/src/browser/react/NavigationProvider.tsx +115 -34
- 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 +215 -76
- package/src/browser/scroll-restoration.ts +46 -39
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +176 -50
- package/src/browser/types.ts +95 -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 +5 -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 +278 -96
- 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 +149 -43
- package/src/cache/cache-scope.ts +148 -81
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2550 -93
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +78 -27
- package/src/cache/handle-snapshot.ts +63 -0
- package/src/cache/index.ts +23 -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/taint.ts +55 -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 +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- 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 +52 -26
- package/src/index.ts +100 -38
- 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 +437 -274
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +113 -37
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +52 -10
- 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 +7 -17
- 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 +45 -22
- package/src/router/handler-context.ts +83 -41
- package/src/router/intercept-resolution.ts +25 -23
- package/src/router/lazy-includes.ts +19 -53
- package/src/router/loader-resolution.ts +213 -30
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +49 -45
- package/src/router/match-api.ts +121 -205
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +27 -6
- package/src/router/match-middleware/cache-lookup.ts +205 -249
- package/src/router/match-middleware/cache-store.ts +45 -32
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +104 -40
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +173 -143
- 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 +192 -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 +6 -28
- 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 +242 -75
- package/src/router/segment-resolution/helpers.ts +64 -25
- package/src/router/segment-resolution/loader-cache.ts +41 -37
- package/src/router/segment-resolution/revalidation.ts +456 -372
- 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 +2 -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 +10 -63
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +134 -43
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +492 -383
- 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 +23 -3
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +30 -3
- 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 +56 -54
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +74 -67
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +25 -6
- 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 +272 -129
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +309 -61
- 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 +348 -128
- package/src/ssr/index.tsx +23 -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 +233 -81
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +37 -14
- 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 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +8 -0
- package/src/vite/plugin-types.ts +187 -69
- 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 +49 -98
- 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 +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +258 -0
- package/src/vite/plugins/version-injector.ts +21 -25
- package/src/vite/plugins/version-plugin.ts +41 -20
- package/src/vite/plugins/virtual-entries.ts +2 -17
- package/src/vite/rango.ts +257 -289
- package/src/vite/router-discovery.ts +930 -140
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/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 +92 -42
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/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,
|
|
@@ -601,7 +678,7 @@ function countPublicRouteEntries(source) {
|
|
|
601
678
|
return count;
|
|
602
679
|
}
|
|
603
680
|
function isRoutableSourceFile(name) {
|
|
604
|
-
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.");
|
|
681
|
+
return (name.endsWith(".ts") || name.endsWith(".tsx") || name.endsWith(".js") || name.endsWith(".jsx")) && !name.includes(".gen.") && !name.includes(".test.") && !name.includes(".spec.");
|
|
605
682
|
}
|
|
606
683
|
function findRouterFilesRecursive(dir, filter, results) {
|
|
607
684
|
let entries;
|
|
@@ -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
|
}
|
|
@@ -618,7 +695,8 @@ function findRouterFilesRecursive(dir, filter, results) {
|
|
|
618
695
|
for (const entry of entries) {
|
|
619
696
|
const fullPath = join2(dir, entry.name);
|
|
620
697
|
if (entry.isDirectory()) {
|
|
621
|
-
if (entry.name === "node_modules" || entry.name.startsWith("."))
|
|
698
|
+
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === "coverage" || entry.name === "__tests__" || entry.name === "__mocks__" || entry.name.startsWith("."))
|
|
699
|
+
continue;
|
|
622
700
|
childDirs.push(fullPath);
|
|
623
701
|
continue;
|
|
624
702
|
}
|
|
@@ -626,7 +704,7 @@ function findRouterFilesRecursive(dir, filter, results) {
|
|
|
626
704
|
if (filter && !filter(fullPath)) continue;
|
|
627
705
|
try {
|
|
628
706
|
const source = readFileSync3(fullPath, "utf-8");
|
|
629
|
-
if (ROUTER_CALL_PATTERN.test(source)) {
|
|
707
|
+
if (ROUTER_CALL_PATTERN.test(source) && firstCodeMatchIndex(source, ROUTER_CALL_PATTERN_G) >= 0) {
|
|
630
708
|
routerFilesInDir.push(fullPath);
|
|
631
709
|
}
|
|
632
710
|
} catch {
|
|
@@ -664,13 +742,13 @@ function findNestedRouterConflict(routerFiles) {
|
|
|
664
742
|
}
|
|
665
743
|
return null;
|
|
666
744
|
}
|
|
667
|
-
function formatNestedRouterConflictError(conflict, prefix = "[
|
|
745
|
+
function formatNestedRouterConflictError(conflict, prefix = "[rango]") {
|
|
668
746
|
return `${prefix} Nested router roots are not supported.
|
|
669
747
|
Router root: ${conflict.ancestor}
|
|
670
748
|
Nested router: ${conflict.nested}
|
|
671
749
|
Move the nested router into a sibling directory or configure it as a separate app root.`;
|
|
672
750
|
}
|
|
673
|
-
function
|
|
751
|
+
function extractUrlsFromRouter(code) {
|
|
674
752
|
const sourceFile = ts5.createSourceFile(
|
|
675
753
|
"router.tsx",
|
|
676
754
|
code,
|
|
@@ -684,24 +762,70 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
684
762
|
const callee = node.expression;
|
|
685
763
|
return ts5.isIdentifier(callee) && callee.text === "createRouter";
|
|
686
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
|
+
}
|
|
687
777
|
function visit(node) {
|
|
688
778
|
if (result) return;
|
|
689
|
-
if (ts5.isCallExpression(node) &&
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
result = node.arguments[0].text;
|
|
696
|
-
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) };
|
|
697
785
|
}
|
|
786
|
+
return;
|
|
698
787
|
}
|
|
699
788
|
if (isCreateRouterCall(node)) {
|
|
700
789
|
const callExpr = node;
|
|
701
|
-
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) {
|
|
702
826
|
if (ts5.isObjectLiteralExpression(arg)) {
|
|
703
827
|
for (const prop of arg.properties) {
|
|
704
|
-
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)) {
|
|
705
829
|
result = prop.initializer.text;
|
|
706
830
|
return;
|
|
707
831
|
}
|
|
@@ -714,6 +838,38 @@ function extractUrlsVariableFromRouter(code) {
|
|
|
714
838
|
visit(sourceFile);
|
|
715
839
|
return result;
|
|
716
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
|
+
}
|
|
717
873
|
function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
718
874
|
let routerSource;
|
|
719
875
|
try {
|
|
@@ -721,19 +877,40 @@ function buildCombinedRouteMapForRouterFile(routerFilePath) {
|
|
|
721
877
|
} catch {
|
|
722
878
|
return { routes: {}, searchSchemas: {} };
|
|
723
879
|
}
|
|
724
|
-
const
|
|
725
|
-
if (!
|
|
880
|
+
const extraction = extractUrlsFromRouter(routerSource);
|
|
881
|
+
if (!extraction) {
|
|
726
882
|
return { routes: {}, searchSchemas: {} };
|
|
727
883
|
}
|
|
728
|
-
const
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
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);
|
|
733
908
|
}
|
|
734
|
-
return buildCombinedRouteMapWithSearch(targetFile, imported.exportedName);
|
|
735
909
|
}
|
|
736
|
-
|
|
910
|
+
if (basename) {
|
|
911
|
+
result = applyBasenameToRoutes(result, basename);
|
|
912
|
+
}
|
|
913
|
+
return result;
|
|
737
914
|
}
|
|
738
915
|
function detectUnresolvableIncludes(routerFilePath) {
|
|
739
916
|
const realPath = resolve2(routerFilePath);
|
|
@@ -743,9 +920,20 @@ function detectUnresolvableIncludes(routerFilePath) {
|
|
|
743
920
|
} catch {
|
|
744
921
|
return [];
|
|
745
922
|
}
|
|
746
|
-
const
|
|
747
|
-
if (!
|
|
748
|
-
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);
|
|
749
937
|
let targetFile;
|
|
750
938
|
let exportedName;
|
|
751
939
|
if (imported) {
|
|
@@ -765,9 +953,8 @@ function detectUnresolvableIncludes(routerFilePath) {
|
|
|
765
953
|
exportedName = imported.exportedName;
|
|
766
954
|
} else {
|
|
767
955
|
targetFile = realPath;
|
|
768
|
-
exportedName =
|
|
956
|
+
exportedName = extraction.name;
|
|
769
957
|
}
|
|
770
|
-
const diagnostics = [];
|
|
771
958
|
buildCombinedRouteMapWithSearch(
|
|
772
959
|
targetFile,
|
|
773
960
|
exportedName,
|
|
@@ -803,7 +990,7 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
803
990
|
if (existsSync3(oldCombinedPath)) {
|
|
804
991
|
unlinkSync(oldCombinedPath);
|
|
805
992
|
console.log(
|
|
806
|
-
`[
|
|
993
|
+
`[rango] Removed stale combined route types: ${oldCombinedPath}`
|
|
807
994
|
);
|
|
808
995
|
}
|
|
809
996
|
} catch {
|
|
@@ -815,38 +1002,22 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
815
1002
|
throw new Error(formatNestedRouterConflictError(nestedRouterConflict));
|
|
816
1003
|
}
|
|
817
1004
|
for (const routerFilePath of routerFilePaths) {
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
routerSource
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
const imported = resolveImportedVariable(routerSource, urlsVarName);
|
|
828
|
-
if (imported) {
|
|
829
|
-
const targetFile = resolveImportPath(imported.specifier, routerFilePath);
|
|
830
|
-
if (!targetFile) continue;
|
|
831
|
-
result = buildCombinedRouteMapWithSearch(
|
|
832
|
-
targetFile,
|
|
833
|
-
imported.exportedName
|
|
834
|
-
);
|
|
835
|
-
} else {
|
|
836
|
-
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;
|
|
837
1014
|
}
|
|
838
|
-
const
|
|
839
|
-
/\.(tsx?|jsx?)$/,
|
|
840
|
-
""
|
|
841
|
-
);
|
|
842
|
-
const outPath = join2(
|
|
843
|
-
dirname2(routerFilePath),
|
|
844
|
-
`${routerBasename}.named-routes.gen.ts`
|
|
845
|
-
);
|
|
1015
|
+
const outPath = genFileTsPath(routerFilePath);
|
|
846
1016
|
const existing = existsSync3(outPath) ? readFileSync3(outPath, "utf-8") : null;
|
|
847
1017
|
if (Object.keys(result.routes).length === 0) {
|
|
848
1018
|
if (!existing) {
|
|
849
1019
|
const emptySource = generateRouteTypesSource({});
|
|
1020
|
+
opts?.onWrite?.(outPath, emptySource);
|
|
850
1021
|
writeFileSync2(outPath, emptySource);
|
|
851
1022
|
}
|
|
852
1023
|
continue;
|
|
@@ -866,22 +1037,25 @@ function writeCombinedRouteTypes(root, knownRouterFiles, opts) {
|
|
|
866
1037
|
continue;
|
|
867
1038
|
}
|
|
868
1039
|
}
|
|
1040
|
+
opts?.onWrite?.(outPath, source);
|
|
869
1041
|
writeFileSync2(outPath, source);
|
|
870
1042
|
console.log(
|
|
871
|
-
`[
|
|
1043
|
+
`[rango] Generated route types (${Object.keys(result.routes).length} routes) -> ${outPath}`
|
|
872
1044
|
);
|
|
873
1045
|
}
|
|
874
1046
|
}
|
|
875
1047
|
}
|
|
876
|
-
var ROUTER_CALL_PATTERN;
|
|
1048
|
+
var ROUTER_CALL_PATTERN, ROUTER_CALL_PATTERN_G;
|
|
877
1049
|
var init_router_processing = __esm({
|
|
878
1050
|
"src/build/route-types/router-processing.ts"() {
|
|
879
1051
|
"use strict";
|
|
880
1052
|
init_codegen();
|
|
1053
|
+
init_source_scan();
|
|
881
1054
|
init_include_resolution();
|
|
882
1055
|
init_per_module_writer();
|
|
883
1056
|
init_route_name();
|
|
884
1057
|
ROUTER_CALL_PATTERN = /\bcreateRouter\s*[<(]/;
|
|
1058
|
+
ROUTER_CALL_PATTERN_G = /\bcreateRouter\s*[<(]/g;
|
|
885
1059
|
}
|
|
886
1060
|
});
|
|
887
1061
|
|
|
@@ -919,7 +1093,7 @@ import {
|
|
|
919
1093
|
import { createElement, StrictMode } from "react";
|
|
920
1094
|
import { hydrateRoot } from "react-dom/client";
|
|
921
1095
|
import { rscStream } from "@rangojs/router/internal/deps/html-stream-client";
|
|
922
|
-
import { initBrowserApp,
|
|
1096
|
+
import { initBrowserApp, Rango } from "@rangojs/router/browser";
|
|
923
1097
|
|
|
924
1098
|
async function initializeApp() {
|
|
925
1099
|
const deps = {
|
|
@@ -934,7 +1108,7 @@ async function initializeApp() {
|
|
|
934
1108
|
|
|
935
1109
|
hydrateRoot(
|
|
936
1110
|
document,
|
|
937
|
-
createElement(StrictMode, null, createElement(
|
|
1111
|
+
createElement(StrictMode, null, createElement(Rango))
|
|
938
1112
|
);
|
|
939
1113
|
}
|
|
940
1114
|
|
|
@@ -966,7 +1140,8 @@ export const renderHTML = createSSRHandler({
|
|
|
966
1140
|
// src/vite/plugins/version-plugin.ts
|
|
967
1141
|
var version_plugin_exports = {};
|
|
968
1142
|
__export(version_plugin_exports, {
|
|
969
|
-
createVersionPlugin: () => createVersionPlugin
|
|
1143
|
+
createVersionPlugin: () => createVersionPlugin,
|
|
1144
|
+
isViteDepCachePath: () => isViteDepCachePath
|
|
970
1145
|
});
|
|
971
1146
|
import { parseAst } from "vite";
|
|
972
1147
|
function isCodeModule(id) {
|
|
@@ -978,7 +1153,7 @@ function normalizeModuleId(id) {
|
|
|
978
1153
|
function getClientModuleSignature(source) {
|
|
979
1154
|
let program;
|
|
980
1155
|
try {
|
|
981
|
-
program = parseAst(source, {
|
|
1156
|
+
program = parseAst(source, { lang: "tsx" });
|
|
982
1157
|
} catch {
|
|
983
1158
|
return void 0;
|
|
984
1159
|
}
|
|
@@ -1061,10 +1236,12 @@ function createVersionPlugin() {
|
|
|
1061
1236
|
let currentVersion = buildVersion;
|
|
1062
1237
|
let isDev = false;
|
|
1063
1238
|
let server = null;
|
|
1239
|
+
let resolvedCacheDir;
|
|
1064
1240
|
const clientModuleSignatures = /* @__PURE__ */ new Map();
|
|
1241
|
+
let versionCounter = 0;
|
|
1065
1242
|
const bumpVersion = (reason) => {
|
|
1066
|
-
currentVersion = Date.now().toString(16);
|
|
1067
|
-
console.log(`[
|
|
1243
|
+
currentVersion = Date.now().toString(16) + String(++versionCounter);
|
|
1244
|
+
console.log(`[rango] ${reason}, version updated: ${currentVersion}`);
|
|
1068
1245
|
const rscEnv = server?.environments?.rsc;
|
|
1069
1246
|
const versionMod = rscEnv?.moduleGraph?.getModuleById(
|
|
1070
1247
|
"\0" + VIRTUAL_IDS.version
|
|
@@ -1078,6 +1255,7 @@ function createVersionPlugin() {
|
|
|
1078
1255
|
enforce: "pre",
|
|
1079
1256
|
configResolved(config) {
|
|
1080
1257
|
isDev = config.command === "serve";
|
|
1258
|
+
resolvedCacheDir = config.cacheDir ? String(config.cacheDir).replace(/\\/g, "/") : void 0;
|
|
1081
1259
|
},
|
|
1082
1260
|
configureServer(devServer) {
|
|
1083
1261
|
server = devServer;
|
|
@@ -1114,11 +1292,14 @@ function createVersionPlugin() {
|
|
|
1114
1292
|
}
|
|
1115
1293
|
return null;
|
|
1116
1294
|
},
|
|
1117
|
-
// Track RSC module changes and update version
|
|
1118
1295
|
async hotUpdate(ctx) {
|
|
1119
1296
|
if (!isDev) return;
|
|
1120
1297
|
const isRscModule = this.environment?.name === "rsc";
|
|
1121
1298
|
if (!isRscModule) return;
|
|
1299
|
+
if (isViteDepCachePath(ctx.file, resolvedCacheDir)) return;
|
|
1300
|
+
if (ctx.modules.length === 1 && ctx.modules[0].id === "\0" + VIRTUAL_IDS.version) {
|
|
1301
|
+
return;
|
|
1302
|
+
}
|
|
1122
1303
|
if (isCodeModule(ctx.file)) {
|
|
1123
1304
|
const filePath = normalizeModuleId(ctx.file);
|
|
1124
1305
|
const previousSignature = clientModuleSignatures.get(filePath);
|
|
@@ -1145,6 +1326,17 @@ function createVersionPlugin() {
|
|
|
1145
1326
|
}
|
|
1146
1327
|
};
|
|
1147
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
|
+
}
|
|
1148
1340
|
var init_version_plugin = __esm({
|
|
1149
1341
|
"src/vite/plugins/version-plugin.ts"() {
|
|
1150
1342
|
"use strict";
|
|
@@ -1190,7 +1382,7 @@ var runtime_discovery_exports = {};
|
|
|
1190
1382
|
__export(runtime_discovery_exports, {
|
|
1191
1383
|
discoverAndWriteRouteTypes: () => discoverAndWriteRouteTypes
|
|
1192
1384
|
});
|
|
1193
|
-
import {
|
|
1385
|
+
import { resolve as resolve3 } from "node:path";
|
|
1194
1386
|
import { existsSync as existsSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "node:fs";
|
|
1195
1387
|
async function discoverAndWriteRouteTypes(opts) {
|
|
1196
1388
|
let createViteServer;
|
|
@@ -1300,22 +1492,12 @@ This means createRouter() stack trace parsing matched an internal frame.
|
|
|
1300
1492
|
Set an explicit \`id\` on createRouter() or check the call site.`
|
|
1301
1493
|
);
|
|
1302
1494
|
}
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
if (schema) filtered[name] = schema;
|
|
1310
|
-
}
|
|
1311
|
-
if (Object.keys(filtered).length > 0) {
|
|
1312
|
-
routeSearchSchemas = filtered;
|
|
1313
|
-
}
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
const routerDir = dirname3(sourceFile);
|
|
1317
|
-
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
1318
|
-
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);
|
|
1319
1501
|
const source = generateRouteTypesSource(
|
|
1320
1502
|
routeManifest,
|
|
1321
1503
|
routeSearchSchemas && Object.keys(routeSearchSchemas).length > 0 ? routeSearchSchemas : void 0
|
|
@@ -1352,7 +1534,7 @@ var init_runtime_discovery = __esm({
|
|
|
1352
1534
|
|
|
1353
1535
|
// src/bin/rango.ts
|
|
1354
1536
|
init_generate_route_types();
|
|
1355
|
-
import { resolve as resolve4, dirname as
|
|
1537
|
+
import { resolve as resolve4, dirname as dirname3 } from "node:path";
|
|
1356
1538
|
import { readFileSync as readFileSync5, statSync, existsSync as existsSync5 } from "node:fs";
|
|
1357
1539
|
var [command, ...rawArgs] = process.argv.slice(2);
|
|
1358
1540
|
if (command === "generate") {
|
|
@@ -1423,12 +1605,12 @@ Examples:
|
|
|
1423
1605
|
);
|
|
1424
1606
|
}
|
|
1425
1607
|
function findProjectRoot(fromPath) {
|
|
1426
|
-
let dir =
|
|
1427
|
-
while (dir !==
|
|
1608
|
+
let dir = dirname3(resolve4(fromPath));
|
|
1609
|
+
while (dir !== dirname3(dir)) {
|
|
1428
1610
|
if (existsSync5(resolve4(dir, "package.json")) || existsSync5(resolve4(dir, "vite.config.ts")) || existsSync5(resolve4(dir, "vite.config.js"))) {
|
|
1429
1611
|
return dir;
|
|
1430
1612
|
}
|
|
1431
|
-
dir =
|
|
1613
|
+
dir = dirname3(dir);
|
|
1432
1614
|
}
|
|
1433
1615
|
return process.cwd();
|
|
1434
1616
|
}
|