UNPKG

@mrtc0/csp-html-webpack-plugin

Version:
45 lines (44 loc) 1.89 kB
"use strict"; 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;