@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.
@@ -91,5 +91,95 @@ export function App() {
91
91
  expect(result.metrics.useEffect).toBe(1);
92
92
  expect(result.metrics.useMemo).toBe(1);
93
93
  });
94
+ it('supports target-scoped review and truncates findings by default', () => {
95
+ mkdirSync(join(tmpDir, 'src', 'components', 'live-player'), { recursive: true });
96
+ const targetFile = join(tmpDir, 'src', 'components', 'live-player', 'index.tsx');
97
+ writeFileSync(targetFile, `
98
+ import { useEffect, useState } from 'react';
99
+ export function LivePlayer({ flag, items }: { flag: boolean; items: string[] }) {
100
+ if (flag) {
101
+ const [count] = useState(0);
102
+ }
103
+ for (const item of items) {
104
+ const [value] = useState(item);
105
+ }
106
+ useEffect(() => {
107
+ const timer = setInterval(() => {}, 1000);
108
+ }, []);
109
+ return null;
110
+ }
111
+ `);
112
+ const result = reviewHooks({ projectRoot: tmpDir, files: [targetFile] }, { filePath: 'src/components/live-player/index.tsx', componentName: 'LivePlayer', scope: 'target', outputMode: 'summary', maxFindings: 2 });
113
+ expect(result.findings).toHaveLength(2);
114
+ expect(result.totalFindings).toBeGreaterThan(2);
115
+ expect(result.truncated).toBe(true);
116
+ expect(result.reportId).toContain('react-hooks-');
117
+ expect(result.summary).toContain('src/components/live-player/index.tsx');
118
+ });
119
+ it('does not flag top-level useEffect after conditional blocks', () => {
120
+ const file = join(tmpDir, 'src', 'LivePlayer.tsx');
121
+ writeFileSync(file, `
122
+ import { useEffect, useState } from 'react';
123
+ export function LivePlayer({ flag }: { flag: boolean }) {
124
+ const [count] = useState(0);
125
+ if (flag) {
126
+ console.log(count);
127
+ }
128
+ useEffect(() => {
129
+ window.addEventListener('resize', () => {});
130
+ return () => window.removeEventListener('resize', () => {});
131
+ }, []);
132
+ return null;
133
+ }
134
+ `);
135
+ const result = reviewHooks({ projectRoot: tmpDir, files: [file] }, { filePath: 'src/LivePlayer.tsx', componentName: 'LivePlayer', scope: 'target', outputMode: 'full' });
136
+ expect(result.findings.some((finding) => finding.category === 'conditional-hook')).toBe(false);
137
+ });
138
+ it('prefers exact file path over component usage matches in target scope', () => {
139
+ mkdirSync(join(tmpDir, 'src', 'pages'), { recursive: true });
140
+ const targetFile = join(tmpDir, 'src', 'LivePlayer.tsx');
141
+ const usageFile = join(tmpDir, 'src', 'pages', 'LiveRoomPage.tsx');
142
+ writeFileSync(targetFile, `
143
+ import { useEffect } from 'react';
144
+ export function LivePlayer() {
145
+ if (Math.random() > 2) {
146
+ useEffect(() => {}, []);
147
+ }
148
+ return null;
149
+ }
150
+ `);
151
+ writeFileSync(usageFile, `
152
+ import { LivePlayer } from '../LivePlayer';
153
+ export function LiveRoomPage() {
154
+ return <LivePlayer />;
155
+ }
156
+ `);
157
+ const result = reviewHooks({ projectRoot: tmpDir, files: [targetFile, usageFile] }, { filePath: 'src/LivePlayer.tsx', componentName: 'LivePlayer', scope: 'target', outputMode: 'full' });
158
+ expect(result.findings.every((finding) => finding.file === 'src/LivePlayer.tsx')).toBe(true);
159
+ });
160
+ it('resolves directory filePath and kebab-case componentName in target scope', () => {
161
+ mkdirSync(join(tmpDir, 'src', 'components', 'live-player'), { recursive: true });
162
+ mkdirSync(join(tmpDir, 'src', 'pages'), { recursive: true });
163
+ const targetFile = join(tmpDir, 'src', 'components', 'live-player', 'LivePlayer.tsx');
164
+ const usageFile = join(tmpDir, 'src', 'pages', 'LiveRoomPage.tsx');
165
+ writeFileSync(targetFile, `
166
+ import { useEffect } from 'react';
167
+ export const LivePlayer = () => {
168
+ if (Math.random() > 2) {
169
+ useEffect(() => {}, []);
170
+ }
171
+ return null;
172
+ }
173
+ `);
174
+ writeFileSync(usageFile, `
175
+ import { LivePlayer } from '../components/live-player/LivePlayer';
176
+ export function LiveRoomPage() {
177
+ return <LivePlayer />;
178
+ }
179
+ `);
180
+ const result = reviewHooks({ projectRoot: tmpDir, files: [targetFile, usageFile] }, { filePath: 'src/components/live-player', componentName: 'live-player', scope: 'target', outputMode: 'full' });
181
+ expect(result.findings.length).toBeGreaterThan(0);
182
+ expect(result.findings.every((finding) => finding.file === 'src/components/live-player/LivePlayer.tsx')).toBe(true);
183
+ });
94
184
  });
95
185
  //# sourceMappingURL=hooks-review.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-review.test.js","sourceRoot":"","sources":["../../../src/analyzers/__tests__/hooks-review.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks-review.test.js","sourceRoot":"","sources":["../../../src/analyzers/__tests__/hooks-review.test.ts"],"names":[],"mappings":"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"}
@@ -38,5 +38,72 @@ export function List() {
38
38
  const result = auditPerformance({ projectRoot: tmpDir, files: [join(tmpDir, 'src', 'A.tsx'), join(tmpDir, 'src', 'B.tsx')] });
39
39
  expect(result.metrics.totalComponents).toBe(2);
40
40
  });
41
+ it('supports target-scoped analysis and truncates findings by default', () => {
42
+ mkdirSync(join(tmpDir, 'src', 'components', 'live-player'), { recursive: true });
43
+ const targetFile = join(tmpDir, 'src', 'components', 'live-player', 'index.tsx');
44
+ writeFileSync(targetFile, `
45
+ export function LivePlayer() {
46
+ return (
47
+ <div style={{ color: 'red' }}>
48
+ <span style={{ fontSize: 12 }}>demo</span>
49
+ <button style={{ marginTop: 8 }}>play</button>
50
+ </div>
51
+ );
52
+ }
53
+ `);
54
+ const otherFile = join(tmpDir, 'src', 'Other.tsx');
55
+ writeFileSync(otherFile, `
56
+ export function Other() {
57
+ return <div style={{ color: 'blue' }}>other</div>;
58
+ }
59
+ `);
60
+ const result = auditPerformance({ projectRoot: tmpDir, files: [targetFile, otherFile] }, { filePath: 'src/components/live-player/index.tsx', componentName: 'LivePlayer', scope: 'target', outputMode: 'summary', maxFindings: 2 });
61
+ expect(result.findings).toHaveLength(2);
62
+ expect(result.totalFindings).toBeGreaterThan(2);
63
+ expect(result.truncated).toBe(true);
64
+ expect(result.reportId).toContain('react-perf-');
65
+ expect(result.summary).toContain('src/components/live-player/index.tsx');
66
+ expect(result.findings.every((finding) => finding.file === 'src/components/live-player/index.tsx')).toBe(true);
67
+ });
68
+ it('prefers exact file path over component usage matches in target scope', () => {
69
+ mkdirSync(join(tmpDir, 'src', 'components', 'live-player'), { recursive: true });
70
+ mkdirSync(join(tmpDir, 'src', 'pages'), { recursive: true });
71
+ const targetFile = join(tmpDir, 'src', 'components', 'live-player', 'index.tsx');
72
+ const usageFile = join(tmpDir, 'src', 'pages', 'LiveRoomPage.tsx');
73
+ writeFileSync(targetFile, `
74
+ export function LivePlayer() {
75
+ return <div style={{ color: 'red' }}>player</div>;
76
+ }
77
+ `);
78
+ writeFileSync(usageFile, `
79
+ import { LivePlayer } from '../components/live-player';
80
+ export function LiveRoomPage() {
81
+ return <section style={{ color: 'blue' }}><LivePlayer /></section>;
82
+ }
83
+ `);
84
+ const result = auditPerformance({ projectRoot: tmpDir, files: [targetFile, usageFile] }, { filePath: 'src/components/live-player/index.tsx', componentName: 'LivePlayer', scope: 'target', outputMode: 'full' });
85
+ expect(result.findings.every((finding) => finding.file === 'src/components/live-player/index.tsx')).toBe(true);
86
+ });
87
+ it('resolves directory filePath and kebab-case componentName to the target component file', () => {
88
+ mkdirSync(join(tmpDir, 'src', 'components', 'live-player'), { recursive: true });
89
+ mkdirSync(join(tmpDir, 'src', 'pages'), { recursive: true });
90
+ const targetFile = join(tmpDir, 'src', 'components', 'live-player', 'LivePlayer.tsx');
91
+ const usageFile = join(tmpDir, 'src', 'pages', 'LiveRoomPage.tsx');
92
+ writeFileSync(targetFile, `
93
+ export const LivePlayer = () => {
94
+ return <div style={{ color: 'red' }}>player</div>;
95
+ }
96
+ `);
97
+ writeFileSync(usageFile, `
98
+ import { LivePlayer } from '../components/live-player/LivePlayer';
99
+ export function LiveRoomPage() {
100
+ return <section style={{ color: 'blue' }}><LivePlayer /></section>;
101
+ }
102
+ `);
103
+ const result = auditPerformance({ projectRoot: tmpDir, files: [targetFile, usageFile] }, { filePath: 'src/components/live-player', componentName: 'live-player', scope: 'target', outputMode: 'full' });
104
+ expect(result.findings.length).toBeGreaterThan(0);
105
+ expect(result.findings.every((finding) => finding.file === 'src/components/live-player/LivePlayer.tsx')).toBe(true);
106
+ expect(result.metrics.totalComponents).toBe(1);
107
+ });
41
108
  });
42
109
  //# sourceMappingURL=performance-audit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"performance-audit.test.js","sourceRoot":"","sources":["../../../src/analyzers/__tests__/performance-audit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QACpD,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE;;;;CAIlD,CAAC,CAAC;QACC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE;;;;;;CAMlD,CAAC,CAAC;QACC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,MAAM,CAAC,QAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACpF,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9H,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"performance-audit.test.js","sourceRoot":"","sources":["../../../src/analyzers/__tests__/performance-audit.test.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,11 @@ export declare function scanFiles(root: string, options?: {
6
6
  }): AnalyzerContext;
7
7
  export declare function readFileContent(filePath: string): string;
8
8
  export declare function getRelativePath(root: string, filePath: string): string;
9
+ export declare function normalizeAnalyzerPath(filePath: string, projectRoot: string): string;
10
+ export declare function selectAnalyzerFiles(ctx: AnalyzerContext, options: {
11
+ filePath?: string;
12
+ componentName?: string;
13
+ scope: 'target' | 'related' | 'project';
14
+ matchComponent?: (file: string, componentName: string) => boolean;
15
+ }): string[];
9
16
  //# sourceMappingURL=file-scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/analyzers/file-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,eAAe,CAuBjB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE"}
1
+ {"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/analyzers/file-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,eAAe,CAuBjB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC;CACnE,GACA,MAAM,EAAE,CAuCV"}
@@ -1,5 +1,5 @@
1
1
  import { readdirSync, statSync, readFileSync } from 'fs';
2
- import { join, extname, relative } from 'path';
2
+ import { join, extname, relative, basename } from 'path';
3
3
  const DEFAULT_IGNORE = ['node_modules', 'dist', 'build', '.git', '.next', 'coverage'];
4
4
  const REACT_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'];
5
5
  export function scanFiles(root, options) {
@@ -32,4 +32,112 @@ export function readFileContent(filePath) {
32
32
  export function getRelativePath(root, filePath) {
33
33
  return relative(root, filePath);
34
34
  }
35
+ export function normalizeAnalyzerPath(filePath, projectRoot) {
36
+ return filePath.replace(projectRoot, '').replace(/\\/g, '/').replace(/^\/+/, '');
37
+ }
38
+ export function selectAnalyzerFiles(ctx, options) {
39
+ const { filePath, componentName, scope, matchComponent } = options;
40
+ if (scope === 'project')
41
+ return ctx.files;
42
+ const normalizedFilePath = filePath
43
+ ? normalizeAnalyzerPath(filePath, ctx.projectRoot)
44
+ : undefined;
45
+ const componentCandidates = buildComponentCandidates(componentName, normalizedFilePath);
46
+ if (normalizedFilePath) {
47
+ const exactFiles = ctx.files.filter((file) => {
48
+ const relPath = normalizeAnalyzerPath(getRelativePath(ctx.projectRoot, file), ctx.projectRoot);
49
+ return relPath === normalizedFilePath;
50
+ });
51
+ const fallbackFiles = exactFiles.length > 0
52
+ ? exactFiles
53
+ : findFallbackPathMatches(ctx, normalizedFilePath, componentCandidates);
54
+ if (scope === 'target') {
55
+ return fallbackFiles.length > 0 ? fallbackFiles : ctx.files;
56
+ }
57
+ const related = new Set(fallbackFiles);
58
+ const directory = parentDir(normalizedFilePath);
59
+ for (const file of ctx.files) {
60
+ if (related.size >= 5)
61
+ break;
62
+ const relPath = normalizeAnalyzerPath(getRelativePath(ctx.projectRoot, file), ctx.projectRoot);
63
+ if (directory && relPath.startsWith(directory)) {
64
+ related.add(file);
65
+ }
66
+ }
67
+ return related.size > 0 ? Array.from(related) : ctx.files;
68
+ }
69
+ if (componentName && matchComponent) {
70
+ const matched = ctx.files.filter((file) => componentCandidates.some((candidate) => matchComponent(file, candidate)));
71
+ if (matched.length > 0)
72
+ return matched;
73
+ }
74
+ return ctx.files;
75
+ }
76
+ function parentDir(filePath) {
77
+ const index = filePath.lastIndexOf('/');
78
+ return index >= 0 ? filePath.slice(0, index + 1) : '';
79
+ }
80
+ function findFallbackPathMatches(ctx, normalizedFilePath, componentCandidates) {
81
+ const targetPath = normalizedFilePath.replace(/\/+$/, '');
82
+ const targetDirectory = `${targetPath}/`;
83
+ const targetBaseName = basename(targetPath).toLowerCase();
84
+ const directoryMatches = [];
85
+ for (const file of ctx.files) {
86
+ const relPath = normalizeAnalyzerPath(getRelativePath(ctx.projectRoot, file), ctx.projectRoot);
87
+ const relPathLower = relPath.toLowerCase();
88
+ const relPathWithoutExt = relPathLower.replace(/\.[^.]+$/, '');
89
+ const fileBaseName = basename(relPathLower).replace(/\.[^.]+$/, '');
90
+ let score = 0;
91
+ if (relPathLower === targetPath.toLowerCase())
92
+ score += 5;
93
+ if (relPathWithoutExt === targetPath.toLowerCase())
94
+ score += 4;
95
+ if (relPathLower.startsWith(targetDirectory.toLowerCase()))
96
+ score += 3;
97
+ if (fileBaseName === targetBaseName)
98
+ score += 2;
99
+ if (componentCandidates.some((candidate) => candidate.toLowerCase() === fileBaseName))
100
+ score += 4;
101
+ if (score > 0) {
102
+ directoryMatches.push({ file, score });
103
+ }
104
+ }
105
+ return directoryMatches
106
+ .sort((a, b) => b.score - a.score || a.file.localeCompare(b.file))
107
+ .map((item) => item.file);
108
+ }
109
+ function buildComponentCandidates(componentName, normalizedFilePath) {
110
+ const values = new Set();
111
+ const addCandidate = (value) => {
112
+ if (!value)
113
+ return;
114
+ const trimmed = value.trim();
115
+ if (!trimmed)
116
+ return;
117
+ values.add(trimmed);
118
+ values.add(toPascalCase(trimmed));
119
+ values.add(toCamelCase(trimmed));
120
+ };
121
+ addCandidate(componentName);
122
+ if (normalizedFilePath) {
123
+ const fileBaseName = basename(normalizedFilePath).replace(/\.[^.]+$/, '');
124
+ addCandidate(fileBaseName);
125
+ const directoryBaseName = basename(normalizedFilePath.replace(/\/+$/, ''));
126
+ if (directoryBaseName && directoryBaseName !== fileBaseName) {
127
+ addCandidate(directoryBaseName);
128
+ }
129
+ }
130
+ return Array.from(values);
131
+ }
132
+ function toPascalCase(value) {
133
+ return value
134
+ .split(/[^a-zA-Z0-9]+/)
135
+ .filter(Boolean)
136
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
137
+ .join('');
138
+ }
139
+ function toCamelCase(value) {
140
+ const pascal = toPascalCase(value);
141
+ return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : '';
142
+ }
35
143
  //# sourceMappingURL=file-scanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/analyzers/file-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAG/C,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACtF,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAExD,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,OAIC;IAED,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,gBAAgB,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,cAAc,CAAC;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,IAAI,CAAC,GAAW;QACvB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,OAAO,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/analyzers/file-scanner.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
1
  import type { AnalysisResult, AnalyzerContext } from './types.js';
2
- export declare function reviewHooks(ctx: AnalyzerContext): AnalysisResult;
2
+ export interface HooksReviewOptions {
3
+ filePath?: string;
4
+ componentName?: string;
5
+ scope?: 'target' | 'related' | 'project';
6
+ maxFindings?: number;
7
+ outputMode?: 'summary' | 'focused' | 'full';
8
+ }
9
+ export declare function reviewHooks(ctx: AnalyzerContext, options?: HooksReviewOptions): AnalysisResult;
3
10
  //# sourceMappingURL=hooks-review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-review.d.ts","sourceRoot":"","sources":["../../src/analyzers/hooks-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAW3E,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,CAqIhE"}
1
+ {"version":3,"file":"hooks-review.d.ts","sourceRoot":"","sources":["../../src/analyzers/hooks-review.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAW,eAAe,EAAE,MAAM,YAAY,CAAC;AAS3E,MAAM,WAAW,kBAAkB;IACjC,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,WAAW,CACzB,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,kBAAuB,GAC/B,cAAc,CAuGhB"}