保誠-保戶業務員媒合平台
HelenHuang
2022-06-09 9bdb95c9e34cef640534e5e5a1e2225a80442000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
    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;