@rangojs/router 0.0.0-experimental.97 → 0.0.0-experimental.98914650
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 +24 -9
- package/dist/bin/rango.js +157 -63
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +1584 -639
- package/package.json +71 -21
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +60 -0
- 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 +3 -1
- package/skills/hooks/SKILL.md +235 -28
- package/skills/host-router/SKILL.md +122 -22
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +29 -5
- package/skills/layout/SKILL.md +13 -9
- package/skills/links/SKILL.md +173 -17
- package/skills/loader/SKILL.md +170 -23
- package/skills/middleware/SKILL.md +16 -10
- package/skills/migrate-nextjs/SKILL.md +38 -16
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +11 -7
- package/skills/prerender/SKILL.md +14 -33
- package/skills/rango/SKILL.md +250 -25
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +114 -47
- package/skills/route/SKILL.md +42 -5
- package/skills/router-setup/SKILL.md +3 -3
- package/skills/server-actions/SKILL.md +78 -42
- 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 +316 -26
- 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 +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +37 -143
- 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 +30 -59
- package/src/browser/navigation-client.ts +96 -84
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +32 -82
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/partial-update.ts +60 -127
- package/src/browser/prefetch/cache.ts +82 -72
- package/src/browser/prefetch/fetch.ts +108 -33
- package/src/browser/prefetch/queue.ts +6 -3
- package/src/browser/rango-state.ts +157 -115
- package/src/browser/react/Link.tsx +0 -2
- package/src/browser/react/NavigationProvider.tsx +41 -48
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/filter-segment-order.ts +0 -2
- 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 +17 -14
- package/src/browser/react/use-link-status.ts +0 -4
- package/src/browser/react/use-navigation.ts +0 -3
- package/src/browser/react/use-params.ts +11 -11
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +20 -5
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +0 -13
- package/src/browser/response-adapter.ts +52 -1
- package/src/browser/rsc-router.tsx +70 -34
- package/src/browser/scroll-restoration.ts +22 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +168 -44
- package/src/browser/types.ts +36 -21
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +3 -0
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +89 -10
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +1 -1
- 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 +122 -22
- package/src/build/route-types/scan-filter.ts +1 -1
- 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 +2255 -238
- 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 +25 -61
- 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/ssr.ts +0 -1
- package/src/errors.ts +30 -4
- package/src/handle.ts +31 -23
- 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 +63 -9
- package/src/index.ts +64 -9
- 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-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +10 -11
- package/src/prerender/store.ts +32 -37
- package/src/prerender.ts +61 -6
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +9 -0
- package/src/reverse.ts +65 -40
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +7 -72
- package/src/route-definition/dsl-helpers.ts +244 -281
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +40 -17
- package/src/route-definition/redirect.ts +43 -9
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +19 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +15 -15
- package/src/router/error-handling.ts +13 -17
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +4 -41
- package/src/router/intercept-resolution.ts +14 -19
- package/src/router/lazy-includes.ts +9 -46
- package/src/router/loader-resolution.ts +91 -46
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +18 -29
- package/src/router/match-api.ts +0 -20
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +57 -58
- package/src/router/match-middleware/background-revalidation.ts +0 -7
- package/src/router/match-middleware/cache-lookup.ts +150 -271
- 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 +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +31 -80
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +5 -112
- package/src/router/middleware.ts +118 -133
- package/src/router/navigation-snapshot.ts +0 -51
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +62 -67
- package/src/router/prerender-match.ts +99 -63
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +28 -62
- package/src/router/revalidation.ts +50 -56
- package/src/router/route-snapshot.ts +0 -1
- package/src/router/router-context.ts +0 -27
- package/src/router/router-interfaces.ts +68 -35
- package/src/router/router-options.ts +55 -1
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +44 -63
- 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 +203 -285
- 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 +87 -48
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +0 -5
- package/src/router.ts +80 -41
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +83 -78
- package/src/rsc/helpers.ts +93 -5
- package/src/rsc/index.ts +1 -1
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +12 -1
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +76 -62
- package/src/rsc/rsc-rendering.ts +41 -60
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +62 -67
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/types.ts +10 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -20
- package/src/segment-loader-promise.ts +14 -2
- package/src/segment-system.tsx +199 -142
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +150 -51
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +7 -24
- package/src/server/loader-registry.ts +5 -24
- package/src/server/request-context.ts +165 -87
- package/src/ssr/index.tsx +14 -14
- package/src/static-handler.ts +10 -13
- 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 +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +97 -22
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +6 -3
- package/src/types/request-scope.ts +0 -19
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +0 -6
- package/src/types/segments.ts +18 -14
- package/src/urls/include-helper.ts +9 -56
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +19 -5
- package/src/urls/path-helper.ts +17 -106
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +20 -19
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -18
- package/src/use-loader.tsx +292 -107
- package/src/vite/debug.ts +1 -0
- package/src/vite/discovery/bundle-postprocess.ts +8 -7
- package/src/vite/discovery/discover-routers.ts +95 -82
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/prerender-collection.ts +26 -34
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/state.ts +39 -1
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +4 -0
- package/src/vite/plugin-types.ts +185 -10
- package/src/vite/plugins/cjs-to-esm.ts +3 -18
- package/src/vite/plugins/client-ref-dedup.ts +0 -11
- package/src/vite/plugins/client-ref-hashing.ts +12 -11
- package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
- package/src/vite/plugins/expose-action-id.ts +4 -75
- package/src/vite/plugins/expose-id-utils.ts +3 -54
- package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +6 -74
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +0 -13
- package/src/vite/plugins/expose-internal-ids.ts +57 -67
- package/src/vite/plugins/performance-tracks.ts +9 -16
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/use-cache-transform.ts +26 -49
- package/src/vite/plugins/vercel-output.ts +258 -0
- package/src/vite/plugins/version-injector.ts +2 -32
- package/src/vite/plugins/version-plugin.ts +32 -23
- package/src/vite/plugins/virtual-entries.ts +35 -17
- package/src/vite/rango.ts +148 -115
- package/src/vite/router-discovery.ts +220 -68
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- 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 +1 -73
- package/src/vite/utils/prerender-utils.ts +0 -34
- package/src/vite/utils/shared-utils.ts +95 -43
- 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
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* generation.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { contextSet } from "../../context-var.js";
|
|
9
|
+
import { contextSet, hasContextVars } from "../../context-var.js";
|
|
10
10
|
import {
|
|
11
11
|
encodePathParam,
|
|
12
12
|
substituteRouteParams,
|
|
@@ -81,7 +81,7 @@ export async function expandPrerenderRoutes(
|
|
|
81
81
|
? setInterval(() => {
|
|
82
82
|
const elapsed = ((performance.now() - paramsStart) / 1000).toFixed(1);
|
|
83
83
|
console.log(
|
|
84
|
-
`[
|
|
84
|
+
`[rango] Resolving prerender params... ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`,
|
|
85
85
|
);
|
|
86
86
|
}, 5000)
|
|
87
87
|
: undefined;
|
|
@@ -122,7 +122,7 @@ export async function expandPrerenderRoutes(
|
|
|
122
122
|
get env() {
|
|
123
123
|
if (buildEnv !== undefined) return buildEnv;
|
|
124
124
|
throw new Error(
|
|
125
|
-
"[
|
|
125
|
+
"[rango] ctx.env is not available during build-time getParams(). " +
|
|
126
126
|
"Configure buildEnv in your rango() plugin options to enable build-time env access.",
|
|
127
127
|
);
|
|
128
128
|
},
|
|
@@ -135,9 +135,7 @@ export async function expandPrerenderRoutes(
|
|
|
135
135
|
(performance.now() - getParamsStart).toFixed(1),
|
|
136
136
|
);
|
|
137
137
|
const concurrency = def.options?.concurrency ?? 1;
|
|
138
|
-
const hasBuildVars =
|
|
139
|
-
Object.keys(buildVars).length > 0 ||
|
|
140
|
-
Object.getOwnPropertySymbols(buildVars).length > 0;
|
|
138
|
+
const hasBuildVars = hasContextVars(buildVars);
|
|
141
139
|
for (const params of paramsList) {
|
|
142
140
|
let url = substituteRouteParams(
|
|
143
141
|
pattern,
|
|
@@ -170,7 +168,7 @@ export async function expandPrerenderRoutes(
|
|
|
170
168
|
// Skip in getParams() skips the entire route
|
|
171
169
|
if (err.name === "Skip") {
|
|
172
170
|
console.log(
|
|
173
|
-
`[
|
|
171
|
+
`[rango] SKIP route "${routeName}" - ${err.message}`,
|
|
174
172
|
);
|
|
175
173
|
notifyOnError(
|
|
176
174
|
registry,
|
|
@@ -184,14 +182,14 @@ export async function expandPrerenderRoutes(
|
|
|
184
182
|
}
|
|
185
183
|
// Regular error: fail the build
|
|
186
184
|
console.error(
|
|
187
|
-
`[
|
|
185
|
+
`[rango] Failed to get params for prerender route "${routeName}": ${err.message}`,
|
|
188
186
|
);
|
|
189
187
|
notifyOnError(registry, err, "prerender", routeName);
|
|
190
188
|
throw err;
|
|
191
189
|
}
|
|
192
190
|
} else {
|
|
193
191
|
console.warn(
|
|
194
|
-
`[
|
|
192
|
+
`[rango] Dynamic prerender route "${routeName}" has no getParams(), skipping`,
|
|
195
193
|
);
|
|
196
194
|
}
|
|
197
195
|
}
|
|
@@ -202,7 +200,7 @@ export async function expandPrerenderRoutes(
|
|
|
202
200
|
clearInterval(progressInterval);
|
|
203
201
|
const elapsed = ((performance.now() - paramsStart) / 1000).toFixed(1);
|
|
204
202
|
console.log(
|
|
205
|
-
`[
|
|
203
|
+
`[rango] Resolved prerender params: ${resolvedRoutes}/${totalDynamic} routes (${elapsed}s)`,
|
|
206
204
|
);
|
|
207
205
|
}
|
|
208
206
|
}
|
|
@@ -220,7 +218,7 @@ export async function expandPrerenderRoutes(
|
|
|
220
218
|
const concurrencyNote =
|
|
221
219
|
maxConcurrency > 1 ? ` (concurrency: ${maxConcurrency})` : "";
|
|
222
220
|
console.log(
|
|
223
|
-
`[
|
|
221
|
+
`[rango] Pre-rendering ${entries.length} URL(s)${concurrencyNote}...`,
|
|
224
222
|
);
|
|
225
223
|
debug?.(
|
|
226
224
|
"prerender loop: %d entries, max concurrency %d",
|
|
@@ -261,7 +259,7 @@ export async function expandPrerenderRoutes(
|
|
|
261
259
|
if (result.passthrough) {
|
|
262
260
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
263
261
|
console.log(
|
|
264
|
-
`[
|
|
262
|
+
`[rango] PASS ${entry.urlPath.padEnd(40)} (${elapsed}ms) - live fallback`,
|
|
265
263
|
);
|
|
266
264
|
doneCount++;
|
|
267
265
|
break;
|
|
@@ -282,10 +280,9 @@ export async function expandPrerenderRoutes(
|
|
|
282
280
|
const interceptKey = `${result.routeName}/${paramHash}/i`;
|
|
283
281
|
const interceptValue = JSON.stringify({
|
|
284
282
|
segments: [...result.segments, ...result.interceptSegments],
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
},
|
|
283
|
+
// interceptHandles is the pre-encoded MERGED (main + intercept)
|
|
284
|
+
// handle string (the producer merged before encoding).
|
|
285
|
+
handles: result.interceptHandles ?? "",
|
|
289
286
|
});
|
|
290
287
|
manifestEntries[interceptKey] = stageBuildAssetModule(
|
|
291
288
|
state.projectRoot,
|
|
@@ -295,7 +292,7 @@ export async function expandPrerenderRoutes(
|
|
|
295
292
|
}
|
|
296
293
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
297
294
|
console.log(
|
|
298
|
-
`[
|
|
295
|
+
`[rango] OK ${entry.urlPath.padEnd(40)} (${elapsed}ms)`,
|
|
299
296
|
);
|
|
300
297
|
doneCount++;
|
|
301
298
|
break;
|
|
@@ -303,7 +300,7 @@ export async function expandPrerenderRoutes(
|
|
|
303
300
|
if (err.name === "Skip") {
|
|
304
301
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
305
302
|
console.log(
|
|
306
|
-
`[
|
|
303
|
+
`[rango] SKIP ${entry.urlPath.padEnd(40)} (${elapsed}ms) - ${err.message}`,
|
|
307
304
|
);
|
|
308
305
|
skipCount++;
|
|
309
306
|
notifyOnError(
|
|
@@ -319,7 +316,7 @@ export async function expandPrerenderRoutes(
|
|
|
319
316
|
// Regular error: log, notify, and fail the build
|
|
320
317
|
const elapsed = (performance.now() - startUrl).toFixed(0);
|
|
321
318
|
console.error(
|
|
322
|
-
`[
|
|
319
|
+
`[rango] FAIL ${entry.urlPath.padEnd(40)} (${elapsed}ms) - ${err.message}`,
|
|
323
320
|
);
|
|
324
321
|
notifyOnError(
|
|
325
322
|
registry,
|
|
@@ -342,7 +339,7 @@ export async function expandPrerenderRoutes(
|
|
|
342
339
|
const parts = [`${doneCount} done`];
|
|
343
340
|
if (skipCount > 0) parts.push(`${skipCount} skipped`);
|
|
344
341
|
console.log(
|
|
345
|
-
`[
|
|
342
|
+
`[rango] Pre-render complete: ${parts.join(", ")} (${totalElapsed}ms total)`,
|
|
346
343
|
);
|
|
347
344
|
debug?.(
|
|
348
345
|
"expandPrerenderRoutes done: %d done, %d skipped, %sms (overall %sms)",
|
|
@@ -387,9 +384,7 @@ export async function renderStaticHandlers(
|
|
|
387
384
|
totalStaticCount += exportNames.length;
|
|
388
385
|
}
|
|
389
386
|
const startStatic = performance.now();
|
|
390
|
-
console.log(
|
|
391
|
-
`[rsc-router] Rendering ${totalStaticCount} static handler(s)...`,
|
|
392
|
-
);
|
|
387
|
+
console.log(`[rango] Rendering ${totalStaticCount} static handler(s)...`);
|
|
393
388
|
|
|
394
389
|
for (const [moduleId, exportNames] of state.resolvedStaticModules) {
|
|
395
390
|
let mod: any;
|
|
@@ -397,7 +392,7 @@ export async function renderStaticHandlers(
|
|
|
397
392
|
mod = await rscEnv!.runner.import(moduleId);
|
|
398
393
|
} catch (err: any) {
|
|
399
394
|
console.error(
|
|
400
|
-
`[
|
|
395
|
+
`[rango] Failed to import static module ${moduleId}: ${err.message}`,
|
|
401
396
|
);
|
|
402
397
|
notifyOnError(registry, err, "static");
|
|
403
398
|
throw err;
|
|
@@ -422,7 +417,8 @@ export async function renderStaticHandlers(
|
|
|
422
417
|
!state.isBuildMode,
|
|
423
418
|
);
|
|
424
419
|
if (result) {
|
|
425
|
-
|
|
420
|
+
// result.handles is the pre-encoded handle string ("" when none).
|
|
421
|
+
const hasHandles = result.handles !== "";
|
|
426
422
|
const exportValue = hasHandles
|
|
427
423
|
? JSON.stringify(result)
|
|
428
424
|
: JSON.stringify(result.encoded);
|
|
@@ -432,9 +428,7 @@ export async function renderStaticHandlers(
|
|
|
432
428
|
exportValue,
|
|
433
429
|
);
|
|
434
430
|
const elapsed = (performance.now() - startHandler).toFixed(0);
|
|
435
|
-
console.log(
|
|
436
|
-
`[rsc-router] OK ${name.padEnd(40)} (${elapsed}ms)`,
|
|
437
|
-
);
|
|
431
|
+
console.log(`[rango] OK ${name.padEnd(40)} (${elapsed}ms)`);
|
|
438
432
|
staticDone++;
|
|
439
433
|
handled = true;
|
|
440
434
|
break;
|
|
@@ -443,7 +437,7 @@ export async function renderStaticHandlers(
|
|
|
443
437
|
if (err.name === "Skip") {
|
|
444
438
|
const elapsed = (performance.now() - startHandler).toFixed(0);
|
|
445
439
|
console.log(
|
|
446
|
-
`[
|
|
440
|
+
`[rango] SKIP ${name.padEnd(40)} (${elapsed}ms) - ${err.message}`,
|
|
447
441
|
);
|
|
448
442
|
staticSkip++;
|
|
449
443
|
notifyOnError(registry, err, "static", undefined, undefined, true);
|
|
@@ -453,16 +447,14 @@ export async function renderStaticHandlers(
|
|
|
453
447
|
// Regular error: log, notify, and fail the build
|
|
454
448
|
const elapsed = (performance.now() - startHandler).toFixed(0);
|
|
455
449
|
console.error(
|
|
456
|
-
`[
|
|
450
|
+
`[rango] FAIL ${name.padEnd(40)} (${elapsed}ms) - ${err.message}`,
|
|
457
451
|
);
|
|
458
452
|
notifyOnError(registry, err, "static");
|
|
459
453
|
throw err;
|
|
460
454
|
}
|
|
461
455
|
}
|
|
462
456
|
if (!handled) {
|
|
463
|
-
console.warn(
|
|
464
|
-
`[rsc-router] No router could render static handler "${name}"`,
|
|
465
|
-
);
|
|
457
|
+
console.warn(`[rango] No router could render static handler "${name}"`);
|
|
466
458
|
}
|
|
467
459
|
}
|
|
468
460
|
}
|
|
@@ -474,7 +466,7 @@ export async function renderStaticHandlers(
|
|
|
474
466
|
const staticParts = [`${staticDone} done`];
|
|
475
467
|
if (staticSkip > 0) staticParts.push(`${staticSkip} skipped`);
|
|
476
468
|
console.log(
|
|
477
|
-
`[
|
|
469
|
+
`[rango] Static render complete: ${staticParts.join(", ")} (${totalStaticElapsed}ms total)`,
|
|
478
470
|
);
|
|
479
471
|
debug?.(
|
|
480
472
|
"renderStaticHandlers done: %d done, %d skipped, %sms (overall %sms)",
|
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
* from discovered router manifests and static source parsing.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { dirname,
|
|
8
|
+
import { dirname, join, resolve } from "node:path";
|
|
9
9
|
import { readFileSync, writeFileSync, existsSync, unlinkSync } from "node:fs";
|
|
10
10
|
import {
|
|
11
11
|
generateRouteTypesSource,
|
|
12
12
|
writeCombinedRouteTypes,
|
|
13
13
|
findRouterFiles,
|
|
14
14
|
buildCombinedRouteMapForRouterFile,
|
|
15
|
+
genFileTsPath,
|
|
16
|
+
resolveSearchSchemas,
|
|
15
17
|
} from "../../build/generate-route-types.js";
|
|
16
18
|
import type { DiscoveryState } from "./state.js";
|
|
17
19
|
import { markSelfGenWrite } from "./self-gen-tracking.js";
|
|
@@ -35,6 +37,22 @@ function filterUserNamedRoutes(
|
|
|
35
37
|
return filtered;
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
// Write a gen file only when content changed, marking the write as
|
|
41
|
+
// self-generated BEFORE writeFileSync so the watcher distinguishes it from a
|
|
42
|
+
// manual edit (the HMR self-gen-loop guard).
|
|
43
|
+
function writeGenFileIfChanged(
|
|
44
|
+
state: DiscoveryState,
|
|
45
|
+
outPath: string,
|
|
46
|
+
source: string,
|
|
47
|
+
opts?: { log?: boolean },
|
|
48
|
+
): void {
|
|
49
|
+
const existing = existsSync(outPath) ? readFileSync(outPath, "utf-8") : null;
|
|
50
|
+
if (existing === source) return;
|
|
51
|
+
markSelfGenWrite(state, outPath, source);
|
|
52
|
+
writeFileSync(outPath, source);
|
|
53
|
+
if (opts?.log) console.log(`[rango] Generated route types -> ${outPath}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
38
56
|
/**
|
|
39
57
|
* Write combined route types for all router files.
|
|
40
58
|
* Only writes when content has changed to avoid triggering HMR loops.
|
|
@@ -48,45 +66,16 @@ export function writeCombinedRouteTypesWithTracking(
|
|
|
48
66
|
findRouterFiles(state.projectRoot, state.scanFilter);
|
|
49
67
|
state.cachedRouterFiles = routerFiles;
|
|
50
68
|
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
preContent.set(outPath, readFileSync(outPath, "utf-8"));
|
|
62
|
-
} catch {
|
|
63
|
-
// File doesn't exist yet — any write is a real change.
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
writeCombinedRouteTypes(state.projectRoot, routerFiles, opts);
|
|
68
|
-
|
|
69
|
-
// Mark only files that were actually written so the watcher can
|
|
70
|
-
// distinguish self-triggered change events from manual edits.
|
|
71
|
-
// Marking unchanged files creates stale entries that interfere with
|
|
72
|
-
// multi-server setups (e.g. shared webServer + isolated HMR server).
|
|
73
|
-
for (const routerFilePath of routerFiles) {
|
|
74
|
-
const routerDir = dirname(routerFilePath);
|
|
75
|
-
const routerBasename = basename(routerFilePath).replace(
|
|
76
|
-
/\.(tsx?|jsx?)$/,
|
|
77
|
-
"",
|
|
78
|
-
);
|
|
79
|
-
const outPath = join(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
80
|
-
if (!existsSync(outPath)) continue;
|
|
81
|
-
try {
|
|
82
|
-
const content = readFileSync(outPath, "utf-8");
|
|
83
|
-
if (content !== preContent.get(outPath)) {
|
|
84
|
-
markSelfGenWrite(state, outPath, content);
|
|
85
|
-
}
|
|
86
|
-
} catch {
|
|
87
|
-
// Ignore transient fs errors while files are being rewritten.
|
|
88
|
-
}
|
|
89
|
-
}
|
|
69
|
+
// Mark each gen file as self-generated BEFORE it is written, via the onWrite
|
|
70
|
+
// callback fired at every writeFileSync site, so the watcher distinguishes
|
|
71
|
+
// self-triggered change events from manual edits. The callback fires only
|
|
72
|
+
// for files actually written, so unchanged files are never marked (stale
|
|
73
|
+
// entries interfere with multi-server setups such as a shared webServer plus
|
|
74
|
+
// an isolated HMR server).
|
|
75
|
+
writeCombinedRouteTypes(state.projectRoot, routerFiles, {
|
|
76
|
+
...opts,
|
|
77
|
+
onWrite: (outPath, content) => markSelfGenWrite(state, outPath, content),
|
|
78
|
+
});
|
|
90
79
|
}
|
|
91
80
|
|
|
92
81
|
/**
|
|
@@ -104,7 +93,7 @@ export function writeRouteTypesFiles(state: DiscoveryState): void {
|
|
|
104
93
|
if (existsSync(oldCombinedPath)) {
|
|
105
94
|
unlinkSync(oldCombinedPath);
|
|
106
95
|
console.log(
|
|
107
|
-
`[
|
|
96
|
+
`[rango] Removed stale combined route types: ${oldCombinedPath}`,
|
|
108
97
|
);
|
|
109
98
|
}
|
|
110
99
|
} catch {}
|
|
@@ -122,40 +111,22 @@ export function writeRouteTypesFiles(state: DiscoveryState): void {
|
|
|
122
111
|
// the wrong location, causing non-deterministic type resolution.
|
|
123
112
|
if (sourceFile.includes("node_modules")) {
|
|
124
113
|
throw new Error(
|
|
125
|
-
`[
|
|
114
|
+
`[rango] Router "${id}" has sourceFile inside node_modules: ${sourceFile}\n` +
|
|
126
115
|
`This means createRouter() stack trace parsing matched a Vite internal frame.\n` +
|
|
127
116
|
`Set an explicit \`id\` on createRouter() or check the call site.`,
|
|
128
117
|
);
|
|
129
118
|
}
|
|
130
119
|
|
|
131
|
-
const
|
|
132
|
-
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
133
|
-
const outPath = join(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
120
|
+
const outPath = genFileTsPath(sourceFile);
|
|
134
121
|
|
|
135
122
|
// Filter out auto-generated route names (e.g. "$path____debug_reverse-test")
|
|
136
123
|
// to match the static parser's output and prevent HMR oscillation.
|
|
137
124
|
const userRoutes = filterUserNamedRoutes(routeManifest);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
(!effectiveSearchSchemas ||
|
|
144
|
-
Object.keys(effectiveSearchSchemas).length === 0) &&
|
|
145
|
-
sourceFile
|
|
146
|
-
) {
|
|
147
|
-
const staticParsed = buildCombinedRouteMapForRouterFile(sourceFile);
|
|
148
|
-
if (Object.keys(staticParsed.searchSchemas).length > 0) {
|
|
149
|
-
const filtered: Record<string, Record<string, string>> = {};
|
|
150
|
-
for (const name of Object.keys(userRoutes)) {
|
|
151
|
-
const schema = staticParsed.searchSchemas[name];
|
|
152
|
-
if (schema) filtered[name] = schema;
|
|
153
|
-
}
|
|
154
|
-
if (Object.keys(filtered).length > 0) {
|
|
155
|
-
effectiveSearchSchemas = filtered;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
125
|
+
const effectiveSearchSchemas = resolveSearchSchemas(
|
|
126
|
+
Object.keys(userRoutes),
|
|
127
|
+
routeSearchSchemas,
|
|
128
|
+
sourceFile,
|
|
129
|
+
);
|
|
159
130
|
|
|
160
131
|
const source = generateRouteTypesSource(
|
|
161
132
|
userRoutes,
|
|
@@ -163,14 +134,7 @@ export function writeRouteTypesFiles(state: DiscoveryState): void {
|
|
|
163
134
|
? effectiveSearchSchemas
|
|
164
135
|
: undefined,
|
|
165
136
|
);
|
|
166
|
-
|
|
167
|
-
? readFileSync(outPath, "utf-8")
|
|
168
|
-
: null;
|
|
169
|
-
if (existing !== source) {
|
|
170
|
-
markSelfGenWrite(state, outPath, source);
|
|
171
|
-
writeFileSync(outPath, source);
|
|
172
|
-
console.log(`[rsc-router] Generated route types -> ${outPath}`);
|
|
173
|
-
}
|
|
137
|
+
writeGenFileIfChanged(state, outPath, source, { log: true });
|
|
174
138
|
}
|
|
175
139
|
}
|
|
176
140
|
|
|
@@ -236,22 +200,14 @@ export function supplementGenFilesWithRuntimeRoutes(
|
|
|
236
200
|
}
|
|
237
201
|
}
|
|
238
202
|
|
|
239
|
-
const
|
|
240
|
-
const routerBasename = basename(sourceFile).replace(/\.(tsx?|jsx?)$/, "");
|
|
241
|
-
const outPath = join(routerDir, `${routerBasename}.named-routes.gen.ts`);
|
|
203
|
+
const outPath = genFileTsPath(sourceFile);
|
|
242
204
|
const source = generateRouteTypesSource(
|
|
243
205
|
mergedRoutes,
|
|
244
206
|
Object.keys(mergedSearchSchemas).length > 0
|
|
245
207
|
? mergedSearchSchemas
|
|
246
208
|
: undefined,
|
|
247
209
|
);
|
|
248
|
-
|
|
249
|
-
? readFileSync(outPath, "utf-8")
|
|
250
|
-
: null;
|
|
251
|
-
if (existing !== source) {
|
|
252
|
-
markSelfGenWrite(state, outPath, source);
|
|
253
|
-
writeFileSync(outPath, source);
|
|
254
|
-
}
|
|
210
|
+
writeGenFileIfChanged(state, outPath, source);
|
|
255
211
|
}
|
|
256
212
|
// No manual manifest update needed: the virtual module imports the gen
|
|
257
213
|
// file, so Vite's HMR automatically re-evaluates it with fresh data.
|
|
@@ -19,7 +19,19 @@ export interface PluginOptions {
|
|
|
19
19
|
/** Build-time env option from rango() config. */
|
|
20
20
|
buildEnv?: import("../plugin-types.js").BuildEnvOption;
|
|
21
21
|
/** Deployment preset (needed for buildEnv "auto" resolution). */
|
|
22
|
-
preset?: "node" | "cloudflare";
|
|
22
|
+
preset?: "node" | "cloudflare" | "vercel";
|
|
23
|
+
/**
|
|
24
|
+
* Route-discovery scan filter (glob include/exclude) from rango() config.
|
|
25
|
+
* Compiled into `DiscoveryState.scanFilter` once `projectRoot` is known.
|
|
26
|
+
*/
|
|
27
|
+
discovery?: { include?: string[]; exclude?: string[] };
|
|
28
|
+
/**
|
|
29
|
+
* Shared context the built-in clientChunks strategy reads. Discovery populates
|
|
30
|
+
* it (registered fallback hashes + single-router name) before the client build
|
|
31
|
+
* invokes the strategy. Present only when the built-in strategy is active
|
|
32
|
+
* (`clientChunks: true`/default); undefined for `false` or a custom function.
|
|
33
|
+
*/
|
|
34
|
+
clientChunkCtx?: import("../utils/client-chunks.js").ClientChunkContext;
|
|
23
35
|
}
|
|
24
36
|
|
|
25
37
|
export interface PrecomputedEntry {
|
|
@@ -45,6 +57,21 @@ export interface DiscoveryState {
|
|
|
45
57
|
projectRoot: string;
|
|
46
58
|
isBuildMode: boolean;
|
|
47
59
|
userResolveAlias: any;
|
|
60
|
+
/**
|
|
61
|
+
* Data-only slice of the user's resolved config (resolve.* incl. native
|
|
62
|
+
* tsconfigPaths, define, oxc) mirrored into the discovery temp server so it
|
|
63
|
+
* resolves and transforms modules the same way the real environment does.
|
|
64
|
+
* See `utils/forward-user-plugins.ts`.
|
|
65
|
+
*/
|
|
66
|
+
userRunnerConfig:
|
|
67
|
+
| import("../utils/forward-user-plugins.js").ForwardedRunnerConfig
|
|
68
|
+
| undefined;
|
|
69
|
+
/**
|
|
70
|
+
* User resolution plugins (resolveId/load), stripped to their resolution
|
|
71
|
+
* surface, forwarded into the discovery temp server. Lets third-party
|
|
72
|
+
* resolvers such as vite-tsconfig-paths participate in discovery.
|
|
73
|
+
*/
|
|
74
|
+
userResolvePlugins: import("vite").Plugin[];
|
|
48
75
|
scanFilter: ScanFilter | undefined;
|
|
49
76
|
cachedRouterFiles: string[] | undefined;
|
|
50
77
|
opts: PluginOptions | undefined;
|
|
@@ -76,6 +103,14 @@ export interface DiscoveryState {
|
|
|
76
103
|
resolvedBuildEnv?: Record<string, unknown>;
|
|
77
104
|
/** Cleanup function for build-time env resources (e.g., miniflare). */
|
|
78
105
|
buildEnvDispose?: (() => Promise<void> | void) | null;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Set when the most recent HMR re-discovery threw. Cleared on the next
|
|
109
|
+
* successful discovery. Surfaced via debug logs so we can detect "manifest
|
|
110
|
+
* frozen at last-good after error → user fix in non-route file → no
|
|
111
|
+
* rediscovery trigger" scenarios.
|
|
112
|
+
*/
|
|
113
|
+
lastDiscoveryError?: { message: string; at: number } | null;
|
|
79
114
|
}
|
|
80
115
|
|
|
81
116
|
export function createDiscoveryState(
|
|
@@ -87,6 +122,8 @@ export function createDiscoveryState(
|
|
|
87
122
|
projectRoot: "",
|
|
88
123
|
isBuildMode: false,
|
|
89
124
|
userResolveAlias: undefined,
|
|
125
|
+
userRunnerConfig: undefined,
|
|
126
|
+
userResolvePlugins: [],
|
|
90
127
|
scanFilter: undefined,
|
|
91
128
|
cachedRouterFiles: undefined,
|
|
92
129
|
opts,
|
|
@@ -113,5 +150,6 @@ export function createDiscoveryState(
|
|
|
113
150
|
devServer: null,
|
|
114
151
|
selfWrittenGenFiles: new Map(),
|
|
115
152
|
SELF_WRITE_WINDOW_MS: 5_000,
|
|
153
|
+
lastDiscoveryError: null,
|
|
116
154
|
};
|
|
117
155
|
}
|
|
@@ -49,7 +49,6 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
49
49
|
);
|
|
50
50
|
genFileVars.push(varName);
|
|
51
51
|
} else {
|
|
52
|
-
// Routers without sourceFile: inline their manifest data directly
|
|
53
52
|
routersWithoutGenFile.push({
|
|
54
53
|
id: entry.id,
|
|
55
54
|
manifest: entry.routeManifest,
|
|
@@ -58,7 +57,7 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
const lines = [
|
|
61
|
-
`import { setCachedManifest,
|
|
60
|
+
`import { setCachedManifest, setRouterManifest, registerRouterManifestLoader, clearAllRouterData } from "@rangojs/router/server";`,
|
|
62
61
|
...genFileImports,
|
|
63
62
|
// Clear stale per-router cached data (manifest, trie, precomputed entries)
|
|
64
63
|
// before re-populating. In Cloudflare dev mode, program reloads re-evaluate
|
|
@@ -68,14 +67,12 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
68
67
|
`clearAllRouterData();`,
|
|
69
68
|
];
|
|
70
69
|
|
|
71
|
-
// Flatten NamedRoutes entries: search schema objects -> plain string paths
|
|
72
70
|
if (genFileVars.length > 0) {
|
|
73
71
|
lines.push(
|
|
74
72
|
`function __flat(r) { const o = {}; for (const [k, v] of Object.entries(r)) o[k] = typeof v === "string" ? v : v.path; return o; }`,
|
|
75
73
|
);
|
|
76
74
|
}
|
|
77
75
|
|
|
78
|
-
// Build the merged manifest from gen file imports + inlined data
|
|
79
76
|
if (genFileVars.length === 1 && routersWithoutGenFile.length === 0) {
|
|
80
77
|
lines.push(`setCachedManifest(__flat(${genFileVars[0]}));`);
|
|
81
78
|
} else {
|
|
@@ -86,7 +83,6 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
86
83
|
lines.push(`setCachedManifest({ ${parts.join(", ")} });`);
|
|
87
84
|
}
|
|
88
85
|
|
|
89
|
-
// Set per-router manifests
|
|
90
86
|
let genVarIdx = 0;
|
|
91
87
|
for (const entry of state.perRouterManifests) {
|
|
92
88
|
if (entry.sourceFile) {
|
|
@@ -101,31 +97,19 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
101
97
|
}
|
|
102
98
|
}
|
|
103
99
|
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
lines.push(
|
|
117
|
-
`setPrecomputedEntries(${jsonParseExpression(state.mergedPrecomputedEntries)});`,
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
if (state.mergedRouteTrie) {
|
|
121
|
-
lines.push(
|
|
122
|
-
`setRouteTrie(${jsonParseExpression(state.mergedRouteTrie)});`,
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
100
|
+
// Per-router trie and precomputedEntries are NOT inlined eagerly.
|
|
101
|
+
// They live in the per-router lazy chunks (generatePerRouterModule) and
|
|
102
|
+
// are loaded via ensureRouterManifest(routerId), which is awaited before
|
|
103
|
+
// every request in router.fetch() and before findMatch is reached.
|
|
104
|
+
// Inlining the merged versions here would duplicate the per-router data
|
|
105
|
+
// (the merged trie/precomputedEntries equal the per-router data for
|
|
106
|
+
// single-router apps; for multi-router, the merged trie is dead code
|
|
107
|
+
// because find-match.ts only consumes per-router tries).
|
|
108
|
+
//
|
|
109
|
+
// In dev mode, the handler also falls back to Phase 2 regex matching
|
|
110
|
+
// against live router.urlpatterns, which is always correct after a
|
|
111
|
+
// program reload.
|
|
126
112
|
|
|
127
|
-
// Register lazy loaders for per-router manifest modules.
|
|
128
|
-
// Each import() uses a static string literal so Rollup creates separate chunks.
|
|
129
113
|
for (const routerId of state.perRouterManifestDataMap.keys()) {
|
|
130
114
|
lines.push(
|
|
131
115
|
`registerRouterManifestLoader(${JSON.stringify(routerId)}, () => import(${JSON.stringify(VIRTUAL_ROUTES_MANIFEST_ID + "/" + routerId)}));`,
|
|
@@ -139,9 +123,6 @@ export function generateRoutesManifestModule(state: DiscoveryState): string {
|
|
|
139
123
|
return lines.join("\n");
|
|
140
124
|
}
|
|
141
125
|
|
|
142
|
-
// No manifest: either discovery hasn't completed or no runner (Cloudflare dev).
|
|
143
|
-
// Still inject __PRERENDER_DEV_URL so the prerender store can fetch on-demand.
|
|
144
|
-
// Re-resolve origin now since the server is listening by module load time.
|
|
145
126
|
if (!state.isBuildMode) {
|
|
146
127
|
const origin =
|
|
147
128
|
state.devServerOrigin ||
|
|
@@ -170,7 +151,6 @@ export function generatePerRouterModule(
|
|
|
170
151
|
const lines: string[] = [];
|
|
171
152
|
|
|
172
153
|
if (routerEntry?.sourceFile) {
|
|
173
|
-
// Import manifest from the gen file so HMR auto-propagates
|
|
174
154
|
const routerDir = dirname(routerEntry.sourceFile);
|
|
175
155
|
const routerBasename = basename(routerEntry.sourceFile).replace(
|
|
176
156
|
/\.(tsx?|jsx?)$/,
|
|
@@ -199,5 +179,5 @@ export function generatePerRouterModule(
|
|
|
199
179
|
`export const precomputedEntries = ${jsonParseExpression(entries)};`,
|
|
200
180
|
);
|
|
201
181
|
}
|
|
202
|
-
return lines.join("\n") || "
|
|
182
|
+
return lines.join("\n") || "";
|
|
203
183
|
}
|
package/src/vite/index.ts
CHANGED
|
@@ -12,7 +12,11 @@ export { poke } from "./plugins/refresh-cmd.js";
|
|
|
12
12
|
export type {
|
|
13
13
|
RangoNodeOptions,
|
|
14
14
|
RangoCloudflareOptions,
|
|
15
|
+
RangoVercelOptions,
|
|
16
|
+
VercelPresetOptions,
|
|
15
17
|
RangoOptions,
|
|
18
|
+
ClientChunks,
|
|
19
|
+
ClientChunkMeta,
|
|
16
20
|
BuildEnvOption,
|
|
17
21
|
BuildEnvFactory,
|
|
18
22
|
BuildEnvFactoryContext,
|