@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.
- package/dist/extractor-registry.d.ts +103 -0
- package/dist/extractor-registry.d.ts.map +1 -0
- package/dist/extractor-registry.js +278 -0
- package/dist/extractor-registry.js.map +1 -0
- package/dist/extractors/ava/index.d.ts +23 -0
- package/dist/extractors/ava/index.d.ts.map +1 -0
- package/dist/extractors/ava/index.js +507 -0
- package/dist/extractors/ava/index.js.map +1 -0
- package/dist/extractors/ava/index.test.d.ts +7 -0
- package/dist/extractors/ava/index.test.d.ts.map +1 -0
- package/dist/extractors/ava/index.test.js +408 -0
- package/dist/extractors/ava/index.test.js.map +1 -0
- package/dist/extractors/eslint/index.d.ts +18 -0
- package/dist/extractors/eslint/index.d.ts.map +1 -0
- package/dist/extractors/eslint/index.js +206 -0
- package/dist/extractors/eslint/index.js.map +1 -0
- package/dist/extractors/eslint/index.test.d.ts +9 -0
- package/dist/extractors/eslint/index.test.d.ts.map +1 -0
- package/dist/extractors/eslint/index.test.js +191 -0
- package/dist/extractors/eslint/index.test.js.map +1 -0
- package/dist/extractors/generic/index.d.ts +30 -0
- package/dist/extractors/generic/index.d.ts.map +1 -0
- package/dist/extractors/generic/index.js +140 -0
- package/dist/extractors/generic/index.js.map +1 -0
- package/dist/extractors/generic/index.test.d.ts +7 -0
- package/dist/extractors/generic/index.test.d.ts.map +1 -0
- package/dist/extractors/generic/index.test.js +61 -0
- package/dist/extractors/generic/index.test.js.map +1 -0
- package/dist/extractors/jasmine/index.d.ts +17 -0
- package/dist/extractors/jasmine/index.d.ts.map +1 -0
- package/dist/extractors/jasmine/index.js +254 -0
- package/dist/extractors/jasmine/index.js.map +1 -0
- package/dist/extractors/jasmine/index.test.d.ts +7 -0
- package/dist/extractors/jasmine/index.test.d.ts.map +1 -0
- package/dist/extractors/jasmine/index.test.js +345 -0
- package/dist/extractors/jasmine/index.test.js.map +1 -0
- package/dist/extractors/jest/index.d.ts +17 -0
- package/dist/extractors/jest/index.d.ts.map +1 -0
- package/dist/extractors/jest/index.js +278 -0
- package/dist/extractors/jest/index.js.map +1 -0
- package/dist/extractors/jest/index.test.d.ts +9 -0
- package/dist/extractors/jest/index.test.d.ts.map +1 -0
- package/dist/extractors/jest/index.test.js +353 -0
- package/dist/extractors/jest/index.test.js.map +1 -0
- package/dist/extractors/junit/index.d.ts +18 -0
- package/dist/extractors/junit/index.d.ts.map +1 -0
- package/dist/extractors/junit/index.js +259 -0
- package/dist/extractors/junit/index.js.map +1 -0
- package/dist/extractors/junit/index.test.d.ts +7 -0
- package/dist/extractors/junit/index.test.d.ts.map +1 -0
- package/dist/extractors/junit/index.test.js +341 -0
- package/dist/extractors/junit/index.test.js.map +1 -0
- package/dist/extractors/maven-checkstyle/index.d.ts +23 -0
- package/dist/extractors/maven-checkstyle/index.d.ts.map +1 -0
- package/dist/extractors/maven-checkstyle/index.js +263 -0
- package/dist/extractors/maven-checkstyle/index.js.map +1 -0
- package/dist/extractors/maven-checkstyle/index.test.d.ts +2 -0
- package/dist/extractors/maven-checkstyle/index.test.d.ts.map +1 -0
- package/dist/extractors/maven-checkstyle/index.test.js +197 -0
- package/dist/extractors/maven-checkstyle/index.test.js.map +1 -0
- package/dist/extractors/maven-compiler/index.d.ts +23 -0
- package/dist/extractors/maven-compiler/index.d.ts.map +1 -0
- package/dist/extractors/maven-compiler/index.js +271 -0
- package/dist/extractors/maven-compiler/index.js.map +1 -0
- package/dist/extractors/maven-compiler/index.test.d.ts +2 -0
- package/dist/extractors/maven-compiler/index.test.d.ts.map +1 -0
- package/dist/extractors/maven-compiler/index.test.js +189 -0
- package/dist/extractors/maven-compiler/index.test.js.map +1 -0
- package/dist/extractors/maven-surefire/index.d.ts +23 -0
- package/dist/extractors/maven-surefire/index.d.ts.map +1 -0
- package/dist/extractors/maven-surefire/index.js +292 -0
- package/dist/extractors/maven-surefire/index.js.map +1 -0
- package/dist/extractors/maven-surefire/index.test.d.ts +2 -0
- package/dist/extractors/maven-surefire/index.test.d.ts.map +1 -0
- package/dist/extractors/maven-surefire/index.test.js +169 -0
- package/dist/extractors/maven-surefire/index.test.js.map +1 -0
- package/dist/extractors/mocha/index.d.ts +17 -0
- package/dist/extractors/mocha/index.d.ts.map +1 -0
- package/dist/extractors/mocha/index.js +241 -0
- package/dist/extractors/mocha/index.js.map +1 -0
- package/dist/extractors/mocha/index.test.d.ts +7 -0
- package/dist/extractors/mocha/index.test.d.ts.map +1 -0
- package/dist/extractors/mocha/index.test.js +300 -0
- package/dist/extractors/mocha/index.test.js.map +1 -0
- package/dist/extractors/playwright/index.d.ts +17 -0
- package/dist/extractors/playwright/index.d.ts.map +1 -0
- package/dist/extractors/playwright/index.js +320 -0
- package/dist/extractors/playwright/index.js.map +1 -0
- package/dist/extractors/playwright/index.test.d.ts +7 -0
- package/dist/extractors/playwright/index.test.d.ts.map +1 -0
- package/dist/extractors/playwright/index.test.js +274 -0
- package/dist/extractors/playwright/index.test.js.map +1 -0
- package/dist/extractors/tap/index.d.ts +23 -0
- package/dist/extractors/tap/index.d.ts.map +1 -0
- package/dist/extractors/tap/index.js +352 -0
- package/dist/extractors/tap/index.js.map +1 -0
- package/dist/extractors/tap/index.test.d.ts +7 -0
- package/dist/extractors/tap/index.test.d.ts.map +1 -0
- package/dist/extractors/tap/index.test.js +100 -0
- package/dist/extractors/tap/index.test.js.map +1 -0
- package/dist/extractors/typescript/index.d.ts +17 -0
- package/dist/extractors/typescript/index.d.ts.map +1 -0
- package/dist/extractors/typescript/index.js +150 -0
- package/dist/extractors/typescript/index.js.map +1 -0
- package/dist/extractors/typescript/index.test.d.ts +9 -0
- package/dist/extractors/typescript/index.test.d.ts.map +1 -0
- package/dist/extractors/typescript/index.test.js +177 -0
- package/dist/extractors/typescript/index.test.js.map +1 -0
- package/dist/extractors/vitest/index.d.ts +17 -0
- package/dist/extractors/vitest/index.d.ts.map +1 -0
- package/dist/extractors/vitest/index.js +564 -0
- package/dist/extractors/vitest/index.js.map +1 -0
- package/dist/extractors/vitest/index.test.d.ts +9 -0
- package/dist/extractors/vitest/index.test.d.ts.map +1 -0
- package/dist/extractors/vitest/index.test.js +373 -0
- package/dist/extractors/vitest/index.test.js.map +1 -0
- package/dist/index.d.ts +27 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -11
- package/dist/index.js.map +1 -1
- package/dist/maven-checkstyle-extractor.d.ts +20 -0
- package/dist/maven-checkstyle-extractor.d.ts.map +1 -0
- package/dist/maven-checkstyle-extractor.js +208 -0
- package/dist/maven-checkstyle-extractor.js.map +1 -0
- package/dist/maven-compiler-extractor.d.ts +20 -0
- package/dist/maven-compiler-extractor.d.ts.map +1 -0
- package/dist/maven-compiler-extractor.js +218 -0
- package/dist/maven-compiler-extractor.js.map +1 -0
- package/dist/maven-surefire-extractor.d.ts +20 -0
- package/dist/maven-surefire-extractor.d.ts.map +1 -0
- package/dist/maven-surefire-extractor.js +228 -0
- package/dist/maven-surefire-extractor.js.map +1 -0
- package/dist/maven-utils.d.ts +24 -0
- package/dist/maven-utils.d.ts.map +1 -0
- package/dist/maven-utils.js +36 -0
- package/dist/maven-utils.js.map +1 -0
- package/dist/plugin-loader.d.ts +82 -0
- package/dist/plugin-loader.d.ts.map +1 -0
- package/dist/plugin-loader.js +201 -0
- package/dist/plugin-loader.js.map +1 -0
- package/dist/result-schema.d.ts +59 -9
- package/dist/result-schema.d.ts.map +1 -1
- package/dist/result-schema.js +3 -19
- package/dist/result-schema.js.map +1 -1
- package/dist/sandbox.d.ts +161 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +254 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/sandbox.test.d.ts +8 -0
- package/dist/sandbox.test.d.ts.map +1 -0
- package/dist/sandbox.test.js +395 -0
- package/dist/sandbox.test.js.map +1 -0
- package/dist/sandboxed-extractor.d.ts +46 -0
- package/dist/sandboxed-extractor.d.ts.map +1 -0
- package/dist/sandboxed-extractor.js +172 -0
- package/dist/sandboxed-extractor.js.map +1 -0
- package/dist/sandboxed-extractor.test.d.ts +5 -0
- package/dist/sandboxed-extractor.test.d.ts.map +1 -0
- package/dist/sandboxed-extractor.test.js +346 -0
- package/dist/sandboxed-extractor.test.js.map +1 -0
- package/dist/smart-extractor.d.ts +22 -10
- package/dist/smart-extractor.d.ts.map +1 -1
- package/dist/smart-extractor.js +116 -163
- package/dist/smart-extractor.js.map +1 -1
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import mavenSurefireExtractor from './index.js';
|
|
3
|
+
describe('Maven Surefire Extractor Plugin', () => {
|
|
4
|
+
describe('metadata', () => {
|
|
5
|
+
it('should have correct plugin metadata', () => {
|
|
6
|
+
expect(mavenSurefireExtractor.metadata.name).toBe('maven-surefire');
|
|
7
|
+
expect(mavenSurefireExtractor.metadata.version).toBe('1.0.0');
|
|
8
|
+
expect(mavenSurefireExtractor.metadata.tags).toContain('maven');
|
|
9
|
+
expect(mavenSurefireExtractor.metadata.tags).toContain('junit');
|
|
10
|
+
});
|
|
11
|
+
it('should have hints for fast filtering', () => {
|
|
12
|
+
expect(mavenSurefireExtractor.hints).toBeDefined();
|
|
13
|
+
expect(mavenSurefireExtractor.hints?.required).toContain('[ERROR]');
|
|
14
|
+
expect(mavenSurefireExtractor.hints?.required).toContain('Tests run:');
|
|
15
|
+
expect(mavenSurefireExtractor.hints?.anyOf).toBeDefined();
|
|
16
|
+
});
|
|
17
|
+
it('should have priority higher than Jasmine to avoid false matches', () => {
|
|
18
|
+
// Regression test: Maven Surefire must have higher priority than Jasmine (90)
|
|
19
|
+
// to prevent Jasmine from incorrectly detecting Maven output
|
|
20
|
+
expect(mavenSurefireExtractor.priority).toBe(95);
|
|
21
|
+
expect(mavenSurefireExtractor.priority).toBeGreaterThan(90); // Higher than Jasmine
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('detect', () => {
|
|
25
|
+
it('should detect Maven Surefire output with high confidence', () => {
|
|
26
|
+
const output = `[INFO] Running tests...
|
|
27
|
+
[ERROR] Tests run: 10, Failures: 3, Errors: 1, Skipped: 0
|
|
28
|
+
[ERROR] com.example.FooTest.testBar -- Time elapsed: 0.123 s <<< FAILURE!
|
|
29
|
+
java.lang.AssertionError: Expected 5 but was 3`;
|
|
30
|
+
const result = mavenSurefireExtractor.detect(output);
|
|
31
|
+
expect(result.confidence).toBeGreaterThanOrEqual(70);
|
|
32
|
+
expect(result.patterns).toContain('Test summary (Tests run, Failures, Errors)');
|
|
33
|
+
expect(result.patterns).toContain('Test failure markers');
|
|
34
|
+
expect(result.reason).toContain('Maven Surefire');
|
|
35
|
+
});
|
|
36
|
+
it('should detect JUnit assertion errors', () => {
|
|
37
|
+
const output = `[ERROR] Tests run: 5, Failures: 2, Errors: 0
|
|
38
|
+
[ERROR] testFoo -- Time elapsed: 0.1 s <<< FAILURE!
|
|
39
|
+
org.opentest4j.AssertionFailedError: expected: "foo" but was: "bar"`;
|
|
40
|
+
const result = mavenSurefireExtractor.detect(output);
|
|
41
|
+
expect(result.confidence).toBeGreaterThanOrEqual(70);
|
|
42
|
+
expect(result.patterns).toContain('JUnit assertion errors');
|
|
43
|
+
});
|
|
44
|
+
it('should have low confidence for non-Surefire output', () => {
|
|
45
|
+
const output = `Some random output
|
|
46
|
+
No test markers here`;
|
|
47
|
+
const result = mavenSurefireExtractor.detect(output);
|
|
48
|
+
expect(result.confidence).toBeLessThan(40);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('extract', () => {
|
|
52
|
+
it('should extract test summary', () => {
|
|
53
|
+
const output = `[ERROR] Tests run: 10, Failures: 3, Errors: 1, Skipped: 1`;
|
|
54
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
55
|
+
expect(result.summary).toContain('3 failures, 1 errors');
|
|
56
|
+
});
|
|
57
|
+
it('should extract test failures with stack traces', () => {
|
|
58
|
+
const output = `[ERROR] Tests run: 1, Failures: 1, Errors: 0
|
|
59
|
+
[ERROR] com.example.FooTest.testBar -- Time elapsed: 0.123 s <<< FAILURE!
|
|
60
|
+
java.lang.AssertionError: Expected 5 but was 3
|
|
61
|
+
\tat com.example.FooTest.testBar(FooTest.java:42)
|
|
62
|
+
\tat java.base/java.lang.reflect.Method.invoke(Method.java:565)`;
|
|
63
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
64
|
+
expect(result.totalErrors).toBeGreaterThan(0);
|
|
65
|
+
if (result.errors.length > 0) {
|
|
66
|
+
expect(result.errors[0].file).toContain('FooTest.java');
|
|
67
|
+
expect(result.errors[0].message).toContain('testBar');
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
it('should extract NullPointerException errors', () => {
|
|
71
|
+
const output = `[ERROR] Tests run: 1, Failures: 0, Errors: 1
|
|
72
|
+
[ERROR] com.example.FooTest.testNull -- Time elapsed: 0.01 s <<< ERROR!
|
|
73
|
+
java.lang.NullPointerException: Cannot invoke "String.length()" because "value" is null
|
|
74
|
+
\tat com.example.FooTest.testNull(FooTest.java:77)`;
|
|
75
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
76
|
+
expect(result.totalErrors).toBeGreaterThan(0);
|
|
77
|
+
if (result.errors.length > 0) {
|
|
78
|
+
expect(result.errors[0].message).toContain('NullPointerException');
|
|
79
|
+
expect(result.errors[0].line).toBe(77);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
it('should limit errors to MAX_ERRORS_IN_ARRAY', () => {
|
|
83
|
+
// Create 15 test failures
|
|
84
|
+
const failures = Array.from({ length: 15 }, (_, i) => `[ERROR] com.example.Test.test${i} -- Time elapsed: 0.1 s <<< FAILURE!\njava.lang.AssertionError: Test ${i} failed`).join('\n\n');
|
|
85
|
+
const output = `[ERROR] Tests run: 15, Failures: 15, Errors: 0\n${failures}`;
|
|
86
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
87
|
+
expect(result.totalErrors).toBe(15); // All counted
|
|
88
|
+
expect(result.errors.length).toBeLessThanOrEqual(10); // Array limited
|
|
89
|
+
});
|
|
90
|
+
it('should provide guidance', () => {
|
|
91
|
+
const output = `[ERROR] Tests run: 5, Failures: 2, Errors: 0
|
|
92
|
+
[ERROR] com.example.Test.testFoo -- <<< FAILURE!`;
|
|
93
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
94
|
+
expect(result.guidance).toContain('Fix test failures');
|
|
95
|
+
expect(result.guidance).toContain('mvn test');
|
|
96
|
+
});
|
|
97
|
+
it('should extract exception types correctly', () => {
|
|
98
|
+
const output = `[ERROR] Tests run: 1, Failures: 0, Errors: 1
|
|
99
|
+
[ERROR] com.example.Test.testException -- <<< ERROR!
|
|
100
|
+
java.lang.IllegalArgumentException: Invalid format: expected 'XXX' but got 'invalid'
|
|
101
|
+
\tat com.example.Test.testException(Test.java:50)`;
|
|
102
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
103
|
+
expect(result.totalErrors).toBeGreaterThan(0);
|
|
104
|
+
if (result.errors.length > 0) {
|
|
105
|
+
expect(result.errors[0].message).toContain('IllegalArgumentException');
|
|
106
|
+
expect(result.errors[0].message).toContain('Invalid format');
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
it('should handle AssertJ assertion errors', () => {
|
|
110
|
+
const output = `[ERROR] Tests run: 1, Failures: 1, Errors: 0
|
|
111
|
+
[ERROR] com.example.Test.testAssertJ -- <<< FAILURE!
|
|
112
|
+
java.lang.AssertionError:
|
|
113
|
+
|
|
114
|
+
Expecting actual:
|
|
115
|
+
"Hello World"
|
|
116
|
+
to contain:
|
|
117
|
+
"Goodbye"
|
|
118
|
+
\tat com.example.Test.testAssertJ(Test.java:25)`;
|
|
119
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
120
|
+
expect(result.totalErrors).toBeGreaterThan(0);
|
|
121
|
+
if (result.errors.length > 0) {
|
|
122
|
+
expect(result.errors[0].message).toContain('AssertionError');
|
|
123
|
+
// Line number extraction is best-effort from stack traces
|
|
124
|
+
if (result.errors[0].line) {
|
|
125
|
+
expect(result.errors[0].line).toBe(25);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
it('should return low confidence for non-test output', () => {
|
|
130
|
+
const output = `[INFO] Building project...
|
|
131
|
+
[INFO] Success!`;
|
|
132
|
+
const result = mavenSurefireExtractor.extract(output);
|
|
133
|
+
expect(result.totalErrors).toBe(0);
|
|
134
|
+
expect(result.summary).toContain('Not Maven test output');
|
|
135
|
+
expect(result.metadata?.detection?.confidence).toBeLessThan(40);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe('samples', () => {
|
|
139
|
+
it('should have test samples', () => {
|
|
140
|
+
expect(mavenSurefireExtractor.samples).toBeDefined();
|
|
141
|
+
expect(mavenSurefireExtractor.samples.length).toBeGreaterThan(0);
|
|
142
|
+
});
|
|
143
|
+
it('should validate basic-assertion-failure sample', () => {
|
|
144
|
+
const sample = mavenSurefireExtractor.samples?.find((s) => s.name === 'basic-assertion-failure');
|
|
145
|
+
expect(sample).toBeDefined();
|
|
146
|
+
if (sample && 'input' in sample && sample.input) {
|
|
147
|
+
const result = mavenSurefireExtractor.extract(sample.input);
|
|
148
|
+
expect(result.totalErrors).toBe(sample.expected.totalErrors);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
it('should validate null-pointer-exception sample', () => {
|
|
152
|
+
const sample = mavenSurefireExtractor.samples?.find((s) => s.name === 'null-pointer-exception');
|
|
153
|
+
expect(sample).toBeDefined();
|
|
154
|
+
if (sample && 'input' in sample && sample.input) {
|
|
155
|
+
const result = mavenSurefireExtractor.extract(sample.input);
|
|
156
|
+
expect(result.totalErrors).toBe(sample.expected.totalErrors);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
it('should validate assertj-failure sample', () => {
|
|
160
|
+
const sample = mavenSurefireExtractor.samples?.find((s) => s.name === 'assertj-failure');
|
|
161
|
+
expect(sample).toBeDefined();
|
|
162
|
+
if (sample && 'input' in sample && sample.input) {
|
|
163
|
+
const result = mavenSurefireExtractor.extract(sample.input);
|
|
164
|
+
expect(result.totalErrors).toBe(sample.expected.totalErrors);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/extractors/maven-surefire/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mocha Error Extractor Plugin
|
|
3
|
+
*
|
|
4
|
+
* Parses and formats Mocha test output for LLM consumption.
|
|
5
|
+
*
|
|
6
|
+
* @package @vibe-validate/extractors
|
|
7
|
+
*/
|
|
8
|
+
import type { ExtractorPlugin } from '../../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Mocha Error Extractor Plugin
|
|
11
|
+
*
|
|
12
|
+
* Extracts Mocha test framework errors with 85% confidence.
|
|
13
|
+
* Parses test hierarchies, error types, and stack traces.
|
|
14
|
+
*/
|
|
15
|
+
declare const mochaPlugin: ExtractorPlugin;
|
|
16
|
+
export default mochaPlugin;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extractors/mocha/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,gBAAgB,CAAC;AAgPxB;;;;;GAKG;AACH,QAAA,MAAM,WAAW,EAAE,eAiBlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mocha Error Extractor Plugin
|
|
3
|
+
*
|
|
4
|
+
* Parses and formats Mocha test output for LLM consumption.
|
|
5
|
+
*
|
|
6
|
+
* @package @vibe-validate/extractors
|
|
7
|
+
*/
|
|
8
|
+
import { processTestFailures } from '../../utils/test-framework-utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Extract failure information from Mocha output
|
|
11
|
+
*/
|
|
12
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- Complexity 30 acceptable for Mocha output parsing (handles test hierarchies, error messages, and stack trace extraction)
|
|
13
|
+
function extractFailures(output) {
|
|
14
|
+
const failures = [];
|
|
15
|
+
const lines = output.split('\n');
|
|
16
|
+
let i = 0;
|
|
17
|
+
while (i < lines.length) {
|
|
18
|
+
const line = lines[i];
|
|
19
|
+
// Look for numbered failure markers (e.g., " 1) ")
|
|
20
|
+
// Only match detailed format (2 spaces), not summary format (6+ spaces)
|
|
21
|
+
// eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Mocha test framework output (controlled output), not user input
|
|
22
|
+
const failureMatch = /^ {2}(\d+)\)\s+(.*)$/.exec(line);
|
|
23
|
+
if (failureMatch) {
|
|
24
|
+
// failureMatch[1] contains the failure number (not used - test name is more important)
|
|
25
|
+
const firstPart = failureMatch[2].trim();
|
|
26
|
+
// Collect test hierarchy lines
|
|
27
|
+
const testNameParts = [];
|
|
28
|
+
// Check if first part ends with colon (simple format: "1) Test:")
|
|
29
|
+
const isSimpleFormat = firstPart.endsWith(':');
|
|
30
|
+
if (firstPart) {
|
|
31
|
+
testNameParts.push(firstPart.replace(/:$/, '')); // Remove trailing colon
|
|
32
|
+
}
|
|
33
|
+
let j = i + 1;
|
|
34
|
+
// If simple format, don't try to collect more hierarchy
|
|
35
|
+
if (!isSimpleFormat) {
|
|
36
|
+
// Continue collecting hierarchy lines until we hit blank line or error
|
|
37
|
+
while (j < lines.length) {
|
|
38
|
+
const nextLine = lines[j];
|
|
39
|
+
// Blank line marks end of hierarchy
|
|
40
|
+
if (nextLine.trim() === '') {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
// Error line marks end of hierarchy
|
|
44
|
+
if (/^\s+(Error|AssertionError|TypeError)/.exec(nextLine)) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
// Indented lines are part of hierarchy (at least 5 spaces for Mocha)
|
|
48
|
+
if (/^\s{5,}\S/.exec(nextLine)) {
|
|
49
|
+
const part = nextLine.trim().replace(/:$/, ''); // Remove trailing colon
|
|
50
|
+
testNameParts.push(part);
|
|
51
|
+
}
|
|
52
|
+
j++;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const testName = testNameParts.join(' > ');
|
|
56
|
+
// Now scan for error message and stack trace
|
|
57
|
+
let message;
|
|
58
|
+
let errorType;
|
|
59
|
+
let file;
|
|
60
|
+
let lineNumber;
|
|
61
|
+
// Continue from where we left off
|
|
62
|
+
while (j < lines.length && j < i + 40) {
|
|
63
|
+
const nextLine = lines[j];
|
|
64
|
+
// Stop if we hit the next failure
|
|
65
|
+
if (/^\s+\d+\)\s+/.exec(nextLine)) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
// Extract error type and message
|
|
69
|
+
// Pattern 1: " AssertionError [ERR_ASSERTION]: Expected..."
|
|
70
|
+
// Pattern 2: " Error: ENOENT: no such file..."
|
|
71
|
+
// Pattern 3: " TypeError: Cannot read..."
|
|
72
|
+
if (!message) {
|
|
73
|
+
// Match plain "Error" or prefixed errors like "TypeError", "AssertionError"
|
|
74
|
+
const errorMatch = /^\s+([A-Za-z]*Error)(?:\s\[\w+\])?\s*:\s*(.+)/.exec(nextLine);
|
|
75
|
+
if (errorMatch) {
|
|
76
|
+
errorType = errorMatch[1];
|
|
77
|
+
message = errorMatch[2].trim();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Extract file location from stack trace
|
|
81
|
+
if (!file && nextLine.includes('at Context.<anonymous>')) {
|
|
82
|
+
// Match various path formats:
|
|
83
|
+
// - file:///path/to/file.js:10:20
|
|
84
|
+
// - /absolute/path/file.js:10:20
|
|
85
|
+
// - relative/path/file.js:10:20
|
|
86
|
+
const locationMatch = /at Context\.<anonymous> \((?:file:\/\/)?([^:)]+):(\d+)(?::(\d+))?\)/.exec(nextLine);
|
|
87
|
+
if (locationMatch) {
|
|
88
|
+
file = locationMatch[1];
|
|
89
|
+
lineNumber = Number.parseInt(locationMatch[2], 10);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Extract file from timeout error messages: "Error: Timeout... (/path/to/file.js)"
|
|
93
|
+
if (!file && message?.includes('Timeout')) {
|
|
94
|
+
// eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Mocha test framework timeout messages (controlled output), not user input
|
|
95
|
+
const timeoutFileMatch = /\(([^)]+\.(?:js|ts|mjs|cjs))\)/.exec(message);
|
|
96
|
+
if (timeoutFileMatch) {
|
|
97
|
+
file = timeoutFileMatch[1];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
j++;
|
|
101
|
+
}
|
|
102
|
+
failures.push({
|
|
103
|
+
testName,
|
|
104
|
+
message,
|
|
105
|
+
errorType,
|
|
106
|
+
file,
|
|
107
|
+
line: lineNumber
|
|
108
|
+
});
|
|
109
|
+
i = j; // Skip to after this failure
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
i++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return failures;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Extract errors from Mocha test output
|
|
119
|
+
*
|
|
120
|
+
* @param output - Mocha text output
|
|
121
|
+
* @returns Structured error information
|
|
122
|
+
*/
|
|
123
|
+
function extract(output) {
|
|
124
|
+
// Check if this looks like Mocha output
|
|
125
|
+
if (!output.includes('failing') && !output.includes('passing')) {
|
|
126
|
+
return {
|
|
127
|
+
summary: 'Unable to parse Mocha output - invalid format',
|
|
128
|
+
errors: [],
|
|
129
|
+
totalErrors: 0,
|
|
130
|
+
errorSummary: output.trim(),
|
|
131
|
+
guidance: 'Ensure the input is valid Mocha test output',
|
|
132
|
+
metadata: {
|
|
133
|
+
confidence: 0,
|
|
134
|
+
completeness: 0,
|
|
135
|
+
issues: ['Not Mocha output format']
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Extract failure count
|
|
140
|
+
// eslint-disable-next-line sonarjs/slow-regex -- Safe: only parses Mocha test framework summary (controlled output), not user input
|
|
141
|
+
const failingMatch = /(\d+) failing/.exec(output);
|
|
142
|
+
const failureCount = failingMatch ? Number.parseInt(failingMatch[1], 10) : 0;
|
|
143
|
+
// Extract all failures
|
|
144
|
+
const failures = extractFailures(output);
|
|
145
|
+
// Early return if no failures detected (but failure count suggested there should be)
|
|
146
|
+
if (failureCount === 0 && failures.length === 0) {
|
|
147
|
+
return processTestFailures([], 95);
|
|
148
|
+
}
|
|
149
|
+
// Process failures using shared utility
|
|
150
|
+
return processTestFailures(failures, 95);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Detect if output is from Mocha test framework
|
|
154
|
+
*
|
|
155
|
+
* @param output - Command output to analyze
|
|
156
|
+
* @returns Detection result with confidence and patterns
|
|
157
|
+
*/
|
|
158
|
+
function detect(output) {
|
|
159
|
+
if (output.includes('failing') || output.includes('passing')) {
|
|
160
|
+
return {
|
|
161
|
+
confidence: 85,
|
|
162
|
+
patterns: ['failing/passing pattern'],
|
|
163
|
+
reason: 'Mocha test framework output detected',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return { confidence: 0, patterns: [], reason: '' };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Sample test cases for Mocha extractor
|
|
170
|
+
*/
|
|
171
|
+
const samples = [
|
|
172
|
+
{
|
|
173
|
+
name: 'single-assertion-error',
|
|
174
|
+
description: 'Single Mocha test failure with AssertionError',
|
|
175
|
+
input: `
|
|
176
|
+
Vibe-Validate Mocha Test Matrix
|
|
177
|
+
Failure Type 1: Assertion Errors
|
|
178
|
+
1) should match expected value
|
|
179
|
+
|
|
180
|
+
0 passing (10ms)
|
|
181
|
+
1 failing
|
|
182
|
+
|
|
183
|
+
1) Vibe-Validate Mocha Test Matrix
|
|
184
|
+
Failure Type 1: Assertion Errors
|
|
185
|
+
should match expected value:
|
|
186
|
+
|
|
187
|
+
AssertionError [ERR_ASSERTION]: Expected 4 to equal 5
|
|
188
|
+
at Context.<anonymous> (file:///tmp/test.js:16:14)
|
|
189
|
+
`,
|
|
190
|
+
expectedErrors: 1,
|
|
191
|
+
expectedPatterns: ['AssertionError', 'Expected 4 to equal 5'],
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: 'multiple-test-failures',
|
|
195
|
+
description: 'Multiple Mocha test failures with different error types',
|
|
196
|
+
input: `
|
|
197
|
+
0 passing (20ms)
|
|
198
|
+
3 failing
|
|
199
|
+
|
|
200
|
+
1) Suite > Test 1:
|
|
201
|
+
Error: First error
|
|
202
|
+
at Context.<anonymous> (test.js:10:15)
|
|
203
|
+
|
|
204
|
+
2) Suite > Test 2:
|
|
205
|
+
TypeError: Cannot read properties of null
|
|
206
|
+
at Context.<anonymous> (test.js:20:15)
|
|
207
|
+
|
|
208
|
+
3) Suite > Test 3:
|
|
209
|
+
AssertionError: Values not equal
|
|
210
|
+
at Context.<anonymous> (test.js:30:15)
|
|
211
|
+
`,
|
|
212
|
+
expectedErrors: 3,
|
|
213
|
+
expectedPatterns: ['First error', 'TypeError', 'AssertionError'],
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
/**
|
|
217
|
+
* Mocha Error Extractor Plugin
|
|
218
|
+
*
|
|
219
|
+
* Extracts Mocha test framework errors with 85% confidence.
|
|
220
|
+
* Parses test hierarchies, error types, and stack traces.
|
|
221
|
+
*/
|
|
222
|
+
const mochaPlugin = {
|
|
223
|
+
metadata: {
|
|
224
|
+
name: 'mocha',
|
|
225
|
+
version: '1.0.0',
|
|
226
|
+
author: 'vibe-validate',
|
|
227
|
+
description: 'Extracts Mocha test framework errors',
|
|
228
|
+
repository: 'https://github.com/jdutton/vibe-validate',
|
|
229
|
+
tags: ['mocha', 'testing', 'javascript'],
|
|
230
|
+
},
|
|
231
|
+
hints: {
|
|
232
|
+
required: ['failing'],
|
|
233
|
+
anyOf: ['passing'],
|
|
234
|
+
},
|
|
235
|
+
priority: 85,
|
|
236
|
+
detect,
|
|
237
|
+
extract,
|
|
238
|
+
samples,
|
|
239
|
+
};
|
|
240
|
+
export default mochaPlugin;
|
|
241
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extractors/mocha/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,mBAAmB,EAAwB,MAAM,qCAAqC,CAAC;AAEhG;;GAEG;AACH,oLAAoL;AACpL,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,oDAAoD;QACpD,wEAAwE;QACxE,mIAAmI;QACnI,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,YAAY,EAAE,CAAC;YACjB,uFAAuF;YACvF,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEzC,+BAA+B;YAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;YAEnC,kEAAkE;YAClE,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAE/C,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;YAC3E,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEd,wDAAwD;YACxD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,uEAAuE;gBACvE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBAE1B,oCAAoC;oBACpC,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBAC3B,MAAM;oBACR,CAAC;oBAED,oCAAoC;oBACpC,IAAI,sCAAsC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC1D,MAAM;oBACR,CAAC;oBAED,qEAAqE;oBACrE,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;wBACxE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC;oBAED,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE3C,6CAA6C;YAC7C,IAAI,OAA2B,CAAC;YAChC,IAAI,SAA6B,CAAC;YAClC,IAAI,IAAwB,CAAC;YAC7B,IAAI,UAA8B,CAAC;YAEnC,kCAAkC;YAClC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE1B,kCAAkC;gBAClC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAClC,MAAM;gBACR,CAAC;gBAED,iCAAiC;gBACjC,gEAAgE;gBAChE,mDAAmD;gBACnD,8CAA8C;gBAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,4EAA4E;oBAC5E,MAAM,UAAU,GAAG,+CAA+C,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAClF,IAAI,UAAU,EAAE,CAAC;wBACf,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;wBAC1B,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjC,CAAC;gBACH,CAAC;gBAED,yCAAyC;gBACzC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;oBACzD,8BAA8B;oBAC9B,kCAAkC;oBAClC,iCAAiC;oBACjC,gCAAgC;oBAChC,MAAM,aAAa,GAAG,qEAAqE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3G,IAAI,aAAa,EAAE,CAAC;wBAClB,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;wBACxB,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBAED,mFAAmF;gBACnF,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1C,6IAA6I;oBAC7I,MAAM,gBAAgB,GAAG,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,CAAC,EAAE,CAAC;YACN,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ;gBACR,OAAO;gBACP,SAAS;gBACT,IAAI;gBACJ,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;YAEH,CAAC,GAAG,CAAC,CAAC,CAAC,6BAA6B;QACtC,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,MAAc;IAC7B,wCAAwC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,+CAA+C;YACxD,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE;YAC3B,QAAQ,EAAE,6CAA6C;YACvD,QAAQ,EAAE;gBACR,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,MAAM,EAAE,CAAC,yBAAyB,CAAC;aACpC;SACF,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,oIAAoI;IACpI,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,uBAAuB;IACvB,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEzC,qFAAqF;IACrF,IAAI,YAAY,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,wCAAwC;IACxC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,MAAc;IAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,CAAC,yBAAyB,CAAC;YACrC,MAAM,EAAE,sCAAsC;SAC/C,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,GAAsB;IACjC;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,+CAA+C;QAC5D,KAAK,EAAE;;;;;;;;;;;;;;CAcV;QACG,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;KAC9D;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE;;;;;;;;;;;;;;;CAeV;QACG,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,gBAAgB,CAAC;KACjE;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,GAAoB;IACnC,QAAQ,EAAE;QACR,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,MAAM,EAAE,eAAe;QACvB,WAAW,EAAE,sCAAsC;QACnD,UAAU,EAAE,0CAA0C;QACtD,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;KACzC;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,CAAC,SAAS,CAAC;QACrB,KAAK,EAAE,CAAC,SAAS,CAAC;KACnB;IACD,QAAQ,EAAE,EAAE;IACZ,MAAM;IACN,OAAO;IACP,OAAO;CACR,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/extractors/mocha/index.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|