Home Reference Source Repository

src/component/factory.js

'use strict';

const AbstractComponent = require('./abstract-component');

/**
 * Component factory
 */
class Factory {  
  /**
   * @param {string} name
   * @param {*} args
   *
   * @returns {AbstractComponent}
   */
  static create(name, ...args) {
    const ComponentImplementation = require(`./${ name }-component`);
    const component = new ComponentImplementation(...args);
    
    if (!(component instanceof AbstractComponent)) {
      throw new Error(`${ name } component should be an implementation of AbstractComponent`);
    }
    
    return component;
  }
  
  /**
   * @param {*} args
   *
   * @returns {EmitComponent}
   */
  static emit(...args) {
    return this.create('emit', ...args);
  }
  
  /**
   * @param {*} args
   *
   * @returns {CacheComponent}
   */
  static cache(...args) {
    return this.create('cache', ...args);
  }
  
  /**
   * @param {*} args
   *
   * @returns {CoverageComponent}
   */
  static coverage(...args) {
    return this.create('coverage', ...args);
  }
  
  /**
   * @param {*} args
   *
   * @returns {TestComponent}
   */
  static test(...args) {
    return this.create('test', ...args);
  }
  
  /**
   * @param {*} args
   *
   * @returns {E2EComponent}
   */
  static e2e(...args) {
    return this.create('e2e', ...args);
  }
  
  /**
   * @param {*} args
   *
   * @returns {NpmComponent}
   */
  static npm(...args) {
    return this.create('npm', ...args);
  }
  
  /**
   * @param {*} args
   *
   * @returns {PreprocessComponent}
   */
  static preprocess(...args) {
    return this.create('preprocess', ...args);
  }
}

module.exports = Factory;