@rangojs/router 0.0.0-experimental.e9c0b2f2 → 0.0.0-experimental.ea9f40f2

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 (222) hide show
  1. package/AGENTS.md +6 -10
  2. package/README.md +289 -938
  3. package/dist/bin/rango.js +271 -46
  4. package/dist/vite/index.js +673 -193
  5. package/package.json +10 -8
  6. package/skills/api-client/SKILL.md +1 -1
  7. package/skills/breadcrumbs/SKILL.md +31 -14
  8. package/skills/cache-guide/SKILL.md +5 -2
  9. package/skills/caching/SKILL.md +59 -4
  10. package/skills/catalog.json +271 -0
  11. package/skills/comparison/SKILL.md +50 -0
  12. package/skills/comparison/agents/openai.yaml +4 -0
  13. package/skills/comparison/references/framework-comparison.md +837 -0
  14. package/skills/composability/SKILL.md +83 -2
  15. package/skills/debug-manifest/SKILL.md +1 -1
  16. package/skills/defer-hydration/SKILL.md +235 -0
  17. package/skills/document-cache/SKILL.md +9 -1
  18. package/skills/fonts/SKILL.md +1 -1
  19. package/skills/handler-use/SKILL.md +8 -8
  20. package/skills/hooks/SKILL.md +54 -892
  21. package/skills/hooks/data.md +273 -0
  22. package/skills/hooks/handle-and-actions.md +103 -0
  23. package/skills/hooks/navigation.md +110 -0
  24. package/skills/hooks/outlets.md +41 -0
  25. package/skills/hooks/state.md +228 -0
  26. package/skills/hooks/urls.md +135 -0
  27. package/skills/host-router/SKILL.md +4 -4
  28. package/skills/i18n/SKILL.md +1 -1
  29. package/skills/intercept/SKILL.md +46 -14
  30. package/skills/layout/SKILL.md +27 -10
  31. package/skills/links/SKILL.md +1 -1
  32. package/skills/loader/SKILL.md +23 -1
  33. package/skills/middleware/SKILL.md +7 -3
  34. package/skills/migrate-nextjs/SKILL.md +167 -6
  35. package/skills/migrate-react-router/SKILL.md +59 -677
  36. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  37. package/skills/migrate-react-router/component-migration.md +196 -0
  38. package/skills/migrate-react-router/data-and-actions.md +225 -0
  39. package/skills/migrate-react-router/route-mapping.md +271 -0
  40. package/skills/mime-routes/SKILL.md +1 -1
  41. package/skills/observability/SKILL.md +9 -1
  42. package/skills/parallel/SKILL.md +23 -4
  43. package/skills/ppr/SKILL.md +622 -0
  44. package/skills/prerender/SKILL.md +28 -18
  45. package/skills/rango/SKILL.md +84 -25
  46. package/skills/response-routes/SKILL.md +15 -1
  47. package/skills/route/SKILL.md +71 -4
  48. package/skills/router-setup/SKILL.md +14 -3
  49. package/skills/scripts/SKILL.md +1 -1
  50. package/skills/server-actions/SKILL.md +3 -2
  51. package/skills/shell-manifest/SKILL.md +185 -0
  52. package/skills/streams-and-websockets/SKILL.md +1 -1
  53. package/skills/tailwind/SKILL.md +1 -1
  54. package/skills/testing/SKILL.md +2 -1
  55. package/skills/testing/handles.md +4 -2
  56. package/skills/testing/render-handler.md +15 -14
  57. package/skills/testing/reverse-and-types.md +8 -7
  58. package/skills/theme/SKILL.md +1 -1
  59. package/skills/typesafety/SKILL.md +45 -919
  60. package/skills/typesafety/env-and-bindings.md +254 -0
  61. package/skills/typesafety/generated-files-and-cli.md +335 -0
  62. package/skills/typesafety/params-and-search.md +153 -0
  63. package/skills/typesafety/route-types.md +209 -0
  64. package/skills/use-cache/SKILL.md +30 -3
  65. package/skills/vercel/SKILL.md +1 -1
  66. package/skills/view-transitions/SKILL.md +44 -1
  67. package/src/browser/event-controller.ts +62 -10
  68. package/src/browser/logging.ts +28 -0
  69. package/src/browser/merge-segment-loaders.ts +6 -4
  70. package/src/browser/navigation-bridge.ts +65 -16
  71. package/src/browser/navigation-client.ts +32 -2
  72. package/src/browser/navigation-store.ts +128 -14
  73. package/src/browser/network-error-handler.ts +34 -7
  74. package/src/browser/partial-update.ts +76 -17
  75. package/src/browser/prefetch/cache.ts +51 -11
  76. package/src/browser/prefetch/fetch.ts +59 -21
  77. package/src/browser/prefetch/queue.ts +19 -4
  78. package/src/browser/react/Link.tsx +13 -3
  79. package/src/browser/react/NavigationProvider.tsx +108 -4
  80. package/src/browser/response-adapter.ts +38 -9
  81. package/src/browser/rsc-router.tsx +54 -4
  82. package/src/browser/scroll-restoration.ts +7 -5
  83. package/src/browser/segment-reconciler.ts +31 -21
  84. package/src/browser/server-action-bridge.ts +22 -10
  85. package/src/browser/types.ts +54 -1
  86. package/src/build/generate-manifest.ts +155 -131
  87. package/src/build/index.ts +3 -1
  88. package/src/build/route-trie.ts +35 -7
  89. package/src/build/route-types/include-resolution.ts +347 -47
  90. package/src/build/runtime-discovery.ts +4 -1
  91. package/src/cache/cache-key-utils.ts +29 -0
  92. package/src/cache/cache-runtime.ts +262 -71
  93. package/src/cache/cache-scope.ts +2 -17
  94. package/src/cache/cache-tag.ts +60 -14
  95. package/src/cache/cf/cf-cache-store.ts +243 -20
  96. package/src/cache/document-cache.ts +54 -21
  97. package/src/cache/index.ts +1 -0
  98. package/src/cache/memory-segment-store.ts +110 -3
  99. package/src/cache/profile-registry.ts +15 -0
  100. package/src/cache/read-through-swr.ts +15 -1
  101. package/src/cache/segment-codec.ts +4 -4
  102. package/src/cache/shell-snapshot.ts +417 -0
  103. package/src/cache/types.ts +158 -0
  104. package/src/cache/vercel/vercel-cache-store.ts +401 -124
  105. package/src/client.rsc.tsx +0 -3
  106. package/src/client.tsx +0 -3
  107. package/src/cloudflare/tracing.ts +7 -8
  108. package/src/defer.ts +11 -22
  109. package/src/handle.ts +37 -15
  110. package/src/handles/MetaTags.tsx +16 -82
  111. package/src/handles/breadcrumbs.ts +12 -14
  112. package/src/handles/deferred-resolution.ts +127 -0
  113. package/src/handles/is-thenable.ts +7 -8
  114. package/src/handles/meta.ts +7 -44
  115. package/src/host/errors.ts +15 -0
  116. package/src/host/index.ts +1 -0
  117. package/src/index.rsc.ts +8 -2
  118. package/src/index.ts +19 -13
  119. package/src/internal-debug.ts +11 -8
  120. package/src/prerender.ts +17 -4
  121. package/src/redirect-origin.ts +14 -0
  122. package/src/render-error-thrower.tsx +20 -0
  123. package/src/route-content-wrapper.tsx +12 -5
  124. package/src/route-definition/dsl-helpers.ts +21 -32
  125. package/src/route-definition/helper-factories.ts +0 -2
  126. package/src/route-definition/helpers-types.ts +43 -43
  127. package/src/route-definition/index.ts +1 -2
  128. package/src/route-definition/resolve-handler-use.ts +0 -1
  129. package/src/route-definition/use-item-types.ts +3 -6
  130. package/src/route-map-builder.ts +41 -4
  131. package/src/route-types.ts +0 -5
  132. package/src/router/find-match.ts +86 -8
  133. package/src/router/instrument.ts +9 -4
  134. package/src/router/lazy-includes.ts +72 -12
  135. package/src/router/loader-resolution.ts +14 -2
  136. package/src/router/manifest.ts +56 -11
  137. package/src/router/match-api.ts +76 -32
  138. package/src/router/match-handlers.ts +181 -135
  139. package/src/router/match-middleware/background-revalidation.ts +40 -23
  140. package/src/router/match-middleware/cache-store.ts +39 -24
  141. package/src/router/match-result.ts +35 -15
  142. package/src/router/middleware.ts +64 -38
  143. package/src/router/navigation-snapshot.ts +7 -5
  144. package/src/router/parse-pattern.ts +115 -0
  145. package/src/router/pattern-matching.ts +53 -64
  146. package/src/router/prefetch-limits.ts +37 -0
  147. package/src/router/prerender-match.ts +11 -5
  148. package/src/router/preview-match.ts +3 -1
  149. package/src/router/request-classification.ts +23 -8
  150. package/src/router/route-snapshot.ts +14 -2
  151. package/src/router/router-context.ts +3 -1
  152. package/src/router/router-interfaces.ts +32 -1
  153. package/src/router/router-options.ts +30 -0
  154. package/src/router/segment-resolution/fresh.ts +39 -3
  155. package/src/router/segment-resolution/loader-cache.ts +93 -2
  156. package/src/router/segment-resolution/loader-mask.ts +60 -0
  157. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  158. package/src/router/segment-resolution/mask-nested.ts +83 -0
  159. package/src/router/segment-resolution/revalidation.ts +3 -0
  160. package/src/router/segment-resolution/view-transition-default.ts +35 -15
  161. package/src/router/substitute-pattern-params.ts +54 -35
  162. package/src/router/telemetry-otel.ts +6 -8
  163. package/src/router/telemetry.ts +9 -1
  164. package/src/router/tracing.ts +14 -5
  165. package/src/router/trie-matching.ts +19 -11
  166. package/src/router/url-params.ts +13 -0
  167. package/src/router.ts +47 -16
  168. package/src/rsc/full-payload.ts +70 -0
  169. package/src/rsc/handler.ts +60 -33
  170. package/src/rsc/manifest-init.ts +1 -1
  171. package/src/rsc/nonce.ts +10 -1
  172. package/src/rsc/progressive-enhancement.ts +61 -4
  173. package/src/rsc/redirect-guard.ts +2 -1
  174. package/src/rsc/rsc-rendering.ts +429 -37
  175. package/src/rsc/server-action.ts +25 -2
  176. package/src/rsc/shell-capture.ts +1190 -0
  177. package/src/rsc/shell-serve.ts +181 -0
  178. package/src/rsc/transition-gate.ts +89 -0
  179. package/src/rsc/types.ts +30 -0
  180. package/src/segment-loader-promise.ts +18 -0
  181. package/src/segment-system.tsx +149 -14
  182. package/src/server/context.ts +67 -9
  183. package/src/server/cookie-store.ts +73 -1
  184. package/src/server/loader-registry.ts +13 -1
  185. package/src/server/request-context.ts +169 -10
  186. package/src/ssr/index.tsx +462 -178
  187. package/src/ssr/inject-rsc-eager.ts +167 -0
  188. package/src/ssr/ssr-root.tsx +228 -0
  189. package/src/testing/collect-handle.ts +14 -8
  190. package/src/testing/dispatch.ts +152 -40
  191. package/src/testing/generated-routes.ts +27 -11
  192. package/src/testing/index.ts +6 -0
  193. package/src/testing/render-handler.ts +14 -0
  194. package/src/testing/render-route.tsx +13 -10
  195. package/src/testing/run-transition-when.ts +164 -0
  196. package/src/theme/ThemeProvider.tsx +36 -26
  197. package/src/types/handler-context.ts +1 -1
  198. package/src/types/index.ts +2 -0
  199. package/src/types/route-config.ts +19 -7
  200. package/src/types/segments.ts +100 -0
  201. package/src/urls/include-helper.ts +10 -8
  202. package/src/urls/include-provider.ts +71 -0
  203. package/src/urls/index.ts +1 -0
  204. package/src/urls/path-helper-types.ts +44 -12
  205. package/src/urls/path-helper.ts +5 -0
  206. package/src/urls/pattern-types.ts +36 -0
  207. package/src/urls/type-extraction.ts +43 -18
  208. package/src/urls/urls-function.ts +0 -1
  209. package/src/vercel/tracing.ts +7 -7
  210. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  211. package/src/vite/discovery/discover-routers.ts +1 -1
  212. package/src/vite/discovery/discovery-errors.ts +61 -0
  213. package/src/vite/index.ts +7 -0
  214. package/src/vite/inject-client-debug.ts +88 -0
  215. package/src/vite/plugins/vercel-output.ts +114 -25
  216. package/src/vite/plugins/version-injector.ts +22 -7
  217. package/src/vite/plugins/virtual-entries.ts +80 -22
  218. package/src/vite/rango.ts +29 -19
  219. package/src/vite/router-discovery.ts +171 -43
  220. package/src/vite/utils/prerender-utils.ts +17 -4
  221. package/src/vite/utils/shared-utils.ts +47 -0
  222. package/src/network-error-thrower.tsx +0 -18
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
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
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)
@@ -284,6 +289,96 @@ function extractNamePrefixFromInclude(node) {
284
289
  }
285
290
  return null;
286
291
  }
292
+ function thenSelectsNonDefaultMember(expr) {
293
+ const findThenCall = (e) => {
294
+ if (ts3.isCallExpression(e) && ts3.isPropertyAccessExpression(e.expression) && e.expression.name.text === "then") {
295
+ return e;
296
+ }
297
+ if (ts3.isCallExpression(e) && ts3.isPropertyAccessExpression(e.expression)) {
298
+ return findThenCall(e.expression.expression);
299
+ }
300
+ if (ts3.isPropertyAccessExpression(e)) return findThenCall(e.expression);
301
+ if (ts3.isParenthesizedExpression(e)) return findThenCall(e.expression);
302
+ if (ts3.isAwaitExpression(e)) return findThenCall(e.expression);
303
+ return null;
304
+ };
305
+ const thenCall = findThenCall(expr);
306
+ if (!thenCall || thenCall.arguments.length === 0) return false;
307
+ const cb = thenCall.arguments[0];
308
+ if (!ts3.isArrowFunction(cb) && !ts3.isFunctionExpression(cb)) return false;
309
+ let ret;
310
+ if (ts3.isBlock(cb.body)) {
311
+ for (const stmt of cb.body.statements) {
312
+ if (ts3.isReturnStatement(stmt) && stmt.expression) {
313
+ ret = stmt.expression;
314
+ break;
315
+ }
316
+ }
317
+ } else {
318
+ ret = cb.body;
319
+ }
320
+ if (!ret) return false;
321
+ if (ts3.isPropertyAccessExpression(ret)) {
322
+ return ret.name.text !== "default";
323
+ }
324
+ return false;
325
+ }
326
+ function extractDynamicImportSpecifier(node) {
327
+ let body;
328
+ if (ts3.isArrowFunction(node) || ts3.isFunctionExpression(node)) {
329
+ body = node.body;
330
+ }
331
+ if (!body) return null;
332
+ let expr;
333
+ if (ts3.isBlock(body)) {
334
+ for (const stmt of body.statements) {
335
+ if (ts3.isReturnStatement(stmt) && stmt.expression) {
336
+ expr = stmt.expression;
337
+ break;
338
+ }
339
+ }
340
+ } else {
341
+ expr = body;
342
+ }
343
+ if (!expr) return null;
344
+ const findImportCall = (e) => {
345
+ if (ts3.isCallExpression(e) && e.expression.kind === ts3.SyntaxKind.ImportKeyword) {
346
+ return e;
347
+ }
348
+ if (ts3.isCallExpression(e) && ts3.isPropertyAccessExpression(e.expression)) {
349
+ return findImportCall(e.expression.expression);
350
+ }
351
+ if (ts3.isPropertyAccessExpression(e)) return findImportCall(e.expression);
352
+ if (ts3.isParenthesizedExpression(e)) return findImportCall(e.expression);
353
+ if (ts3.isAwaitExpression(e)) return findImportCall(e.expression);
354
+ return null;
355
+ };
356
+ const importCall = findImportCall(expr);
357
+ if (!importCall || importCall.arguments.length === 0) return null;
358
+ if (thenSelectsNonDefaultMember(expr)) return null;
359
+ return getStringValue(importCall.arguments[0]);
360
+ }
361
+ function resolveDefaultExportTarget(code, sourceFile) {
362
+ let result = null;
363
+ function visit(node) {
364
+ if (result) return;
365
+ if (ts3.isExportAssignment(node) && !node.isExportEquals) {
366
+ const expr = node.expression;
367
+ if (ts3.isIdentifier(expr)) {
368
+ result = { variableName: expr.text };
369
+ } else if (ts3.isCallExpression(expr)) {
370
+ const callee = expr.expression;
371
+ if (ts3.isIdentifier(callee) && callee.text === "urls") {
372
+ result = { inlineBlock: expr.getText(sourceFile) };
373
+ }
374
+ }
375
+ return;
376
+ }
377
+ ts3.forEachChild(node, visit);
378
+ }
379
+ visit(sourceFile);
380
+ return result;
381
+ }
287
382
  function extractIncludesWithDiagnostics(code, sourceFileArg) {
288
383
  const sourceFile = sourceFileArg ?? ts3.createSourceFile(
289
384
  "input.tsx",
@@ -309,12 +404,19 @@ function extractIncludesWithDiagnostics(code, sourceFileArg) {
309
404
  }
310
405
  const secondArg = node.arguments[1];
311
406
  const namePrefix = extractNamePrefixFromInclude(node);
407
+ const dynamicImportSpec = extractDynamicImportSpecifier(secondArg);
312
408
  if (ts3.isIdentifier(secondArg)) {
313
409
  resolved.push({
314
410
  pathPrefix,
315
411
  variableName: secondArg.text,
316
412
  namePrefix
317
413
  });
414
+ } else if (dynamicImportSpec !== null) {
415
+ resolved.push({
416
+ pathPrefix,
417
+ moduleSpecifier: dynamicImportSpec,
418
+ namePrefix
419
+ });
318
420
  } else if (ts3.isCallExpression(secondArg)) {
319
421
  const callText = secondArg.expression.getText(sourceFile);
320
422
  unresolvable.push({
@@ -418,57 +520,94 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
418
520
  diagnosticsOut.push({ ...entry, sourceFile: filePath });
419
521
  }
420
522
  }
421
- for (const { pathPrefix, variableName, namePrefix } of includes) {
523
+ for (const inc of includes) {
524
+ const { pathPrefix, namePrefix } = inc;
422
525
  let childResult;
423
- const imported = resolveImportedVariable(fullSource, variableName);
424
- if (imported) {
425
- const targetFile = resolveImportPath(imported.specifier, filePath);
526
+ if (inc.moduleSpecifier) {
527
+ const targetFile = resolveImportPath(inc.moduleSpecifier, filePath);
426
528
  if (!targetFile) {
427
- if (diagnosticsOut) {
428
- diagnosticsOut.push({
429
- pathPrefix,
430
- namePrefix,
431
- reason: "file-not-found",
432
- sourceFile: filePath,
433
- detail: `import "${imported.specifier}" resolved to no file`
434
- });
435
- }
529
+ diagnosticsOut?.push({
530
+ pathPrefix,
531
+ namePrefix,
532
+ reason: "file-not-found",
533
+ sourceFile: filePath,
534
+ detail: `import("${inc.moduleSpecifier}") resolved to no file`
535
+ });
436
536
  continue;
437
537
  }
438
- childResult = buildCombinedRouteMapWithSearch(
439
- targetFile,
440
- imported.exportedName,
441
- visited,
442
- diagnosticsOut,
443
- void 0,
444
- memo
445
- );
446
- } else {
447
- const sameFileBlock = extractUrlsBlockForVariable(
448
- fullSource,
449
- variableName,
450
- parseBlock(memo, fullSource)
538
+ let targetSource;
539
+ try {
540
+ targetSource = readSourceMemoized(memo, resolve(targetFile));
541
+ } catch (err) {
542
+ diagnosticsOut?.push({
543
+ pathPrefix,
544
+ namePrefix,
545
+ reason: "file-not-found",
546
+ sourceFile: filePath,
547
+ detail: `import("${inc.moduleSpecifier}") resolved to "${targetFile}" but reading it failed: ${err?.message ?? String(err)}`
548
+ });
549
+ continue;
550
+ }
551
+ const def = resolveDefaultExportTarget(
552
+ targetSource,
553
+ parseBlock(memo, targetSource)
451
554
  );
452
- if (!sameFileBlock) {
453
- if (diagnosticsOut) {
454
- diagnosticsOut.push({
455
- pathPrefix,
456
- namePrefix,
457
- reason: "unresolvable-import",
458
- sourceFile: filePath,
459
- detail: `variable "${variableName}" not found in imports or same-file scope`
460
- });
461
- }
555
+ if (!def) {
556
+ diagnosticsOut?.push({
557
+ pathPrefix,
558
+ namePrefix,
559
+ reason: "unresolvable-import",
560
+ sourceFile: filePath,
561
+ detail: `import("${inc.moduleSpecifier}") has no resolvable \`export default urls(...)\``
562
+ });
462
563
  continue;
463
564
  }
464
- childResult = buildCombinedRouteMapWithSearch(
465
- filePath,
565
+ if (def.inlineBlock) {
566
+ childResult = buildCombinedRouteMapWithSearch(
567
+ targetFile,
568
+ void 0,
569
+ visited,
570
+ diagnosticsOut,
571
+ def.inlineBlock,
572
+ memo
573
+ );
574
+ } else {
575
+ const variableName = def.variableName;
576
+ const resolved = resolveIncludedVariable({
577
+ variableName,
578
+ resolutionFile: targetFile,
579
+ resolutionSource: targetSource,
580
+ reportFile: filePath,
581
+ memo,
582
+ visited,
583
+ diagnosticsOut,
584
+ pathPrefix,
585
+ namePrefix,
586
+ fileNotFoundDetail: (specifier) => `import("${inc.moduleSpecifier}") default re-exports "${variableName}" from "${specifier}", which resolved to no file`,
587
+ notFoundDetail: () => `import("${inc.moduleSpecifier}") default "${variableName}" not found in its imports or same-file scope`
588
+ });
589
+ if (!resolved) continue;
590
+ childResult = resolved;
591
+ }
592
+ } else if (inc.variableName) {
593
+ const variableName = inc.variableName;
594
+ const resolved = resolveIncludedVariable({
466
595
  variableName,
596
+ resolutionFile: filePath,
597
+ resolutionSource: fullSource,
598
+ reportFile: filePath,
599
+ memo,
467
600
  visited,
468
601
  diagnosticsOut,
469
- void 0,
470
- memo
471
- );
602
+ pathPrefix,
603
+ namePrefix,
604
+ fileNotFoundDetail: (specifier) => `import "${specifier}" resolved to no file`,
605
+ notFoundDetail: () => `variable "${variableName}" not found in imports or same-file scope`
606
+ });
607
+ if (!resolved) continue;
608
+ childResult = resolved;
609
+ } else {
610
+ continue;
472
611
  }
473
612
  if (namePrefix === null) {
474
613
  continue;
@@ -491,6 +630,64 @@ function buildRouteMapFromBlock(block, fullSource, filePath, visited, searchSche
491
630
  }
492
631
  return routeMap;
493
632
  }
633
+ function resolveIncludedVariable(opts) {
634
+ const {
635
+ variableName,
636
+ resolutionFile,
637
+ resolutionSource,
638
+ reportFile,
639
+ memo,
640
+ visited,
641
+ diagnosticsOut,
642
+ pathPrefix,
643
+ namePrefix
644
+ } = opts;
645
+ const imported = resolveImportedVariable(resolutionSource, variableName);
646
+ if (imported) {
647
+ const targetFile = resolveImportPath(imported.specifier, resolutionFile);
648
+ if (!targetFile) {
649
+ diagnosticsOut?.push({
650
+ pathPrefix,
651
+ namePrefix,
652
+ reason: "file-not-found",
653
+ sourceFile: reportFile,
654
+ detail: opts.fileNotFoundDetail(imported.specifier)
655
+ });
656
+ return null;
657
+ }
658
+ return buildCombinedRouteMapWithSearch(
659
+ targetFile,
660
+ imported.exportedName,
661
+ visited,
662
+ diagnosticsOut,
663
+ void 0,
664
+ memo
665
+ );
666
+ }
667
+ const sameFileBlock = extractUrlsBlockForVariable(
668
+ resolutionSource,
669
+ variableName,
670
+ parseBlock(memo, resolutionSource)
671
+ );
672
+ if (!sameFileBlock) {
673
+ diagnosticsOut?.push({
674
+ pathPrefix,
675
+ namePrefix,
676
+ reason: "unresolvable-import",
677
+ sourceFile: reportFile,
678
+ detail: opts.notFoundDetail()
679
+ });
680
+ return null;
681
+ }
682
+ return buildCombinedRouteMapWithSearch(
683
+ resolutionFile,
684
+ variableName,
685
+ visited,
686
+ diagnosticsOut,
687
+ void 0,
688
+ memo
689
+ );
690
+ }
494
691
  function buildCombinedRouteMapWithSearch(filePath, variableName, visited, diagnosticsOut, inlineBlock, memo) {
495
692
  visited = visited ?? /* @__PURE__ */ new Set();
496
693
  memo = memo ?? createScanMemo();
@@ -1240,9 +1437,14 @@ initializeApp().catch(console.error);
1240
1437
  `.trim();
1241
1438
  VIRTUAL_ENTRY_SSR = `
1242
1439
  import { createFromReadableStream } from "@rangojs/router/internal/deps/ssr";
1243
- import { renderToReadableStream } from "react-dom/server.edge";
1440
+ import { renderToReadableStream, resume } from "react-dom/server.edge";
1441
+ import { prerender } from "react-dom/static.edge";
1244
1442
  import { injectRSCPayload } from "@rangojs/router/internal/deps/html-stream-server";
1245
- import { createSSRHandler } from "@rangojs/router/ssr";
1443
+ import {
1444
+ createSSRHandler,
1445
+ createShellCaptureHandler,
1446
+ createShellResumeHandler,
1447
+ } from "@rangojs/router/ssr";
1246
1448
 
1247
1449
  export const renderHTML = createSSRHandler({
1248
1450
  createFromReadableStream,
@@ -1251,6 +1453,26 @@ export const renderHTML = createSSRHandler({
1251
1453
  loadBootstrapScriptContent: () =>
1252
1454
  import.meta.viteRsc.loadBootstrapScriptContent("index"),
1253
1455
  });
1456
+
1457
+ export const captureShellHTML = createShellCaptureHandler({
1458
+ createFromReadableStream,
1459
+ renderToReadableStream,
1460
+ injectRSCPayload,
1461
+ prerender,
1462
+ resume,
1463
+ loadBootstrapScriptContent: () =>
1464
+ import.meta.viteRsc.loadBootstrapScriptContent("index"),
1465
+ });
1466
+
1467
+ export const resumeShellHTML = createShellResumeHandler({
1468
+ createFromReadableStream,
1469
+ renderToReadableStream,
1470
+ injectRSCPayload,
1471
+ prerender,
1472
+ resume,
1473
+ loadBootstrapScriptContent: () =>
1474
+ import.meta.viteRsc.loadBootstrapScriptContent("index"),
1475
+ });
1254
1476
  `.trim();
1255
1477
  VIRTUAL_IDS = {
1256
1478
  browser: "virtual:rsc-router/entry.browser.js",
@@ -1607,7 +1829,10 @@ async function discoverAndWriteRouteTypes(opts) {
1607
1829
  let routerMountIndex = 0;
1608
1830
  for (const [id, router] of registry) {
1609
1831
  if (!router.urlpatterns) continue;
1610
- const manifest = generateManifest(router.urlpatterns, routerMountIndex);
1832
+ const manifest = await generateManifest(
1833
+ router.urlpatterns,
1834
+ routerMountIndex
1835
+ );
1611
1836
  routerMountIndex++;
1612
1837
  const rawManifest = manifest.routeManifest;
1613
1838
  const routeManifest = {};