codereview-aia 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/analysis/static/wpPhpcsRunner.d.ts +11 -0
  2. package/dist/analysis/static/wpPhpcsRunner.js +219 -0
  3. package/dist/analysis/static/wpPhpcsRunner.js.map +1 -0
  4. package/dist/clients/implementations/openRouterClient.js +2 -2
  5. package/dist/clients/implementations/openRouterClient.js.map +1 -1
  6. package/dist/clients/openRouterClient.js +2 -2
  7. package/dist/clients/openRouterClient.js.map +1 -1
  8. package/dist/clients/utils/promptFormatter.d.ts +3 -2
  9. package/dist/clients/utils/promptFormatter.js +82 -24
  10. package/dist/clients/utils/promptFormatter.js.map +1 -1
  11. package/dist/core/ConfigurationService.d.ts +21 -0
  12. package/dist/core/ConfigurationService.js +39 -0
  13. package/dist/core/ConfigurationService.js.map +1 -1
  14. package/dist/core/handlers/FileProcessingHandler.js +5 -0
  15. package/dist/core/handlers/FileProcessingHandler.js.map +1 -1
  16. package/dist/core/reviewOrchestrator.js +61 -1
  17. package/dist/core/reviewOrchestrator.js.map +1 -1
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.js +0 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/runtime/cliEntry.js +57 -4
  22. package/dist/runtime/cliEntry.js.map +1 -1
  23. package/dist/runtime/fileCollector.d.ts +10 -1
  24. package/dist/runtime/fileCollector.js +217 -2
  25. package/dist/runtime/fileCollector.js.map +1 -1
  26. package/dist/runtime/reporting/markdownReportBuilder.d.ts +2 -0
  27. package/dist/runtime/reporting/markdownReportBuilder.js +57 -0
  28. package/dist/runtime/reporting/markdownReportBuilder.js.map +1 -1
  29. package/dist/runtime/reviewPipeline.d.ts +22 -3
  30. package/dist/runtime/reviewPipeline.js +46 -7
  31. package/dist/runtime/reviewPipeline.js.map +1 -1
  32. package/dist/runtime/runAiCodeReview.d.ts +19 -1
  33. package/dist/runtime/runAiCodeReview.js +243 -8
  34. package/dist/runtime/runAiCodeReview.js.map +1 -1
  35. package/dist/runtime/ui/RuntimeApp.js +15 -4
  36. package/dist/runtime/ui/RuntimeApp.js.map +1 -1
  37. package/dist/runtime/ui/screens/ProgressScreen.d.ts +6 -1
  38. package/dist/runtime/ui/screens/ProgressScreen.js +28 -2
  39. package/dist/runtime/ui/screens/ProgressScreen.js.map +1 -1
  40. package/dist/runtime/ui/screens/ResultsScreen.js +8 -1
  41. package/dist/runtime/ui/screens/ResultsScreen.js.map +1 -1
  42. package/dist/types/review.d.ts +60 -0
  43. package/dist/utils/detection/frameworkDetector.js +55 -0
  44. package/dist/utils/detection/frameworkDetector.js.map +1 -1
  45. package/dist/utils/promptTemplateManager.js +1 -0
  46. package/dist/utils/promptTemplateManager.js.map +1 -1
  47. package/package.json +13 -10
  48. package/.cr-aia.yml +0 -23
  49. package/.crignore +0 -0
  50. package/src/analysis/FindingsExtractor.ts +0 -431
  51. package/src/analysis/ai-detection/analyzers/BaseAnalyzer.ts +0 -267
  52. package/src/analysis/ai-detection/analyzers/DocumentationAnalyzer.ts +0 -622
  53. package/src/analysis/ai-detection/analyzers/GitHistoryAnalyzer.ts +0 -430
  54. package/src/analysis/ai-detection/core/AIDetectionEngine.ts +0 -467
  55. package/src/analysis/ai-detection/types/DetectionTypes.ts +0 -406
  56. package/src/analysis/ai-detection/utils/SubmissionConverter.ts +0 -390
  57. package/src/analysis/context/ReviewContext.ts +0 -378
  58. package/src/analysis/context/index.ts +0 -7
  59. package/src/analysis/index.ts +0 -8
  60. package/src/analysis/tokens/TokenAnalysisFormatter.ts +0 -154
  61. package/src/analysis/tokens/TokenAnalyzer.ts +0 -747
  62. package/src/analysis/tokens/index.ts +0 -8
  63. package/src/clients/base/abstractClient.ts +0 -190
  64. package/src/clients/base/httpClient.ts +0 -160
  65. package/src/clients/base/index.ts +0 -12
  66. package/src/clients/base/modelDetection.ts +0 -107
  67. package/src/clients/base/responseProcessor.ts +0 -586
  68. package/src/clients/factory/clientFactory.ts +0 -55
  69. package/src/clients/factory/index.ts +0 -8
  70. package/src/clients/implementations/index.ts +0 -8
  71. package/src/clients/implementations/openRouterClient.ts +0 -411
  72. package/src/clients/openRouterClient.ts +0 -863
  73. package/src/clients/openRouterClientWrapper.ts +0 -44
  74. package/src/clients/utils/directoryStructure.ts +0 -52
  75. package/src/clients/utils/index.ts +0 -11
  76. package/src/clients/utils/languageDetection.ts +0 -44
  77. package/src/clients/utils/promptFormatter.ts +0 -105
  78. package/src/clients/utils/promptLoader.ts +0 -53
  79. package/src/clients/utils/tokenCounter.ts +0 -297
  80. package/src/core/ApiClientSelector.ts +0 -37
  81. package/src/core/ConfigurationService.ts +0 -591
  82. package/src/core/ConsolidationService.ts +0 -423
  83. package/src/core/InteractiveDisplayManager.ts +0 -81
  84. package/src/core/OutputManager.ts +0 -275
  85. package/src/core/ReviewGenerator.ts +0 -140
  86. package/src/core/fileDiscovery.ts +0 -237
  87. package/src/core/handlers/EstimationHandler.ts +0 -104
  88. package/src/core/handlers/FileProcessingHandler.ts +0 -204
  89. package/src/core/handlers/OutputHandler.ts +0 -125
  90. package/src/core/handlers/ReviewExecutor.ts +0 -104
  91. package/src/core/reviewOrchestrator.ts +0 -333
  92. package/src/core/utils/ModelInfoUtils.ts +0 -56
  93. package/src/formatters/outputFormatter.ts +0 -62
  94. package/src/formatters/utils/IssueFormatters.ts +0 -83
  95. package/src/formatters/utils/JsonFormatter.ts +0 -77
  96. package/src/formatters/utils/MarkdownFormatters.ts +0 -609
  97. package/src/formatters/utils/MetadataFormatter.ts +0 -269
  98. package/src/formatters/utils/ModelInfoExtractor.ts +0 -115
  99. package/src/index.ts +0 -28
  100. package/src/plugins/PluginInterface.ts +0 -50
  101. package/src/plugins/PluginManager.ts +0 -126
  102. package/src/prompts/PromptManager.ts +0 -69
  103. package/src/prompts/cache/PromptCache.ts +0 -50
  104. package/src/prompts/promptText/common/variables/css-frameworks.json +0 -33
  105. package/src/prompts/promptText/common/variables/framework-versions.json +0 -45
  106. package/src/prompts/promptText/frameworks/react/comprehensive.hbs +0 -19
  107. package/src/prompts/promptText/languages/css/comprehensive.hbs +0 -18
  108. package/src/prompts/promptText/languages/generic/comprehensive.hbs +0 -20
  109. package/src/prompts/promptText/languages/html/comprehensive.hbs +0 -18
  110. package/src/prompts/promptText/languages/javascript/comprehensive.hbs +0 -18
  111. package/src/prompts/promptText/languages/python/comprehensive.hbs +0 -18
  112. package/src/prompts/promptText/languages/typescript/comprehensive.hbs +0 -18
  113. package/src/runtime/auth/service.ts +0 -58
  114. package/src/runtime/auth/session.ts +0 -103
  115. package/src/runtime/auth/types.ts +0 -11
  116. package/src/runtime/cliEntry.ts +0 -196
  117. package/src/runtime/debug/logManager.ts +0 -37
  118. package/src/runtime/errors.ts +0 -13
  119. package/src/runtime/fileCollector.ts +0 -222
  120. package/src/runtime/manifest.ts +0 -64
  121. package/src/runtime/openrouterProxy.ts +0 -45
  122. package/src/runtime/preprod/webCheck.ts +0 -104
  123. package/src/runtime/proxyConfig.ts +0 -94
  124. package/src/runtime/proxyEnvironment.ts +0 -71
  125. package/src/runtime/reportMerge.ts +0 -102
  126. package/src/runtime/reporting/markdownReportBuilder.ts +0 -138
  127. package/src/runtime/reporting/reportDataCollector.ts +0 -234
  128. package/src/runtime/reporting/summaryGenerator.ts +0 -86
  129. package/src/runtime/reviewPipeline.ts +0 -161
  130. package/src/runtime/runAiCodeReview.ts +0 -153
  131. package/src/runtime/runtimeConfig.ts +0 -5
  132. package/src/runtime/ui/Layout.tsx +0 -57
  133. package/src/runtime/ui/RuntimeApp.tsx +0 -233
  134. package/src/runtime/ui/inkModules.ts +0 -73
  135. package/src/runtime/ui/screens/AuthScreen.tsx +0 -128
  136. package/src/runtime/ui/screens/ModeSelection.tsx +0 -185
  137. package/src/runtime/ui/screens/ProgressScreen.tsx +0 -62
  138. package/src/runtime/ui/screens/ResultsScreen.tsx +0 -83
  139. package/src/strategies/ArchitecturalReviewStrategy.ts +0 -54
  140. package/src/strategies/CodingTestReviewStrategy.ts +0 -920
  141. package/src/strategies/ConsolidatedReviewStrategy.ts +0 -59
  142. package/src/strategies/ExtractPatternsReviewStrategy.ts +0 -64
  143. package/src/strategies/MultiPassReviewStrategy.ts +0 -785
  144. package/src/strategies/ReviewStrategy.ts +0 -64
  145. package/src/strategies/StrategyFactory.ts +0 -79
  146. package/src/strategies/index.ts +0 -14
  147. package/src/tokenizers/baseTokenizer.ts +0 -61
  148. package/src/tokenizers/gptTokenizer.ts +0 -27
  149. package/src/tokenizers/index.ts +0 -8
  150. package/src/types/apiResponses.ts +0 -40
  151. package/src/types/cli.ts +0 -24
  152. package/src/types/common.ts +0 -39
  153. package/src/types/configuration.ts +0 -201
  154. package/src/types/handlebars.d.ts +0 -5
  155. package/src/types/patch.d.ts +0 -25
  156. package/src/types/review.ts +0 -294
  157. package/src/types/reviewContext.d.ts +0 -65
  158. package/src/types/reviewSchema.ts +0 -181
  159. package/src/types/structuredReview.ts +0 -167
  160. package/src/types/tokenAnalysis.ts +0 -56
  161. package/src/utils/FileReader.ts +0 -93
  162. package/src/utils/FileWriter.ts +0 -76
  163. package/src/utils/PathGenerator.ts +0 -97
  164. package/src/utils/api/apiUtils.ts +0 -14
  165. package/src/utils/api/index.ts +0 -1
  166. package/src/utils/apiErrorHandler.ts +0 -287
  167. package/src/utils/ciDataCollector.ts +0 -252
  168. package/src/utils/codingTestConfigLoader.ts +0 -466
  169. package/src/utils/dependencies/aiDependencyAnalyzer.ts +0 -454
  170. package/src/utils/detection/frameworkDetector.ts +0 -879
  171. package/src/utils/detection/index.ts +0 -10
  172. package/src/utils/detection/projectTypeDetector.ts +0 -518
  173. package/src/utils/diagramGenerator.ts +0 -206
  174. package/src/utils/errorLogger.ts +0 -60
  175. package/src/utils/estimationUtils.ts +0 -407
  176. package/src/utils/fileFilters.ts +0 -373
  177. package/src/utils/fileSystem.ts +0 -57
  178. package/src/utils/index.ts +0 -36
  179. package/src/utils/logger.ts +0 -290
  180. package/src/utils/pathValidator.ts +0 -98
  181. package/src/utils/priorityFilter.ts +0 -59
  182. package/src/utils/projectDocs.ts +0 -189
  183. package/src/utils/promptPaths.ts +0 -29
  184. package/src/utils/promptTemplateManager.ts +0 -157
  185. package/src/utils/review/consolidateReview.ts +0 -553
  186. package/src/utils/review/fixDisplay.ts +0 -100
  187. package/src/utils/review/fixImplementation.ts +0 -61
  188. package/src/utils/review/index.ts +0 -36
  189. package/src/utils/review/interactiveProcessing.ts +0 -294
  190. package/src/utils/review/progressTracker.ts +0 -296
  191. package/src/utils/review/reviewExtraction.ts +0 -382
  192. package/src/utils/review/types.ts +0 -46
  193. package/src/utils/reviewActionHandler.ts +0 -18
  194. package/src/utils/reviewParser.ts +0 -253
  195. package/src/utils/sanitizer.ts +0 -238
  196. package/src/utils/smartFileSelector.ts +0 -255
  197. package/src/utils/templateLoader.ts +0 -514
  198. package/src/utils/treeGenerator.ts +0 -153
  199. package/tsconfig.build.json +0 -14
  200. package/tsconfig.json +0 -59
@@ -1,238 +0,0 @@
1
- /**
2
- * @fileoverview Content sanitization utilities for preventing XSS attacks.
3
- *
4
- * This module provides sanitization functions to clean user-generated or AI-generated
5
- * content before rendering or storing it. It uses DOMPurify to remove potentially
6
- * malicious HTML, JavaScript, and other harmful content while preserving legitimate
7
- * formatting elements. It also includes utilities for sanitizing filenames to ensure
8
- * they are safe for use in file systems.
9
- */
10
-
11
- import createDOMPurify from 'dompurify';
12
- import { JSDOM } from 'jsdom';
13
- import logger from './logger';
14
-
15
- // Create a DOM window for DOMPurify
16
- const { window } = new JSDOM('');
17
- // Cast window for DOMPurify compatibility
18
- const DOMPurify = createDOMPurify(window);
19
-
20
- /**
21
- * Sanitizes HTML content to prevent Cross-Site Scripting (XSS) attacks.
22
- *
23
- * This function uses DOMPurify to clean HTML content by:
24
- * 1. Allowing only safe HTML tags (h1-h6, p, lists, tables, etc.)
25
- * 2. Allowing only safe attributes (href, class, id, etc.)
26
- * 3. Explicitly forbidding dangerous tags (script, iframe, svg, etc.)
27
- * 4. Explicitly forbidding dangerous attributes (onerror, onclick, etc.)
28
- *
29
- * If sanitization fails for any reason, it returns an empty string for safety.
30
- *
31
- * @param {string} content - The HTML content to sanitize
32
- * @returns {string} Sanitized HTML with potentially dangerous content removed
33
- *
34
- * @example
35
- * const unsafeHtml = '<div>Safe content</div><script>alert("XSS")</script>';
36
- * const safeHtml = sanitizeHtml(unsafeHtml);
37
- * // Returns: "<div>Safe content</div>"
38
- *
39
- * @throws Catches internally and returns empty string if DOMPurify fails
40
- */
41
- export function sanitizeHtml(content: string): string {
42
- try {
43
- // Configure DOMPurify to allow certain tags and attributes
44
- const sanitized = DOMPurify.sanitize(content, {
45
- ALLOWED_TAGS: [
46
- 'h1',
47
- 'h2',
48
- 'h3',
49
- 'h4',
50
- 'h5',
51
- 'h6',
52
- 'p',
53
- 'br',
54
- 'hr',
55
- 'ul',
56
- 'ol',
57
- 'li',
58
- 'b',
59
- 'i',
60
- 'strong',
61
- 'em',
62
- 'code',
63
- 'pre',
64
- 'a',
65
- 'span',
66
- 'div',
67
- 'table',
68
- 'thead',
69
- 'tbody',
70
- 'tr',
71
- 'th',
72
- 'td',
73
- ],
74
- ALLOWED_ATTR: ['href', 'target', 'rel', 'class', 'id', 'style'],
75
- FORBID_TAGS: [
76
- 'script',
77
- 'iframe',
78
- 'object',
79
- 'embed',
80
- 'form',
81
- 'input',
82
- 'button',
83
- 'style',
84
- 'link',
85
- 'meta',
86
- 'base',
87
- 'applet',
88
- 'math',
89
- 'svg',
90
- ],
91
- FORBID_ATTR: [
92
- 'onerror',
93
- 'onload',
94
- 'onclick',
95
- 'onmouseover',
96
- 'onmouseout',
97
- 'onmousedown',
98
- 'onmouseup',
99
- 'onkeydown',
100
- 'onkeyup',
101
- 'onkeypress',
102
- 'onfocus',
103
- 'onblur',
104
- 'onchange',
105
- 'onsubmit',
106
- 'onreset',
107
- 'javascript:',
108
- 'data:',
109
- 'vbscript:',
110
- ],
111
- });
112
-
113
- return sanitized;
114
- } catch (error) {
115
- logger.error('Error sanitizing HTML content:', error);
116
- // Return a safe fallback if sanitization fails
117
- return '';
118
- }
119
- }
120
-
121
- /**
122
- * Sanitize Markdown content
123
- * @param content Markdown content to sanitize
124
- * @returns Sanitized Markdown content
125
- */
126
- export function sanitizeMarkdown(content: string): string {
127
- try {
128
- // Remove potentially harmful content
129
- const sanitized = content
130
- // Remove HTML comments
131
- .replace(/<!--[\s\S]*?-->/g, '')
132
- // Remove script tags and their content
133
- .replace(/<script[\s\S]*?<\/script>/gi, '')
134
- // Remove iframe tags and their content
135
- .replace(/<iframe[\s\S]*?<\/iframe>/gi, '')
136
- // Remove style tags and their content
137
- .replace(/<style[\s\S]*?<\/style>/gi, '')
138
- // Remove event handlers
139
- .replace(/\son\w+\s*=\s*["']?[^"']*["']?/gi, '')
140
- // Remove javascript: URLs
141
- .replace(/javascript\s*:/gi, 'removed:')
142
- // Remove data: URLs
143
- .replace(/data\s*:/gi, 'removed:')
144
- // Remove vbscript: URLs
145
- .replace(/vbscript\s*:/gi, 'removed:');
146
-
147
- return sanitized;
148
- } catch (error) {
149
- logger.error('Error sanitizing Markdown content:', error);
150
- // Return a safe fallback if sanitization fails
151
- return '';
152
- }
153
- }
154
-
155
- /**
156
- * Sanitize JSON content
157
- * @param content JSON content to sanitize
158
- * @returns Sanitized JSON content
159
- */
160
- export function sanitizeJson(content: string): string {
161
- try {
162
- // Parse and stringify to ensure valid JSON
163
- const parsed = JSON.parse(content);
164
- return JSON.stringify(parsed);
165
- } catch (error) {
166
- logger.error('Error sanitizing JSON content:', error);
167
- // Return a safe fallback if sanitization fails
168
- return '{}';
169
- }
170
- }
171
-
172
- /**
173
- * Sanitizes content based on its type to prevent security vulnerabilities.
174
- *
175
- * This function acts as a dispatcher that routes the content to the appropriate
176
- * specialized sanitization function based on the content type. It supports
177
- * HTML, Markdown, JSON, and plain text formats, each with type-specific
178
- * sanitization rules.
179
- *
180
- * @param {string} content - The content to sanitize
181
- * @param {('html'|'markdown'|'json'|'text')} [contentType='text'] - The type of content
182
- * @returns {string} Sanitized content safe for rendering or storage
183
- *
184
- * @example
185
- * // Sanitize HTML content
186
- * const safeHtml = sanitizeContent('<script>alert("XSS")</script><p>Hello</p>', 'html');
187
- * // Returns: "<p>Hello</p>"
188
- *
189
- * @example
190
- * // Sanitize Markdown content
191
- * const safeMarkdown = sanitizeContent('# Title\n<script>alert("XSS")</script>', 'markdown');
192
- * // Returns: "# Title\n"
193
- *
194
- * @example
195
- * // Sanitize JSON content
196
- * const safeJson = sanitizeContent('{"key": "value"}', 'json');
197
- * // Returns: '{"key":"value"}'
198
- */
199
- export function sanitizeContent(
200
- content: string,
201
- contentType: 'html' | 'markdown' | 'json' | 'text' = 'text',
202
- ): string {
203
- switch (contentType) {
204
- case 'html':
205
- return sanitizeHtml(content);
206
- case 'markdown':
207
- return sanitizeMarkdown(content);
208
- case 'json':
209
- return sanitizeJson(content);
210
- default:
211
- // For plain text, just remove control characters except for newlines and tabs
212
- // eslint-disable-next-line no-control-regex
213
- return content.replace(/[\x00-\x09\x0B-\x1F\x7F]/g, '');
214
- }
215
- }
216
-
217
- /**
218
- * Sanitize a filename to ensure it's safe for use in file systems
219
- *
220
- * This function removes or replaces characters that are not safe for use in filenames
221
- * across different operating systems. It handles null/undefined inputs and preserves
222
- * spaces and non-ASCII characters that are generally safe for modern file systems.
223
- *
224
- * @param filename The filename to sanitize
225
- * @returns A sanitized filename safe for use in file systems
226
- */
227
- export function sanitizeFilename(filename: string | null | undefined): string {
228
- // Handle null or undefined
229
- if (filename === null || filename === undefined) {
230
- return '';
231
- }
232
-
233
- // Replace invalid characters with underscores
234
- // This regex matches characters that are generally unsafe in filenames across platforms:
235
- // / \ : * ? " < > | and control characters
236
- // eslint-disable-next-line no-control-regex
237
- return filename.replace(/[/\\:*?"<>|\x00-\x1F\x7F]/g, '_');
238
- }
@@ -1,255 +0,0 @@
1
- /**
2
- * @fileoverview Smart file selection module based on project configuration files.
3
- *
4
- * This module provides enhanced file selection functionality by respecting
5
- * project configuration files like tsconfig.json and .eslintignore in addition
6
- * to .gitignore patterns.
7
- */
8
-
9
- import * as fs from 'node:fs';
10
- import * as path from 'node:path';
11
- import { loadGitignorePatterns, shouldExcludeFile } from './fileFilters';
12
- import logger from './logger';
13
-
14
- /**
15
- * Interface for TypeScript configuration file
16
- */
17
- interface TsConfig {
18
- include?: string[];
19
- exclude?: string[];
20
- files?: string[];
21
- compilerOptions?: Record<string, unknown>;
22
- }
23
-
24
- /**
25
- * Load ESLint ignore patterns from a project directory
26
- * @param projectDir Project directory path
27
- * @returns Array of ESLint ignore patterns
28
- */
29
- export async function loadEslintIgnorePatterns(projectDir: string): Promise<string[]> {
30
- try {
31
- const eslintIgnorePath = path.join(projectDir, '.eslintignore');
32
-
33
- // Check if .eslintignore exists
34
- try {
35
- await fs.promises.access(eslintIgnorePath);
36
- } catch (_error) {
37
- // File doesn't exist
38
- logger.debug(`No .eslintignore file found at ${eslintIgnorePath}`);
39
- return [];
40
- }
41
-
42
- // Read and parse .eslintignore
43
- const content = await fs.promises.readFile(eslintIgnorePath, 'utf-8');
44
- if (!content) {
45
- return [];
46
- }
47
- return content
48
- .split('\n')
49
- .map((line) => line.trim())
50
- .filter((line) => line && !line.startsWith('#'));
51
- } catch (error) {
52
- // Only log as error if it's not just a file not found issue
53
- if (error instanceof Error && (error as NodeJS.ErrnoException).code !== 'ENOENT') {
54
- logger.error(`Error reading .eslintignore: ${error}`);
55
- } else {
56
- const eslintIgnorePath = path.join(projectDir, '.eslintignore');
57
- logger.debug(`No .eslintignore file found at ${eslintIgnorePath}`);
58
- }
59
- return [];
60
- }
61
- }
62
-
63
- /**
64
- * Load TypeScript configuration from a project directory
65
- * @param projectDir Project directory path
66
- * @returns TypeScript configuration or null if not found
67
- */
68
- export async function loadTsConfig(projectDir: string): Promise<TsConfig | null> {
69
- try {
70
- const tsConfigPath = path.join(projectDir, 'tsconfig.json');
71
-
72
- // Check if tsconfig.json exists
73
- try {
74
- await fs.promises.access(tsConfigPath);
75
- } catch (_error) {
76
- // File doesn't exist
77
- logger.debug(`No tsconfig.json file found at ${tsConfigPath}`);
78
- return null;
79
- }
80
-
81
- // Read and parse tsconfig.json
82
- const content = await fs.promises.readFile(tsConfigPath, 'utf-8');
83
- if (!content) {
84
- return null;
85
- }
86
- try {
87
- return JSON.parse(content) as TsConfig;
88
- } catch (parseError) {
89
- logger.error(`Error parsing tsconfig.json: ${parseError}`);
90
- return null;
91
- }
92
- } catch (error) {
93
- // Only log as error if it's not just a file not found issue
94
- if (error instanceof Error && (error as NodeJS.ErrnoException).code !== 'ENOENT') {
95
- logger.error(`Error reading tsconfig.json: ${error}`);
96
- } else {
97
- const tsConfigPath = path.join(projectDir, 'tsconfig.json');
98
- logger.debug(`No tsconfig.json file found at ${tsConfigPath}`);
99
- }
100
- return null;
101
- }
102
- }
103
-
104
- /**
105
- * Convert TypeScript glob patterns to regex patterns
106
- * @param pattern TypeScript glob pattern
107
- * @returns Regular expression pattern
108
- */
109
- function convertTsGlobToRegex(pattern: string): RegExp {
110
- // Escape special regex characters first, but preserve glob patterns
111
- let regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\?/g, '[^/]');
112
-
113
- // Handle ** patterns (match zero or more directories)
114
- // **/ at the beginning means match any number of directories
115
- // /** at the end means match any number of directories
116
- // /**/ in the middle means match any number of directories
117
- regexPattern = regexPattern
118
- .replace(/\*\*\//g, '(?:.*/)?') // **/ matches zero or more directories
119
- .replace(/\/\*\*/g, '(?:/.*)?') // /** matches zero or more directories
120
- .replace(/\*\*/g, '.*'); // ** by itself matches anything
121
-
122
- // Handle single * patterns (match anything except directory separators)
123
- regexPattern = regexPattern.replace(/\*/g, '[^/]*');
124
-
125
- // Create regex that matches both full paths and relative paths
126
- // The pattern should match if:
127
- // 1. The full path matches the pattern
128
- // 2. The relative path matches the pattern
129
- // 3. The pattern matches from any directory level
130
- return new RegExp(`(^|/)${regexPattern}$`, 'i');
131
- }
132
-
133
- /**
134
- * Check if a file matches TypeScript configuration
135
- * @param filePath File path
136
- * @param tsConfig TypeScript configuration
137
- * @param projectDir Project directory path
138
- * @returns True if the file should be included based on TypeScript configuration
139
- */
140
- export function matchesTsConfig(filePath: string, tsConfig: TsConfig, projectDir: string): boolean {
141
- // If tsconfig.json doesn't exist, include all files
142
- if (!tsConfig) {
143
- return true;
144
- }
145
-
146
- // Convert Windows paths to Unix-style for consistent pattern matching
147
- const normalizedPath = filePath.replace(/\\/g, '/');
148
- const relativePath = path.relative(projectDir, filePath).replace(/\\/g, '/');
149
-
150
- // If files array is provided, only include files explicitly listed
151
- if (tsConfig.files && tsConfig.files.length > 0) {
152
- return tsConfig.files.some((file) => {
153
- const normalizedFile = file.replace(/\\/g, '/');
154
- return relativePath === normalizedFile;
155
- });
156
- }
157
-
158
- // Check exclude patterns first
159
- if (tsConfig.exclude && tsConfig.exclude.length > 0) {
160
- for (const pattern of tsConfig.exclude) {
161
- const regex = convertTsGlobToRegex(pattern);
162
- if (regex.test(normalizedPath) || regex.test(relativePath)) {
163
- // File matches an exclude pattern, so exclude it
164
- logger.debug(`File ${filePath} excluded by tsconfig.json pattern: ${pattern}`);
165
- return false;
166
- }
167
- }
168
- }
169
-
170
- // Then check include patterns
171
- if (tsConfig.include && tsConfig.include.length > 0) {
172
- // Find if file matches any include pattern
173
- for (const pattern of tsConfig.include) {
174
- const regex = convertTsGlobToRegex(pattern);
175
-
176
- // Test the pattern against different path representations
177
- const testPaths = [
178
- normalizedPath,
179
- relativePath,
180
- path.basename(filePath),
181
- // Also test with leading slash removed for relative paths
182
- relativePath.startsWith('/') ? relativePath.slice(1) : relativePath,
183
- ];
184
-
185
- for (const testPath of testPaths) {
186
- if (regex.test(testPath)) {
187
- logger.debug(
188
- `File ${filePath} matched by tsconfig.json pattern: ${pattern} (tested path: ${testPath})`,
189
- );
190
- return true;
191
- }
192
- }
193
- }
194
-
195
- logger.debug(
196
- `File ${filePath} not included by any tsconfig.json include pattern (patterns: ${tsConfig.include.join(', ')})`,
197
- );
198
- return false;
199
- }
200
-
201
- // If no include patterns are provided, include all files that weren't excluded
202
- return true;
203
- }
204
-
205
- /**
206
- * Apply smart filtering to a list of file paths
207
- * @param filePaths Array of file paths
208
- * @param projectDir Project directory path
209
- * @returns Array of filtered file paths
210
- */
211
- export async function applySmartFiltering(
212
- filePaths: string[],
213
- projectDir: string,
214
- ): Promise<string[]> {
215
- // Load ignore patterns
216
- const gitignorePatterns = await loadGitignorePatterns(projectDir);
217
- const eslintIgnorePatterns = await loadEslintIgnorePatterns(projectDir);
218
- const tsConfig = await loadTsConfig(projectDir);
219
-
220
- // Log patterns loaded
221
- logger.debug(`Loaded ${gitignorePatterns.length} .gitignore patterns`);
222
- logger.debug(`Loaded ${eslintIgnorePatterns.length} .eslintignore patterns`);
223
- logger.debug(`TypeScript config loaded: ${tsConfig ? 'Yes' : 'No'}`);
224
-
225
- // Apply filtering
226
- return filePaths.filter((filePath) => {
227
- // Apply .gitignore patterns
228
- if (shouldExcludeFile(filePath, gitignorePatterns)) {
229
- logger.debug(`File excluded by .gitignore: ${filePath}`);
230
- return false;
231
- }
232
-
233
- // Apply .eslintignore patterns
234
- if (shouldExcludeFile(filePath, eslintIgnorePatterns)) {
235
- logger.debug(`File excluded by .eslintignore: ${filePath}`);
236
- return false;
237
- }
238
-
239
- // Apply TypeScript configuration
240
- if (tsConfig && !matchesTsConfig(filePath, tsConfig, projectDir)) {
241
- logger.debug(`File excluded by tsconfig.json: ${filePath}`);
242
- return false;
243
- }
244
-
245
- // Include the file if it passed all filters
246
- return true;
247
- });
248
- }
249
-
250
- export default {
251
- loadEslintIgnorePatterns,
252
- loadTsConfig,
253
- matchesTsConfig,
254
- applySmartFiltering,
255
- };