cgb-builder 1.0.0
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 -0
- package/README.md +369 -0
- package/dist/bundle/generator.d.ts +51 -0
- package/dist/bundle/generator.d.ts.map +1 -0
- package/dist/bundle/generator.js +291 -0
- package/dist/bundle/generator.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +388 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/graph/db.d.ts +43 -0
- package/dist/graph/db.d.ts.map +1 -0
- package/dist/graph/db.js +321 -0
- package/dist/graph/db.js.map +1 -0
- package/dist/graph/engine.d.ts +62 -0
- package/dist/graph/engine.d.ts.map +1 -0
- package/dist/graph/engine.js +246 -0
- package/dist/graph/engine.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +458 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/adapter.d.ts +10 -0
- package/dist/parser/adapter.d.ts.map +1 -0
- package/dist/parser/adapter.js +6 -0
- package/dist/parser/adapter.js.map +1 -0
- package/dist/parser/adapters/csharp.d.ts +24 -0
- package/dist/parser/adapters/csharp.d.ts.map +1 -0
- package/dist/parser/adapters/csharp.js +318 -0
- package/dist/parser/adapters/csharp.js.map +1 -0
- package/dist/parser/adapters/go.d.ts +21 -0
- package/dist/parser/adapters/go.d.ts.map +1 -0
- package/dist/parser/adapters/go.js +186 -0
- package/dist/parser/adapters/go.js.map +1 -0
- package/dist/parser/adapters/java.d.ts +22 -0
- package/dist/parser/adapters/java.d.ts.map +1 -0
- package/dist/parser/adapters/java.js +235 -0
- package/dist/parser/adapters/java.js.map +1 -0
- package/dist/parser/adapters/python.d.ts +19 -0
- package/dist/parser/adapters/python.d.ts.map +1 -0
- package/dist/parser/adapters/python.js +201 -0
- package/dist/parser/adapters/python.js.map +1 -0
- package/dist/parser/adapters/typescript.d.ts +24 -0
- package/dist/parser/adapters/typescript.d.ts.map +1 -0
- package/dist/parser/adapters/typescript.js +349 -0
- package/dist/parser/adapters/typescript.js.map +1 -0
- package/dist/parser/index.d.ts +42 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +191 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/tree-sitter-engine.d.ts +25 -0
- package/dist/parser/tree-sitter-engine.d.ts.map +1 -0
- package/dist/parser/tree-sitter-engine.js +107 -0
- package/dist/parser/tree-sitter-engine.js.map +1 -0
- package/dist/parser/utils.d.ts +19 -0
- package/dist/parser/utils.d.ts.map +1 -0
- package/dist/parser/utils.js +111 -0
- package/dist/parser/utils.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher/index.d.ts +36 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +139 -0
- package/dist/watcher/index.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TypeScript & JavaScript language adapter.
|
|
4
|
+
*
|
|
5
|
+
* Extracts:
|
|
6
|
+
* - import / require statements → imports edges
|
|
7
|
+
* - export declarations → exports edges
|
|
8
|
+
* - class / interface definitions → class / interface nodes + inherits / implements edges
|
|
9
|
+
* - function / method definitions → function / method nodes
|
|
10
|
+
* - function call expressions → calls edges
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.TypeScriptAdapter = void 0;
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const tree_sitter_engine_js_1 = require("../tree-sitter-engine.js");
|
|
49
|
+
const utils_js_1 = require("../utils.js");
|
|
50
|
+
// ─── Tree-sitter queries ──────────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Queries written in tree-sitter query syntax (S-expression patterns).
|
|
53
|
+
* We use broad patterns that work for both JS and TS.
|
|
54
|
+
*/
|
|
55
|
+
// Import statements: import ... from '...' / import('...')
|
|
56
|
+
const IMPORT_QUERY = `
|
|
57
|
+
[
|
|
58
|
+
(import_statement source: (string) @import_path)
|
|
59
|
+
(call_expression
|
|
60
|
+
function: (identifier) @require_fn (#eq? @require_fn "require")
|
|
61
|
+
arguments: (arguments (string) @import_path))
|
|
62
|
+
(import_statement source: (string) @import_path)
|
|
63
|
+
]
|
|
64
|
+
`;
|
|
65
|
+
// Export declarations (to mark public API) — kept for future use
|
|
66
|
+
// const EXPORT_QUERY = `...
|
|
67
|
+
// Class declarations
|
|
68
|
+
const CLASS_QUERY = `
|
|
69
|
+
(class_declaration
|
|
70
|
+
name: (type_identifier) @class_name
|
|
71
|
+
(class_heritage
|
|
72
|
+
(extends_clause value: (_) @extends_name) ?
|
|
73
|
+
(implements_clause (type_identifier) @implements_name) *
|
|
74
|
+
) ?
|
|
75
|
+
) @class_decl
|
|
76
|
+
`;
|
|
77
|
+
// Interface declarations (TypeScript)
|
|
78
|
+
const INTERFACE_QUERY = `
|
|
79
|
+
(interface_declaration
|
|
80
|
+
name: (type_identifier) @interface_name
|
|
81
|
+
(extends_type_clause (type_identifier) @extends_name) ?
|
|
82
|
+
) @interface_decl
|
|
83
|
+
`;
|
|
84
|
+
// Function / method declarations
|
|
85
|
+
const FUNCTION_QUERY = `
|
|
86
|
+
[
|
|
87
|
+
(function_declaration name: (identifier) @fn_name) @fn_decl
|
|
88
|
+
(method_definition key: (property_identifier) @fn_name) @fn_decl
|
|
89
|
+
(arrow_function) @fn_decl
|
|
90
|
+
(variable_declarator
|
|
91
|
+
name: (identifier) @fn_name
|
|
92
|
+
value: (arrow_function)) @fn_decl
|
|
93
|
+
(lexical_declaration
|
|
94
|
+
(variable_declarator
|
|
95
|
+
name: (identifier) @fn_name
|
|
96
|
+
value: (arrow_function))) @fn_decl
|
|
97
|
+
]
|
|
98
|
+
`;
|
|
99
|
+
// Call expressions — kept for future use
|
|
100
|
+
// const CALL_QUERY = `...
|
|
101
|
+
// ─── TypeScriptAdapter ────────────────────────────────────────────────────────
|
|
102
|
+
class TypeScriptAdapter {
|
|
103
|
+
language;
|
|
104
|
+
constructor(lang = 'typescript') {
|
|
105
|
+
this.language = lang;
|
|
106
|
+
}
|
|
107
|
+
async parse(filePath, source) {
|
|
108
|
+
const tree = await tree_sitter_engine_js_1.treeSitterEngine.parse(source, this.language);
|
|
109
|
+
const langObj = await tree_sitter_engine_js_1.treeSitterEngine.loadLanguage(this.language);
|
|
110
|
+
const nodes = [];
|
|
111
|
+
const edges = [];
|
|
112
|
+
// File node (always created)
|
|
113
|
+
const fileNodeId = (0, utils_js_1.makeNodeId)('file', filePath);
|
|
114
|
+
nodes.push({
|
|
115
|
+
id: fileNodeId,
|
|
116
|
+
kind: 'file',
|
|
117
|
+
name: (0, utils_js_1.fileDisplayName)(filePath),
|
|
118
|
+
filePath,
|
|
119
|
+
description: `Source file: ${path.basename(filePath)}`,
|
|
120
|
+
isExternal: false,
|
|
121
|
+
language: this.language,
|
|
122
|
+
meta: '{}',
|
|
123
|
+
});
|
|
124
|
+
// ── Imports ──────────────────────────────────────────────────────────────
|
|
125
|
+
this.extractImports(tree, langObj, filePath, fileNodeId, nodes, edges);
|
|
126
|
+
// ── Classes ──────────────────────────────────────────────────────────────
|
|
127
|
+
this.extractClasses(tree, langObj, filePath, fileNodeId, nodes, edges, source);
|
|
128
|
+
// ── Interfaces ───────────────────────────────────────────────────────────
|
|
129
|
+
this.extractInterfaces(tree, langObj, filePath, fileNodeId, nodes, edges);
|
|
130
|
+
// ── Functions ────────────────────────────────────────────────────────────
|
|
131
|
+
this.extractFunctions(tree, langObj, filePath, fileNodeId, nodes, edges, source);
|
|
132
|
+
return { filePath, language: this.language, nodes, edges };
|
|
133
|
+
}
|
|
134
|
+
// ─── Private extraction helpers ────────────────────────────────────────────
|
|
135
|
+
extractImports(tree, lang, filePath, fileNodeId, nodes, edges) {
|
|
136
|
+
try {
|
|
137
|
+
const q = lang.query(IMPORT_QUERY);
|
|
138
|
+
const captures = q.captures(tree.rootNode);
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
for (const { name, node } of captures) {
|
|
141
|
+
if (name !== 'import_path')
|
|
142
|
+
continue;
|
|
143
|
+
// Strip surrounding quotes
|
|
144
|
+
const rawPath = node.text.replace(/^['"`]|['"`]$/g, '');
|
|
145
|
+
if (seen.has(rawPath))
|
|
146
|
+
continue;
|
|
147
|
+
seen.add(rawPath);
|
|
148
|
+
const isExternal = !rawPath.startsWith('.');
|
|
149
|
+
const targetNodeId = isExternal
|
|
150
|
+
? (0, utils_js_1.makeNodeId)('external_dep', rawPath)
|
|
151
|
+
: (0, utils_js_1.makeNodeId)('file', this.resolveTs(filePath, rawPath));
|
|
152
|
+
// Ensure the external dep node exists
|
|
153
|
+
if (isExternal) {
|
|
154
|
+
const pkgName = rawPath.split('/')[0];
|
|
155
|
+
const extId = (0, utils_js_1.makeNodeId)('external_dep', pkgName);
|
|
156
|
+
if (!nodes.find((n) => n.id === extId)) {
|
|
157
|
+
nodes.push({
|
|
158
|
+
id: extId,
|
|
159
|
+
kind: 'external_dep',
|
|
160
|
+
name: pkgName,
|
|
161
|
+
filePath: pkgName,
|
|
162
|
+
description: `External dependency: ${pkgName}`,
|
|
163
|
+
isExternal: true,
|
|
164
|
+
language: null,
|
|
165
|
+
meta: '{}',
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
edges.push({
|
|
169
|
+
id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'imports', extId),
|
|
170
|
+
fromId: fileNodeId,
|
|
171
|
+
toId: extId,
|
|
172
|
+
kind: 'imports',
|
|
173
|
+
reason: `imports ${rawPath}`,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
edges.push({
|
|
178
|
+
id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'imports', targetNodeId),
|
|
179
|
+
fromId: fileNodeId,
|
|
180
|
+
toId: targetNodeId,
|
|
181
|
+
kind: 'imports',
|
|
182
|
+
reason: `imports ${rawPath}`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Query may fail on malformed source — gracefully skip
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
extractClasses(tree, lang, filePath, fileNodeId, nodes, edges, source) {
|
|
192
|
+
try {
|
|
193
|
+
const q = lang.query(CLASS_QUERY);
|
|
194
|
+
const matches = q.matches(tree.rootNode);
|
|
195
|
+
for (const match of matches) {
|
|
196
|
+
const classNameCapture = match.captures.find((c) => c.name === 'class_name');
|
|
197
|
+
if (!classNameCapture)
|
|
198
|
+
continue;
|
|
199
|
+
const className = classNameCapture.node.text;
|
|
200
|
+
const classNodeId = (0, utils_js_1.makeNodeId)('class', filePath, className);
|
|
201
|
+
// Get surrounding comment as description
|
|
202
|
+
const classDecl = match.captures.find((c) => c.name === 'class_decl');
|
|
203
|
+
const snippet = classDecl
|
|
204
|
+
? (0, utils_js_1.truncate)(source.slice(classDecl.node.startIndex, classDecl.node.startIndex + 120))
|
|
205
|
+
: '';
|
|
206
|
+
nodes.push({
|
|
207
|
+
id: classNodeId,
|
|
208
|
+
kind: 'class',
|
|
209
|
+
name: className,
|
|
210
|
+
filePath,
|
|
211
|
+
description: `Class ${className}. ${snippet}`,
|
|
212
|
+
isExternal: false,
|
|
213
|
+
language: this.language,
|
|
214
|
+
meta: JSON.stringify({ visibility: 'public' }),
|
|
215
|
+
});
|
|
216
|
+
// File exports the class
|
|
217
|
+
edges.push({
|
|
218
|
+
id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'exports', classNodeId),
|
|
219
|
+
fromId: fileNodeId,
|
|
220
|
+
toId: classNodeId,
|
|
221
|
+
kind: 'exports',
|
|
222
|
+
reason: `defines class ${className}`,
|
|
223
|
+
});
|
|
224
|
+
// Extends
|
|
225
|
+
const extendsCapture = match.captures.find((c) => c.name === 'extends_name');
|
|
226
|
+
if (extendsCapture) {
|
|
227
|
+
const parentName = extendsCapture.node.text;
|
|
228
|
+
const parentId = (0, utils_js_1.makeNodeId)('class', filePath, parentName);
|
|
229
|
+
edges.push({
|
|
230
|
+
id: (0, utils_js_1.makeEdgeId)(classNodeId, 'inherits', parentId),
|
|
231
|
+
fromId: classNodeId,
|
|
232
|
+
toId: parentId,
|
|
233
|
+
kind: 'inherits',
|
|
234
|
+
reason: `extends ${parentName}`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// Implements
|
|
238
|
+
for (const cap of match.captures.filter((c) => c.name === 'implements_name')) {
|
|
239
|
+
const ifaceName = cap.node.text;
|
|
240
|
+
const ifaceId = (0, utils_js_1.makeNodeId)('interface', filePath, ifaceName);
|
|
241
|
+
edges.push({
|
|
242
|
+
id: (0, utils_js_1.makeEdgeId)(classNodeId, 'implements', ifaceId),
|
|
243
|
+
fromId: classNodeId,
|
|
244
|
+
toId: ifaceId,
|
|
245
|
+
kind: 'implements',
|
|
246
|
+
reason: `implements ${ifaceName}`,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Skip on query error
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
extractInterfaces(tree, lang, filePath, fileNodeId, nodes, edges) {
|
|
256
|
+
try {
|
|
257
|
+
const q = lang.query(INTERFACE_QUERY);
|
|
258
|
+
const matches = q.matches(tree.rootNode);
|
|
259
|
+
for (const match of matches) {
|
|
260
|
+
const nameCap = match.captures.find((c) => c.name === 'interface_name');
|
|
261
|
+
if (!nameCap)
|
|
262
|
+
continue;
|
|
263
|
+
const ifaceName = nameCap.node.text;
|
|
264
|
+
const ifaceId = (0, utils_js_1.makeNodeId)('interface', filePath, ifaceName);
|
|
265
|
+
nodes.push({
|
|
266
|
+
id: ifaceId,
|
|
267
|
+
kind: 'interface',
|
|
268
|
+
name: ifaceName,
|
|
269
|
+
filePath,
|
|
270
|
+
description: `Interface ${ifaceName}`,
|
|
271
|
+
isExternal: false,
|
|
272
|
+
language: this.language,
|
|
273
|
+
meta: '{}',
|
|
274
|
+
});
|
|
275
|
+
edges.push({
|
|
276
|
+
id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'exports', ifaceId),
|
|
277
|
+
fromId: fileNodeId,
|
|
278
|
+
toId: ifaceId,
|
|
279
|
+
kind: 'exports',
|
|
280
|
+
reason: `defines interface ${ifaceName}`,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
// Skip on query error
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
extractFunctions(tree, lang, filePath, fileNodeId, nodes, edges, _source) {
|
|
289
|
+
try {
|
|
290
|
+
const q = lang.query(FUNCTION_QUERY);
|
|
291
|
+
const captures = q.captures(tree.rootNode);
|
|
292
|
+
const seen = new Set();
|
|
293
|
+
for (const { name, node } of captures) {
|
|
294
|
+
if (name !== 'fn_name')
|
|
295
|
+
continue;
|
|
296
|
+
const fnName = node.text;
|
|
297
|
+
if (seen.has(fnName) || fnName.length === 0)
|
|
298
|
+
continue;
|
|
299
|
+
seen.add(fnName);
|
|
300
|
+
const fnId = (0, utils_js_1.makeNodeId)('function', filePath, fnName);
|
|
301
|
+
nodes.push({
|
|
302
|
+
id: fnId,
|
|
303
|
+
kind: 'function',
|
|
304
|
+
name: fnName,
|
|
305
|
+
filePath,
|
|
306
|
+
description: `Function ${fnName} in ${path.basename(filePath)}`,
|
|
307
|
+
isExternal: false,
|
|
308
|
+
language: this.language,
|
|
309
|
+
meta: '{}',
|
|
310
|
+
});
|
|
311
|
+
edges.push({
|
|
312
|
+
id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'exports', fnId),
|
|
313
|
+
fromId: fileNodeId,
|
|
314
|
+
toId: fnId,
|
|
315
|
+
kind: 'exports',
|
|
316
|
+
reason: `defines function ${fnName}`,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// Skip on query error
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/** Resolve a relative TS/JS import path to an absolute path */
|
|
325
|
+
resolveTs(fromFile, importPath) {
|
|
326
|
+
const dir = path.dirname(fromFile);
|
|
327
|
+
// TypeScript source files import with .js/.jsx/.mjs/.cjs extensions at runtime
|
|
328
|
+
// (e.g. import from '../graph/db.js') but the actual source is .ts/.tsx.
|
|
329
|
+
// Strip those extensions before resolution so we find the real .ts file.
|
|
330
|
+
const stripped = importPath.replace(/\.(m?jsx?|cjs)$/, '');
|
|
331
|
+
const resolved = path.resolve(dir, stripped);
|
|
332
|
+
// Try source extensions first (prefer .ts over .js for the same base name)
|
|
333
|
+
const extensions = ['.ts', '.tsx', '.js', '.jsx'];
|
|
334
|
+
for (const ext of extensions) {
|
|
335
|
+
if (require('fs').existsSync(resolved + ext))
|
|
336
|
+
return resolved + ext;
|
|
337
|
+
}
|
|
338
|
+
// Try index file
|
|
339
|
+
for (const ext of extensions) {
|
|
340
|
+
const idx = path.join(resolved, `index${ext}`);
|
|
341
|
+
if (require('fs').existsSync(idx))
|
|
342
|
+
return idx;
|
|
343
|
+
}
|
|
344
|
+
// Return the stripped path (without phantom extension) as fallback
|
|
345
|
+
return resolved;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.TypeScriptAdapter = TypeScriptAdapter;
|
|
349
|
+
//# sourceMappingURL=typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/parser/adapters/typescript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main parser orchestrator.
|
|
3
|
+
* Dispatches files to the correct language adapter, handles incremental
|
|
4
|
+
* updates (skip unchanged files), and writes results to the graph DB.
|
|
5
|
+
*/
|
|
6
|
+
import type { GraphDb } from '../graph/db.js';
|
|
7
|
+
export interface ParseResult {
|
|
8
|
+
parsed: number;
|
|
9
|
+
skipped: number;
|
|
10
|
+
errors: Array<{
|
|
11
|
+
filePath: string;
|
|
12
|
+
error: string;
|
|
13
|
+
}>;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class Parser {
|
|
17
|
+
private readonly db;
|
|
18
|
+
private readonly projectRoot;
|
|
19
|
+
constructor(db: GraphDb, projectRoot: string);
|
|
20
|
+
/**
|
|
21
|
+
* Full scan: traverse all source files under projectRoot and parse them.
|
|
22
|
+
* Respects incremental hashing — skips files that haven't changed.
|
|
23
|
+
*/
|
|
24
|
+
scanAll(force?: boolean): Promise<ParseResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Parse a specific list of files (used by the watcher for incremental updates).
|
|
27
|
+
*/
|
|
28
|
+
parseFiles(filePaths: string[], force?: boolean, _startTime?: number): Promise<ParseResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Parse a single file.
|
|
31
|
+
* Returns 'skipped' if the file hasn't changed since last parse.
|
|
32
|
+
* Returns 'parsed' if the file was (re)parsed.
|
|
33
|
+
*/
|
|
34
|
+
parseFile(filePath: string, force?: boolean): Promise<'parsed' | 'skipped'>;
|
|
35
|
+
/**
|
|
36
|
+
* Remove a file from the graph (called when file is deleted).
|
|
37
|
+
*/
|
|
38
|
+
removeFile(filePath: string): void;
|
|
39
|
+
/** Discover all parseable source files under projectRoot */
|
|
40
|
+
private discoverFiles;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAuC9C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,EAAE,EAAE,OAAO,EACX,WAAW,EAAE,MAAM;IAGtC;;;OAGG;IACG,OAAO,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IAMlD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,UAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB/F;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAwD/E;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOlC,4DAA4D;YAC9C,aAAa;CAa5B"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main parser orchestrator.
|
|
4
|
+
* Dispatches files to the correct language adapter, handles incremental
|
|
5
|
+
* updates (skip unchanged files), and writes results to the graph DB.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.Parser = void 0;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const glob_1 = require("glob");
|
|
44
|
+
const typescript_js_1 = require("./adapters/typescript.js");
|
|
45
|
+
const csharp_js_1 = require("./adapters/csharp.js");
|
|
46
|
+
const python_js_1 = require("./adapters/python.js");
|
|
47
|
+
const go_js_1 = require("./adapters/go.js");
|
|
48
|
+
const java_js_1 = require("./adapters/java.js");
|
|
49
|
+
const utils_js_1 = require("./utils.js");
|
|
50
|
+
// ─── Adapter registry ─────────────────────────────────────────────────────────
|
|
51
|
+
const ADAPTERS = {
|
|
52
|
+
typescript: new typescript_js_1.TypeScriptAdapter('typescript'),
|
|
53
|
+
javascript: new typescript_js_1.TypeScriptAdapter('javascript'),
|
|
54
|
+
csharp: new csharp_js_1.CSharpAdapter(),
|
|
55
|
+
python: new python_js_1.PythonAdapter(),
|
|
56
|
+
go: new go_js_1.GoAdapter(),
|
|
57
|
+
java: new java_js_1.JavaAdapter(),
|
|
58
|
+
};
|
|
59
|
+
/** Default glob patterns to ignore */
|
|
60
|
+
const DEFAULT_IGNORES = [
|
|
61
|
+
'**/node_modules/**',
|
|
62
|
+
'**/dist/**',
|
|
63
|
+
'**/build/**',
|
|
64
|
+
'**/bin/**',
|
|
65
|
+
'**/obj/**',
|
|
66
|
+
'**/.git/**',
|
|
67
|
+
'**/.cgb/**',
|
|
68
|
+
'**/vendor/**',
|
|
69
|
+
'**/__pycache__/**',
|
|
70
|
+
'**/coverage/**',
|
|
71
|
+
'**/*.min.js',
|
|
72
|
+
'**/*.d.ts',
|
|
73
|
+
];
|
|
74
|
+
// ─── Parser orchestrator ──────────────────────────────────────────────────────
|
|
75
|
+
class Parser {
|
|
76
|
+
db;
|
|
77
|
+
projectRoot;
|
|
78
|
+
constructor(db, projectRoot) {
|
|
79
|
+
this.db = db;
|
|
80
|
+
this.projectRoot = projectRoot;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Full scan: traverse all source files under projectRoot and parse them.
|
|
84
|
+
* Respects incremental hashing — skips files that haven't changed.
|
|
85
|
+
*/
|
|
86
|
+
async scanAll(force = false) {
|
|
87
|
+
const start = Date.now();
|
|
88
|
+
const files = await this.discoverFiles();
|
|
89
|
+
return this.parseFiles(files, force, start);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Parse a specific list of files (used by the watcher for incremental updates).
|
|
93
|
+
*/
|
|
94
|
+
async parseFiles(filePaths, force = false, _startTime) {
|
|
95
|
+
const start = _startTime ?? Date.now();
|
|
96
|
+
let parsed = 0;
|
|
97
|
+
let skipped = 0;
|
|
98
|
+
const errors = [];
|
|
99
|
+
for (const filePath of filePaths) {
|
|
100
|
+
try {
|
|
101
|
+
const result = await this.parseFile(filePath, force);
|
|
102
|
+
if (result === 'skipped')
|
|
103
|
+
skipped++;
|
|
104
|
+
else
|
|
105
|
+
parsed++;
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
errors.push({
|
|
109
|
+
filePath,
|
|
110
|
+
error: err instanceof Error ? err.message : String(err),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.db.persist();
|
|
115
|
+
return { parsed, skipped, errors, durationMs: Date.now() - start };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse a single file.
|
|
119
|
+
* Returns 'skipped' if the file hasn't changed since last parse.
|
|
120
|
+
* Returns 'parsed' if the file was (re)parsed.
|
|
121
|
+
*/
|
|
122
|
+
async parseFile(filePath, force = false) {
|
|
123
|
+
const lang = (0, utils_js_1.detectLanguage)(filePath);
|
|
124
|
+
if (!lang)
|
|
125
|
+
return 'skipped'; // unsupported file type
|
|
126
|
+
if (!fs.existsSync(filePath)) {
|
|
127
|
+
// File was deleted — remove from graph
|
|
128
|
+
this.db.deleteFile(filePath);
|
|
129
|
+
return 'parsed';
|
|
130
|
+
}
|
|
131
|
+
// Skip directories that happen to match a source extension (e.g. `countup.js/`)
|
|
132
|
+
const stat = fs.statSync(filePath);
|
|
133
|
+
if (!stat.isFile())
|
|
134
|
+
return 'skipped';
|
|
135
|
+
const source = fs.readFileSync(filePath, 'utf-8');
|
|
136
|
+
const contentHash = (0, utils_js_1.hashContent)(source);
|
|
137
|
+
if (!force) {
|
|
138
|
+
const existing = this.db.getFile(filePath);
|
|
139
|
+
if (existing && existing.contentHash === contentHash) {
|
|
140
|
+
return 'skipped';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const adapter = ADAPTERS[lang];
|
|
144
|
+
const parsed = await adapter.parse(filePath, source);
|
|
145
|
+
// Remove stale graph data for this file
|
|
146
|
+
this.db.deleteFile(filePath);
|
|
147
|
+
// Write new nodes
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
for (const node of parsed.nodes) {
|
|
150
|
+
this.db.upsertNode({ ...node, updatedAt: now });
|
|
151
|
+
}
|
|
152
|
+
// Write new edges (only if both endpoints exist or will be created)
|
|
153
|
+
for (const edge of parsed.edges) {
|
|
154
|
+
// Allow edges to unresolved nodes (they'll be created when that file is parsed)
|
|
155
|
+
this.db.upsertEdge({ ...edge, updatedAt: now });
|
|
156
|
+
}
|
|
157
|
+
const stats = fs.statSync(filePath);
|
|
158
|
+
this.db.upsertFile({
|
|
159
|
+
filePath,
|
|
160
|
+
language: lang,
|
|
161
|
+
contentHash,
|
|
162
|
+
mtime: stats.mtimeMs,
|
|
163
|
+
nodeCount: parsed.nodes.length,
|
|
164
|
+
edgeCount: parsed.edges.length,
|
|
165
|
+
parsedAt: now,
|
|
166
|
+
});
|
|
167
|
+
return 'parsed';
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Remove a file from the graph (called when file is deleted).
|
|
171
|
+
*/
|
|
172
|
+
removeFile(filePath) {
|
|
173
|
+
this.db.deleteFile(filePath);
|
|
174
|
+
this.db.persist();
|
|
175
|
+
}
|
|
176
|
+
// ─── Private helpers ───────────────────────────────────────────────────────
|
|
177
|
+
/** Discover all parseable source files under projectRoot */
|
|
178
|
+
async discoverFiles() {
|
|
179
|
+
const extensions = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cs', 'py', 'go', 'java'];
|
|
180
|
+
const pattern = `**/*.{${extensions.join(',')}}`;
|
|
181
|
+
const files = await (0, glob_1.glob)(pattern, {
|
|
182
|
+
cwd: this.projectRoot,
|
|
183
|
+
ignore: DEFAULT_IGNORES,
|
|
184
|
+
absolute: true,
|
|
185
|
+
nodir: true, // never return directories that match the extension pattern
|
|
186
|
+
});
|
|
187
|
+
return files;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.Parser = Parser;
|
|
191
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-sitter WASM engine orchestrator.
|
|
3
|
+
* Initialises web-tree-sitter, loads language grammars on demand,
|
|
4
|
+
* and provides a unified parse() method that returns a Tree for any
|
|
5
|
+
* supported language.
|
|
6
|
+
*/
|
|
7
|
+
import Parser from 'web-tree-sitter';
|
|
8
|
+
import type { SupportedLanguage } from '../types.js';
|
|
9
|
+
export declare class TreeSitterEngine {
|
|
10
|
+
private parser;
|
|
11
|
+
private languageCache;
|
|
12
|
+
private initialised;
|
|
13
|
+
init(): Promise<void>;
|
|
14
|
+
/** Parse source text in the given language and return a tree-sitter Tree */
|
|
15
|
+
parse(source: string, language: SupportedLanguage): Promise<Parser.Tree>;
|
|
16
|
+
/** Return the tree-sitter Language object (cached) */
|
|
17
|
+
loadLanguage(language: SupportedLanguage): Promise<Parser.Language>;
|
|
18
|
+
/** Run a tree-sitter query against a tree and collect all matches */
|
|
19
|
+
query(tree: Parser.Tree, language: Parser.Language, queryString: string): Parser.QueryMatch[];
|
|
20
|
+
/** Collect all captures from a query */
|
|
21
|
+
captures(tree: Parser.Tree, language: Parser.Language, queryString: string): Parser.QueryCapture[];
|
|
22
|
+
}
|
|
23
|
+
/** Singleton engine instance shared across adapters */
|
|
24
|
+
export declare const treeSitterEngine: TreeSitterEngine;
|
|
25
|
+
//# sourceMappingURL=tree-sitter-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-sitter-engine.d.ts","sourceRoot":"","sources":["../../src/parser/tree-sitter-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAiBrD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,4EAA4E;IACtE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAO9E,sDAAsD;IAChD,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAczE,qEAAqE;IACrE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE;IAK7F,wCAAwC;IACxC,QAAQ,CACN,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,YAAY,EAAE;CAIzB;AAED,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
|