@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.
- package/dist/browser.d.ts +16 -0
- package/dist/browser.js +50 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +31 -42
- package/dist/load-provider-Bl5rgjsL.js +10 -0
- package/dist/provider.d.ts +1 -1
- package/dist/provider.js +406 -118
- package/package.json +15 -4
@@ -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 };
|
package/dist/browser.js
ADDED
@@ -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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
}
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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 };
|
package/dist/provider.d.ts
CHANGED
@@ -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
|
785
|
+
const { length } = mappings;
|
786
|
+
const reader = new StringReader(mappings);
|
476
787
|
const decoded = [];
|
477
|
-
let
|
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(
|
794
|
+
const semi = reader.indexOf(';');
|
480
795
|
const line = [];
|
481
796
|
let sorted = true;
|
482
797
|
let lastCol = 0;
|
483
|
-
|
484
|
-
|
798
|
+
genColumn = 0;
|
799
|
+
while (reader.pos < semi) {
|
485
800
|
let seg;
|
486
|
-
|
487
|
-
|
488
|
-
if (col < lastCol)
|
801
|
+
genColumn = decodeInteger(reader, genColumn);
|
802
|
+
if (genColumn < lastCol)
|
489
803
|
sorted = false;
|
490
|
-
lastCol =
|
491
|
-
if (hasMoreVlq(
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
if (hasMoreVlq(
|
496
|
-
|
497
|
-
seg = [
|
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 = [
|
814
|
+
seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];
|
501
815
|
}
|
502
816
|
}
|
503
817
|
else {
|
504
|
-
seg = [
|
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
|
-
|
512
|
-
} while (
|
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
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
579
|
-
|
852
|
+
writer.write(comma);
|
853
|
+
genColumn = encodeInteger(writer, segment[0], genColumn);
|
580
854
|
if (segment.length === 1)
|
581
855
|
continue;
|
582
|
-
|
583
|
-
|
584
|
-
|
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
|
-
|
861
|
+
namesIndex = encodeInteger(writer, segment[4], namesIndex);
|
588
862
|
}
|
589
863
|
}
|
590
|
-
return
|
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.
|
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
|
-
|
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
|
-
|
2374
|
-
|
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
|
-
|
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
|
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,
|
2591
|
-
|
2592
|
-
|
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
|
-
|
2595
|
-
(
|
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.
|
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.
|
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
|
-
"
|
65
|
-
"
|
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",
|