diff --git a/README.md b/README.md index 5e0f976..4714abb 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ The loader supports all options supported by `istanbul-lib-instrument` |**`coverageVariable`**|`{String}`|`__coverage__`|Name of global coverage variable| |**`preserveComments`**|`{Boolean}`|`false`|Preserve comments in `output`| |**`produceSourceMap`**|`{Boolean}`|`false`|Set to `true` to produce a source map for the instrumented code| +|**`fixWebpackSourcePaths`**|`{Boolean}`|`false`|Set to `true` to prevent filepath error in coverage| |**`sourceMapUrlCallback`**|`{Function}`|`null`|A callback function that is called when a source map URL is found in the original code. This function is called with the source filename and the source map URL| **webpack.config.js** diff --git a/src/index.js b/src/index.js index 1685cac..73898a7 100644 --- a/src/index.js +++ b/src/index.js @@ -22,6 +22,18 @@ export default function (source, sourceMap) { const instrumenter = createInstrumenter(options); instrumenter.instrument(source, this.resourcePath, (error, instrumentedSource) => { - this.callback(error, instrumentedSource, instrumenter.lastSourceMap()); + let src = instrumentedSource; + if (options.fixWebpackSourcePaths) { + src = src.replace(/sources:\[([^\]])*\]/g, (match) => { + const lines = match.slice('sources:['.length, -1).split(','); + return `sources:[${ + lines + .map(l => l.slice(1, -1).split('!')) + .map(arr => `"${arr[arr.length - 1]}"`) + .join(',') + }]`; + }); + } + this.callback(error, src, instrumenter.lastSourceMap()); }, srcMap); } diff --git a/src/options.json b/src/options.json index 5944cd0..1656a56 100644 --- a/src/options.json +++ b/src/options.json @@ -21,6 +21,9 @@ }, "produceSourceMap": { "type": "boolean" + }, + "fixWebpackSourcePaths": { + "type": "boolean" } }, "additionalProperties": true diff --git a/test/__snapshots__/index.test.js.snap b/test/__snapshots__/index.test.js.snap deleted file mode 100644 index 4f9dade..0000000 --- a/test/__snapshots__/index.test.js.snap +++ /dev/null @@ -1,25 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`disabled sourcemaps 1`] = `"{\\"version\\":3,\\"sources\\":[\\"webpack:///./test/fixtures/basic.js\\"],\\"names\\":[],\\"mappings\\":\\"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\\",\\"file\\":\\"main.js\\",\\"sourcesContent\\":[\\"\\\\\\"use strict\\\\\\";var cov_1v2zerd2hz=function(){var path=\\\\\\"/fixtures/basic.js\\\\\\",hash=\\\\\\"f413708755ce75e2d80eaa677c70f0f16a196e80\\\\\\",global=new Function('return this')(),gcv=\\\\\\"__coverage__\\\\\\",coverageData={path:\\\\\\"/fixtures/basic.js\\\\\\",statementMap:{\\\\\\"0\\\\\\":{start:{line:3,column:19},end:{line:3,column:563}},\\\\\\"1\\\\\\":{start:{line:3,column:76},end:{line:3,column:347}},\\\\\\"2\\\\\\":{start:{line:3,column:134},end:{line:3,column:142}},\\\\\\"3\\\\\\":{start:{line:3,column:144},end:{line:3,column:199}},\\\\\\"4\\\\\\":{start:{line:3,column:200},end:{line:3,column:231}},\\\\\\"5\\\\\\":{start:{line:3,column:232},end:{line:3,column:286}},\\\\\\"6\\\\\\":{start:{line:3,column:259},end:{line:3,column:286}},\\\\\\"7\\\\\\":{start:{line:3,column:287},end:{line:3,column:345}},\\\\\\"8\\\\\\":{start:{line:3,column:350},end:{line:3,column:559}},\\\\\\"9\\\\\\":{start:{line:3,column:407},end:{line:3,column:475}},\\\\\\"10\\\\\\":{start:{line:3,column:423},end:{line:3,column:475}},\\\\\\"11\\\\\\":{start:{line:3,column:476},end:{line:3,column:536}},\\\\\\"12\\\\\\":{start:{line:3,column:493},end:{line:3,column:536}},\\\\\\"13\\\\\\":{start:{line:3,column:537},end:{line:3,column:556}},\\\\\\"14\\\\\\":{start:{line:5,column:50},end:{line:5,column:151}},\\\\\\"15\\\\\\":{start:{line:5,column:92},end:{line:5,column:149}},\\\\\\"16\\\\\\":{start:{line:7,column:0},end:{line:20,column:4}},\\\\\\"17\\\\\\":{start:{line:9,column:4},end:{line:9,column:31}},\\\\\\"18\\\\\\":{start:{line:12,column:2},end:{line:17,column:6}},\\\\\\"19\\\\\\":{start:{line:15,column:6},end:{line:15,column:20}},\\\\\\"20\\\\\\":{start:{line:19,column:2},end:{line:19,column:13}}},fnMap:{\\\\\\"0\\\\\\":{name:\\\\\\"(anonymous_0)\\\\\\",decl:{start:{line:3,column:19},end:{line:3,column:20}},loc:{start:{line:3,column:31},end:{line:3,column:561}},line:3},\\\\\\"1\\\\\\":{name:\\\\\\"defineProperties\\\\\\",decl:{start:{line:3,column:42},end:{line:3,column:58}},loc:{start:{line:3,column:74},end:{line:3,column:349}},line:3},\\\\\\"2\\\\\\":{name:\\\\\\"(anonymous_2)\\\\\\",decl:{start:{line:3,column:357},end:{line:3,column:358}},loc:{start:{line:3,column:405},end:{line:3,column:558}},line:3},\\\\\\"3\\\\\\":{name:\\\\\\"_classCallCheck\\\\\\",decl:{start:{line:5,column:9},end:{line:5,column:24}},loc:{start:{line:5,column:48},end:{line:5,column:153}},line:5},\\\\\\"4\\\\\\":{name:\\\\\\"(anonymous_4)\\\\\\",decl:{start:{line:7,column:17},end:{line:7,column:18}},loc:{start:{line:7,column:29},end:{line:20,column:1}},line:7},\\\\\\"5\\\\\\":{name:\\\\\\"Foo\\\\\\",decl:{start:{line:8,column:11},end:{line:8,column:14}},loc:{start:{line:8,column:17},end:{line:10,column:3}},line:8},\\\\\\"6\\\\\\":{name:\\\\\\"bar\\\\\\",decl:{start:{line:14,column:20},end:{line:14,column:23}},loc:{start:{line:14,column:26},end:{line:16,column:5}},line:14}},branchMap:{\\\\\\"0\\\\\\":{loc:{start:{line:3,column:168},end:{line:3,column:198}},type:\\\\\\"binary-expr\\\\\\",locations:[{start:{line:3,column:168},end:{line:3,column:189}},{start:{line:3,column:193},end:{line:3,column:198}}],line:3},\\\\\\"1\\\\\\":{loc:{start:{line:3,column:232},end:{line:3,column:286}},type:\\\\\\"if\\\\\\",locations:[{start:{line:3,column:232},end:{line:3,column:286}},{start:{line:3,column:232},end:{line:3,column:286}}],line:3},\\\\\\"2\\\\\\":{loc:{start:{line:3,column:407},end:{line:3,column:475}},type:\\\\\\"if\\\\\\",locations:[{start:{line:3,column:407},end:{line:3,column:475}},{start:{line:3,column:407},end:{line:3,column:475}}],line:3},\\\\\\"3\\\\\\":{loc:{start:{line:3,column:476},end:{line:3,column:536}},type:\\\\\\"if\\\\\\",locations:[{start:{line:3,column:476},end:{line:3,column:536}},{start:{line:3,column:476},end:{line:3,column:536}}],line:3},\\\\\\"4\\\\\\":{loc:{start:{line:5,column:50},end:{line:5,column:151}},type:\\\\\\"if\\\\\\",locations:[{start:{line:5,column:50},end:{line:5,column:151}},{start:{line:5,column:50},end:{line:5,column:151}}],line:5}},s:{\\\\\\"0\\\\\\":0,\\\\\\"1\\\\\\":0,\\\\\\"2\\\\\\":0,\\\\\\"3\\\\\\":0,\\\\\\"4\\\\\\":0,\\\\\\"5\\\\\\":0,\\\\\\"6\\\\\\":0,\\\\\\"7\\\\\\":0,\\\\\\"8\\\\\\":0,\\\\\\"9\\\\\\":0,\\\\\\"10\\\\\\":0,\\\\\\"11\\\\\\":0,\\\\\\"12\\\\\\":0,\\\\\\"13\\\\\\":0,\\\\\\"14\\\\\\":0,\\\\\\"15\\\\\\":0,\\\\\\"16\\\\\\":0,\\\\\\"17\\\\\\":0,\\\\\\"18\\\\\\":0,\\\\\\"19\\\\\\":0,\\\\\\"20\\\\\\":0},f:{\\\\\\"0\\\\\\":0,\\\\\\"1\\\\\\":0,\\\\\\"2\\\\\\":0,\\\\\\"3\\\\\\":0,\\\\\\"4\\\\\\":0,\\\\\\"5\\\\\\":0,\\\\\\"6\\\\\\":0},b:{\\\\\\"0\\\\\\":[0,0],\\\\\\"1\\\\\\":[0,0],\\\\\\"2\\\\\\":[0,0],\\\\\\"3\\\\\\":[0,0],\\\\\\"4\\\\\\":[0,0]},inputSourceMap:{version:3,sources:[\\\\\\"test/fixtures/basic.js\\\\\\"],names:[\\\\\\"module\\\\\\",\\\\\\"exports\\\\\\"],mappings:\\\\\\";;;;;;AAAAA,OAAOC,OAAP;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,0BACQ;AACJ,aAAO,CAAC,CAAC,IAAT;AACD;AAHH;;AAAA;AAAA\\\\\\",file:\\\\\\"basic.js\\\\\\",sourceRoot:\\\\\\"\\\\\\",sourcesContent:[\\\\\\"module.exports = class Foo {\\\\\\\\n bar() {\\\\\\\\n return !!this;\\\\\\\\n }\\\\\\\\n};\\\\\\\\n\\\\\\"]},_coverageSchema:\\\\\\"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c\\\\\\"},coverage=global[gcv]||(global[gcv]={});if(coverage[path]&&coverage[path].hash===hash){return coverage[path];}coverageData.hash=hash;return coverage[path]=coverageData;}();var _createClass=(cov_1v2zerd2hz.s[0]++,function(){cov_1v2zerd2hz.f[0]++;function defineProperties(target,props){cov_1v2zerd2hz.f[1]++;cov_1v2zerd2hz.s[1]++;for(var i=0;i { expect(stats.compilation.errors).toMatchSnapshot('errors'); expect(stats.compilation.warnings).toMatchSnapshot('warnings'); }); + +test('fix webpack paths', async () => { + const stats = await webpack({ + extend: { + devtool: 'source-map', + }, + options: { + fixWebpackSourcePaths: true, + }, + }); + const instrumentedSource = stats.compilation.assets['main.js'].source(); + expect(instrumentedSource).toMatchSnapshot(); +});