@textjs/app 0.0.0-stage → 1.0.3
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 +34 -2
- package/bin/text.js +29 -0
- package/bin/text.ts +13 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/cli/build.d.ts +39 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +157 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/config.d.ts +22 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +73 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dev.d.ts +12 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +49 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +192 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/run.d.ts +31 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +111 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/start.d.ts +14 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +183 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/ui.d.ts +35 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +73 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +93 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +143 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +44 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +26 -0
- package/dist/context.js.map +1 -0
- package/dist/dev-errors.d.ts +68 -0
- package/dist/dev-errors.d.ts.map +1 -0
- package/dist/dev-errors.js +121 -0
- package/dist/dev-errors.js.map +1 -0
- package/dist/devtools.d.ts +64 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +186 -0
- package/dist/devtools.js.map +1 -0
- package/dist/frame-mirror.d.ts +19 -0
- package/dist/frame-mirror.d.ts.map +1 -0
- package/dist/frame-mirror.js +141 -0
- package/dist/frame-mirror.js.map +1 -0
- package/dist/frame-protocol.d.ts +175 -0
- package/dist/frame-protocol.d.ts.map +1 -0
- package/dist/frame-protocol.js +369 -0
- package/dist/frame-protocol.js.map +1 -0
- package/dist/history.d.ts +54 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +152 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +32 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +54 -0
- package/dist/link.js.map +1 -0
- package/dist/live-player.d.ts +83 -0
- package/dist/live-player.d.ts.map +1 -0
- package/dist/live-player.js +413 -0
- package/dist/live-player.js.map +1 -0
- package/dist/live-protocol.d.ts +132 -0
- package/dist/live-protocol.d.ts.map +1 -0
- package/dist/live-protocol.js +278 -0
- package/dist/live-protocol.js.map +1 -0
- package/dist/live-stub.d.ts +10 -0
- package/dist/live-stub.d.ts.map +1 -0
- package/dist/live-stub.js +32 -0
- package/dist/live-stub.js.map +1 -0
- package/dist/mcp/cli.d.ts +22 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +177 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/frame.d.ts +58 -0
- package/dist/mcp/frame.d.ts.map +1 -0
- package/dist/mcp/frame.js +169 -0
- package/dist/mcp/frame.js.map +1 -0
- package/dist/mcp/index.d.ts +15 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +15 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/inspect.d.ts +95 -0
- package/dist/mcp/inspect.d.ts.map +1 -0
- package/dist/mcp/inspect.js +386 -0
- package/dist/mcp/inspect.js.map +1 -0
- package/dist/mcp/keys.d.ts +20 -0
- package/dist/mcp/keys.d.ts.map +1 -0
- package/dist/mcp/keys.js +87 -0
- package/dist/mcp/keys.js.map +1 -0
- package/dist/mcp/logs.d.ts +63 -0
- package/dist/mcp/logs.d.ts.map +1 -0
- package/dist/mcp/logs.js +217 -0
- package/dist/mcp/logs.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +485 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +230 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +742 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/navigation-errors.d.ts +28 -0
- package/dist/navigation-errors.d.ts.map +1 -0
- package/dist/navigation-errors.js +43 -0
- package/dist/navigation-errors.js.map +1 -0
- package/dist/navigation.d.ts +21 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +33 -0
- package/dist/navigation.js.map +1 -0
- package/dist/router.d.ts +76 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +296 -0
- package/dist/router.js.map +1 -0
- package/dist/routing.d.ts +101 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +286 -0
- package/dist/routing.js.map +1 -0
- package/dist/server/adapters/build-step.d.ts +34 -0
- package/dist/server/adapters/build-step.d.ts.map +1 -0
- package/dist/server/adapters/build-step.js +112 -0
- package/dist/server/adapters/build-step.js.map +1 -0
- package/dist/server/adapters/bun.d.ts +8 -0
- package/dist/server/adapters/bun.d.ts.map +1 -0
- package/dist/server/adapters/bun.js +89 -0
- package/dist/server/adapters/bun.js.map +1 -0
- package/dist/server/adapters/bundle.d.ts +21 -0
- package/dist/server/adapters/bundle.d.ts.map +1 -0
- package/dist/server/adapters/bundle.js +86 -0
- package/dist/server/adapters/bundle.js.map +1 -0
- package/dist/server/adapters/cloudflare.d.ts +29 -0
- package/dist/server/adapters/cloudflare.d.ts.map +1 -0
- package/dist/server/adapters/cloudflare.js +105 -0
- package/dist/server/adapters/cloudflare.js.map +1 -0
- package/dist/server/adapters/index.d.ts +10 -0
- package/dist/server/adapters/index.d.ts.map +1 -0
- package/dist/server/adapters/index.js +24 -0
- package/dist/server/adapters/index.js.map +1 -0
- package/dist/server/adapters/runtime-node.d.ts +16 -0
- package/dist/server/adapters/runtime-node.d.ts.map +1 -0
- package/dist/server/adapters/runtime-node.js +29 -0
- package/dist/server/adapters/runtime-node.js.map +1 -0
- package/dist/server/adapters/runtime.d.ts +42 -0
- package/dist/server/adapters/runtime.d.ts.map +1 -0
- package/dist/server/adapters/runtime.js +115 -0
- package/dist/server/adapters/runtime.js.map +1 -0
- package/dist/server/adapters/shared.d.ts +66 -0
- package/dist/server/adapters/shared.d.ts.map +1 -0
- package/dist/server/adapters/shared.js +124 -0
- package/dist/server/adapters/shared.js.map +1 -0
- package/dist/server/adapters/static.d.ts +9 -0
- package/dist/server/adapters/static.d.ts.map +1 -0
- package/dist/server/adapters/static.js +70 -0
- package/dist/server/adapters/static.js.map +1 -0
- package/dist/server/adapters/vercel.d.ts +43 -0
- package/dist/server/adapters/vercel.d.ts.map +1 -0
- package/dist/server/adapters/vercel.js +119 -0
- package/dist/server/adapters/vercel.js.map +1 -0
- package/dist/server/bun-jsx.d.ts +18 -0
- package/dist/server/bun-jsx.d.ts.map +1 -0
- package/dist/server/bun-jsx.js +56 -0
- package/dist/server/bun-jsx.js.map +1 -0
- package/dist/server/cache-route.d.ts +38 -0
- package/dist/server/cache-route.d.ts.map +1 -0
- package/dist/server/cache-route.js +109 -0
- package/dist/server/cache-route.js.map +1 -0
- package/dist/server/cache.d.ts +131 -0
- package/dist/server/cache.d.ts.map +1 -0
- package/dist/server/cache.js +409 -0
- package/dist/server/cache.js.map +1 -0
- package/dist/server/frames.d.ts +45 -0
- package/dist/server/frames.d.ts.map +1 -0
- package/dist/server/frames.js +294 -0
- package/dist/server/frames.js.map +1 -0
- package/dist/server/http.d.ts +80 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +453 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/jsx-dev-runtime.d.ts +5 -0
- package/dist/server/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/server/jsx-dev-runtime.js +6 -0
- package/dist/server/jsx-dev-runtime.js.map +1 -0
- package/dist/server/jsx-runtime.d.ts +10 -0
- package/dist/server/jsx-runtime.d.ts.map +1 -0
- package/dist/server/jsx-runtime.js +11 -0
- package/dist/server/jsx-runtime.js.map +1 -0
- package/dist/server/live-app.d.ts +87 -0
- package/dist/server/live-app.d.ts.map +1 -0
- package/dist/server/live-app.js +307 -0
- package/dist/server/live-app.js.map +1 -0
- package/dist/server/live-build.d.ts +70 -0
- package/dist/server/live-build.d.ts.map +1 -0
- package/dist/server/live-build.js +222 -0
- package/dist/server/live-build.js.map +1 -0
- package/dist/server/live-dev.d.ts +62 -0
- package/dist/server/live-dev.d.ts.map +1 -0
- package/dist/server/live-dev.js +313 -0
- package/dist/server/live-dev.js.map +1 -0
- package/dist/server/live-manifest.d.ts +23 -0
- package/dist/server/live-manifest.d.ts.map +1 -0
- package/dist/server/live-manifest.js +7 -0
- package/dist/server/live-manifest.js.map +1 -0
- package/dist/server/live-prod.d.ts +30 -0
- package/dist/server/live-prod.d.ts.map +1 -0
- package/dist/server/live-prod.js +97 -0
- package/dist/server/live-prod.js.map +1 -0
- package/dist/server/live-routes.d.ts +72 -0
- package/dist/server/live-routes.d.ts.map +1 -0
- package/dist/server/live-routes.js +274 -0
- package/dist/server/live-routes.js.map +1 -0
- package/dist/server/live-web.d.ts +16 -0
- package/dist/server/live-web.d.ts.map +1 -0
- package/dist/server/live-web.js +159 -0
- package/dist/server/live-web.js.map +1 -0
- package/dist/server/live.d.ts +138 -0
- package/dist/server/live.d.ts.map +1 -0
- package/dist/server/live.js +542 -0
- package/dist/server/live.js.map +1 -0
- package/dist/server/middleware-node.d.ts +48 -0
- package/dist/server/middleware-node.d.ts.map +1 -0
- package/dist/server/middleware-node.js +167 -0
- package/dist/server/middleware-node.js.map +1 -0
- package/dist/server/middleware-runtime.d.ts +97 -0
- package/dist/server/middleware-runtime.d.ts.map +1 -0
- package/dist/server/middleware-runtime.js +447 -0
- package/dist/server/middleware-runtime.js.map +1 -0
- package/dist/server/middleware.d.ts +145 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +365 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/ppr.d.ts +22 -0
- package/dist/server/ppr.d.ts.map +1 -0
- package/dist/server/ppr.js +58 -0
- package/dist/server/ppr.js.map +1 -0
- package/dist/server/scan.d.ts +48 -0
- package/dist/server/scan.d.ts.map +1 -0
- package/dist/server/scan.js +161 -0
- package/dist/server/scan.js.map +1 -0
- package/dist/server/server-components.d.ts +65 -0
- package/dist/server/server-components.d.ts.map +1 -0
- package/dist/server/server-components.js +215 -0
- package/dist/server/server-components.js.map +1 -0
- package/dist/terminal.d.ts +5 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +5 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/vite-plugin.d.ts +51 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +403 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +130 -4
- package/src/cli/build.ts +182 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/dev.ts +54 -0
- package/src/cli/index.ts +185 -0
- package/src/cli/run.ts +124 -0
- package/src/cli/start.ts +194 -0
- package/src/cli/ui.ts +93 -0
- package/src/client.tsx +122 -0
- package/src/config.ts +155 -0
- package/src/context.ts +69 -0
- package/src/dev-errors.ts +167 -0
- package/src/devtools.tsx +419 -0
- package/src/frame-mirror.ts +145 -0
- package/src/frame-protocol.ts +435 -0
- package/src/history.ts +201 -0
- package/src/index.ts +9 -0
- package/src/link.tsx +108 -0
- package/src/live-player.ts +449 -0
- package/src/live-protocol.ts +317 -0
- package/src/live-stub.tsx +32 -0
- package/src/mcp/cli.ts +188 -0
- package/src/mcp/frame.ts +224 -0
- package/src/mcp/index.ts +15 -0
- package/src/mcp/inspect.ts +445 -0
- package/src/mcp/keys.ts +86 -0
- package/src/mcp/logs.ts +225 -0
- package/src/mcp/server.ts +595 -0
- package/src/mcp/session.ts +821 -0
- package/src/navigation-errors.ts +60 -0
- package/src/navigation.ts +44 -0
- package/src/router.tsx +497 -0
- package/src/routing.ts +344 -0
- package/src/server/adapters/build-step.ts +135 -0
- package/src/server/adapters/bun.ts +92 -0
- package/src/server/adapters/bundle.ts +97 -0
- package/src/server/adapters/cloudflare.ts +111 -0
- package/src/server/adapters/index.ts +29 -0
- package/src/server/adapters/runtime-node.ts +34 -0
- package/src/server/adapters/runtime.ts +145 -0
- package/src/server/adapters/shared.ts +159 -0
- package/src/server/adapters/static.ts +68 -0
- package/src/server/adapters/vercel.ts +149 -0
- package/src/server/bun-jsx.ts +65 -0
- package/src/server/cache-route.ts +139 -0
- package/src/server/cache.ts +498 -0
- package/src/server/frames.ts +326 -0
- package/src/server/http.ts +467 -0
- package/src/server/jsx-dev-runtime.ts +9 -0
- package/src/server/jsx-runtime.ts +13 -0
- package/src/server/live-app.tsx +374 -0
- package/src/server/live-build.ts +258 -0
- package/src/server/live-dev.ts +357 -0
- package/src/server/live-manifest.ts +25 -0
- package/src/server/live-prod.ts +120 -0
- package/src/server/live-routes.ts +298 -0
- package/src/server/live-web.ts +170 -0
- package/src/server/live.ts +551 -0
- package/src/server/middleware-node.ts +168 -0
- package/src/server/middleware-runtime.ts +478 -0
- package/src/server/middleware.ts +451 -0
- package/src/server/ppr.ts +62 -0
- package/src/server/scan.ts +190 -0
- package/src/server/server-components.ts +224 -0
- package/src/terminal.ts +5 -0
- package/src/testing.ts +5 -0
- package/src/vite-plugin.ts +413 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-system scanner for the `app/` directory (Node only).
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
5
|
+
import { join, relative, sep } from "node:path";
|
|
6
|
+
import { flattenRoutes, matchAppRoutes, ROUTE_FILE_KINDS } from "../routing.js";
|
|
7
|
+
export const ROUTE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js"];
|
|
8
|
+
export function toPosix(p) {
|
|
9
|
+
return sep === "\\" ? p.split(sep).join("/") : p;
|
|
10
|
+
}
|
|
11
|
+
function findFile(dir, base, entries) {
|
|
12
|
+
for (const ext of ROUTE_EXTENSIONS)
|
|
13
|
+
if (entries.has(base + ext))
|
|
14
|
+
return join(dir, base + ext);
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
function scanDir(dir, segment) {
|
|
18
|
+
const entries = new Set(readdirSync(dir));
|
|
19
|
+
const files = {};
|
|
20
|
+
for (const kind of ROUTE_FILE_KINDS) {
|
|
21
|
+
const f = findFile(dir, kind, entries);
|
|
22
|
+
if (f)
|
|
23
|
+
files[kind] = f;
|
|
24
|
+
}
|
|
25
|
+
const node = { segment, dir, files, route: findFile(dir, "route", entries), children: [] };
|
|
26
|
+
for (const name of [...entries].sort()) {
|
|
27
|
+
if (name.startsWith(".") || name.startsWith("_") || name === "node_modules")
|
|
28
|
+
continue;
|
|
29
|
+
const full = join(dir, name);
|
|
30
|
+
let isDir = false;
|
|
31
|
+
try {
|
|
32
|
+
isDir = statSync(full).isDirectory();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (isDir)
|
|
38
|
+
node.children.push(scanDir(full, name));
|
|
39
|
+
}
|
|
40
|
+
return node;
|
|
41
|
+
}
|
|
42
|
+
/** Scan `<root>/<appDir>` into a segment tree. */
|
|
43
|
+
export function scanApp(root, appDir = "app") {
|
|
44
|
+
const dir = join(root, appDir);
|
|
45
|
+
if (!existsSync(dir))
|
|
46
|
+
return { root, appDir: dir, tree: { segment: "", dir, files: {}, children: [] } };
|
|
47
|
+
return { root, appDir: dir, tree: scanDir(dir, "") };
|
|
48
|
+
}
|
|
49
|
+
/** `true` when `file` is a route file the manifest depends on. */
|
|
50
|
+
export function isRouteFile(file, appDir) {
|
|
51
|
+
const rel = toPosix(relative(appDir, file));
|
|
52
|
+
if (rel.startsWith(".."))
|
|
53
|
+
return false;
|
|
54
|
+
const base = rel.split("/").pop() ?? "";
|
|
55
|
+
const name = base.replace(/\.(tsx|ts|jsx|js)$/, "");
|
|
56
|
+
if (name === base)
|
|
57
|
+
return false;
|
|
58
|
+
return ROUTE_FILE_KINDS.includes(name) || name === "route";
|
|
59
|
+
}
|
|
60
|
+
const FORCE_DYNAMIC = /export\s+const\s+dynamic\s*=\s*["']force-dynamic["']/;
|
|
61
|
+
function isForceDynamicFile(file) {
|
|
62
|
+
if (!file)
|
|
63
|
+
return false;
|
|
64
|
+
try {
|
|
65
|
+
return FORCE_DYNAMIC.test(readFileSync(file, "utf8"));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** A manifest with placeholder modules (for summaries and matching on the server). */
|
|
72
|
+
export function toStaticManifest(scan) {
|
|
73
|
+
const convert = (s) => {
|
|
74
|
+
const node = { segment: s.segment, files: {} };
|
|
75
|
+
for (const kind of ROUTE_FILE_KINDS) {
|
|
76
|
+
const f = s.files[kind];
|
|
77
|
+
if (!f)
|
|
78
|
+
continue;
|
|
79
|
+
const key = kind === "not-found" ? "notFound" : kind;
|
|
80
|
+
node[key] = isForceDynamicFile(f) ? { dynamic: "force-dynamic" } : {};
|
|
81
|
+
node.files[kind] = toPosix(relative(scan.root, f));
|
|
82
|
+
}
|
|
83
|
+
const children = s.children.map(convert).filter((c) => hasContent(c));
|
|
84
|
+
if (children.length > 0)
|
|
85
|
+
node.children = children;
|
|
86
|
+
return node;
|
|
87
|
+
};
|
|
88
|
+
return convert(scan.tree);
|
|
89
|
+
}
|
|
90
|
+
function hasContent(n) {
|
|
91
|
+
return Boolean(n.page || n.layout || n.loading || n.error || n.notFound || (n.children && n.children.length > 0));
|
|
92
|
+
}
|
|
93
|
+
/** API route handlers as a manifest (route files stand in for pages). */
|
|
94
|
+
export function toApiManifest(scan) {
|
|
95
|
+
const convert = (s) => {
|
|
96
|
+
const node = { segment: s.segment };
|
|
97
|
+
if (s.route) {
|
|
98
|
+
node.page = {};
|
|
99
|
+
node.files = { page: s.route };
|
|
100
|
+
}
|
|
101
|
+
const children = s.children.map(convert).filter((c) => c.page || (c.children && c.children.length > 0));
|
|
102
|
+
if (children.length > 0)
|
|
103
|
+
node.children = children;
|
|
104
|
+
return node;
|
|
105
|
+
};
|
|
106
|
+
return convert(scan.tree);
|
|
107
|
+
}
|
|
108
|
+
export function listApiRoutes(scan) {
|
|
109
|
+
return flattenRoutes(toApiManifest(scan)).map((r) => ({ pattern: r.pattern, file: r.file }));
|
|
110
|
+
}
|
|
111
|
+
export function matchApiRoute(api, pathname) {
|
|
112
|
+
const m = matchAppRoutes(api, pathname);
|
|
113
|
+
if (!m)
|
|
114
|
+
return null;
|
|
115
|
+
const leaf = m.chain[m.chain.length - 1];
|
|
116
|
+
const file = leaf.files?.page;
|
|
117
|
+
return file ? { file, params: m.params, pattern: m.pattern } : null;
|
|
118
|
+
}
|
|
119
|
+
export function listPages(scan) {
|
|
120
|
+
return flattenRoutes(toStaticManifest(scan));
|
|
121
|
+
}
|
|
122
|
+
/** Generate the `virtual:textjs/routes` module source. */
|
|
123
|
+
export function generateRoutesModule(scan, options = {}) {
|
|
124
|
+
const imports = [];
|
|
125
|
+
let n = 0;
|
|
126
|
+
const ref = (file, lazy) => {
|
|
127
|
+
const spec = JSON.stringify(toPosix(file));
|
|
128
|
+
if (lazy)
|
|
129
|
+
return `() => import(${spec})`;
|
|
130
|
+
const id = `m${n++}`;
|
|
131
|
+
imports.push(`import * as ${id} from ${spec};`);
|
|
132
|
+
return id;
|
|
133
|
+
};
|
|
134
|
+
const emit = (s, indent) => {
|
|
135
|
+
const props = [`segment: ${JSON.stringify(s.segment)}`];
|
|
136
|
+
const files = [];
|
|
137
|
+
for (const kind of ROUTE_FILE_KINDS) {
|
|
138
|
+
const f = s.files[kind];
|
|
139
|
+
if (!f)
|
|
140
|
+
continue;
|
|
141
|
+
const key = kind === "not-found" ? "notFound" : kind;
|
|
142
|
+
props.push(`${key}: ${ref(f, kind === "page" && options.lazyPages === true)}`);
|
|
143
|
+
files.push(`${JSON.stringify(kind)}: ${JSON.stringify(toPosix(relative(scan.root, f)))}`);
|
|
144
|
+
}
|
|
145
|
+
if (files.length > 0)
|
|
146
|
+
props.push(`files: { ${files.join(", ")} }`);
|
|
147
|
+
const kids = s.children.map((c) => emit(c, `${indent} `)).filter((c) => c !== null);
|
|
148
|
+
if (kids.length > 0)
|
|
149
|
+
props.push(`children: [\n${kids.map((k) => `${indent} ${k}`).join(",\n")}\n${indent}]`);
|
|
150
|
+
if (files.length === 0 && kids.length === 0 && s.segment !== "")
|
|
151
|
+
return null;
|
|
152
|
+
return `{ ${props.join(", ")} }`;
|
|
153
|
+
};
|
|
154
|
+
const body = emit(scan.tree, "") ?? `{ segment: "" }`;
|
|
155
|
+
const lines = [...imports, "", `export const routes = ${body};`, "export default routes;"];
|
|
156
|
+
if (options.hmr) {
|
|
157
|
+
lines.push("if (import.meta.hot) {", " import.meta.hot.accept((mod) => {", " if (mod && typeof window !== 'undefined' && window.__TEXTJS_APP__) window.__TEXTJS_APP__.updateRoutes(mod.routes);", " });", "}");
|
|
158
|
+
}
|
|
159
|
+
return lines.join("\n");
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/server/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAmG,MAAM,YAAY,CAAC;AAE9K,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAkBxE,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAY,EAAE,OAAoB;IAC/D,KAAK,MAAM,GAAG,IAAI,gBAAgB;QAAE,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;IAC9F,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,OAAe;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,KAAK,GAA2C,EAAE,CAAC;IACzD,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC3G,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,cAAc;YAAE,SAAS;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,KAAK;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAM,GAAG,KAAK;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;IACxG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,OAAO,CAAC;AACpF,CAAC;AAED,MAAM,aAAa,GAAG,sDAAsD,CAAC;AAE7E,SAAS,kBAAkB,CAAC,IAAwB;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,OAAO,GAAG,CAAC,CAAiB,EAAoB,EAAE;QACtD,MAAM,IAAI,GAAqB,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACjE,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,GAAG,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;YACpD,IAA2C,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7G,IAAI,CAAC,KAAgC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,UAAU,CAAC,CAAmB;IACrC,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACpH,CAAC;AAOD,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,OAAO,GAAG,CAAC,CAAiB,EAAoB,EAAE;QACtD,MAAM,IAAI,GAAqB,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACxG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,OAAO,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAkB,EAAE,QAAgB;IAChE,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAqB,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;IAC9B,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AASD,0DAA0D;AAC1D,MAAM,UAAU,oBAAoB,CAAC,IAAa,EAAE,UAA2B,EAAE;IAC/E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,IAAa,EAAU,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI;YAAE,OAAO,gBAAgB,IAAI,GAAG,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAE,MAAc,EAAiB,EAAE;QAChE,MAAM,KAAK,GAAa,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,GAAG,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAClG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC;QAC9G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC7E,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACnC,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC;IACtD,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,yBAAyB,IAAI,GAAG,EAAE,wBAAwB,CAAC,CAAC;IAC3F,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CACR,wBAAwB,EACxB,qCAAqC,EACrC,wHAAwH,EACxH,OAAO,EACP,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Server Components for server-rendered console routes.
|
|
3
|
+
*
|
|
4
|
+
* React's client reconciler (which the console renderer is) re-runs an
|
|
5
|
+
* `async function` component on every retry, creating a fresh promise each
|
|
6
|
+
* time, so it never settles. On the server, `text dev` / `text build` alias
|
|
7
|
+
* `react/jsx-runtime` to {@link ./jsx-runtime}, which swaps every async
|
|
8
|
+
* component for a wrapper that memoizes its promise per session, navigation
|
|
9
|
+
* and props, then unwraps it with `use()` (suspending to the nearest
|
|
10
|
+
* `<Suspense>` / `loading.tsx` meanwhile). The data access stays on the server:
|
|
11
|
+
* these modules never ship to the frame player.
|
|
12
|
+
*/
|
|
13
|
+
import { type ComponentType, type ReactNode } from "react";
|
|
14
|
+
type AnyComponent = (props: any) => unknown;
|
|
15
|
+
/** Promises kept per cache (least recently used are dropped first). */
|
|
16
|
+
export declare const SERVER_COMPONENT_CACHE_SIZE = 256;
|
|
17
|
+
/** Per-session promise cache, cleared whenever the route or `router.refresh()` generation changes. */
|
|
18
|
+
export declare class ServerComponentCache {
|
|
19
|
+
private generation;
|
|
20
|
+
private readonly entries;
|
|
21
|
+
private readonly ids;
|
|
22
|
+
private nextId;
|
|
23
|
+
private inflight;
|
|
24
|
+
private settledAt;
|
|
25
|
+
private readonly maxEntries;
|
|
26
|
+
private readonly onActivity;
|
|
27
|
+
/** `onActivity` runs whenever a component's promise starts or settles (idle tracking). */
|
|
28
|
+
constructor(options?: {
|
|
29
|
+
maxEntries?: number;
|
|
30
|
+
onActivity?: () => void;
|
|
31
|
+
});
|
|
32
|
+
get size(): number;
|
|
33
|
+
/** Component promises that have not settled yet. */
|
|
34
|
+
get pending(): number;
|
|
35
|
+
/** `Date.now()` when a component promise last settled (0 = never). */
|
|
36
|
+
get lastSettled(): number;
|
|
37
|
+
clear(): void;
|
|
38
|
+
/** Stable identity id for functions, symbols-as-objects and non-plain objects. */
|
|
39
|
+
idOf(value: object): number;
|
|
40
|
+
read(component: AnyComponent, props: object, generation: string): Promise<ReactNode>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Structural key for props: primitives, plain objects, arrays, `Date`, `URL`,
|
|
44
|
+
* `URLSearchParams`, `RegExp`, `Map`, `Set`, class instances (by constructor
|
|
45
|
+
* and own fields) and React elements by value; component types by identity
|
|
46
|
+
* (they're module-level). Function props aren't part of the key: a callback
|
|
47
|
+
* rebuilt on every render would otherwise miss on every retry and suspend
|
|
48
|
+
* forever. Props rebuilt on every parent render keep the same key, so a
|
|
49
|
+
* retried render reuses the in-flight promise.
|
|
50
|
+
*/
|
|
51
|
+
export declare function stableKey(value: unknown, cache: ServerComponentCache, depth: number, seen?: WeakSet<object>): string;
|
|
52
|
+
export declare const ServerComponentCacheContext: import("react").Context<ServerComponentCache | null>;
|
|
53
|
+
/** Drop every promise cached outside live sessions (`text run` between apps, tests). */
|
|
54
|
+
export declare function clearFallbackServerComponentCache(): void;
|
|
55
|
+
export declare function isAsyncComponent(type: unknown): type is AnyComponent;
|
|
56
|
+
/** Wrap an `async function` component so it renders on the console reconciler. */
|
|
57
|
+
export declare function serverComponent<P extends object>(component: (props: P) => Promise<ReactNode>): ComponentType<P>;
|
|
58
|
+
export declare function resolveServerType<T>(type: T): T;
|
|
59
|
+
/** Provide a session's cache to every async component below. */
|
|
60
|
+
export declare function ServerComponentsProvider({ cache, children }: {
|
|
61
|
+
cache: ServerComponentCache;
|
|
62
|
+
children?: ReactNode;
|
|
63
|
+
}): ReactNode;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=server-components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-components.d.ts","sourceRoot":"","sources":["../../src/server/server-components.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAkC,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3F,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;AAE5C,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,sGAAsG;AACtG,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IACrD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2B;IAEtD,0FAA0F;gBAC9E,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO;IAK1E,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,oDAAoD;IACpD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,sEAAsE;IACtE,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,KAAK,IAAI,IAAI;IAIb,kFAAkF;IAClF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAS3B,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAkCrF;AAQD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,MAAM,CAAiB,GAAG,MAAM,CA8CnI;AAED,eAAO,MAAM,2BAA2B,sDAAuG,CAAC;AAKhJ,wFAAwF;AACxF,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,YAAY,CAEpE;AAID,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAe/G;AAMD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAY/C;AAED,gEAAgE;AAChE,wBAAgB,wBAAwB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAE9H"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Server Components for server-rendered console routes.
|
|
3
|
+
*
|
|
4
|
+
* React's client reconciler (which the console renderer is) re-runs an
|
|
5
|
+
* `async function` component on every retry, creating a fresh promise each
|
|
6
|
+
* time, so it never settles. On the server, `text dev` / `text build` alias
|
|
7
|
+
* `react/jsx-runtime` to {@link ./jsx-runtime}, which swaps every async
|
|
8
|
+
* component for a wrapper that memoizes its promise per session, navigation
|
|
9
|
+
* and props, then unwraps it with `use()` (suspending to the nearest
|
|
10
|
+
* `<Suspense>` / `loading.tsx` meanwhile). The data access stays on the server:
|
|
11
|
+
* these modules never ship to the frame player.
|
|
12
|
+
*/
|
|
13
|
+
import { createElement, use, useContext } from "react";
|
|
14
|
+
import { sharedContext } from "@textjs/react";
|
|
15
|
+
import { RouterContext } from "../context.js";
|
|
16
|
+
/** Promises kept per cache (least recently used are dropped first). */
|
|
17
|
+
export const SERVER_COMPONENT_CACHE_SIZE = 256;
|
|
18
|
+
/** Per-session promise cache, cleared whenever the route or `router.refresh()` generation changes. */
|
|
19
|
+
export class ServerComponentCache {
|
|
20
|
+
generation = "";
|
|
21
|
+
entries = new Map();
|
|
22
|
+
ids = new WeakMap();
|
|
23
|
+
nextId = 1;
|
|
24
|
+
inflight = 0;
|
|
25
|
+
settledAt = 0;
|
|
26
|
+
maxEntries;
|
|
27
|
+
onActivity;
|
|
28
|
+
/** `onActivity` runs whenever a component's promise starts or settles (idle tracking). */
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.maxEntries = options.maxEntries ?? SERVER_COMPONENT_CACHE_SIZE;
|
|
31
|
+
this.onActivity = options.onActivity;
|
|
32
|
+
}
|
|
33
|
+
get size() {
|
|
34
|
+
return this.entries.size;
|
|
35
|
+
}
|
|
36
|
+
/** Component promises that have not settled yet. */
|
|
37
|
+
get pending() {
|
|
38
|
+
return this.inflight;
|
|
39
|
+
}
|
|
40
|
+
/** `Date.now()` when a component promise last settled (0 = never). */
|
|
41
|
+
get lastSettled() {
|
|
42
|
+
return this.settledAt;
|
|
43
|
+
}
|
|
44
|
+
clear() {
|
|
45
|
+
this.entries.clear();
|
|
46
|
+
}
|
|
47
|
+
/** Stable identity id for functions, symbols-as-objects and non-plain objects. */
|
|
48
|
+
idOf(value) {
|
|
49
|
+
let id = this.ids.get(value);
|
|
50
|
+
if (id === undefined) {
|
|
51
|
+
id = this.nextId++;
|
|
52
|
+
this.ids.set(value, id);
|
|
53
|
+
}
|
|
54
|
+
return id;
|
|
55
|
+
}
|
|
56
|
+
read(component, props, generation) {
|
|
57
|
+
if (generation !== this.generation) {
|
|
58
|
+
this.generation = generation;
|
|
59
|
+
this.entries.clear();
|
|
60
|
+
}
|
|
61
|
+
const key = `${this.idOf(component)}|${stableKey(props, this, 0)}`;
|
|
62
|
+
let p = this.entries.get(key);
|
|
63
|
+
if (p !== undefined) {
|
|
64
|
+
// Most recently used last.
|
|
65
|
+
this.entries.delete(key);
|
|
66
|
+
this.entries.set(key, p);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
try {
|
|
70
|
+
p = Promise.resolve(component(props));
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
p = Promise.reject(error);
|
|
74
|
+
}
|
|
75
|
+
// Rejections surface through `use()` to the nearest error boundary.
|
|
76
|
+
this.inflight++;
|
|
77
|
+
this.onActivity?.();
|
|
78
|
+
const settled = () => {
|
|
79
|
+
this.inflight--;
|
|
80
|
+
this.settledAt = Date.now();
|
|
81
|
+
this.onActivity?.();
|
|
82
|
+
};
|
|
83
|
+
p.then(settled, settled);
|
|
84
|
+
this.entries.set(key, p);
|
|
85
|
+
for (const k of this.entries.keys()) {
|
|
86
|
+
if (this.entries.size <= this.maxEntries)
|
|
87
|
+
break;
|
|
88
|
+
this.entries.delete(k);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return p;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const MAX_DEPTH = 64;
|
|
95
|
+
const REACT_ELEMENT = Symbol.for("react.transitional.element");
|
|
96
|
+
const REACT_ELEMENT_LEGACY = Symbol.for("react.element");
|
|
97
|
+
let warnedFunctionProp = false;
|
|
98
|
+
/**
|
|
99
|
+
* Structural key for props: primitives, plain objects, arrays, `Date`, `URL`,
|
|
100
|
+
* `URLSearchParams`, `RegExp`, `Map`, `Set`, class instances (by constructor
|
|
101
|
+
* and own fields) and React elements by value; component types by identity
|
|
102
|
+
* (they're module-level). Function props aren't part of the key: a callback
|
|
103
|
+
* rebuilt on every render would otherwise miss on every retry and suspend
|
|
104
|
+
* forever. Props rebuilt on every parent render keep the same key, so a
|
|
105
|
+
* retried render reuses the in-flight promise.
|
|
106
|
+
*/
|
|
107
|
+
export function stableKey(value, cache, depth, seen = new WeakSet()) {
|
|
108
|
+
switch (typeof value) {
|
|
109
|
+
case "string":
|
|
110
|
+
return JSON.stringify(value);
|
|
111
|
+
case "number":
|
|
112
|
+
case "boolean":
|
|
113
|
+
case "bigint":
|
|
114
|
+
return `${typeof value}:${String(value)}`;
|
|
115
|
+
case "undefined":
|
|
116
|
+
return "u";
|
|
117
|
+
case "symbol":
|
|
118
|
+
return `s:${String(value)}`;
|
|
119
|
+
case "function":
|
|
120
|
+
if (!warnedFunctionProp) {
|
|
121
|
+
warnedFunctionProp = true;
|
|
122
|
+
console.warn("▼ Text.js: an async server component received a function prop. Functions aren't part of its cache key; pass data instead of callbacks.");
|
|
123
|
+
}
|
|
124
|
+
return "f";
|
|
125
|
+
}
|
|
126
|
+
if (value === null)
|
|
127
|
+
return "n";
|
|
128
|
+
const obj = value;
|
|
129
|
+
if (seen.has(obj))
|
|
130
|
+
return "cycle";
|
|
131
|
+
if (depth >= MAX_DEPTH)
|
|
132
|
+
return `o#${cache.idOf(obj)}`;
|
|
133
|
+
seen.add(obj);
|
|
134
|
+
try {
|
|
135
|
+
const next = (v) => stableKey(v, cache, depth + 1, seen);
|
|
136
|
+
if (Array.isArray(obj))
|
|
137
|
+
return `[${obj.map(next).join(",")}]`;
|
|
138
|
+
const tag = obj.$$typeof;
|
|
139
|
+
if (tag === REACT_ELEMENT || tag === REACT_ELEMENT_LEGACY) {
|
|
140
|
+
const type = obj.type;
|
|
141
|
+
const t = typeof type === "string" ? type : typeof type === "object" || typeof type === "function" ? `#${cache.idOf(type)}` : String(type);
|
|
142
|
+
return `<${t}:${String(obj.key)}:${next(obj.props)}>`;
|
|
143
|
+
}
|
|
144
|
+
if (obj instanceof Date)
|
|
145
|
+
return `d:${obj.getTime()}`;
|
|
146
|
+
if (obj instanceof URL)
|
|
147
|
+
return `url:${JSON.stringify(obj.href)}`;
|
|
148
|
+
if (obj instanceof URLSearchParams)
|
|
149
|
+
return `qs:${JSON.stringify(obj.toString())}`;
|
|
150
|
+
if (obj instanceof RegExp)
|
|
151
|
+
return `re:${JSON.stringify(obj.toString())}`;
|
|
152
|
+
if (obj instanceof Map)
|
|
153
|
+
return `map{${[...obj].map(([k, v]) => `${next(k)}=>${next(v)}`).sort().join(",")}}`;
|
|
154
|
+
if (obj instanceof Set)
|
|
155
|
+
return `set{${[...obj].map(next).sort().join(",")}}`;
|
|
156
|
+
const proto = Object.getPrototypeOf(obj);
|
|
157
|
+
const prefix = proto !== Object.prototype && proto !== null ? `${proto.constructor?.name ?? "?"}` : "";
|
|
158
|
+
const keys = Object.keys(obj).sort();
|
|
159
|
+
return `${prefix}{${keys.map((k) => `${JSON.stringify(k)}:${next(obj[k])}`).join(",")}}`;
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
seen.delete(obj);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export const ServerComponentCacheContext = sharedContext("serverComponentCache", null, "TextServerComponentCache");
|
|
166
|
+
/** Used when an async component renders outside a live session (tests, `text run`); bounded like a session's. */
|
|
167
|
+
const fallbackCache = new ServerComponentCache();
|
|
168
|
+
/** Drop every promise cached outside live sessions (`text run` between apps, tests). */
|
|
169
|
+
export function clearFallbackServerComponentCache() {
|
|
170
|
+
fallbackCache.clear();
|
|
171
|
+
}
|
|
172
|
+
const AsyncFunction = (async () => undefined).constructor;
|
|
173
|
+
export function isAsyncComponent(type) {
|
|
174
|
+
return typeof type === "function" && type instanceof AsyncFunction;
|
|
175
|
+
}
|
|
176
|
+
const wrappers = new WeakMap();
|
|
177
|
+
/** Wrap an `async function` component so it renders on the console reconciler. */
|
|
178
|
+
export function serverComponent(component) {
|
|
179
|
+
const fn = component;
|
|
180
|
+
let wrapped = wrappers.get(fn);
|
|
181
|
+
if (wrapped === undefined) {
|
|
182
|
+
const Wrapped = (props) => {
|
|
183
|
+
const cache = useContext(ServerComponentCacheContext) ?? fallbackCache;
|
|
184
|
+
const router = useContext(RouterContext);
|
|
185
|
+
const generation = router ? `${router.location.key}:${router.refreshKey}` : "";
|
|
186
|
+
return use(cache.read(fn, props, generation));
|
|
187
|
+
};
|
|
188
|
+
Wrapped.displayName = fn.name ? `${fn.name}` : "ServerComponent";
|
|
189
|
+
wrapped = Wrapped;
|
|
190
|
+
wrappers.set(fn, wrapped);
|
|
191
|
+
}
|
|
192
|
+
return wrapped;
|
|
193
|
+
}
|
|
194
|
+
/** `type` with async function components swapped for their wrappers. */
|
|
195
|
+
const REACT_MEMO = Symbol.for("react.memo");
|
|
196
|
+
const memoWrappers = new WeakMap();
|
|
197
|
+
export function resolveServerType(type) {
|
|
198
|
+
if (isAsyncComponent(type))
|
|
199
|
+
return serverComponent(type);
|
|
200
|
+
// `React.memo(async function …)`: wrap the inner component, keep the memo.
|
|
201
|
+
if (typeof type === "object" && type !== null && type.$$typeof === REACT_MEMO && isAsyncComponent(type.type)) {
|
|
202
|
+
let wrapped = memoWrappers.get(type);
|
|
203
|
+
if (wrapped === undefined) {
|
|
204
|
+
wrapped = { ...type, type: serverComponent(type.type) };
|
|
205
|
+
memoWrappers.set(type, wrapped);
|
|
206
|
+
}
|
|
207
|
+
return wrapped;
|
|
208
|
+
}
|
|
209
|
+
return type;
|
|
210
|
+
}
|
|
211
|
+
/** Provide a session's cache to every async component below. */
|
|
212
|
+
export function ServerComponentsProvider({ cache, children }) {
|
|
213
|
+
return createElement(ServerComponentCacheContext, { value: cache }, children);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=server-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-components.js","sourceRoot":"","sources":["../../src/server/server-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,wBAAwB,CAAC"}
|
package/dist/terminal.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@textjs/app/vite` — the Vite plugin behind `text dev` and `text build`:
|
|
3
|
+
* file-system App Router manifest, virtual `index.html` + client entry,
|
|
4
|
+
* `app/**\/route.ts` API handlers, rewrites / proxy and React Fast Refresh.
|
|
5
|
+
*/
|
|
6
|
+
import type { Plugin, ViteDevServer } from "vite";
|
|
7
|
+
import { type TextConfig } from "./config.js";
|
|
8
|
+
import { type AppScan } from "./server/scan.js";
|
|
9
|
+
export declare const VIRTUAL_ROUTES = "virtual:textjs/routes";
|
|
10
|
+
export declare const VIRTUAL_CONFIG = "virtual:textjs/config";
|
|
11
|
+
export declare const VIRTUAL_ENTRY = "virtual:textjs/entry";
|
|
12
|
+
export declare const VIRTUAL_API = "virtual:textjs/api";
|
|
13
|
+
/** The script `src` used by the generated `index.html`. */
|
|
14
|
+
export declare const ENTRY_URL = "/@textjs/entry";
|
|
15
|
+
/**
|
|
16
|
+
* The URL every page's HTML is transformed as (Vite's SPA fallback does the same).
|
|
17
|
+
* The request URL can't be used: Vite maps `/?q` to the project directory and then
|
|
18
|
+
* watches the inline `<style>`'s "file", `/`, so chokidar crawls the whole disk.
|
|
19
|
+
*/
|
|
20
|
+
export declare const HTML_TRANSFORM_URL = "/index.html";
|
|
21
|
+
export interface TextLogger {
|
|
22
|
+
info(message: string): void;
|
|
23
|
+
error(message: string): void;
|
|
24
|
+
}
|
|
25
|
+
export interface TextVitePluginOptions extends TextConfig {
|
|
26
|
+
/** Project root (defaults to Vite's `root`). */
|
|
27
|
+
root?: string;
|
|
28
|
+
/** Request / HMR log lines (the CLI passes its logger). */
|
|
29
|
+
logger?: TextLogger;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Mirrors Vite's `server.allowedHosts` check. Text.js API routes and user
|
|
33
|
+
* middleware are registered in the pre-hook phase (ahead of Vite's own host
|
|
34
|
+
* check), so they get the same DNS-rebinding protection here.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isAllowedDevHost(server: Pick<ViteDevServer, "config">, hostHeader: string | undefined): boolean;
|
|
37
|
+
/** Absolute path of `@textjs/app/client` (deduped with the user's `@textjs/app` imports via realpath). */
|
|
38
|
+
export declare const CLIENT_MODULE: string;
|
|
39
|
+
export declare const FAVICON: string;
|
|
40
|
+
/** The generated `index.html` used when the project has none. */
|
|
41
|
+
export declare function createIndexHtml(title: string, entryUrl?: string): string;
|
|
42
|
+
export declare function createEntryModule(clientModule?: string): string;
|
|
43
|
+
/** Generate the server-side API handler bundle entry. */
|
|
44
|
+
export declare function generateApiModule(scan: AppScan): string;
|
|
45
|
+
/** Whether Vite's `server.proxy` owns `url` (same key semantics: a path prefix, or a RegExp source starting with `^`). */
|
|
46
|
+
export declare function matchesProxy(proxy: TextConfig["proxy"], url: string): boolean;
|
|
47
|
+
/** Text.js Vite plugin (includes `@vitejs/plugin-react` for Fast Refresh). */
|
|
48
|
+
export declare function textjsVitePlugin(options?: TextVitePluginOptions): Plugin[];
|
|
49
|
+
export { scanApp, toStaticManifest, listApiRoutes, listPages, generateRoutesModule, type AppScan } from "./server/scan.js";
|
|
50
|
+
export default textjsVitePlugin;
|
|
51
|
+
//# sourceMappingURL=vite-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,MAAM,EAAgB,aAAa,EAAE,MAAM,MAAM,CAAC;AAEhE,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAO5F,OAAO,EAAuG,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAGlJ,eAAO,MAAM,cAAc,0BAA0B,CAAC;AACtD,eAAO,MAAM,cAAc,0BAA0B,CAAC;AACtD,eAAO,MAAM,aAAa,yBAAyB,CAAC;AACpD,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,2DAA2D;AAC3D,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAC1C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAIhD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAmB/G;AAqBD,0GAA0G;AAC1G,eAAO,MAAM,aAAa,QAAiC,CAAC;AAE5D,eAAO,MAAM,OAAO,QAEjB,CAAC;AAMJ,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,MAAM,CAuB3E;AAED,wBAAgB,iBAAiB,CAAC,YAAY,SAAgB,GAAG,MAAM,CAOtE;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAsBvD;AA4BD,0HAA0H;AAC1H,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAG7E;AAWD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,qBAA0B,GAAG,MAAM,EAAE,CAyM9E;AAED,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AACxH,eAAe,gBAAgB,CAAC"}
|