diff --git a/examples/sourcemap-code-splitting/1.js b/examples/sourcemap-code-splitting/1.js new file mode 100644 index 0000000..6952089 --- /dev/null +++ b/examples/sourcemap-code-splitting/1.js @@ -0,0 +1,3 @@ +export default { + chunk: 1, +}; diff --git a/examples/sourcemap-code-splitting/2.js b/examples/sourcemap-code-splitting/2.js new file mode 100644 index 0000000..9ce8e16 --- /dev/null +++ b/examples/sourcemap-code-splitting/2.js @@ -0,0 +1,3 @@ +export default { + chunk: 2, +}; diff --git a/examples/sourcemap-code-splitting/README.md b/examples/sourcemap-code-splitting/README.md new file mode 100644 index 0000000..d19b96b --- /dev/null +++ b/examples/sourcemap-code-splitting/README.md @@ -0,0 +1,3 @@ +# Sourcemap and code splitting + +Test case for sourcemap and code splitting diff --git a/examples/sourcemap-code-splitting/index.js b/examples/sourcemap-code-splitting/index.js new file mode 100644 index 0000000..89fcae6 --- /dev/null +++ b/examples/sourcemap-code-splitting/index.js @@ -0,0 +1,3 @@ +import('./1.js'); +import('./2.js'); +console.log('ok'); diff --git a/examples/sourcemap-code-splitting/test.js b/examples/sourcemap-code-splitting/test.js new file mode 100644 index 0000000..698ba06 --- /dev/null +++ b/examples/sourcemap-code-splitting/test.js @@ -0,0 +1,22 @@ +var expect = require('expect'); +var fs = require('fs'); +var path = require('path'); + +var webpackVersion = Number(require('webpack/package.json').version.split('.')[0]); + +module.exports.skip = function skip() { + return webpackVersion < 2; +}; + +module.exports.check = function check() { + var findAndStripSriHashString = function(filePath, pattern, offset) { + var fileContent = fs.readFileSync(path.join(__dirname, filePath), 'utf-8'); + var string = fileContent.substring(fileContent.indexOf(pattern) + (offset || 0)) + .match(/\{(.*?)\}/)[0].replace(/\\/g, '').replace(/\"/g, ''); + return string; + } + + var sriHashesInSource = findAndStripSriHashString('dist/index.js', 'sha256-', -10); + var sriHashesInMap = findAndStripSriHashString('dist/index.js.map', 'var sriHashes = '); + expect(sriHashesInSource.length).toEqual(sriHashesInMap.length); +}; diff --git a/examples/sourcemap-code-splitting/webpack.config.js b/examples/sourcemap-code-splitting/webpack.config.js new file mode 100644 index 0000000..12736e4 --- /dev/null +++ b/examples/sourcemap-code-splitting/webpack.config.js @@ -0,0 +1,19 @@ +var SriPlugin = require('webpack-subresource-integrity'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); + +module.exports = { + entry: { + index: './index.js' + }, + output: { + crossOriginLoading: 'anonymous' + }, + devtool: 'source-map', + plugins: [ + new SriPlugin({ + hashFuncNames: ['sha256', 'sha384'], + enabled: true + }), + new HtmlWebpackPlugin() + ] +}; diff --git a/index.js b/index.js index 872a892..b4f2634 100644 --- a/index.js +++ b/index.js @@ -172,11 +172,12 @@ SubresourceIntegrityPlugin.prototype.replaceAsset = function replaceAsset( var newAsset; var magicMarker; var magicMarkerPos; + var hashFuncNames = this.options.hashFuncNames; newAsset = new ReplaceSource(assets[chunkFile]); Array.from(hashByChunkId.entries()).forEach(function replaceMagicMarkers(idAndHash) { - magicMarker = util.makePlaceholder(idAndHash[0]); + magicMarker = util.makePlaceholder(hashFuncNames, idAndHash[0]); magicMarkerPos = oldSource.indexOf(magicMarker); if (magicMarkerPos >= 0) { newAsset.replace( @@ -189,7 +190,7 @@ SubresourceIntegrityPlugin.prototype.replaceAsset = function replaceAsset( // eslint-disable-next-line no-param-reassign assets[chunkFile] = newAsset; - newAsset.integrity = util.computeIntegrity(this.options.hashFuncNames, newAsset.source()); + newAsset.integrity = util.computeIntegrity(hashFuncNames, newAsset.source()); return newAsset; }; diff --git a/jmtp.js b/jmtp.js index faacfef..55e3015 100644 --- a/jmtp.js +++ b/jmtp.js @@ -17,6 +17,7 @@ WebIntegrityJsonpMainTemplatePlugin.prototype.addSriHashes = function addSriHashes(mainTemplate, source, chunk) { var allChunks = util.findChunks(chunk); var includedChunks = chunk.getChunkMaps().hash; + var hashFuncNames = this.sriPlugin.options.hashFuncNames; if (allChunks.size > 0) { return (Template.asString || mainTemplate.asString)([ @@ -29,7 +30,7 @@ WebIntegrityJsonpMainTemplatePlugin.prototype.addSriHashes = ) { if (includedChunks[depChunk.id.toString()]) { // eslint-disable-next-line no-param-reassign - sriHashes[depChunk.id] = util.makePlaceholder(depChunk.id); + sriHashes[depChunk.id] = util.makePlaceholder(hashFuncNames, depChunk.id); } return sriHashes; }, diff --git a/util.js b/util.js index f195a5c..523aea8 100644 --- a/util.js +++ b/util.js @@ -98,8 +98,9 @@ function isRuntimeChunk(chunk) { return "hasRuntime" in chunk ? chunk.hasRuntime() : chunk.entry; } -function makePlaceholder(id) { - return "*-*-*-CHUNK-SRI-HASH-" + id + "-*-*-*"; +function makePlaceholder(hashFuncNames, id) { + var placeholder = "*-*-*-CHUNK-SRI-HASH-" + id + "-*-*-*"; + return computeIntegrity(hashFuncNames, placeholder); } module.exports.computeIntegrity = computeIntegrity;