diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ec29205fa..d35655909 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -64,6 +64,7 @@ _Before_ submitting a pull request, please make sure the following is doneā€¦ 8. Ensure the test suite passes via `yarn test`. ```sh-session + $ yarn test:prepare # build example and generate fixtures before running tests $ yarn test ``` diff --git a/packages/server/src/ChunkExtractor.js b/packages/server/src/ChunkExtractor.js index 23fab97c7..8ffadbd5a 100644 --- a/packages/server/src/ChunkExtractor.js +++ b/packages/server/src/ChunkExtractor.js @@ -233,9 +233,12 @@ class ChunkExtractor { createChunkAsset({ filename, chunk, type, linkType }) { const resolvedFilename = typeof filename === 'object' && filename.name ? filename.name : filename + const resolvedIntegrity = + typeof filename === 'object' && filename.integrity ? filename.integrity : null return { filename: resolvedFilename, + integrity: resolvedIntegrity, scriptType: getFileScriptType(resolvedFilename), chunk, url: this.resolvePublicUrl(resolvedFilename), diff --git a/packages/server/src/ChunkExtractor.test.js b/packages/server/src/ChunkExtractor.test.js index 95c3070e4..4ee956329 100644 --- a/packages/server/src/ChunkExtractor.test.js +++ b/packages/server/src/ChunkExtractor.test.js @@ -102,6 +102,31 @@ describe('ChunkExtrator', () => { `) }) + it('should add integrity if available in stats', () => { + const testExtractor = new ChunkExtractor({ + stats: { + ...stats, + namedChunkGroups: { + ...stats.namedChunkGroups, + main: { + ...stats.namedChunkGroups.main, + assets: stats.namedChunkGroups.main.assets.map(name => ({ + name, + // pseudo hash - reversed name + integrity: name.split('').reverse().join(''), + })), + }, + }, + }, + outputPath: targetPath, + }) + expect(testExtractor.getScriptTags({ crossorigin: 'anonymous' })) + .toMatchInlineSnapshot(` + " + " + `) + }) + it('should add extra props if specified - object argument', () => { extractor.addChunk('letters-A') expect(extractor.getScriptTags({ nonce: 'testnonce' })) diff --git a/packages/webpack-plugin/src/index.js b/packages/webpack-plugin/src/index.js index a844cacb2..113c8e00d 100644 --- a/packages/webpack-plugin/src/index.js +++ b/packages/webpack-plugin/src/index.js @@ -39,8 +39,20 @@ class LoadablePlugin { return { id: chunk.id, files: [...chunk.files], - }; - }); + } + }) + + // update namedChunkGroups with integrity from webpack-subresource-integrity if available + Object.values(stats.namedChunkGroups).forEach(namedChunkGroup => { + namedChunkGroup.assets.forEach(namedChunkGroupAsset => { + if (!namedChunkGroupAsset.integrity) { + const asset = stats.assets.find(a => a.name === namedChunkGroupAsset.name) || {} + if (asset.integrity) { + namedChunkGroupAsset.integrity = asset.integrity + } + } + }) + }) const result = JSON.stringify(stats, null, 2)