From c2c34086893197ac2d1c09ba28d9b611850514ec Mon Sep 17 00:00:00 2001 From: bcoe Date: Tue, 2 Apr 2019 22:25:41 -0700 Subject: [PATCH 1/2] fix: cache source maps globally --- lib/source-maps.js | 12 ++++++------ test/source-maps.js | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 test/source-maps.js diff --git a/lib/source-maps.js b/lib/source-maps.js index c3238544c..0839c9d7f 100644 --- a/lib/source-maps.js +++ b/lib/source-maps.js @@ -4,12 +4,12 @@ const libSourceMaps = require('istanbul-lib-source-maps') const fs = require('fs') const path = require('path') -// TODO: write some unit tests for this class. +let sourceMapCache = libSourceMaps.createSourceMapStore() function SourceMaps (opts) { this.cache = opts.cache this.cacheDirectory = opts.cacheDirectory - this.sourceMapCache = libSourceMaps.createSourceMapStore() this.loadedMaps = {} + this._sourceMapCache = sourceMapCache } SourceMaps.prototype.extractAndRegister = function (code, filename, hash) { @@ -19,14 +19,14 @@ SourceMaps.prototype.extractAndRegister = function (code, filename, hash) { var mapPath = path.join(this.cacheDirectory, hash + '.map') fs.writeFileSync(mapPath, sourceMap.toJSON()) } else { - this.sourceMapCache.registerMap(filename, sourceMap.sourcemap) + this._sourceMapCache.registerMap(filename, sourceMap.sourcemap) } } return sourceMap } SourceMaps.prototype.remapCoverage = function (obj) { - var transformed = this.sourceMapCache.transformCoverage( + var transformed = this._sourceMapCache.transformCoverage( libCoverage.createCoverageMap(obj) ) return transformed.map.data @@ -34,7 +34,7 @@ SourceMaps.prototype.remapCoverage = function (obj) { SourceMaps.prototype.reloadCachedSourceMaps = function (report) { var _this = this - Object.keys(report).forEach(function (absFile) { + Object.keys(report).forEach((absFile) => { var fileReport = report[absFile] if (fileReport && fileReport.contentHash) { var hash = fileReport.contentHash @@ -48,7 +48,7 @@ SourceMaps.prototype.reloadCachedSourceMaps = function (report) { } } if (_this.loadedMaps[hash]) { - _this.sourceMapCache.registerMap(absFile, _this.loadedMaps[hash]) + this._sourceMapCache.registerMap(absFile, _this.loadedMaps[hash]) } } }) diff --git a/test/source-maps.js b/test/source-maps.js new file mode 100644 index 000000000..c95334832 --- /dev/null +++ b/test/source-maps.js @@ -0,0 +1,20 @@ +/* global describe, it */ + +require('chai').should() +require('tap').mochaGlobals() + +const { readFileSync } = require('fs') +const SourceMaps = require('../self-coverage/lib/source-maps') + +describe('source-maps', function () { + it('caches source maps globally', function () { + const sm = new SourceMaps({}) + // load a source map into cache. + const sourceFile = require.resolve('./fixtures/source-maps/instrumented/s1.min.js') + sm.extractAndRegister(readFileSync(sourceFile, 'utf8'), sourceFile, 'abc123') + // create a new SourceMaps instance. + const sm2 = new SourceMaps({}) + // the two instances of SourceMaps should share a cache. + sm._sourceMapCache.should.deep.equal(sm2._sourceMapCache) + }) +}) From 1f4e0b02d24acc369504e3bbe949da78551cb3aa Mon Sep 17 00:00:00 2001 From: bcoe Date: Wed, 3 Apr 2019 10:53:35 -0700 Subject: [PATCH 2/2] chore: address code review --- lib/source-maps.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/source-maps.js b/lib/source-maps.js index 0839c9d7f..c4840fc01 100644 --- a/lib/source-maps.js +++ b/lib/source-maps.js @@ -4,7 +4,7 @@ const libSourceMaps = require('istanbul-lib-source-maps') const fs = require('fs') const path = require('path') -let sourceMapCache = libSourceMaps.createSourceMapStore() +const sourceMapCache = libSourceMaps.createSourceMapStore() function SourceMaps (opts) { this.cache = opts.cache this.cacheDirectory = opts.cacheDirectory @@ -33,22 +33,21 @@ SourceMaps.prototype.remapCoverage = function (obj) { } SourceMaps.prototype.reloadCachedSourceMaps = function (report) { - var _this = this Object.keys(report).forEach((absFile) => { var fileReport = report[absFile] if (fileReport && fileReport.contentHash) { var hash = fileReport.contentHash - if (!(hash in _this.loadedMaps)) { + if (!(hash in this.loadedMaps)) { try { - var mapPath = path.join(_this.cacheDirectory, hash + '.map') - _this.loadedMaps[hash] = JSON.parse(fs.readFileSync(mapPath, 'utf8')) + var mapPath = path.join(this.cacheDirectory, hash + '.map') + this.loadedMaps[hash] = JSON.parse(fs.readFileSync(mapPath, 'utf8')) } catch (e) { // set to false to avoid repeatedly trying to load the map - _this.loadedMaps[hash] = false + this.loadedMaps[hash] = false } } - if (_this.loadedMaps[hash]) { - this._sourceMapCache.registerMap(absFile, _this.loadedMaps[hash]) + if (this.loadedMaps[hash]) { + this._sourceMapCache.registerMap(absFile, this.loadedMaps[hash]) } } })