/* MIT License http://www.opensource.org/licenses/mit-license.php */ "use strict"; const { RawSource } = require("webpack-sources"); const EntryPlugin = require("../EntryPlugin"); const HotUpdateChunk = require("../HotUpdateChunk"); const { HTML_TYPE } = require("../ModuleSourceTypeConstants"); const { HTML_MODULE_TYPE } = require("../ModuleTypeConstants"); const NormalModule = require("../NormalModule"); const ConstDependency = require("../dependencies/ConstDependency"); const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency"); const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency"); const HtmlScriptSrcDependency = require("../dependencies/HtmlScriptSrcDependency"); const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency"); const StaticExportsDependency = require("../dependencies/StaticExportsDependency"); const { compareModulesByFullName } = require("../util/comparators"); const removeBOM = require("../util/removeBOM"); const HtmlGenerator = require("./HtmlGenerator"); const HtmlParser = require("./HtmlParser"); /** @typedef {import("../Compiler")} Compiler */ /** @typedef {{ request: string, entryName: string, kind: "classic" | "esm-script" | "modulepreload" | "stylesheet" }} EntryScriptInfo */ const PLUGIN_NAME = "HtmlModulesPlugin"; /** * @param {string} name definition name in `schemas/WebpackOptions.json` * @returns {EXPECTED_OBJECT} a schema referencing `#/definitions/` */ const getSchema = (name) => { const { definitions } = require("../../schemas/WebpackOptions.json"); return { definitions, oneOf: [{ $ref: `#/definitions/${name}` }] }; }; const generatorValidationOptions = { name: "Html Modules Plugin", baseDataPath: "generator" }; class HtmlModulesPlugin { /** * `output.hashFunction`/`hashSalt`/`hashDigest`/`hashDigestLength` * digest of `content`, with `nonNumericOnlyHash` applied — webpack's * standard `[contenthash]` recipe. * @param {string | Buffer} content content to hash * @param {import("../../declarations/WebpackOptions").Output} outputOptions output options * @returns {string} content hash */ static computeContentHash(content, outputOptions) { const createHash = require("../util/createHash"); const nonNumericOnlyHash = require("../util/nonNumericOnlyHash"); const hash = createHash( /** @type {import("../../declarations/WebpackOptions").HashFunction} */ (outputOptions.hashFunction) ); if (outputOptions.hashSalt) hash.update(outputOptions.hashSalt); hash.update(content); return nonNumericOnlyHash( /** @type {string} */ ( hash.digest(/** @type {string} */ (outputOptions.hashDigest)) ), /** @type {number} */ (outputOptions.hashDigestLength) ); } /** * Applies the plugin by registering its hooks on the compiler. * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { // Per-chunk `RawSource` reused across builds when bytes are unchanged: // keeping identity stable avoids invalidating `RealContentHashPlugin|analyse`. /** @type {Map} */ const sentinelResolvedSourceCache = new Map(); // `