@vitest/coverage-istanbul 3.0.9 → 3.1.0-beta.2

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/index.js CHANGED
@@ -1,36 +1,35 @@
1
1
  import { C as COVERAGE_STORE_KEY } from './constants-BCJfMgEg.js';
2
2
 
3
3
  const mod = {
4
- takeCoverage() {
5
- return globalThis[COVERAGE_STORE_KEY];
6
- },
7
- // Reset coverage map to prevent duplicate results if this is called twice in row
8
- startCoverage() {
9
- const coverageMap = globalThis[COVERAGE_STORE_KEY];
10
- if (!coverageMap) {
11
- return;
12
- }
13
- for (const filename in coverageMap) {
14
- const branches = coverageMap[filename].b;
15
- for (const key in branches) {
16
- branches[key] = branches[key].map(() => 0);
17
- }
18
- for (const metric of ["f", "s"]) {
19
- const entry = coverageMap[filename][metric];
20
- for (const key in entry) {
21
- entry[key] = 0;
22
- }
23
- }
24
- }
25
- },
26
- async getProvider() {
27
- const providerPath = "./provider.js";
28
- const { IstanbulCoverageProvider } = await import(
29
- /* @vite-ignore */
30
- providerPath
31
- );
32
- return new IstanbulCoverageProvider();
33
- }
4
+ takeCoverage() {
5
+ return globalThis[COVERAGE_STORE_KEY];
6
+ },
7
+ startCoverage() {
8
+ const coverageMap = globalThis[COVERAGE_STORE_KEY];
9
+ if (!coverageMap) {
10
+ return;
11
+ }
12
+ for (const filename in coverageMap) {
13
+ const branches = coverageMap[filename].b;
14
+ for (const key in branches) {
15
+ branches[key] = branches[key].map(() => 0);
16
+ }
17
+ for (const metric of ["f", "s"]) {
18
+ const entry = coverageMap[filename][metric];
19
+ for (const key in entry) {
20
+ entry[key] = 0;
21
+ }
22
+ }
23
+ }
24
+ },
25
+ async getProvider() {
26
+ const providerPath = "./provider.js";
27
+ const { IstanbulCoverageProvider } = await import(
28
+ /* @vite-ignore */
29
+ providerPath
30
+ );
31
+ return new IstanbulCoverageProvider();
32
+ }
34
33
  };
35
34
 
36
35
  export { mod as default };
package/dist/provider.js CHANGED
@@ -107,144 +107,131 @@ const isAbsolute = function(p) {
107
107
  return _IS_ABSOLUTE_RE.test(p);
108
108
  };
109
109
 
110
- var version = "3.0.9";
110
+ var version = "3.1.0-beta.2";
111
111
 
112
112
  const debug = createDebug("vitest:coverage");
113
113
  class IstanbulCoverageProvider extends BaseCoverageProvider {
114
- name = "istanbul";
115
- version = version;
116
- instrumenter;
117
- testExclude;
118
- initialize(ctx) {
119
- this._initialize(ctx);
120
- this.testExclude = new TestExclude({
121
- cwd: ctx.config.root,
122
- include: this.options.include,
123
- exclude: this.options.exclude,
124
- excludeNodeModules: true,
125
- extension: this.options.extension,
126
- relativePath: !this.options.allowExternal
127
- });
128
- this.instrumenter = createInstrumenter({
129
- produceSourceMap: true,
130
- autoWrap: false,
131
- esModules: true,
132
- compact: false,
133
- coverageVariable: COVERAGE_STORE_KEY,
134
- // @ts-expect-error missing type
135
- coverageGlobalScope: "globalThis",
136
- coverageGlobalScopeFunc: false,
137
- ignoreClassMethods: this.options.ignoreClassMethods,
138
- parserPlugins: [
139
- ...defaults.instrumenter.parserPlugins,
140
- ["importAttributes", { deprecatedAssertSyntax: true }]
141
- ],
142
- generatorOpts: {
143
- importAttributesKeyword: "with"
144
- }
145
- });
146
- }
147
- onFileTransform(sourceCode, id, pluginCtx) {
148
- if (!this.testExclude.shouldInstrument(id)) {
149
- return;
150
- }
151
- const sourceMap = pluginCtx.getCombinedSourcemap();
152
- sourceMap.sources = sourceMap.sources.map(removeQueryParameters);
153
- sourceCode = sourceCode.replaceAll(
154
- "_ts_decorate",
155
- "/* istanbul ignore next */_ts_decorate"
156
- );
157
- const code = this.instrumenter.instrumentSync(
158
- sourceCode,
159
- id,
160
- sourceMap
161
- );
162
- const map = this.instrumenter.lastSourceMap();
163
- return { code, map };
164
- }
165
- createCoverageMap() {
166
- return libCoverage.createCoverageMap({});
167
- }
168
- async generateCoverage({ allTestsRun }) {
169
- const coverageMap = this.createCoverageMap();
170
- let coverageMapByTransformMode = this.createCoverageMap();
171
- await this.readCoverageFiles({
172
- onFileRead(coverage) {
173
- coverageMapByTransformMode.merge(coverage);
174
- },
175
- onFinished: async () => {
176
- const transformedCoverage = await transformCoverage(coverageMapByTransformMode);
177
- coverageMap.merge(transformedCoverage);
178
- coverageMapByTransformMode = this.createCoverageMap();
179
- },
180
- onDebug: debug
181
- });
182
- if (this.options.all && (allTestsRun || !this.options.cleanOnRerun)) {
183
- const coveredFiles = coverageMap.files();
184
- const uncoveredCoverage = await this.getCoverageMapForUncoveredFiles(coveredFiles);
185
- coverageMap.merge(await transformCoverage(uncoveredCoverage));
186
- }
187
- if (this.options.excludeAfterRemap) {
188
- coverageMap.filter((filename) => this.testExclude.shouldInstrument(filename));
189
- }
190
- return coverageMap;
191
- }
192
- async generateReports(coverageMap, allTestsRun) {
193
- const context = libReport.createContext({
194
- dir: this.options.reportsDirectory,
195
- coverageMap,
196
- watermarks: this.options.watermarks
197
- });
198
- if (this.hasTerminalReporter(this.options.reporter)) {
199
- this.ctx.logger.log(
200
- c.blue(" % ") + c.dim("Coverage report from ") + c.yellow(this.name)
201
- );
202
- }
203
- for (const reporter of this.options.reporter) {
204
- reports.create(reporter[0], {
205
- skipFull: this.options.skipFull,
206
- projectRoot: this.ctx.config.root,
207
- ...reporter[1]
208
- }).execute(context);
209
- }
210
- if (this.options.thresholds) {
211
- await this.reportThresholds(coverageMap, allTestsRun);
212
- }
213
- }
214
- async parseConfigModule(configFilePath) {
215
- return parseModule(
216
- await promises.readFile(configFilePath, "utf8")
217
- );
218
- }
219
- async getCoverageMapForUncoveredFiles(coveredFiles) {
220
- const allFiles = await this.testExclude.glob(this.ctx.config.root);
221
- let includedFiles = allFiles.map(
222
- (file) => resolve(this.ctx.config.root, file)
223
- );
224
- if (this.ctx.config.changed) {
225
- includedFiles = (this.ctx.config.related || []).filter(
226
- (file) => includedFiles.includes(file)
227
- );
228
- }
229
- const uncoveredFiles = includedFiles.filter((file) => !coveredFiles.includes(file)).sort();
230
- const cacheKey = (/* @__PURE__ */ new Date()).getTime();
231
- const coverageMap = this.createCoverageMap();
232
- const transform = this.createUncoveredFileTransformer(this.ctx);
233
- for (const [index, filename] of uncoveredFiles.entries()) {
234
- debug("Uncovered file %s %d/%d", filename, index, uncoveredFiles.length);
235
- await transform(`${filename}?v=${cacheKey}`);
236
- const lastCoverage = this.instrumenter.lastFileCoverage();
237
- coverageMap.addFileCoverage(lastCoverage);
238
- }
239
- return coverageMap;
240
- }
114
+ name = "istanbul";
115
+ version = version;
116
+ instrumenter;
117
+ testExclude;
118
+ initialize(ctx) {
119
+ this._initialize(ctx);
120
+ this.testExclude = new TestExclude({
121
+ cwd: ctx.config.root,
122
+ include: this.options.include,
123
+ exclude: this.options.exclude,
124
+ excludeNodeModules: true,
125
+ extension: this.options.extension,
126
+ relativePath: !this.options.allowExternal
127
+ });
128
+ this.instrumenter = createInstrumenter({
129
+ produceSourceMap: true,
130
+ autoWrap: false,
131
+ esModules: true,
132
+ compact: false,
133
+ coverageVariable: COVERAGE_STORE_KEY,
134
+ coverageGlobalScope: "globalThis",
135
+ coverageGlobalScopeFunc: false,
136
+ ignoreClassMethods: this.options.ignoreClassMethods,
137
+ parserPlugins: [...defaults.instrumenter.parserPlugins, ["importAttributes", { deprecatedAssertSyntax: true }]],
138
+ generatorOpts: { importAttributesKeyword: "with" }
139
+ });
140
+ }
141
+ onFileTransform(sourceCode, id, pluginCtx) {
142
+ if (!this.testExclude.shouldInstrument(id)) {
143
+ return;
144
+ }
145
+ const sourceMap = pluginCtx.getCombinedSourcemap();
146
+ sourceMap.sources = sourceMap.sources.map(removeQueryParameters);
147
+ sourceCode = sourceCode.replaceAll("_ts_decorate", "/* istanbul ignore next */_ts_decorate");
148
+ const code = this.instrumenter.instrumentSync(sourceCode, id, sourceMap);
149
+ const map = this.instrumenter.lastSourceMap();
150
+ return {
151
+ code,
152
+ map
153
+ };
154
+ }
155
+ createCoverageMap() {
156
+ return libCoverage.createCoverageMap({});
157
+ }
158
+ async generateCoverage({ allTestsRun }) {
159
+ const coverageMap = this.createCoverageMap();
160
+ let coverageMapByTransformMode = this.createCoverageMap();
161
+ await this.readCoverageFiles({
162
+ onFileRead(coverage) {
163
+ coverageMapByTransformMode.merge(coverage);
164
+ },
165
+ onFinished: async () => {
166
+ const transformedCoverage = await transformCoverage(coverageMapByTransformMode);
167
+ coverageMap.merge(transformedCoverage);
168
+ coverageMapByTransformMode = this.createCoverageMap();
169
+ },
170
+ onDebug: debug
171
+ });
172
+ if (this.options.all && (allTestsRun || !this.options.cleanOnRerun)) {
173
+ const coveredFiles = coverageMap.files();
174
+ const uncoveredCoverage = await this.getCoverageMapForUncoveredFiles(coveredFiles);
175
+ coverageMap.merge(await transformCoverage(uncoveredCoverage));
176
+ }
177
+ if (this.options.excludeAfterRemap) {
178
+ coverageMap.filter((filename) => this.testExclude.shouldInstrument(filename));
179
+ }
180
+ return coverageMap;
181
+ }
182
+ async generateReports(coverageMap, allTestsRun) {
183
+ const context = libReport.createContext({
184
+ dir: this.options.reportsDirectory,
185
+ coverageMap,
186
+ watermarks: this.options.watermarks
187
+ });
188
+ if (this.hasTerminalReporter(this.options.reporter)) {
189
+ this.ctx.logger.log(c.blue(" % ") + c.dim("Coverage report from ") + c.yellow(this.name));
190
+ }
191
+ for (const reporter of this.options.reporter) {
192
+ reports.create(reporter[0], {
193
+ skipFull: this.options.skipFull,
194
+ projectRoot: this.ctx.config.root,
195
+ ...reporter[1]
196
+ }).execute(context);
197
+ }
198
+ if (this.options.thresholds) {
199
+ await this.reportThresholds(coverageMap, allTestsRun);
200
+ }
201
+ }
202
+ async parseConfigModule(configFilePath) {
203
+ return parseModule(await promises.readFile(configFilePath, "utf8"));
204
+ }
205
+ async getCoverageMapForUncoveredFiles(coveredFiles) {
206
+ const allFiles = await this.testExclude.glob(this.ctx.config.root);
207
+ let includedFiles = allFiles.map((file) => resolve(this.ctx.config.root, file));
208
+ if (this.ctx.config.changed) {
209
+ includedFiles = (this.ctx.config.related || []).filter((file) => includedFiles.includes(file));
210
+ }
211
+ const uncoveredFiles = includedFiles.filter((file) => !coveredFiles.includes(file)).sort();
212
+ const cacheKey = new Date().getTime();
213
+ const coverageMap = this.createCoverageMap();
214
+ const transform = this.createUncoveredFileTransformer(this.ctx);
215
+ for (const [index, filename] of uncoveredFiles.entries()) {
216
+ debug("Uncovered file %s %d/%d", filename, index, uncoveredFiles.length);
217
+ await transform(`${filename}?v=${cacheKey}`);
218
+ const lastCoverage = this.instrumenter.lastFileCoverage();
219
+ coverageMap.addFileCoverage(lastCoverage);
220
+ }
221
+ return coverageMap;
222
+ }
241
223
  }
242
224
  async function transformCoverage(coverageMap) {
243
- const sourceMapStore = libSourceMaps.createSourceMapStore();
244
- return await sourceMapStore.transformCoverage(coverageMap);
225
+ const sourceMapStore = libSourceMaps.createSourceMapStore();
226
+ return await sourceMapStore.transformCoverage(coverageMap);
245
227
  }
228
+ /**
229
+ * Remove possible query parameters from filenames
230
+ * - From `/src/components/Header.component.ts?vue&type=script&src=true&lang.ts`
231
+ * - To `/src/components/Header.component.ts`
232
+ */
246
233
  function removeQueryParameters(filename) {
247
- return filename.split("?")[0];
234
+ return filename.split("?")[0];
248
235
  }
249
236
 
250
237
  export { IstanbulCoverageProvider };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/coverage-istanbul",
3
3
  "type": "module",
4
- "version": "3.0.9",
4
+ "version": "3.1.0-beta.2",
5
5
  "description": "Istanbul coverage provider for Vitest",
6
6
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
7
7
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "dist"
38
38
  ],
39
39
  "peerDependencies": {
40
- "vitest": "3.0.9"
40
+ "vitest": "3.1.0-beta.2"
41
41
  },
42
42
  "dependencies": {
43
43
  "@istanbuljs/schema": "^0.1.3",
@@ -60,7 +60,7 @@
60
60
  "@types/istanbul-reports": "^3.0.4",
61
61
  "@types/test-exclude": "^6.0.2",
62
62
  "pathe": "^2.0.3",
63
- "vitest": "3.0.9"
63
+ "vitest": "3.1.0-beta.2"
64
64
  },
65
65
  "scripts": {
66
66
  "build": "rimraf dist && rollup -c",