Skip to content

Commit f8ebbc9

Browse files
authoredOct 9, 2019
feat: Convert to async API (#489)
BREAKING CHANGE: MapStore#transformCoverage is now async and returns a the coverage data only. The `sourceFinder` method is now async and provided directly on the `MapStore` instance.
1 parent 4d5e777 commit f8ebbc9

File tree

4 files changed

+62
-62
lines changed

4 files changed

+62
-62
lines changed
 

‎packages/istanbul-lib-source-maps/lib/map-store.js

+30-34
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
const path = require('path');
88
const fs = require('fs');
9+
const { promisify } = require('util');
910
const debug = require('debug')('istanbuljs');
10-
const SMC = require('source-map').SourceMapConsumer;
11+
const { SourceMapConsumer } = require('source-map');
1112
const pathutils = require('./pathutils');
12-
const transformer = require('./transformer');
13+
const { SourceMapTransformer } = require('./transformer');
14+
15+
const readFile = promisify(fs.readFile);
1316

1417
/**
1518
* Tracks source maps for registered files
@@ -146,45 +149,41 @@ class MapStore {
146149
});
147150
}
148151

152+
async sourceFinder(filePath) {
153+
const content = this.sourceStore.get(filePath);
154+
if (content !== undefined) {
155+
return content;
156+
}
157+
158+
if (path.isAbsolute(filePath)) {
159+
return await readFile(filePath, 'utf8');
160+
}
161+
162+
return await readFile(
163+
pathutils.asAbsolute(filePath, this.baseDir),
164+
'utf8'
165+
);
166+
}
167+
149168
/**
150169
* Transforms the coverage map provided into one that refers to original
151170
* sources when valid mappings have been registered with this store.
152171
* @param {CoverageMap} coverageMap - the coverage map to transform
153-
* @returns {Object} an object with 2 properties. `map` for the transformed
154-
* coverage map and `sourceFinder` which is a function to return the source
155-
* text for a file.
172+
* @returns {Promise<CoverageMap>} the transformed coverage map
156173
*/
157-
transformCoverage(coverageMap) {
158-
const sourceFinder = filePath => {
159-
const content = this.sourceStore.get(filePath);
160-
if (content !== undefined) {
161-
return content;
162-
}
163-
164-
if (path.isAbsolute(filePath)) {
165-
return fs.readFileSync(filePath, 'utf8');
166-
}
167-
168-
return fs.readFileSync(
169-
pathutils.asAbsolute(filePath, this.baseDir)
170-
);
171-
};
172-
174+
async transformCoverage(coverageMap) {
173175
const hasInputSourceMaps = coverageMap
174176
.files()
175177
.some(
176178
file => coverageMap.fileCoverageFor(file).data.inputSourceMap
177179
);
178180

179181
if (!hasInputSourceMaps && Object.keys(this.data).length === 0) {
180-
return {
181-
map: coverageMap,
182-
sourceFinder
183-
};
182+
return coverageMap;
184183
}
185184

186-
const mappedCoverage = transformer
187-
.create((filePath, coverage) => {
185+
const transformer = new SourceMapTransformer(
186+
async (filePath, coverage) => {
188187
try {
189188
const obj =
190189
coverage.data.inputSourceMap ||
@@ -193,7 +192,7 @@ class MapStore {
193192
return null;
194193
}
195194

196-
const smc = new SMC(obj);
195+
const smc = new SourceMapConsumer(obj);
197196
smc.sources.forEach(s => {
198197
const content = smc.sourceContentFor(s);
199198
if (content) {
@@ -212,13 +211,10 @@ class MapStore {
212211

213212
return null;
214213
}
215-
})
216-
.transform(coverageMap);
214+
}
215+
);
217216

218-
return {
219-
map: mappedCoverage,
220-
sourceFinder
221-
};
217+
return await transformer.transform(coverageMap);
222218
}
223219

224220
/**

‎packages/istanbul-lib-source-maps/lib/transformer.js

+16-14
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class SourceMapTransformer {
8989
return changes > 0;
9090
}
9191

92-
transform(coverageMap) {
92+
async transform(coverageMap) {
9393
const uniqueFiles = {};
9494
const getMappedCoverage = file => {
9595
const key = getUniqueKey(file);
@@ -103,29 +103,31 @@ class SourceMapTransformer {
103103
return uniqueFiles[key].mappedCoverage;
104104
};
105105

106-
coverageMap.files().forEach(file => {
106+
for (const file of coverageMap.files()) {
107107
const fc = coverageMap.fileCoverageFor(file);
108-
const sourceMap = this.finder(file, fc);
109-
if (!sourceMap) {
108+
const sourceMap = await this.finder(file, fc);
109+
110+
if (sourceMap) {
111+
const changed = this.processFile(
112+
fc,
113+
sourceMap,
114+
getMappedCoverage
115+
);
116+
if (!changed) {
117+
debug(`File [${file}] ignored, nothing could be mapped`);
118+
}
119+
} else {
110120
uniqueFiles[getUniqueKey(file)] = {
111121
file,
112122
mappedCoverage: fc
113123
};
114-
return;
115124
}
116-
117-
const changed = this.processFile(fc, sourceMap, getMappedCoverage);
118-
if (!changed) {
119-
debug(`File [${file}] ignored, nothing could be mapped`);
120-
}
121-
});
125+
}
122126

123127
return libCoverage.createCoverageMap(getOutput(uniqueFiles));
124128
}
125129
}
126130

127131
module.exports = {
128-
create(finder, opts) {
129-
return new SourceMapTransformer(finder, opts);
130-
}
132+
SourceMapTransformer
131133
};

‎packages/istanbul-lib-source-maps/test/map-store.test.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ const libCoverage = require('istanbul-lib-coverage');
66
const MapStore = require('../lib/map-store').MapStore;
77

88
describe('map store', () => {
9-
it('applies the inputSourceMap from the coverage object if available', () => {
9+
it('applies the inputSourceMap from the coverage object if available', async () => {
1010
/* shint ignore:line */
1111
const mapStore = new MapStore({});
1212

1313
const coverageMap = libCoverage.createCoverageMap(coverageData);
1414

15-
const transformed = mapStore.transformCoverage(coverageMap);
16-
assert.isUndefined(transformed.map.data.constructor);
15+
const transformed = await mapStore.transformCoverage(coverageMap);
16+
assert.isUndefined(transformed.data.constructor);
1717

1818
const transformedCoverage =
19-
transformed.map.data[path.resolve('./test.ts')].data;
19+
transformed.data[path.resolve('./test.ts')].data;
2020

2121
assert.deepEqual(transformedCoverage.statementMap, {
2222
'0': {

‎packages/istanbul-lib-source-maps/test/transformer.test.js

+12-10
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
const path = require('path');
44
const assert = require('chai').assert;
55
const createMap = require('istanbul-lib-coverage').createCoverageMap;
6-
const SMC = require('source-map').SourceMapConsumer;
7-
const createTransformer = require('../lib/transformer').create;
6+
const { SourceMapConsumer } = require('source-map');
7+
const { SourceMapTransformer } = require('../lib/transformer');
88

99
const coverageData = {
1010
statementMap: {
@@ -51,13 +51,14 @@ const testDataBackslash = {
5151
};
5252

5353
describe('transformer', () => {
54-
it('maps statement locations', () => {
54+
it('maps statement locations', async () => {
5555
const coverageMap = createMap({});
5656
coverageMap.addFileCoverage(testDataSlash.coverageData);
5757

58-
const mapped = createTransformer(
59-
() => new SMC(testDataSlash.sourceMap)
60-
).transform(coverageMap);
58+
const transformer = new SourceMapTransformer(
59+
() => new SourceMapConsumer(testDataSlash.sourceMap)
60+
);
61+
const mapped = await transformer.transform(coverageMap);
6162

6263
assert.deepEqual(
6364
mapped.data[testDataSlash.coverageData.path].statementMap,
@@ -74,17 +75,18 @@ describe('transformer', () => {
7475
);
7576
});
7677

77-
it('maps each file only once, /path/to/file.js and \\path\\to\\file.js are the same file', () => {
78+
it('maps each file only once, /path/to/file.js and \\path\\to\\file.js are the same file', async () => {
7879
const coverageMap = createMap({});
7980

8081
coverageMap.addFileCoverage(testDataSlash.coverageData);
8182
coverageMap.addFileCoverage(testDataBackslash.coverageData);
8283

83-
const mapped = createTransformer(file =>
84+
const transformer = new SourceMapTransformer(file =>
8485
file === testDataSlash.coverageData.path
85-
? new SMC(testDataSlash.sourceMap)
86+
? new SourceMapConsumer(testDataSlash.sourceMap)
8687
: undefined
87-
).transform(coverageMap);
88+
);
89+
const mapped = await transformer.transform(coverageMap);
8890

8991
assert.equal(Object.keys(mapped.data).length, 1);
9092
assert.isDefined(mapped.data[testDataBackslash.coverageData.path]);

0 commit comments

Comments
 (0)
Please sign in to comment.