cenfun / monocart-coverage-reports

A code coverage tool to generate native V8 reports or Istanbul reports.
MIT License
31 stars 5 forks source link

[Bug] Coverage merge aborts #28

Closed exoego closed 2 months ago

exoego commented 3 months ago

Describe the bug Coverage merger aborts due to Cannot convert undefined or null to object thrown in monocart-coverage-reports/lib/istanbul/istanbul.js

To Reproduce

Expected behavior Coverage files are merged then a new single coverage is reported

Errors or Screenshots

/Users/***/IdeaProjects/hono/node_modules/monocart-coverage-reports/lib/istanbul/istanbul.js:91
    Object.keys(istanbulGroup).forEach((reportName) => {
           ^

TypeError: Cannot convert undefined or null to object
    at Function.keys (<anonymous>)
    at saveIstanbulReports (/Users/***/IdeaProjects/hono/node_modules/monocart-coverage-reports/lib/istanbul/istanbul.js:91:12)
    at getCoverageResults (/Users/***/IdeaProjects/hono/node_modules/monocart-coverage-reports/lib/generate.js:449:12)
    at generateCoverageReports (/Users/***/IdeaProjects/hono/node_modules/monocart-coverage-reports/lib/generate.js:453:35)
    at CoverageReport.generate (/Users/***/IdeaProjects/hono/node_modules/monocart-coverage-reports/lib/index.js:182:39)
    at async file:///Users/***/IdeaProjects/hono/.coverage-merge.mjs:55:1

Make a minimal reproduction

import { CoverageReport } from 'monocart-coverage-reports';

const inputDir = [
  // Each dir contains `coverage-final.json`
  './coverage/raw/default',
  './coverage/raw/jsx-dom',
  './coverage/raw/jsx-runtime',
];

const coverageOptions = {
  name: 'My Merged Coverage Report',
  inputDir,
  outputDir: './coverage/merged',

  // filter for both unit and e2e
  entryFilter: {
    '**/node_modules/**': false,
    '**/*': true
  },

  sourceFilter: {
    '**/node_modules/**': false,
    '**/src/**': true
  },

  reports: [
    ['v8'],
    ['console-details']
  ],
};

await new CoverageReport(coverageOptions).generate();

Additional context

cenfun commented 3 months ago

Generate multiple coverage files in Vitest with v8 provider or istanbul provider.

Looks like your coverage data is provided by Vitest, it's not the data format (raw report) which can merge with MCR You should try nyc cause Vitest will convert V8 data to Istanbul.

If you want to merge raw V8 coverage data, such as merging coverage of Vitest's unit test and Playwright's e2e test, see this example: https://github.com/cenfun/merge-code-coverage-vitest

Using vitest-monocart-coverage will make Vitest work with MCR

exoego commented 3 months ago

Thanks for quick response. Oops, I should read README carefully. I'll test that and update this issue.