@mrtc0/csp-html-webpack-plugin
Version:
45 lines (44 loc) • 1.89 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CspHtmlWebpackPlugin = void 0;
const csp_1 = require("./csp");
const webpack_1 = __importDefault(require("webpack"));
const pluginName = "CspHtmlWebpackPlugin";
class CspHtmlWebpackPlugin {
constructor(htmlWebpackPlugin, directiveSet) {
this.htmlWebpackPlugin = htmlWebpackPlugin;
this.directiveSet = directiveSet;
}
applyCsp(compilation, data, cb) {
const csp = new csp_1.Csp(data.html, this.directiveSet);
csp.refactorScriptTagsForHashSourceCSP();
const scriptHashes = csp.getHashAllInlineScripts();
const styleHashes = csp.getHashAllInlineStyles();
const strictCsp = csp.generateDirectiveSet(scriptHashes, styleHashes);
csp.addCspMetaTag(strictCsp);
data.html = csp.getDocument().documentElement.outerHTML;
return cb(null, data);
}
apply(compiler) {
compiler.hooks.compilation.tap(pluginName, (compilation) => {
// https://github.com/google/strict-csp/issues/48
compilation.hooks.processAssets.intercept({
register: (tap) => {
if (tap.name === "HtmlWebpackPlugin") {
tap.stage = webpack_1.default.Compilation.PROCESS_ASSETS_STAGE_REPORT;
}
return tap;
},
});
this.htmlWebpackPlugin
.getHooks(compilation)
.beforeEmit.tapAsync(pluginName, (htmlWebPackPluginData, compileCallback) => {
this.applyCsp(compilation, htmlWebPackPluginData, compileCallback);
});
});
}
}
exports.CspHtmlWebpackPlugin = CspHtmlWebpackPlugin;