jest-test-lineage-reporter 2.1.2 → 2.1.3

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/README.md CHANGED
@@ -100,17 +100,21 @@ jest-lineage mutate --threshold 90
100
100
  jest-lineage mutate --debug --debug-dir ./mutations
101
101
  ```
102
102
 
103
+ **Note**: Mutation results are saved to `.jest-lineage-mutation-results.json`. Run `jest-lineage report` after mutation testing to generate an HTML report with mutation data included.
104
+
103
105
  #### `jest-lineage report`
104
- Generate HTML report from existing lineage data.
106
+ Generate HTML report from existing lineage data and mutation results.
105
107
 
106
108
  ```bash
107
- # Generate and open report
109
+ # Generate and open report (includes mutation results if available)
108
110
  jest-lineage report --open
109
111
 
110
112
  # Custom output path
111
113
  jest-lineage report --output coverage-report.html
112
114
  ```
113
115
 
116
+ **Tip**: The report command automatically loads mutation results from `.jest-lineage-mutation-results.json` if available.
117
+
114
118
  #### `jest-lineage query <file> [line]`
115
119
  Query which tests cover specific files or lines.
116
120
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jest-test-lineage-reporter",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "main": "src/TestCoverageReporter.js",
5
5
  "bin": {
6
6
  "jest-lineage": "./bin/jest-lineage.js"
@@ -57,6 +57,7 @@
57
57
  "LICENSE"
58
58
  ],
59
59
  "dependencies": {
60
+ "@babel/runtime": "^7.28.4",
60
61
  "@modelcontextprotocol/sdk": "^0.5.0",
61
62
  "chalk": "^4.1.2",
62
63
  "cli-table3": "^0.6.3",
@@ -3104,7 +3104,7 @@ class TestCoverageReporter {
3104
3104
  // Group mutations by line
3105
3105
  const mutationsByLine = {};
3106
3106
  fileData.mutations.forEach(mutation => {
3107
- const line = mutation.line || 'unknown';
3107
+ const line = mutation.lineNumber || mutation.line || 'unknown';
3108
3108
  if (!mutationsByLine[line]) {
3109
3109
  mutationsByLine[line] = [];
3110
3110
  }
@@ -55,6 +55,13 @@ async function mutateCommand(options) {
55
55
  spin.succeed('Mutation testing completed!');
56
56
  }
57
57
 
58
+ // Save results to file for HTML report
59
+ const fs = require('fs');
60
+ const path = require('path');
61
+ const resultsPath = path.join(process.cwd(), '.jest-lineage-mutation-results.json');
62
+ fs.writeFileSync(resultsPath, JSON.stringify(results, null, 2));
63
+ info(`Mutation results saved to: ${chalk.yellow(resultsPath)}`);
64
+
58
65
  // Print results
59
66
  printMutationSummary(results);
60
67
 
@@ -26,6 +26,19 @@ async function reportCommand(options) {
26
26
  // Process lineage data
27
27
  const lineageData = processLineageDataForMutation(rawData);
28
28
 
29
+ // Load mutation results if available
30
+ const fs = require('fs');
31
+ const mutationResultsPath = path.join(process.cwd(), '.jest-lineage-mutation-results.json');
32
+ let mutationResults = null;
33
+ if (fs.existsSync(mutationResultsPath)) {
34
+ try {
35
+ mutationResults = JSON.parse(fs.readFileSync(mutationResultsPath, 'utf8'));
36
+ info(`Loaded mutation results: ${chalk.cyan(mutationResults.totalMutations)} mutations tested`);
37
+ } catch (e) {
38
+ // Ignore errors loading mutation results
39
+ }
40
+ }
41
+
29
42
  // Create reporter instance with minimal config
30
43
  const reporter = new TestCoverageReporter(
31
44
  { rootDir: process.cwd() },
@@ -35,6 +48,11 @@ async function reportCommand(options) {
35
48
  // Load data into reporter
36
49
  reporter.processLineageResults(lineageData, 'unknown');
37
50
 
51
+ // Set mutation results if available
52
+ if (mutationResults) {
53
+ reporter.mutationResults = mutationResults;
54
+ }
55
+
38
56
  // Generate HTML report
39
57
  const spin = spinner('Generating HTML report...');
40
58
  spin.start();
@@ -39,6 +39,12 @@ async function runJest(options = {}) {
39
39
  jestArgs.push('--coverage');
40
40
  }
41
41
 
42
+ // Run tests serially when lineage tracking is enabled to avoid race conditions
43
+ // with file writes from parallel workers
44
+ if (enableLineage && !jestArgs.includes('--runInBand') && !jestArgs.includes('--maxWorkers')) {
45
+ jestArgs.push('--runInBand');
46
+ }
47
+
42
48
  // Set environment variables for lineage tracking
43
49
  const env = {
44
50
  ...process.env,
package/src/testSetup.js CHANGED
@@ -278,7 +278,31 @@ function createTestWrapper(originalFn, testType) {
278
278
  if (process.env.JEST_LINEAGE_MUTATION !== 'true') {
279
279
  // Also store in a more persistent way for the reporter
280
280
  if (!global.__LINEAGE_PERSISTENT_DATA__) {
281
- global.__LINEAGE_PERSISTENT_DATA__ = [];
281
+ // Initialize array - load existing tests from file if merging is enabled
282
+ // This ensures data persists across test files running in separate workers
283
+ const shouldMerge = process.env.JEST_LINEAGE_MERGE !== 'false';
284
+ if (shouldMerge) {
285
+ const fs = require('fs');
286
+ const path = require('path');
287
+ const filePath = path.join(process.cwd(), '.jest-lineage-data.json');
288
+
289
+ if (fs.existsSync(filePath)) {
290
+ try {
291
+ const existingData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
292
+ // Convert coverage objects back to Maps
293
+ global.__LINEAGE_PERSISTENT_DATA__ = existingData.tests.map(test => ({
294
+ ...test,
295
+ coverage: new Map(Object.entries(test.coverage || {}))
296
+ }));
297
+ } catch (e) {
298
+ global.__LINEAGE_PERSISTENT_DATA__ = [];
299
+ }
300
+ } else {
301
+ global.__LINEAGE_PERSISTENT_DATA__ = [];
302
+ }
303
+ } else {
304
+ global.__LINEAGE_PERSISTENT_DATA__ = [];
305
+ }
282
306
  }
283
307
  global.__LINEAGE_PERSISTENT_DATA__.push(testData);
284
308
 
@@ -645,8 +669,9 @@ function writeTrackingDataToFile() {
645
669
  try {
646
670
  const filePath = path.join(process.cwd(), '.jest-lineage-data.json');
647
671
 
648
- // Check if we should merge with existing data (default: false - recreate from scratch)
649
- const shouldMerge = process.env.JEST_LINEAGE_MERGE === 'true';
672
+ // Check if we should merge with existing data (default: true for multiple test files)
673
+ // Set JEST_LINEAGE_MERGE=false to disable merging and recreate from scratch
674
+ const shouldMerge = process.env.JEST_LINEAGE_MERGE !== 'false';
650
675
 
651
676
  let existingData = { timestamp: Date.now(), tests: [] };
652
677
  if (shouldMerge && fs.existsSync(filePath)) {
@@ -717,8 +742,6 @@ function writeTrackingDataToFile() {
717
742
  }
718
743
 
719
744
  fs.writeFileSync(filePath, JSON.stringify(dataToWrite, null, 2));
720
-
721
- // console.log(`📝 Wrote tracking data: ${dataToWrite.tests.length} total tests to ${filePath}`);
722
745
  } catch (error) {
723
746
  console.warn('Warning: Could not write tracking data to file:', error.message);
724
747
  }