@monoes/graph 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.
Files changed (82) hide show
  1. package/dist/src/analyze.d.ts +23 -0
  2. package/dist/src/analyze.d.ts.map +1 -0
  3. package/dist/src/analyze.js +105 -0
  4. package/dist/src/analyze.js.map +1 -0
  5. package/dist/src/build.d.ts +8 -0
  6. package/dist/src/build.d.ts.map +1 -0
  7. package/dist/src/build.js +59 -0
  8. package/dist/src/build.js.map +1 -0
  9. package/dist/src/cache.d.ts +10 -0
  10. package/dist/src/cache.d.ts.map +1 -0
  11. package/dist/src/cache.js +34 -0
  12. package/dist/src/cache.js.map +1 -0
  13. package/dist/src/cluster.d.ts +8 -0
  14. package/dist/src/cluster.d.ts.map +1 -0
  15. package/dist/src/cluster.js +50 -0
  16. package/dist/src/cluster.js.map +1 -0
  17. package/dist/src/detect.d.ts +8 -0
  18. package/dist/src/detect.d.ts.map +1 -0
  19. package/dist/src/detect.js +108 -0
  20. package/dist/src/detect.js.map +1 -0
  21. package/dist/src/export.d.ts +21 -0
  22. package/dist/src/export.d.ts.map +1 -0
  23. package/dist/src/export.js +68 -0
  24. package/dist/src/export.js.map +1 -0
  25. package/dist/src/extract/index.d.ts +20 -0
  26. package/dist/src/extract/index.d.ts.map +1 -0
  27. package/dist/src/extract/index.js +158 -0
  28. package/dist/src/extract/index.js.map +1 -0
  29. package/dist/src/extract/languages/go.d.ts +3 -0
  30. package/dist/src/extract/languages/go.d.ts.map +1 -0
  31. package/dist/src/extract/languages/go.js +181 -0
  32. package/dist/src/extract/languages/go.js.map +1 -0
  33. package/dist/src/extract/languages/python.d.ts +3 -0
  34. package/dist/src/extract/languages/python.d.ts.map +1 -0
  35. package/dist/src/extract/languages/python.js +230 -0
  36. package/dist/src/extract/languages/python.js.map +1 -0
  37. package/dist/src/extract/languages/rust.d.ts +3 -0
  38. package/dist/src/extract/languages/rust.d.ts.map +1 -0
  39. package/dist/src/extract/languages/rust.js +195 -0
  40. package/dist/src/extract/languages/rust.js.map +1 -0
  41. package/dist/src/extract/languages/typescript.d.ts +3 -0
  42. package/dist/src/extract/languages/typescript.d.ts.map +1 -0
  43. package/dist/src/extract/languages/typescript.js +295 -0
  44. package/dist/src/extract/languages/typescript.js.map +1 -0
  45. package/dist/src/extract/tree-sitter-runner.d.ts +48 -0
  46. package/dist/src/extract/tree-sitter-runner.d.ts.map +1 -0
  47. package/dist/src/extract/tree-sitter-runner.js +128 -0
  48. package/dist/src/extract/tree-sitter-runner.js.map +1 -0
  49. package/dist/src/extract/types.d.ts +7 -0
  50. package/dist/src/extract/types.d.ts.map +1 -0
  51. package/dist/src/extract/types.js +2 -0
  52. package/dist/src/extract/types.js.map +1 -0
  53. package/dist/src/index.d.ts +11 -0
  54. package/dist/src/index.d.ts.map +1 -0
  55. package/dist/src/index.js +9 -0
  56. package/dist/src/index.js.map +1 -0
  57. package/dist/src/pipeline.d.ts +16 -0
  58. package/dist/src/pipeline.d.ts.map +1 -0
  59. package/dist/src/pipeline.js +143 -0
  60. package/dist/src/pipeline.js.map +1 -0
  61. package/dist/src/types.d.ts +99 -0
  62. package/dist/src/types.d.ts.map +1 -0
  63. package/dist/src/types.js +2 -0
  64. package/dist/src/types.js.map +1 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -0
  66. package/package.json +44 -0
  67. package/src/analyze.ts +122 -0
  68. package/src/build.ts +62 -0
  69. package/src/cache.ts +38 -0
  70. package/src/cluster.ts +54 -0
  71. package/src/detect.ts +123 -0
  72. package/src/export.ts +78 -0
  73. package/src/extract/index.ts +190 -0
  74. package/src/extract/languages/go.ts +206 -0
  75. package/src/extract/languages/python.ts +270 -0
  76. package/src/extract/languages/rust.ts +230 -0
  77. package/src/extract/languages/typescript.ts +344 -0
  78. package/src/extract/tree-sitter-runner.ts +165 -0
  79. package/src/extract/types.ts +7 -0
  80. package/src/index.ts +10 -0
  81. package/src/pipeline.ts +166 -0
  82. package/src/types.ts +116 -0
@@ -0,0 +1,195 @@
1
+ import { basename } from 'path';
2
+ import { tryLoadParser, walk, } from '../tree-sitter-runner.js';
3
+ // ---- helpers ----
4
+ function nodeName(node) {
5
+ const nameNode = node.childForFieldName('name');
6
+ return nameNode?.text ?? '';
7
+ }
8
+ function loc(node) {
9
+ return `L${node.startPosition.row + 1}`;
10
+ }
11
+ // ---- tree-sitter extraction ----
12
+ function extractWithTreeSitter(filePath, content) {
13
+ const nodes = [];
14
+ const edges = [];
15
+ const errors = [];
16
+ const parser = tryLoadParser('rust');
17
+ if (!parser) {
18
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
19
+ }
20
+ let tree;
21
+ try {
22
+ tree = parser.parse(content);
23
+ }
24
+ catch (err) {
25
+ errors.push(`tree-sitter parse error in ${filePath}: ${String(err)}`);
26
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
27
+ }
28
+ walk(tree.rootNode, (n) => {
29
+ // ---- functions ----
30
+ if (n.type === 'function_item') {
31
+ const name = nodeName(n);
32
+ if (name) {
33
+ nodes.push({
34
+ id: name,
35
+ label: name,
36
+ fileType: 'code',
37
+ sourceFile: filePath,
38
+ sourceLocation: loc(n),
39
+ nodeKind: 'function',
40
+ });
41
+ }
42
+ return;
43
+ }
44
+ // ---- structs ----
45
+ if (n.type === 'struct_item') {
46
+ const name = nodeName(n);
47
+ if (name) {
48
+ nodes.push({
49
+ id: name,
50
+ label: name,
51
+ fileType: 'code',
52
+ sourceFile: filePath,
53
+ sourceLocation: loc(n),
54
+ nodeKind: 'struct',
55
+ });
56
+ }
57
+ return;
58
+ }
59
+ // ---- traits ----
60
+ if (n.type === 'trait_item') {
61
+ const name = nodeName(n);
62
+ if (name) {
63
+ nodes.push({
64
+ id: name,
65
+ label: name,
66
+ fileType: 'code',
67
+ sourceFile: filePath,
68
+ sourceLocation: loc(n),
69
+ nodeKind: 'trait',
70
+ });
71
+ }
72
+ return;
73
+ }
74
+ // ---- impl blocks ----
75
+ if (n.type === 'impl_item') {
76
+ const typeNode = n.childForFieldName('type');
77
+ const traitNode = n.childForFieldName('trait');
78
+ const typeName = typeNode?.text ?? '';
79
+ if (typeName) {
80
+ nodes.push({
81
+ id: typeName,
82
+ label: typeName,
83
+ fileType: 'code',
84
+ sourceFile: filePath,
85
+ sourceLocation: loc(n),
86
+ nodeKind: 'impl',
87
+ });
88
+ // impl Trait for Type
89
+ if (traitNode) {
90
+ edges.push({
91
+ source: typeName,
92
+ target: traitNode.text,
93
+ relation: 'implements',
94
+ confidence: 'EXTRACTED',
95
+ sourceFile: filePath,
96
+ sourceLocation: loc(n),
97
+ });
98
+ }
99
+ }
100
+ return;
101
+ }
102
+ // ---- modules ----
103
+ if (n.type === 'mod_item') {
104
+ const name = nodeName(n);
105
+ if (name) {
106
+ nodes.push({
107
+ id: name,
108
+ label: name,
109
+ fileType: 'code',
110
+ sourceFile: filePath,
111
+ sourceLocation: loc(n),
112
+ nodeKind: 'module',
113
+ });
114
+ }
115
+ return;
116
+ }
117
+ // ---- use declarations ----
118
+ if (n.type === 'use_declaration') {
119
+ const argNode = n.childForFieldName('argument');
120
+ if (argNode) {
121
+ // Flatten the use path to a string (handles use a::b::c and use a::b::{c, d})
122
+ const usePath = argNode.text.replace(/\s+/g, '');
123
+ edges.push({
124
+ source: basename(filePath),
125
+ target: usePath,
126
+ relation: 'imports',
127
+ confidence: 'EXTRACTED',
128
+ sourceFile: filePath,
129
+ sourceLocation: loc(n),
130
+ });
131
+ }
132
+ }
133
+ });
134
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
135
+ }
136
+ // ---- regex fallback ----
137
+ function extractWithRegex(filePath, content) {
138
+ const nodes = [];
139
+ const edges = [];
140
+ const lines = content.split('\n');
141
+ lines.forEach((line, idx) => {
142
+ const location = `L${idx + 1}`;
143
+ const trimmed = line.trim();
144
+ // pub fn / fn
145
+ const fnMatch = trimmed.match(/^(?:pub\s+)?(?:async\s+)?fn\s+(\w+)/);
146
+ if (fnMatch) {
147
+ nodes.push({ id: fnMatch[1], label: fnMatch[1], fileType: 'code', sourceFile: filePath, sourceLocation: location, nodeKind: 'function' });
148
+ }
149
+ // pub struct / struct
150
+ const structMatch = trimmed.match(/^(?:pub\s+)?struct\s+(\w+)/);
151
+ if (structMatch) {
152
+ nodes.push({ id: structMatch[1], label: structMatch[1], fileType: 'code', sourceFile: filePath, sourceLocation: location, nodeKind: 'struct' });
153
+ }
154
+ // pub trait / trait
155
+ const traitMatch = trimmed.match(/^(?:pub\s+)?trait\s+(\w+)/);
156
+ if (traitMatch) {
157
+ nodes.push({ id: traitMatch[1], label: traitMatch[1], fileType: 'code', sourceFile: filePath, sourceLocation: location, nodeKind: 'trait' });
158
+ }
159
+ // impl Trait for Type
160
+ const implForMatch = trimmed.match(/^impl(?:<[^>]+>)?\s+(\w+)\s+for\s+(\w+)/);
161
+ if (implForMatch) {
162
+ edges.push({ source: implForMatch[2], target: implForMatch[1], relation: 'implements', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
163
+ nodes.push({ id: implForMatch[2], label: implForMatch[2], fileType: 'code', sourceFile: filePath, sourceLocation: location, nodeKind: 'impl' });
164
+ }
165
+ // plain impl Type
166
+ const implMatch = trimmed.match(/^impl(?:<[^>]+>)?\s+(\w+)\s*\{/);
167
+ if (implMatch && !implForMatch) {
168
+ nodes.push({ id: implMatch[1], label: implMatch[1], fileType: 'code', sourceFile: filePath, sourceLocation: location, nodeKind: 'impl' });
169
+ }
170
+ // use statements
171
+ const useMatch = trimmed.match(/^use\s+([^;]+)/);
172
+ if (useMatch) {
173
+ edges.push({ source: basename(filePath), target: useMatch[1].trim(), relation: 'imports', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
174
+ }
175
+ // mod declarations
176
+ const modMatch = trimmed.match(/^(?:pub\s+)?mod\s+(\w+)/);
177
+ if (modMatch) {
178
+ nodes.push({ id: modMatch[1], label: modMatch[1], fileType: 'code', sourceFile: filePath, sourceLocation: location, nodeKind: 'module' });
179
+ }
180
+ });
181
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors: [] };
182
+ }
183
+ // ---- extractor implementation ----
184
+ export const rustExtractor = {
185
+ language: 'rust',
186
+ extensions: ['.rs'],
187
+ extract(filePath, content) {
188
+ const tsResult = extractWithTreeSitter(filePath, content);
189
+ if (tsResult.nodes.length > 0 || tsResult.edges.length > 0 || tsResult.errors.length > 0) {
190
+ return tsResult;
191
+ }
192
+ return extractWithRegex(filePath, content);
193
+ },
194
+ };
195
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../../src/extract/languages/rust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,EACL,aAAa,EACb,IAAI,GAEL,MAAM,0BAA0B,CAAC;AAElC,oBAAoB;AAEpB,SAAS,QAAQ,CAAC,IAAoB;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,GAAG,CAAC,IAAoB;IAC/B,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,mCAAmC;AAEnC,SAAS,qBAAqB,CAAC,QAAgB,EAAE,OAAe;IAC9D,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC;IAED,IAAI,IAAkC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,8BAA8B,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACxB,sBAAsB;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtB,QAAQ,EAAE,UAAU;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtB,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtB,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;YAEtC,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,QAAQ;oBACZ,KAAK,EAAE,QAAQ;oBACf,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtB,QAAQ,EAAE,MAAM;iBACjB,CAAC,CAAC;gBAEH,sBAAsB;gBACtB,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC;wBACT,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,SAAS,CAAC,IAAI;wBACtB,QAAQ,EAAE,YAAY;wBACtB,UAAU,EAAE,WAAW;wBACvB,UAAU,EAAE,QAAQ;wBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtB,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,8EAA8E;gBAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;oBAC1B,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,SAAS;oBACnB,UAAU,EAAE,WAAW;oBACvB,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AACnE,CAAC;AAED,2BAA2B;AAE3B,SAAS,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IACzD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,cAAc;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrE,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5I,CAAC;QAED,sBAAsB;QACtB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChE,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClJ,CAAC;QAED,oBAAoB;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC9D,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/I,CAAC;QAED,sBAAsB;QACtB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC9E,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClK,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAClJ,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAClE,IAAI,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5I,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvK,CAAC;QAED,mBAAmB;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5I,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACvE,CAAC;AAED,qCAAqC;AAErC,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,CAAC,KAAK,CAAC;IAEnB,OAAO,CAAC,QAAgB,EAAE,OAAe;QACvC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzF,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LanguageExtractor } from '../types.js';
2
+ export declare const typescriptExtractor: LanguageExtractor;
3
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../../src/extract/languages/typescript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsUrD,eAAO,MAAM,mBAAmB,EAAE,iBAejC,CAAC"}
@@ -0,0 +1,295 @@
1
+ import { basename } from 'path';
2
+ import { tryLoadParser, walk, } from '../tree-sitter-runner.js';
3
+ // ---- helpers ----
4
+ function nodeName(node) {
5
+ // Most declaration nodes expose "name" as a named field
6
+ const nameNode = node.childForFieldName('name');
7
+ return nameNode?.text ?? '';
8
+ }
9
+ function loc(node) {
10
+ return `L${node.startPosition.row + 1}`;
11
+ }
12
+ // ---- tree-sitter extraction ----
13
+ const CLASS_TYPES = new Set([
14
+ 'class_declaration',
15
+ 'abstract_class_declaration',
16
+ ]);
17
+ const FUNCTION_TYPES = new Set([
18
+ 'function_declaration',
19
+ 'generator_function_declaration',
20
+ ]);
21
+ function extractWithTreeSitter(filePath, content, language) {
22
+ const nodes = [];
23
+ const edges = [];
24
+ const errors = [];
25
+ const parser = tryLoadParser(language);
26
+ if (!parser) {
27
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
28
+ }
29
+ let tree;
30
+ try {
31
+ tree = parser.parse(content);
32
+ }
33
+ catch (err) {
34
+ errors.push(`tree-sitter parse error in ${filePath}: ${String(err)}`);
35
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
36
+ }
37
+ // Track current class/method context for call-edge attribution
38
+ const classStack = [];
39
+ const methodStack = [];
40
+ const addNode = (name, n) => {
41
+ if (!name)
42
+ return;
43
+ nodes.push({
44
+ id: name,
45
+ label: name,
46
+ fileType: 'code',
47
+ sourceFile: filePath,
48
+ sourceLocation: loc(n),
49
+ });
50
+ };
51
+ walk(tree.rootNode, (n) => {
52
+ // ---- classes ----
53
+ if (CLASS_TYPES.has(n.type)) {
54
+ const name = nodeName(n);
55
+ addNode(name, n);
56
+ if (name)
57
+ classStack.push(name);
58
+ // heritage: extends / implements
59
+ for (const child of n.children) {
60
+ if (child.type === 'class_heritage') {
61
+ for (const clause of child.children) {
62
+ if (clause.type !== 'extends_clause' && clause.type !== 'implements_clause')
63
+ continue;
64
+ const relation = clause.type === 'extends_clause' ? 'extends' : 'implements';
65
+ // Each type_identifier inside the clause is a target
66
+ for (const target of clause.children) {
67
+ if (target.type === 'type_identifier' ||
68
+ target.type === 'identifier') {
69
+ edges.push({
70
+ source: name,
71
+ target: target.text,
72
+ relation,
73
+ confidence: 'EXTRACTED',
74
+ sourceFile: filePath,
75
+ sourceLocation: loc(clause),
76
+ });
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ return;
83
+ }
84
+ // ---- functions (top-level) ----
85
+ if (FUNCTION_TYPES.has(n.type)) {
86
+ const name = nodeName(n);
87
+ addNode(name, n);
88
+ if (name)
89
+ methodStack.push(name);
90
+ return;
91
+ }
92
+ // ---- method definitions (inside class body) ----
93
+ if (n.type === 'method_definition' || n.type === 'public_field_definition') {
94
+ const name = nodeName(n);
95
+ // Qualify name with class if available
96
+ const qualifiedName = classStack.length > 0 ? `${classStack[classStack.length - 1]}.${name}` : name;
97
+ addNode(qualifiedName, n);
98
+ if (qualifiedName)
99
+ methodStack.push(qualifiedName);
100
+ return;
101
+ }
102
+ // ---- interfaces ----
103
+ if (n.type === 'interface_declaration') {
104
+ const name = nodeName(n);
105
+ addNode(name, n);
106
+ // interface X extends Y
107
+ for (const child of n.children) {
108
+ if (child.type === 'extends_type_clause' || child.type === 'extends_clause') {
109
+ for (const target of child.children) {
110
+ if (target.type === 'type_identifier' || target.type === 'identifier') {
111
+ edges.push({
112
+ source: name,
113
+ target: target.text,
114
+ relation: 'extends',
115
+ confidence: 'EXTRACTED',
116
+ sourceFile: filePath,
117
+ sourceLocation: loc(child),
118
+ });
119
+ }
120
+ }
121
+ }
122
+ }
123
+ return;
124
+ }
125
+ // ---- type aliases ----
126
+ if (n.type === 'type_alias_declaration') {
127
+ const name = nodeName(n);
128
+ addNode(name, n);
129
+ return;
130
+ }
131
+ // ---- import statements ----
132
+ if (n.type === 'import_statement') {
133
+ // Extract the module specifier
134
+ const moduleSpecifier = n.childForFieldName('source');
135
+ const moduleText = moduleSpecifier
136
+ ? moduleSpecifier.text.replace(/^['"]|['"]$/g, '')
137
+ : '';
138
+ // Extract named specifiers: import { A, B } from '...'
139
+ for (const child of n.children) {
140
+ if (child.type === 'named_imports' || child.type === 'import_clause') {
141
+ for (const spec of child.children) {
142
+ if (spec.type === 'import_specifier') {
143
+ const importedName = spec.childForFieldName('name')?.text ?? spec.text;
144
+ if (importedName) {
145
+ edges.push({
146
+ source: filePath,
147
+ target: importedName,
148
+ relation: 'imports',
149
+ confidence: 'EXTRACTED',
150
+ sourceFile: filePath,
151
+ sourceLocation: loc(n),
152
+ });
153
+ }
154
+ }
155
+ }
156
+ }
157
+ // Default import: import X from '...'
158
+ if (child.type === 'import_clause') {
159
+ const defaultId = child.childForFieldName('name') ?? (child.children.find(c => c.type === 'identifier') ?? null);
160
+ if (defaultId) {
161
+ edges.push({
162
+ source: filePath,
163
+ target: defaultId.text,
164
+ relation: 'imports',
165
+ confidence: 'EXTRACTED',
166
+ sourceFile: filePath,
167
+ sourceLocation: loc(n),
168
+ });
169
+ }
170
+ }
171
+ }
172
+ // Always emit a file-level import edge to the module path
173
+ if (moduleText) {
174
+ edges.push({
175
+ source: basename(filePath),
176
+ target: moduleText,
177
+ relation: 'imports',
178
+ confidence: 'EXTRACTED',
179
+ sourceFile: filePath,
180
+ sourceLocation: loc(n),
181
+ });
182
+ }
183
+ return;
184
+ }
185
+ // ---- call expressions ----
186
+ if (n.type === 'call_expression') {
187
+ const fnNode = n.childForFieldName('function');
188
+ if (!fnNode)
189
+ return;
190
+ // Resolve callee name (may be `a.b()` or plain `foo()`)
191
+ let calleeName;
192
+ if (fnNode.type === 'member_expression') {
193
+ calleeName = fnNode.text;
194
+ }
195
+ else {
196
+ calleeName = fnNode.text;
197
+ }
198
+ // Attribute to deepest known method context
199
+ const caller = methodStack[methodStack.length - 1] ??
200
+ classStack[classStack.length - 1] ??
201
+ basename(filePath);
202
+ if (calleeName && caller && calleeName !== caller) {
203
+ edges.push({
204
+ source: caller,
205
+ target: calleeName,
206
+ relation: 'calls',
207
+ confidence: 'INFERRED',
208
+ confidenceScore: 0.8,
209
+ sourceFile: filePath,
210
+ sourceLocation: loc(n),
211
+ });
212
+ }
213
+ }
214
+ });
215
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors };
216
+ }
217
+ // ---- regex fallback ----
218
+ function extractWithRegex(filePath, content) {
219
+ const nodes = [];
220
+ const edges = [];
221
+ const lines = content.split('\n');
222
+ lines.forEach((line, idx) => {
223
+ const location = `L${idx + 1}`;
224
+ // class
225
+ const classMatch = line.match(/^(export\s+)?(abstract\s+)?class\s+(\w+)/);
226
+ if (classMatch) {
227
+ const name = classMatch[3];
228
+ nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
229
+ // extends
230
+ const extendsMatch = line.match(/\bextends\s+(\w+)/);
231
+ if (extendsMatch) {
232
+ edges.push({ source: name, target: extendsMatch[1], relation: 'extends', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
233
+ }
234
+ // implements
235
+ const implementsMatch = line.match(/\bimplements\s+([\w,\s]+)/);
236
+ if (implementsMatch) {
237
+ for (const impl of implementsMatch[1].split(',')) {
238
+ const implName = impl.trim().split(/\s/)[0];
239
+ if (implName) {
240
+ edges.push({ source: name, target: implName, relation: 'implements', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
241
+ }
242
+ }
243
+ }
244
+ }
245
+ // interface
246
+ const ifaceMatch = line.match(/^(export\s+)?interface\s+(\w+)/);
247
+ if (ifaceMatch) {
248
+ const name = ifaceMatch[2];
249
+ nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
250
+ }
251
+ // type alias
252
+ const typeMatch = line.match(/^(export\s+)?type\s+(\w+)\s*=/);
253
+ if (typeMatch) {
254
+ const name = typeMatch[2];
255
+ nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
256
+ }
257
+ // function
258
+ const funcMatch = line.match(/^(export\s+)?(default\s+)?(async\s+)?function\s+(\w+)/);
259
+ if (funcMatch) {
260
+ const name = funcMatch[4];
261
+ nodes.push({ id: name, label: name, fileType: 'code', sourceFile: filePath, sourceLocation: location });
262
+ }
263
+ // import
264
+ const importMatch = line.match(/^import\s+.*from\s+['"]([^'"]+)['"]/);
265
+ if (importMatch) {
266
+ edges.push({ source: basename(filePath), target: importMatch[1], relation: 'imports', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
267
+ // Named specifiers
268
+ const namedMatch = line.match(/\{([^}]+)\}/);
269
+ if (namedMatch) {
270
+ for (const spec of namedMatch[1].split(',')) {
271
+ const specName = spec.trim().split(/\s+as\s+/)[0].trim();
272
+ if (specName) {
273
+ edges.push({ source: filePath, target: specName, relation: 'imports', confidence: 'EXTRACTED', sourceFile: filePath, sourceLocation: location });
274
+ }
275
+ }
276
+ }
277
+ }
278
+ });
279
+ return { nodes, edges, filesProcessed: 1, fromCache: 0, errors: [] };
280
+ }
281
+ // ---- extractor implementation ----
282
+ export const typescriptExtractor = {
283
+ language: 'typescript',
284
+ extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
285
+ extract(filePath, content) {
286
+ const lang = filePath.endsWith('.tsx') || filePath.endsWith('.jsx') ? 'tsx' : 'typescript';
287
+ const tsResult = extractWithTreeSitter(filePath, content, lang);
288
+ if (tsResult.nodes.length > 0 || tsResult.edges.length > 0 || tsResult.errors.length > 0) {
289
+ return tsResult;
290
+ }
291
+ // tree-sitter not available or produced nothing — fall back to regex
292
+ return extractWithRegex(filePath, content);
293
+ },
294
+ };
295
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../../src/extract/languages/typescript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { ExtractionResult } from '../types.js';
2
+ import type { LanguageExtractor } from './types.js';
3
+ type ParserInstance = {
4
+ setLanguage(lang: unknown): void;
5
+ parse(src: string): {
6
+ rootNode: SyntaxNodeLike;
7
+ };
8
+ };
9
+ export type SyntaxNodeLike = {
10
+ type: string;
11
+ text: string;
12
+ startPosition: {
13
+ row: number;
14
+ column: number;
15
+ };
16
+ endPosition: {
17
+ row: number;
18
+ column: number;
19
+ };
20
+ children: SyntaxNodeLike[];
21
+ childForFieldName(name: string): SyntaxNodeLike | null;
22
+ descendantsOfType(type: string | string[]): SyntaxNodeLike[];
23
+ };
24
+ /**
25
+ * Returns true when node-tree-sitter is installed and loadable.
26
+ */
27
+ export declare function isTreeSitterAvailable(): boolean;
28
+ /**
29
+ * Attempts to create a configured Parser for the given language identifier.
30
+ * Returns null when tree-sitter or the grammar is not installed.
31
+ */
32
+ export declare function tryLoadParser(language: string): ParserInstance | null;
33
+ export declare function walk(node: SyntaxNodeLike, visitor: (n: SyntaxNodeLike) => void): void;
34
+ /**
35
+ * Parses a source file and delegates to the given LanguageExtractor.
36
+ * The extractor receives the file path and raw content; it owns the AST
37
+ * traversal internally (using tryLoadParser / walk from this module).
38
+ *
39
+ * Falls back gracefully: if tree-sitter cannot be loaded the extractor is still
40
+ * called with the raw content and is expected to use its regex fallback.
41
+ */
42
+ export declare function parseFile(filePath: string, content: string, extractor: LanguageExtractor): ExtractionResult;
43
+ /**
44
+ * Convenience helper: read a file from disk and parse it.
45
+ */
46
+ export declare function parseFileFromDisk(filePath: string, extractor: LanguageExtractor): ExtractionResult;
47
+ export {};
48
+ //# sourceMappingURL=tree-sitter-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-sitter-runner.d.ts","sourceRoot":"","sources":["../../../src/extract/tree-sitter-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIpD,KAAK,cAAc,GAAG;IACpB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IACvD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;CAC9D,CAAC;AA4BF;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAcD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA2BrE;AAID,wBAAgB,IAAI,CAClB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,GACnC,IAAI,CAKN;AAID;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,iBAAiB,GAC3B,gBAAgB,CAclB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,iBAAiB,GAC3B,gBAAgB,CAgBlB"}