You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					341 lines
				
				8.6 KiB
			
		
		
			
		
	
	
					341 lines
				
				8.6 KiB
			| 
											2 years ago
										 | import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND, MILLISECONDS_A_WEEK, REGEX_FORMAT } from '../../constant'; | ||
|  | var MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365; | ||
|  | var MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30; | ||
|  | var durationRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; | ||
|  | var unitToMS = { | ||
|  |   years: MILLISECONDS_A_YEAR, | ||
|  |   months: MILLISECONDS_A_MONTH, | ||
|  |   days: MILLISECONDS_A_DAY, | ||
|  |   hours: MILLISECONDS_A_HOUR, | ||
|  |   minutes: MILLISECONDS_A_MINUTE, | ||
|  |   seconds: MILLISECONDS_A_SECOND, | ||
|  |   milliseconds: 1, | ||
|  |   weeks: MILLISECONDS_A_WEEK | ||
|  | }; | ||
|  | 
 | ||
|  | var isDuration = function isDuration(d) { | ||
|  |   return d instanceof Duration; | ||
|  | }; // eslint-disable-line no-use-before-define
 | ||
|  | 
 | ||
|  | 
 | ||
|  | var $d; | ||
|  | var $u; | ||
|  | 
 | ||
|  | var wrapper = function wrapper(input, instance, unit) { | ||
|  |   return new Duration(input, unit, instance.$l); | ||
|  | }; // eslint-disable-line no-use-before-define
 | ||
|  | 
 | ||
|  | 
 | ||
|  | var prettyUnit = function prettyUnit(unit) { | ||
|  |   return $u.p(unit) + "s"; | ||
|  | }; | ||
|  | 
 | ||
|  | var isNegative = function isNegative(number) { | ||
|  |   return number < 0; | ||
|  | }; | ||
|  | 
 | ||
|  | var roundNumber = function roundNumber(number) { | ||
|  |   return isNegative(number) ? Math.ceil(number) : Math.floor(number); | ||
|  | }; | ||
|  | 
 | ||
|  | var absolute = function absolute(number) { | ||
|  |   return Math.abs(number); | ||
|  | }; | ||
|  | 
 | ||
|  | var getNumberUnitFormat = function getNumberUnitFormat(number, unit) { | ||
|  |   if (!number) { | ||
|  |     return { | ||
|  |       negative: false, | ||
|  |       format: '' | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (isNegative(number)) { | ||
|  |     return { | ||
|  |       negative: true, | ||
|  |       format: "" + absolute(number) + unit | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     negative: false, | ||
|  |     format: "" + number + unit | ||
|  |   }; | ||
|  | }; | ||
|  | 
 | ||
|  | var Duration = /*#__PURE__*/function () { | ||
|  |   function Duration(input, unit, locale) { | ||
|  |     var _this = this; | ||
|  | 
 | ||
|  |     this.$d = {}; | ||
|  |     this.$l = locale; | ||
|  | 
 | ||
|  |     if (input === undefined) { | ||
|  |       this.$ms = 0; | ||
|  |       this.parseFromMilliseconds(); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (unit) { | ||
|  |       return wrapper(input * unitToMS[prettyUnit(unit)], this); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (typeof input === 'number') { | ||
|  |       this.$ms = input; | ||
|  |       this.parseFromMilliseconds(); | ||
|  |       return this; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (typeof input === 'object') { | ||
|  |       Object.keys(input).forEach(function (k) { | ||
|  |         _this.$d[prettyUnit(k)] = input[k]; | ||
|  |       }); | ||
|  |       this.calMilliseconds(); | ||
|  |       return this; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (typeof input === 'string') { | ||
|  |       var d = input.match(durationRegex); | ||
|  | 
 | ||
|  |       if (d) { | ||
|  |         var properties = d.slice(2); | ||
|  |         var numberD = properties.map(function (value) { | ||
|  |           return value != null ? Number(value) : 0; | ||
|  |         }); | ||
|  |         this.$d.years = numberD[0]; | ||
|  |         this.$d.months = numberD[1]; | ||
|  |         this.$d.weeks = numberD[2]; | ||
|  |         this.$d.days = numberD[3]; | ||
|  |         this.$d.hours = numberD[4]; | ||
|  |         this.$d.minutes = numberD[5]; | ||
|  |         this.$d.seconds = numberD[6]; | ||
|  |         this.calMilliseconds(); | ||
|  |         return this; | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   var _proto = Duration.prototype; | ||
|  | 
 | ||
|  |   _proto.calMilliseconds = function calMilliseconds() { | ||
|  |     var _this2 = this; | ||
|  | 
 | ||
|  |     this.$ms = Object.keys(this.$d).reduce(function (total, unit) { | ||
|  |       return total + (_this2.$d[unit] || 0) * unitToMS[unit]; | ||
|  |     }, 0); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.parseFromMilliseconds = function parseFromMilliseconds() { | ||
|  |     var $ms = this.$ms; | ||
|  |     this.$d.years = roundNumber($ms / MILLISECONDS_A_YEAR); | ||
|  |     $ms %= MILLISECONDS_A_YEAR; | ||
|  |     this.$d.months = roundNumber($ms / MILLISECONDS_A_MONTH); | ||
|  |     $ms %= MILLISECONDS_A_MONTH; | ||
|  |     this.$d.days = roundNumber($ms / MILLISECONDS_A_DAY); | ||
|  |     $ms %= MILLISECONDS_A_DAY; | ||
|  |     this.$d.hours = roundNumber($ms / MILLISECONDS_A_HOUR); | ||
|  |     $ms %= MILLISECONDS_A_HOUR; | ||
|  |     this.$d.minutes = roundNumber($ms / MILLISECONDS_A_MINUTE); | ||
|  |     $ms %= MILLISECONDS_A_MINUTE; | ||
|  |     this.$d.seconds = roundNumber($ms / MILLISECONDS_A_SECOND); | ||
|  |     $ms %= MILLISECONDS_A_SECOND; | ||
|  |     this.$d.milliseconds = $ms; | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.toISOString = function toISOString() { | ||
|  |     var Y = getNumberUnitFormat(this.$d.years, 'Y'); | ||
|  |     var M = getNumberUnitFormat(this.$d.months, 'M'); | ||
|  |     var days = +this.$d.days || 0; | ||
|  | 
 | ||
|  |     if (this.$d.weeks) { | ||
|  |       days += this.$d.weeks * 7; | ||
|  |     } | ||
|  | 
 | ||
|  |     var D = getNumberUnitFormat(days, 'D'); | ||
|  |     var H = getNumberUnitFormat(this.$d.hours, 'H'); | ||
|  |     var m = getNumberUnitFormat(this.$d.minutes, 'M'); | ||
|  |     var seconds = this.$d.seconds || 0; | ||
|  | 
 | ||
|  |     if (this.$d.milliseconds) { | ||
|  |       seconds += this.$d.milliseconds / 1000; | ||
|  |     } | ||
|  | 
 | ||
|  |     var S = getNumberUnitFormat(seconds, 'S'); | ||
|  |     var negativeMode = Y.negative || M.negative || D.negative || H.negative || m.negative || S.negative; | ||
|  |     var T = H.format || m.format || S.format ? 'T' : ''; | ||
|  |     var P = negativeMode ? '-' : ''; | ||
|  |     var result = P + "P" + Y.format + M.format + D.format + T + H.format + m.format + S.format; | ||
|  |     return result === 'P' || result === '-P' ? 'P0D' : result; | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.toJSON = function toJSON() { | ||
|  |     return this.toISOString(); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.format = function format(formatStr) { | ||
|  |     var str = formatStr || 'YYYY-MM-DDTHH:mm:ss'; | ||
|  |     var matches = { | ||
|  |       Y: this.$d.years, | ||
|  |       YY: $u.s(this.$d.years, 2, '0'), | ||
|  |       YYYY: $u.s(this.$d.years, 4, '0'), | ||
|  |       M: this.$d.months, | ||
|  |       MM: $u.s(this.$d.months, 2, '0'), | ||
|  |       D: this.$d.days, | ||
|  |       DD: $u.s(this.$d.days, 2, '0'), | ||
|  |       H: this.$d.hours, | ||
|  |       HH: $u.s(this.$d.hours, 2, '0'), | ||
|  |       m: this.$d.minutes, | ||
|  |       mm: $u.s(this.$d.minutes, 2, '0'), | ||
|  |       s: this.$d.seconds, | ||
|  |       ss: $u.s(this.$d.seconds, 2, '0'), | ||
|  |       SSS: $u.s(this.$d.milliseconds, 3, '0') | ||
|  |     }; | ||
|  |     return str.replace(REGEX_FORMAT, function (match, $1) { | ||
|  |       return $1 || String(matches[match]); | ||
|  |     }); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.as = function as(unit) { | ||
|  |     return this.$ms / unitToMS[prettyUnit(unit)]; | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.get = function get(unit) { | ||
|  |     var base = this.$ms; | ||
|  |     var pUnit = prettyUnit(unit); | ||
|  | 
 | ||
|  |     if (pUnit === 'milliseconds') { | ||
|  |       base %= 1000; | ||
|  |     } else if (pUnit === 'weeks') { | ||
|  |       base = roundNumber(base / unitToMS[pUnit]); | ||
|  |     } else { | ||
|  |       base = this.$d[pUnit]; | ||
|  |     } | ||
|  | 
 | ||
|  |     return base === 0 ? 0 : base; // a === 0 will be true on both 0 and -0
 | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.add = function add(input, unit, isSubtract) { | ||
|  |     var another; | ||
|  | 
 | ||
|  |     if (unit) { | ||
|  |       another = input * unitToMS[prettyUnit(unit)]; | ||
|  |     } else if (isDuration(input)) { | ||
|  |       another = input.$ms; | ||
|  |     } else { | ||
|  |       another = wrapper(input, this).$ms; | ||
|  |     } | ||
|  | 
 | ||
|  |     return wrapper(this.$ms + another * (isSubtract ? -1 : 1), this); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.subtract = function subtract(input, unit) { | ||
|  |     return this.add(input, unit, true); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.locale = function locale(l) { | ||
|  |     var that = this.clone(); | ||
|  |     that.$l = l; | ||
|  |     return that; | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.clone = function clone() { | ||
|  |     return wrapper(this.$ms, this); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.humanize = function humanize(withSuffix) { | ||
|  |     return $d().add(this.$ms, 'ms').locale(this.$l).fromNow(!withSuffix); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.milliseconds = function milliseconds() { | ||
|  |     return this.get('milliseconds'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asMilliseconds = function asMilliseconds() { | ||
|  |     return this.as('milliseconds'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.seconds = function seconds() { | ||
|  |     return this.get('seconds'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asSeconds = function asSeconds() { | ||
|  |     return this.as('seconds'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.minutes = function minutes() { | ||
|  |     return this.get('minutes'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asMinutes = function asMinutes() { | ||
|  |     return this.as('minutes'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.hours = function hours() { | ||
|  |     return this.get('hours'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asHours = function asHours() { | ||
|  |     return this.as('hours'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.days = function days() { | ||
|  |     return this.get('days'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asDays = function asDays() { | ||
|  |     return this.as('days'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.weeks = function weeks() { | ||
|  |     return this.get('weeks'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asWeeks = function asWeeks() { | ||
|  |     return this.as('weeks'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.months = function months() { | ||
|  |     return this.get('months'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asMonths = function asMonths() { | ||
|  |     return this.as('months'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.years = function years() { | ||
|  |     return this.get('years'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.asYears = function asYears() { | ||
|  |     return this.as('years'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   return Duration; | ||
|  | }(); | ||
|  | 
 | ||
|  | export default (function (option, Dayjs, dayjs) { | ||
|  |   $d = dayjs; | ||
|  |   $u = dayjs().$utils(); | ||
|  | 
 | ||
|  |   dayjs.duration = function (input, unit) { | ||
|  |     var $l = dayjs.locale(); | ||
|  |     return wrapper(input, { | ||
|  |       $l: $l | ||
|  |     }, unit); | ||
|  |   }; | ||
|  | 
 | ||
|  |   dayjs.isDuration = isDuration; | ||
|  |   var oldAdd = Dayjs.prototype.add; | ||
|  |   var oldSubtract = Dayjs.prototype.subtract; | ||
|  | 
 | ||
|  |   Dayjs.prototype.add = function (value, unit) { | ||
|  |     if (isDuration(value)) value = value.asMilliseconds(); | ||
|  |     return oldAdd.bind(this)(value, unit); | ||
|  |   }; | ||
|  | 
 | ||
|  |   Dayjs.prototype.subtract = function (value, unit) { | ||
|  |     if (isDuration(value)) value = value.asMilliseconds(); | ||
|  |     return oldSubtract.bind(this)(value, unit); | ||
|  |   }; | ||
|  | }); |