@devflow-tools/plugin-react 0.12.0 → 0.13.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.
@@ -1,12 +1,16 @@
1
- import { readFileContent, getRelativePath } from './file-scanner.js';
1
+ import ts from 'typescript';
2
+ import { readFileContent, getRelativePath, selectAnalyzerFiles } from './file-scanner.js';
2
3
  const BUILTIN_HOOKS = new Set([
3
4
  'useState', 'useEffect', 'useContext', 'useReducer', 'useCallback',
4
5
  'useMemo', 'useRef', 'useImperativeHandle', 'useLayoutEffect',
5
6
  'useDebugValue', 'useDeferredValue', 'useTransition', 'useId',
6
7
  'useSyncExternalStore', 'useInsertionEffect',
7
8
  ]);
8
- const HOOK_CALL_PATTERN = /\b(use[A-Z][a-zA-Z]*)\s*\(/g;
9
- export function reviewHooks(ctx) {
9
+ export function reviewHooks(ctx, options = {}) {
10
+ const scope = options.scope ?? (options.filePath || options.componentName ? 'target' : 'project');
11
+ const outputMode = options.outputMode ?? (scope === 'project' ? 'focused' : 'summary');
12
+ const maxFindings = normalizeMaxFindings(options.maxFindings, outputMode);
13
+ const selectedFiles = selectFiles(ctx, options, scope);
10
14
  const findings = [];
11
15
  const metrics = {
12
16
  totalHookCalls: 0,
@@ -17,89 +21,15 @@ export function reviewHooks(ctx) {
17
21
  customHooks: 0,
18
22
  violations: 0,
19
23
  };
20
- for (const file of ctx.files) {
24
+ for (const file of selectedFiles) {
21
25
  const content = readFileContent(file);
22
26
  const relPath = getRelativePath(ctx.projectRoot, file);
23
27
  const lines = content.split('\n');
24
- // Track block context using brace depth
25
- let braceDepth = 0;
26
- // Stack tracking what kind of block each depth level is
27
- const blockStack = ['function'];
28
- for (let i = 0; i < lines.length; i++) {
29
- const line = lines[i];
30
- const trimmed = line.trim();
31
- // Skip import/export lines for metrics
32
- const isImportLine = /^\s*(import|export\s+.*from)\s/.test(line);
33
- // Count hooks (skip imports)
34
- if (!isImportLine) {
35
- let hookMatch;
36
- HOOK_CALL_PATTERN.lastIndex = 0;
37
- while ((hookMatch = HOOK_CALL_PATTERN.exec(trimmed)) !== null) {
38
- const hook = hookMatch[1];
39
- if (BUILTIN_HOOKS.has(hook)) {
40
- metrics[hook] = (metrics[hook] ?? 0) + 1;
41
- }
42
- else if (hook.startsWith('use') && hook.length > 3) {
43
- metrics.customHooks = (metrics.customHooks ?? 0) + 1;
44
- }
45
- metrics.totalHookCalls++;
46
- }
47
- }
48
- // Check for hook calls in invalid positions (before updating block context)
49
- const hookCall = trimmed.match(/\b(use[A-Z][a-zA-Z]*)\s*\(/);
50
- const currentBlock = blockStack[blockStack.length - 1];
51
- if (hookCall && !isImportLine) {
52
- if (currentBlock === 'conditional') {
53
- findings.push({
54
- severity: 'critical',
55
- category: 'conditional-hook',
56
- title: '条件调用 Hook',
57
- description: `${hookCall[1]} 在条件语句中调用,违反 Hooks 规则`,
58
- file: relPath,
59
- line: i + 1,
60
- codeSnippet: trimmed,
61
- suggestion: `将 ${hookCall[1]} 移到组件顶层`,
62
- });
63
- metrics.violations++;
64
- }
65
- else if (currentBlock === 'loop') {
66
- findings.push({
67
- severity: 'critical',
68
- category: 'loop-hook',
69
- title: '循环中调用 Hook',
70
- description: `${hookCall[1]} 在循环中调用,违反 Hooks 规则`,
71
- file: relPath,
72
- line: i + 1,
73
- codeSnippet: trimmed,
74
- suggestion: `将 ${hookCall[1]} 移到循环外部`,
75
- });
76
- metrics.violations++;
77
- }
78
- }
79
- // Update block context based on this line
80
- // Detect new blocks opening
81
- if (/^\s*(if|else if|else|switch)\s*[\({]?/.test(trimmed) || (/[^.?]\?\s+[^:]/.test(trimmed) && /\{/.test(trimmed))) {
82
- blockStack.push('conditional');
83
- }
84
- else if (/^\s*(for|while|do)\s*[\({]?/.test(trimmed)) {
85
- blockStack.push('loop');
86
- }
87
- else if (/\{\s*$/.test(trimmed) && !/function|=>/.test(trimmed)) {
88
- blockStack.push('other');
89
- }
90
- // Track braces
91
- for (const ch of trimmed) {
92
- if (ch === '{')
93
- braceDepth++;
94
- if (ch === '}') {
95
- braceDepth--;
96
- // Pop block stack when we close a block
97
- if (blockStack.length > 1) {
98
- blockStack.pop();
99
- }
100
- }
101
- }
102
- }
28
+ const sourceFile = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, true, inferScriptKind(file));
29
+ collectHookMetrics(lines, sourceFile, metrics);
30
+ const hookViolations = findHookViolations(lines, sourceFile, relPath);
31
+ findings.push(...hookViolations);
32
+ metrics.violations += hookViolations.length;
103
33
  // Check for missing cleanup in useEffect
104
34
  const useEffectPattern = /useEffect\s*\(\s*\(\s*\)\s*=>\s*\{/g;
105
35
  let match;
@@ -126,11 +56,53 @@ export function reviewHooks(ctx) {
126
56
  }
127
57
  const criticalCount = findings.filter(f => f.severity === 'critical').length;
128
58
  const warningCount = findings.filter(f => f.severity === 'warning').length;
59
+ const sortedFindings = sortFindings(findings, options);
60
+ const limitedFindings = outputMode === 'full'
61
+ ? sortedFindings
62
+ : sortedFindings.slice(0, maxFindings);
63
+ const truncated = limitedFindings.length < sortedFindings.length;
64
+ const targetLabel = describeTarget(options, scope);
65
+ const reportId = truncated ? buildReportId(targetLabel, selectedFiles) : undefined;
129
66
  return {
130
67
  success: true,
131
- summary: `扫描 ${ctx.files.length} 个文件,发现 ${criticalCount} 个 critical、${warningCount} 个 warning`,
132
- findings,
133
- metrics,
68
+ summary: buildSummary({
69
+ targetLabel,
70
+ scannedFiles: selectedFiles.length,
71
+ criticalCount,
72
+ warningCount,
73
+ totalFindings: sortedFindings.length,
74
+ shownFindings: limitedFindings.length,
75
+ truncated,
76
+ }),
77
+ findings: limitedFindings,
78
+ metrics: {
79
+ ...metrics,
80
+ scannedFiles: selectedFiles.length,
81
+ },
82
+ totalFindings: sortedFindings.length,
83
+ truncated,
84
+ reportId,
85
+ data: {
86
+ target: targetLabel,
87
+ scope,
88
+ outputMode,
89
+ scannedFiles: selectedFiles.map((file) => getRelativePath(ctx.projectRoot, file)),
90
+ totalFindings: sortedFindings.length,
91
+ shownFindings: limitedFindings.length,
92
+ truncated,
93
+ reportId,
94
+ },
95
+ _report: reportId ? {
96
+ target: targetLabel,
97
+ scope,
98
+ outputMode,
99
+ scannedFiles: selectedFiles.map((file) => getRelativePath(ctx.projectRoot, file)),
100
+ metrics: {
101
+ ...metrics,
102
+ scannedFiles: selectedFiles.length,
103
+ },
104
+ findings: sortedFindings,
105
+ } : undefined,
134
106
  };
135
107
  }
136
108
  function findBlockEnd(content, startIdx) {
@@ -159,4 +131,177 @@ function findBlockEnd(content, startIdx) {
159
131
  }
160
132
  return content.length;
161
133
  }
134
+ function normalizeMaxFindings(maxFindings, outputMode) {
135
+ if (outputMode === 'full')
136
+ return Number.MAX_SAFE_INTEGER;
137
+ if (!maxFindings || Number.isNaN(maxFindings)) {
138
+ return outputMode === 'summary' ? 5 : 10;
139
+ }
140
+ return Math.max(1, Math.min(maxFindings, 50));
141
+ }
142
+ function selectFiles(ctx, options, scope) {
143
+ return selectAnalyzerFiles(ctx, {
144
+ filePath: options.filePath,
145
+ componentName: options.componentName,
146
+ scope,
147
+ matchComponent: (file, componentName) => {
148
+ const pattern = new RegExp(`(?:^|[^a-zA-Z0-9_])${escapeRegExp(componentName)}(?:[^a-zA-Z0-9_]|$)`);
149
+ return pattern.test(readFileContent(file));
150
+ },
151
+ });
152
+ }
153
+ function sortFindings(findings, options) {
154
+ const severityRank = {
155
+ critical: 0,
156
+ warning: 1,
157
+ suggestion: 2,
158
+ info: 3,
159
+ };
160
+ const targetPath = options.filePath?.replace(/\\/g, '/').toLowerCase();
161
+ const targetName = options.componentName?.toLowerCase();
162
+ return [...findings].sort((a, b) => {
163
+ const aTarget = getTargetScore(a, targetPath, targetName);
164
+ const bTarget = getTargetScore(b, targetPath, targetName);
165
+ if (aTarget !== bTarget)
166
+ return bTarget - aTarget;
167
+ const severityDiff = severityRank[a.severity] - severityRank[b.severity];
168
+ if (severityDiff !== 0)
169
+ return severityDiff;
170
+ return (a.file ?? '').localeCompare(b.file ?? '');
171
+ });
172
+ }
173
+ function getTargetScore(finding, targetPath, targetName) {
174
+ const file = finding.file?.replace(/\\/g, '/').toLowerCase() ?? '';
175
+ const title = `${finding.title} ${finding.description}`.toLowerCase();
176
+ let score = 0;
177
+ if (targetPath && file.includes(targetPath))
178
+ score += 2;
179
+ if (targetName && title.includes(targetName))
180
+ score += 1;
181
+ return score;
182
+ }
183
+ function describeTarget(options, scope) {
184
+ if (options.filePath)
185
+ return `文件 ${options.filePath}`;
186
+ if (options.componentName)
187
+ return `组件 ${options.componentName}`;
188
+ return scope === 'project' ? '当前项目' : '目标范围';
189
+ }
190
+ function buildSummary(params) {
191
+ const { targetLabel, scannedFiles, criticalCount, warningCount, totalFindings, shownFindings, truncated } = params;
192
+ const base = `已审查${targetLabel},扫描 ${scannedFiles} 个文件,发现 ${criticalCount} 个 critical、${warningCount} 个 warning,共 ${totalFindings} 个问题`;
193
+ if (!truncated)
194
+ return base;
195
+ return `${base};当前仅返回前 ${shownFindings} 条高优先级发现`;
196
+ }
197
+ function buildReportId(targetLabel, files) {
198
+ const source = `${targetLabel}:${files.join('|')}`;
199
+ let hash = 0;
200
+ for (let i = 0; i < source.length; i++) {
201
+ hash = (hash * 31 + source.charCodeAt(i)) >>> 0;
202
+ }
203
+ return `react-hooks-${hash.toString(16)}`;
204
+ }
205
+ function escapeRegExp(value) {
206
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
207
+ }
208
+ function collectHookMetrics(lines, sourceFile, metrics) {
209
+ const counted = new Set();
210
+ const visit = (node) => {
211
+ if (ts.isCallExpression(node)) {
212
+ const hookName = getHookName(node.expression);
213
+ if (hookName && !counted.has(node.getStart(sourceFile))) {
214
+ counted.add(node.getStart(sourceFile));
215
+ if (BUILTIN_HOOKS.has(hookName)) {
216
+ metrics[hookName] = (metrics[hookName] ?? 0) + 1;
217
+ }
218
+ else {
219
+ metrics.customHooks = (metrics.customHooks ?? 0) + 1;
220
+ }
221
+ metrics.totalHookCalls++;
222
+ }
223
+ }
224
+ ts.forEachChild(node, visit);
225
+ };
226
+ visit(sourceFile);
227
+ for (let i = 0; i < lines.length; i++) {
228
+ const line = lines[i].trim();
229
+ if (/^\s*(import|export\s+.*from)\s/.test(line))
230
+ continue;
231
+ }
232
+ }
233
+ function findHookViolations(lines, sourceFile, relPath) {
234
+ const findings = [];
235
+ const seen = new Set();
236
+ const visit = (node) => {
237
+ if (ts.isCallExpression(node)) {
238
+ const hookName = getHookName(node.expression);
239
+ if (hookName) {
240
+ const violation = findViolationAncestor(node, sourceFile);
241
+ if (violation) {
242
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
243
+ const key = `${violation.category}:${line}:${hookName}`;
244
+ if (!seen.has(key)) {
245
+ seen.add(key);
246
+ findings.push({
247
+ severity: 'critical',
248
+ category: violation.category,
249
+ title: violation.category === 'loop-hook' ? '循环中调用 Hook' : '条件调用 Hook',
250
+ description: `${hookName} ${violation.description},违反 Hooks 规则`,
251
+ file: relPath,
252
+ line,
253
+ codeSnippet: lines[line - 1]?.trim(),
254
+ suggestion: violation.category === 'loop-hook'
255
+ ? `将 ${hookName} 移到循环外部`
256
+ : `将 ${hookName} 移到组件顶层`,
257
+ });
258
+ }
259
+ }
260
+ }
261
+ }
262
+ ts.forEachChild(node, visit);
263
+ };
264
+ visit(sourceFile);
265
+ return findings;
266
+ }
267
+ function findViolationAncestor(node, sourceFile) {
268
+ let current = node.parent;
269
+ while (current && current !== sourceFile) {
270
+ if (ts.isForStatement(current) ||
271
+ ts.isForInStatement(current) ||
272
+ ts.isForOfStatement(current) ||
273
+ ts.isWhileStatement(current) ||
274
+ ts.isDoStatement(current)) {
275
+ return { category: 'loop-hook', description: '在循环中调用' };
276
+ }
277
+ if (ts.isIfStatement(current) ||
278
+ ts.isConditionalExpression(current) ||
279
+ ts.isCaseClause(current) ||
280
+ ts.isDefaultClause(current)) {
281
+ return { category: 'conditional-hook', description: '在条件分支中调用' };
282
+ }
283
+ current = current.parent;
284
+ }
285
+ return null;
286
+ }
287
+ function getHookName(expression) {
288
+ if (ts.isIdentifier(expression) && /^use[A-Z]/.test(expression.text)) {
289
+ return expression.text;
290
+ }
291
+ if (ts.isPropertyAccessExpression(expression) &&
292
+ ts.isIdentifier(expression.name) &&
293
+ /^use[A-Z]/.test(expression.name.text)) {
294
+ return expression.name.text;
295
+ }
296
+ return null;
297
+ }
298
+ function inferScriptKind(filePath) {
299
+ if (filePath.endsWith('.tsx'))
300
+ return ts.ScriptKind.TSX;
301
+ if (filePath.endsWith('.ts'))
302
+ return ts.ScriptKind.TS;
303
+ if (filePath.endsWith('.jsx'))
304
+ return ts.ScriptKind.JSX;
305
+ return ts.ScriptKind.JS;
306
+ }
162
307
  //# sourceMappingURL=hooks-review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-review.js","sourceRoot":"","sources":["../../src/analyzers/hooks-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks-review.js","sourceRoot":"","sources":["../../src/analyzers/hooks-review.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
1
  import type { AnalysisResult, AnalyzerContext } from './types.js';
2
- export declare function auditPerformance(ctx: AnalyzerContext): AnalysisResult;
2
+ export interface PerformanceAuditOptions {
3
+ filePath?: string;
4
+ componentName?: string;
5
+ scope?: 'target' | 'related' | 'project';
6
+ maxFindings?: number;
7
+ outputMode?: 'summary' | 'focused' | 'full';
8
+ }
9
+ export declare function auditPerformance(ctx: AnalyzerContext, options?: PerformanceAuditOptions): AnalysisResult;
3
10
  //# sourceMappingURL=performance-audit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"performance-audit.d.ts","sourceRoot":"","sources":["../../src/analyzers/performance-audit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,CAuFrE"}
1
+ {"version":3,"file":"performance-audit.d.ts","sourceRoot":"","sources":["../../src/analyzers/performance-audit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;CAC7C;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,uBAA4B,GACpC,cAAc,CAoIhB"}
@@ -1,10 +1,14 @@
1
- import { readFileContent, getRelativePath } from './file-scanner.js';
2
- export function auditPerformance(ctx) {
1
+ import { readFileContent, getRelativePath, selectAnalyzerFiles } from './file-scanner.js';
2
+ export function auditPerformance(ctx, options = {}) {
3
+ const scope = options.scope ?? (options.filePath || options.componentName ? 'target' : 'project');
4
+ const outputMode = options.outputMode ?? (scope === 'project' ? 'focused' : 'summary');
5
+ const maxFindings = normalizeMaxFindings(options.maxFindings, outputMode);
6
+ const selectedFiles = selectFiles(ctx, options, scope);
3
7
  const findings = [];
4
8
  let totalComponents = 0;
5
9
  let memoizedComponents = 0;
6
10
  let inlineObjectCount = 0;
7
- for (const file of ctx.files) {
11
+ for (const file of selectedFiles) {
8
12
  const relPath = getRelativePath(ctx.projectRoot, file);
9
13
  // Skip test fixtures and node_modules
10
14
  if (relPath.includes('__tests__') || relPath.includes('node_modules'))
@@ -14,17 +18,15 @@ export function auditPerformance(ctx) {
14
18
  continue;
15
19
  const content = readFileContent(file);
16
20
  const lines = content.split('\n');
17
- // Detect function components
18
- const componentPattern = /export\s+(?:default\s+)?function\s+([A-Z][a-zA-Z]*)\s*\(/g;
19
- let match;
20
- while ((match = componentPattern.exec(content)) !== null) {
21
+ // 同时支持 `export function X()` 与 `export const X = () => {}` 组件声明。
22
+ for (const componentMatch of findComponentDeclarations(content)) {
21
23
  totalComponents++;
22
- const componentName = match[1];
24
+ const componentName = componentMatch.name;
23
25
  // Check if wrapped in React.memo
24
- const beforeComponent = content.substring(0, match.index);
26
+ const beforeComponent = content.substring(0, componentMatch.index);
25
27
  if (!/React\.memo\s*\(|memo\s*\(/.test(beforeComponent.slice(-200))) {
26
28
  // Check if it's a "pure" component (no hooks that manage state)
27
- const componentBlock = extractFunctionBlock(content, match.index);
29
+ const componentBlock = extractFunctionBlock(content, componentMatch.index);
28
30
  if (!/useState|useReducer|useRef/.test(componentBlock)) {
29
31
  findings.push({
30
32
  severity: 'suggestion',
@@ -32,7 +34,7 @@ export function auditPerformance(ctx) {
32
34
  title: '纯展示组件缺少 React.memo',
33
35
  description: `组件 ${componentName} 无内部状态,适合 memo 优化`,
34
36
  file: relPath,
35
- line: content.substring(0, match.index).split('\n').length,
37
+ line: content.substring(0, componentMatch.index).split('\n').length,
36
38
  suggestion: `用 React.memo(${componentName}) 包裹组件`,
37
39
  });
38
40
  }
@@ -69,18 +71,81 @@ export function auditPerformance(ctx) {
69
71
  }
70
72
  }
71
73
  }
74
+ const sortedFindings = sortFindings(findings, options);
75
+ const limitedFindings = outputMode === 'full'
76
+ ? sortedFindings
77
+ : sortedFindings.slice(0, maxFindings);
78
+ const truncated = limitedFindings.length < sortedFindings.length;
79
+ const targetLabel = describeTarget(options, scope);
80
+ const reportId = truncated ? buildReportId(targetLabel, selectedFiles) : undefined;
72
81
  return {
73
82
  success: true,
74
- summary: `扫描 ${totalComponents} 个组件,发现 ${findings.length} 个性能问题`,
75
- findings,
83
+ summary: buildSummary({
84
+ targetLabel,
85
+ scannedFiles: selectedFiles.length,
86
+ totalComponents,
87
+ totalFindings: sortedFindings.length,
88
+ shownFindings: limitedFindings.length,
89
+ truncated,
90
+ }),
91
+ findings: limitedFindings,
76
92
  metrics: {
93
+ scannedFiles: selectedFiles.length,
77
94
  totalComponents,
78
95
  memoizedComponents,
79
96
  memoizationRate: totalComponents > 0 ? memoizedComponents / totalComponents : 0,
80
97
  inlineObjects: inlineObjectCount,
81
98
  },
99
+ totalFindings: sortedFindings.length,
100
+ truncated,
101
+ reportId,
102
+ data: {
103
+ target: targetLabel,
104
+ scope,
105
+ outputMode,
106
+ scannedFiles: selectedFiles.map((file) => getRelativePath(ctx.projectRoot, file)),
107
+ totalFindings: sortedFindings.length,
108
+ shownFindings: limitedFindings.length,
109
+ truncated,
110
+ reportId,
111
+ },
112
+ _report: reportId ? {
113
+ target: targetLabel,
114
+ scope,
115
+ outputMode,
116
+ scannedFiles: selectedFiles.map((file) => getRelativePath(ctx.projectRoot, file)),
117
+ metrics: {
118
+ scannedFiles: selectedFiles.length,
119
+ totalComponents,
120
+ memoizedComponents,
121
+ memoizationRate: totalComponents > 0 ? memoizedComponents / totalComponents : 0,
122
+ inlineObjects: inlineObjectCount,
123
+ },
124
+ findings: sortedFindings,
125
+ } : undefined,
82
126
  };
83
127
  }
128
+ function findComponentDeclarations(content) {
129
+ const patterns = [
130
+ /export\s+(?:default\s+)?function\s+([A-Z][a-zA-Z0-9_]*)\s*\(/g,
131
+ /export\s+(?:const|let|var)\s+([A-Z][a-zA-Z0-9_]*)\s*=\s*(?:async\s*)?(?:\([^=]*\)|[a-zA-Z_$][\w$]*)\s*=>/g,
132
+ /export\s+(?:const|let|var)\s+([A-Z][a-zA-Z0-9_]*)\s*=\s*function\s*\(/g,
133
+ ];
134
+ const seen = new Set();
135
+ const matches = [];
136
+ for (const pattern of patterns) {
137
+ let match;
138
+ while ((match = pattern.exec(content)) !== null) {
139
+ const name = match[1];
140
+ const key = `${name}:${match.index}`;
141
+ if (seen.has(key))
142
+ continue;
143
+ seen.add(key);
144
+ matches.push({ name, index: match.index });
145
+ }
146
+ }
147
+ return matches.sort((a, b) => a.index - b.index);
148
+ }
84
149
  function extractFunctionBlock(content, startIdx) {
85
150
  let depth = 0;
86
151
  let started = false;
@@ -97,4 +162,78 @@ function extractFunctionBlock(content, startIdx) {
97
162
  }
98
163
  return content.substring(startIdx, Math.min(startIdx + 500, content.length));
99
164
  }
165
+ function normalizeMaxFindings(maxFindings, outputMode) {
166
+ if (outputMode === 'full')
167
+ return Number.MAX_SAFE_INTEGER;
168
+ if (!maxFindings || Number.isNaN(maxFindings)) {
169
+ return outputMode === 'summary' ? 5 : 10;
170
+ }
171
+ return Math.max(1, Math.min(maxFindings, 50));
172
+ }
173
+ function selectFiles(ctx, options, scope) {
174
+ return selectAnalyzerFiles(ctx, {
175
+ filePath: options.filePath,
176
+ componentName: options.componentName,
177
+ scope,
178
+ matchComponent: (file, componentName) => {
179
+ const componentPattern = new RegExp(`(?:^|[^a-zA-Z0-9_])${escapeRegExp(componentName)}(?:[^a-zA-Z0-9_]|$)`);
180
+ return componentPattern.test(readFileContent(file));
181
+ },
182
+ });
183
+ }
184
+ function sortFindings(findings, options) {
185
+ const severityRank = {
186
+ critical: 0,
187
+ warning: 1,
188
+ suggestion: 2,
189
+ info: 3,
190
+ };
191
+ const targetPath = options.filePath?.replace(/\\/g, '/');
192
+ const targetName = options.componentName?.toLowerCase();
193
+ return [...findings].sort((a, b) => {
194
+ const aTarget = getTargetScore(a, targetPath, targetName);
195
+ const bTarget = getTargetScore(b, targetPath, targetName);
196
+ if (aTarget !== bTarget)
197
+ return bTarget - aTarget;
198
+ const severityDiff = severityRank[a.severity] - severityRank[b.severity];
199
+ if (severityDiff !== 0)
200
+ return severityDiff;
201
+ return (a.file ?? '').localeCompare(b.file ?? '');
202
+ });
203
+ }
204
+ function getTargetScore(finding, targetPath, targetName) {
205
+ const file = finding.file?.replace(/\\/g, '/').toLowerCase() ?? '';
206
+ const title = `${finding.title} ${finding.description}`.toLowerCase();
207
+ let score = 0;
208
+ if (targetPath && file.includes(targetPath.toLowerCase()))
209
+ score += 2;
210
+ if (targetName && title.includes(targetName))
211
+ score += 1;
212
+ return score;
213
+ }
214
+ function describeTarget(options, scope) {
215
+ if (options.filePath)
216
+ return `文件 ${options.filePath}`;
217
+ if (options.componentName)
218
+ return `组件 ${options.componentName}`;
219
+ return scope === 'project' ? '当前项目' : '目标范围';
220
+ }
221
+ function buildSummary(params) {
222
+ const { targetLabel, scannedFiles, totalComponents, totalFindings, shownFindings, truncated } = params;
223
+ const base = `已分析${targetLabel},扫描 ${scannedFiles} 个文件、${totalComponents} 个组件,发现 ${totalFindings} 个性能问题`;
224
+ if (!truncated)
225
+ return base;
226
+ return `${base};当前仅返回前 ${shownFindings} 条高优先级发现`;
227
+ }
228
+ function buildReportId(targetLabel, files) {
229
+ const source = `${targetLabel}:${files.join('|')}`;
230
+ let hash = 0;
231
+ for (let i = 0; i < source.length; i++) {
232
+ hash = (hash * 31 + source.charCodeAt(i)) >>> 0;
233
+ }
234
+ return `react-perf-${hash.toString(16)}`;
235
+ }
236
+ function escapeRegExp(value) {
237
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
238
+ }
100
239
  //# sourceMappingURL=performance-audit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"performance-audit.js","sourceRoot":"","sources":["../../src/analyzers/performance-audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"performance-audit.js","sourceRoot":"","sources":["../../src/analyzers/performance-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAW1F,MAAM,UAAU,gBAAgB,CAC9B,GAAoB,EACpB,UAAmC,EAAE;IAErC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClG,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEvD,sCAAsC;QACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,SAAS;QAChF,iEAAiE;QACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,SAAS;QAE/E,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,iEAAiE;QACjE,KAAK,MAAM,cAAc,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,eAAe,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC;YAE1C,iCAAiC;YACjC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;YACnE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACpE,gEAAgE;gBAChE,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC3E,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;oBACvD,QAAQ,CAAC,IAAI,CAAC;wBACZ,QAAQ,EAAE,YAAY;wBACtB,QAAQ,EAAE,cAAc;wBACxB,KAAK,EAAE,oBAAoB;wBAC3B,WAAW,EAAE,MAAM,aAAa,mBAAmB;wBACnD,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;wBACnE,UAAU,EAAE,gBAAgB,aAAa,QAAQ;qBAClD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,kBAAkB,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,oGAAoG;YACpG,MAAM,QAAQ,GAAG,IAAI;iBAClB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;iBACzB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;iBACzB,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAE7B,qBAAqB;YACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE9F,0CAA0C;YAC1C,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,iBAAiB,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,QAAQ,EAAE,eAAe;oBACzB,KAAK,EAAE,WAAW;oBAClB,WAAW,EAAE,sBAAsB;oBACnC,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE;oBACxB,UAAU,EAAE,iBAAiB;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,eAAe,GAAG,UAAU,KAAK,MAAM;QAC3C,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IACjE,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,CAAC;YACpB,WAAW;YACX,YAAY,EAAE,aAAa,CAAC,MAAM;YAClC,eAAe;YACf,aAAa,EAAE,cAAc,CAAC,MAAM;YACpC,aAAa,EAAE,eAAe,CAAC,MAAM;YACrC,SAAS;SACV,CAAC;QACF,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE;YACP,YAAY,EAAE,aAAa,CAAC,MAAM;YAClC,eAAe;YACf,kBAAkB;YAClB,eAAe,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC/E,aAAa,EAAE,iBAAiB;SACjC;QACD,aAAa,EAAE,cAAc,CAAC,MAAM;QACpC,SAAS;QACT,QAAQ;QACR,IAAI,EAAE;YACJ,MAAM,EAAE,WAAW;YACnB,KAAK;YACL,UAAU;YACV,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACjF,aAAa,EAAE,cAAc,CAAC,MAAM;YACpC,aAAa,EAAE,eAAe,CAAC,MAAM;YACrC,SAAS;YACT,QAAQ;SACT;QACD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,WAAW;YACnB,KAAK;YACL,UAAU;YACV,YAAY,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACjF,OAAO,EAAE;gBACP,YAAY,EAAE,aAAa,CAAC,MAAM;gBAClC,eAAe;gBACf,kBAAkB;gBAClB,eAAe,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC/E,aAAa,EAAE,iBAAiB;aACjC;YACD,QAAQ,EAAE,cAAc;SACzB,CAAC,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAe;IAChD,MAAM,QAAQ,GAAG;QACf,+DAA+D;QAC/D,2GAA2G;QAC3G,wEAAwE;KACzE,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAA2C,EAAE,CAAC;IAE3D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe,EAAE,QAAgB;IAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,EAAE,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;QAAC,CAAC;QACpD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACvB,KAAK,EAAE,CAAC;YACR,IAAI,OAAO,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,oBAAoB,CAAC,WAA+B,EAAE,UAAiD;IAC9G,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,gBAAgB,CAAC;IAC1D,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAClB,GAAoB,EACpB,OAAgC,EAChC,KAAoD;IAEpD,OAAO,mBAAmB,CAAC,GAAG,EAAE;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK;QACL,cAAc,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,EAAE;YACtC,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,sBAAsB,YAAY,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;YAC5G,OAAO,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,QAAmB,EAAE,OAAgC;IACzE,MAAM,YAAY,GAAwC;QACxD,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,IAAI,EAAE,CAAC;KACR,CAAC;IACF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;IAExD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,OAAO,GAAG,OAAO,CAAC;QAClD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,YAAY,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC;QAC5C,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB,EAAE,UAAmB,EAAE,UAAmB;IAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;IACtE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACtE,IAAI,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CACrB,OAAgC,EAChC,KAAoD;IAEpD,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,aAAa;QAAE,OAAO,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;IAChE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CAAC,MAOrB;IACC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACvG,MAAM,IAAI,GAAG,MAAM,WAAW,OAAO,YAAY,QAAQ,eAAe,WAAW,aAAa,QAAQ,CAAC;IACzG,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,GAAG,IAAI,WAAW,aAAa,UAAU,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,WAAmB,EAAE,KAAe;IACzD,MAAM,MAAM,GAAG,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,cAAc,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
@@ -4,6 +4,10 @@ export interface AnalysisResult {
4
4
  findings?: Finding[];
5
5
  metrics?: Record<string, number | string>;
6
6
  data?: unknown;
7
+ totalFindings?: number;
8
+ truncated?: boolean;
9
+ reportId?: string;
10
+ _report?: Record<string, unknown>;
7
11
  error?: string;
8
12
  }
9
13
  export interface Finding {