| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /**
- * Copyright (c) 2015-present, Waysact Pty Ltd
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- var Template = require('webpack/lib/Template');
- var util = require('./util');
- function WebIntegrityJsonpMainTemplatePlugin(sriPlugin, compilation) {
- this.sriPlugin = sriPlugin;
- this.compilation = compilation;
- }
- function addSriHashes(plugin, chunk, source) {
- var allChunks = util.findChunks(chunk);
- if (allChunks.size > 0) {
- return (Template.asString || plugin.asString)([
- source,
- 'var sriHashes = ' +
- JSON.stringify(
- Array.from(allChunks).reduce(function chunkIdReducer(
- sriHashes,
- depChunk
- ) {
- if (chunk !== depChunk) {
- // eslint-disable-next-line no-param-reassign
- sriHashes[depChunk.id] = util.makePlaceholder(depChunk.id);
- }
- return sriHashes;
- },
- {})
- ) +
- ';'
- ]);
- }
- return source;
- }
- WebIntegrityJsonpMainTemplatePlugin.prototype.apply = function apply(
- mainTemplate
- ) {
- var self = this;
- /*
- * Patch jsonp-script code to add the integrity attribute.
- */
- function jsonpScriptPlugin(source) {
- if (!mainTemplate.outputOptions.crossOriginLoading) {
- self.sriPlugin.error(
- self.compilation,
- 'webpack option output.crossOriginLoading not set, code splitting will not work!'
- );
- }
- return (Template.asString || this.asString)([
- source,
- 'script.integrity = sriHashes[chunkId];',
- 'script.crossOrigin = ' + JSON.stringify(mainTemplate.outputOptions.crossOriginLoading) + ';',
- ]);
- }
- /*
- * Patch local-vars code to add a mapping from chunk ID to SRIs.
- * Since SRIs haven't been computed at this point, we're using
- * magic placeholders for SRI values and going to replace them
- * later.
- */
- function localVarsPlugin(source, chunk) {
- return addSriHashes(this, chunk, source);
- }
- if (mainTemplate.hooks) {
- mainTemplate.hooks.jsonpScript.tap('SriPlugin', jsonpScriptPlugin);
- mainTemplate.hooks.localVars.tap('SriPlugin', localVarsPlugin);
- } else {
- mainTemplate.plugin('jsonp-script', jsonpScriptPlugin);
- mainTemplate.plugin('local-vars', localVarsPlugin);
- }
- };
- module.exports = WebIntegrityJsonpMainTemplatePlugin;
|