Home Intro Source Mebo GitHub

src/Inputs/Version.js

const util = require('util');
const compareVersions = require('compare-versions');
const ValidationFail = require('../MeboErrors/ValidationFail');
const Input = require('../Input');
const BaseText = require('./BaseText');


/**
 * Version input.
 *
 * This input follows the semver convention.
 *
 * ```javascript
 * const input = Input.create('myInput: version');
 * input.setValue('2.2.1');
 * ```
 *
 * <h2>Property Summary</h2>
 *
 * Property Name | Description | Defined&nbsp;by Default | Default Value
 * --- | --- | :---: | :---:
 * minimumRequired | minimum version required |  | 
 *
 * All properties including the inherited ones can be listed via
 * {@link registeredPropertyNames}
 *
 * @see http://semver.org
 */
class Version extends BaseText{

  /**
   * Implements input's validations
   *
   * @param {null|number} at - index used when input has been created as a vector that
   * tells which value should be used
   * @return {Promise<*>} value held by the input based on the current context (at)
   * @protected
   */
  _validation(at){

    // calling super class validations
    return super._validation(at).then((value) => {

      // minimumVersionRequired
      if (this.property('minimumRequired') && compareVersions(value, this.property('minimumRequired')) === -1){
        throw new ValidationFail(
          util.format('Version is not compatible, minimum Version required: %s, current version %s', this.property('minimumRequired'), value),
          '524f9ed1-44e8-43d8-83b1-72dc8d33788b',
        );
      }

      return value;
    });
  }
}

// registering the input
Input.register(Version);

// registering properties
Input.registerProperty(Version, 'minimumRequired');

module.exports = Version;