/ node_modules / ms / index.js
index.js
  1  /**
  2   * Helpers.
  3   */
  4  
  5  var s = 1000;
  6  var m = s * 60;
  7  var h = m * 60;
  8  var d = h * 24;
  9  var w = d * 7;
 10  var y = d * 365.25;
 11  
 12  /**
 13   * Parse or format the given `val`.
 14   *
 15   * Options:
 16   *
 17   *  - `long` verbose formatting [false]
 18   *
 19   * @param {String|Number} val
 20   * @param {Object} [options]
 21   * @throws {Error} throw an error if val is not a non-empty string or a number
 22   * @return {String|Number}
 23   * @api public
 24   */
 25  
 26  module.exports = function (val, options) {
 27    options = options || {};
 28    var type = typeof val;
 29    if (type === 'string' && val.length > 0) {
 30      return parse(val);
 31    } else if (type === 'number' && isFinite(val)) {
 32      return options.long ? fmtLong(val) : fmtShort(val);
 33    }
 34    throw new Error(
 35      'val is not a non-empty string or a valid number. val=' +
 36        JSON.stringify(val)
 37    );
 38  };
 39  
 40  /**
 41   * Parse the given `str` and return milliseconds.
 42   *
 43   * @param {String} str
 44   * @return {Number}
 45   * @api private
 46   */
 47  
 48  function parse(str) {
 49    str = String(str);
 50    if (str.length > 100) {
 51      return;
 52    }
 53    var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
 54      str
 55    );
 56    if (!match) {
 57      return;
 58    }
 59    var n = parseFloat(match[1]);
 60    var type = (match[2] || 'ms').toLowerCase();
 61    switch (type) {
 62      case 'years':
 63      case 'year':
 64      case 'yrs':
 65      case 'yr':
 66      case 'y':
 67        return n * y;
 68      case 'weeks':
 69      case 'week':
 70      case 'w':
 71        return n * w;
 72      case 'days':
 73      case 'day':
 74      case 'd':
 75        return n * d;
 76      case 'hours':
 77      case 'hour':
 78      case 'hrs':
 79      case 'hr':
 80      case 'h':
 81        return n * h;
 82      case 'minutes':
 83      case 'minute':
 84      case 'mins':
 85      case 'min':
 86      case 'm':
 87        return n * m;
 88      case 'seconds':
 89      case 'second':
 90      case 'secs':
 91      case 'sec':
 92      case 's':
 93        return n * s;
 94      case 'milliseconds':
 95      case 'millisecond':
 96      case 'msecs':
 97      case 'msec':
 98      case 'ms':
 99        return n;
100      default:
101        return undefined;
102    }
103  }
104  
105  /**
106   * Short format for `ms`.
107   *
108   * @param {Number} ms
109   * @return {String}
110   * @api private
111   */
112  
113  function fmtShort(ms) {
114    var msAbs = Math.abs(ms);
115    if (msAbs >= d) {
116      return Math.round(ms / d) + 'd';
117    }
118    if (msAbs >= h) {
119      return Math.round(ms / h) + 'h';
120    }
121    if (msAbs >= m) {
122      return Math.round(ms / m) + 'm';
123    }
124    if (msAbs >= s) {
125      return Math.round(ms / s) + 's';
126    }
127    return ms + 'ms';
128  }
129  
130  /**
131   * Long format for `ms`.
132   *
133   * @param {Number} ms
134   * @return {String}
135   * @api private
136   */
137  
138  function fmtLong(ms) {
139    var msAbs = Math.abs(ms);
140    if (msAbs >= d) {
141      return plural(ms, msAbs, d, 'day');
142    }
143    if (msAbs >= h) {
144      return plural(ms, msAbs, h, 'hour');
145    }
146    if (msAbs >= m) {
147      return plural(ms, msAbs, m, 'minute');
148    }
149    if (msAbs >= s) {
150      return plural(ms, msAbs, s, 'second');
151    }
152    return ms + ' ms';
153  }
154  
155  /**
156   * Pluralization helper.
157   */
158  
159  function plural(ms, msAbs, n, name) {
160    var isPlural = msAbs >= n * 1.5;
161    return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
162  }