/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const { Tapable, SyncWaterfallHook, SyncHook } = require("tapable"); /** @typedef {import("./ModuleTemplate")} ModuleTemplate */ /** @typedef {import("./Chunk")} Chunk */ /** @typedef {import("./Module")} Module} */ /** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate} */ /** @typedef {import("./util/createHash").Hash} Hash} */ /** * @typedef {Object} RenderManifestOptions * @property {Chunk} chunk the chunk used to render * @property {string} hash * @property {string} fullHash * @property {TODO} outputOptions * @property {{javascript: ModuleTemplate, webassembly: ModuleTemplate}} moduleTemplates * @property {Map<TODO, TODO>} dependencyTemplates */ module.exports = class ChunkTemplate extends Tapable { constructor(outputOptions) { super(); this.outputOptions = outputOptions || {}; this.hooks = { /** @type {SyncWaterfallHook<TODO[], RenderManifestOptions>} */ renderManifest: new SyncWaterfallHook(["result", "options"]), modules: new SyncWaterfallHook([ "source", "chunk", "moduleTemplate", "dependencyTemplates" ]), render: new SyncWaterfallHook([ "source", "chunk", "moduleTemplate", "dependencyTemplates" ]), renderWithEntry: new SyncWaterfallHook(["source", "chunk"]), hash: new SyncHook(["hash"]), hashForChunk: new SyncHook(["hash", "chunk"]) }; } /** * * @param {RenderManifestOptions} options render manifest options * @returns {TODO[]} returns render manifest */ getRenderManifest(options) { const result = []; this.hooks.renderManifest.call(result, options); return result; } /** * Updates hash with information from this template * @param {Hash} hash the hash to update * @returns {void} */ updateHash(hash) { hash.update("ChunkTemplate"); hash.update("2"); this.hooks.hash.call(hash); } /** * TODO webpack 5: remove moduleTemplate and dependencyTemplates * Updates hash with chunk-specific information from this template * @param {Hash} hash the hash to update * @param {Chunk} chunk the chunk * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render * @param {Map<Function, DependencyTemplate>} dependencyTemplates dependency templates * @returns {void} */ updateHashForChunk(hash, chunk, moduleTemplate, dependencyTemplates) { this.updateHash(hash); this.hooks.hashForChunk.call(hash, chunk); } };