82f2b76e25
We now use webpack instead of SystemJS, effectively bundling modules into one file (plus commons chunks) for every entry point. This results in a much smaller extension size (almost half). Furthermore we use yarn/npm even for extension run-time dependencies. This relieves us from manually vendoring and building dependencies. It's also easier to understand for new developers familiar with node.
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'
|
|
}
|