@rangojs/router 0.32.0 → 0.33.1
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 +3 -2
- package/dist/bin/browser-7KIJ5HSV.js +15 -0
- package/dist/bin/chunk-3B7CKBRO.js +463 -0
- package/dist/bin/chunk-524VACCG.js +71 -0
- package/dist/bin/chunk-LD7UBHT4.js +196 -0
- package/dist/bin/chunk-TO6CRWLN.js +1429 -0
- package/dist/bin/chunk-TTXC2U3G.js +2477 -0
- package/dist/bin/client-urls-projection-DQLWPDAT.js +28 -0
- package/dist/bin/forward-user-plugins-URBZKJP4.js +62 -0
- package/dist/bin/rango.js +42 -10173
- package/dist/bin/runtime-EPUDEHO4.js +596 -0
- package/dist/bin/runtime-discovery-3HH6BP3K.js +352 -0
- package/dist/bin/state-ACD2MGKJ.js +16 -0
- package/dist/bin/temp-rsc-server-JALTIWLT.js +3190 -0
- package/dist/types/bin/rango.d.ts +1 -0
- package/dist/types/browser/action-fence.d.ts +20 -0
- package/dist/types/browser/cookie-name.d.ts +51 -10
- package/dist/types/browser/invalidate-client-cache.d.ts +8 -6
- package/dist/types/browser/navigation-bridge.d.ts +36 -1
- package/dist/types/browser/navigation-client.d.ts +19 -0
- package/dist/types/browser/navigation-store-handle.d.ts +37 -4
- package/dist/types/browser/navigation-store.d.ts +2 -2
- package/dist/types/browser/navigation-transaction.d.ts +0 -1
- package/dist/types/browser/partial-update.d.ts +13 -0
- package/dist/types/browser/prefetch/cache.d.ts +96 -8
- package/dist/types/browser/prefetch/fetch.d.ts +26 -2
- package/dist/types/browser/prefetch/queue.d.ts +3 -2
- package/dist/types/browser/rango-state.d.ts +34 -5
- package/dist/types/browser/react/Link.d.ts +15 -6
- package/dist/types/browser/types.d.ts +25 -0
- package/dist/types/build/generate-route-types.d.ts +1 -1
- package/dist/types/build/route-types/include-resolution.d.ts +9 -1
- package/dist/types/build/route-types/router-processing.d.ts +3 -1
- package/dist/types/cache/cache-key-utils.d.ts +12 -8
- package/dist/types/cache/cache-scope.d.ts +4 -2
- package/dist/types/cache/cf/cf-cache-types.d.ts +9 -5
- package/dist/types/cache/document-cache-policy.d.ts +9 -1
- package/dist/types/cache/memory-segment-store.d.ts +3 -2
- package/dist/types/cache/segment-codec.d.ts +2 -2
- package/dist/types/cache/shell-snapshot.d.ts +1 -1
- package/dist/types/cache/types.d.ts +12 -7
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +2 -1
- package/dist/types/client-urls/types.d.ts +7 -5
- package/dist/types/prefetch-markers.d.ts +9 -0
- package/dist/types/prefetch-source-scope.d.ts +66 -0
- package/dist/types/route-definition/helpers-types.d.ts +8 -5
- package/dist/types/router/intercept-resolution.d.ts +25 -11
- package/dist/types/router/match-context.d.ts +1 -0
- package/dist/types/router/match-handlers.d.ts +1 -1
- package/dist/types/router/prefetch-cache-ttl.d.ts +11 -3
- package/dist/types/router/router-context.d.ts +1 -1
- package/dist/types/router/router-options.d.ts +6 -3
- package/dist/types/router/segment-resolution/loader-cache.d.ts +8 -0
- package/dist/types/router/segment-resolution/prefetch-deferral.d.ts +23 -7
- package/dist/types/router/segment-resolution/revalidation.d.ts +19 -0
- package/dist/types/router/source-reads.d.ts +53 -0
- package/dist/types/router/types.d.ts +1 -1
- package/dist/types/rsc/helpers.d.ts +5 -2
- package/dist/types/rsc/prefetch-render-error.d.ts +7 -2
- package/dist/types/rsc/request-stages.d.ts +2 -0
- package/dist/types/rsc/shell-serve.d.ts +6 -1
- package/dist/types/server/context.d.ts +23 -6
- package/dist/types/server/cookie-store.d.ts +15 -1
- package/dist/types/server/document-location-state.d.ts +5 -2
- package/dist/types/server/handle-store.d.ts +2 -0
- package/dist/types/server/request-context.d.ts +43 -7
- package/dist/types/testing/e2e/server.d.ts +16 -1
- package/dist/types/testing/render-route.d.ts +66 -2
- package/dist/types/testing/serve-shell-request.d.ts +6 -3
- package/dist/types/types/handler-context.d.ts +7 -5
- package/dist/types/types/loader-types.d.ts +7 -4
- package/dist/types/types/segments.d.ts +15 -4
- package/dist/types/urls/path-helper-types.d.ts +7 -5
- package/dist/types/vite/temp-rsc-server.d.ts +2 -2
- package/dist/vite/index.js +449 -189
- package/package.json +2 -2
- package/skills/app-structure/SKILL.md +81 -0
- package/skills/app-structure/e-commerce.md +10 -9
- package/skills/app-structure/large-app.md +18 -2
- package/skills/caching/SKILL.md +10 -5
- package/skills/client-urls/SKILL.md +29 -11
- package/skills/comparison/references/framework-comparison.md +13 -8
- package/skills/document-cache/SKILL.md +8 -0
- package/skills/hooks/navigation.md +8 -8
- package/skills/hooks/outlets.md +4 -0
- package/skills/hooks/state.md +24 -8
- package/skills/intercept/SKILL.md +33 -12
- package/skills/layout/SKILL.md +60 -0
- package/skills/links/SKILL.md +101 -4
- package/skills/loader/SKILL.md +49 -22
- package/skills/migrate-nextjs/SKILL.md +8 -2
- package/skills/migrate-react-router/data-and-actions.md +5 -0
- package/skills/ppr/SKILL.md +26 -5
- package/skills/prerender/SKILL.md +4 -1
- package/skills/route/SKILL.md +6 -6
- package/skills/router-setup/SKILL.md +2 -1
- package/skills/server-actions/SKILL.md +41 -8
- package/skills/testing/client-components.md +29 -13
- package/skills/testing/serve-shell-request.md +7 -7
- package/skills/testing/server-actions.md +8 -0
- package/skills/ux-architecture/SKILL.md +70 -19
- package/src/bin/rango.ts +39 -13
- package/src/browser/action-fence.ts +72 -0
- package/src/browser/cookie-name.ts +82 -14
- package/src/browser/invalidate-client-cache.ts +9 -7
- package/src/browser/navigation-bridge.ts +164 -32
- package/src/browser/navigation-client.ts +95 -20
- package/src/browser/navigation-store-handle.ts +67 -5
- package/src/browser/navigation-store.ts +86 -17
- package/src/browser/navigation-transaction.ts +0 -6
- package/src/browser/partial-update.ts +31 -12
- package/src/browser/prefetch/cache.ts +188 -11
- package/src/browser/prefetch/fetch.ts +211 -51
- package/src/browser/prefetch/queue.ts +3 -2
- package/src/browser/rango-state.ts +50 -8
- package/src/browser/react/Link.tsx +20 -9
- package/src/browser/react/use-navigation.ts +1 -1
- package/src/browser/rsc-router.tsx +8 -1
- package/src/browser/server-action-bridge.ts +16 -11
- package/src/browser/types.ts +25 -0
- package/src/build/generate-route-types.ts +1 -0
- package/src/build/route-types/include-resolution.ts +40 -3
- package/src/build/route-types/router-processing.ts +170 -25
- package/src/build/route-types/scan-filter.ts +1 -0
- package/src/cache/cache-key-utils.ts +12 -8
- package/src/cache/cache-runtime.ts +5 -1
- package/src/cache/cache-scope.ts +28 -7
- package/src/cache/cf/cf-cache-types.ts +9 -5
- package/src/cache/document-cache-policy.ts +27 -0
- package/src/cache/document-cache.ts +5 -0
- package/src/cache/memory-segment-store.ts +3 -2
- package/src/cache/segment-codec.ts +2 -2
- package/src/cache/shell-snapshot.ts +1 -1
- package/src/cache/types.ts +12 -7
- package/src/cache/vercel/vercel-cache-store.ts +2 -1
- package/src/client-urls/types.ts +7 -5
- package/src/prefetch-markers.ts +10 -0
- package/src/prefetch-source-scope.ts +137 -0
- package/src/route-definition/helpers-types.ts +8 -5
- package/src/router/intercept-resolution.ts +94 -50
- package/src/router/loader-resolution.ts +8 -6
- package/src/router/match-api.ts +33 -29
- package/src/router/match-context.ts +5 -0
- package/src/router/match-handlers.ts +2 -1
- package/src/router/match-middleware/cache-lookup.ts +21 -13
- package/src/router/match-result.ts +39 -87
- package/src/router/navigation-snapshot.ts +18 -3
- package/src/router/prefetch-cache-ttl.ts +15 -3
- package/src/router/revalidation.ts +53 -23
- package/src/router/router-context.ts +2 -1
- package/src/router/router-options.ts +6 -3
- package/src/router/segment-resolution/loader-cache.ts +21 -3
- package/src/router/segment-resolution/prefetch-deferral.ts +38 -31
- package/src/router/segment-resolution/revalidation.ts +40 -12
- package/src/router/source-reads.ts +122 -0
- package/src/router/types.ts +2 -1
- package/src/router.ts +11 -12
- package/src/rsc/helpers.ts +8 -3
- package/src/rsc/prefetch-render-error.ts +7 -2
- package/src/rsc/progressive-enhancement.ts +3 -2
- package/src/rsc/request-stages.ts +59 -0
- package/src/rsc/rsc-rendering.ts +49 -33
- package/src/rsc/server-action.ts +2 -1
- package/src/rsc/shell-capture.ts +4 -5
- package/src/rsc/shell-serve.ts +12 -1
- package/src/segment-system.tsx +1 -1
- package/src/server/context.ts +37 -6
- package/src/server/cookie-store.ts +22 -1
- package/src/server/document-location-state.ts +23 -2
- package/src/server/handle-store.ts +2 -0
- package/src/server/request-context.ts +113 -28
- package/src/testing/dispatch.ts +3 -0
- package/src/testing/e2e/fixture.ts +4 -12
- package/src/testing/e2e/server.ts +91 -4
- package/src/testing/render-route.tsx +269 -4
- package/src/testing/serve-shell-request.ts +6 -3
- package/src/types/handler-context.ts +7 -5
- package/src/types/loader-types.ts +7 -4
- package/src/types/segments.ts +15 -4
- package/src/urls/path-helper-types.ts +7 -5
- package/src/vite/temp-rsc-server.ts +2 -2
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import {
|
|
2
|
+
genFileTsPath,
|
|
3
|
+
generateRouteTypesSource,
|
|
4
|
+
resolveSearchSchemas
|
|
5
|
+
} from "./chunk-TO6CRWLN.js";
|
|
6
|
+
import {
|
|
7
|
+
isAutoGeneratedRouteName
|
|
8
|
+
} from "./chunk-LD7UBHT4.js";
|
|
9
|
+
|
|
10
|
+
// src/build/runtime-discovery.ts
|
|
11
|
+
import { basename, resolve } from "node:path";
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
13
|
+
|
|
14
|
+
// src/build/merge-full-manifests.ts
|
|
15
|
+
function clonePrefixNode(node) {
|
|
16
|
+
return {
|
|
17
|
+
staticPrefix: node.staticPrefix,
|
|
18
|
+
fullPrefix: node.fullPrefix,
|
|
19
|
+
...node.namePrefix === void 0 ? {} : { namePrefix: node.namePrefix },
|
|
20
|
+
children: clonePrefixTree(node.children),
|
|
21
|
+
routes: [...node.routes]
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function clonePrefixTree(tree) {
|
|
25
|
+
return Object.fromEntries(
|
|
26
|
+
Object.entries(tree).map(([prefix, node]) => [
|
|
27
|
+
prefix,
|
|
28
|
+
clonePrefixNode(node)
|
|
29
|
+
])
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function removeRoutesFromPrefixTree(tree, routeNames) {
|
|
33
|
+
return Object.fromEntries(
|
|
34
|
+
Object.entries(tree).map(([prefix, node]) => [
|
|
35
|
+
prefix,
|
|
36
|
+
{
|
|
37
|
+
staticPrefix: node.staticPrefix,
|
|
38
|
+
fullPrefix: node.fullPrefix,
|
|
39
|
+
...node.namePrefix === void 0 ? {} : { namePrefix: node.namePrefix },
|
|
40
|
+
children: removeRoutesFromPrefixTree(node.children, routeNames),
|
|
41
|
+
routes: node.routes.filter((name) => !routeNames.has(name))
|
|
42
|
+
}
|
|
43
|
+
])
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
function mergePrefixTrees(earlier, later) {
|
|
47
|
+
const merged = clonePrefixTree(earlier);
|
|
48
|
+
for (const [prefix, laterNode] of Object.entries(later)) {
|
|
49
|
+
const earlierNode = merged[prefix];
|
|
50
|
+
if (!earlierNode) {
|
|
51
|
+
merged[prefix] = clonePrefixNode(laterNode);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
merged[prefix] = {
|
|
55
|
+
staticPrefix: laterNode.staticPrefix,
|
|
56
|
+
fullPrefix: laterNode.fullPrefix,
|
|
57
|
+
...laterNode.namePrefix === void 0 ? {} : { namePrefix: laterNode.namePrefix },
|
|
58
|
+
children: mergePrefixTrees(earlierNode.children, laterNode.children),
|
|
59
|
+
routes: [.../* @__PURE__ */ new Set([...earlierNode.routes, ...laterNode.routes])]
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return merged;
|
|
63
|
+
}
|
|
64
|
+
function mergeRouteRecord(earlier, later, overwrittenRoutes, cloneValue) {
|
|
65
|
+
const merged = {};
|
|
66
|
+
for (const [name, value] of Object.entries(earlier ?? {})) {
|
|
67
|
+
if (!overwrittenRoutes.has(name)) merged[name] = cloneValue(value);
|
|
68
|
+
}
|
|
69
|
+
for (const [name, value] of Object.entries(later ?? {})) {
|
|
70
|
+
merged[name] = cloneValue(value);
|
|
71
|
+
}
|
|
72
|
+
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
73
|
+
}
|
|
74
|
+
function mergeRouteList(earlier, later, overwrittenRoutes) {
|
|
75
|
+
const merged = [
|
|
76
|
+
...(earlier ?? []).filter((name) => !overwrittenRoutes.has(name)),
|
|
77
|
+
...later ?? []
|
|
78
|
+
];
|
|
79
|
+
const unique = [...new Set(merged)];
|
|
80
|
+
return unique.length > 0 ? unique : void 0;
|
|
81
|
+
}
|
|
82
|
+
function mergeFullManifests(manifests) {
|
|
83
|
+
let merged = {
|
|
84
|
+
prefixTree: {},
|
|
85
|
+
routeManifest: {}
|
|
86
|
+
};
|
|
87
|
+
for (const manifest of manifests) {
|
|
88
|
+
const overwrittenRoutes = new Set(Object.keys(manifest.routeManifest));
|
|
89
|
+
const prefixTreeWithoutOverwrites = removeRoutesFromPrefixTree(
|
|
90
|
+
merged.prefixTree,
|
|
91
|
+
overwrittenRoutes
|
|
92
|
+
);
|
|
93
|
+
merged = {
|
|
94
|
+
prefixTree: mergePrefixTrees(
|
|
95
|
+
prefixTreeWithoutOverwrites,
|
|
96
|
+
manifest.prefixTree
|
|
97
|
+
),
|
|
98
|
+
routeManifest: {
|
|
99
|
+
...merged.routeManifest,
|
|
100
|
+
...manifest.routeManifest
|
|
101
|
+
},
|
|
102
|
+
routeTrailingSlash: mergeRouteRecord(
|
|
103
|
+
merged.routeTrailingSlash,
|
|
104
|
+
manifest.routeTrailingSlash,
|
|
105
|
+
overwrittenRoutes,
|
|
106
|
+
(value) => value
|
|
107
|
+
),
|
|
108
|
+
prerenderRoutes: mergeRouteList(
|
|
109
|
+
merged.prerenderRoutes,
|
|
110
|
+
manifest.prerenderRoutes,
|
|
111
|
+
overwrittenRoutes
|
|
112
|
+
),
|
|
113
|
+
passthroughRoutes: mergeRouteList(
|
|
114
|
+
merged.passthroughRoutes,
|
|
115
|
+
manifest.passthroughRoutes,
|
|
116
|
+
overwrittenRoutes
|
|
117
|
+
),
|
|
118
|
+
onDemandRoutes: mergeRouteList(
|
|
119
|
+
merged.onDemandRoutes,
|
|
120
|
+
manifest.onDemandRoutes,
|
|
121
|
+
overwrittenRoutes
|
|
122
|
+
),
|
|
123
|
+
responseTypeRoutes: mergeRouteRecord(
|
|
124
|
+
merged.responseTypeRoutes,
|
|
125
|
+
manifest.responseTypeRoutes,
|
|
126
|
+
overwrittenRoutes,
|
|
127
|
+
(value) => value
|
|
128
|
+
),
|
|
129
|
+
routeSearchSchemas: mergeRouteRecord(
|
|
130
|
+
merged.routeSearchSchemas,
|
|
131
|
+
manifest.routeSearchSchemas,
|
|
132
|
+
overwrittenRoutes,
|
|
133
|
+
(value) => ({ ...value })
|
|
134
|
+
),
|
|
135
|
+
_prerenderDefs: mergeRouteRecord(
|
|
136
|
+
merged._prerenderDefs,
|
|
137
|
+
manifest._prerenderDefs,
|
|
138
|
+
overwrittenRoutes,
|
|
139
|
+
(value) => value
|
|
140
|
+
)
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return merged;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/build/runtime-discovery.ts
|
|
147
|
+
async function discoverAndWriteRouteTypes(opts) {
|
|
148
|
+
let loadConfigFromFile;
|
|
149
|
+
let resolveConfig;
|
|
150
|
+
try {
|
|
151
|
+
const vite = await import("vite");
|
|
152
|
+
loadConfigFromFile = vite.loadConfigFromFile;
|
|
153
|
+
resolveConfig = vite.resolveConfig;
|
|
154
|
+
} catch {
|
|
155
|
+
throw new Error(
|
|
156
|
+
"Runtime discovery requires 'vite'. Install it with: pnpm add -D vite"
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
await import("@vitejs/plugin-rsc");
|
|
161
|
+
} catch {
|
|
162
|
+
throw new Error(
|
|
163
|
+
"Runtime discovery requires '@vitejs/plugin-rsc'. Install it with: pnpm add -D @vitejs/plugin-rsc"
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
const { createTempRscServer } = await import("./temp-rsc-server-JALTIWLT.js");
|
|
167
|
+
const { createDiscoveryState } = await import("./state-ACD2MGKJ.js");
|
|
168
|
+
const { discoverClientUrlProjections } = await import("./client-urls-projection-DQLWPDAT.js");
|
|
169
|
+
const {
|
|
170
|
+
isFrameworkPlugin,
|
|
171
|
+
pickForwardedRunnerConfig,
|
|
172
|
+
selectForwardableResolvePlugins
|
|
173
|
+
} = await import("./forward-user-plugins-URBZKJP4.js");
|
|
174
|
+
const entryPath = resolve(opts.entry);
|
|
175
|
+
const state = createDiscoveryState(entryPath, void 0);
|
|
176
|
+
state.projectRoot = opts.root;
|
|
177
|
+
state.userResolveAlias = opts.resolveAlias;
|
|
178
|
+
if (!opts.resolveAlias) {
|
|
179
|
+
try {
|
|
180
|
+
const loaded = await loadConfigFromFile(
|
|
181
|
+
{ command: "serve", mode: "development" },
|
|
182
|
+
opts.configFile,
|
|
183
|
+
opts.root
|
|
184
|
+
);
|
|
185
|
+
if (loaded) {
|
|
186
|
+
state.userRunnerConfig = pickForwardedRunnerConfig(loaded.config);
|
|
187
|
+
const userPlugins = (await flattenPluginOptions(loaded.config.plugins)).filter((p) => !isFrameworkPlugin(p.name ?? ""));
|
|
188
|
+
try {
|
|
189
|
+
const resolved = await resolveConfig(
|
|
190
|
+
{
|
|
191
|
+
...loaded.config,
|
|
192
|
+
root: opts.root,
|
|
193
|
+
configFile: false,
|
|
194
|
+
plugins: userPlugins
|
|
195
|
+
},
|
|
196
|
+
"serve",
|
|
197
|
+
"development"
|
|
198
|
+
);
|
|
199
|
+
state.userResolvePlugins = selectForwardableResolvePlugins(
|
|
200
|
+
resolved.plugins
|
|
201
|
+
);
|
|
202
|
+
} catch (err) {
|
|
203
|
+
console.warn(
|
|
204
|
+
`[rango] Could not resolve the Vite config (${err?.message ?? err}); forwarding its resolver plugins without their config hooks. rango() and rsc() are left out of that resolve, so a plugin that needs the rsc environment fails there`
|
|
205
|
+
);
|
|
206
|
+
const serveEnv = { command: "serve", mode: "development" };
|
|
207
|
+
state.userResolvePlugins = selectForwardableResolvePlugins(
|
|
208
|
+
userPlugins.filter(
|
|
209
|
+
(p) => typeof p.apply === "function" ? p.apply(loaded.config, serveEnv) : p.apply !== "build"
|
|
210
|
+
)
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} catch (err) {
|
|
215
|
+
console.warn(
|
|
216
|
+
`[rango] Could not load the Vite config (${err?.message ?? err}); discovering without its resolve config and plugins`
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
let tempServer = null;
|
|
221
|
+
try {
|
|
222
|
+
tempServer = await createTempRscServer(state, {
|
|
223
|
+
cacheDir: "node_modules/.vite_rango_generate",
|
|
224
|
+
plugins: [missingGenFileStubPlugin()]
|
|
225
|
+
});
|
|
226
|
+
const rscEnv = tempServer.environments?.rsc;
|
|
227
|
+
if (!rscEnv?.runner) {
|
|
228
|
+
throw new Error("RSC environment runner not available");
|
|
229
|
+
}
|
|
230
|
+
await rscEnv.runner.import(entryPath);
|
|
231
|
+
const serverMod = await rscEnv.runner.import("@rangojs/router/server");
|
|
232
|
+
const registry = serverMod.RouterRegistry;
|
|
233
|
+
if (!registry || registry.size === 0) {
|
|
234
|
+
throw new Error(
|
|
235
|
+
`No routers found in registry after importing ${opts.entry}`
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
await discoverClientUrlProjections(
|
|
239
|
+
state,
|
|
240
|
+
tempServer.environments?.ssr,
|
|
241
|
+
serverMod,
|
|
242
|
+
rscEnv
|
|
243
|
+
);
|
|
244
|
+
const buildMod = await rscEnv.runner.import("@rangojs/router/build");
|
|
245
|
+
const generateManifestFull = buildMod.generateManifestFull;
|
|
246
|
+
if (!generateManifestFull) {
|
|
247
|
+
throw new Error(
|
|
248
|
+
"generateManifestFull not found in @rangojs/router/build"
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
const outputFiles = [];
|
|
252
|
+
let totalRouteCount = 0;
|
|
253
|
+
let globalMountIndex = 0;
|
|
254
|
+
let routerCount = 0;
|
|
255
|
+
for (const [id, router] of registry) {
|
|
256
|
+
const mounts = router.__urlpatternMounts ?? (router.urlpatterns ? [{ patterns: router.urlpatterns }] : []);
|
|
257
|
+
if (mounts.length === 0) continue;
|
|
258
|
+
const mountManifests = [];
|
|
259
|
+
for (const mount of mounts) {
|
|
260
|
+
mountManifests.push(
|
|
261
|
+
await generateManifestFull(
|
|
262
|
+
mount.patterns,
|
|
263
|
+
globalMountIndex,
|
|
264
|
+
router.__basename ? { urlPrefix: router.__basename } : void 0
|
|
265
|
+
)
|
|
266
|
+
);
|
|
267
|
+
globalMountIndex++;
|
|
268
|
+
}
|
|
269
|
+
const manifest = mergeFullManifests(mountManifests);
|
|
270
|
+
routerCount++;
|
|
271
|
+
const rawManifest = manifest.routeManifest;
|
|
272
|
+
const routeManifest = {};
|
|
273
|
+
for (const [name, pattern] of Object.entries(rawManifest)) {
|
|
274
|
+
if (!isAutoGeneratedRouteName(name)) {
|
|
275
|
+
routeManifest[name] = pattern;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
let routeSearchSchemas = manifest.routeSearchSchemas;
|
|
279
|
+
const sourceFile = router.__sourceFile;
|
|
280
|
+
if (!sourceFile) {
|
|
281
|
+
console.warn(
|
|
282
|
+
`[rango] Router "${id}" has no __sourceFile, skipping gen file`
|
|
283
|
+
);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (sourceFile.includes("node_modules")) {
|
|
287
|
+
throw new Error(
|
|
288
|
+
`[rango] Router "${id}" has sourceFile inside node_modules: ${sourceFile}
|
|
289
|
+
This means createRouter() stack trace parsing matched an internal frame.
|
|
290
|
+
Set an explicit \`id\` on createRouter() or check the call site.`
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
routeSearchSchemas = resolveSearchSchemas(
|
|
294
|
+
Object.keys(routeManifest),
|
|
295
|
+
routeSearchSchemas,
|
|
296
|
+
sourceFile
|
|
297
|
+
);
|
|
298
|
+
const outPath = genFileTsPath(sourceFile);
|
|
299
|
+
const source = generateRouteTypesSource(
|
|
300
|
+
routeManifest,
|
|
301
|
+
routeSearchSchemas && Object.keys(routeSearchSchemas).length > 0 ? routeSearchSchemas : void 0
|
|
302
|
+
);
|
|
303
|
+
const existing = existsSync(outPath) ? readFileSync(outPath, "utf-8") : null;
|
|
304
|
+
if (existing !== source) {
|
|
305
|
+
writeFileSync(outPath, source);
|
|
306
|
+
}
|
|
307
|
+
const routeCount = Object.keys(routeManifest).length;
|
|
308
|
+
totalRouteCount += routeCount;
|
|
309
|
+
outputFiles.push(outPath);
|
|
310
|
+
console.log(
|
|
311
|
+
`[rango] Generated route types (${routeCount} routes) -> ${outPath}`
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
routerCount,
|
|
316
|
+
routeCount: totalRouteCount,
|
|
317
|
+
outputFiles
|
|
318
|
+
};
|
|
319
|
+
} finally {
|
|
320
|
+
if (tempServer) {
|
|
321
|
+
await tempServer.close();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
var MISSING_GEN_PREFIX = "\0rango-missing-named-routes-gen:";
|
|
326
|
+
function missingGenFileStubPlugin() {
|
|
327
|
+
return {
|
|
328
|
+
name: "@rangojs/router:missing-gen-file-stub",
|
|
329
|
+
enforce: "pre",
|
|
330
|
+
resolveId(id, importer) {
|
|
331
|
+
if (!importer || !id.endsWith(".named-routes.gen.js")) return null;
|
|
332
|
+
const genPath = genFileTsPath(importer.split("?", 1)[0]);
|
|
333
|
+
if (id !== `./${basename(genPath, ".ts")}.js` || existsSync(genPath)) {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
return MISSING_GEN_PREFIX + genPath;
|
|
337
|
+
},
|
|
338
|
+
load(id) {
|
|
339
|
+
return id.startsWith(MISSING_GEN_PREFIX) ? "export const NamedRoutes = {};\n" : null;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
async function flattenPluginOptions(option) {
|
|
344
|
+
const value = await option;
|
|
345
|
+
if (Array.isArray(value)) {
|
|
346
|
+
return (await Promise.all(value.map(flattenPluginOptions))).flat();
|
|
347
|
+
}
|
|
348
|
+
return value ? [value] : [];
|
|
349
|
+
}
|
|
350
|
+
export {
|
|
351
|
+
discoverAndWriteRouteTypes
|
|
352
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VIRTUAL_LOADER_MANIFEST_ID,
|
|
3
|
+
VIRTUAL_ROUTES_MANIFEST_ID,
|
|
4
|
+
canRefreshRuntimeDiscovery,
|
|
5
|
+
createClientUrlRevalidateIndex,
|
|
6
|
+
createDiscoveryState,
|
|
7
|
+
recordDiscoveryFailure
|
|
8
|
+
} from "./chunk-524VACCG.js";
|
|
9
|
+
export {
|
|
10
|
+
VIRTUAL_LOADER_MANIFEST_ID,
|
|
11
|
+
VIRTUAL_ROUTES_MANIFEST_ID,
|
|
12
|
+
canRefreshRuntimeDiscovery,
|
|
13
|
+
createClientUrlRevalidateIndex,
|
|
14
|
+
createDiscoveryState,
|
|
15
|
+
recordDiscoveryFailure
|
|
16
|
+
};
|