Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
const {ChainedMap, ChainedSet, dopemerge} = require('./Chains')
const Plugin = require('./Plugin')

module.exports = class extends ChainedMap {
  constructor(parent) {
    super(parent)
    this.alias = new ChainedMap(this)
    this.aliasFields = new ChainedSet(this)
    this.descriptionFiles = new ChainedSet(this)
    this.extensions = new ChainedSet(this)
    this.mainFields = new ChainedSet(this)
    this.mainFiles = new ChainedSet(this)
    this.modules = new ChainedSet(this)
    this.plugins = new ChainedMap(this)
    this.extend([
      'enforceExtension',
      'enforceModuleExtension',
      'unsafeCache',
      'symlinks',
      'cachePredicate',
    ])
  }

  plugin(name) {
    if (!this.plugins.has(name)) {
      this.plugins.set(name, new Plugin(this))
    }

    return this.plugins.get(name)
  }

  toConfig() {
    return this.clean(
      Object.assign(this.entries() || {}, {
        alias: this.alias.entries(),
        aliasFields: this.aliasFields.values(),
        descriptionFiles: this.descriptionFiles.values(),
        extensions: this.extensions.values(),
        mainFields: this.mainFields.values(),
        mainFiles: this.mainFiles.values(),
        modules: this.modules.values(),
        plugins: this.plugins.values().map(plugin => plugin.toConfig()),
      })
    )
  }

  merge(obj) {
    Object.keys(obj).forEach(key => {
      const value = obj[key]

      switch (key) {
        case 'alias':
        case 'aliasFields':
        case 'descriptionFiles':
        case 'extensions':
        case 'mainFields':
        case 'mainFiles':
        case 'modules':
        case 'plugins': {
          return this[key].merge(value)
        }

        default: {
          if (this.has(key)) {
            this.set(key, dopemerge(this.get(key), value))
          }
          else {
            this.set(key, value)
          }
        }
      }
    })

    return this
  }
}