@vitest/coverage-v8 2.1.0-beta.5 → 2.1.0-beta.7

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.
@@ -0,0 +1,16 @@
1
+ import { V8CoverageProvider } from './provider.js';
2
+ import 'istanbul-lib-coverage';
3
+ import 'vitest/coverage';
4
+ import 'vitest/node';
5
+ import 'vitest';
6
+
7
+ declare const _default: {
8
+ startCoverage(): Promise<void>;
9
+ takeCoverage(): Promise<{
10
+ result: any[];
11
+ }>;
12
+ stopCoverage(): Promise<void>;
13
+ getProvider(): Promise<V8CoverageProvider>;
14
+ };
15
+
16
+ export { _default as default };
@@ -0,0 +1,50 @@
1
+ import { cdp } from '@vitest/browser/context';
2
+ import { l as loadProvider } from './load-provider-Bl5rgjsL.js';
3
+
4
+ const session = cdp();
5
+ var browser = {
6
+ async startCoverage() {
7
+ await session.send("Profiler.enable");
8
+ await session.send("Profiler.startPreciseCoverage", {
9
+ callCount: true,
10
+ detailed: true
11
+ });
12
+ },
13
+ async takeCoverage() {
14
+ const coverage = await session.send("Profiler.takePreciseCoverage");
15
+ const result = [];
16
+ for (const entry of coverage.result) {
17
+ if (filterResult(entry)) {
18
+ result.push({
19
+ ...entry,
20
+ url: decodeURIComponent(entry.url.replace(window.location.origin, ""))
21
+ });
22
+ }
23
+ }
24
+ return { result };
25
+ },
26
+ async stopCoverage() {
27
+ await session.send("Profiler.stopPreciseCoverage");
28
+ await session.send("Profiler.disable");
29
+ },
30
+ async getProvider() {
31
+ return loadProvider();
32
+ }
33
+ };
34
+ function filterResult(coverage) {
35
+ if (!coverage.url.startsWith(window.location.origin)) {
36
+ return false;
37
+ }
38
+ if (coverage.url.includes("/node_modules/")) {
39
+ return false;
40
+ }
41
+ if (coverage.url.includes("__vitest_browser__")) {
42
+ return false;
43
+ }
44
+ if (coverage.url.includes("__vitest__/assets")) {
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+
50
+ export { browser as default };
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ import { Profiler } from 'node:inspector';
2
2
  import { V8CoverageProvider } from './provider.js';
3
3
  import 'istanbul-lib-coverage';
4
4
  import 'vitest/coverage';
5
- import 'vitest';
6
5
  import 'vitest/node';
6
+ import 'vitest';
7
7
 
8
8
  declare const _default: {
9
9
  startCoverage(): void;
package/dist/index.js CHANGED
@@ -1,34 +1,40 @@
1
1
  import inspector from 'node:inspector';
2
2
  import { provider } from 'std-env';
3
+ import { l as loadProvider } from './load-provider-Bl5rgjsL.js';
3
4
 
4
5
  const session = new inspector.Session();
5
- function startCoverage() {
6
- session.connect();
7
- session.post("Profiler.enable");
8
- session.post("Profiler.startPreciseCoverage", {
9
- callCount: true,
10
- detailed: true
11
- });
12
- }
13
- async function takeCoverage() {
14
- return new Promise((resolve, reject) => {
15
- session.post("Profiler.takePreciseCoverage", async (error, coverage) => {
16
- if (error) {
17
- return reject(error);
6
+ var index = {
7
+ startCoverage() {
8
+ session.connect();
9
+ session.post("Profiler.enable");
10
+ session.post("Profiler.startPreciseCoverage", {
11
+ callCount: true,
12
+ detailed: true
13
+ });
14
+ },
15
+ takeCoverage() {
16
+ return new Promise((resolve, reject) => {
17
+ session.post("Profiler.takePreciseCoverage", async (error, coverage) => {
18
+ if (error) {
19
+ return reject(error);
20
+ }
21
+ const result = coverage.result.filter(filterResult);
22
+ resolve({ result });
23
+ });
24
+ if (provider === "stackblitz") {
25
+ resolve({ result: [] });
18
26
  }
19
- const result = coverage.result.filter(filterResult);
20
- resolve({ result });
21
27
  });
22
- if (provider === "stackblitz") {
23
- resolve({ result: [] });
24
- }
25
- });
26
- }
27
- function stopCoverage() {
28
- session.post("Profiler.stopPreciseCoverage");
29
- session.post("Profiler.disable");
30
- session.disconnect();
31
- }
28
+ },
29
+ stopCoverage() {
30
+ session.post("Profiler.stopPreciseCoverage");
31
+ session.post("Profiler.disable");
32
+ session.disconnect();
33
+ },
34
+ async getProvider() {
35
+ return loadProvider();
36
+ }
37
+ };
32
38
  function filterResult(coverage) {
33
39
  if (!coverage.url.startsWith("file://")) {
34
40
  return false;
@@ -39,21 +45,4 @@ function filterResult(coverage) {
39
45
  return true;
40
46
  }
41
47
 
42
- var index = {
43
- startCoverage() {
44
- return startCoverage();
45
- },
46
- takeCoverage() {
47
- return takeCoverage();
48
- },
49
- stopCoverage() {
50
- return stopCoverage();
51
- },
52
- async getProvider() {
53
- const name = "./provider.js";
54
- const { V8CoverageProvider } = await import(name);
55
- return new V8CoverageProvider();
56
- }
57
- };
58
-
59
48
  export { index as default };
@@ -0,0 +1,10 @@
1
+ const name = "./provider.js";
2
+ async function loadProvider() {
3
+ const { V8CoverageProvider } = await import(
4
+ /* @vite-ignore */
5
+ name
6
+ );
7
+ return new V8CoverageProvider();
8
+ }
9
+
10
+ export { loadProvider as l };
@@ -1,7 +1,7 @@
1
1
  import { CoverageMap } from 'istanbul-lib-coverage';
2
2
  import { BaseCoverageProvider } from 'vitest/coverage';
3
- import { CoverageProvider, AfterSuiteRunMeta, ReportContext, ResolvedCoverageOptions } from 'vitest';
4
3
  import { Vitest } from 'vitest/node';
4
+ import { CoverageProvider, AfterSuiteRunMeta, ReportContext, ResolvedCoverageOptions } from 'vitest';
5
5
 
6
6
  interface TestExclude {
7
7
  new (opts: {
package/dist/provider.js CHANGED
@@ -452,6 +452,42 @@ function requireSourcemapCodec_umd () {
452
452
  intToChar[i] = c;
453
453
  charToInt[c] = i;
454
454
  }
455
+ function decodeInteger(reader, relative) {
456
+ let value = 0;
457
+ let shift = 0;
458
+ let integer = 0;
459
+ do {
460
+ const c = reader.next();
461
+ integer = charToInt[c];
462
+ value |= (integer & 31) << shift;
463
+ shift += 5;
464
+ } while (integer & 32);
465
+ const shouldNegate = value & 1;
466
+ value >>>= 1;
467
+ if (shouldNegate) {
468
+ value = -0x80000000 | -value;
469
+ }
470
+ return relative + value;
471
+ }
472
+ function encodeInteger(builder, num, relative) {
473
+ let delta = num - relative;
474
+ delta = delta < 0 ? (-delta << 1) | 1 : delta << 1;
475
+ do {
476
+ let clamped = delta & 0b011111;
477
+ delta >>>= 5;
478
+ if (delta > 0)
479
+ clamped |= 0b100000;
480
+ builder.write(intToChar[clamped]);
481
+ } while (delta > 0);
482
+ return num;
483
+ }
484
+ function hasMoreVlq(reader, max) {
485
+ if (reader.pos >= max)
486
+ return false;
487
+ return reader.peek() !== comma;
488
+ }
489
+
490
+ const bufLength = 1024 * 16;
455
491
  // Provide a fallback for older environments.
456
492
  const td = typeof TextDecoder !== 'undefined'
457
493
  ? /* #__PURE__ */ new TextDecoder()
@@ -471,74 +507,326 @@ function requireSourcemapCodec_umd () {
471
507
  return out;
472
508
  },
473
509
  };
510
+ class StringWriter {
511
+ constructor() {
512
+ this.pos = 0;
513
+ this.out = '';
514
+ this.buffer = new Uint8Array(bufLength);
515
+ }
516
+ write(v) {
517
+ const { buffer } = this;
518
+ buffer[this.pos++] = v;
519
+ if (this.pos === bufLength) {
520
+ this.out += td.decode(buffer);
521
+ this.pos = 0;
522
+ }
523
+ }
524
+ flush() {
525
+ const { buffer, out, pos } = this;
526
+ return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;
527
+ }
528
+ }
529
+ class StringReader {
530
+ constructor(buffer) {
531
+ this.pos = 0;
532
+ this.buffer = buffer;
533
+ }
534
+ next() {
535
+ return this.buffer.charCodeAt(this.pos++);
536
+ }
537
+ peek() {
538
+ return this.buffer.charCodeAt(this.pos);
539
+ }
540
+ indexOf(char) {
541
+ const { buffer, pos } = this;
542
+ const idx = buffer.indexOf(char, pos);
543
+ return idx === -1 ? buffer.length : idx;
544
+ }
545
+ }
546
+
547
+ const EMPTY = [];
548
+ function decodeOriginalScopes(input) {
549
+ const { length } = input;
550
+ const reader = new StringReader(input);
551
+ const scopes = [];
552
+ const stack = [];
553
+ let line = 0;
554
+ for (; reader.pos < length; reader.pos++) {
555
+ line = decodeInteger(reader, line);
556
+ const column = decodeInteger(reader, 0);
557
+ if (!hasMoreVlq(reader, length)) {
558
+ const last = stack.pop();
559
+ last[2] = line;
560
+ last[3] = column;
561
+ continue;
562
+ }
563
+ const kind = decodeInteger(reader, 0);
564
+ const fields = decodeInteger(reader, 0);
565
+ const hasName = fields & 0b0001;
566
+ const scope = (hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind]);
567
+ let vars = EMPTY;
568
+ if (hasMoreVlq(reader, length)) {
569
+ vars = [];
570
+ do {
571
+ const varsIndex = decodeInteger(reader, 0);
572
+ vars.push(varsIndex);
573
+ } while (hasMoreVlq(reader, length));
574
+ }
575
+ scope.vars = vars;
576
+ scopes.push(scope);
577
+ stack.push(scope);
578
+ }
579
+ return scopes;
580
+ }
581
+ function encodeOriginalScopes(scopes) {
582
+ const writer = new StringWriter();
583
+ for (let i = 0; i < scopes.length;) {
584
+ i = _encodeOriginalScopes(scopes, i, writer, [0]);
585
+ }
586
+ return writer.flush();
587
+ }
588
+ function _encodeOriginalScopes(scopes, index, writer, state) {
589
+ const scope = scopes[index];
590
+ const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;
591
+ if (index > 0)
592
+ writer.write(comma);
593
+ state[0] = encodeInteger(writer, startLine, state[0]);
594
+ encodeInteger(writer, startColumn, 0);
595
+ encodeInteger(writer, kind, 0);
596
+ const fields = scope.length === 6 ? 0b0001 : 0;
597
+ encodeInteger(writer, fields, 0);
598
+ if (scope.length === 6)
599
+ encodeInteger(writer, scope[5], 0);
600
+ for (const v of vars) {
601
+ encodeInteger(writer, v, 0);
602
+ }
603
+ for (index++; index < scopes.length;) {
604
+ const next = scopes[index];
605
+ const { 0: l, 1: c } = next;
606
+ if (l > endLine || (l === endLine && c >= endColumn)) {
607
+ break;
608
+ }
609
+ index = _encodeOriginalScopes(scopes, index, writer, state);
610
+ }
611
+ writer.write(comma);
612
+ state[0] = encodeInteger(writer, endLine, state[0]);
613
+ encodeInteger(writer, endColumn, 0);
614
+ return index;
615
+ }
616
+ function decodeGeneratedRanges(input) {
617
+ const { length } = input;
618
+ const reader = new StringReader(input);
619
+ const ranges = [];
620
+ const stack = [];
621
+ let genLine = 0;
622
+ let definitionSourcesIndex = 0;
623
+ let definitionScopeIndex = 0;
624
+ let callsiteSourcesIndex = 0;
625
+ let callsiteLine = 0;
626
+ let callsiteColumn = 0;
627
+ let bindingLine = 0;
628
+ let bindingColumn = 0;
629
+ do {
630
+ const semi = reader.indexOf(';');
631
+ let genColumn = 0;
632
+ for (; reader.pos < semi; reader.pos++) {
633
+ genColumn = decodeInteger(reader, genColumn);
634
+ if (!hasMoreVlq(reader, semi)) {
635
+ const last = stack.pop();
636
+ last[2] = genLine;
637
+ last[3] = genColumn;
638
+ continue;
639
+ }
640
+ const fields = decodeInteger(reader, 0);
641
+ const hasDefinition = fields & 0b0001;
642
+ const hasCallsite = fields & 0b0010;
643
+ const hasScope = fields & 0b0100;
644
+ let callsite = null;
645
+ let bindings = EMPTY;
646
+ let range;
647
+ if (hasDefinition) {
648
+ const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);
649
+ definitionScopeIndex = decodeInteger(reader, definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0);
650
+ definitionSourcesIndex = defSourcesIndex;
651
+ range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];
652
+ }
653
+ else {
654
+ range = [genLine, genColumn, 0, 0];
655
+ }
656
+ range.isScope = !!hasScope;
657
+ if (hasCallsite) {
658
+ const prevCsi = callsiteSourcesIndex;
659
+ const prevLine = callsiteLine;
660
+ callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);
661
+ const sameSource = prevCsi === callsiteSourcesIndex;
662
+ callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);
663
+ callsiteColumn = decodeInteger(reader, sameSource && prevLine === callsiteLine ? callsiteColumn : 0);
664
+ callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];
665
+ }
666
+ range.callsite = callsite;
667
+ if (hasMoreVlq(reader, semi)) {
668
+ bindings = [];
669
+ do {
670
+ bindingLine = genLine;
671
+ bindingColumn = genColumn;
672
+ const expressionsCount = decodeInteger(reader, 0);
673
+ let expressionRanges;
674
+ if (expressionsCount < -1) {
675
+ expressionRanges = [[decodeInteger(reader, 0)]];
676
+ for (let i = -1; i > expressionsCount; i--) {
677
+ const prevBl = bindingLine;
678
+ bindingLine = decodeInteger(reader, bindingLine);
679
+ bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);
680
+ const expression = decodeInteger(reader, 0);
681
+ expressionRanges.push([expression, bindingLine, bindingColumn]);
682
+ }
683
+ }
684
+ else {
685
+ expressionRanges = [[expressionsCount]];
686
+ }
687
+ bindings.push(expressionRanges);
688
+ } while (hasMoreVlq(reader, semi));
689
+ }
690
+ range.bindings = bindings;
691
+ ranges.push(range);
692
+ stack.push(range);
693
+ }
694
+ genLine++;
695
+ reader.pos = semi + 1;
696
+ } while (reader.pos < length);
697
+ return ranges;
698
+ }
699
+ function encodeGeneratedRanges(ranges) {
700
+ if (ranges.length === 0)
701
+ return '';
702
+ const writer = new StringWriter();
703
+ for (let i = 0; i < ranges.length;) {
704
+ i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);
705
+ }
706
+ return writer.flush();
707
+ }
708
+ function _encodeGeneratedRanges(ranges, index, writer, state) {
709
+ const range = ranges[index];
710
+ const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, isScope, callsite, bindings, } = range;
711
+ if (state[0] < startLine) {
712
+ catchupLine(writer, state[0], startLine);
713
+ state[0] = startLine;
714
+ state[1] = 0;
715
+ }
716
+ else if (index > 0) {
717
+ writer.write(comma);
718
+ }
719
+ state[1] = encodeInteger(writer, range[1], state[1]);
720
+ const fields = (range.length === 6 ? 0b0001 : 0) | (callsite ? 0b0010 : 0) | (isScope ? 0b0100 : 0);
721
+ encodeInteger(writer, fields, 0);
722
+ if (range.length === 6) {
723
+ const { 4: sourcesIndex, 5: scopesIndex } = range;
724
+ if (sourcesIndex !== state[2]) {
725
+ state[3] = 0;
726
+ }
727
+ state[2] = encodeInteger(writer, sourcesIndex, state[2]);
728
+ state[3] = encodeInteger(writer, scopesIndex, state[3]);
729
+ }
730
+ if (callsite) {
731
+ const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;
732
+ if (sourcesIndex !== state[4]) {
733
+ state[5] = 0;
734
+ state[6] = 0;
735
+ }
736
+ else if (callLine !== state[5]) {
737
+ state[6] = 0;
738
+ }
739
+ state[4] = encodeInteger(writer, sourcesIndex, state[4]);
740
+ state[5] = encodeInteger(writer, callLine, state[5]);
741
+ state[6] = encodeInteger(writer, callColumn, state[6]);
742
+ }
743
+ if (bindings) {
744
+ for (const binding of bindings) {
745
+ if (binding.length > 1)
746
+ encodeInteger(writer, -binding.length, 0);
747
+ const expression = binding[0][0];
748
+ encodeInteger(writer, expression, 0);
749
+ let bindingStartLine = startLine;
750
+ let bindingStartColumn = startColumn;
751
+ for (let i = 1; i < binding.length; i++) {
752
+ const expRange = binding[i];
753
+ bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);
754
+ bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);
755
+ encodeInteger(writer, expRange[0], 0);
756
+ }
757
+ }
758
+ }
759
+ for (index++; index < ranges.length;) {
760
+ const next = ranges[index];
761
+ const { 0: l, 1: c } = next;
762
+ if (l > endLine || (l === endLine && c >= endColumn)) {
763
+ break;
764
+ }
765
+ index = _encodeGeneratedRanges(ranges, index, writer, state);
766
+ }
767
+ if (state[0] < endLine) {
768
+ catchupLine(writer, state[0], endLine);
769
+ state[0] = endLine;
770
+ state[1] = 0;
771
+ }
772
+ else {
773
+ writer.write(comma);
774
+ }
775
+ state[1] = encodeInteger(writer, endColumn, state[1]);
776
+ return index;
777
+ }
778
+ function catchupLine(writer, lastLine, line) {
779
+ do {
780
+ writer.write(semicolon);
781
+ } while (++lastLine < line);
782
+ }
783
+
474
784
  function decode(mappings) {
475
- const state = new Int32Array(5);
785
+ const { length } = mappings;
786
+ const reader = new StringReader(mappings);
476
787
  const decoded = [];
477
- let index = 0;
788
+ let genColumn = 0;
789
+ let sourcesIndex = 0;
790
+ let sourceLine = 0;
791
+ let sourceColumn = 0;
792
+ let namesIndex = 0;
478
793
  do {
479
- const semi = indexOf(mappings, index);
794
+ const semi = reader.indexOf(';');
480
795
  const line = [];
481
796
  let sorted = true;
482
797
  let lastCol = 0;
483
- state[0] = 0;
484
- for (let i = index; i < semi; i++) {
798
+ genColumn = 0;
799
+ while (reader.pos < semi) {
485
800
  let seg;
486
- i = decodeInteger(mappings, i, state, 0); // genColumn
487
- const col = state[0];
488
- if (col < lastCol)
801
+ genColumn = decodeInteger(reader, genColumn);
802
+ if (genColumn < lastCol)
489
803
  sorted = false;
490
- lastCol = col;
491
- if (hasMoreVlq(mappings, i, semi)) {
492
- i = decodeInteger(mappings, i, state, 1); // sourcesIndex
493
- i = decodeInteger(mappings, i, state, 2); // sourceLine
494
- i = decodeInteger(mappings, i, state, 3); // sourceColumn
495
- if (hasMoreVlq(mappings, i, semi)) {
496
- i = decodeInteger(mappings, i, state, 4); // namesIndex
497
- seg = [col, state[1], state[2], state[3], state[4]];
804
+ lastCol = genColumn;
805
+ if (hasMoreVlq(reader, semi)) {
806
+ sourcesIndex = decodeInteger(reader, sourcesIndex);
807
+ sourceLine = decodeInteger(reader, sourceLine);
808
+ sourceColumn = decodeInteger(reader, sourceColumn);
809
+ if (hasMoreVlq(reader, semi)) {
810
+ namesIndex = decodeInteger(reader, namesIndex);
811
+ seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];
498
812
  }
499
813
  else {
500
- seg = [col, state[1], state[2], state[3]];
814
+ seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];
501
815
  }
502
816
  }
503
817
  else {
504
- seg = [col];
818
+ seg = [genColumn];
505
819
  }
506
820
  line.push(seg);
821
+ reader.pos++;
507
822
  }
508
823
  if (!sorted)
509
824
  sort(line);
510
825
  decoded.push(line);
511
- index = semi + 1;
512
- } while (index <= mappings.length);
826
+ reader.pos = semi + 1;
827
+ } while (reader.pos <= length);
513
828
  return decoded;
514
829
  }
515
- function indexOf(mappings, index) {
516
- const idx = mappings.indexOf(';', index);
517
- return idx === -1 ? mappings.length : idx;
518
- }
519
- function decodeInteger(mappings, pos, state, j) {
520
- let value = 0;
521
- let shift = 0;
522
- let integer = 0;
523
- do {
524
- const c = mappings.charCodeAt(pos++);
525
- integer = charToInt[c];
526
- value |= (integer & 31) << shift;
527
- shift += 5;
528
- } while (integer & 32);
529
- const shouldNegate = value & 1;
530
- value >>>= 1;
531
- if (shouldNegate) {
532
- value = -0x80000000 | -value;
533
- }
534
- state[j] += value;
535
- return pos;
536
- }
537
- function hasMoreVlq(mappings, i, length) {
538
- if (i >= length)
539
- return false;
540
- return mappings.charCodeAt(i) !== comma;
541
- }
542
830
  function sort(line) {
543
831
  line.sort(sortComparator);
544
832
  }
@@ -546,66 +834,42 @@ function requireSourcemapCodec_umd () {
546
834
  return a[0] - b[0];
547
835
  }
548
836
  function encode(decoded) {
549
- const state = new Int32Array(5);
550
- const bufLength = 1024 * 16;
551
- const subLength = bufLength - 36;
552
- const buf = new Uint8Array(bufLength);
553
- const sub = buf.subarray(0, subLength);
554
- let pos = 0;
555
- let out = '';
837
+ const writer = new StringWriter();
838
+ let sourcesIndex = 0;
839
+ let sourceLine = 0;
840
+ let sourceColumn = 0;
841
+ let namesIndex = 0;
556
842
  for (let i = 0; i < decoded.length; i++) {
557
843
  const line = decoded[i];
558
- if (i > 0) {
559
- if (pos === bufLength) {
560
- out += td.decode(buf);
561
- pos = 0;
562
- }
563
- buf[pos++] = semicolon;
564
- }
844
+ if (i > 0)
845
+ writer.write(semicolon);
565
846
  if (line.length === 0)
566
847
  continue;
567
- state[0] = 0;
848
+ let genColumn = 0;
568
849
  for (let j = 0; j < line.length; j++) {
569
850
  const segment = line[j];
570
- // We can push up to 5 ints, each int can take at most 7 chars, and we
571
- // may push a comma.
572
- if (pos > subLength) {
573
- out += td.decode(sub);
574
- buf.copyWithin(0, subLength, pos);
575
- pos -= subLength;
576
- }
577
851
  if (j > 0)
578
- buf[pos++] = comma;
579
- pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
852
+ writer.write(comma);
853
+ genColumn = encodeInteger(writer, segment[0], genColumn);
580
854
  if (segment.length === 1)
581
855
  continue;
582
- pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
583
- pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
584
- pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
856
+ sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);
857
+ sourceLine = encodeInteger(writer, segment[2], sourceLine);
858
+ sourceColumn = encodeInteger(writer, segment[3], sourceColumn);
585
859
  if (segment.length === 4)
586
860
  continue;
587
- pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
861
+ namesIndex = encodeInteger(writer, segment[4], namesIndex);
588
862
  }
589
863
  }
590
- return out + td.decode(buf.subarray(0, pos));
591
- }
592
- function encodeInteger(buf, pos, state, segment, j) {
593
- const next = segment[j];
594
- let num = next - state[j];
595
- state[j] = next;
596
- num = num < 0 ? (-num << 1) | 1 : num << 1;
597
- do {
598
- let clamped = num & 0b011111;
599
- num >>>= 5;
600
- if (num > 0)
601
- clamped |= 0b100000;
602
- buf[pos++] = intToChar[clamped];
603
- } while (num > 0);
604
- return pos;
864
+ return writer.flush();
605
865
  }
606
866
 
607
867
  exports.decode = decode;
868
+ exports.decodeGeneratedRanges = decodeGeneratedRanges;
869
+ exports.decodeOriginalScopes = decodeOriginalScopes;
608
870
  exports.encode = encode;
871
+ exports.encodeGeneratedRanges = encodeGeneratedRanges;
872
+ exports.encodeOriginalScopes = encodeOriginalScopes;
609
873
 
610
874
  Object.defineProperty(exports, '__esModule', { value: true });
611
875
 
@@ -2248,12 +2512,13 @@ function cleanUrl(url) {
2248
2512
  "wasi"
2249
2513
  ]);
2250
2514
 
2251
- var version = "2.1.0-beta.5";
2515
+ var version = "2.1.0-beta.7";
2252
2516
 
2253
2517
  const WRAPPER_LENGTH = 185;
2254
2518
  const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g;
2255
2519
  const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes", \[[^\]]*\]\),*/g;
2256
2520
  const DEFAULT_PROJECT = Symbol.for("default-project");
2521
+ const FILE_PROTOCOL = "file://";
2257
2522
  const debug = createDebug("vitest:coverage");
2258
2523
  let uniqueId = 0;
2259
2524
  class V8CoverageProvider extends BaseCoverageProvider {
@@ -2340,12 +2605,12 @@ Update your dependencies and make sure the versions match.`
2340
2605
  * backwards compatibility is a breaking change.
2341
2606
  */
2342
2607
  onAfterSuiteRun({ coverage, transformMode, projectName }) {
2343
- if (transformMode !== "web" && transformMode !== "ssr") {
2608
+ if (transformMode !== "web" && transformMode !== "ssr" && transformMode !== "browser") {
2344
2609
  throw new Error(`Invalid transform mode: ${transformMode}`);
2345
2610
  }
2346
2611
  let entry = this.coverageFiles.get(projectName || DEFAULT_PROJECT);
2347
2612
  if (!entry) {
2348
- entry = { web: [], ssr: [] };
2613
+ entry = { web: [], ssr: [], browser: [] };
2349
2614
  this.coverageFiles.set(projectName || DEFAULT_PROJECT, entry);
2350
2615
  }
2351
2616
  const filename = resolve(
@@ -2362,18 +2627,11 @@ Update your dependencies and make sure the versions match.`
2362
2627
  const total = this.pendingPromises.length;
2363
2628
  await Promise.all(this.pendingPromises);
2364
2629
  this.pendingPromises = [];
2365
- for (const [
2366
- projectName,
2367
- coveragePerProject
2368
- ] of this.coverageFiles.entries()) {
2369
- for (const [transformMode, filenames] of Object.entries(
2370
- coveragePerProject
2371
- )) {
2630
+ for (const [projectName, coveragePerProject] of this.coverageFiles.entries()) {
2631
+ for (const [transformMode, filenames] of Object.entries(coveragePerProject)) {
2372
2632
  let merged = { result: [] };
2373
- for (const chunk of this.toSlices(
2374
- filenames,
2375
- this.options.processingConcurrency
2376
- )) {
2633
+ const project = this.ctx.projects.find((p) => p.getName() === projectName) || this.ctx.getCoreWorkspaceProject();
2634
+ for (const chunk of this.toSlices(filenames, this.options.processingConcurrency)) {
2377
2635
  if (debug.enabled) {
2378
2636
  index += chunk.length;
2379
2637
  debug("Covered files %d/%d", index, total);
@@ -2388,7 +2646,7 @@ Update your dependencies and make sure the versions match.`
2388
2646
  }
2389
2647
  const converted = await this.convertCoverage(
2390
2648
  merged,
2391
- projectName,
2649
+ project,
2392
2650
  transformMode
2393
2651
  );
2394
2652
  const transformedCoverage = await transformCoverage(converted);
@@ -2401,6 +2659,9 @@ Update your dependencies and make sure the versions match.`
2401
2659
  const converted = await this.convertCoverage(untestedCoverage);
2402
2660
  coverageMap.merge(await transformCoverage(converted));
2403
2661
  }
2662
+ if (this.options.excludeAfterRemap) {
2663
+ coverageMap.filter((filename) => this.testExclude.shouldInstrument(filename));
2664
+ }
2404
2665
  return coverageMap;
2405
2666
  }
2406
2667
  async reportCoverage(coverageMap, { allTestsRun }) {
@@ -2488,6 +2749,7 @@ Update your dependencies and make sure the versions match.`
2488
2749
  const transformResults = normalizeTransformResults(
2489
2750
  this.ctx.vitenode.fetchCache
2490
2751
  );
2752
+ const transform = this.createUncoveredFileTransformer(this.ctx);
2491
2753
  const allFiles = await this.testExclude.glob(this.ctx.config.root);
2492
2754
  let includedFiles = allFiles.map(
2493
2755
  (file) => resolve(this.ctx.config.root, file)
@@ -2512,7 +2774,8 @@ Update your dependencies and make sure the versions match.`
2512
2774
  chunk.map(async (filename) => {
2513
2775
  const { originalSource } = await this.getSources(
2514
2776
  filename.href,
2515
- transformResults
2777
+ transformResults,
2778
+ transform
2516
2779
  );
2517
2780
  const coverage = {
2518
2781
  url: filename.href,
@@ -2545,13 +2808,13 @@ Update your dependencies and make sure the versions match.`
2545
2808
  }
2546
2809
  return merged;
2547
2810
  }
2548
- async getSources(url, transformResults, functions = []) {
2811
+ async getSources(url, transformResults, onTransform, functions = []) {
2549
2812
  const filePath = normalize(fileURLToPath$1(url));
2550
2813
  let isExecuted = true;
2551
2814
  let transformResult = transformResults.get(filePath);
2552
2815
  if (!transformResult) {
2553
2816
  isExecuted = false;
2554
- transformResult = await this.ctx.vitenode.transformRequest(filePath).catch(() => null);
2817
+ transformResult = await onTransform(removeStartsWith(url, FILE_PROTOCOL)).catch(() => void 0);
2555
2818
  }
2556
2819
  const map = transformResult?.map;
2557
2820
  const code = transformResult?.code;
@@ -2587,19 +2850,37 @@ Update your dependencies and make sure the versions match.`
2587
2850
  }
2588
2851
  };
2589
2852
  }
2590
- async convertCoverage(coverage, projectName, transformMode) {
2591
- const viteNode = this.ctx.projects.find((project) => project.getName() === projectName)?.vitenode || this.ctx.vitenode;
2592
- const fetchCache = transformMode ? viteNode.fetchCaches[transformMode] : viteNode.fetchCache;
2853
+ async convertCoverage(coverage, project = this.ctx.getCoreWorkspaceProject(), transformMode) {
2854
+ let fetchCache = project.vitenode.fetchCache;
2855
+ if (transformMode) {
2856
+ fetchCache = transformMode === "browser" ? /* @__PURE__ */ new Map() : project.vitenode.fetchCaches[transformMode];
2857
+ }
2593
2858
  const transformResults = normalizeTransformResults(fetchCache);
2594
- const scriptCoverages = coverage.result.filter(
2595
- (result) => this.testExclude.shouldInstrument(fileURLToPath$1(result.url))
2596
- );
2859
+ async function onTransform(filepath) {
2860
+ if (transformMode === "browser" && project.browser) {
2861
+ const result = await project.browser.vite.transformRequest(removeStartsWith(filepath, project.config.root));
2862
+ if (result) {
2863
+ return { ...result, code: `${result.code}// <inline-source-map>` };
2864
+ }
2865
+ }
2866
+ return project.vitenode.transformRequest(filepath);
2867
+ }
2868
+ const scriptCoverages = [];
2869
+ for (const result of coverage.result) {
2870
+ if (transformMode === "browser") {
2871
+ if (result.url.startsWith("/@fs")) {
2872
+ result.url = `${FILE_PROTOCOL}${removeStartsWith(result.url, "/@fs")}`;
2873
+ } else {
2874
+ result.url = `${FILE_PROTOCOL}${project.config.root}${result.url}`;
2875
+ }
2876
+ }
2877
+ if (this.testExclude.shouldInstrument(fileURLToPath$1(result.url))) {
2878
+ scriptCoverages.push(result);
2879
+ }
2880
+ }
2597
2881
  const coverageMap = libCoverage.createCoverageMap({});
2598
2882
  let index = 0;
2599
- for (const chunk of this.toSlices(
2600
- scriptCoverages,
2601
- this.options.processingConcurrency
2602
- )) {
2883
+ for (const chunk of this.toSlices(scriptCoverages, this.options.processingConcurrency)) {
2603
2884
  if (debug.enabled) {
2604
2885
  index += chunk.length;
2605
2886
  debug("Converting %d/%d", index, scriptCoverages.length);
@@ -2609,6 +2890,7 @@ Update your dependencies and make sure the versions match.`
2609
2890
  const sources = await this.getSources(
2610
2891
  url,
2611
2892
  transformResults,
2893
+ onTransform,
2612
2894
  functions
2613
2895
  );
2614
2896
  const wrapperLength = sources.isExecuted ? WRAPPER_LENGTH : 0;
@@ -2673,5 +2955,11 @@ function normalizeTransformResults(fetchCache) {
2673
2955
  }
2674
2956
  return normalized;
2675
2957
  }
2958
+ function removeStartsWith(filepath, start) {
2959
+ if (filepath.startsWith(start)) {
2960
+ return filepath.slice(start.length);
2961
+ }
2962
+ return filepath;
2963
+ }
2676
2964
 
2677
2965
  export { V8CoverageProvider };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/coverage-v8",
3
3
  "type": "module",
4
- "version": "2.1.0-beta.5",
4
+ "version": "2.1.0-beta.7",
5
5
  "description": "V8 coverage provider for Vitest",
6
6
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
7
7
  "license": "MIT",
@@ -28,6 +28,10 @@
28
28
  "types": "./dist/index.d.ts",
29
29
  "default": "./dist/index.js"
30
30
  },
31
+ "./browser": {
32
+ "types": "./dist/browser.d.ts",
33
+ "default": "./dist/browser.js"
34
+ },
31
35
  "./*": "./*"
32
36
  },
33
37
  "main": "./dist/index.js",
@@ -37,7 +41,13 @@
37
41
  "dist"
38
42
  ],
39
43
  "peerDependencies": {
40
- "vitest": "2.1.0-beta.5"
44
+ "@vitest/browser": "2.1.0-beta.7",
45
+ "vitest": "2.1.0-beta.7"
46
+ },
47
+ "peerDependenciesMeta": {
48
+ "@vitest/browser": {
49
+ "optional": true
50
+ }
41
51
  },
42
52
  "dependencies": {
43
53
  "@ampproject/remapping": "^2.3.0",
@@ -61,8 +71,9 @@
61
71
  "@types/istanbul-reports": "^3.0.4",
62
72
  "pathe": "^1.1.2",
63
73
  "v8-to-istanbul": "^9.3.0",
64
- "vitest": "2.1.0-beta.5",
65
- "vite-node": "2.1.0-beta.5"
74
+ "vite-node": "2.1.0-beta.7",
75
+ "vitest": "2.1.0-beta.7",
76
+ "@vitest/browser": "2.1.0-beta.7"
66
77
  },
67
78
  "scripts": {
68
79
  "build": "rimraf dist && rollup -c",