| const merge = require('deepmerge'); | 
| const ChainedMap = require('./ChainedMap'); | 
| const Orderable = require('./Orderable'); | 
|   | 
| module.exports = Orderable( | 
|   class extends ChainedMap { | 
|     constructor(parent, name) { | 
|       super(parent); | 
|       this.name = name; | 
|       this.extend(['loader', 'options']); | 
|     } | 
|   | 
|     tap(f) { | 
|       this.options(f(this.get('options'))); | 
|       return this; | 
|     } | 
|   | 
|     merge(obj, omit = []) { | 
|       if (!omit.includes('loader') && 'loader' in obj) { | 
|         this.loader(obj.loader); | 
|       } | 
|   | 
|       if (!omit.includes('options') && 'options' in obj) { | 
|         this.options(merge(this.store.get('options') || {}, obj.options)); | 
|       } | 
|   | 
|       return super.merge(obj, [...omit, 'loader', 'options']); | 
|     } | 
|   | 
|     toConfig() { | 
|       const config = this.clean(this.entries() || {}); | 
|   | 
|       Object.defineProperties(config, { | 
|         __useName: { value: this.name }, | 
|         __ruleNames: { value: this.parent && this.parent.names }, | 
|         __ruleTypes: { value: this.parent && this.parent.ruleTypes }, | 
|       }); | 
|   | 
|       return config; | 
|     } | 
|   }, | 
| ); |