/
jmtp.js
84 lines (74 loc) · 2.34 KB
/
jmtp.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
* 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;