| 'use strict'; |
| var parseMs = require('parse-ms'); |
| var plur = require('plur'); |
| var isFinitePonyfill = require('is-finite'); |
| |
| module.exports = function (ms, opts) { |
| if (!isFinitePonyfill(ms)) { |
| throw new TypeError('Expected a finite number'); |
| } |
| |
| opts = opts || {}; |
| |
| if (ms < 1000) { |
| var msDecimalDigits = typeof opts.msDecimalDigits === 'number' ? opts.msDecimalDigits : 0; |
| return (msDecimalDigits ? ms.toFixed(msDecimalDigits) : Math.ceil(ms)) + (opts.verbose ? ' ' + plur('millisecond', Math.ceil(ms)) : 'ms'); |
| } |
| |
| var ret = []; |
| |
| var add = function (val, long, short, valStr) { |
| if (val === 0) { |
| return; |
| } |
| |
| var postfix = opts.verbose ? ' ' + plur(long, val) : short; |
| |
| ret.push((valStr || val) + postfix); |
| }; |
| |
| var parsed = parseMs(ms); |
| |
| add(parsed.days, 'day', 'd'); |
| add(parsed.hours, 'hour', 'h'); |
| add(parsed.minutes, 'minute', 'm'); |
| |
| if (opts.compact) { |
| add(parsed.seconds, 'second', 's'); |
| return '~' + ret[0]; |
| } |
| |
| var sec = ms / 1000 % 60; |
| var secDecimalDigits = typeof opts.secDecimalDigits === 'number' ? opts.secDecimalDigits : 1; |
| var secStr = sec.toFixed(secDecimalDigits).replace(/\.0$/, ''); |
| add(sec, 'second', 's', secStr); |
| |
| return ret.join(' '); |
| }; |