diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/webpack-chain/src/Rule.js | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/webpack-chain/src/Rule.js')
| -rw-r--r-- | node_modules/webpack-chain/src/Rule.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/node_modules/webpack-chain/src/Rule.js b/node_modules/webpack-chain/src/Rule.js new file mode 100644 index 00000000..45e16955 --- /dev/null +++ b/node_modules/webpack-chain/src/Rule.js @@ -0,0 +1,98 @@ +const ChainedMap = require('./ChainedMap'); +const ChainedSet = require('./ChainedSet'); +const Use = require('./Use'); + +module.exports = class Rule extends ChainedMap { + constructor(parent, name) { + super(parent); + this.name = name; + this.names = []; + + let rule = this; + while (rule instanceof Rule) { + this.names.unshift(rule.name); + rule = rule.parent; + } + + this.uses = new ChainedMap(this); + this.include = new ChainedSet(this); + this.exclude = new ChainedSet(this); + this.oneOfs = new ChainedMap(this); + this.extend([ + 'enforce', + 'issuer', + 'parser', + 'resource', + 'resourceQuery', + 'sideEffects', + 'test', + 'type', + ]); + } + + use(name) { + return this.uses.getOrCompute(name, () => new Use(this, name)); + } + + oneOf(name) { + return this.oneOfs.getOrCompute(name, () => new Rule(this, name)); + } + + pre() { + return this.enforce('pre'); + } + + post() { + return this.enforce('post'); + } + + toConfig() { + const config = this.clean( + Object.assign(this.entries() || {}, { + include: this.include.values(), + exclude: this.exclude.values(), + oneOf: this.oneOfs.values().map(oneOf => oneOf.toConfig()), + use: this.uses.values().map(use => use.toConfig()), + }) + ); + + Object.defineProperties(config, { + __ruleNames: { value: this.names }, + }); + + return config; + } + + merge(obj, omit = []) { + if (!omit.includes('include') && 'include' in obj) { + this.include.merge(obj.include); + } + + if (!omit.includes('exclude') && 'exclude' in obj) { + this.exclude.merge(obj.exclude); + } + + if (!omit.includes('use') && 'use' in obj) { + Object.keys(obj.use).forEach(name => this.use(name).merge(obj.use[name])); + } + + if (!omit.includes('oneOf') && 'oneOf' in obj) { + Object.keys(obj.oneOf).forEach(name => + this.oneOf(name).merge(obj.oneOf[name]) + ); + } + + if (!omit.includes('test') && 'test' in obj) { + this.test(obj.test instanceof RegExp ? obj.test : new RegExp(obj.test)); + } + + return super.merge(obj, [ + ...omit, + 'include', + 'exclude', + 'use', + 'oneOf', + 'test', + ]); + } +}; |
