@ttsc/graph 0.16.4 → 0.16.6
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/LICENSE +21 -21
- package/README.md +24 -53
- package/lib/TtscGraphApplication.js +59 -0
- package/lib/TtscGraphApplication.js.map +1 -0
- package/lib/index.js +31 -108
- package/lib/index.js.map +1 -1
- package/lib/model/TtscGraphMemory.js +185 -0
- package/lib/model/TtscGraphMemory.js.map +1 -0
- package/lib/model/loadGraph.js +418 -0
- package/lib/model/loadGraph.js.map +1 -0
- package/lib/reduce.js +101 -0
- package/lib/reduce.js.map +1 -0
- package/lib/resolveGraphBinary.js +42 -0
- package/lib/resolveGraphBinary.js.map +1 -0
- package/lib/server/accessAliases.js +53 -0
- package/lib/server/accessAliases.js.map +1 -0
- package/lib/server/createServer.js +1726 -0
- package/lib/server/createServer.js.map +1 -0
- package/lib/server/instructions.js +80 -0
- package/lib/server/instructions.js.map +1 -0
- package/lib/server/resolveHandle.js +25 -0
- package/lib/server/resolveHandle.js.map +1 -0
- package/lib/server/runDetails.js +413 -0
- package/lib/server/runDetails.js.map +1 -0
- package/lib/server/runEntrypoints.js +211 -0
- package/lib/server/runEntrypoints.js.map +1 -0
- package/lib/server/runLookup.js +234 -0
- package/lib/server/runLookup.js.map +1 -0
- package/lib/server/runOverview.js +160 -0
- package/lib/server/runOverview.js.map +1 -0
- package/lib/server/runTrace.js +314 -0
- package/lib/server/runTrace.js.map +1 -0
- package/lib/server/startServer.js +21 -0
- package/lib/server/startServer.js.map +1 -0
- package/lib/structures/ITtscGraphApplication.js +3 -0
- package/lib/structures/ITtscGraphApplication.js.map +1 -0
- package/lib/structures/ITtscGraphDecorator.js +3 -0
- package/lib/structures/ITtscGraphDecorator.js.map +1 -0
- package/lib/structures/ITtscGraphDetails.js +3 -0
- package/lib/structures/ITtscGraphDetails.js.map +1 -0
- package/lib/structures/ITtscGraphDiagnostic.js +3 -0
- package/lib/structures/ITtscGraphDiagnostic.js.map +1 -0
- package/lib/structures/ITtscGraphDump.js +3 -0
- package/lib/structures/ITtscGraphDump.js.map +1 -0
- package/lib/structures/ITtscGraphEdge.js +3 -0
- package/lib/structures/ITtscGraphEdge.js.map +1 -0
- package/lib/structures/ITtscGraphEntrypoints.js +3 -0
- package/lib/structures/ITtscGraphEntrypoints.js.map +1 -0
- package/lib/structures/ITtscGraphEscape.js +3 -0
- package/lib/structures/ITtscGraphEscape.js.map +1 -0
- package/lib/structures/ITtscGraphEvidence.js +3 -0
- package/lib/structures/ITtscGraphEvidence.js.map +1 -0
- package/lib/structures/ITtscGraphLookup.js +3 -0
- package/lib/structures/ITtscGraphLookup.js.map +1 -0
- package/lib/structures/ITtscGraphNode.js +3 -0
- package/lib/structures/ITtscGraphNode.js.map +1 -0
- package/lib/structures/ITtscGraphOverview.js +3 -0
- package/lib/structures/ITtscGraphOverview.js.map +1 -0
- package/lib/structures/ITtscGraphTrace.js +3 -0
- package/lib/structures/ITtscGraphTrace.js.map +1 -0
- package/lib/structures/TtscGraphEdgeKind.js +3 -0
- package/lib/structures/TtscGraphEdgeKind.js.map +1 -0
- package/lib/structures/TtscGraphNodeKind.js +3 -0
- package/lib/structures/TtscGraphNodeKind.js.map +1 -0
- package/lib/structures/TtscGraphNodeModifier.js +3 -0
- package/lib/structures/TtscGraphNodeModifier.js.map +1 -0
- package/lib/structures/index.js +38 -0
- package/lib/structures/index.js.map +1 -0
- package/lib/view.js +140 -0
- package/lib/view.js.map +1 -0
- package/lib/viewer/index.html +123 -0
- package/lib/viewer/viewer.js +4610 -0
- package/package.json +17 -4
- package/src/TtscGraphApplication.ts +64 -0
- package/src/index.ts +40 -126
- package/src/model/TtscGraphMemory.ts +204 -0
- package/src/model/loadGraph.ts +85 -0
- package/src/reduce.ts +165 -0
- package/src/resolveGraphBinary.ts +40 -0
- package/src/server/accessAliases.ts +55 -0
- package/src/server/createServer.ts +101 -0
- package/src/server/instructions.ts +76 -0
- package/src/server/resolveHandle.ts +34 -0
- package/src/server/runDetails.ts +469 -0
- package/src/server/runEntrypoints.ts +256 -0
- package/src/server/runLookup.ts +257 -0
- package/src/server/runOverview.ts +166 -0
- package/src/server/runTrace.ts +359 -0
- package/src/server/startServer.ts +25 -0
- package/src/structures/ITtscGraphApplication.ts +116 -0
- package/src/structures/ITtscGraphDecorator.ts +31 -0
- package/src/structures/ITtscGraphDetails.ts +134 -0
- package/src/structures/ITtscGraphDiagnostic.ts +34 -0
- package/src/structures/ITtscGraphDump.ts +35 -0
- package/src/structures/ITtscGraphEdge.ts +24 -0
- package/src/structures/ITtscGraphEntrypoints.ts +118 -0
- package/src/structures/ITtscGraphEscape.ts +39 -0
- package/src/structures/ITtscGraphEvidence.ts +26 -0
- package/src/structures/ITtscGraphLookup.ts +61 -0
- package/src/structures/ITtscGraphNode.ts +70 -0
- package/src/structures/ITtscGraphOverview.ts +87 -0
- package/src/structures/ITtscGraphTrace.ts +140 -0
- package/src/structures/TtscGraphEdgeKind.ts +23 -0
- package/src/structures/TtscGraphNodeKind.ts +26 -0
- package/src/structures/TtscGraphNodeModifier.ts +19 -0
- package/src/structures/index.ts +22 -0
- package/src/view.ts +155 -0
- package/src/viewer/index.html +123 -0
- package/src/viewer/main.ts +209 -0
- package/lib/bin.d.ts +0 -2
- package/lib/diagnostics.d.ts +0 -23
- package/lib/diagnostics.js +0 -84
- package/lib/diagnostics.js.map +0 -1
- package/lib/index.d.ts +0 -29
- package/src/diagnostics.ts +0 -93
package/lib/view.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runView = runView;
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_http_1 = __importDefault(require("node:http"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const reduce_1 = require("./reduce");
|
|
12
|
+
const resolveGraphBinary_1 = require("./resolveGraphBinary");
|
|
13
|
+
function parseViewArgs(argv) {
|
|
14
|
+
const opts = {
|
|
15
|
+
cwd: process.cwd(),
|
|
16
|
+
tsconfig: "tsconfig.json",
|
|
17
|
+
port: 0,
|
|
18
|
+
open: true,
|
|
19
|
+
maxNodes: 1200,
|
|
20
|
+
};
|
|
21
|
+
for (let i = 0; i < argv.length; i++) {
|
|
22
|
+
const arg = argv[i];
|
|
23
|
+
if (arg === "--cwd")
|
|
24
|
+
opts.cwd = argv[++i] ?? opts.cwd;
|
|
25
|
+
else if (arg.startsWith("--cwd="))
|
|
26
|
+
opts.cwd = arg.slice("--cwd=".length);
|
|
27
|
+
else if (arg === "--tsconfig" || arg === "-p")
|
|
28
|
+
opts.tsconfig = argv[++i] ?? opts.tsconfig;
|
|
29
|
+
else if (arg.startsWith("--tsconfig="))
|
|
30
|
+
opts.tsconfig = arg.slice("--tsconfig=".length);
|
|
31
|
+
else if (arg === "--port")
|
|
32
|
+
opts.port = Number(argv[++i]);
|
|
33
|
+
else if (arg.startsWith("--port="))
|
|
34
|
+
opts.port = Number(arg.slice("--port=".length));
|
|
35
|
+
else if (arg === "--no-open")
|
|
36
|
+
opts.open = false;
|
|
37
|
+
else if (arg === "--max-nodes")
|
|
38
|
+
opts.maxNodes = Number(argv[++i]);
|
|
39
|
+
else if (arg.startsWith("--max-nodes="))
|
|
40
|
+
opts.maxNodes = Number(arg.slice("--max-nodes=".length));
|
|
41
|
+
}
|
|
42
|
+
return opts;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `ttsc-graph view`: build the project's code graph, reduce it, and serve a
|
|
46
|
+
* self-contained 3D viewer on a localhost port, opening the browser. The native
|
|
47
|
+
* binary produces the graph (the same `dump` the docs document); everything
|
|
48
|
+
* else is local and offline. The process stays alive serving until Ctrl+C.
|
|
49
|
+
*/
|
|
50
|
+
function runView(argv) {
|
|
51
|
+
const opts = parseViewArgs(argv);
|
|
52
|
+
const binary = (0, resolveGraphBinary_1.resolveGraphBinary)();
|
|
53
|
+
if (binary === null) {
|
|
54
|
+
process.stderr.write("@ttsc/graph: could not resolve the ttscgraph binary. " +
|
|
55
|
+
"Install `ttsc` so its platform package is present, " +
|
|
56
|
+
"or set TTSC_GRAPH_BINARY to an absolute path.\n");
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
process.stderr.write(`@ttsc/graph: building the graph for ${opts.cwd} (${opts.tsconfig})...\n`);
|
|
60
|
+
const dump = (0, node_child_process_1.spawnSync)(binary, ["dump", "--cwd", opts.cwd, "--tsconfig", opts.tsconfig], { encoding: "utf8", maxBuffer: 1024 * 1024 * 1024 });
|
|
61
|
+
if (dump.error) {
|
|
62
|
+
process.stderr.write(`@ttsc/graph: ${dump.error.message}\n`);
|
|
63
|
+
return 1;
|
|
64
|
+
}
|
|
65
|
+
if (dump.status !== 0) {
|
|
66
|
+
process.stderr.write(dump.stderr || "@ttsc/graph: dump failed\n");
|
|
67
|
+
return dump.status ?? 1;
|
|
68
|
+
}
|
|
69
|
+
let raw;
|
|
70
|
+
try {
|
|
71
|
+
raw = JSON.parse(dump.stdout);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
process.stderr.write(`@ttsc/graph: could not parse the graph dump: ${String(err)}\n`);
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
const payload = (0, reduce_1.reduce)(raw, { maxNodes: opts.maxNodes });
|
|
78
|
+
payload.project = node_path_1.default.basename(node_path_1.default.resolve(opts.cwd));
|
|
79
|
+
const graphJson = JSON.stringify(payload);
|
|
80
|
+
const viewerDir = node_path_1.default.join(__dirname, "viewer");
|
|
81
|
+
let indexHtml;
|
|
82
|
+
let viewerJs;
|
|
83
|
+
try {
|
|
84
|
+
indexHtml = node_fs_1.default.readFileSync(node_path_1.default.join(viewerDir, "index.html"));
|
|
85
|
+
viewerJs = node_fs_1.default.readFileSync(node_path_1.default.join(viewerDir, "viewer.js"));
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
process.stderr.write(`@ttsc/graph: the bundled viewer is missing (${String(err)}). ` +
|
|
89
|
+
"Reinstall @ttsc/graph.\n");
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
const server = node_http_1.default.createServer((req, res) => {
|
|
93
|
+
const url = (req.url ?? "/").split("?")[0];
|
|
94
|
+
if (url === "/graph.json") {
|
|
95
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
96
|
+
res.end(graphJson);
|
|
97
|
+
}
|
|
98
|
+
else if (url === "/viewer.js") {
|
|
99
|
+
res.writeHead(200, {
|
|
100
|
+
"content-type": "application/javascript; charset=utf-8",
|
|
101
|
+
});
|
|
102
|
+
res.end(viewerJs);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
106
|
+
res.end(indexHtml);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
server.listen(opts.port, "127.0.0.1", () => {
|
|
110
|
+
const address = server.address();
|
|
111
|
+
const port = typeof address === "object" && address ? address.port : opts.port;
|
|
112
|
+
const url = `http://127.0.0.1:${port}/`;
|
|
113
|
+
const counts = payload.counts;
|
|
114
|
+
process.stderr.write(`@ttsc/graph: ${counts.nodes.toLocaleString()} nodes / ${counts.links.toLocaleString()} edges` +
|
|
115
|
+
` (from ${counts.rawNodes.toLocaleString()} / ${counts.rawEdges.toLocaleString()})\n`);
|
|
116
|
+
process.stderr.write(`@ttsc/graph: serving the 3D viewer at ${url}\n`);
|
|
117
|
+
process.stderr.write("@ttsc/graph: press Ctrl+C to stop.\n");
|
|
118
|
+
if (opts.open)
|
|
119
|
+
openBrowser(url);
|
|
120
|
+
});
|
|
121
|
+
// No return: the listening server keeps the process alive until Ctrl+C.
|
|
122
|
+
}
|
|
123
|
+
/** Best-effort open the URL in the default browser; the URL is printed anyway. */
|
|
124
|
+
function openBrowser(url) {
|
|
125
|
+
try {
|
|
126
|
+
if (process.platform === "win32")
|
|
127
|
+
(0, node_child_process_1.spawn)("cmd", ["/c", "start", "", url], {
|
|
128
|
+
stdio: "ignore",
|
|
129
|
+
detached: true,
|
|
130
|
+
}).unref();
|
|
131
|
+
else if (process.platform === "darwin")
|
|
132
|
+
(0, node_child_process_1.spawn)("open", [url], { stdio: "ignore", detached: true }).unref();
|
|
133
|
+
else
|
|
134
|
+
(0, node_child_process_1.spawn)("xdg-open", [url], { stdio: "ignore", detached: true }).unref();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
/* the URL is printed; opening is a convenience */
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=view.js.map
|
package/lib/view.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>ttsc · code graph</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
color-scheme: dark;
|
|
10
|
+
}
|
|
11
|
+
* {
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
}
|
|
14
|
+
html,
|
|
15
|
+
body {
|
|
16
|
+
margin: 0;
|
|
17
|
+
height: 100%;
|
|
18
|
+
background: #0a0c10;
|
|
19
|
+
color: #e6edf3;
|
|
20
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
}
|
|
23
|
+
#app {
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
height: 100vh;
|
|
27
|
+
}
|
|
28
|
+
header {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-wrap: wrap;
|
|
31
|
+
align-items: baseline;
|
|
32
|
+
gap: 0 14px;
|
|
33
|
+
padding: 10px 16px;
|
|
34
|
+
border-bottom: 1px solid #222834;
|
|
35
|
+
background: linear-gradient(to bottom, #13171f, #0e1116);
|
|
36
|
+
}
|
|
37
|
+
header .brand {
|
|
38
|
+
font-size: 13px;
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
color: #f5f5f5;
|
|
41
|
+
}
|
|
42
|
+
header .brand b {
|
|
43
|
+
color: #36e2ee;
|
|
44
|
+
}
|
|
45
|
+
header #project {
|
|
46
|
+
font-size: 12px;
|
|
47
|
+
color: #9ca3af;
|
|
48
|
+
}
|
|
49
|
+
header #counts {
|
|
50
|
+
margin-left: auto;
|
|
51
|
+
font-size: 11px;
|
|
52
|
+
color: #6b7280;
|
|
53
|
+
}
|
|
54
|
+
#graph {
|
|
55
|
+
position: relative;
|
|
56
|
+
flex: 1;
|
|
57
|
+
min-height: 0;
|
|
58
|
+
}
|
|
59
|
+
#graph .tooltip {
|
|
60
|
+
position: absolute;
|
|
61
|
+
display: none;
|
|
62
|
+
pointer-events: none;
|
|
63
|
+
z-index: 10;
|
|
64
|
+
max-width: 24rem;
|
|
65
|
+
padding: 4px 7px;
|
|
66
|
+
border-radius: 6px;
|
|
67
|
+
background: rgba(12, 14, 19, 0.93);
|
|
68
|
+
border: 1px solid #2a313e;
|
|
69
|
+
font-size: 11px;
|
|
70
|
+
line-height: 1.4;
|
|
71
|
+
}
|
|
72
|
+
#graph .tooltip .muted {
|
|
73
|
+
color: #8b97a8;
|
|
74
|
+
}
|
|
75
|
+
footer {
|
|
76
|
+
display: flex;
|
|
77
|
+
flex-wrap: wrap;
|
|
78
|
+
gap: 6px 16px;
|
|
79
|
+
padding: 8px 16px;
|
|
80
|
+
border-top: 1px solid #222834;
|
|
81
|
+
font-size: 10px;
|
|
82
|
+
color: #6b7280;
|
|
83
|
+
}
|
|
84
|
+
footer .dot {
|
|
85
|
+
display: inline-flex;
|
|
86
|
+
align-items: center;
|
|
87
|
+
gap: 6px;
|
|
88
|
+
}
|
|
89
|
+
footer .swatch {
|
|
90
|
+
display: inline-block;
|
|
91
|
+
width: 16px;
|
|
92
|
+
height: 2px;
|
|
93
|
+
border-radius: 2px;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
96
|
+
</head>
|
|
97
|
+
<body>
|
|
98
|
+
<div id="app">
|
|
99
|
+
<header>
|
|
100
|
+
<span class="brand"><b>ttsc</b> · code graph</span>
|
|
101
|
+
<span id="project"></span>
|
|
102
|
+
<span id="counts"></span>
|
|
103
|
+
</header>
|
|
104
|
+
<div id="graph"></div>
|
|
105
|
+
<footer>
|
|
106
|
+
<span class="dot"
|
|
107
|
+
><span class="swatch" style="background: #3fb950"></span
|
|
108
|
+
>value-call</span
|
|
109
|
+
>
|
|
110
|
+
<span class="dot"
|
|
111
|
+
><span class="swatch" style="background: #f5b042"></span
|
|
112
|
+
>type-ref</span
|
|
113
|
+
>
|
|
114
|
+
<span class="dot"
|
|
115
|
+
><span class="swatch" style="background: #6ea8ff"></span
|
|
116
|
+
>heritage</span
|
|
117
|
+
>
|
|
118
|
+
<span>node size = connection count · color = declaration kind</span>
|
|
119
|
+
</footer>
|
|
120
|
+
</div>
|
|
121
|
+
<script src="viewer.js"></script>
|
|
122
|
+
</body>
|
|
123
|
+
</html>
|