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