@codeledger/cli 0.6.6 → 0.6.8
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/dist/architecture-graph/dependency-scanner.d.ts +16 -0
- package/dist/architecture-graph/dependency-scanner.d.ts.map +1 -0
- package/dist/architecture-graph/dependency-scanner.js +96 -0
- package/dist/architecture-graph/dependency-scanner.js.map +1 -0
- package/dist/architecture-graph/graph-builder.d.ts +70 -0
- package/dist/architecture-graph/graph-builder.d.ts.map +1 -0
- package/dist/architecture-graph/graph-builder.js +231 -0
- package/dist/architecture-graph/graph-builder.js.map +1 -0
- package/dist/architecture-graph/index.d.ts +4 -0
- package/dist/architecture-graph/index.d.ts.map +1 -0
- package/dist/architecture-graph/index.js +7 -0
- package/dist/architecture-graph/index.js.map +1 -0
- package/dist/architecture-graph/service-scanner.d.ts +22 -0
- package/dist/architecture-graph/service-scanner.d.ts.map +1 -0
- package/dist/architecture-graph/service-scanner.js +181 -0
- package/dist/architecture-graph/service-scanner.js.map +1 -0
- package/dist/commands/audit-export.d.ts +8 -0
- package/dist/commands/audit-export.d.ts.map +1 -0
- package/dist/commands/audit-export.js +190 -0
- package/dist/commands/audit-export.js.map +1 -0
- package/dist/commands/fix.d.ts +7 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +107 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/graph.d.ts +8 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +29 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/learn.d.ts +8 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +33 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/pack.d.ts +12 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +75 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/serve.d.ts +13 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +179 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/setup-ci.d.ts +6 -4
- package/dist/commands/setup-ci.d.ts.map +1 -1
- package/dist/commands/setup-ci.js +216 -23
- package/dist/commands/setup-ci.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -3
- package/dist/index.js.map +1 -1
- package/dist/review-intelligence/detectors/cjs-named-import.d.ts +13 -0
- package/dist/review-intelligence/detectors/cjs-named-import.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/cjs-named-import.js +134 -0
- package/dist/review-intelligence/detectors/cjs-named-import.js.map +1 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.d.ts +17 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.js +93 -0
- package/dist/review-intelligence/detectors/exact-count-assertion.js.map +1 -0
- package/dist/review-intelligence/detectors/exports-map-missing.d.ts +14 -0
- package/dist/review-intelligence/detectors/exports-map-missing.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/exports-map-missing.js +131 -0
- package/dist/review-intelligence/detectors/exports-map-missing.js.map +1 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts +12 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.js +82 -0
- package/dist/review-intelligence/detectors/fixture-keyword-drift.js.map +1 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.d.ts +12 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.js +97 -0
- package/dist/review-intelligence/detectors/optional-infra-crash.js.map +1 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.d.ts +11 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.js +100 -0
- package/dist/review-intelligence/detectors/undeclared-dependency.js.map +1 -0
- package/dist/review-intelligence/engine/ast-parser.d.ts +90 -0
- package/dist/review-intelligence/engine/ast-parser.d.ts.map +1 -0
- package/dist/review-intelligence/engine/ast-parser.js +266 -0
- package/dist/review-intelligence/engine/ast-parser.js.map +1 -0
- package/dist/review-intelligence/engine/dataflow.d.ts +34 -0
- package/dist/review-intelligence/engine/dataflow.d.ts.map +1 -0
- package/dist/review-intelligence/engine/dataflow.js +115 -0
- package/dist/review-intelligence/engine/dataflow.js.map +1 -0
- package/dist/review-intelligence/engine/index.d.ts +7 -0
- package/dist/review-intelligence/engine/index.d.ts.map +1 -0
- package/dist/review-intelligence/engine/index.js +7 -0
- package/dist/review-intelligence/engine/index.js.map +1 -0
- package/dist/review-intelligence/engine/symbol-resolver.d.ts +34 -0
- package/dist/review-intelligence/engine/symbol-resolver.d.ts.map +1 -0
- package/dist/review-intelligence/engine/symbol-resolver.js +106 -0
- package/dist/review-intelligence/engine/symbol-resolver.js.map +1 -0
- package/dist/review-intelligence/fixes/index.d.ts +36 -0
- package/dist/review-intelligence/fixes/index.d.ts.map +1 -0
- package/dist/review-intelligence/fixes/index.js +157 -0
- package/dist/review-intelligence/fixes/index.js.map +1 -0
- package/dist/review-intelligence/index.d.ts.map +1 -1
- package/dist/review-intelligence/index.js +2 -0
- package/dist/review-intelligence/index.js.map +1 -1
- package/dist/review-intelligence/invariants.d.ts.map +1 -1
- package/dist/review-intelligence/invariants.js +14 -1
- package/dist/review-intelligence/invariants.js.map +1 -1
- package/dist/review-intelligence/learning/index.d.ts +39 -0
- package/dist/review-intelligence/learning/index.d.ts.map +1 -0
- package/dist/review-intelligence/learning/index.js +265 -0
- package/dist/review-intelligence/learning/index.js.map +1 -0
- package/dist/review-intelligence/packs/index.d.ts +69 -0
- package/dist/review-intelligence/packs/index.d.ts.map +1 -0
- package/dist/review-intelligence/packs/index.js +168 -0
- package/dist/review-intelligence/packs/index.js.map +1 -0
- package/dist/review-intelligence/repair-guidance.d.ts.map +1 -1
- package/dist/review-intelligence/repair-guidance.js +46 -0
- package/dist/review-intelligence/repair-guidance.js.map +1 -1
- package/dist/review-intelligence/types.d.ts +6 -1
- package/dist/review-intelligence/types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
// ─── AST Parser ─────────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Lightweight TypeScript AST analysis using regex-based pattern matching
|
|
4
|
+
// with structural awareness. Provides the foundation for detecting
|
|
5
|
+
// call expressions, import declarations, generics, and variable references
|
|
6
|
+
// without requiring ts-morph or the full TypeScript compiler API as a
|
|
7
|
+
// runtime dependency.
|
|
8
|
+
//
|
|
9
|
+
// For non-TS files (Dockerfiles, YAML, JSON, shell), use the regex-based
|
|
10
|
+
// detectors directly.
|
|
11
|
+
const ANALYZABLE_EXTENSIONS = /\.(?:ts|tsx|js|jsx|mts|mjs|cts|cjs)$/;
|
|
12
|
+
/**
|
|
13
|
+
* Check if a file path is analyzable by the AST engine.
|
|
14
|
+
*/
|
|
15
|
+
export function isAnalyzableFile(filePath) {
|
|
16
|
+
return ANALYZABLE_EXTENSIONS.test(filePath);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse all import declarations from TypeScript/JavaScript source.
|
|
20
|
+
*/
|
|
21
|
+
export function parseImports(content) {
|
|
22
|
+
const imports = [];
|
|
23
|
+
const lines = content.split('\n');
|
|
24
|
+
for (let i = 0; i < lines.length; i++) {
|
|
25
|
+
const line = lines[i];
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
// Skip comments
|
|
28
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
// Static imports: import { x } from 'y'; import x from 'y'; import * as x from 'y'
|
|
32
|
+
const staticImportMatch = /^import\s+(type\s+)?(.+?)\s+from\s+['"]([^'"]+)['"]/
|
|
33
|
+
.exec(trimmed);
|
|
34
|
+
if (staticImportMatch) {
|
|
35
|
+
const isTypeOnly = !!staticImportMatch[1];
|
|
36
|
+
const importClause = staticImportMatch[2];
|
|
37
|
+
const source = staticImportMatch[3];
|
|
38
|
+
const info = {
|
|
39
|
+
source,
|
|
40
|
+
namedImports: [],
|
|
41
|
+
isTypeOnly,
|
|
42
|
+
line: i + 1,
|
|
43
|
+
isDynamic: false,
|
|
44
|
+
};
|
|
45
|
+
// Namespace import: import * as X from '...'
|
|
46
|
+
const nsMatch = /^\*\s+as\s+(\w+)$/.exec(importClause);
|
|
47
|
+
if (nsMatch) {
|
|
48
|
+
info.namespaceImport = nsMatch[1];
|
|
49
|
+
}
|
|
50
|
+
// Named imports: import { a, b } from '...'
|
|
51
|
+
else if (importClause.includes('{')) {
|
|
52
|
+
const namedMatch = /\{([^}]+)\}/.exec(importClause);
|
|
53
|
+
if (namedMatch) {
|
|
54
|
+
info.namedImports = namedMatch[1]
|
|
55
|
+
.split(',')
|
|
56
|
+
.map((n) => n.trim().replace(/\s+as\s+\w+/, '').replace(/^type\s+/, ''))
|
|
57
|
+
.filter((n) => n.length > 0);
|
|
58
|
+
}
|
|
59
|
+
// Also check for default import before the braces: import X, { a, b } from '...'
|
|
60
|
+
const defaultBeforeBrace = /^(\w+)\s*,\s*\{/.exec(importClause);
|
|
61
|
+
if (defaultBeforeBrace) {
|
|
62
|
+
info.defaultImport = defaultBeforeBrace[1];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Default import: import X from '...'
|
|
66
|
+
else {
|
|
67
|
+
const defaultMatch = /^(\w+)$/.exec(importClause.trim());
|
|
68
|
+
if (defaultMatch) {
|
|
69
|
+
info.defaultImport = defaultMatch[1];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
imports.push(info);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Side-effect imports: import 'module'
|
|
76
|
+
const sideEffectMatch = /^import\s+['"]([^'"]+)['"]/.exec(trimmed);
|
|
77
|
+
if (sideEffectMatch) {
|
|
78
|
+
imports.push({
|
|
79
|
+
source: sideEffectMatch[1],
|
|
80
|
+
namedImports: [],
|
|
81
|
+
isTypeOnly: false,
|
|
82
|
+
line: i + 1,
|
|
83
|
+
isDynamic: false,
|
|
84
|
+
});
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Dynamic imports: import('module') or await import('module')
|
|
88
|
+
const dynamicMatch = /\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/.exec(trimmed);
|
|
89
|
+
if (dynamicMatch && !trimmed.startsWith('import ')) {
|
|
90
|
+
imports.push({
|
|
91
|
+
source: dynamicMatch[1],
|
|
92
|
+
namedImports: [],
|
|
93
|
+
isTypeOnly: false,
|
|
94
|
+
line: i + 1,
|
|
95
|
+
isDynamic: true,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// require() calls
|
|
99
|
+
const requireMatch = /\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/.exec(trimmed);
|
|
100
|
+
if (requireMatch) {
|
|
101
|
+
imports.push({
|
|
102
|
+
source: requireMatch[1],
|
|
103
|
+
namedImports: [],
|
|
104
|
+
isTypeOnly: false,
|
|
105
|
+
line: i + 1,
|
|
106
|
+
isDynamic: true,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return imports;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse call expressions from source code.
|
|
114
|
+
*/
|
|
115
|
+
export function parseCallExpressions(content) {
|
|
116
|
+
const calls = [];
|
|
117
|
+
const lines = content.split('\n');
|
|
118
|
+
for (let i = 0; i < lines.length; i++) {
|
|
119
|
+
const line = lines[i];
|
|
120
|
+
const trimmed = line.trim();
|
|
121
|
+
// Skip comments and imports
|
|
122
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*'))
|
|
123
|
+
continue;
|
|
124
|
+
if (trimmed.startsWith('import '))
|
|
125
|
+
continue;
|
|
126
|
+
// Member calls
|
|
127
|
+
const memberPattern = /\b(\w+)\s*\.\s*(\w+)\s*(<[^>]*>)?\s*\(/g;
|
|
128
|
+
let match;
|
|
129
|
+
while ((match = memberPattern.exec(line)) !== null) {
|
|
130
|
+
const obj = match[1];
|
|
131
|
+
const method = match[2];
|
|
132
|
+
// Skip common non-calls
|
|
133
|
+
if (['if', 'for', 'while', 'switch', 'catch', 'return', 'typeof', 'class'].includes(obj))
|
|
134
|
+
continue;
|
|
135
|
+
calls.push({
|
|
136
|
+
callee: `${obj}.${method}`,
|
|
137
|
+
object: obj,
|
|
138
|
+
method,
|
|
139
|
+
line: i + 1,
|
|
140
|
+
rawText: match[0],
|
|
141
|
+
hasGenerics: !!match[3],
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Standalone function calls (not already captured as member calls)
|
|
145
|
+
const standalonePattern = /(?:^|[^.\w])(\w+)\s*(<[^>]*>)?\s*\(/g;
|
|
146
|
+
while ((match = standalonePattern.exec(line)) !== null) {
|
|
147
|
+
const name = match[1];
|
|
148
|
+
// Skip keywords and common false positives
|
|
149
|
+
if (['if', 'for', 'while', 'switch', 'catch', 'return', 'typeof', 'class', 'new', 'function', 'import', 'export', 'const', 'let', 'var', 'async', 'await'].includes(name))
|
|
150
|
+
continue;
|
|
151
|
+
calls.push({
|
|
152
|
+
callee: name,
|
|
153
|
+
line: i + 1,
|
|
154
|
+
rawText: match[0],
|
|
155
|
+
hasGenerics: !!match[2],
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return calls;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Parse generic type usages from source code.
|
|
163
|
+
*/
|
|
164
|
+
export function parseGenerics(content) {
|
|
165
|
+
const generics = [];
|
|
166
|
+
const lines = content.split('\n');
|
|
167
|
+
const genericPattern = /\b(\w+)\s*<([^>]+)>/g;
|
|
168
|
+
for (let i = 0; i < lines.length; i++) {
|
|
169
|
+
const line = lines[i];
|
|
170
|
+
const trimmed = line.trim();
|
|
171
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*'))
|
|
172
|
+
continue;
|
|
173
|
+
let match;
|
|
174
|
+
while ((match = genericPattern.exec(line)) !== null) {
|
|
175
|
+
const name = match[1];
|
|
176
|
+
// Skip common HTML-like tags and comparison operators
|
|
177
|
+
if (['return', 'const', 'let', 'var'].includes(name))
|
|
178
|
+
continue;
|
|
179
|
+
generics.push({
|
|
180
|
+
name,
|
|
181
|
+
typeArgs: match[2].trim(),
|
|
182
|
+
line: i + 1,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return generics;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Parse all exports from source code.
|
|
190
|
+
*/
|
|
191
|
+
export function parseExports(content) {
|
|
192
|
+
const exports = [];
|
|
193
|
+
const lines = content.split('\n');
|
|
194
|
+
for (let i = 0; i < lines.length; i++) {
|
|
195
|
+
const line = lines[i];
|
|
196
|
+
const trimmed = line.trim();
|
|
197
|
+
// export default
|
|
198
|
+
if (/^export\s+default\s+/.test(trimmed)) {
|
|
199
|
+
const kindMatch = /^export\s+default\s+(?:async\s+)?(\w+)/.exec(trimmed);
|
|
200
|
+
const kind = kindMatch?.[1];
|
|
201
|
+
let exportKind = 'const';
|
|
202
|
+
if (kind === 'function')
|
|
203
|
+
exportKind = 'function';
|
|
204
|
+
else if (kind === 'class')
|
|
205
|
+
exportKind = 'class';
|
|
206
|
+
exports.push({
|
|
207
|
+
name: 'default',
|
|
208
|
+
kind: exportKind,
|
|
209
|
+
isDefault: true,
|
|
210
|
+
line: i + 1,
|
|
211
|
+
});
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// export function/const/class/type/interface/enum
|
|
215
|
+
const namedExportMatch = /^export\s+(?:async\s+)?(function|const|let|class|type|interface|enum)\s+(\w+)/.exec(trimmed);
|
|
216
|
+
if (namedExportMatch) {
|
|
217
|
+
const rawKind = namedExportMatch[1];
|
|
218
|
+
const kind = rawKind === 'let' ? 'const' : rawKind;
|
|
219
|
+
exports.push({
|
|
220
|
+
name: namedExportMatch[2],
|
|
221
|
+
kind,
|
|
222
|
+
isDefault: false,
|
|
223
|
+
line: i + 1,
|
|
224
|
+
});
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
// export { a, b, c }
|
|
228
|
+
const reExportMatch = /^export\s*\{([^}]+)\}/.exec(trimmed);
|
|
229
|
+
if (reExportMatch) {
|
|
230
|
+
const names = reExportMatch[1].split(',').map((n) => n.trim().split(/\s+as\s+/).pop().trim());
|
|
231
|
+
for (const name of names) {
|
|
232
|
+
if (name) {
|
|
233
|
+
exports.push({
|
|
234
|
+
name,
|
|
235
|
+
kind: 'reexport',
|
|
236
|
+
isDefault: false,
|
|
237
|
+
line: i + 1,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return exports;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Perform full file analysis: imports, calls, generics, exports.
|
|
247
|
+
*/
|
|
248
|
+
export function analyzeFile(filePath, content) {
|
|
249
|
+
if (!isAnalyzableFile(filePath)) {
|
|
250
|
+
return {
|
|
251
|
+
imports: [],
|
|
252
|
+
calls: [],
|
|
253
|
+
generics: [],
|
|
254
|
+
exports: [],
|
|
255
|
+
analyzable: false,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
imports: parseImports(content),
|
|
260
|
+
calls: parseCallExpressions(content),
|
|
261
|
+
generics: parseGenerics(content),
|
|
262
|
+
exports: parseExports(content),
|
|
263
|
+
analyzable: true,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=ast-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/ast-parser.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,2EAA2E;AAC3E,sEAAsE;AACtE,sBAAsB;AACtB,EAAE;AACF,yEAAyE;AACzE,sBAAsB;AAwEtB,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAErE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gBAAgB;QAChB,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpF,SAAS;QACX,CAAC;QAED,mFAAmF;QACnF,MAAM,iBAAiB,GAAG,qDAAqD;aAC5E,IAAI,CAAC,OAAO,CAAC,CAAC;QACjB,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAE,CAAC;YAErC,MAAM,IAAI,GAAe;gBACvB,MAAM;gBACN,YAAY,EAAE,EAAE;gBAChB,UAAU;gBACV,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,SAAS,EAAE,KAAK;aACjB,CAAC;YAEF,6CAA6C;YAC7C,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACpC,CAAC;YACD,4CAA4C;iBACvC,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACpD,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,CAAE;yBAC/B,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;yBACvE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACjC,CAAC;gBACD,iFAAiF;gBACjF,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAChE,IAAI,kBAAkB,EAAE,CAAC;oBACvB,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YACD,sCAAsC;iBACjC,CAAC;gBACJ,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,uCAAuC;QACvC,MAAM,eAAe,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,eAAe,CAAC,CAAC,CAAE;gBAC3B,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,8DAA8D;QAC9D,MAAM,YAAY,GAAG,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3E,IAAI,YAAY,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,YAAY,CAAC,CAAC,CAAE;gBACxB,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;QAClB,MAAM,YAAY,GAAG,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,YAAY,CAAC,CAAC,CAAE;gBACxB,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,4BAA4B;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9F,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAE5C,eAAe;QACf,MAAM,aAAa,GAAG,yCAAyC,CAAC;QAChE,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACzB,wBAAwB;YACxB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAEnG,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,GAAG,GAAG,IAAI,MAAM,EAAE;gBAC1B,MAAM,EAAE,GAAG;gBACX,MAAM;gBACN,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBACjB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aACxB,CAAC,CAAC;QACL,CAAC;QAED,mEAAmE;QACnE,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;QACjE,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,2CAA2C;YAC3C,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEpL,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,CAAC,GAAG,CAAC;gBACX,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBACjB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,cAAc,GAAG,sBAAsB,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElE,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,sDAAsD;YACtD,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE/D,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;gBAC1B,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,iBAAiB;QACjB,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,UAAU,GAAuB,OAAO,CAAC;YAC7C,IAAI,IAAI,KAAK,UAAU;gBAAE,UAAU,GAAG,UAAU,CAAC;iBAC5C,IAAI,IAAI,KAAK,OAAO;gBAAE,UAAU,GAAG,OAAO,CAAC;YAEhD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,+EAA+E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvH,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;YACrC,MAAM,IAAI,GAAuB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAA6B,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAE;gBAC1B,IAAI;gBACJ,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,qBAAqB;QACrB,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,EAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAChG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI;wBACJ,IAAI,EAAE,UAAU;wBAChB,SAAS,EAAE,KAAK;wBAChB,IAAI,EAAE,CAAC,GAAG,CAAC;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC3D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;QAC9B,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC;QACpC,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;QAC9B,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Represents a scope block (try/catch, if, function) */
|
|
2
|
+
export interface ScopeBlock {
|
|
3
|
+
kind: 'try' | 'catch' | 'if' | 'function' | 'arrow' | 'block';
|
|
4
|
+
startLine: number;
|
|
5
|
+
endLine: number;
|
|
6
|
+
}
|
|
7
|
+
/** Result of checking if a line is wrapped in try/catch */
|
|
8
|
+
export interface TryCatchInfo {
|
|
9
|
+
isWrapped: boolean;
|
|
10
|
+
tryStartLine?: number;
|
|
11
|
+
catchStartLine?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Find all try/catch blocks in source code.
|
|
15
|
+
* Returns pairs of (try start line, catch start line, block end line).
|
|
16
|
+
*/
|
|
17
|
+
export declare function findTryCatchBlocks(content: string): ScopeBlock[];
|
|
18
|
+
/**
|
|
19
|
+
* Check if a specific line is inside a try/catch block.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isInsideTryCatch(content: string, targetLine: number): TryCatchInfo;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a variable assigned on one line is used in a function call nearby.
|
|
24
|
+
* Useful for detecting patterns like:
|
|
25
|
+
* const result = schema.safeParse(body);
|
|
26
|
+
* if (!result.success) return sendInvalidRequest(reply);
|
|
27
|
+
*/
|
|
28
|
+
export declare function tracksVariableUsage(content: string, variableName: string, nearLine: number, windowSize?: number): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Detect guard-return patterns: if (condition) return/throw before a target line.
|
|
31
|
+
* This helps detect validation patterns that guard subsequent code.
|
|
32
|
+
*/
|
|
33
|
+
export declare function hasGuardBefore(content: string, targetLine: number, guardPattern: RegExp, windowSize?: number): boolean;
|
|
34
|
+
//# sourceMappingURL=dataflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/engine/dataflow.ts"],"names":[],"mappings":"AAOA,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CA6ChE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAoBlF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAW,GACtB,OAAO,CAaT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,MAAW,GACtB,OAAO,CAqBT"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// ─── Dataflow Analysis ──────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Lightweight dataflow analysis for detecting patterns like:
|
|
4
|
+
// - try/catch wrapping around specific calls
|
|
5
|
+
// - variable assignments flowing into function arguments
|
|
6
|
+
// - guard patterns (if-return before usage)
|
|
7
|
+
/**
|
|
8
|
+
* Find all try/catch blocks in source code.
|
|
9
|
+
* Returns pairs of (try start line, catch start line, block end line).
|
|
10
|
+
*/
|
|
11
|
+
export function findTryCatchBlocks(content) {
|
|
12
|
+
const blocks = [];
|
|
13
|
+
const lines = content.split('\n');
|
|
14
|
+
const braceStack = [];
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const line = lines[i];
|
|
17
|
+
const trimmed = line.trim();
|
|
18
|
+
if (/^\s*try\s*\{/.test(line) || trimmed === 'try {') {
|
|
19
|
+
braceStack.push({ kind: 'try', startLine: i + 1 });
|
|
20
|
+
}
|
|
21
|
+
else if (/^\s*catch\s*/.test(line)) {
|
|
22
|
+
braceStack.push({ kind: 'catch', startLine: i + 1 });
|
|
23
|
+
}
|
|
24
|
+
// Count braces to track block ends
|
|
25
|
+
const opens = (line.match(/\{/g) ?? []).length;
|
|
26
|
+
const closes = (line.match(/\}/g) ?? []).length;
|
|
27
|
+
for (let c = 0; c < closes; c++) {
|
|
28
|
+
if (braceStack.length > 0) {
|
|
29
|
+
const top = braceStack.pop();
|
|
30
|
+
blocks.push({
|
|
31
|
+
kind: top.kind,
|
|
32
|
+
startLine: top.startLine,
|
|
33
|
+
endLine: i + 1,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Re-push opens (minus the ones that also close on the same line)
|
|
38
|
+
// This is a simplified heuristic — for precise analysis, we'd need
|
|
39
|
+
// a real parser, but this works for common patterns
|
|
40
|
+
for (let o = 0; o < opens - closes; o++) {
|
|
41
|
+
if (/^\s*try\s*\{/.test(line) || trimmed === 'try {') {
|
|
42
|
+
// Already pushed above
|
|
43
|
+
}
|
|
44
|
+
else if (/^\s*catch\s*/.test(line)) {
|
|
45
|
+
// Already pushed above
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
braceStack.push({ kind: 'block', startLine: i + 1 });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return blocks;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a specific line is inside a try/catch block.
|
|
56
|
+
*/
|
|
57
|
+
export function isInsideTryCatch(content, targetLine) {
|
|
58
|
+
const blocks = findTryCatchBlocks(content);
|
|
59
|
+
const tryBlocks = blocks.filter((b) => b.kind === 'try');
|
|
60
|
+
for (const tryBlock of tryBlocks) {
|
|
61
|
+
if (targetLine >= tryBlock.startLine && targetLine <= tryBlock.endLine) {
|
|
62
|
+
// Find the corresponding catch block
|
|
63
|
+
const catchBlock = blocks.find((b) => b.kind === 'catch' && b.startLine > tryBlock.endLine - 2 && b.startLine <= tryBlock.endLine + 1);
|
|
64
|
+
return {
|
|
65
|
+
isWrapped: true,
|
|
66
|
+
tryStartLine: tryBlock.startLine,
|
|
67
|
+
catchStartLine: catchBlock?.startLine,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { isWrapped: false };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a variable assigned on one line is used in a function call nearby.
|
|
75
|
+
* Useful for detecting patterns like:
|
|
76
|
+
* const result = schema.safeParse(body);
|
|
77
|
+
* if (!result.success) return sendInvalidRequest(reply);
|
|
78
|
+
*/
|
|
79
|
+
export function tracksVariableUsage(content, variableName, nearLine, windowSize = 10) {
|
|
80
|
+
const lines = content.split('\n');
|
|
81
|
+
const start = Math.max(0, nearLine - 1 - windowSize);
|
|
82
|
+
const end = Math.min(lines.length, nearLine - 1 + windowSize);
|
|
83
|
+
for (let i = start; i < end; i++) {
|
|
84
|
+
const line = lines[i];
|
|
85
|
+
if (line && new RegExp(`\\b${variableName}\\b`).test(line)) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Detect guard-return patterns: if (condition) return/throw before a target line.
|
|
93
|
+
* This helps detect validation patterns that guard subsequent code.
|
|
94
|
+
*/
|
|
95
|
+
export function hasGuardBefore(content, targetLine, guardPattern, windowSize = 15) {
|
|
96
|
+
const lines = content.split('\n');
|
|
97
|
+
const start = Math.max(0, targetLine - 1 - windowSize);
|
|
98
|
+
const end = targetLine - 1;
|
|
99
|
+
for (let i = start; i < end; i++) {
|
|
100
|
+
const line = lines[i];
|
|
101
|
+
if (line && guardPattern.test(line)) {
|
|
102
|
+
// Check if this guard includes a return/throw
|
|
103
|
+
if (/\b(?:return|throw)\b/.test(line)) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
// Check next line for return/throw
|
|
107
|
+
const nextLine = lines[i + 1];
|
|
108
|
+
if (nextLine && /\b(?:return|throw)\b/.test(nextLine)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=dataflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/dataflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { isAnalyzableFile, parseImports, parseCallExpressions, parseGenerics, parseExports, analyzeFile, } from './ast-parser.js';
|
|
2
|
+
export type { ImportInfo, CallExpressionInfo, GenericInfo, ExportInfo, FileAnalysis, } from './ast-parser.js';
|
|
3
|
+
export { findTryCatchBlocks, isInsideTryCatch, tracksVariableUsage, hasGuardBefore, } from './dataflow.js';
|
|
4
|
+
export type { ScopeBlock, TryCatchInfo } from './dataflow.js';
|
|
5
|
+
export { resolveModule, isWorkspacePackage, extractExternalPackages, isNamedCjsImport, } from './symbol-resolver.js';
|
|
6
|
+
export type { ModuleKind, ResolvedModule } from './symbol-resolver.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/engine/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ─── AST Engine ─────────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Re-exports for the AST analysis engine.
|
|
4
|
+
export { isAnalyzableFile, parseImports, parseCallExpressions, parseGenerics, parseExports, analyzeFile, } from './ast-parser.js';
|
|
5
|
+
export { findTryCatchBlocks, isInsideTryCatch, tracksVariableUsage, hasGuardBefore, } from './dataflow.js';
|
|
6
|
+
export { resolveModule, isWorkspacePackage, extractExternalPackages, isNamedCjsImport, } from './symbol-resolver.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,0CAA0C;AAE1C,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Classification of an import source */
|
|
2
|
+
export type ModuleKind = 'builtin' | 'local' | 'external' | 'workspace';
|
|
3
|
+
/** Resolved module information */
|
|
4
|
+
export interface ResolvedModule {
|
|
5
|
+
/** Original import specifier */
|
|
6
|
+
source: string;
|
|
7
|
+
/** Classification */
|
|
8
|
+
kind: ModuleKind;
|
|
9
|
+
/** Bare package name (e.g. 'lodash' from 'lodash/fp') */
|
|
10
|
+
packageName?: string;
|
|
11
|
+
/** Subpath (e.g. '/fp' from 'lodash/fp') */
|
|
12
|
+
subpath?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve an import source to its module classification.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveModule(source: string): ResolvedModule;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a package name looks like a workspace package.
|
|
20
|
+
* Common patterns: @org/package where org matches the monorepo scope.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isWorkspacePackage(packageName: string, workspaceScopes: string[]): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Extract all unique external package names from a list of imports.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractExternalPackages(imports: Array<{
|
|
27
|
+
source: string;
|
|
28
|
+
}>): Set<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a CJS module is being imported with named imports.
|
|
31
|
+
* This is a common ESM/CJS interop issue.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isNamedCjsImport(namedImports: string[], source: string, knownCjsPackages: Set<string>): boolean;
|
|
34
|
+
//# sourceMappingURL=symbol-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-resolver.d.ts","sourceRoot":"","sources":["../../../src/review-intelligence/engine/symbol-resolver.ts"],"names":[],"mappings":"AAQA,yCAAyC;AACzC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAExE,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAqD5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GACjC,GAAG,CAAC,MAAM,CAAC,CAWb;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,OAAO,CAOT"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ─── Symbol Resolver ────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Resolves import sources to determine:
|
|
4
|
+
// - Whether a module is a Node.js builtin
|
|
5
|
+
// - Whether a module is a local file (relative import)
|
|
6
|
+
// - Whether a module is an external package
|
|
7
|
+
// - The bare package name (for dependency checking)
|
|
8
|
+
/** Well-known Node.js builtin modules */
|
|
9
|
+
const NODE_BUILTINS = new Set([
|
|
10
|
+
'assert', 'async_hooks', 'buffer', 'child_process', 'cluster', 'console',
|
|
11
|
+
'constants', 'crypto', 'dgram', 'diagnostics_channel', 'dns', 'domain',
|
|
12
|
+
'events', 'fs', 'http', 'http2', 'https', 'inspector', 'module', 'net',
|
|
13
|
+
'os', 'path', 'perf_hooks', 'process', 'punycode', 'querystring', 'readline',
|
|
14
|
+
'repl', 'stream', 'string_decoder', 'sys', 'timers', 'tls', 'trace_events',
|
|
15
|
+
'tty', 'url', 'util', 'v8', 'vm', 'wasi', 'worker_threads', 'zlib',
|
|
16
|
+
'test', 'sqlite',
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Resolve an import source to its module classification.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveModule(source) {
|
|
22
|
+
// node: protocol builtins
|
|
23
|
+
if (source.startsWith('node:')) {
|
|
24
|
+
return {
|
|
25
|
+
source,
|
|
26
|
+
kind: 'builtin',
|
|
27
|
+
packageName: source,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Bare builtin names
|
|
31
|
+
const bareName = source.split('/')[0];
|
|
32
|
+
if (NODE_BUILTINS.has(bareName)) {
|
|
33
|
+
return {
|
|
34
|
+
source,
|
|
35
|
+
kind: 'builtin',
|
|
36
|
+
packageName: bareName,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Relative imports
|
|
40
|
+
if (source.startsWith('.') || source.startsWith('/')) {
|
|
41
|
+
return {
|
|
42
|
+
source,
|
|
43
|
+
kind: 'local',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Scoped packages: @scope/package or @scope/package/subpath
|
|
47
|
+
if (source.startsWith('@')) {
|
|
48
|
+
const parts = source.split('/');
|
|
49
|
+
const packageName = parts.length >= 2 ? `${parts[0]}/${parts[1]}` : source;
|
|
50
|
+
const subpath = parts.length > 2 ? '/' + parts.slice(2).join('/') : undefined;
|
|
51
|
+
return {
|
|
52
|
+
source,
|
|
53
|
+
kind: 'external',
|
|
54
|
+
packageName,
|
|
55
|
+
subpath,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Regular external packages: package or package/subpath
|
|
59
|
+
const parts = source.split('/');
|
|
60
|
+
const packageName = parts[0];
|
|
61
|
+
const subpath = parts.length > 1 ? '/' + parts.slice(1).join('/') : undefined;
|
|
62
|
+
return {
|
|
63
|
+
source,
|
|
64
|
+
kind: 'external',
|
|
65
|
+
packageName,
|
|
66
|
+
subpath,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if a package name looks like a workspace package.
|
|
71
|
+
* Common patterns: @org/package where org matches the monorepo scope.
|
|
72
|
+
*/
|
|
73
|
+
export function isWorkspacePackage(packageName, workspaceScopes) {
|
|
74
|
+
for (const scope of workspaceScopes) {
|
|
75
|
+
if (packageName.startsWith(scope + '/')) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Extract all unique external package names from a list of imports.
|
|
83
|
+
*/
|
|
84
|
+
export function extractExternalPackages(imports) {
|
|
85
|
+
const packages = new Set();
|
|
86
|
+
for (const imp of imports) {
|
|
87
|
+
const resolved = resolveModule(imp.source);
|
|
88
|
+
if (resolved.kind === 'external' && resolved.packageName) {
|
|
89
|
+
packages.add(resolved.packageName);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return packages;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if a CJS module is being imported with named imports.
|
|
96
|
+
* This is a common ESM/CJS interop issue.
|
|
97
|
+
*/
|
|
98
|
+
export function isNamedCjsImport(namedImports, source, knownCjsPackages) {
|
|
99
|
+
if (namedImports.length === 0)
|
|
100
|
+
return false;
|
|
101
|
+
const resolved = resolveModule(source);
|
|
102
|
+
if (resolved.kind !== 'external')
|
|
103
|
+
return false;
|
|
104
|
+
return knownCjsPackages.has(resolved.packageName ?? source);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=symbol-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-resolver.js","sourceRoot":"","sources":["../../../src/review-intelligence/engine/symbol-resolver.ts"],"names":[],"mappings":"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"}
|