@vibe-validate/extractors 0.12.1 → 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.
Files changed (44) hide show
  1. package/README.md +68 -9
  2. package/dist/ava-extractor.d.ts +24 -0
  3. package/dist/ava-extractor.d.ts.map +1 -0
  4. package/dist/ava-extractor.js +367 -0
  5. package/dist/ava-extractor.js.map +1 -0
  6. package/dist/index.d.ts +6 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +6 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/jasmine-extractor.d.ts +23 -0
  11. package/dist/jasmine-extractor.d.ts.map +1 -0
  12. package/dist/jasmine-extractor.js +254 -0
  13. package/dist/jasmine-extractor.js.map +1 -0
  14. package/dist/jest-extractor.d.ts +29 -0
  15. package/dist/jest-extractor.d.ts.map +1 -0
  16. package/dist/jest-extractor.js +115 -0
  17. package/dist/jest-extractor.js.map +1 -0
  18. package/dist/junit-extractor.d.ts +24 -0
  19. package/dist/junit-extractor.d.ts.map +1 -0
  20. package/dist/junit-extractor.js +264 -0
  21. package/dist/junit-extractor.js.map +1 -0
  22. package/dist/mocha-extractor.d.ts +23 -0
  23. package/dist/mocha-extractor.d.ts.map +1 -0
  24. package/dist/mocha-extractor.js +263 -0
  25. package/dist/mocha-extractor.js.map +1 -0
  26. package/dist/playwright-extractor.d.ts +38 -0
  27. package/dist/playwright-extractor.d.ts.map +1 -0
  28. package/dist/playwright-extractor.js +230 -0
  29. package/dist/playwright-extractor.js.map +1 -0
  30. package/dist/smart-extractor.d.ts +9 -0
  31. package/dist/smart-extractor.d.ts.map +1 -1
  32. package/dist/smart-extractor.js +25 -0
  33. package/dist/smart-extractor.js.map +1 -1
  34. package/dist/tap-extractor.d.ts +24 -0
  35. package/dist/tap-extractor.d.ts.map +1 -0
  36. package/dist/tap-extractor.js +227 -0
  37. package/dist/tap-extractor.js.map +1 -0
  38. package/dist/types.d.ts +21 -2
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/vitest-extractor.d.ts +9 -1
  41. package/dist/vitest-extractor.d.ts.map +1 -1
  42. package/dist/vitest-extractor.js +112 -16
  43. package/dist/vitest-extractor.js.map +1 -1
  44. package/package.json +3 -5
package/README.md CHANGED
@@ -11,10 +11,22 @@ LLM-optimized error extractors for validation output.
11
11
 
12
12
  ## Supported Extractors
13
13
 
14
+ ### Test Frameworks
15
+ - **Vitest**: Dual format support (Format 1 & 2), assertion errors, test hierarchy
16
+ - **Jest**: Comprehensive error extraction, all failure types supported
17
+ - **Mocha**: Native Mocha output format, stack trace parsing
18
+ - **Jasmine**: Angular ecosystem support, Message:/Stack: section parsing
19
+ - **TAP (Test Anything Protocol)**: Covers Tape, node-tap, YAML diagnostics parsing
20
+ - **Ava**: Node.js community favorite, detailed block parsing with quality metadata
21
+ - **Playwright**: Modern E2E testing, numbered failure blocks, stack trace extraction
22
+ - **JUnit XML**: Universal test format for any framework with XML output
23
+
24
+ ### Code Quality Tools
14
25
  - **TypeScript (tsc)**: Parses `file(line,col): error TSxxxx: message` format
15
26
  - **ESLint**: Parses `file:line:col - severity message [rule]` format
16
- - **Vitest/Jest**: Extracts test hierarchy, assertion errors, expected vs actual
17
27
  - **OpenAPI**: Filters validation errors from specification validators
28
+
29
+ ### Fallback
18
30
  - **Generic**: Fallback for unknown tools (removes npm noise)
19
31
 
20
32
  ## Installation
@@ -42,18 +54,49 @@ console.log(result.errors); // Structured error array
42
54
 
43
55
  ### Direct Extractor Usage
44
56
 
45
- For explicit control:
57
+ Use direct extractors when:
58
+ - You know the exact tool being used
59
+ - You want explicit control over extraction
60
+ - You need tool-specific options
61
+
62
+ **Example: Using Jest extractor directly**
63
+
64
+ ```typescript
65
+ import { extractJestErrors } from '@vibe-validate/extractors';
66
+ import { execSync } from 'child_process';
67
+
68
+ const jestOutput = execSync('npx jest --no-coverage').toString();
69
+ const result = extractJestErrors(jestOutput);
70
+
71
+ console.log(`Found ${result.errors.length} test failures`);
72
+ console.log(`Quality: ${result.metadata?.confidence}% confidence`);
73
+ result.errors.forEach(error => {
74
+ console.log(` ${error.file}:${error.line} - ${error.message}`);
75
+ });
76
+ ```
77
+
78
+ **All available extractors:**
46
79
 
47
80
  ```typescript
48
81
  import {
82
+ // Test framework extractors
83
+ extractVitestErrors,
84
+ extractJestErrors,
85
+ extractMochaErrors,
86
+ extractJasmineErrors,
87
+ extractTAPErrors,
88
+ extractAvaErrors,
89
+ extractPlaywrightErrors,
90
+ extractJUnitErrors,
91
+
92
+ // Code quality extractors
49
93
  extractTypeScriptErrors,
50
94
  extractESLintErrors,
51
- extractVitestErrors,
52
- formatOpenAPIErrors,
53
- formatGenericErrors
54
- } from '@vibe-validate/extractors';
95
+ extractOpenAPIErrors,
55
96
 
56
- const result = extractTypeScriptErrors(tscOutput);
97
+ // Fallback
98
+ extractGenericErrors
99
+ } from '@vibe-validate/extractors';
57
100
  ```
58
101
 
59
102
  ### Utilities
@@ -74,7 +117,14 @@ Smart extractor with auto-detection.
74
117
  **Detection rules:**
75
118
  - TypeScript: Step name contains "TypeScript" or "typecheck"
76
119
  - ESLint: Step name contains "ESLint" or "lint"
77
- - Vitest/Jest: Step name contains "test" (but not "OpenAPI")
120
+ - Vitest: Output contains `❯` marker or `FAIL` keyword
121
+ - Jest: Output contains `FAIL` or `●` bullet pattern
122
+ - Mocha: Output contains Mocha's passing/failing summary format
123
+ - Jasmine: Output contains "Failures:" header
124
+ - TAP: Output contains "TAP version" or "not ok" format
125
+ - Ava: Output contains `✘ [fail]:` pattern
126
+ - Playwright: Output contains `✘` with `.spec.ts` references
127
+ - JUnit XML: Output starts with `<?xml` and contains `<testsuite>`
78
128
  - OpenAPI: Step name contains "OpenAPI"
79
129
  - Generic: Fallback for unknown types
80
130
 
@@ -82,13 +132,21 @@ Smart extractor with auto-detection.
82
132
 
83
133
  ```typescript
84
134
  interface FormattedError {
85
- file: string;
135
+ file?: string;
86
136
  line?: number;
87
137
  column?: number;
88
138
  message: string;
89
139
  code?: string;
90
140
  severity?: 'error' | 'warning';
91
141
  context?: string;
142
+ guidance?: string;
143
+ }
144
+
145
+ interface ExtractionMetadata {
146
+ confidence: number; // 0-100: Based on pattern match quality
147
+ completeness: number; // % of failures with file + line + message
148
+ issues: string[]; // Problems encountered during extraction
149
+ suggestions?: string[]; // For developerFeedback mode only
92
150
  }
93
151
 
94
152
  interface ErrorExtractorResult {
@@ -97,6 +155,7 @@ interface ErrorExtractorResult {
97
155
  totalCount: number; // Total error count
98
156
  guidance?: string; // Actionable fixing guidance
99
157
  cleanOutput: string; // Clean formatted output for YAML/JSON
158
+ metadata?: ExtractionMetadata; // Extraction quality metadata
100
159
  }
101
160
  ```
102
161
 
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Ava Error Extractor
3
+ *
4
+ * Parses Ava test output and formats failures for LLM consumption.
5
+ * Supports Ava v6+ output format with Unicode symbols and clean error formatting.
6
+ *
7
+ * @package @vibe-validate/extractors
8
+ */
9
+ import type { ErrorExtractorResult } from './types.js';
10
+ /**
11
+ * Extract errors from Ava test output
12
+ *
13
+ * @param output - Ava text output
14
+ * @returns Structured error information
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const avaOutput = execSync('ava tests/**\/*.test.js', { encoding: 'utf-8' });
19
+ * const result = extractAvaErrors(avaOutput);
20
+ * console.log(result.summary); // "5 test(s) failed"
21
+ * ```
22
+ */
23
+ export declare function extractAvaErrors(output: string): ErrorExtractorResult;
24
+ //# sourceMappingURL=ava-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-extractor.d.ts","sourceRoot":"","sources":["../src/ava-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAsC,MAAM,YAAY,CAAC;AAG3F;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAsErE"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Ava Error Extractor
3
+ *
4
+ * Parses Ava test output and formats failures for LLM consumption.
5
+ * Supports Ava v6+ output format with Unicode symbols and clean error formatting.
6
+ *
7
+ * @package @vibe-validate/extractors
8
+ */
9
+ import { stripAnsiCodes } from './utils.js';
10
+ /**
11
+ * Extract errors from Ava test output
12
+ *
13
+ * @param output - Ava text output
14
+ * @returns Structured error information
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const avaOutput = execSync('ava tests/**\/*.test.js', { encoding: 'utf-8' });
19
+ * const result = extractAvaErrors(avaOutput);
20
+ * console.log(result.summary); // "5 test(s) failed"
21
+ * ```
22
+ */
23
+ export function extractAvaErrors(output) {
24
+ const cleanOutput = stripAnsiCodes(output);
25
+ // Extract all failures using two-pass approach:
26
+ // 1. Parse summary lines to get test names
27
+ // 2. Parse detailed blocks to get file locations and messages
28
+ const failures = extractFailures(cleanOutput);
29
+ if (failures.length === 0) {
30
+ return {
31
+ summary: '0 test(s) failed',
32
+ errors: [],
33
+ totalCount: 0,
34
+ cleanOutput: '',
35
+ guidance: '',
36
+ metadata: {
37
+ confidence: 100,
38
+ completeness: 100,
39
+ issues: []
40
+ }
41
+ };
42
+ }
43
+ const errors = [];
44
+ let completeCount = 0;
45
+ for (const failure of failures) {
46
+ const file = failure.file || 'unknown';
47
+ // Use test name as fallback message if no explicit message extracted
48
+ const message = failure.message || failure.testName || 'Test failed';
49
+ const context = failure.testName || '';
50
+ const isComplete = file !== 'unknown' && failure.line && message && message !== 'Test failed';
51
+ if (isComplete) {
52
+ completeCount++;
53
+ }
54
+ errors.push({
55
+ file,
56
+ line: failure.line,
57
+ message,
58
+ context,
59
+ guidance: failure.guidance
60
+ });
61
+ }
62
+ // Generate summary
63
+ const summary = `${failures.length} test(s) failed`;
64
+ // Generate guidance
65
+ const guidance = generateGuidance(failures);
66
+ // Calculate quality metadata
67
+ const completeness = failures.length > 0 ? (completeCount / failures.length) * 100 : 100;
68
+ const confidence = failures.length > 0 ? 90 : 100; // High confidence for Ava's structured output
69
+ const metadata = {
70
+ confidence,
71
+ completeness,
72
+ issues: []
73
+ };
74
+ return {
75
+ summary,
76
+ errors,
77
+ totalCount: failures.length,
78
+ cleanOutput: formatCleanOutput(errors),
79
+ guidance,
80
+ metadata
81
+ };
82
+ }
83
+ /**
84
+ * Extract all failures from Ava output
85
+ * Strategy: Find detailed headers (test names with ›), then parse each block
86
+ */
87
+ function extractFailures(output) {
88
+ const lines = output.split('\n');
89
+ const failures = [];
90
+ // Find all detailed block headers (clean test names with ›)
91
+ // These are the authoritative source - each one represents a failure
92
+ const headerIndices = [];
93
+ for (let i = 0; i < lines.length; i++) {
94
+ const trimmed = lines[i].trim();
95
+ // Detailed header: has ›, not a summary, not a file:// line, not code, reasonable length
96
+ if (trimmed.includes('›') &&
97
+ !trimmed.includes('[fail]:') &&
98
+ !trimmed.startsWith('›') &&
99
+ !trimmed.includes('file://') &&
100
+ !trimmed.match(/^\d+:/) &&
101
+ !trimmed.match(/^Error/) &&
102
+ !trimmed.includes('{') &&
103
+ !trimmed.includes('}') &&
104
+ trimmed.length > 10) {
105
+ headerIndices.push({ index: i, testName: trimmed });
106
+ }
107
+ }
108
+ // If we found detailed headers, parse each one
109
+ if (headerIndices.length > 0) {
110
+ for (const header of headerIndices) {
111
+ const failure = {
112
+ testName: header.testName
113
+ };
114
+ // Parse block starting from line after header
115
+ parseDetailedBlock(lines, header.index + 1, failure);
116
+ // Add error type detection and guidance
117
+ if (!failure.errorType && failure.message) {
118
+ failure.errorType = detectErrorType(failure.message);
119
+ }
120
+ if (failure.errorType) {
121
+ failure.guidance = getErrorGuidance(failure.errorType);
122
+ }
123
+ failures.push(failure);
124
+ }
125
+ }
126
+ else {
127
+ // Fallback: No detailed headers found (minimal format)
128
+ // Look for summary lines and parse content after them
129
+ for (let i = 0; i < lines.length; i++) {
130
+ const trimmed = lines[i].trim();
131
+ if (trimmed.includes('✘') && trimmed.includes('[fail]:')) {
132
+ const failure = {};
133
+ const summaryMatch = trimmed.match(/✘\s+\[fail\]:\s+(.+)/);
134
+ if (summaryMatch) {
135
+ failure.testName = summaryMatch[1];
136
+ }
137
+ // Parse block starting from next line
138
+ parseDetailedBlock(lines, i + 1, failure);
139
+ // Add error type detection and guidance
140
+ if (!failure.errorType && failure.message) {
141
+ failure.errorType = detectErrorType(failure.message);
142
+ }
143
+ if (failure.errorType) {
144
+ failure.guidance = getErrorGuidance(failure.errorType);
145
+ }
146
+ failures.push(failure);
147
+ }
148
+ }
149
+ }
150
+ return failures;
151
+ }
152
+ /**
153
+ * Parse a detailed error block to extract file, line, and message
154
+ */
155
+ function parseDetailedBlock(lines, startIndex, failure) {
156
+ let i = startIndex;
157
+ let foundCodeSnippet = false;
158
+ let inErrorObject = false;
159
+ while (i < lines.length && i < startIndex + 60) {
160
+ const line = lines[i];
161
+ const trimmed = line.trim();
162
+ // Stop at next test header (clean test name with ›)
163
+ if (i > startIndex + 3 && trimmed.includes('›') && !trimmed.startsWith('›') &&
164
+ trimmed.length > 15 && !trimmed.includes('file://') &&
165
+ !trimmed.match(/^\d+:/) && !trimmed.match(/^Error/) &&
166
+ !trimmed.includes('{') && !trimmed.includes('}')) {
167
+ break;
168
+ }
169
+ // Stop at separator
170
+ if (trimmed === '─') {
171
+ break;
172
+ }
173
+ // Extract file path: "tests/ava/test.js:28" (appears right after test name header)
174
+ const fileMatch = trimmed.match(/^([^:]+\.(?:js|ts|mjs|cjs)):(\d+)$/);
175
+ if (fileMatch && !failure.file) {
176
+ failure.file = fileMatch[1];
177
+ failure.line = parseInt(fileMatch[2], 10);
178
+ i++;
179
+ continue;
180
+ }
181
+ // Extract from file:// URL: "› file://tests/ava/test.js:28:5"
182
+ const urlMatch = trimmed.match(/^›\s+file:\/\/(.+?):(\d+):\d+$/);
183
+ if (urlMatch && !failure.file) {
184
+ failure.file = urlMatch[1];
185
+ failure.line = parseInt(urlMatch[2], 10);
186
+ i++;
187
+ continue;
188
+ }
189
+ // Code snippet marker (line numbers like " 28: code here")
190
+ if (trimmed.match(/^\d+:/)) {
191
+ foundCodeSnippet = true;
192
+ i++;
193
+ continue;
194
+ }
195
+ // Error object start
196
+ if (trimmed.match(/^(?:TypeError|Error|.*Error)\s*\{$/)) {
197
+ inErrorObject = true;
198
+ i++;
199
+ continue;
200
+ }
201
+ // Error object end
202
+ if (inErrorObject && trimmed === '}') {
203
+ inErrorObject = false;
204
+ i++;
205
+ continue;
206
+ }
207
+ // Extract from error object properties
208
+ if (inErrorObject) {
209
+ // message property
210
+ const msgMatch = trimmed.match(/message:\s*'([^']+)'/);
211
+ if (msgMatch && !failure.message) {
212
+ failure.message = msgMatch[1];
213
+ }
214
+ // code property for error type detection
215
+ const codeMatch = trimmed.match(/code:\s*'([^']+)'/);
216
+ if (codeMatch) {
217
+ if (codeMatch[1] === 'ENOENT') {
218
+ failure.errorType = 'file-not-found';
219
+ }
220
+ else if (codeMatch[1] === 'ERR_MODULE_NOT_FOUND') {
221
+ failure.errorType = 'import-error';
222
+ }
223
+ }
224
+ i++;
225
+ continue;
226
+ }
227
+ // Extract error from Error: line (after error object)
228
+ const errorLineMatch = trimmed.match(/^(?:TypeError|Error|.*Error):\s+(.+)$/);
229
+ if (errorLineMatch && !inErrorObject) {
230
+ if (!failure.message) {
231
+ failure.message = errorLineMatch[1];
232
+ }
233
+ // Look for file in stack trace (next few lines)
234
+ if (!failure.file && i + 1 < lines.length) {
235
+ for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) {
236
+ const stackLine = lines[j].trim();
237
+ // Match: at file:///path/to/file.js:110:24
238
+ // But skip node_modules and ava lib files
239
+ const stackMatch = stackLine.match(/at\s+(?:.*?\s+)?\(?file:\/\/([^:)]+):(\d+):\d+/);
240
+ if (stackMatch) {
241
+ const stackFile = stackMatch[1];
242
+ // Skip node_modules and ava library files
243
+ if (!stackFile.includes('node_modules') && !stackFile.includes('/ava/lib/')) {
244
+ failure.file = stackFile;
245
+ failure.line = parseInt(stackMatch[2], 10);
246
+ break;
247
+ }
248
+ }
249
+ }
250
+ }
251
+ i++;
252
+ continue;
253
+ }
254
+ // Timeout marker
255
+ if (trimmed.includes('Test timeout exceeded')) {
256
+ if (!failure.message) {
257
+ failure.message = 'Test timeout exceeded';
258
+ }
259
+ failure.errorType = 'timeout';
260
+ i++;
261
+ continue;
262
+ }
263
+ // Error markers
264
+ if (trimmed === 'Error thrown in test:' || trimmed === 'Rejected promise returned by test. Reason:') {
265
+ i++;
266
+ continue;
267
+ }
268
+ // Detect assertion from Difference section
269
+ if (trimmed.startsWith('Difference') && trimmed.includes('actual') && trimmed.includes('expected')) {
270
+ if (!failure.message) {
271
+ failure.message = 'Assertion failed';
272
+ }
273
+ if (!failure.errorType) {
274
+ failure.errorType = 'assertion';
275
+ }
276
+ i++;
277
+ continue;
278
+ }
279
+ // Skip diff headers and diff lines
280
+ if (trimmed.startsWith('Difference') || trimmed.startsWith('Expected:') ||
281
+ trimmed.startsWith('Received:') || trimmed.match(/^[+-]\s/)) {
282
+ i++;
283
+ continue;
284
+ }
285
+ // Assertion message (single line after code snippet, before Difference section)
286
+ if (foundCodeSnippet && !failure.message && trimmed.length > 0 && trimmed.length < 150 &&
287
+ !trimmed.match(/^\d+:/) && !trimmed.includes('Difference') &&
288
+ !trimmed.includes('{') && !trimmed.includes('}') &&
289
+ !trimmed.match(/^at\s+/) && !trimmed.includes('file://') &&
290
+ !trimmed.includes('.js:') && !trimmed.includes('.ts:')) {
291
+ failure.message = trimmed;
292
+ i++;
293
+ continue;
294
+ }
295
+ i++;
296
+ }
297
+ }
298
+ /**
299
+ * Detect error type from message
300
+ */
301
+ function detectErrorType(message) {
302
+ const lower = message.toLowerCase();
303
+ if (lower.includes('timeout') || lower.includes('timed out')) {
304
+ return 'timeout';
305
+ }
306
+ if (lower.includes('enoent') || lower.includes('no such file')) {
307
+ return 'file-not-found';
308
+ }
309
+ if (lower.includes('cannot read properties') || lower.includes('typeerror')) {
310
+ return 'type-error';
311
+ }
312
+ if (lower.includes('expected') || lower.includes('should') || lower.includes('difference')) {
313
+ return 'assertion';
314
+ }
315
+ if (lower.includes('cannot find module') || lower.includes('module not found')) {
316
+ return 'import-error';
317
+ }
318
+ return 'unknown';
319
+ }
320
+ /**
321
+ * Get guidance for a specific error type
322
+ */
323
+ function getErrorGuidance(errorType) {
324
+ const guidanceMap = {
325
+ assertion: 'Review the assertion logic and expected vs actual values',
326
+ timeout: 'Increase timeout limit with t.timeout() or optimize async operations',
327
+ 'file-not-found': 'Verify file path exists and permissions are correct',
328
+ 'type-error': 'Check for null/undefined values before accessing properties',
329
+ 'import-error': 'Verify module path and ensure dependencies are installed'
330
+ };
331
+ return guidanceMap[errorType];
332
+ }
333
+ /**
334
+ * Generate overall guidance from all failures
335
+ */
336
+ function generateGuidance(failures) {
337
+ if (failures.length === 0) {
338
+ return '';
339
+ }
340
+ const errorTypes = new Set(failures.map(f => f.errorType).filter(Boolean));
341
+ if (errorTypes.has('assertion')) {
342
+ return 'Review failing assertions - check expected vs actual values';
343
+ }
344
+ if (errorTypes.has('timeout')) {
345
+ return 'Tests are timing out - use t.timeout() to increase limit or optimize async operations';
346
+ }
347
+ if (errorTypes.has('type-error')) {
348
+ return 'Type errors detected - check for null/undefined values';
349
+ }
350
+ return 'Review test failures and fix the underlying issues';
351
+ }
352
+ /**
353
+ * Format clean output for display
354
+ */
355
+ function formatCleanOutput(errors) {
356
+ if (errors.length === 0) {
357
+ return '';
358
+ }
359
+ return errors
360
+ .map(e => {
361
+ const location = e.file && e.line ? `${e.file}:${e.line}` : e.file || 'unknown';
362
+ const context = e.context ? ` (${e.context})` : '';
363
+ return `${location}${context}: ${e.message}`;
364
+ })
365
+ .join('\n');
366
+ }
367
+ //# sourceMappingURL=ava-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ava-extractor.js","sourceRoot":"","sources":["../src/ava-extractor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,8 @@
6
6
  * Provides intelligent error parsing and formatting for common development tools:
7
7
  * - TypeScript (tsc)
8
8
  * - ESLint
9
- * - Vitest/Jest
9
+ * - Vitest/Jest/Mocha/Jasmine
10
+ * - JUnit XML (auto-detected)
10
11
  * - OpenAPI validators
11
12
  * - Generic fallback
12
13
  *
@@ -27,6 +28,10 @@ export type { FormattedError, ErrorExtractorResult, ErrorExtractor } from './typ
27
28
  export { extractTypeScriptErrors } from './typescript-extractor.js';
28
29
  export { extractESLintErrors } from './eslint-extractor.js';
29
30
  export { extractVitestErrors } from './vitest-extractor.js';
31
+ export { extractJestErrors } from './jest-extractor.js';
32
+ export { extractJUnitErrors } from './junit-extractor.js';
33
+ export { extractMochaErrors } from './mocha-extractor.js';
34
+ export { extractJasmineErrors } from './jasmine-extractor.js';
30
35
  export { extractOpenAPIErrors } from './openapi-extractor.js';
31
36
  export { extractGenericErrors } from './generic-extractor.js';
32
37
  export { extractByStepName } from './smart-extractor.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -6,7 +6,8 @@
6
6
  * Provides intelligent error parsing and formatting for common development tools:
7
7
  * - TypeScript (tsc)
8
8
  * - ESLint
9
- * - Vitest/Jest
9
+ * - Vitest/Jest/Mocha/Jasmine
10
+ * - JUnit XML (auto-detected)
10
11
  * - OpenAPI validators
11
12
  * - Generic fallback
12
13
  *
@@ -27,6 +28,10 @@
27
28
  export { extractTypeScriptErrors } from './typescript-extractor.js';
28
29
  export { extractESLintErrors } from './eslint-extractor.js';
29
30
  export { extractVitestErrors } from './vitest-extractor.js';
31
+ export { extractJestErrors } from './jest-extractor.js';
32
+ export { extractJUnitErrors } from './junit-extractor.js';
33
+ export { extractMochaErrors } from './mocha-extractor.js';
34
+ export { extractJasmineErrors } from './jasmine-extractor.js';
30
35
  export { extractOpenAPIErrors } from './openapi-extractor.js';
31
36
  export { extractGenericErrors } from './generic-extractor.js';
32
37
  // Smart extractor (auto-detection - recommended)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,yCAAyC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,yCAAyC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Jasmine Error Extractor
3
+ *
4
+ * Parses Jasmine test output and formats failures for LLM consumption.
5
+ *
6
+ * @package @vibe-validate/extractors
7
+ */
8
+ import type { ErrorExtractorResult } from './types.js';
9
+ /**
10
+ * Extract errors from Jasmine test output
11
+ *
12
+ * @param output - Jasmine text output
13
+ * @returns Structured error information
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const jasmineOutput = execSync('jasmine tests/**\/*.spec.js', { encoding: 'utf-8' });
18
+ * const result = extractJasmineErrors(jasmineOutput);
19
+ * console.log(result.summary); // "5 test(s) failed"
20
+ * ```
21
+ */
22
+ export declare function extractJasmineErrors(output: string): ErrorExtractorResult;
23
+ //# sourceMappingURL=jasmine-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jasmine-extractor.d.ts","sourceRoot":"","sources":["../src/jasmine-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAsC,MAAM,YAAY,CAAC;AAG3F;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAsFzE"}