@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.
- package/AGENTS.md +6 -10
- package/README.md +289 -938
- package/dist/bin/rango.js +271 -46
- package/dist/vite/index.js +673 -193
- package/package.json +10 -8
- package/skills/api-client/SKILL.md +1 -1
- package/skills/breadcrumbs/SKILL.md +31 -14
- package/skills/cache-guide/SKILL.md +5 -2
- package/skills/caching/SKILL.md +59 -4
- package/skills/catalog.json +271 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +83 -2
- package/skills/debug-manifest/SKILL.md +1 -1
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/document-cache/SKILL.md +9 -1
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +8 -8
- package/skills/hooks/SKILL.md +54 -892
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +41 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +4 -4
- package/skills/i18n/SKILL.md +1 -1
- package/skills/intercept/SKILL.md +46 -14
- package/skills/layout/SKILL.md +27 -10
- package/skills/links/SKILL.md +1 -1
- package/skills/loader/SKILL.md +23 -1
- package/skills/middleware/SKILL.md +7 -3
- package/skills/migrate-nextjs/SKILL.md +167 -6
- package/skills/migrate-react-router/SKILL.md +59 -677
- package/skills/migrate-react-router/cloudflare-workers.md +129 -0
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +1 -1
- package/skills/observability/SKILL.md +9 -1
- package/skills/parallel/SKILL.md +23 -4
- package/skills/ppr/SKILL.md +622 -0
- package/skills/prerender/SKILL.md +28 -18
- package/skills/rango/SKILL.md +84 -25
- package/skills/response-routes/SKILL.md +15 -1
- package/skills/route/SKILL.md +71 -4
- package/skills/router-setup/SKILL.md +14 -3
- package/skills/scripts/SKILL.md +1 -1
- package/skills/server-actions/SKILL.md +3 -2
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +1 -1
- package/skills/testing/SKILL.md +2 -1
- package/skills/testing/handles.md +4 -2
- package/skills/testing/render-handler.md +15 -14
- package/skills/testing/reverse-and-types.md +8 -7
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -919
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +335 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +209 -0
- package/skills/use-cache/SKILL.md +30 -3
- package/skills/vercel/SKILL.md +1 -1
- package/skills/view-transitions/SKILL.md +44 -1
- package/src/browser/event-controller.ts +62 -10
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +65 -16
- package/src/browser/navigation-client.ts +32 -2
- package/src/browser/navigation-store.ts +128 -14
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +76 -17
- package/src/browser/prefetch/cache.ts +51 -11
- package/src/browser/prefetch/fetch.ts +59 -21
- package/src/browser/prefetch/queue.ts +19 -4
- package/src/browser/react/Link.tsx +13 -3
- package/src/browser/react/NavigationProvider.tsx +108 -4
- package/src/browser/response-adapter.ts +38 -9
- package/src/browser/rsc-router.tsx +54 -4
- package/src/browser/scroll-restoration.ts +7 -5
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/server-action-bridge.ts +22 -10
- package/src/browser/types.ts +54 -1
- package/src/build/generate-manifest.ts +155 -131
- package/src/build/index.ts +3 -1
- package/src/build/route-trie.ts +35 -7
- package/src/build/route-types/include-resolution.ts +347 -47
- package/src/build/runtime-discovery.ts +4 -1
- package/src/cache/cache-key-utils.ts +29 -0
- package/src/cache/cache-runtime.ts +262 -71
- package/src/cache/cache-scope.ts +2 -17
- package/src/cache/cache-tag.ts +60 -14
- package/src/cache/cf/cf-cache-store.ts +243 -20
- package/src/cache/document-cache.ts +54 -21
- package/src/cache/index.ts +1 -0
- package/src/cache/memory-segment-store.ts +110 -3
- package/src/cache/profile-registry.ts +15 -0
- package/src/cache/read-through-swr.ts +15 -1
- package/src/cache/segment-codec.ts +4 -4
- package/src/cache/shell-snapshot.ts +417 -0
- package/src/cache/types.ts +158 -0
- package/src/cache/vercel/vercel-cache-store.ts +401 -124
- package/src/client.rsc.tsx +0 -3
- package/src/client.tsx +0 -3
- package/src/cloudflare/tracing.ts +7 -8
- package/src/defer.ts +11 -22
- package/src/handle.ts +37 -15
- package/src/handles/MetaTags.tsx +16 -82
- package/src/handles/breadcrumbs.ts +12 -14
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +7 -8
- package/src/handles/meta.ts +7 -44
- package/src/host/errors.ts +15 -0
- package/src/host/index.ts +1 -0
- package/src/index.rsc.ts +8 -2
- package/src/index.ts +19 -13
- package/src/internal-debug.ts +11 -8
- package/src/prerender.ts +17 -4
- package/src/redirect-origin.ts +14 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/route-content-wrapper.tsx +12 -5
- package/src/route-definition/dsl-helpers.ts +21 -32
- package/src/route-definition/helper-factories.ts +0 -2
- package/src/route-definition/helpers-types.ts +43 -43
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/resolve-handler-use.ts +0 -1
- package/src/route-definition/use-item-types.ts +3 -6
- package/src/route-map-builder.ts +41 -4
- package/src/route-types.ts +0 -5
- package/src/router/find-match.ts +86 -8
- package/src/router/instrument.ts +9 -4
- package/src/router/lazy-includes.ts +72 -12
- package/src/router/loader-resolution.ts +14 -2
- package/src/router/manifest.ts +56 -11
- package/src/router/match-api.ts +76 -32
- package/src/router/match-handlers.ts +181 -135
- package/src/router/match-middleware/background-revalidation.ts +40 -23
- package/src/router/match-middleware/cache-store.ts +39 -24
- package/src/router/match-result.ts +35 -15
- package/src/router/middleware.ts +64 -38
- package/src/router/navigation-snapshot.ts +7 -5
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +53 -64
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +11 -5
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +23 -8
- package/src/router/route-snapshot.ts +14 -2
- package/src/router/router-context.ts +3 -1
- package/src/router/router-interfaces.ts +32 -1
- package/src/router/router-options.ts +30 -0
- package/src/router/segment-resolution/fresh.ts +39 -3
- package/src/router/segment-resolution/loader-cache.ts +93 -2
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +83 -0
- package/src/router/segment-resolution/revalidation.ts +3 -0
- package/src/router/segment-resolution/view-transition-default.ts +35 -15
- package/src/router/substitute-pattern-params.ts +54 -35
- package/src/router/telemetry-otel.ts +6 -8
- package/src/router/telemetry.ts +9 -1
- package/src/router/tracing.ts +14 -5
- package/src/router/trie-matching.ts +19 -11
- package/src/router/url-params.ts +13 -0
- package/src/router.ts +47 -16
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler.ts +60 -33
- package/src/rsc/manifest-init.ts +1 -1
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/progressive-enhancement.ts +61 -4
- package/src/rsc/redirect-guard.ts +2 -1
- package/src/rsc/rsc-rendering.ts +429 -37
- package/src/rsc/server-action.ts +25 -2
- package/src/rsc/shell-capture.ts +1190 -0
- package/src/rsc/shell-serve.ts +181 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +30 -0
- package/src/segment-loader-promise.ts +18 -0
- package/src/segment-system.tsx +149 -14
- package/src/server/context.ts +67 -9
- package/src/server/cookie-store.ts +73 -1
- package/src/server/loader-registry.ts +13 -1
- package/src/server/request-context.ts +169 -10
- package/src/ssr/index.tsx +462 -178
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/testing/collect-handle.ts +14 -8
- package/src/testing/dispatch.ts +152 -40
- package/src/testing/generated-routes.ts +27 -11
- package/src/testing/index.ts +6 -0
- package/src/testing/render-handler.ts +14 -0
- package/src/testing/render-route.tsx +13 -10
- package/src/testing/run-transition-when.ts +164 -0
- package/src/theme/ThemeProvider.tsx +36 -26
- package/src/types/handler-context.ts +1 -1
- package/src/types/index.ts +2 -0
- package/src/types/route-config.ts +19 -7
- package/src/types/segments.ts +100 -0
- package/src/urls/include-helper.ts +10 -8
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +1 -0
- package/src/urls/path-helper-types.ts +44 -12
- package/src/urls/path-helper.ts +5 -0
- package/src/urls/pattern-types.ts +36 -0
- package/src/urls/type-extraction.ts +43 -18
- package/src/urls/urls-function.ts +0 -1
- package/src/vercel/tracing.ts +7 -7
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +1 -1
- package/src/vite/discovery/discovery-errors.ts +61 -0
- package/src/vite/index.ts +7 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugins/vercel-output.ts +114 -25
- package/src/vite/plugins/version-injector.ts +22 -7
- package/src/vite/plugins/virtual-entries.ts +80 -22
- package/src/vite/rango.ts +29 -19
- package/src/vite/router-discovery.ts +171 -43
- package/src/vite/utils/prerender-utils.ts +17 -4
- package/src/vite/utils/shared-utils.ts +47 -0
- 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
|
-
|
|
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
|
|
523
|
+
for (const inc of includes) {
|
|
524
|
+
const { pathPrefix, namePrefix } = inc;
|
|
422
525
|
let childResult;
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
const targetFile = resolveImportPath(imported.specifier, filePath);
|
|
526
|
+
if (inc.moduleSpecifier) {
|
|
527
|
+
const targetFile = resolveImportPath(inc.moduleSpecifier, filePath);
|
|
426
528
|
if (!targetFile) {
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
diagnosticsOut
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
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 (!
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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
|
-
|
|
465
|
-
|
|
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
|
-
|
|
470
|
-
|
|
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 {
|
|
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(
|
|
1832
|
+
const manifest = await generateManifest(
|
|
1833
|
+
router.urlpatterns,
|
|
1834
|
+
routerMountIndex
|
|
1835
|
+
);
|
|
1611
1836
|
routerMountIndex++;
|
|
1612
1837
|
const rawManifest = manifest.routeManifest;
|
|
1613
1838
|
const routeManifest = {};
|