@vibe-validate/extractors 0.16.0 → 0.17.0-rc.10

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 (167) hide show
  1. package/dist/extractor-registry.d.ts +103 -0
  2. package/dist/extractor-registry.d.ts.map +1 -0
  3. package/dist/extractor-registry.js +278 -0
  4. package/dist/extractor-registry.js.map +1 -0
  5. package/dist/extractors/ava/index.d.ts +23 -0
  6. package/dist/extractors/ava/index.d.ts.map +1 -0
  7. package/dist/extractors/ava/index.js +507 -0
  8. package/dist/extractors/ava/index.js.map +1 -0
  9. package/dist/extractors/ava/index.test.d.ts +7 -0
  10. package/dist/extractors/ava/index.test.d.ts.map +1 -0
  11. package/dist/extractors/ava/index.test.js +408 -0
  12. package/dist/extractors/ava/index.test.js.map +1 -0
  13. package/dist/extractors/eslint/index.d.ts +18 -0
  14. package/dist/extractors/eslint/index.d.ts.map +1 -0
  15. package/dist/extractors/eslint/index.js +206 -0
  16. package/dist/extractors/eslint/index.js.map +1 -0
  17. package/dist/extractors/eslint/index.test.d.ts +9 -0
  18. package/dist/extractors/eslint/index.test.d.ts.map +1 -0
  19. package/dist/extractors/eslint/index.test.js +191 -0
  20. package/dist/extractors/eslint/index.test.js.map +1 -0
  21. package/dist/extractors/generic/index.d.ts +30 -0
  22. package/dist/extractors/generic/index.d.ts.map +1 -0
  23. package/dist/extractors/generic/index.js +140 -0
  24. package/dist/extractors/generic/index.js.map +1 -0
  25. package/dist/extractors/generic/index.test.d.ts +7 -0
  26. package/dist/extractors/generic/index.test.d.ts.map +1 -0
  27. package/dist/extractors/generic/index.test.js +61 -0
  28. package/dist/extractors/generic/index.test.js.map +1 -0
  29. package/dist/extractors/jasmine/index.d.ts +17 -0
  30. package/dist/extractors/jasmine/index.d.ts.map +1 -0
  31. package/dist/extractors/jasmine/index.js +254 -0
  32. package/dist/extractors/jasmine/index.js.map +1 -0
  33. package/dist/extractors/jasmine/index.test.d.ts +7 -0
  34. package/dist/extractors/jasmine/index.test.d.ts.map +1 -0
  35. package/dist/extractors/jasmine/index.test.js +345 -0
  36. package/dist/extractors/jasmine/index.test.js.map +1 -0
  37. package/dist/extractors/jest/index.d.ts +17 -0
  38. package/dist/extractors/jest/index.d.ts.map +1 -0
  39. package/dist/extractors/jest/index.js +278 -0
  40. package/dist/extractors/jest/index.js.map +1 -0
  41. package/dist/extractors/jest/index.test.d.ts +9 -0
  42. package/dist/extractors/jest/index.test.d.ts.map +1 -0
  43. package/dist/extractors/jest/index.test.js +353 -0
  44. package/dist/extractors/jest/index.test.js.map +1 -0
  45. package/dist/extractors/junit/index.d.ts +18 -0
  46. package/dist/extractors/junit/index.d.ts.map +1 -0
  47. package/dist/extractors/junit/index.js +259 -0
  48. package/dist/extractors/junit/index.js.map +1 -0
  49. package/dist/extractors/junit/index.test.d.ts +7 -0
  50. package/dist/extractors/junit/index.test.d.ts.map +1 -0
  51. package/dist/extractors/junit/index.test.js +341 -0
  52. package/dist/extractors/junit/index.test.js.map +1 -0
  53. package/dist/extractors/maven-checkstyle/index.d.ts +23 -0
  54. package/dist/extractors/maven-checkstyle/index.d.ts.map +1 -0
  55. package/dist/extractors/maven-checkstyle/index.js +263 -0
  56. package/dist/extractors/maven-checkstyle/index.js.map +1 -0
  57. package/dist/extractors/maven-checkstyle/index.test.d.ts +2 -0
  58. package/dist/extractors/maven-checkstyle/index.test.d.ts.map +1 -0
  59. package/dist/extractors/maven-checkstyle/index.test.js +197 -0
  60. package/dist/extractors/maven-checkstyle/index.test.js.map +1 -0
  61. package/dist/extractors/maven-compiler/index.d.ts +23 -0
  62. package/dist/extractors/maven-compiler/index.d.ts.map +1 -0
  63. package/dist/extractors/maven-compiler/index.js +271 -0
  64. package/dist/extractors/maven-compiler/index.js.map +1 -0
  65. package/dist/extractors/maven-compiler/index.test.d.ts +2 -0
  66. package/dist/extractors/maven-compiler/index.test.d.ts.map +1 -0
  67. package/dist/extractors/maven-compiler/index.test.js +189 -0
  68. package/dist/extractors/maven-compiler/index.test.js.map +1 -0
  69. package/dist/extractors/maven-surefire/index.d.ts +23 -0
  70. package/dist/extractors/maven-surefire/index.d.ts.map +1 -0
  71. package/dist/extractors/maven-surefire/index.js +292 -0
  72. package/dist/extractors/maven-surefire/index.js.map +1 -0
  73. package/dist/extractors/maven-surefire/index.test.d.ts +2 -0
  74. package/dist/extractors/maven-surefire/index.test.d.ts.map +1 -0
  75. package/dist/extractors/maven-surefire/index.test.js +169 -0
  76. package/dist/extractors/maven-surefire/index.test.js.map +1 -0
  77. package/dist/extractors/mocha/index.d.ts +17 -0
  78. package/dist/extractors/mocha/index.d.ts.map +1 -0
  79. package/dist/extractors/mocha/index.js +241 -0
  80. package/dist/extractors/mocha/index.js.map +1 -0
  81. package/dist/extractors/mocha/index.test.d.ts +7 -0
  82. package/dist/extractors/mocha/index.test.d.ts.map +1 -0
  83. package/dist/extractors/mocha/index.test.js +300 -0
  84. package/dist/extractors/mocha/index.test.js.map +1 -0
  85. package/dist/extractors/playwright/index.d.ts +17 -0
  86. package/dist/extractors/playwright/index.d.ts.map +1 -0
  87. package/dist/extractors/playwright/index.js +320 -0
  88. package/dist/extractors/playwright/index.js.map +1 -0
  89. package/dist/extractors/playwright/index.test.d.ts +7 -0
  90. package/dist/extractors/playwright/index.test.d.ts.map +1 -0
  91. package/dist/extractors/playwright/index.test.js +274 -0
  92. package/dist/extractors/playwright/index.test.js.map +1 -0
  93. package/dist/extractors/tap/index.d.ts +23 -0
  94. package/dist/extractors/tap/index.d.ts.map +1 -0
  95. package/dist/extractors/tap/index.js +352 -0
  96. package/dist/extractors/tap/index.js.map +1 -0
  97. package/dist/extractors/tap/index.test.d.ts +7 -0
  98. package/dist/extractors/tap/index.test.d.ts.map +1 -0
  99. package/dist/extractors/tap/index.test.js +100 -0
  100. package/dist/extractors/tap/index.test.js.map +1 -0
  101. package/dist/extractors/typescript/index.d.ts +17 -0
  102. package/dist/extractors/typescript/index.d.ts.map +1 -0
  103. package/dist/extractors/typescript/index.js +150 -0
  104. package/dist/extractors/typescript/index.js.map +1 -0
  105. package/dist/extractors/typescript/index.test.d.ts +9 -0
  106. package/dist/extractors/typescript/index.test.d.ts.map +1 -0
  107. package/dist/extractors/typescript/index.test.js +177 -0
  108. package/dist/extractors/typescript/index.test.js.map +1 -0
  109. package/dist/extractors/vitest/index.d.ts +17 -0
  110. package/dist/extractors/vitest/index.d.ts.map +1 -0
  111. package/dist/extractors/vitest/index.js +564 -0
  112. package/dist/extractors/vitest/index.js.map +1 -0
  113. package/dist/extractors/vitest/index.test.d.ts +9 -0
  114. package/dist/extractors/vitest/index.test.d.ts.map +1 -0
  115. package/dist/extractors/vitest/index.test.js +373 -0
  116. package/dist/extractors/vitest/index.test.js.map +1 -0
  117. package/dist/index.d.ts +27 -11
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +27 -11
  120. package/dist/index.js.map +1 -1
  121. package/dist/maven-checkstyle-extractor.d.ts +20 -0
  122. package/dist/maven-checkstyle-extractor.d.ts.map +1 -0
  123. package/dist/maven-checkstyle-extractor.js +208 -0
  124. package/dist/maven-checkstyle-extractor.js.map +1 -0
  125. package/dist/maven-compiler-extractor.d.ts +20 -0
  126. package/dist/maven-compiler-extractor.d.ts.map +1 -0
  127. package/dist/maven-compiler-extractor.js +218 -0
  128. package/dist/maven-compiler-extractor.js.map +1 -0
  129. package/dist/maven-surefire-extractor.d.ts +20 -0
  130. package/dist/maven-surefire-extractor.d.ts.map +1 -0
  131. package/dist/maven-surefire-extractor.js +228 -0
  132. package/dist/maven-surefire-extractor.js.map +1 -0
  133. package/dist/maven-utils.d.ts +24 -0
  134. package/dist/maven-utils.d.ts.map +1 -0
  135. package/dist/maven-utils.js +36 -0
  136. package/dist/maven-utils.js.map +1 -0
  137. package/dist/plugin-loader.d.ts +82 -0
  138. package/dist/plugin-loader.d.ts.map +1 -0
  139. package/dist/plugin-loader.js +201 -0
  140. package/dist/plugin-loader.js.map +1 -0
  141. package/dist/result-schema.d.ts +59 -9
  142. package/dist/result-schema.d.ts.map +1 -1
  143. package/dist/result-schema.js +3 -19
  144. package/dist/result-schema.js.map +1 -1
  145. package/dist/sandbox.d.ts +161 -0
  146. package/dist/sandbox.d.ts.map +1 -0
  147. package/dist/sandbox.js +254 -0
  148. package/dist/sandbox.js.map +1 -0
  149. package/dist/sandbox.test.d.ts +8 -0
  150. package/dist/sandbox.test.d.ts.map +1 -0
  151. package/dist/sandbox.test.js +395 -0
  152. package/dist/sandbox.test.js.map +1 -0
  153. package/dist/sandboxed-extractor.d.ts +46 -0
  154. package/dist/sandboxed-extractor.d.ts.map +1 -0
  155. package/dist/sandboxed-extractor.js +172 -0
  156. package/dist/sandboxed-extractor.js.map +1 -0
  157. package/dist/sandboxed-extractor.test.d.ts +5 -0
  158. package/dist/sandboxed-extractor.test.d.ts.map +1 -0
  159. package/dist/sandboxed-extractor.test.js +346 -0
  160. package/dist/sandboxed-extractor.test.js.map +1 -0
  161. package/dist/smart-extractor.d.ts +22 -10
  162. package/dist/smart-extractor.d.ts.map +1 -1
  163. package/dist/smart-extractor.js +116 -163
  164. package/dist/smart-extractor.js.map +1 -1
  165. package/dist/types.d.ts +94 -0
  166. package/dist/types.d.ts.map +1 -1
  167. package/package.json +3 -2
@@ -0,0 +1,564 @@
1
+ /**
2
+ * Vitest/Jest Error Extractor Plugin
3
+ *
4
+ * Parses and formats Vitest (and Jest) test failure output for LLM consumption.
5
+ *
6
+ * @package @vibe-validate/extractors
7
+ */
8
+ import { MAX_ERRORS_IN_ARRAY } from '../../result-schema.js';
9
+ /**
10
+ * Parse failure line to determine format and extract initial data
11
+ *
12
+ * @param line - Current line being parsed
13
+ * @param currentFile - File path from Format 2 header
14
+ * @param hasFormat2 - Whether Format 2 has been detected
15
+ * @returns Partial failure object or null if no match
16
+ *
17
+ * @internal
18
+ */
19
+ function parseFailureLine(line, currentFile, hasFormat2) {
20
+ // Match Format 1: FAIL file.test.ts > test hierarchy
21
+ // BUT: Skip if we've seen Format 2 headers (to avoid processing duplicate FAIL lines)
22
+ const format1Match = !hasFormat2 && /(?:FAIL|❌|×)\s+([^\s]+\.test\.ts)\s*>\s*(.+)/.exec(line);
23
+ if (format1Match) {
24
+ return {
25
+ file: format1Match[1],
26
+ testHierarchy: format1Match[2].trim(),
27
+ errorMessage: '',
28
+ sourceLine: '',
29
+ location: ''
30
+ };
31
+ }
32
+ // Match Format 2: × test hierarchy (without file path)
33
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Vitest test framework output (controlled output), limited line length
34
+ const format2Match = /(?:×)\s+(.+?)(?:\s+\d+ms)?$/.exec(line);
35
+ if (format2Match && currentFile) {
36
+ return {
37
+ file: currentFile,
38
+ testHierarchy: format2Match[1].trim(),
39
+ errorMessage: '',
40
+ sourceLine: '',
41
+ location: ''
42
+ };
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Extract initial error message from line
48
+ *
49
+ * @param line - Line to extract error from
50
+ * @returns Extracted error message
51
+ *
52
+ * @internal
53
+ */
54
+ function extractErrorMessage(line) {
55
+ const errorMatch = /((?:AssertionError|Error):\s*.+)/.exec(line);
56
+ if (errorMatch) {
57
+ return errorMatch[1].trim();
58
+ }
59
+ const format2ErrorMatch = /→\s+(.+)/.exec(line);
60
+ if (format2ErrorMatch) {
61
+ return format2ErrorMatch[1].trim();
62
+ }
63
+ return line.trim();
64
+ }
65
+ /**
66
+ * Check if line is a stop marker for error continuation
67
+ *
68
+ * @param line - Trimmed line to check
69
+ * @returns True if this line marks end of error message
70
+ *
71
+ * @internal
72
+ */
73
+ function isStopMarker(line) {
74
+ return (line.startsWith('❯') ||
75
+ /^\d+\|/.test(line) ||
76
+ line.startsWith('FAIL') ||
77
+ line.startsWith('✓') ||
78
+ line.startsWith('❌') ||
79
+ line.startsWith('×') ||
80
+ line.startsWith('⎯') ||
81
+ line.startsWith('at '));
82
+ }
83
+ /**
84
+ * Append continuation line to error message
85
+ *
86
+ * @param errorMessage - Current error message
87
+ * @param line - Raw line (with indentation)
88
+ * @param trimmedLine - Trimmed version of line
89
+ * @param isSnapshotError - Whether handling snapshot error
90
+ * @returns Updated error message
91
+ *
92
+ * @internal
93
+ */
94
+ function appendContinuationLine(errorMessage, line, trimmedLine, isSnapshotError) {
95
+ if (isSnapshotError) {
96
+ return errorMessage + '\n' + line; // Preserve indentation for diffs
97
+ }
98
+ return errorMessage + ' ' + trimmedLine; // Compact for normal errors
99
+ }
100
+ /**
101
+ * Handle truncation logic for non-snapshot errors
102
+ *
103
+ * @param errorMessage - Current error message
104
+ * @param nextLine - Next trimmed line
105
+ * @param isSnapshotError - Whether handling snapshot error
106
+ * @param linesConsumed - Number of lines consumed so far
107
+ * @param maxLines - Maximum continuation lines allowed
108
+ * @returns Object with updated message and whether to stop
109
+ *
110
+ * @internal
111
+ */
112
+ function handleTruncation(errorMessage, nextLine, isSnapshotError, linesConsumed, maxLines) {
113
+ if (isSnapshotError || linesConsumed < maxLines) {
114
+ return { errorMessage, shouldStop: false };
115
+ }
116
+ const updatedMessage = nextLine ? errorMessage + ' ...(truncated)' : errorMessage;
117
+ return { errorMessage: updatedMessage, shouldStop: true };
118
+ }
119
+ /**
120
+ * Parse error message with continuation line handling
121
+ *
122
+ * @param lines - All output lines
123
+ * @param startIndex - Index where error message starts
124
+ * @param isSnapshotError - Whether this is a snapshot error (different continuation rules)
125
+ * @returns Error message and index of last consumed line
126
+ *
127
+ * @internal
128
+ */
129
+ function parseErrorMessage(lines, startIndex, isSnapshotError) {
130
+ let errorMessage = extractErrorMessage(lines[startIndex]);
131
+ const MAX_CONTINUATION_LINES = 5;
132
+ let j = startIndex + 1;
133
+ let linesConsumed = 0;
134
+ while (j < lines.length) {
135
+ const nextLine = lines[j].trim();
136
+ if (isStopMarker(nextLine)) {
137
+ break;
138
+ }
139
+ // Check truncation limit for non-snapshot errors
140
+ const truncation = handleTruncation(errorMessage, nextLine, isSnapshotError, linesConsumed, MAX_CONTINUATION_LINES);
141
+ if (truncation.shouldStop) {
142
+ errorMessage = truncation.errorMessage;
143
+ break;
144
+ }
145
+ // For non-snapshot errors, stop at blank lines
146
+ if (!nextLine && !isSnapshotError) {
147
+ break;
148
+ }
149
+ // Add line to error message
150
+ if (nextLine || isSnapshotError) {
151
+ errorMessage = appendContinuationLine(errorMessage, lines[j], nextLine, isSnapshotError);
152
+ if (!isSnapshotError) {
153
+ linesConsumed++;
154
+ }
155
+ }
156
+ j++;
157
+ }
158
+ return { errorMessage, lastIndex: j - 1 };
159
+ }
160
+ /**
161
+ * Parse location from vitest marker or stack trace
162
+ *
163
+ * @param line - Line to parse
164
+ * @returns Location string (file:line:column) or null
165
+ *
166
+ * @internal
167
+ */
168
+ function parseLocation(line) {
169
+ // Try vitest location marker first
170
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Vitest test framework location markers (controlled output), not user input
171
+ const vitestLocation = /❯\s*(.+\.test\.ts):(\d+):(\d+)/.exec(line);
172
+ if (vitestLocation) {
173
+ return `${vitestLocation[1]}:${vitestLocation[2]}:${vitestLocation[3]}`;
174
+ }
175
+ // Try stack trace pattern
176
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Vitest test framework stack traces (controlled output), not user input
177
+ const stackLocation = /at\s+.+\(([^\s]+\.test\.ts):(\d+):(\d+)\)/.exec(line);
178
+ if (stackLocation) {
179
+ return `${stackLocation[1]}:${stackLocation[2]}:${stackLocation[3]}`;
180
+ }
181
+ return null;
182
+ }
183
+ /**
184
+ * Format failures into clean output
185
+ *
186
+ * @param failures - Extracted test failures
187
+ * @param expected - Expected value (if present)
188
+ * @param actual - Actual value (if present)
189
+ * @returns Formatted output string
190
+ *
191
+ * @internal
192
+ */
193
+ function formatFailuresOutput(failures, expected, actual) {
194
+ return failures
195
+ .slice(0, MAX_ERRORS_IN_ARRAY)
196
+ .map((f, idx) => {
197
+ const parts = [
198
+ `[Test ${idx + 1}/${failures.length}] ${f.location ?? f.file}`,
199
+ '',
200
+ `Test: ${f.testHierarchy}`,
201
+ `Error: ${f.errorMessage}`,
202
+ ];
203
+ if (expected && actual) {
204
+ parts.push(`Expected: ${expected}`, `Actual: ${actual}`);
205
+ }
206
+ if (f.sourceLine) {
207
+ parts.push('', f.sourceLine);
208
+ }
209
+ return parts.filter(p => p).join('\n');
210
+ })
211
+ .join('\n\n');
212
+ }
213
+ /**
214
+ * Generate LLM-friendly guidance based on failures
215
+ *
216
+ * @param failureCount - Number of failures
217
+ * @param expected - Expected value (if present)
218
+ * @param actual - Actual value (if present)
219
+ * @param hasTimeout - Whether any failures are due to timeout
220
+ * @returns Guidance text
221
+ *
222
+ * @internal
223
+ */
224
+ function generateGuidanceText(failureCount, expected, actual, hasTimeout) {
225
+ let guidance = `${failureCount} test(s) failed. `;
226
+ // Timeout-specific guidance
227
+ if (hasTimeout) {
228
+ guidance += 'Test(s) timed out. ';
229
+ if (failureCount === 1) {
230
+ guidance += 'Options: 1) Increase timeout with test.timeout() or testTimeout config, ';
231
+ guidance += '2) Optimize test to run faster, ';
232
+ guidance += '3) Mock slow operations (API calls, file I/O, child processes). ';
233
+ }
234
+ else {
235
+ guidance += 'Multiple tests timing out suggests resource constraints. ';
236
+ guidance += 'Try: 1) Run tests individually to identify slow tests, ';
237
+ guidance += '2) Increase testTimeout config, ';
238
+ guidance += '3) Reduce parallel test workers (--pool-workers=2). ';
239
+ }
240
+ guidance += 'Run: npm test -- <test-file> to verify the fix.';
241
+ return guidance;
242
+ }
243
+ // Standard assertion failure guidance
244
+ if (failureCount === 1) {
245
+ guidance += 'Fix the assertion in the test file at the location shown. ';
246
+ if (expected && actual) {
247
+ guidance += `The test expected "${expected}" but got "${actual}". `;
248
+ }
249
+ guidance += 'Run: npm test -- <test-file> to verify the fix.';
250
+ }
251
+ else {
252
+ guidance += 'Fix each failing test individually. Run: npm test -- <test-file> to test each file.';
253
+ }
254
+ return guidance;
255
+ }
256
+ /**
257
+ * Extract runtime errors (Unhandled Rejection, ENOENT, etc.)
258
+ *
259
+ * @param output - Full test output
260
+ * @returns Test failure object if runtime error found
261
+ */
262
+ function extractRuntimeError(output) {
263
+ // Look for "Unhandled Rejection" section
264
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Vitest test framework runtime errors (controlled output), not user input
265
+ const unhandledMatch = /⎯+\s*Unhandled Rejection\s*⎯+\s*\n\s*(Error:[^\n]+(?:\n\s*[^\n❯⎯]+)?)/.exec(output);
266
+ if (!unhandledMatch) {
267
+ return null;
268
+ }
269
+ // Error message may span multiple lines (e.g., path on next line)
270
+ const errorMessage = unhandledMatch[1].trim().replace(/\n\s+/g, ' ');
271
+ // Extract location from stack trace (❯ function file:line:col)
272
+ // File path may contain colons (e.g., node:internal/fs/promises), so match ❯ function filepath:number:number
273
+ const locationMatch = /❯\s+\S+\s+([\w:/.]+):(\d+):(\d+)/.exec(output);
274
+ let file = 'unknown';
275
+ let location = '';
276
+ if (locationMatch) {
277
+ file = locationMatch[1];
278
+ location = `${locationMatch[1]}:${locationMatch[2]}:${locationMatch[3]}`;
279
+ }
280
+ return {
281
+ file,
282
+ location,
283
+ testHierarchy: 'Runtime Error',
284
+ errorMessage,
285
+ sourceLine: ''
286
+ };
287
+ }
288
+ /**
289
+ * Extract coverage threshold failures
290
+ *
291
+ * @param output - Full test output
292
+ * @returns Test failure object if coverage threshold error found
293
+ */
294
+ function extractCoverageThresholdError(output) {
295
+ // Look for: "ERROR: Coverage for functions (86.47%) does not meet global threshold (87%)"
296
+ const coverageMatch = /ERROR:\s+Coverage for (\w+) \(([\d.]+)%\) does not meet (?:global )?threshold \(([\d.]+)%\)/.exec(output);
297
+ if (!coverageMatch) {
298
+ return null;
299
+ }
300
+ const [, metric, actual, expected] = coverageMatch;
301
+ return {
302
+ file: 'vitest.config.ts',
303
+ location: '',
304
+ testHierarchy: 'Coverage Threshold',
305
+ errorMessage: `Coverage for ${metric} (${actual}%) does not meet threshold (${expected}%)`,
306
+ sourceLine: ''
307
+ };
308
+ }
309
+ /**
310
+ * Extract Vitest worker timeout errors
311
+ *
312
+ * These occur when Vitest worker threads timeout during test execution,
313
+ * often due to system resource constraints or competing processes.
314
+ *
315
+ * @param output - Full test output
316
+ * @returns Test failure object if worker timeout error found
317
+ */
318
+ function extractVitestWorkerTimeoutError(output) {
319
+ // Look for: "⎯⎯⎯⎯⎯⎯ Unhandled Error(s) ⎯⎯⎯⎯⎯⎯⎯\nError: [vitest-worker]: Timeout calling..."
320
+ // Handles both singular "Unhandled Error" and plural "Unhandled Errors"
321
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Vitest test framework error output (controlled output), not user input
322
+ const timeoutMatch = /⎯+\s*Unhandled Errors?\s*⎯+\s*\n\s*Error:\s*\[vitest-worker\]:\s*(Timeout[^\n]+)/.exec(output);
323
+ if (!timeoutMatch) {
324
+ return null;
325
+ }
326
+ const errorMessage = timeoutMatch[1].trim();
327
+ return {
328
+ file: 'vitest.config.ts',
329
+ location: '',
330
+ testHierarchy: 'Vitest Worker Timeout',
331
+ errorMessage: `${errorMessage}. This is usually caused by system resource constraints or competing processes. Try: 1) Kill background processes, 2) Reduce --pool-workers, 3) Increase --test-timeout`,
332
+ sourceLine: ''
333
+ };
334
+ }
335
+ /**
336
+ * Extract expected/actual values from test output
337
+ *
338
+ * @param output - Full test output
339
+ * @returns Expected and actual values (if found)
340
+ */
341
+ function extractExpectedActual(fullOutput) {
342
+ const expectedMatch = /- Expected[^\n]*\n[^\n]*\n- (.+)/.exec(fullOutput);
343
+ const actualMatch = /\+ Received[^\n]*\n[^\n]*\n\+ (.+)/.exec(fullOutput);
344
+ return {
345
+ expected: expectedMatch ? expectedMatch[1].trim() : undefined,
346
+ actual: actualMatch ? actualMatch[1].trim() : undefined
347
+ };
348
+ }
349
+ /**
350
+ * Extract Vitest test failures from output
351
+ *
352
+ * @param output - Raw Vitest/Jest command output
353
+ * @returns Structured error information with test-specific guidance
354
+ */
355
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity 29 acceptable for Vitest output parsing (down from 97) - main parsing loop coordinates multiple format detection and state tracking
356
+ function extract(output) {
357
+ const lines = output.split('\n');
358
+ const failures = [];
359
+ let currentFailure = null;
360
+ let currentFile = ''; // Track file from ❯ lines for Format 2
361
+ let hasFormat2 = false; // Track if we found Format 2 file headers
362
+ // First, check for runtime errors (Unhandled Rejection, ENOENT, etc.)
363
+ const runtimeError = extractRuntimeError(output);
364
+ if (runtimeError) {
365
+ failures.push(runtimeError);
366
+ }
367
+ // Check for coverage threshold failures
368
+ const coverageError = extractCoverageThresholdError(output);
369
+ if (coverageError) {
370
+ failures.push(coverageError);
371
+ }
372
+ // Check for Vitest worker timeout errors
373
+ const timeoutError = extractVitestWorkerTimeoutError(output);
374
+ if (timeoutError) {
375
+ failures.push(timeoutError);
376
+ }
377
+ let i = -1;
378
+ while (i < lines.length - 1) {
379
+ i++; // Increment at start so 'continue' statements don't bypass it
380
+ const line = lines[i];
381
+ // Check for Format 2 file header
382
+ const fileHeaderMatch = /❯\s+([^\s]+\.test\.ts)\s+\(/.exec(line);
383
+ if (fileHeaderMatch) {
384
+ currentFile = fileHeaderMatch[1];
385
+ hasFormat2 = true;
386
+ continue;
387
+ }
388
+ // Try to parse as failure line (Format 1 or Format 2)
389
+ const parsedFailure = parseFailureLine(line, currentFile, hasFormat2);
390
+ if (parsedFailure) {
391
+ if (currentFailure?.file) {
392
+ failures.push(currentFailure);
393
+ }
394
+ currentFailure = parsedFailure;
395
+ continue;
396
+ }
397
+ // Parse error message if we have a current failure
398
+ if (currentFailure && !currentFailure.errorMessage) {
399
+ const snapshotMatch = /Snapshot\s+`([^`]+)`\s+mismatched/.exec(line);
400
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Need to check truthy regex matches, not just null/undefined
401
+ const hasError = /((?:AssertionError|Error):\s*.+)/.exec(line) || /→\s+(.+)/.exec(line) || snapshotMatch;
402
+ if (hasError) {
403
+ const isSnapshotError = !!snapshotMatch;
404
+ const { errorMessage, lastIndex } = parseErrorMessage(lines, i, isSnapshotError);
405
+ currentFailure.errorMessage = errorMessage;
406
+ i = lastIndex;
407
+ }
408
+ continue;
409
+ }
410
+ // Parse location if we have a current failure
411
+ if (currentFailure && !currentFailure.location) {
412
+ const location = parseLocation(line);
413
+ if (location) {
414
+ currentFailure.location = location;
415
+ continue;
416
+ }
417
+ }
418
+ // Parse source line
419
+ if (currentFailure && /^\s*\d+\|\s+/.exec(line)) {
420
+ const sourceMatch = /^\s*(\d+)\|\s*(.+)/.exec(line);
421
+ if (sourceMatch) {
422
+ currentFailure.sourceLine = `${sourceMatch[1]}| ${sourceMatch[2].trim()}`;
423
+ }
424
+ }
425
+ }
426
+ // Add last failure
427
+ if (currentFailure?.file) {
428
+ failures.push(currentFailure);
429
+ }
430
+ // Detect timeout failures
431
+ const hasTimeout = failures.some(f => f.errorMessage.includes('Test timed out'));
432
+ // Extract expected/actual values and format output
433
+ const { expected, actual } = extractExpectedActual(output);
434
+ const errorSummary = formatFailuresOutput(failures, expected, actual);
435
+ const guidance = generateGuidanceText(failures.length, expected, actual, hasTimeout);
436
+ const result = {
437
+ errors: failures.slice(0, MAX_ERRORS_IN_ARRAY).map(f => {
438
+ // Parse line:column from end of location string (file paths may contain colons)
439
+ let line;
440
+ let column;
441
+ if (f.location) {
442
+ const parts = f.location.split(':');
443
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Need to filter empty strings for parseInt, not just null/undefined
444
+ column = Number.parseInt(parts.pop() || '');
445
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Need to filter empty strings for parseInt, not just null/undefined
446
+ line = Number.parseInt(parts.pop() || '');
447
+ }
448
+ return {
449
+ file: f.file,
450
+ line: line !== undefined && !Number.isNaN(line) ? line : undefined,
451
+ column: column !== undefined && !Number.isNaN(column) ? column : undefined,
452
+ message: f.errorMessage
453
+ };
454
+ }),
455
+ summary: `${failures.length} test failure(s)`,
456
+ totalErrors: failures.length,
457
+ guidance,
458
+ errorSummary
459
+ };
460
+ return result;
461
+ }
462
+ /**
463
+ * Detect if output is from Vitest or Jest
464
+ *
465
+ * @param output - Command output to analyze
466
+ * @returns Detection result with confidence and patterns
467
+ */
468
+ function detect(output) {
469
+ // Look for Vitest-specific markers
470
+ const vitestMarkers = [
471
+ /FAIL\s+\S+\.test\.(ts|js)/, // FAIL test-file.test.ts
472
+ /❯\s+\S+\.test\.(ts|js)/, // ❯ test-file.test.ts
473
+ /×\s+[^❯]+/, // × test name (without file marker)
474
+ // eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Vitest test framework output (controlled output), limited input size
475
+ /⎯+\s*Unhandled/, // Unhandled errors section
476
+ ];
477
+ const patterns = [];
478
+ let matchCount = 0;
479
+ for (const marker of vitestMarkers) {
480
+ if (marker.test(output)) {
481
+ matchCount++;
482
+ patterns.push(marker.source);
483
+ }
484
+ }
485
+ if (matchCount >= 2) {
486
+ return {
487
+ confidence: 90,
488
+ patterns,
489
+ reason: 'Multiple Vitest/Jest test failure patterns detected',
490
+ };
491
+ }
492
+ if (matchCount === 1) {
493
+ return {
494
+ confidence: 70,
495
+ patterns,
496
+ reason: 'Single Vitest/Jest test failure pattern detected',
497
+ };
498
+ }
499
+ return { confidence: 0, patterns: [], reason: '' };
500
+ }
501
+ /**
502
+ * Sample test cases for Vitest extractor
503
+ */
504
+ const samples = [
505
+ {
506
+ name: 'single-test-failure',
507
+ description: 'Single Vitest test failure with assertion error',
508
+ input: `FAIL test/unit/config/environment.test.ts > EnvironmentConfig > should parse HTTP_PORT
509
+ AssertionError: expected 3000 to be 9999 // Object.is equality
510
+ ❯ test/unit/config/environment.test.ts:57:30
511
+ 57| expect(config.HTTP_PORT).toBe(9999);`,
512
+ expectedErrors: 1,
513
+ expectedPatterns: ['FAIL', 'AssertionError', '❯'],
514
+ },
515
+ {
516
+ name: 'multiple-test-failures',
517
+ description: 'Multiple Vitest test failures across different files',
518
+ input: `FAIL test/unit/config/environment.test.ts > EnvironmentConfig > test 1
519
+ AssertionError: expected 3000 to be 9999
520
+ ❯ test/unit/config/environment.test.ts:57:30
521
+
522
+ FAIL test/unit/auth/factory.test.ts > AuthFactory > test 2
523
+ Error: Cannot create auth provider
524
+ ❯ test/unit/auth/factory.test.ts:100:15`,
525
+ expectedErrors: 2,
526
+ expectedPatterns: ['FAIL', 'AssertionError', 'Error'],
527
+ },
528
+ {
529
+ name: 'coverage-threshold-failure',
530
+ description: 'Coverage threshold not met',
531
+ input: `Test Files 1139 passed (1139)
532
+ Tests 1139 passed (1139)
533
+
534
+ ERROR: Coverage for functions (86.47%) does not meet global threshold (87%)`,
535
+ expectedErrors: 1,
536
+ expectedPatterns: ['Coverage', 'threshold'],
537
+ },
538
+ ];
539
+ /**
540
+ * Vitest/Jest Error Extractor Plugin
541
+ *
542
+ * Extracts Vitest and Jest test failures with high confidence (90%).
543
+ * Supports multiple output formats and special error types (runtime, coverage, worker timeouts).
544
+ */
545
+ const vitestPlugin = {
546
+ metadata: {
547
+ name: 'vitest',
548
+ version: '1.0.0',
549
+ author: 'vibe-validate',
550
+ description: 'Extracts Vitest and Jest test failures',
551
+ repository: 'https://github.com/jdutton/vibe-validate',
552
+ tags: ['vitest', 'jest', 'testing', 'test-failures'],
553
+ },
554
+ hints: {
555
+ required: [],
556
+ anyOf: ['FAIL', 'test.ts', 'test.js', '❯', '×'],
557
+ },
558
+ priority: 85,
559
+ detect,
560
+ extract,
561
+ samples,
562
+ };
563
+ export default vitestPlugin;
564
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extractors/vitest/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Vitest Extractor Plugin Tests
3
+ *
4
+ * Tests Vitest/Jest test failure parsing and formatting.
5
+ *
6
+ * @package @vibe-validate/extractors
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/extractors/vitest/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}