150 lines
2.7 KiB
JavaScript
150 lines
2.7 KiB
JavaScript
/**
|
|
* Helpers.
|
|
*/
|
|
|
|
var s = 1000
|
|
var m = s * 60
|
|
var h = m * 60
|
|
var d = h * 24
|
|
var y = d * 365.25
|
|
|
|
/**
|
|
* Parse or format the given `val`.
|
|
*
|
|
* Options:
|
|
*
|
|
* - `long` verbose formatting [false]
|
|
*
|
|
* @param {String|Number} val
|
|
* @param {Object} options
|
|
* @throws {Error} throw an error if val is not a non-empty string or a number
|
|
* @return {String|Number}
|
|
* @api public
|
|
*/
|
|
|
|
module.exports = function (val, options) {
|
|
options = options || {}
|
|
var type = typeof val
|
|
if (type === 'string' && val.length > 0) {
|
|
return parse(val)
|
|
} else if (type === 'number' && isNaN(val) === false) {
|
|
return options.long ?
|
|
fmtLong(val) :
|
|
fmtShort(val)
|
|
}
|
|
throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))
|
|
}
|
|
|
|
/**
|
|
* Parse the given `str` and return milliseconds.
|
|
*
|
|
* @param {String} str
|
|
* @return {Number}
|
|
* @api private
|
|
*/
|
|
|
|
function parse(str) {
|
|
str = String(str)
|
|
if (str.length > 10000) {
|
|
return
|
|
}
|
|
var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)
|
|
if (!match) {
|
|
return
|
|
}
|
|
var n = parseFloat(match[1])
|
|
var type = (match[2] || 'ms').toLowerCase()
|
|
switch (type) {
|
|
case 'years':
|
|
case 'year':
|
|
case 'yrs':
|
|
case 'yr':
|
|
case 'y':
|
|
return n * y
|
|
case 'days':
|
|
case 'day':
|
|
case 'd':
|
|
return n * d
|
|
case 'hours':
|
|
case 'hour':
|
|
case 'hrs':
|
|
case 'hr':
|
|
case 'h':
|
|
return n * h
|
|
case 'minutes':
|
|
case 'minute':
|
|
case 'mins':
|
|
case 'min':
|
|
case 'm':
|
|
return n * m
|
|
case 'seconds':
|
|
case 'second':
|
|
case 'secs':
|
|
case 'sec':
|
|
case 's':
|
|
return n * s
|
|
case 'milliseconds':
|
|
case 'millisecond':
|
|
case 'msecs':
|
|
case 'msec':
|
|
case 'ms':
|
|
return n
|
|
default:
|
|
return undefined
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Short format for `ms`.
|
|
*
|
|
* @param {Number} ms
|
|
* @return {String}
|
|
* @api private
|
|
*/
|
|
|
|
function fmtShort(ms) {
|
|
if (ms >= d) {
|
|
return Math.round(ms / d) + 'd'
|
|
}
|
|
if (ms >= h) {
|
|
return Math.round(ms / h) + 'h'
|
|
}
|
|
if (ms >= m) {
|
|
return Math.round(ms / m) + 'm'
|
|
}
|
|
if (ms >= s) {
|
|
return Math.round(ms / s) + 's'
|
|
}
|
|
return ms + 'ms'
|
|
}
|
|
|
|
/**
|
|
* Long format for `ms`.
|
|
*
|
|
* @param {Number} ms
|
|
* @return {String}
|
|
* @api private
|
|
*/
|
|
|
|
function fmtLong(ms) {
|
|
return plural(ms, d, 'day') ||
|
|
plural(ms, h, 'hour') ||
|
|
plural(ms, m, 'minute') ||
|
|
plural(ms, s, 'second') ||
|
|
ms + ' ms'
|
|
}
|
|
|
|
/**
|
|
* Pluralization helper.
|
|
*/
|
|
|
|
function plural(ms, n, name) {
|
|
if (ms < n) {
|
|
return
|
|
}
|
|
if (ms < n * 1.5) {
|
|
return Math.floor(ms / n) + ' ' + name
|
|
}
|
|
return Math.ceil(ms / n) + ' ' + name + 's'
|
|
}
|