@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.
Files changed (181) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/browser-7KIJ5HSV.js +15 -0
  3. package/dist/bin/chunk-3B7CKBRO.js +463 -0
  4. package/dist/bin/chunk-524VACCG.js +71 -0
  5. package/dist/bin/chunk-LD7UBHT4.js +196 -0
  6. package/dist/bin/chunk-TO6CRWLN.js +1429 -0
  7. package/dist/bin/chunk-TTXC2U3G.js +2477 -0
  8. package/dist/bin/client-urls-projection-DQLWPDAT.js +28 -0
  9. package/dist/bin/forward-user-plugins-URBZKJP4.js +62 -0
  10. package/dist/bin/rango.js +42 -10173
  11. package/dist/bin/runtime-EPUDEHO4.js +596 -0
  12. package/dist/bin/runtime-discovery-3HH6BP3K.js +352 -0
  13. package/dist/bin/state-ACD2MGKJ.js +16 -0
  14. package/dist/bin/temp-rsc-server-JALTIWLT.js +3190 -0
  15. package/dist/types/bin/rango.d.ts +1 -0
  16. package/dist/types/browser/action-fence.d.ts +20 -0
  17. package/dist/types/browser/cookie-name.d.ts +51 -10
  18. package/dist/types/browser/invalidate-client-cache.d.ts +8 -6
  19. package/dist/types/browser/navigation-bridge.d.ts +36 -1
  20. package/dist/types/browser/navigation-client.d.ts +19 -0
  21. package/dist/types/browser/navigation-store-handle.d.ts +37 -4
  22. package/dist/types/browser/navigation-store.d.ts +2 -2
  23. package/dist/types/browser/navigation-transaction.d.ts +0 -1
  24. package/dist/types/browser/partial-update.d.ts +13 -0
  25. package/dist/types/browser/prefetch/cache.d.ts +96 -8
  26. package/dist/types/browser/prefetch/fetch.d.ts +26 -2
  27. package/dist/types/browser/prefetch/queue.d.ts +3 -2
  28. package/dist/types/browser/rango-state.d.ts +34 -5
  29. package/dist/types/browser/react/Link.d.ts +15 -6
  30. package/dist/types/browser/types.d.ts +25 -0
  31. package/dist/types/build/generate-route-types.d.ts +1 -1
  32. package/dist/types/build/route-types/include-resolution.d.ts +9 -1
  33. package/dist/types/build/route-types/router-processing.d.ts +3 -1
  34. package/dist/types/cache/cache-key-utils.d.ts +12 -8
  35. package/dist/types/cache/cache-scope.d.ts +4 -2
  36. package/dist/types/cache/cf/cf-cache-types.d.ts +9 -5
  37. package/dist/types/cache/document-cache-policy.d.ts +9 -1
  38. package/dist/types/cache/memory-segment-store.d.ts +3 -2
  39. package/dist/types/cache/segment-codec.d.ts +2 -2
  40. package/dist/types/cache/shell-snapshot.d.ts +1 -1
  41. package/dist/types/cache/types.d.ts +12 -7
  42. package/dist/types/cache/vercel/vercel-cache-store.d.ts +2 -1
  43. package/dist/types/client-urls/types.d.ts +7 -5
  44. package/dist/types/prefetch-markers.d.ts +9 -0
  45. package/dist/types/prefetch-source-scope.d.ts +66 -0
  46. package/dist/types/route-definition/helpers-types.d.ts +8 -5
  47. package/dist/types/router/intercept-resolution.d.ts +25 -11
  48. package/dist/types/router/match-context.d.ts +1 -0
  49. package/dist/types/router/match-handlers.d.ts +1 -1
  50. package/dist/types/router/prefetch-cache-ttl.d.ts +11 -3
  51. package/dist/types/router/router-context.d.ts +1 -1
  52. package/dist/types/router/router-options.d.ts +6 -3
  53. package/dist/types/router/segment-resolution/loader-cache.d.ts +8 -0
  54. package/dist/types/router/segment-resolution/prefetch-deferral.d.ts +23 -7
  55. package/dist/types/router/segment-resolution/revalidation.d.ts +19 -0
  56. package/dist/types/router/source-reads.d.ts +53 -0
  57. package/dist/types/router/types.d.ts +1 -1
  58. package/dist/types/rsc/helpers.d.ts +5 -2
  59. package/dist/types/rsc/prefetch-render-error.d.ts +7 -2
  60. package/dist/types/rsc/request-stages.d.ts +2 -0
  61. package/dist/types/rsc/shell-serve.d.ts +6 -1
  62. package/dist/types/server/context.d.ts +23 -6
  63. package/dist/types/server/cookie-store.d.ts +15 -1
  64. package/dist/types/server/document-location-state.d.ts +5 -2
  65. package/dist/types/server/handle-store.d.ts +2 -0
  66. package/dist/types/server/request-context.d.ts +43 -7
  67. package/dist/types/testing/e2e/server.d.ts +16 -1
  68. package/dist/types/testing/render-route.d.ts +66 -2
  69. package/dist/types/testing/serve-shell-request.d.ts +6 -3
  70. package/dist/types/types/handler-context.d.ts +7 -5
  71. package/dist/types/types/loader-types.d.ts +7 -4
  72. package/dist/types/types/segments.d.ts +15 -4
  73. package/dist/types/urls/path-helper-types.d.ts +7 -5
  74. package/dist/types/vite/temp-rsc-server.d.ts +2 -2
  75. package/dist/vite/index.js +449 -189
  76. package/package.json +2 -2
  77. package/skills/app-structure/SKILL.md +81 -0
  78. package/skills/app-structure/e-commerce.md +10 -9
  79. package/skills/app-structure/large-app.md +18 -2
  80. package/skills/caching/SKILL.md +10 -5
  81. package/skills/client-urls/SKILL.md +29 -11
  82. package/skills/comparison/references/framework-comparison.md +13 -8
  83. package/skills/document-cache/SKILL.md +8 -0
  84. package/skills/hooks/navigation.md +8 -8
  85. package/skills/hooks/outlets.md +4 -0
  86. package/skills/hooks/state.md +24 -8
  87. package/skills/intercept/SKILL.md +33 -12
  88. package/skills/layout/SKILL.md +60 -0
  89. package/skills/links/SKILL.md +101 -4
  90. package/skills/loader/SKILL.md +49 -22
  91. package/skills/migrate-nextjs/SKILL.md +8 -2
  92. package/skills/migrate-react-router/data-and-actions.md +5 -0
  93. package/skills/ppr/SKILL.md +26 -5
  94. package/skills/prerender/SKILL.md +4 -1
  95. package/skills/route/SKILL.md +6 -6
  96. package/skills/router-setup/SKILL.md +2 -1
  97. package/skills/server-actions/SKILL.md +41 -8
  98. package/skills/testing/client-components.md +29 -13
  99. package/skills/testing/serve-shell-request.md +7 -7
  100. package/skills/testing/server-actions.md +8 -0
  101. package/skills/ux-architecture/SKILL.md +70 -19
  102. package/src/bin/rango.ts +39 -13
  103. package/src/browser/action-fence.ts +72 -0
  104. package/src/browser/cookie-name.ts +82 -14
  105. package/src/browser/invalidate-client-cache.ts +9 -7
  106. package/src/browser/navigation-bridge.ts +164 -32
  107. package/src/browser/navigation-client.ts +95 -20
  108. package/src/browser/navigation-store-handle.ts +67 -5
  109. package/src/browser/navigation-store.ts +86 -17
  110. package/src/browser/navigation-transaction.ts +0 -6
  111. package/src/browser/partial-update.ts +31 -12
  112. package/src/browser/prefetch/cache.ts +188 -11
  113. package/src/browser/prefetch/fetch.ts +211 -51
  114. package/src/browser/prefetch/queue.ts +3 -2
  115. package/src/browser/rango-state.ts +50 -8
  116. package/src/browser/react/Link.tsx +20 -9
  117. package/src/browser/react/use-navigation.ts +1 -1
  118. package/src/browser/rsc-router.tsx +8 -1
  119. package/src/browser/server-action-bridge.ts +16 -11
  120. package/src/browser/types.ts +25 -0
  121. package/src/build/generate-route-types.ts +1 -0
  122. package/src/build/route-types/include-resolution.ts +40 -3
  123. package/src/build/route-types/router-processing.ts +170 -25
  124. package/src/build/route-types/scan-filter.ts +1 -0
  125. package/src/cache/cache-key-utils.ts +12 -8
  126. package/src/cache/cache-runtime.ts +5 -1
  127. package/src/cache/cache-scope.ts +28 -7
  128. package/src/cache/cf/cf-cache-types.ts +9 -5
  129. package/src/cache/document-cache-policy.ts +27 -0
  130. package/src/cache/document-cache.ts +5 -0
  131. package/src/cache/memory-segment-store.ts +3 -2
  132. package/src/cache/segment-codec.ts +2 -2
  133. package/src/cache/shell-snapshot.ts +1 -1
  134. package/src/cache/types.ts +12 -7
  135. package/src/cache/vercel/vercel-cache-store.ts +2 -1
  136. package/src/client-urls/types.ts +7 -5
  137. package/src/prefetch-markers.ts +10 -0
  138. package/src/prefetch-source-scope.ts +137 -0
  139. package/src/route-definition/helpers-types.ts +8 -5
  140. package/src/router/intercept-resolution.ts +94 -50
  141. package/src/router/loader-resolution.ts +8 -6
  142. package/src/router/match-api.ts +33 -29
  143. package/src/router/match-context.ts +5 -0
  144. package/src/router/match-handlers.ts +2 -1
  145. package/src/router/match-middleware/cache-lookup.ts +21 -13
  146. package/src/router/match-result.ts +39 -87
  147. package/src/router/navigation-snapshot.ts +18 -3
  148. package/src/router/prefetch-cache-ttl.ts +15 -3
  149. package/src/router/revalidation.ts +53 -23
  150. package/src/router/router-context.ts +2 -1
  151. package/src/router/router-options.ts +6 -3
  152. package/src/router/segment-resolution/loader-cache.ts +21 -3
  153. package/src/router/segment-resolution/prefetch-deferral.ts +38 -31
  154. package/src/router/segment-resolution/revalidation.ts +40 -12
  155. package/src/router/source-reads.ts +122 -0
  156. package/src/router/types.ts +2 -1
  157. package/src/router.ts +11 -12
  158. package/src/rsc/helpers.ts +8 -3
  159. package/src/rsc/prefetch-render-error.ts +7 -2
  160. package/src/rsc/progressive-enhancement.ts +3 -2
  161. package/src/rsc/request-stages.ts +59 -0
  162. package/src/rsc/rsc-rendering.ts +49 -33
  163. package/src/rsc/server-action.ts +2 -1
  164. package/src/rsc/shell-capture.ts +4 -5
  165. package/src/rsc/shell-serve.ts +12 -1
  166. package/src/segment-system.tsx +1 -1
  167. package/src/server/context.ts +37 -6
  168. package/src/server/cookie-store.ts +22 -1
  169. package/src/server/document-location-state.ts +23 -2
  170. package/src/server/handle-store.ts +2 -0
  171. package/src/server/request-context.ts +113 -28
  172. package/src/testing/dispatch.ts +3 -0
  173. package/src/testing/e2e/fixture.ts +4 -12
  174. package/src/testing/e2e/server.ts +91 -4
  175. package/src/testing/render-route.tsx +269 -4
  176. package/src/testing/serve-shell-request.ts +6 -3
  177. package/src/types/handler-context.ts +7 -5
  178. package/src/types/loader-types.ts +7 -4
  179. package/src/types/segments.ts +15 -4
  180. package/src/urls/path-helper-types.ts +7 -5
  181. 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
+ };