@ttsc/graph 0.16.4 → 0.16.5

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 (109) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +24 -53
  3. package/lib/TtscGraphApplication.js +46 -0
  4. package/lib/TtscGraphApplication.js.map +1 -0
  5. package/lib/index.js +31 -108
  6. package/lib/index.js.map +1 -1
  7. package/lib/model/TtscGraphMemory.js +185 -0
  8. package/lib/model/TtscGraphMemory.js.map +1 -0
  9. package/lib/model/loadGraph.js +418 -0
  10. package/lib/model/loadGraph.js.map +1 -0
  11. package/lib/reduce.js +101 -0
  12. package/lib/reduce.js.map +1 -0
  13. package/lib/resolveGraphBinary.js +42 -0
  14. package/lib/resolveGraphBinary.js.map +1 -0
  15. package/lib/server/createServer.js +1227 -0
  16. package/lib/server/createServer.js.map +1 -0
  17. package/lib/server/instructions.js +32 -0
  18. package/lib/server/instructions.js.map +1 -0
  19. package/lib/server/resolveHandle.js +25 -0
  20. package/lib/server/resolveHandle.js.map +1 -0
  21. package/lib/server/runExpand.js +177 -0
  22. package/lib/server/runExpand.js.map +1 -0
  23. package/lib/server/runIndex.js +146 -0
  24. package/lib/server/runIndex.js.map +1 -0
  25. package/lib/server/runOverview.js +150 -0
  26. package/lib/server/runOverview.js.map +1 -0
  27. package/lib/server/runQuery.js +147 -0
  28. package/lib/server/runQuery.js.map +1 -0
  29. package/lib/server/runTrace.js +219 -0
  30. package/lib/server/runTrace.js.map +1 -0
  31. package/lib/server/startServer.js +21 -0
  32. package/lib/server/startServer.js.map +1 -0
  33. package/lib/structures/ITtscGraphApplication.js +3 -0
  34. package/lib/structures/ITtscGraphApplication.js.map +1 -0
  35. package/lib/structures/ITtscGraphDecorator.js +3 -0
  36. package/lib/structures/ITtscGraphDecorator.js.map +1 -0
  37. package/lib/structures/ITtscGraphDiagnostic.js +3 -0
  38. package/lib/structures/ITtscGraphDiagnostic.js.map +1 -0
  39. package/lib/structures/ITtscGraphDump.js +3 -0
  40. package/lib/structures/ITtscGraphDump.js.map +1 -0
  41. package/lib/structures/ITtscGraphEdge.js +3 -0
  42. package/lib/structures/ITtscGraphEdge.js.map +1 -0
  43. package/lib/structures/ITtscGraphEvidence.js +3 -0
  44. package/lib/structures/ITtscGraphEvidence.js.map +1 -0
  45. package/lib/structures/ITtscGraphExpand.js +3 -0
  46. package/lib/structures/ITtscGraphExpand.js.map +1 -0
  47. package/lib/structures/ITtscGraphIndex.js +3 -0
  48. package/lib/structures/ITtscGraphIndex.js.map +1 -0
  49. package/lib/structures/ITtscGraphNode.js +3 -0
  50. package/lib/structures/ITtscGraphNode.js.map +1 -0
  51. package/lib/structures/ITtscGraphOverview.js +3 -0
  52. package/lib/structures/ITtscGraphOverview.js.map +1 -0
  53. package/lib/structures/ITtscGraphQuery.js +3 -0
  54. package/lib/structures/ITtscGraphQuery.js.map +1 -0
  55. package/lib/structures/ITtscGraphTrace.js +3 -0
  56. package/lib/structures/ITtscGraphTrace.js.map +1 -0
  57. package/lib/structures/TtscGraphEdgeKind.js +3 -0
  58. package/lib/structures/TtscGraphEdgeKind.js.map +1 -0
  59. package/lib/structures/TtscGraphNodeKind.js +3 -0
  60. package/lib/structures/TtscGraphNodeKind.js.map +1 -0
  61. package/lib/structures/TtscGraphNodeModifier.js +3 -0
  62. package/lib/structures/TtscGraphNodeModifier.js.map +1 -0
  63. package/lib/structures/index.js +37 -0
  64. package/lib/structures/index.js.map +1 -0
  65. package/lib/view.js +140 -0
  66. package/lib/view.js.map +1 -0
  67. package/lib/viewer/index.html +123 -0
  68. package/lib/viewer/viewer.js +4610 -0
  69. package/package.json +17 -4
  70. package/src/TtscGraphApplication.ts +57 -0
  71. package/src/index.ts +40 -126
  72. package/src/model/TtscGraphMemory.ts +204 -0
  73. package/src/model/loadGraph.ts +85 -0
  74. package/src/reduce.ts +165 -0
  75. package/src/resolveGraphBinary.ts +40 -0
  76. package/src/server/createServer.ts +104 -0
  77. package/src/server/instructions.ts +28 -0
  78. package/src/server/resolveHandle.ts +34 -0
  79. package/src/server/runExpand.ts +186 -0
  80. package/src/server/runIndex.ts +181 -0
  81. package/src/server/runOverview.ts +154 -0
  82. package/src/server/runQuery.ts +150 -0
  83. package/src/server/runTrace.ts +233 -0
  84. package/src/server/startServer.ts +25 -0
  85. package/src/structures/ITtscGraphApplication.ts +68 -0
  86. package/src/structures/ITtscGraphDecorator.ts +33 -0
  87. package/src/structures/ITtscGraphDiagnostic.ts +34 -0
  88. package/src/structures/ITtscGraphDump.ts +35 -0
  89. package/src/structures/ITtscGraphEdge.ts +24 -0
  90. package/src/structures/ITtscGraphEvidence.ts +29 -0
  91. package/src/structures/ITtscGraphExpand.ts +85 -0
  92. package/src/structures/ITtscGraphIndex.ts +100 -0
  93. package/src/structures/ITtscGraphNode.ts +64 -0
  94. package/src/structures/ITtscGraphOverview.ts +79 -0
  95. package/src/structures/ITtscGraphQuery.ts +49 -0
  96. package/src/structures/ITtscGraphTrace.ts +97 -0
  97. package/src/structures/TtscGraphEdgeKind.ts +23 -0
  98. package/src/structures/TtscGraphNodeKind.ts +26 -0
  99. package/src/structures/TtscGraphNodeModifier.ts +19 -0
  100. package/src/structures/index.ts +21 -0
  101. package/src/view.ts +155 -0
  102. package/src/viewer/index.html +123 -0
  103. package/src/viewer/main.ts +209 -0
  104. package/lib/bin.d.ts +0 -2
  105. package/lib/diagnostics.d.ts +0 -23
  106. package/lib/diagnostics.js +0 -84
  107. package/lib/diagnostics.js.map +0 -1
  108. package/lib/index.d.ts +0 -29
  109. 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
@@ -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>