| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| const { RawSource, ReplaceSource } = require("webpack-sources"); |
| |
| /** @typedef {import("./Dependency")} Dependency */ |
| /** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate */ |
| /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */ |
| /** @typedef {import("./util/createHash").Hash} Hash */ |
| /** @typedef {(d: Dependency) => boolean} DependencyFilterFunction */ |
| /** @typedef {Map<Function, DependencyTemplate>} DependencyTemplates */ |
| |
| class DependenciesBlockVariable { |
| /** |
| * Creates an instance of DependenciesBlockVariable. |
| * @param {string} name name of DependenciesBlockVariable |
| * @param {string} expression expression string |
| * @param {Dependency[]=} dependencies dependencies tied to this varaiable |
| */ |
| constructor(name, expression, dependencies) { |
| this.name = name; |
| this.expression = expression; |
| this.dependencies = dependencies || []; |
| } |
| |
| /** |
| * @param {Hash} hash hash for instance to update |
| * @returns {void} |
| */ |
| updateHash(hash) { |
| hash.update(this.name); |
| hash.update(this.expression); |
| for (const d of this.dependencies) { |
| d.updateHash(hash); |
| } |
| } |
| |
| /** |
| * @param {DependencyTemplates} dependencyTemplates Dependency constructors and templates Map. |
| * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate to generate expression souce |
| * @returns {ReplaceSource} returns constructed source for expression via templates |
| */ |
| expressionSource(dependencyTemplates, runtimeTemplate) { |
| const source = new ReplaceSource(new RawSource(this.expression)); |
| for (const dep of this.dependencies) { |
| const template = dependencyTemplates.get(dep.constructor); |
| if (!template) { |
| throw new Error(`No template for dependency: ${dep.constructor.name}`); |
| } |
| template.apply(dep, source, runtimeTemplate, dependencyTemplates); |
| } |
| return source; |
| } |
| |
| disconnect() { |
| for (const d of this.dependencies) { |
| d.disconnect(); |
| } |
| } |
| |
| hasDependencies(filter) { |
| if (filter) { |
| return this.dependencies.some(filter); |
| } |
| return this.dependencies.length > 0; |
| } |
| } |
| |
| module.exports = DependenciesBlockVariable; |