4732 lines
127 KiB
JavaScript
4732 lines
127 KiB
JavaScript
import { defineComponent, computed, unref, mergeProps, useSSRContext } from 'vue';
|
||
import { ssrRenderComponent } from 'vue/server-renderer';
|
||
import { W as dayjs, aQ as DatePicker$1, a as useConfigStore } from './server.mjs';
|
||
import _extends from '@babel/runtime/helpers/esm/extends';
|
||
import moment from 'moment-jalaali';
|
||
import jalaliday from 'dayjalali';
|
||
|
||
var hookCallback;
|
||
|
||
function hooks() {
|
||
return hookCallback.apply(null, arguments);
|
||
}
|
||
|
||
// This is done to register the method called with moment()
|
||
// without creating circular dependencies.
|
||
function setHookCallback(callback) {
|
||
hookCallback = callback;
|
||
}
|
||
|
||
function isArray(input) {
|
||
return (
|
||
input instanceof Array ||
|
||
Object.prototype.toString.call(input) === '[object Array]'
|
||
);
|
||
}
|
||
|
||
function isObject(input) {
|
||
// IE8 will treat undefined and null as object if it wasn't for
|
||
// input != null
|
||
return (
|
||
input != null &&
|
||
Object.prototype.toString.call(input) === '[object Object]'
|
||
);
|
||
}
|
||
|
||
function hasOwnProp(a, b) {
|
||
return Object.prototype.hasOwnProperty.call(a, b);
|
||
}
|
||
|
||
function isObjectEmpty(obj) {
|
||
if (Object.getOwnPropertyNames) {
|
||
return Object.getOwnPropertyNames(obj).length === 0;
|
||
} else {
|
||
var k;
|
||
for (k in obj) {
|
||
if (hasOwnProp(obj, k)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
}
|
||
|
||
function isUndefined(input) {
|
||
return input === void 0;
|
||
}
|
||
|
||
function isNumber(input) {
|
||
return (
|
||
typeof input === 'number' ||
|
||
Object.prototype.toString.call(input) === '[object Number]'
|
||
);
|
||
}
|
||
|
||
function isDate(input) {
|
||
return (
|
||
input instanceof Date ||
|
||
Object.prototype.toString.call(input) === '[object Date]'
|
||
);
|
||
}
|
||
|
||
function map(arr, fn) {
|
||
var res = [],
|
||
i,
|
||
arrLen = arr.length;
|
||
for (i = 0; i < arrLen; ++i) {
|
||
res.push(fn(arr[i], i));
|
||
}
|
||
return res;
|
||
}
|
||
|
||
function extend(a, b) {
|
||
for (var i in b) {
|
||
if (hasOwnProp(b, i)) {
|
||
a[i] = b[i];
|
||
}
|
||
}
|
||
|
||
if (hasOwnProp(b, 'toString')) {
|
||
a.toString = b.toString;
|
||
}
|
||
|
||
if (hasOwnProp(b, 'valueOf')) {
|
||
a.valueOf = b.valueOf;
|
||
}
|
||
|
||
return a;
|
||
}
|
||
|
||
function createUTC(input, format, locale, strict) {
|
||
return createLocalOrUTC(input, format, locale, strict, true).utc();
|
||
}
|
||
|
||
function defaultParsingFlags() {
|
||
// We need to deep clone this object.
|
||
return {
|
||
empty: false,
|
||
unusedTokens: [],
|
||
unusedInput: [],
|
||
overflow: -2,
|
||
charsLeftOver: 0,
|
||
nullInput: false,
|
||
invalidEra: null,
|
||
invalidMonth: null,
|
||
invalidFormat: false,
|
||
userInvalidated: false,
|
||
iso: false,
|
||
parsedDateParts: [],
|
||
era: null,
|
||
meridiem: null,
|
||
rfc2822: false,
|
||
weekdayMismatch: false,
|
||
};
|
||
}
|
||
|
||
function getParsingFlags(m) {
|
||
if (m._pf == null) {
|
||
m._pf = defaultParsingFlags();
|
||
}
|
||
return m._pf;
|
||
}
|
||
|
||
var some;
|
||
if (Array.prototype.some) {
|
||
some = Array.prototype.some;
|
||
} else {
|
||
some = function (fun) {
|
||
var t = Object(this),
|
||
len = t.length >>> 0,
|
||
i;
|
||
|
||
for (i = 0; i < len; i++) {
|
||
if (i in t && fun.call(this, t[i], i, t)) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
};
|
||
}
|
||
|
||
function isValid$1(m) {
|
||
var flags = null,
|
||
parsedParts = false,
|
||
isNowValid = m._d && !isNaN(m._d.getTime());
|
||
if (isNowValid) {
|
||
flags = getParsingFlags(m);
|
||
parsedParts = some.call(flags.parsedDateParts, function (i) {
|
||
return i != null;
|
||
});
|
||
isNowValid =
|
||
flags.overflow < 0 &&
|
||
!flags.empty &&
|
||
!flags.invalidEra &&
|
||
!flags.invalidMonth &&
|
||
!flags.invalidWeekday &&
|
||
!flags.weekdayMismatch &&
|
||
!flags.nullInput &&
|
||
!flags.invalidFormat &&
|
||
!flags.userInvalidated &&
|
||
(!flags.meridiem || (flags.meridiem && parsedParts));
|
||
if (m._strict) {
|
||
isNowValid =
|
||
isNowValid &&
|
||
flags.charsLeftOver === 0 &&
|
||
flags.unusedTokens.length === 0 &&
|
||
flags.bigHour === undefined;
|
||
}
|
||
}
|
||
if (Object.isFrozen == null || !Object.isFrozen(m)) {
|
||
m._isValid = isNowValid;
|
||
} else {
|
||
return isNowValid;
|
||
}
|
||
return m._isValid;
|
||
}
|
||
|
||
function createInvalid$1(flags) {
|
||
var m = createUTC(NaN);
|
||
if (flags != null) {
|
||
extend(getParsingFlags(m), flags);
|
||
} else {
|
||
getParsingFlags(m).userInvalidated = true;
|
||
}
|
||
|
||
return m;
|
||
}
|
||
|
||
// Plugins that add properties should also add the key here (null value),
|
||
// so we can properly clone ourselves.
|
||
var momentProperties = (hooks.momentProperties = []),
|
||
updateInProgress = false;
|
||
|
||
function copyConfig(to, from) {
|
||
var i,
|
||
prop,
|
||
val,
|
||
momentPropertiesLen = momentProperties.length;
|
||
|
||
if (!isUndefined(from._isAMomentObject)) {
|
||
to._isAMomentObject = from._isAMomentObject;
|
||
}
|
||
if (!isUndefined(from._i)) {
|
||
to._i = from._i;
|
||
}
|
||
if (!isUndefined(from._f)) {
|
||
to._f = from._f;
|
||
}
|
||
if (!isUndefined(from._l)) {
|
||
to._l = from._l;
|
||
}
|
||
if (!isUndefined(from._strict)) {
|
||
to._strict = from._strict;
|
||
}
|
||
if (!isUndefined(from._tzm)) {
|
||
to._tzm = from._tzm;
|
||
}
|
||
if (!isUndefined(from._isUTC)) {
|
||
to._isUTC = from._isUTC;
|
||
}
|
||
if (!isUndefined(from._offset)) {
|
||
to._offset = from._offset;
|
||
}
|
||
if (!isUndefined(from._pf)) {
|
||
to._pf = getParsingFlags(from);
|
||
}
|
||
if (!isUndefined(from._locale)) {
|
||
to._locale = from._locale;
|
||
}
|
||
|
||
if (momentPropertiesLen > 0) {
|
||
for (i = 0; i < momentPropertiesLen; i++) {
|
||
prop = momentProperties[i];
|
||
val = from[prop];
|
||
if (!isUndefined(val)) {
|
||
to[prop] = val;
|
||
}
|
||
}
|
||
}
|
||
|
||
return to;
|
||
}
|
||
|
||
// Moment prototype object
|
||
function Moment(config) {
|
||
copyConfig(this, config);
|
||
this._d = new Date(config._d != null ? config._d.getTime() : NaN);
|
||
if (!this.isValid()) {
|
||
this._d = new Date(NaN);
|
||
}
|
||
// Prevent infinite loop in case updateOffset creates new moment
|
||
// objects.
|
||
if (updateInProgress === false) {
|
||
updateInProgress = true;
|
||
hooks.updateOffset(this);
|
||
updateInProgress = false;
|
||
}
|
||
}
|
||
|
||
function isMoment(obj) {
|
||
return (
|
||
obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
|
||
);
|
||
}
|
||
|
||
function warn(msg) {
|
||
if (
|
||
hooks.suppressDeprecationWarnings === false &&
|
||
typeof console !== 'undefined' &&
|
||
console.warn
|
||
) {
|
||
console.warn('Deprecation warning: ' + msg);
|
||
}
|
||
}
|
||
|
||
function deprecate(msg, fn) {
|
||
var firstTime = true;
|
||
|
||
return extend(function () {
|
||
if (hooks.deprecationHandler != null) {
|
||
hooks.deprecationHandler(null, msg);
|
||
}
|
||
if (firstTime) {
|
||
var args = [],
|
||
arg,
|
||
i,
|
||
key,
|
||
argLen = arguments.length;
|
||
for (i = 0; i < argLen; i++) {
|
||
arg = '';
|
||
if (typeof arguments[i] === 'object') {
|
||
arg += '\n[' + i + '] ';
|
||
for (key in arguments[0]) {
|
||
if (hasOwnProp(arguments[0], key)) {
|
||
arg += key + ': ' + arguments[0][key] + ', ';
|
||
}
|
||
}
|
||
arg = arg.slice(0, -2); // Remove trailing comma and space
|
||
} else {
|
||
arg = arguments[i];
|
||
}
|
||
args.push(arg);
|
||
}
|
||
warn(
|
||
msg +
|
||
'\nArguments: ' +
|
||
Array.prototype.slice.call(args).join('') +
|
||
'\n' +
|
||
new Error().stack
|
||
);
|
||
firstTime = false;
|
||
}
|
||
return fn.apply(this, arguments);
|
||
}, fn);
|
||
}
|
||
|
||
var deprecations = {};
|
||
|
||
function deprecateSimple(name, msg) {
|
||
if (hooks.deprecationHandler != null) {
|
||
hooks.deprecationHandler(name, msg);
|
||
}
|
||
if (!deprecations[name]) {
|
||
warn(msg);
|
||
deprecations[name] = true;
|
||
}
|
||
}
|
||
|
||
hooks.suppressDeprecationWarnings = false;
|
||
hooks.deprecationHandler = null;
|
||
|
||
function isFunction(input) {
|
||
return (
|
||
(typeof Function !== 'undefined' && input instanceof Function) ||
|
||
Object.prototype.toString.call(input) === '[object Function]'
|
||
);
|
||
}
|
||
|
||
function mergeConfigs(parentConfig, childConfig) {
|
||
var res = extend({}, parentConfig),
|
||
prop;
|
||
for (prop in childConfig) {
|
||
if (hasOwnProp(childConfig, prop)) {
|
||
if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
|
||
res[prop] = {};
|
||
extend(res[prop], parentConfig[prop]);
|
||
extend(res[prop], childConfig[prop]);
|
||
} else if (childConfig[prop] != null) {
|
||
res[prop] = childConfig[prop];
|
||
} else {
|
||
delete res[prop];
|
||
}
|
||
}
|
||
}
|
||
for (prop in parentConfig) {
|
||
if (
|
||
hasOwnProp(parentConfig, prop) &&
|
||
!hasOwnProp(childConfig, prop) &&
|
||
isObject(parentConfig[prop])
|
||
) {
|
||
// make sure changes to properties don't modify parent config
|
||
res[prop] = extend({}, res[prop]);
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
function Locale(config) {
|
||
if (config != null) {
|
||
this.set(config);
|
||
}
|
||
}
|
||
|
||
var keys;
|
||
|
||
if (Object.keys) {
|
||
keys = Object.keys;
|
||
} else {
|
||
keys = function (obj) {
|
||
var i,
|
||
res = [];
|
||
for (i in obj) {
|
||
if (hasOwnProp(obj, i)) {
|
||
res.push(i);
|
||
}
|
||
}
|
||
return res;
|
||
};
|
||
}
|
||
|
||
var defaultCalendar = {
|
||
sameDay: '[Today at] LT',
|
||
nextDay: '[Tomorrow at] LT',
|
||
nextWeek: 'dddd [at] LT',
|
||
lastDay: '[Yesterday at] LT',
|
||
lastWeek: '[Last] dddd [at] LT',
|
||
sameElse: 'L',
|
||
};
|
||
|
||
function zeroFill(number, targetLength, forceSign) {
|
||
var absNumber = '' + Math.abs(number),
|
||
zerosToFill = targetLength - absNumber.length,
|
||
sign = number >= 0;
|
||
return (
|
||
(sign ? (forceSign ? '+' : '') : '-') +
|
||
Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
|
||
absNumber
|
||
);
|
||
}
|
||
|
||
var formattingTokens =
|
||
/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
|
||
localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
|
||
formatFunctions = {},
|
||
formatTokenFunctions = {};
|
||
|
||
// token: 'M'
|
||
// padded: ['MM', 2]
|
||
// ordinal: 'Mo'
|
||
// callback: function () { this.month() + 1 }
|
||
function addFormatToken(token, padded, ordinal, callback) {
|
||
var func = callback;
|
||
if (typeof callback === 'string') {
|
||
func = function () {
|
||
return this[callback]();
|
||
};
|
||
}
|
||
if (token) {
|
||
formatTokenFunctions[token] = func;
|
||
}
|
||
if (padded) {
|
||
formatTokenFunctions[padded[0]] = function () {
|
||
return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
|
||
};
|
||
}
|
||
if (ordinal) {
|
||
formatTokenFunctions[ordinal] = function () {
|
||
return this.localeData().ordinal(
|
||
func.apply(this, arguments),
|
||
token
|
||
);
|
||
};
|
||
}
|
||
}
|
||
|
||
function removeFormattingTokens(input) {
|
||
if (input.match(/\[[\s\S]/)) {
|
||
return input.replace(/^\[|\]$/g, '');
|
||
}
|
||
return input.replace(/\\/g, '');
|
||
}
|
||
|
||
function makeFormatFunction(format) {
|
||
var array = format.match(formattingTokens),
|
||
i,
|
||
length;
|
||
|
||
for (i = 0, length = array.length; i < length; i++) {
|
||
if (formatTokenFunctions[array[i]]) {
|
||
array[i] = formatTokenFunctions[array[i]];
|
||
} else {
|
||
array[i] = removeFormattingTokens(array[i]);
|
||
}
|
||
}
|
||
|
||
return function (mom) {
|
||
var output = '',
|
||
i;
|
||
for (i = 0; i < length; i++) {
|
||
output += isFunction(array[i])
|
||
? array[i].call(mom, format)
|
||
: array[i];
|
||
}
|
||
return output;
|
||
};
|
||
}
|
||
|
||
// format date using native date object
|
||
function formatMoment(m, format) {
|
||
if (!m.isValid()) {
|
||
return m.localeData().invalidDate();
|
||
}
|
||
|
||
format = expandFormat(format, m.localeData());
|
||
formatFunctions[format] =
|
||
formatFunctions[format] || makeFormatFunction(format);
|
||
|
||
return formatFunctions[format](m);
|
||
}
|
||
|
||
function expandFormat(format, locale) {
|
||
var i = 5;
|
||
|
||
function replaceLongDateFormatTokens(input) {
|
||
return locale.longDateFormat(input) || input;
|
||
}
|
||
|
||
localFormattingTokens.lastIndex = 0;
|
||
while (i >= 0 && localFormattingTokens.test(format)) {
|
||
format = format.replace(
|
||
localFormattingTokens,
|
||
replaceLongDateFormatTokens
|
||
);
|
||
localFormattingTokens.lastIndex = 0;
|
||
i -= 1;
|
||
}
|
||
|
||
return format;
|
||
}
|
||
|
||
var defaultLongDateFormat = {
|
||
LTS: 'h:mm:ss A',
|
||
LT: 'h:mm A',
|
||
L: 'MM/DD/YYYY',
|
||
LL: 'MMMM D, YYYY',
|
||
LLL: 'MMMM D, YYYY h:mm A',
|
||
LLLL: 'dddd, MMMM D, YYYY h:mm A',
|
||
};
|
||
|
||
var defaultInvalidDate = 'Invalid date';
|
||
|
||
var defaultOrdinal = '%d',
|
||
defaultDayOfMonthOrdinalParse = /\d{1,2}/;
|
||
|
||
var defaultRelativeTime = {
|
||
future: 'in %s',
|
||
past: '%s ago',
|
||
s: 'a few seconds',
|
||
ss: '%d seconds',
|
||
m: 'a minute',
|
||
mm: '%d minutes',
|
||
h: 'an hour',
|
||
hh: '%d hours',
|
||
d: 'a day',
|
||
dd: '%d days',
|
||
w: 'a week',
|
||
ww: '%d weeks',
|
||
M: 'a month',
|
||
MM: '%d months',
|
||
y: 'a year',
|
||
yy: '%d years',
|
||
};
|
||
|
||
var aliases = {
|
||
D: 'date',
|
||
dates: 'date',
|
||
date: 'date',
|
||
d: 'day',
|
||
days: 'day',
|
||
day: 'day',
|
||
e: 'weekday',
|
||
weekdays: 'weekday',
|
||
weekday: 'weekday',
|
||
E: 'isoWeekday',
|
||
isoweekdays: 'isoWeekday',
|
||
isoweekday: 'isoWeekday',
|
||
DDD: 'dayOfYear',
|
||
dayofyears: 'dayOfYear',
|
||
dayofyear: 'dayOfYear',
|
||
h: 'hour',
|
||
hours: 'hour',
|
||
hour: 'hour',
|
||
ms: 'millisecond',
|
||
milliseconds: 'millisecond',
|
||
millisecond: 'millisecond',
|
||
m: 'minute',
|
||
minutes: 'minute',
|
||
minute: 'minute',
|
||
M: 'month',
|
||
months: 'month',
|
||
month: 'month',
|
||
Q: 'quarter',
|
||
quarters: 'quarter',
|
||
quarter: 'quarter',
|
||
s: 'second',
|
||
seconds: 'second',
|
||
second: 'second',
|
||
gg: 'weekYear',
|
||
weekyears: 'weekYear',
|
||
weekyear: 'weekYear',
|
||
GG: 'isoWeekYear',
|
||
isoweekyears: 'isoWeekYear',
|
||
isoweekyear: 'isoWeekYear',
|
||
w: 'week',
|
||
weeks: 'week',
|
||
week: 'week',
|
||
W: 'isoWeek',
|
||
isoweeks: 'isoWeek',
|
||
isoweek: 'isoWeek',
|
||
y: 'year',
|
||
years: 'year',
|
||
year: 'year',
|
||
};
|
||
|
||
function normalizeUnits(units) {
|
||
return typeof units === 'string'
|
||
? aliases[units] || aliases[units.toLowerCase()]
|
||
: undefined;
|
||
}
|
||
|
||
function normalizeObjectUnits(inputObject) {
|
||
var normalizedInput = {},
|
||
normalizedProp,
|
||
prop;
|
||
|
||
for (prop in inputObject) {
|
||
if (hasOwnProp(inputObject, prop)) {
|
||
normalizedProp = normalizeUnits(prop);
|
||
if (normalizedProp) {
|
||
normalizedInput[normalizedProp] = inputObject[prop];
|
||
}
|
||
}
|
||
}
|
||
|
||
return normalizedInput;
|
||
}
|
||
|
||
var priorities = {
|
||
date: 9,
|
||
day: 11,
|
||
weekday: 11,
|
||
isoWeekday: 11,
|
||
dayOfYear: 4,
|
||
hour: 13,
|
||
millisecond: 16,
|
||
minute: 14,
|
||
month: 8,
|
||
quarter: 7,
|
||
second: 15,
|
||
weekYear: 1,
|
||
isoWeekYear: 1,
|
||
week: 5,
|
||
isoWeek: 5,
|
||
year: 1,
|
||
};
|
||
|
||
function getPrioritizedUnits(unitsObj) {
|
||
var units = [],
|
||
u;
|
||
for (u in unitsObj) {
|
||
if (hasOwnProp(unitsObj, u)) {
|
||
units.push({ unit: u, priority: priorities[u] });
|
||
}
|
||
}
|
||
units.sort(function (a, b) {
|
||
return a.priority - b.priority;
|
||
});
|
||
return units;
|
||
}
|
||
|
||
var match1 = /\d/, // 0 - 9
|
||
match2 = /\d\d/, // 00 - 99
|
||
match3 = /\d{3}/, // 000 - 999
|
||
match4 = /\d{4}/, // 0000 - 9999
|
||
match6 = /[+-]?\d{6}/, // -999999 - 999999
|
||
match1to2 = /\d\d?/, // 0 - 99
|
||
match3to4 = /\d\d\d\d?/, // 999 - 9999
|
||
match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999
|
||
match1to3 = /\d{1,3}/, // 0 - 999
|
||
match1to4 = /\d{1,4}/, // 0 - 9999
|
||
match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
|
||
matchUnsigned = /\d+/, // 0 - inf
|
||
matchSigned = /[+-]?\d+/, // -inf - inf
|
||
matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
|
||
matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
|
||
match1to2NoLeadingZero = /^[1-9]\d?/, // 1-99
|
||
match1to2HasZero = /^([1-9]\d|\d)/, // 0-99
|
||
regexes;
|
||
|
||
regexes = {};
|
||
|
||
function addRegexToken(token, regex, strictRegex) {
|
||
regexes[token] = isFunction(regex)
|
||
? regex
|
||
: function (isStrict, localeData) {
|
||
return isStrict && strictRegex ? strictRegex : regex;
|
||
};
|
||
}
|
||
|
||
function getParseRegexForToken(token, config) {
|
||
if (!hasOwnProp(regexes, token)) {
|
||
return new RegExp(unescapeFormat(token));
|
||
}
|
||
|
||
return regexes[token](config._strict, config._locale);
|
||
}
|
||
|
||
// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
|
||
function unescapeFormat(s) {
|
||
return regexEscape(
|
||
s
|
||
.replace('\\', '')
|
||
.replace(
|
||
/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
|
||
function (matched, p1, p2, p3, p4) {
|
||
return p1 || p2 || p3 || p4;
|
||
}
|
||
)
|
||
);
|
||
}
|
||
|
||
function regexEscape(s) {
|
||
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
||
}
|
||
|
||
function absFloor(number) {
|
||
if (number < 0) {
|
||
// -0 -> 0
|
||
return Math.ceil(number) || 0;
|
||
} else {
|
||
return Math.floor(number);
|
||
}
|
||
}
|
||
|
||
function toInt(argumentForCoercion) {
|
||
var coercedNumber = +argumentForCoercion,
|
||
value = 0;
|
||
|
||
if (coercedNumber !== 0 && isFinite(coercedNumber)) {
|
||
value = absFloor(coercedNumber);
|
||
}
|
||
|
||
return value;
|
||
}
|
||
|
||
var tokens = {};
|
||
|
||
function addParseToken(token, callback) {
|
||
var i,
|
||
func = callback,
|
||
tokenLen;
|
||
if (typeof token === 'string') {
|
||
token = [token];
|
||
}
|
||
if (isNumber(callback)) {
|
||
func = function (input, array) {
|
||
array[callback] = toInt(input);
|
||
};
|
||
}
|
||
tokenLen = token.length;
|
||
for (i = 0; i < tokenLen; i++) {
|
||
tokens[token[i]] = func;
|
||
}
|
||
}
|
||
|
||
function addWeekParseToken(token, callback) {
|
||
addParseToken(token, function (input, array, config, token) {
|
||
config._w = config._w || {};
|
||
callback(input, config._w, config, token);
|
||
});
|
||
}
|
||
|
||
function addTimeToArrayFromToken(token, input, config) {
|
||
if (input != null && hasOwnProp(tokens, token)) {
|
||
tokens[token](input, config._a, config, token);
|
||
}
|
||
}
|
||
|
||
function isLeapYear(year) {
|
||
return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
||
}
|
||
|
||
var YEAR = 0,
|
||
MONTH = 1,
|
||
DATE = 2,
|
||
HOUR = 3,
|
||
MINUTE = 4,
|
||
SECOND = 5,
|
||
MILLISECOND = 6,
|
||
WEEK = 7,
|
||
WEEKDAY = 8;
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('Y', 0, 0, function () {
|
||
var y = this.year();
|
||
return y <= 9999 ? zeroFill(y, 4) : '+' + y;
|
||
});
|
||
|
||
addFormatToken(0, ['YY', 2], 0, function () {
|
||
return this.year() % 100;
|
||
});
|
||
|
||
addFormatToken(0, ['YYYY', 4], 0, 'year');
|
||
addFormatToken(0, ['YYYYY', 5], 0, 'year');
|
||
addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('Y', matchSigned);
|
||
addRegexToken('YY', match1to2, match2);
|
||
addRegexToken('YYYY', match1to4, match4);
|
||
addRegexToken('YYYYY', match1to6, match6);
|
||
addRegexToken('YYYYYY', match1to6, match6);
|
||
|
||
addParseToken(['YYYYY', 'YYYYYY'], YEAR);
|
||
addParseToken('YYYY', function (input, array) {
|
||
array[YEAR] =
|
||
input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
|
||
});
|
||
addParseToken('YY', function (input, array) {
|
||
array[YEAR] = hooks.parseTwoDigitYear(input);
|
||
});
|
||
addParseToken('Y', function (input, array) {
|
||
array[YEAR] = parseInt(input, 10);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
function daysInYear(year) {
|
||
return isLeapYear(year) ? 366 : 365;
|
||
}
|
||
|
||
// HOOKS
|
||
|
||
hooks.parseTwoDigitYear = function (input) {
|
||
return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
|
||
};
|
||
|
||
// MOMENTS
|
||
|
||
var getSetYear = makeGetSet('FullYear', true);
|
||
|
||
function getIsLeapYear() {
|
||
return isLeapYear(this.year());
|
||
}
|
||
|
||
function makeGetSet(unit, keepTime) {
|
||
return function (value) {
|
||
if (value != null) {
|
||
set(this, unit, value);
|
||
hooks.updateOffset(this, keepTime);
|
||
return this;
|
||
} else {
|
||
return get$1(this, unit);
|
||
}
|
||
};
|
||
}
|
||
|
||
function get$1(mom, unit) {
|
||
if (!mom.isValid()) {
|
||
return NaN;
|
||
}
|
||
|
||
var d = mom._d,
|
||
isUTC = mom._isUTC;
|
||
|
||
switch (unit) {
|
||
case 'Milliseconds':
|
||
return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();
|
||
case 'Seconds':
|
||
return isUTC ? d.getUTCSeconds() : d.getSeconds();
|
||
case 'Minutes':
|
||
return isUTC ? d.getUTCMinutes() : d.getMinutes();
|
||
case 'Hours':
|
||
return isUTC ? d.getUTCHours() : d.getHours();
|
||
case 'Date':
|
||
return isUTC ? d.getUTCDate() : d.getDate();
|
||
case 'Day':
|
||
return isUTC ? d.getUTCDay() : d.getDay();
|
||
case 'Month':
|
||
return isUTC ? d.getUTCMonth() : d.getMonth();
|
||
case 'FullYear':
|
||
return isUTC ? d.getUTCFullYear() : d.getFullYear();
|
||
default:
|
||
return NaN; // Just in case
|
||
}
|
||
}
|
||
|
||
function set(mom, unit, value) {
|
||
var d, isUTC, year, month, date;
|
||
|
||
if (!mom.isValid() || isNaN(value)) {
|
||
return;
|
||
}
|
||
|
||
d = mom._d;
|
||
isUTC = mom._isUTC;
|
||
|
||
switch (unit) {
|
||
case 'Milliseconds':
|
||
return void (isUTC
|
||
? d.setUTCMilliseconds(value)
|
||
: d.setMilliseconds(value));
|
||
case 'Seconds':
|
||
return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));
|
||
case 'Minutes':
|
||
return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));
|
||
case 'Hours':
|
||
return void (isUTC ? d.setUTCHours(value) : d.setHours(value));
|
||
case 'Date':
|
||
return void (isUTC ? d.setUTCDate(value) : d.setDate(value));
|
||
// case 'Day': // Not real
|
||
// return void (isUTC ? d.setUTCDay(value) : d.setDay(value));
|
||
// case 'Month': // Not used because we need to pass two variables
|
||
// return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));
|
||
case 'FullYear':
|
||
break; // See below ...
|
||
default:
|
||
return; // Just in case
|
||
}
|
||
|
||
year = value;
|
||
month = mom.month();
|
||
date = mom.date();
|
||
date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;
|
||
void (isUTC
|
||
? d.setUTCFullYear(year, month, date)
|
||
: d.setFullYear(year, month, date));
|
||
}
|
||
|
||
// MOMENTS
|
||
|
||
function stringGet(units) {
|
||
units = normalizeUnits(units);
|
||
if (isFunction(this[units])) {
|
||
return this[units]();
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function stringSet(units, value) {
|
||
if (typeof units === 'object') {
|
||
units = normalizeObjectUnits(units);
|
||
var prioritized = getPrioritizedUnits(units),
|
||
i,
|
||
prioritizedLen = prioritized.length;
|
||
for (i = 0; i < prioritizedLen; i++) {
|
||
this[prioritized[i].unit](units[prioritized[i].unit]);
|
||
}
|
||
} else {
|
||
units = normalizeUnits(units);
|
||
if (isFunction(this[units])) {
|
||
return this[units](value);
|
||
}
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function mod$1(n, x) {
|
||
return ((n % x) + x) % x;
|
||
}
|
||
|
||
var indexOf;
|
||
|
||
if (Array.prototype.indexOf) {
|
||
indexOf = Array.prototype.indexOf;
|
||
} else {
|
||
indexOf = function (o) {
|
||
// I know
|
||
var i;
|
||
for (i = 0; i < this.length; ++i) {
|
||
if (this[i] === o) {
|
||
return i;
|
||
}
|
||
}
|
||
return -1;
|
||
};
|
||
}
|
||
|
||
function daysInMonth(year, month) {
|
||
if (isNaN(year) || isNaN(month)) {
|
||
return NaN;
|
||
}
|
||
var modMonth = mod$1(month, 12);
|
||
year += (month - modMonth) / 12;
|
||
return modMonth === 1
|
||
? isLeapYear(year)
|
||
? 29
|
||
: 28
|
||
: 31 - ((modMonth % 7) % 2);
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('M', ['MM', 2], 'Mo', function () {
|
||
return this.month() + 1;
|
||
});
|
||
|
||
addFormatToken('MMM', 0, 0, function (format) {
|
||
return this.localeData().monthsShort(this, format);
|
||
});
|
||
|
||
addFormatToken('MMMM', 0, 0, function (format) {
|
||
return this.localeData().months(this, format);
|
||
});
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('M', match1to2, match1to2NoLeadingZero);
|
||
addRegexToken('MM', match1to2, match2);
|
||
addRegexToken('MMM', function (isStrict, locale) {
|
||
return locale.monthsShortRegex(isStrict);
|
||
});
|
||
addRegexToken('MMMM', function (isStrict, locale) {
|
||
return locale.monthsRegex(isStrict);
|
||
});
|
||
|
||
addParseToken(['M', 'MM'], function (input, array) {
|
||
array[MONTH] = toInt(input) - 1;
|
||
});
|
||
|
||
addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
|
||
var month = config._locale.monthsParse(input, token, config._strict);
|
||
// if we didn't find a month name, mark the date as invalid.
|
||
if (month != null) {
|
||
array[MONTH] = month;
|
||
} else {
|
||
getParsingFlags(config).invalidMonth = input;
|
||
}
|
||
});
|
||
|
||
// LOCALES
|
||
|
||
var defaultLocaleMonths =
|
||
'January_February_March_April_May_June_July_August_September_October_November_December'.split(
|
||
'_'
|
||
),
|
||
defaultLocaleMonthsShort =
|
||
'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
|
||
|
||
// MOMENTS
|
||
|
||
function setMonth(mom, value) {
|
||
if (!mom.isValid()) {
|
||
// No op
|
||
return mom;
|
||
}
|
||
|
||
if (typeof value === 'string') {
|
||
if (/^\d+$/.test(value)) {
|
||
value = toInt(value);
|
||
} else {
|
||
value = mom.localeData().monthsParse(value);
|
||
// TODO: Another silent failure?
|
||
if (!isNumber(value)) {
|
||
return mom;
|
||
}
|
||
}
|
||
}
|
||
|
||
var month = value,
|
||
date = mom.date();
|
||
|
||
date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));
|
||
void (mom._isUTC
|
||
? mom._d.setUTCMonth(month, date)
|
||
: mom._d.setMonth(month, date));
|
||
return mom;
|
||
}
|
||
|
||
function getSetMonth(value) {
|
||
if (value != null) {
|
||
setMonth(this, value);
|
||
hooks.updateOffset(this, true);
|
||
return this;
|
||
} else {
|
||
return get$1(this, 'Month');
|
||
}
|
||
}
|
||
|
||
function getDaysInMonth() {
|
||
return daysInMonth(this.year(), this.month());
|
||
}
|
||
|
||
function createDate(y, m, d, h, M, s, ms) {
|
||
// can't just apply() to create a date:
|
||
// https://stackoverflow.com/q/181348
|
||
var date;
|
||
// the date constructor remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
date = new Date(y + 400, m, d, h, M, s, ms);
|
||
if (isFinite(date.getFullYear())) {
|
||
date.setFullYear(y);
|
||
}
|
||
} else {
|
||
date = new Date(y, m, d, h, M, s, ms);
|
||
}
|
||
|
||
return date;
|
||
}
|
||
|
||
function createUTCDate(y) {
|
||
var date, args;
|
||
// the Date.UTC function remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
args = Array.prototype.slice.call(arguments);
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
args[0] = y + 400;
|
||
date = new Date(Date.UTC.apply(null, args));
|
||
if (isFinite(date.getUTCFullYear())) {
|
||
date.setUTCFullYear(y);
|
||
}
|
||
} else {
|
||
date = new Date(Date.UTC.apply(null, arguments));
|
||
}
|
||
|
||
return date;
|
||
}
|
||
|
||
// start-of-first-week - start-of-year
|
||
function firstWeekOffset(year, dow, doy) {
|
||
var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
|
||
fwd = 7 + dow - doy,
|
||
// first-week day local weekday -- which local weekday is fwd
|
||
fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
|
||
|
||
return -fwdlw + fwd - 1;
|
||
}
|
||
|
||
// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
|
||
function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
|
||
var localWeekday = (7 + weekday - dow) % 7,
|
||
weekOffset = firstWeekOffset(year, dow, doy),
|
||
dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
|
||
resYear,
|
||
resDayOfYear;
|
||
|
||
if (dayOfYear <= 0) {
|
||
resYear = year - 1;
|
||
resDayOfYear = daysInYear(resYear) + dayOfYear;
|
||
} else if (dayOfYear > daysInYear(year)) {
|
||
resYear = year + 1;
|
||
resDayOfYear = dayOfYear - daysInYear(year);
|
||
} else {
|
||
resYear = year;
|
||
resDayOfYear = dayOfYear;
|
||
}
|
||
|
||
return {
|
||
year: resYear,
|
||
dayOfYear: resDayOfYear,
|
||
};
|
||
}
|
||
|
||
function weekOfYear(mom, dow, doy) {
|
||
var weekOffset = firstWeekOffset(mom.year(), dow, doy),
|
||
week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
|
||
resWeek,
|
||
resYear;
|
||
|
||
if (week < 1) {
|
||
resYear = mom.year() - 1;
|
||
resWeek = week + weeksInYear(resYear, dow, doy);
|
||
} else if (week > weeksInYear(mom.year(), dow, doy)) {
|
||
resWeek = week - weeksInYear(mom.year(), dow, doy);
|
||
resYear = mom.year() + 1;
|
||
} else {
|
||
resYear = mom.year();
|
||
resWeek = week;
|
||
}
|
||
|
||
return {
|
||
week: resWeek,
|
||
year: resYear,
|
||
};
|
||
}
|
||
|
||
function weeksInYear(year, dow, doy) {
|
||
var weekOffset = firstWeekOffset(year, dow, doy),
|
||
weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
|
||
return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('w', ['ww', 2], 'wo', 'week');
|
||
addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('w', match1to2, match1to2NoLeadingZero);
|
||
addRegexToken('ww', match1to2, match2);
|
||
addRegexToken('W', match1to2, match1to2NoLeadingZero);
|
||
addRegexToken('WW', match1to2, match2);
|
||
|
||
addWeekParseToken(
|
||
['w', 'ww', 'W', 'WW'],
|
||
function (input, week, config, token) {
|
||
week[token.substr(0, 1)] = toInt(input);
|
||
}
|
||
);
|
||
|
||
var defaultLocaleWeek = {
|
||
dow: 0, // Sunday is the first day of the week.
|
||
doy: 6, // The week that contains Jan 6th is the first week of the year.
|
||
};
|
||
|
||
// MOMENTS
|
||
|
||
function getSetWeek(input) {
|
||
var week = this.localeData().week(this);
|
||
return input == null ? week : this.add((input - week) * 7, 'd');
|
||
}
|
||
|
||
function getSetISOWeek(input) {
|
||
var week = weekOfYear(this, 1, 4).week;
|
||
return input == null ? week : this.add((input - week) * 7, 'd');
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('d', 0, 'do', 'day');
|
||
|
||
addFormatToken('dd', 0, 0, function (format) {
|
||
return this.localeData().weekdaysMin(this, format);
|
||
});
|
||
|
||
addFormatToken('ddd', 0, 0, function (format) {
|
||
return this.localeData().weekdaysShort(this, format);
|
||
});
|
||
|
||
addFormatToken('dddd', 0, 0, function (format) {
|
||
return this.localeData().weekdays(this, format);
|
||
});
|
||
|
||
addFormatToken('e', 0, 0, 'weekday');
|
||
addFormatToken('E', 0, 0, 'isoWeekday');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('d', match1to2);
|
||
addRegexToken('e', match1to2);
|
||
addRegexToken('E', match1to2);
|
||
addRegexToken('dd', function (isStrict, locale) {
|
||
return locale.weekdaysMinRegex(isStrict);
|
||
});
|
||
addRegexToken('ddd', function (isStrict, locale) {
|
||
return locale.weekdaysShortRegex(isStrict);
|
||
});
|
||
addRegexToken('dddd', function (isStrict, locale) {
|
||
return locale.weekdaysRegex(isStrict);
|
||
});
|
||
|
||
addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
|
||
var weekday = config._locale.weekdaysParse(input, token, config._strict);
|
||
// if we didn't get a weekday name, mark the date as invalid
|
||
if (weekday != null) {
|
||
week.d = weekday;
|
||
} else {
|
||
getParsingFlags(config).invalidWeekday = input;
|
||
}
|
||
});
|
||
|
||
addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
|
||
week[token] = toInt(input);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
function parseWeekday(input, locale) {
|
||
if (typeof input !== 'string') {
|
||
return input;
|
||
}
|
||
|
||
if (!isNaN(input)) {
|
||
return parseInt(input, 10);
|
||
}
|
||
|
||
input = locale.weekdaysParse(input);
|
||
if (typeof input === 'number') {
|
||
return input;
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
function parseIsoWeekday(input, locale) {
|
||
if (typeof input === 'string') {
|
||
return locale.weekdaysParse(input) % 7 || 7;
|
||
}
|
||
return isNaN(input) ? null : input;
|
||
}
|
||
|
||
var defaultLocaleWeekdays =
|
||
'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
|
||
defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
|
||
defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
|
||
|
||
// MOMENTS
|
||
|
||
function getSetDayOfWeek(input) {
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
|
||
var day = get$1(this, 'Day');
|
||
if (input != null) {
|
||
input = parseWeekday(input, this.localeData());
|
||
return this.add(input - day, 'd');
|
||
} else {
|
||
return day;
|
||
}
|
||
}
|
||
|
||
function getSetLocaleDayOfWeek(input) {
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
|
||
return input == null ? weekday : this.add(input - weekday, 'd');
|
||
}
|
||
|
||
function getSetISODayOfWeek(input) {
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
|
||
// behaves the same as moment#day except
|
||
// as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
|
||
// as a setter, sunday should belong to the previous week.
|
||
|
||
if (input != null) {
|
||
var weekday = parseIsoWeekday(input, this.localeData());
|
||
return this.day(this.day() % 7 ? weekday : weekday - 7);
|
||
} else {
|
||
return this.day() || 7;
|
||
}
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
function hFormat() {
|
||
return this.hours() % 12 || 12;
|
||
}
|
||
|
||
function kFormat() {
|
||
return this.hours() || 24;
|
||
}
|
||
|
||
addFormatToken('H', ['HH', 2], 0, 'hour');
|
||
addFormatToken('h', ['hh', 2], 0, hFormat);
|
||
addFormatToken('k', ['kk', 2], 0, kFormat);
|
||
|
||
addFormatToken('hmm', 0, 0, function () {
|
||
return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
|
||
});
|
||
|
||
addFormatToken('hmmss', 0, 0, function () {
|
||
return (
|
||
'' +
|
||
hFormat.apply(this) +
|
||
zeroFill(this.minutes(), 2) +
|
||
zeroFill(this.seconds(), 2)
|
||
);
|
||
});
|
||
|
||
addFormatToken('Hmm', 0, 0, function () {
|
||
return '' + this.hours() + zeroFill(this.minutes(), 2);
|
||
});
|
||
|
||
addFormatToken('Hmmss', 0, 0, function () {
|
||
return (
|
||
'' +
|
||
this.hours() +
|
||
zeroFill(this.minutes(), 2) +
|
||
zeroFill(this.seconds(), 2)
|
||
);
|
||
});
|
||
|
||
function meridiem(token, lowercase) {
|
||
addFormatToken(token, 0, 0, function () {
|
||
return this.localeData().meridiem(
|
||
this.hours(),
|
||
this.minutes(),
|
||
lowercase
|
||
);
|
||
});
|
||
}
|
||
|
||
meridiem('a', true);
|
||
meridiem('A', false);
|
||
|
||
// PARSING
|
||
|
||
function matchMeridiem(isStrict, locale) {
|
||
return locale._meridiemParse;
|
||
}
|
||
|
||
addRegexToken('a', matchMeridiem);
|
||
addRegexToken('A', matchMeridiem);
|
||
addRegexToken('H', match1to2, match1to2HasZero);
|
||
addRegexToken('h', match1to2, match1to2NoLeadingZero);
|
||
addRegexToken('k', match1to2, match1to2NoLeadingZero);
|
||
addRegexToken('HH', match1to2, match2);
|
||
addRegexToken('hh', match1to2, match2);
|
||
addRegexToken('kk', match1to2, match2);
|
||
|
||
addRegexToken('hmm', match3to4);
|
||
addRegexToken('hmmss', match5to6);
|
||
addRegexToken('Hmm', match3to4);
|
||
addRegexToken('Hmmss', match5to6);
|
||
|
||
addParseToken(['H', 'HH'], HOUR);
|
||
addParseToken(['k', 'kk'], function (input, array, config) {
|
||
var kInput = toInt(input);
|
||
array[HOUR] = kInput === 24 ? 0 : kInput;
|
||
});
|
||
addParseToken(['a', 'A'], function (input, array, config) {
|
||
config._isPm = config._locale.isPM(input);
|
||
config._meridiem = input;
|
||
});
|
||
addParseToken(['h', 'hh'], function (input, array, config) {
|
||
array[HOUR] = toInt(input);
|
||
getParsingFlags(config).bigHour = true;
|
||
});
|
||
addParseToken('hmm', function (input, array, config) {
|
||
var pos = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos));
|
||
array[MINUTE] = toInt(input.substr(pos));
|
||
getParsingFlags(config).bigHour = true;
|
||
});
|
||
addParseToken('hmmss', function (input, array, config) {
|
||
var pos1 = input.length - 4,
|
||
pos2 = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos1));
|
||
array[MINUTE] = toInt(input.substr(pos1, 2));
|
||
array[SECOND] = toInt(input.substr(pos2));
|
||
getParsingFlags(config).bigHour = true;
|
||
});
|
||
addParseToken('Hmm', function (input, array, config) {
|
||
var pos = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos));
|
||
array[MINUTE] = toInt(input.substr(pos));
|
||
});
|
||
addParseToken('Hmmss', function (input, array, config) {
|
||
var pos1 = input.length - 4,
|
||
pos2 = input.length - 2;
|
||
array[HOUR] = toInt(input.substr(0, pos1));
|
||
array[MINUTE] = toInt(input.substr(pos1, 2));
|
||
array[SECOND] = toInt(input.substr(pos2));
|
||
});
|
||
|
||
var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
|
||
// Setting the hour should keep the time, because the user explicitly
|
||
// specified which hour they want. So trying to maintain the same hour (in
|
||
// a new timezone) makes sense. Adding/subtracting hours does not follow
|
||
// this rule.
|
||
getSetHour = makeGetSet('Hours', true);
|
||
|
||
var baseConfig = {
|
||
calendar: defaultCalendar,
|
||
longDateFormat: defaultLongDateFormat,
|
||
invalidDate: defaultInvalidDate,
|
||
ordinal: defaultOrdinal,
|
||
dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
|
||
relativeTime: defaultRelativeTime,
|
||
|
||
months: defaultLocaleMonths,
|
||
monthsShort: defaultLocaleMonthsShort,
|
||
|
||
week: defaultLocaleWeek,
|
||
|
||
weekdays: defaultLocaleWeekdays,
|
||
weekdaysMin: defaultLocaleWeekdaysMin,
|
||
weekdaysShort: defaultLocaleWeekdaysShort,
|
||
|
||
meridiemParse: defaultLocaleMeridiemParse,
|
||
};
|
||
|
||
// internal storage for locale config files
|
||
var locales = {},
|
||
localeFamilies = {},
|
||
globalLocale;
|
||
|
||
function commonPrefix(arr1, arr2) {
|
||
var i,
|
||
minl = Math.min(arr1.length, arr2.length);
|
||
for (i = 0; i < minl; i += 1) {
|
||
if (arr1[i] !== arr2[i]) {
|
||
return i;
|
||
}
|
||
}
|
||
return minl;
|
||
}
|
||
|
||
function normalizeLocale(key) {
|
||
return key ? key.toLowerCase().replace('_', '-') : key;
|
||
}
|
||
|
||
// pick the locale from the array
|
||
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
||
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
||
function chooseLocale(names) {
|
||
var i = 0,
|
||
j,
|
||
next,
|
||
locale,
|
||
split;
|
||
|
||
while (i < names.length) {
|
||
split = normalizeLocale(names[i]).split('-');
|
||
j = split.length;
|
||
next = normalizeLocale(names[i + 1]);
|
||
next = next ? next.split('-') : null;
|
||
while (j > 0) {
|
||
locale = loadLocale(split.slice(0, j).join('-'));
|
||
if (locale) {
|
||
return locale;
|
||
}
|
||
if (
|
||
next &&
|
||
next.length >= j &&
|
||
commonPrefix(split, next) >= j - 1
|
||
) {
|
||
//the next array item is better than a shallower substring of this one
|
||
break;
|
||
}
|
||
j--;
|
||
}
|
||
i++;
|
||
}
|
||
return globalLocale;
|
||
}
|
||
|
||
function isLocaleNameSane(name) {
|
||
// Prevent names that look like filesystem paths, i.e contain '/' or '\'
|
||
// Ensure name is available and function returns boolean
|
||
return !!(name && name.match('^[^/\\\\]*$'));
|
||
}
|
||
|
||
function loadLocale(name) {
|
||
var oldLocale = null,
|
||
aliasedRequire;
|
||
// TODO: Find a better way to register and load all the locales in Node
|
||
if (
|
||
locales[name] === undefined &&
|
||
typeof module !== 'undefined' &&
|
||
module &&
|
||
module.exports &&
|
||
isLocaleNameSane(name)
|
||
) {
|
||
try {
|
||
oldLocale = globalLocale._abbr;
|
||
aliasedRequire = require;
|
||
aliasedRequire('./locale/' + name);
|
||
getSetGlobalLocale(oldLocale);
|
||
} catch (e) {
|
||
// mark as not found to avoid repeating expensive file require call causing high CPU
|
||
// when trying to find en-US, en_US, en-us for every format call
|
||
locales[name] = null; // null means not found
|
||
}
|
||
}
|
||
return locales[name];
|
||
}
|
||
|
||
// This function will load locale and then set the global locale. If
|
||
// no arguments are passed in, it will simply return the current global
|
||
// locale key.
|
||
function getSetGlobalLocale(key, values) {
|
||
var data;
|
||
if (key) {
|
||
if (isUndefined(values)) {
|
||
data = getLocale(key);
|
||
} else {
|
||
data = defineLocale(key, values);
|
||
}
|
||
|
||
if (data) {
|
||
// moment.duration._locale = moment._locale = data;
|
||
globalLocale = data;
|
||
} else {
|
||
if (typeof console !== 'undefined' && console.warn) {
|
||
//warn user if arguments are passed but the locale could not be set
|
||
console.warn(
|
||
'Locale ' + key + ' not found. Did you forget to load it?'
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
return globalLocale._abbr;
|
||
}
|
||
|
||
function defineLocale(name, config) {
|
||
if (config !== null) {
|
||
var locale,
|
||
parentConfig = baseConfig;
|
||
config.abbr = name;
|
||
if (locales[name] != null) {
|
||
deprecateSimple(
|
||
'defineLocaleOverride',
|
||
'use moment.updateLocale(localeName, config) to change ' +
|
||
'an existing locale. moment.defineLocale(localeName, ' +
|
||
'config) should only be used for creating a new locale ' +
|
||
'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
|
||
);
|
||
parentConfig = locales[name]._config;
|
||
} else if (config.parentLocale != null) {
|
||
if (locales[config.parentLocale] != null) {
|
||
parentConfig = locales[config.parentLocale]._config;
|
||
} else {
|
||
locale = loadLocale(config.parentLocale);
|
||
if (locale != null) {
|
||
parentConfig = locale._config;
|
||
} else {
|
||
if (!localeFamilies[config.parentLocale]) {
|
||
localeFamilies[config.parentLocale] = [];
|
||
}
|
||
localeFamilies[config.parentLocale].push({
|
||
name: name,
|
||
config: config,
|
||
});
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
locales[name] = new Locale(mergeConfigs(parentConfig, config));
|
||
|
||
if (localeFamilies[name]) {
|
||
localeFamilies[name].forEach(function (x) {
|
||
defineLocale(x.name, x.config);
|
||
});
|
||
}
|
||
|
||
// backwards compat for now: also set the locale
|
||
// make sure we set the locale AFTER all child locales have been
|
||
// created, so we won't end up with the child locale set.
|
||
getSetGlobalLocale(name);
|
||
|
||
return locales[name];
|
||
} else {
|
||
// useful for testing
|
||
delete locales[name];
|
||
return null;
|
||
}
|
||
}
|
||
|
||
function updateLocale(name, config) {
|
||
if (config != null) {
|
||
var locale,
|
||
tmpLocale,
|
||
parentConfig = baseConfig;
|
||
|
||
if (locales[name] != null && locales[name].parentLocale != null) {
|
||
// Update existing child locale in-place to avoid memory-leaks
|
||
locales[name].set(mergeConfigs(locales[name]._config, config));
|
||
} else {
|
||
// MERGE
|
||
tmpLocale = loadLocale(name);
|
||
if (tmpLocale != null) {
|
||
parentConfig = tmpLocale._config;
|
||
}
|
||
config = mergeConfigs(parentConfig, config);
|
||
if (tmpLocale == null) {
|
||
// updateLocale is called for creating a new locale
|
||
// Set abbr so it will have a name (getters return
|
||
// undefined otherwise).
|
||
config.abbr = name;
|
||
}
|
||
locale = new Locale(config);
|
||
locale.parentLocale = locales[name];
|
||
locales[name] = locale;
|
||
}
|
||
|
||
// backwards compat for now: also set the locale
|
||
getSetGlobalLocale(name);
|
||
} else {
|
||
// pass null for config to unupdate, useful for tests
|
||
if (locales[name] != null) {
|
||
if (locales[name].parentLocale != null) {
|
||
locales[name] = locales[name].parentLocale;
|
||
if (name === getSetGlobalLocale()) {
|
||
getSetGlobalLocale(name);
|
||
}
|
||
} else if (locales[name] != null) {
|
||
delete locales[name];
|
||
}
|
||
}
|
||
}
|
||
return locales[name];
|
||
}
|
||
|
||
// returns locale data
|
||
function getLocale(key) {
|
||
var locale;
|
||
|
||
if (key && key._locale && key._locale._abbr) {
|
||
key = key._locale._abbr;
|
||
}
|
||
|
||
if (!key) {
|
||
return globalLocale;
|
||
}
|
||
|
||
if (!isArray(key)) {
|
||
//short-circuit everything else
|
||
locale = loadLocale(key);
|
||
if (locale) {
|
||
return locale;
|
||
}
|
||
key = [key];
|
||
}
|
||
|
||
return chooseLocale(key);
|
||
}
|
||
|
||
function listLocales() {
|
||
return keys(locales);
|
||
}
|
||
|
||
function checkOverflow(m) {
|
||
var overflow,
|
||
a = m._a;
|
||
|
||
if (a && getParsingFlags(m).overflow === -2) {
|
||
overflow =
|
||
a[MONTH] < 0 || a[MONTH] > 11
|
||
? MONTH
|
||
: a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
|
||
? DATE
|
||
: a[HOUR] < 0 ||
|
||
a[HOUR] > 24 ||
|
||
(a[HOUR] === 24 &&
|
||
(a[MINUTE] !== 0 ||
|
||
a[SECOND] !== 0 ||
|
||
a[MILLISECOND] !== 0))
|
||
? HOUR
|
||
: a[MINUTE] < 0 || a[MINUTE] > 59
|
||
? MINUTE
|
||
: a[SECOND] < 0 || a[SECOND] > 59
|
||
? SECOND
|
||
: a[MILLISECOND] < 0 || a[MILLISECOND] > 999
|
||
? MILLISECOND
|
||
: -1;
|
||
|
||
if (
|
||
getParsingFlags(m)._overflowDayOfYear &&
|
||
(overflow < YEAR || overflow > DATE)
|
||
) {
|
||
overflow = DATE;
|
||
}
|
||
if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
|
||
overflow = WEEK;
|
||
}
|
||
if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
|
||
overflow = WEEKDAY;
|
||
}
|
||
|
||
getParsingFlags(m).overflow = overflow;
|
||
}
|
||
|
||
return m;
|
||
}
|
||
|
||
// iso 8601 regex
|
||
// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
|
||
var extendedIsoRegex =
|
||
/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
|
||
basicIsoRegex =
|
||
/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
|
||
tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
|
||
isoDates = [
|
||
['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
|
||
['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
|
||
['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
|
||
['GGGG-[W]WW', /\d{4}-W\d\d/, false],
|
||
['YYYY-DDD', /\d{4}-\d{3}/],
|
||
['YYYY-MM', /\d{4}-\d\d/, false],
|
||
['YYYYYYMMDD', /[+-]\d{10}/],
|
||
['YYYYMMDD', /\d{8}/],
|
||
['GGGG[W]WWE', /\d{4}W\d{3}/],
|
||
['GGGG[W]WW', /\d{4}W\d{2}/, false],
|
||
['YYYYDDD', /\d{7}/],
|
||
['YYYYMM', /\d{6}/, false],
|
||
['YYYY', /\d{4}/, false],
|
||
],
|
||
// iso time formats and regexes
|
||
isoTimes = [
|
||
['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
|
||
['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
|
||
['HH:mm:ss', /\d\d:\d\d:\d\d/],
|
||
['HH:mm', /\d\d:\d\d/],
|
||
['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
|
||
['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
|
||
['HHmmss', /\d\d\d\d\d\d/],
|
||
['HHmm', /\d\d\d\d/],
|
||
['HH', /\d\d/],
|
||
],
|
||
aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
|
||
// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
|
||
rfc2822 =
|
||
/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
|
||
obsOffsets = {
|
||
UT: 0,
|
||
GMT: 0,
|
||
EDT: -4 * 60,
|
||
EST: -5 * 60,
|
||
CDT: -5 * 60,
|
||
CST: -6 * 60,
|
||
MDT: -6 * 60,
|
||
MST: -7 * 60,
|
||
PDT: -7 * 60,
|
||
PST: -8 * 60,
|
||
};
|
||
|
||
// date from iso format
|
||
function configFromISO(config) {
|
||
var i,
|
||
l,
|
||
string = config._i,
|
||
match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
|
||
allowTime,
|
||
dateFormat,
|
||
timeFormat,
|
||
tzFormat,
|
||
isoDatesLen = isoDates.length,
|
||
isoTimesLen = isoTimes.length;
|
||
|
||
if (match) {
|
||
getParsingFlags(config).iso = true;
|
||
for (i = 0, l = isoDatesLen; i < l; i++) {
|
||
if (isoDates[i][1].exec(match[1])) {
|
||
dateFormat = isoDates[i][0];
|
||
allowTime = isoDates[i][2] !== false;
|
||
break;
|
||
}
|
||
}
|
||
if (dateFormat == null) {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
if (match[3]) {
|
||
for (i = 0, l = isoTimesLen; i < l; i++) {
|
||
if (isoTimes[i][1].exec(match[3])) {
|
||
// match[2] should be 'T' or space
|
||
timeFormat = (match[2] || ' ') + isoTimes[i][0];
|
||
break;
|
||
}
|
||
}
|
||
if (timeFormat == null) {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
}
|
||
if (!allowTime && timeFormat != null) {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
if (match[4]) {
|
||
if (tzRegex.exec(match[4])) {
|
||
tzFormat = 'Z';
|
||
} else {
|
||
config._isValid = false;
|
||
return;
|
||
}
|
||
}
|
||
config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
|
||
configFromStringAndFormat(config);
|
||
} else {
|
||
config._isValid = false;
|
||
}
|
||
}
|
||
|
||
function extractFromRFC2822Strings(
|
||
yearStr,
|
||
monthStr,
|
||
dayStr,
|
||
hourStr,
|
||
minuteStr,
|
||
secondStr
|
||
) {
|
||
var result = [
|
||
untruncateYear(yearStr),
|
||
defaultLocaleMonthsShort.indexOf(monthStr),
|
||
parseInt(dayStr, 10),
|
||
parseInt(hourStr, 10),
|
||
parseInt(minuteStr, 10),
|
||
];
|
||
|
||
if (secondStr) {
|
||
result.push(parseInt(secondStr, 10));
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
function untruncateYear(yearStr) {
|
||
var year = parseInt(yearStr, 10);
|
||
if (year <= 49) {
|
||
return 2000 + year;
|
||
} else if (year <= 999) {
|
||
return 1900 + year;
|
||
}
|
||
return year;
|
||
}
|
||
|
||
function preprocessRFC2822(s) {
|
||
// Remove comments and folding whitespace and replace multiple-spaces with a single space
|
||
return s
|
||
.replace(/\([^()]*\)|[\n\t]/g, ' ')
|
||
.replace(/(\s\s+)/g, ' ')
|
||
.replace(/^\s\s*/, '')
|
||
.replace(/\s\s*$/, '');
|
||
}
|
||
|
||
function checkWeekday(weekdayStr, parsedInput, config) {
|
||
if (weekdayStr) {
|
||
// TODO: Replace the vanilla JS Date object with an independent day-of-week check.
|
||
var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
|
||
weekdayActual = new Date(
|
||
parsedInput[0],
|
||
parsedInput[1],
|
||
parsedInput[2]
|
||
).getDay();
|
||
if (weekdayProvided !== weekdayActual) {
|
||
getParsingFlags(config).weekdayMismatch = true;
|
||
config._isValid = false;
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function calculateOffset(obsOffset, militaryOffset, numOffset) {
|
||
if (obsOffset) {
|
||
return obsOffsets[obsOffset];
|
||
} else if (militaryOffset) {
|
||
// the only allowed military tz is Z
|
||
return 0;
|
||
} else {
|
||
var hm = parseInt(numOffset, 10),
|
||
m = hm % 100,
|
||
h = (hm - m) / 100;
|
||
return h * 60 + m;
|
||
}
|
||
}
|
||
|
||
// date and time from ref 2822 format
|
||
function configFromRFC2822(config) {
|
||
var match = rfc2822.exec(preprocessRFC2822(config._i)),
|
||
parsedArray;
|
||
if (match) {
|
||
parsedArray = extractFromRFC2822Strings(
|
||
match[4],
|
||
match[3],
|
||
match[2],
|
||
match[5],
|
||
match[6],
|
||
match[7]
|
||
);
|
||
if (!checkWeekday(match[1], parsedArray, config)) {
|
||
return;
|
||
}
|
||
|
||
config._a = parsedArray;
|
||
config._tzm = calculateOffset(match[8], match[9], match[10]);
|
||
|
||
config._d = createUTCDate.apply(null, config._a);
|
||
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
||
|
||
getParsingFlags(config).rfc2822 = true;
|
||
} else {
|
||
config._isValid = false;
|
||
}
|
||
}
|
||
|
||
// date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
|
||
function configFromString(config) {
|
||
var matched = aspNetJsonRegex.exec(config._i);
|
||
if (matched !== null) {
|
||
config._d = new Date(+matched[1]);
|
||
return;
|
||
}
|
||
|
||
configFromISO(config);
|
||
if (config._isValid === false) {
|
||
delete config._isValid;
|
||
} else {
|
||
return;
|
||
}
|
||
|
||
configFromRFC2822(config);
|
||
if (config._isValid === false) {
|
||
delete config._isValid;
|
||
} else {
|
||
return;
|
||
}
|
||
|
||
if (config._strict) {
|
||
config._isValid = false;
|
||
} else {
|
||
// Final attempt, use Input Fallback
|
||
hooks.createFromInputFallback(config);
|
||
}
|
||
}
|
||
|
||
hooks.createFromInputFallback = deprecate(
|
||
'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
|
||
'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
|
||
'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
|
||
function (config) {
|
||
config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
|
||
}
|
||
);
|
||
|
||
// Pick the first defined of two or three arguments.
|
||
function defaults(a, b, c) {
|
||
if (a != null) {
|
||
return a;
|
||
}
|
||
if (b != null) {
|
||
return b;
|
||
}
|
||
return c;
|
||
}
|
||
|
||
function currentDateArray(config) {
|
||
// hooks is actually the exported moment object
|
||
var nowValue = new Date(hooks.now());
|
||
if (config._useUTC) {
|
||
return [
|
||
nowValue.getUTCFullYear(),
|
||
nowValue.getUTCMonth(),
|
||
nowValue.getUTCDate(),
|
||
];
|
||
}
|
||
return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
|
||
}
|
||
|
||
// convert an array to a date.
|
||
// the array should mirror the parameters below
|
||
// note: all values past the year are optional and will default to the lowest possible value.
|
||
// [year, month, day , hour, minute, second, millisecond]
|
||
function configFromArray(config) {
|
||
var i,
|
||
date,
|
||
input = [],
|
||
currentDate,
|
||
expectedWeekday,
|
||
yearToUse;
|
||
|
||
if (config._d) {
|
||
return;
|
||
}
|
||
|
||
currentDate = currentDateArray(config);
|
||
|
||
//compute day of the year from weeks and weekdays
|
||
if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
|
||
dayOfYearFromWeekInfo(config);
|
||
}
|
||
|
||
//if the day of the year is set, figure out what it is
|
||
if (config._dayOfYear != null) {
|
||
yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
|
||
|
||
if (
|
||
config._dayOfYear > daysInYear(yearToUse) ||
|
||
config._dayOfYear === 0
|
||
) {
|
||
getParsingFlags(config)._overflowDayOfYear = true;
|
||
}
|
||
|
||
date = createUTCDate(yearToUse, 0, config._dayOfYear);
|
||
config._a[MONTH] = date.getUTCMonth();
|
||
config._a[DATE] = date.getUTCDate();
|
||
}
|
||
|
||
// Default to current date.
|
||
// * if no year, month, day of month are given, default to today
|
||
// * if day of month is given, default month and year
|
||
// * if month is given, default only year
|
||
// * if year is given, don't default anything
|
||
for (i = 0; i < 3 && config._a[i] == null; ++i) {
|
||
config._a[i] = input[i] = currentDate[i];
|
||
}
|
||
|
||
// Zero out whatever was not defaulted, including time
|
||
for (; i < 7; i++) {
|
||
config._a[i] = input[i] =
|
||
config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
|
||
}
|
||
|
||
// Check for 24:00:00.000
|
||
if (
|
||
config._a[HOUR] === 24 &&
|
||
config._a[MINUTE] === 0 &&
|
||
config._a[SECOND] === 0 &&
|
||
config._a[MILLISECOND] === 0
|
||
) {
|
||
config._nextDay = true;
|
||
config._a[HOUR] = 0;
|
||
}
|
||
|
||
config._d = (config._useUTC ? createUTCDate : createDate).apply(
|
||
null,
|
||
input
|
||
);
|
||
expectedWeekday = config._useUTC
|
||
? config._d.getUTCDay()
|
||
: config._d.getDay();
|
||
|
||
// Apply timezone offset from input. The actual utcOffset can be changed
|
||
// with parseZone.
|
||
if (config._tzm != null) {
|
||
config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
||
}
|
||
|
||
if (config._nextDay) {
|
||
config._a[HOUR] = 24;
|
||
}
|
||
|
||
// check for mismatching day of week
|
||
if (
|
||
config._w &&
|
||
typeof config._w.d !== 'undefined' &&
|
||
config._w.d !== expectedWeekday
|
||
) {
|
||
getParsingFlags(config).weekdayMismatch = true;
|
||
}
|
||
}
|
||
|
||
function dayOfYearFromWeekInfo(config) {
|
||
var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;
|
||
|
||
w = config._w;
|
||
if (w.GG != null || w.W != null || w.E != null) {
|
||
dow = 1;
|
||
doy = 4;
|
||
|
||
// TODO: We need to take the current isoWeekYear, but that depends on
|
||
// how we interpret now (local, utc, fixed offset). So create
|
||
// a now version of current config (take local/utc/offset flags, and
|
||
// create now).
|
||
weekYear = defaults(
|
||
w.GG,
|
||
config._a[YEAR],
|
||
weekOfYear(createLocal(), 1, 4).year
|
||
);
|
||
week = defaults(w.W, 1);
|
||
weekday = defaults(w.E, 1);
|
||
if (weekday < 1 || weekday > 7) {
|
||
weekdayOverflow = true;
|
||
}
|
||
} else {
|
||
dow = config._locale._week.dow;
|
||
doy = config._locale._week.doy;
|
||
|
||
curWeek = weekOfYear(createLocal(), dow, doy);
|
||
|
||
weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
|
||
|
||
// Default to current week.
|
||
week = defaults(w.w, curWeek.week);
|
||
|
||
if (w.d != null) {
|
||
// weekday -- low day numbers are considered next week
|
||
weekday = w.d;
|
||
if (weekday < 0 || weekday > 6) {
|
||
weekdayOverflow = true;
|
||
}
|
||
} else if (w.e != null) {
|
||
// local weekday -- counting starts from beginning of week
|
||
weekday = w.e + dow;
|
||
if (w.e < 0 || w.e > 6) {
|
||
weekdayOverflow = true;
|
||
}
|
||
} else {
|
||
// default to beginning of week
|
||
weekday = dow;
|
||
}
|
||
}
|
||
if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
|
||
getParsingFlags(config)._overflowWeeks = true;
|
||
} else if (weekdayOverflow != null) {
|
||
getParsingFlags(config)._overflowWeekday = true;
|
||
} else {
|
||
temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
|
||
config._a[YEAR] = temp.year;
|
||
config._dayOfYear = temp.dayOfYear;
|
||
}
|
||
}
|
||
|
||
// constant that refers to the ISO standard
|
||
hooks.ISO_8601 = function () {};
|
||
|
||
// constant that refers to the RFC 2822 form
|
||
hooks.RFC_2822 = function () {};
|
||
|
||
// date from string and format string
|
||
function configFromStringAndFormat(config) {
|
||
// TODO: Move this to another part of the creation flow to prevent circular deps
|
||
if (config._f === hooks.ISO_8601) {
|
||
configFromISO(config);
|
||
return;
|
||
}
|
||
if (config._f === hooks.RFC_2822) {
|
||
configFromRFC2822(config);
|
||
return;
|
||
}
|
||
config._a = [];
|
||
getParsingFlags(config).empty = true;
|
||
|
||
// This array is used to make a Date, either with `new Date` or `Date.UTC`
|
||
var string = '' + config._i,
|
||
i,
|
||
parsedInput,
|
||
tokens,
|
||
token,
|
||
skipped,
|
||
stringLength = string.length,
|
||
totalParsedInputLength = 0,
|
||
era,
|
||
tokenLen;
|
||
|
||
tokens =
|
||
expandFormat(config._f, config._locale).match(formattingTokens) || [];
|
||
tokenLen = tokens.length;
|
||
for (i = 0; i < tokenLen; i++) {
|
||
token = tokens[i];
|
||
parsedInput = (string.match(getParseRegexForToken(token, config)) ||
|
||
[])[0];
|
||
if (parsedInput) {
|
||
skipped = string.substr(0, string.indexOf(parsedInput));
|
||
if (skipped.length > 0) {
|
||
getParsingFlags(config).unusedInput.push(skipped);
|
||
}
|
||
string = string.slice(
|
||
string.indexOf(parsedInput) + parsedInput.length
|
||
);
|
||
totalParsedInputLength += parsedInput.length;
|
||
}
|
||
// don't parse if it's not a known token
|
||
if (formatTokenFunctions[token]) {
|
||
if (parsedInput) {
|
||
getParsingFlags(config).empty = false;
|
||
} else {
|
||
getParsingFlags(config).unusedTokens.push(token);
|
||
}
|
||
addTimeToArrayFromToken(token, parsedInput, config);
|
||
} else if (config._strict && !parsedInput) {
|
||
getParsingFlags(config).unusedTokens.push(token);
|
||
}
|
||
}
|
||
|
||
// add remaining unparsed input length to the string
|
||
getParsingFlags(config).charsLeftOver =
|
||
stringLength - totalParsedInputLength;
|
||
if (string.length > 0) {
|
||
getParsingFlags(config).unusedInput.push(string);
|
||
}
|
||
|
||
// clear _12h flag if hour is <= 12
|
||
if (
|
||
config._a[HOUR] <= 12 &&
|
||
getParsingFlags(config).bigHour === true &&
|
||
config._a[HOUR] > 0
|
||
) {
|
||
getParsingFlags(config).bigHour = undefined;
|
||
}
|
||
|
||
getParsingFlags(config).parsedDateParts = config._a.slice(0);
|
||
getParsingFlags(config).meridiem = config._meridiem;
|
||
// handle meridiem
|
||
config._a[HOUR] = meridiemFixWrap(
|
||
config._locale,
|
||
config._a[HOUR],
|
||
config._meridiem
|
||
);
|
||
|
||
// handle era
|
||
era = getParsingFlags(config).era;
|
||
if (era !== null) {
|
||
config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
|
||
}
|
||
|
||
configFromArray(config);
|
||
checkOverflow(config);
|
||
}
|
||
|
||
function meridiemFixWrap(locale, hour, meridiem) {
|
||
var isPm;
|
||
|
||
if (meridiem == null) {
|
||
// nothing to do
|
||
return hour;
|
||
}
|
||
if (locale.meridiemHour != null) {
|
||
return locale.meridiemHour(hour, meridiem);
|
||
} else if (locale.isPM != null) {
|
||
// Fallback
|
||
isPm = locale.isPM(meridiem);
|
||
if (isPm && hour < 12) {
|
||
hour += 12;
|
||
}
|
||
if (!isPm && hour === 12) {
|
||
hour = 0;
|
||
}
|
||
return hour;
|
||
} else {
|
||
// this is not supposed to happen
|
||
return hour;
|
||
}
|
||
}
|
||
|
||
// date from string and array of format strings
|
||
function configFromStringAndArray(config) {
|
||
var tempConfig,
|
||
bestMoment,
|
||
scoreToBeat,
|
||
i,
|
||
currentScore,
|
||
validFormatFound,
|
||
bestFormatIsValid = false,
|
||
configfLen = config._f.length;
|
||
|
||
if (configfLen === 0) {
|
||
getParsingFlags(config).invalidFormat = true;
|
||
config._d = new Date(NaN);
|
||
return;
|
||
}
|
||
|
||
for (i = 0; i < configfLen; i++) {
|
||
currentScore = 0;
|
||
validFormatFound = false;
|
||
tempConfig = copyConfig({}, config);
|
||
if (config._useUTC != null) {
|
||
tempConfig._useUTC = config._useUTC;
|
||
}
|
||
tempConfig._f = config._f[i];
|
||
configFromStringAndFormat(tempConfig);
|
||
|
||
if (isValid$1(tempConfig)) {
|
||
validFormatFound = true;
|
||
}
|
||
|
||
// if there is any input that was not parsed add a penalty for that format
|
||
currentScore += getParsingFlags(tempConfig).charsLeftOver;
|
||
|
||
//or tokens
|
||
currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
|
||
|
||
getParsingFlags(tempConfig).score = currentScore;
|
||
|
||
if (!bestFormatIsValid) {
|
||
if (
|
||
scoreToBeat == null ||
|
||
currentScore < scoreToBeat ||
|
||
validFormatFound
|
||
) {
|
||
scoreToBeat = currentScore;
|
||
bestMoment = tempConfig;
|
||
if (validFormatFound) {
|
||
bestFormatIsValid = true;
|
||
}
|
||
}
|
||
} else {
|
||
if (currentScore < scoreToBeat) {
|
||
scoreToBeat = currentScore;
|
||
bestMoment = tempConfig;
|
||
}
|
||
}
|
||
}
|
||
|
||
extend(config, bestMoment || tempConfig);
|
||
}
|
||
|
||
function configFromObject(config) {
|
||
if (config._d) {
|
||
return;
|
||
}
|
||
|
||
var i = normalizeObjectUnits(config._i),
|
||
dayOrDate = i.day === undefined ? i.date : i.day;
|
||
config._a = map(
|
||
[i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
|
||
function (obj) {
|
||
return obj && parseInt(obj, 10);
|
||
}
|
||
);
|
||
|
||
configFromArray(config);
|
||
}
|
||
|
||
function createFromConfig(config) {
|
||
var res = new Moment(checkOverflow(prepareConfig(config)));
|
||
if (res._nextDay) {
|
||
// Adding is smart enough around DST
|
||
res.add(1, 'd');
|
||
res._nextDay = undefined;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
function prepareConfig(config) {
|
||
var input = config._i,
|
||
format = config._f;
|
||
|
||
config._locale = config._locale || getLocale(config._l);
|
||
|
||
if (input === null || (format === undefined && input === '')) {
|
||
return createInvalid$1({ nullInput: true });
|
||
}
|
||
|
||
if (typeof input === 'string') {
|
||
config._i = input = config._locale.preparse(input);
|
||
}
|
||
|
||
if (isMoment(input)) {
|
||
return new Moment(checkOverflow(input));
|
||
} else if (isDate(input)) {
|
||
config._d = input;
|
||
} else if (isArray(format)) {
|
||
configFromStringAndArray(config);
|
||
} else if (format) {
|
||
configFromStringAndFormat(config);
|
||
} else {
|
||
configFromInput(config);
|
||
}
|
||
|
||
if (!isValid$1(config)) {
|
||
config._d = null;
|
||
}
|
||
|
||
return config;
|
||
}
|
||
|
||
function configFromInput(config) {
|
||
var input = config._i;
|
||
if (isUndefined(input)) {
|
||
config._d = new Date(hooks.now());
|
||
} else if (isDate(input)) {
|
||
config._d = new Date(input.valueOf());
|
||
} else if (typeof input === 'string') {
|
||
configFromString(config);
|
||
} else if (isArray(input)) {
|
||
config._a = map(input.slice(0), function (obj) {
|
||
return parseInt(obj, 10);
|
||
});
|
||
configFromArray(config);
|
||
} else if (isObject(input)) {
|
||
configFromObject(config);
|
||
} else if (isNumber(input)) {
|
||
// from milliseconds
|
||
config._d = new Date(input);
|
||
} else {
|
||
hooks.createFromInputFallback(config);
|
||
}
|
||
}
|
||
|
||
function createLocalOrUTC(input, format, locale, strict, isUTC) {
|
||
var c = {};
|
||
|
||
if (format === true || format === false) {
|
||
strict = format;
|
||
format = undefined;
|
||
}
|
||
|
||
if (locale === true || locale === false) {
|
||
strict = locale;
|
||
locale = undefined;
|
||
}
|
||
|
||
if (
|
||
(isObject(input) && isObjectEmpty(input)) ||
|
||
(isArray(input) && input.length === 0)
|
||
) {
|
||
input = undefined;
|
||
}
|
||
// object construction must be done this way.
|
||
// https://github.com/moment/moment/issues/1423
|
||
c._isAMomentObject = true;
|
||
c._useUTC = c._isUTC = isUTC;
|
||
c._l = locale;
|
||
c._i = input;
|
||
c._f = format;
|
||
c._strict = strict;
|
||
|
||
return createFromConfig(c);
|
||
}
|
||
|
||
function createLocal(input, format, locale, strict) {
|
||
return createLocalOrUTC(input, format, locale, strict, false);
|
||
}
|
||
|
||
var prototypeMin = deprecate(
|
||
'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
|
||
function () {
|
||
var other = createLocal.apply(null, arguments);
|
||
if (this.isValid() && other.isValid()) {
|
||
return other < this ? this : other;
|
||
} else {
|
||
return createInvalid$1();
|
||
}
|
||
}
|
||
),
|
||
prototypeMax = deprecate(
|
||
'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
|
||
function () {
|
||
var other = createLocal.apply(null, arguments);
|
||
if (this.isValid() && other.isValid()) {
|
||
return other > this ? this : other;
|
||
} else {
|
||
return createInvalid$1();
|
||
}
|
||
}
|
||
);
|
||
|
||
// Pick a moment m from moments so that m[fn](other) is true for all
|
||
// other. This relies on the function fn to be transitive.
|
||
//
|
||
// moments should either be an array of moment objects or an array, whose
|
||
// first element is an array of moment objects.
|
||
function pickBy(fn, moments) {
|
||
var res, i;
|
||
if (moments.length === 1 && isArray(moments[0])) {
|
||
moments = moments[0];
|
||
}
|
||
if (!moments.length) {
|
||
return createLocal();
|
||
}
|
||
res = moments[0];
|
||
for (i = 1; i < moments.length; ++i) {
|
||
if (!moments[i].isValid() || moments[i][fn](res)) {
|
||
res = moments[i];
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
|
||
// TODO: Use [].sort instead?
|
||
function min() {
|
||
var args = [].slice.call(arguments, 0);
|
||
|
||
return pickBy('isBefore', args);
|
||
}
|
||
|
||
function max() {
|
||
var args = [].slice.call(arguments, 0);
|
||
|
||
return pickBy('isAfter', args);
|
||
}
|
||
|
||
var now = function () {
|
||
return Date.now ? Date.now() : +new Date();
|
||
};
|
||
|
||
var ordering = [
|
||
'year',
|
||
'quarter',
|
||
'month',
|
||
'week',
|
||
'day',
|
||
'hour',
|
||
'minute',
|
||
'second',
|
||
'millisecond',
|
||
];
|
||
|
||
function isDurationValid(m) {
|
||
var key,
|
||
unitHasDecimal = false,
|
||
i,
|
||
orderLen = ordering.length;
|
||
for (key in m) {
|
||
if (
|
||
hasOwnProp(m, key) &&
|
||
!(
|
||
indexOf.call(ordering, key) !== -1 &&
|
||
(m[key] == null || !isNaN(m[key]))
|
||
)
|
||
) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
for (i = 0; i < orderLen; ++i) {
|
||
if (m[ordering[i]]) {
|
||
if (unitHasDecimal) {
|
||
return false; // only allow non-integers for smallest unit
|
||
}
|
||
if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
|
||
unitHasDecimal = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
function createInvalid() {
|
||
return createDuration(NaN);
|
||
}
|
||
|
||
function Duration(duration) {
|
||
var normalizedInput = normalizeObjectUnits(duration),
|
||
years = normalizedInput.year || 0,
|
||
quarters = normalizedInput.quarter || 0,
|
||
months = normalizedInput.month || 0,
|
||
weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
|
||
days = normalizedInput.day || 0,
|
||
hours = normalizedInput.hour || 0,
|
||
minutes = normalizedInput.minute || 0,
|
||
seconds = normalizedInput.second || 0,
|
||
milliseconds = normalizedInput.millisecond || 0;
|
||
|
||
this._isValid = isDurationValid(normalizedInput);
|
||
|
||
// representation for dateAddRemove
|
||
this._milliseconds =
|
||
+milliseconds +
|
||
seconds * 1e3 + // 1000
|
||
minutes * 6e4 + // 1000 * 60
|
||
hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
|
||
// Because of dateAddRemove treats 24 hours as different from a
|
||
// day when working around DST, we need to store them separately
|
||
this._days = +days + weeks * 7;
|
||
// It is impossible to translate months into days without knowing
|
||
// which months you are are talking about, so we have to store
|
||
// it separately.
|
||
this._months = +months + quarters * 3 + years * 12;
|
||
|
||
this._data = {};
|
||
|
||
this._locale = getLocale();
|
||
|
||
this._bubble();
|
||
}
|
||
|
||
function isDuration(obj) {
|
||
return obj instanceof Duration;
|
||
}
|
||
|
||
function absRound(number) {
|
||
if (number < 0) {
|
||
return Math.round(-1 * number) * -1;
|
||
} else {
|
||
return Math.round(number);
|
||
}
|
||
}
|
||
|
||
// compare two arrays, return the number of differences
|
||
function compareArrays(array1, array2, dontConvert) {
|
||
var len = Math.min(array1.length, array2.length),
|
||
lengthDiff = Math.abs(array1.length - array2.length),
|
||
diffs = 0,
|
||
i;
|
||
for (i = 0; i < len; i++) {
|
||
if (
|
||
(toInt(array1[i]) !== toInt(array2[i]))
|
||
) {
|
||
diffs++;
|
||
}
|
||
}
|
||
return diffs + lengthDiff;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
function offset(token, separator) {
|
||
addFormatToken(token, 0, 0, function () {
|
||
var offset = this.utcOffset(),
|
||
sign = '+';
|
||
if (offset < 0) {
|
||
offset = -offset;
|
||
sign = '-';
|
||
}
|
||
return (
|
||
sign +
|
||
zeroFill(~~(offset / 60), 2) +
|
||
separator +
|
||
zeroFill(~~offset % 60, 2)
|
||
);
|
||
});
|
||
}
|
||
|
||
offset('Z', ':');
|
||
offset('ZZ', '');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('Z', matchShortOffset);
|
||
addRegexToken('ZZ', matchShortOffset);
|
||
addParseToken(['Z', 'ZZ'], function (input, array, config) {
|
||
config._useUTC = true;
|
||
config._tzm = offsetFromString(matchShortOffset, input);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
// timezone chunker
|
||
// '+10:00' > ['10', '00']
|
||
// '-1530' > ['-15', '30']
|
||
var chunkOffset = /([\+\-]|\d\d)/gi;
|
||
|
||
function offsetFromString(matcher, string) {
|
||
var matches = (string || '').match(matcher),
|
||
chunk,
|
||
parts,
|
||
minutes;
|
||
|
||
if (matches === null) {
|
||
return null;
|
||
}
|
||
|
||
chunk = matches[matches.length - 1] || [];
|
||
parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
|
||
minutes = +(parts[1] * 60) + toInt(parts[2]);
|
||
|
||
return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
|
||
}
|
||
|
||
// Return a moment from input, that is local/utc/zone equivalent to model.
|
||
function cloneWithOffset(input, model) {
|
||
var res, diff;
|
||
if (model._isUTC) {
|
||
res = model.clone();
|
||
diff =
|
||
(isMoment(input) || isDate(input)
|
||
? input.valueOf()
|
||
: createLocal(input).valueOf()) - res.valueOf();
|
||
// Use low-level api, because this fn is low-level api.
|
||
res._d.setTime(res._d.valueOf() + diff);
|
||
hooks.updateOffset(res, false);
|
||
return res;
|
||
} else {
|
||
return createLocal(input).local();
|
||
}
|
||
}
|
||
|
||
function getDateOffset(m) {
|
||
// On Firefox.24 Date#getTimezoneOffset returns a floating point.
|
||
// https://github.com/moment/moment/pull/1871
|
||
return -Math.round(m._d.getTimezoneOffset());
|
||
}
|
||
|
||
// HOOKS
|
||
|
||
// This function will be called whenever a moment is mutated.
|
||
// It is intended to keep the offset in sync with the timezone.
|
||
hooks.updateOffset = function () {};
|
||
|
||
// MOMENTS
|
||
|
||
// keepLocalTime = true means only change the timezone, without
|
||
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
|
||
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
|
||
// +0200, so we adjust the time as needed, to be valid.
|
||
//
|
||
// Keeping the time actually adds/subtracts (one hour)
|
||
// from the actual represented time. That is why we call updateOffset
|
||
// a second time. In case it wants us to change the offset again
|
||
// _changeInProgress == true case, then we have to adjust, because
|
||
// there is no such time in the given timezone.
|
||
function getSetOffset(input, keepLocalTime, keepMinutes) {
|
||
var offset = this._offset || 0,
|
||
localAdjust;
|
||
if (!this.isValid()) {
|
||
return input != null ? this : NaN;
|
||
}
|
||
if (input != null) {
|
||
if (typeof input === 'string') {
|
||
input = offsetFromString(matchShortOffset, input);
|
||
if (input === null) {
|
||
return this;
|
||
}
|
||
} else if (Math.abs(input) < 16 && !keepMinutes) {
|
||
input = input * 60;
|
||
}
|
||
if (!this._isUTC && keepLocalTime) {
|
||
localAdjust = getDateOffset(this);
|
||
}
|
||
this._offset = input;
|
||
this._isUTC = true;
|
||
if (localAdjust != null) {
|
||
this.add(localAdjust, 'm');
|
||
}
|
||
if (offset !== input) {
|
||
if (!keepLocalTime || this._changeInProgress) {
|
||
addSubtract(
|
||
this,
|
||
createDuration(input - offset, 'm'),
|
||
1,
|
||
false
|
||
);
|
||
} else if (!this._changeInProgress) {
|
||
this._changeInProgress = true;
|
||
hooks.updateOffset(this, true);
|
||
this._changeInProgress = null;
|
||
}
|
||
}
|
||
return this;
|
||
} else {
|
||
return this._isUTC ? offset : getDateOffset(this);
|
||
}
|
||
}
|
||
|
||
function getSetZone(input, keepLocalTime) {
|
||
if (input != null) {
|
||
if (typeof input !== 'string') {
|
||
input = -input;
|
||
}
|
||
|
||
this.utcOffset(input, keepLocalTime);
|
||
|
||
return this;
|
||
} else {
|
||
return -this.utcOffset();
|
||
}
|
||
}
|
||
|
||
function setOffsetToUTC(keepLocalTime) {
|
||
return this.utcOffset(0, keepLocalTime);
|
||
}
|
||
|
||
function setOffsetToLocal(keepLocalTime) {
|
||
if (this._isUTC) {
|
||
this.utcOffset(0, keepLocalTime);
|
||
this._isUTC = false;
|
||
|
||
if (keepLocalTime) {
|
||
this.subtract(getDateOffset(this), 'm');
|
||
}
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function setOffsetToParsedOffset() {
|
||
if (this._tzm != null) {
|
||
this.utcOffset(this._tzm, false, true);
|
||
} else if (typeof this._i === 'string') {
|
||
var tZone = offsetFromString(matchOffset, this._i);
|
||
if (tZone != null) {
|
||
this.utcOffset(tZone);
|
||
} else {
|
||
this.utcOffset(0, true);
|
||
}
|
||
}
|
||
return this;
|
||
}
|
||
|
||
function hasAlignedHourOffset(input) {
|
||
if (!this.isValid()) {
|
||
return false;
|
||
}
|
||
input = input ? createLocal(input).utcOffset() : 0;
|
||
|
||
return (this.utcOffset() - input) % 60 === 0;
|
||
}
|
||
|
||
function isDaylightSavingTime() {
|
||
return (
|
||
this.utcOffset() > this.clone().month(0).utcOffset() ||
|
||
this.utcOffset() > this.clone().month(5).utcOffset()
|
||
);
|
||
}
|
||
|
||
function isDaylightSavingTimeShifted() {
|
||
if (!isUndefined(this._isDSTShifted)) {
|
||
return this._isDSTShifted;
|
||
}
|
||
|
||
var c = {},
|
||
other;
|
||
|
||
copyConfig(c, this);
|
||
c = prepareConfig(c);
|
||
|
||
if (c._a) {
|
||
other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
|
||
this._isDSTShifted =
|
||
this.isValid() && compareArrays(c._a, other.toArray()) > 0;
|
||
} else {
|
||
this._isDSTShifted = false;
|
||
}
|
||
|
||
return this._isDSTShifted;
|
||
}
|
||
|
||
function isLocal() {
|
||
return this.isValid() ? !this._isUTC : false;
|
||
}
|
||
|
||
function isUtcOffset() {
|
||
return this.isValid() ? this._isUTC : false;
|
||
}
|
||
|
||
function isUtc() {
|
||
return this.isValid() ? this._isUTC && this._offset === 0 : false;
|
||
}
|
||
|
||
// ASP.NET json date format regex
|
||
var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
|
||
// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
|
||
// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
|
||
// and further modified to allow for strings containing both week and day
|
||
isoRegex =
|
||
/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
|
||
|
||
function createDuration(input, key) {
|
||
var duration = input,
|
||
// matching against regexp is expensive, do it on demand
|
||
match = null,
|
||
sign,
|
||
ret,
|
||
diffRes;
|
||
|
||
if (isDuration(input)) {
|
||
duration = {
|
||
ms: input._milliseconds,
|
||
d: input._days,
|
||
M: input._months,
|
||
};
|
||
} else if (isNumber(input) || !isNaN(+input)) {
|
||
duration = {};
|
||
if (key) {
|
||
duration[key] = +input;
|
||
} else {
|
||
duration.milliseconds = +input;
|
||
}
|
||
} else if ((match = aspNetRegex.exec(input))) {
|
||
sign = match[1] === '-' ? -1 : 1;
|
||
duration = {
|
||
y: 0,
|
||
d: toInt(match[DATE]) * sign,
|
||
h: toInt(match[HOUR]) * sign,
|
||
m: toInt(match[MINUTE]) * sign,
|
||
s: toInt(match[SECOND]) * sign,
|
||
ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
|
||
};
|
||
} else if ((match = isoRegex.exec(input))) {
|
||
sign = match[1] === '-' ? -1 : 1;
|
||
duration = {
|
||
y: parseIso(match[2], sign),
|
||
M: parseIso(match[3], sign),
|
||
w: parseIso(match[4], sign),
|
||
d: parseIso(match[5], sign),
|
||
h: parseIso(match[6], sign),
|
||
m: parseIso(match[7], sign),
|
||
s: parseIso(match[8], sign),
|
||
};
|
||
} else if (duration == null) {
|
||
// checks for null or undefined
|
||
duration = {};
|
||
} else if (
|
||
typeof duration === 'object' &&
|
||
('from' in duration || 'to' in duration)
|
||
) {
|
||
diffRes = momentsDifference(
|
||
createLocal(duration.from),
|
||
createLocal(duration.to)
|
||
);
|
||
|
||
duration = {};
|
||
duration.ms = diffRes.milliseconds;
|
||
duration.M = diffRes.months;
|
||
}
|
||
|
||
ret = new Duration(duration);
|
||
|
||
if (isDuration(input) && hasOwnProp(input, '_locale')) {
|
||
ret._locale = input._locale;
|
||
}
|
||
|
||
if (isDuration(input) && hasOwnProp(input, '_isValid')) {
|
||
ret._isValid = input._isValid;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
createDuration.fn = Duration.prototype;
|
||
createDuration.invalid = createInvalid;
|
||
|
||
function parseIso(inp, sign) {
|
||
// We'd normally use ~~inp for this, but unfortunately it also
|
||
// converts floats to ints.
|
||
// inp may be undefined, so careful calling replace on it.
|
||
var res = inp && parseFloat(inp.replace(',', '.'));
|
||
// apply sign while we're at it
|
||
return (isNaN(res) ? 0 : res) * sign;
|
||
}
|
||
|
||
function positiveMomentsDifference(base, other) {
|
||
var res = {};
|
||
|
||
res.months =
|
||
other.month() - base.month() + (other.year() - base.year()) * 12;
|
||
if (base.clone().add(res.months, 'M').isAfter(other)) {
|
||
--res.months;
|
||
}
|
||
|
||
res.milliseconds = +other - +base.clone().add(res.months, 'M');
|
||
|
||
return res;
|
||
}
|
||
|
||
function momentsDifference(base, other) {
|
||
var res;
|
||
if (!(base.isValid() && other.isValid())) {
|
||
return { milliseconds: 0, months: 0 };
|
||
}
|
||
|
||
other = cloneWithOffset(other, base);
|
||
if (base.isBefore(other)) {
|
||
res = positiveMomentsDifference(base, other);
|
||
} else {
|
||
res = positiveMomentsDifference(other, base);
|
||
res.milliseconds = -res.milliseconds;
|
||
res.months = -res.months;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
// TODO: remove 'name' arg after deprecation is removed
|
||
function createAdder(direction, name) {
|
||
return function (val, period) {
|
||
var dur, tmp;
|
||
//invert the arguments, but complain about it
|
||
if (period !== null && !isNaN(+period)) {
|
||
deprecateSimple(
|
||
name,
|
||
'moment().' +
|
||
name +
|
||
'(period, number) is deprecated. Please use moment().' +
|
||
name +
|
||
'(number, period). ' +
|
||
'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
|
||
);
|
||
tmp = val;
|
||
val = period;
|
||
period = tmp;
|
||
}
|
||
|
||
dur = createDuration(val, period);
|
||
addSubtract(this, dur, direction);
|
||
return this;
|
||
};
|
||
}
|
||
|
||
function addSubtract(mom, duration, isAdding, updateOffset) {
|
||
var milliseconds = duration._milliseconds,
|
||
days = absRound(duration._days),
|
||
months = absRound(duration._months);
|
||
|
||
if (!mom.isValid()) {
|
||
// No op
|
||
return;
|
||
}
|
||
|
||
updateOffset = updateOffset == null ? true : updateOffset;
|
||
|
||
if (months) {
|
||
setMonth(mom, get$1(mom, 'Month') + months * isAdding);
|
||
}
|
||
if (days) {
|
||
set(mom, 'Date', get$1(mom, 'Date') + days * isAdding);
|
||
}
|
||
if (milliseconds) {
|
||
mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
|
||
}
|
||
if (updateOffset) {
|
||
hooks.updateOffset(mom, days || months);
|
||
}
|
||
}
|
||
|
||
var add = createAdder(1, 'add'),
|
||
subtract = createAdder(-1, 'subtract');
|
||
|
||
function isString(input) {
|
||
return typeof input === 'string' || input instanceof String;
|
||
}
|
||
|
||
// type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
|
||
function isMomentInput(input) {
|
||
return (
|
||
isMoment(input) ||
|
||
isDate(input) ||
|
||
isString(input) ||
|
||
isNumber(input) ||
|
||
isNumberOrStringArray(input) ||
|
||
isMomentInputObject(input) ||
|
||
input === null ||
|
||
input === undefined
|
||
);
|
||
}
|
||
|
||
function isMomentInputObject(input) {
|
||
var objectTest = isObject(input) && !isObjectEmpty(input),
|
||
propertyTest = false,
|
||
properties = [
|
||
'years',
|
||
'year',
|
||
'y',
|
||
'months',
|
||
'month',
|
||
'M',
|
||
'days',
|
||
'day',
|
||
'd',
|
||
'dates',
|
||
'date',
|
||
'D',
|
||
'hours',
|
||
'hour',
|
||
'h',
|
||
'minutes',
|
||
'minute',
|
||
'm',
|
||
'seconds',
|
||
'second',
|
||
's',
|
||
'milliseconds',
|
||
'millisecond',
|
||
'ms',
|
||
],
|
||
i,
|
||
property,
|
||
propertyLen = properties.length;
|
||
|
||
for (i = 0; i < propertyLen; i += 1) {
|
||
property = properties[i];
|
||
propertyTest = propertyTest || hasOwnProp(input, property);
|
||
}
|
||
|
||
return objectTest && propertyTest;
|
||
}
|
||
|
||
function isNumberOrStringArray(input) {
|
||
var arrayTest = isArray(input),
|
||
dataTypeTest = false;
|
||
if (arrayTest) {
|
||
dataTypeTest =
|
||
input.filter(function (item) {
|
||
return !isNumber(item) && isString(input);
|
||
}).length === 0;
|
||
}
|
||
return arrayTest && dataTypeTest;
|
||
}
|
||
|
||
function isCalendarSpec(input) {
|
||
var objectTest = isObject(input) && !isObjectEmpty(input),
|
||
propertyTest = false,
|
||
properties = [
|
||
'sameDay',
|
||
'nextDay',
|
||
'lastDay',
|
||
'nextWeek',
|
||
'lastWeek',
|
||
'sameElse',
|
||
],
|
||
i,
|
||
property;
|
||
|
||
for (i = 0; i < properties.length; i += 1) {
|
||
property = properties[i];
|
||
propertyTest = propertyTest || hasOwnProp(input, property);
|
||
}
|
||
|
||
return objectTest && propertyTest;
|
||
}
|
||
|
||
function getCalendarFormat(myMoment, now) {
|
||
var diff = myMoment.diff(now, 'days', true);
|
||
return diff < -6
|
||
? 'sameElse'
|
||
: diff < -1
|
||
? 'lastWeek'
|
||
: diff < 0
|
||
? 'lastDay'
|
||
: diff < 1
|
||
? 'sameDay'
|
||
: diff < 2
|
||
? 'nextDay'
|
||
: diff < 7
|
||
? 'nextWeek'
|
||
: 'sameElse';
|
||
}
|
||
|
||
function calendar(time, formats) {
|
||
// Support for single parameter, formats only overload to the calendar function
|
||
if (arguments.length === 1) {
|
||
if (!arguments[0]) {
|
||
time = undefined;
|
||
formats = undefined;
|
||
} else if (isMomentInput(arguments[0])) {
|
||
time = arguments[0];
|
||
formats = undefined;
|
||
} else if (isCalendarSpec(arguments[0])) {
|
||
formats = arguments[0];
|
||
time = undefined;
|
||
}
|
||
}
|
||
// We want to compare the start of today, vs this.
|
||
// Getting start-of-today depends on whether we're local/utc/offset or not.
|
||
var now = time || createLocal(),
|
||
sod = cloneWithOffset(now, this).startOf('day'),
|
||
format = hooks.calendarFormat(this, sod) || 'sameElse',
|
||
output =
|
||
formats &&
|
||
(isFunction(formats[format])
|
||
? formats[format].call(this, now)
|
||
: formats[format]);
|
||
|
||
return this.format(
|
||
output || this.localeData().calendar(format, this, createLocal(now))
|
||
);
|
||
}
|
||
|
||
function clone() {
|
||
return new Moment(this);
|
||
}
|
||
|
||
function isAfter(input, units) {
|
||
var localInput = isMoment(input) ? input : createLocal(input);
|
||
if (!(this.isValid() && localInput.isValid())) {
|
||
return false;
|
||
}
|
||
units = normalizeUnits(units) || 'millisecond';
|
||
if (units === 'millisecond') {
|
||
return this.valueOf() > localInput.valueOf();
|
||
} else {
|
||
return localInput.valueOf() < this.clone().startOf(units).valueOf();
|
||
}
|
||
}
|
||
|
||
function isBefore(input, units) {
|
||
var localInput = isMoment(input) ? input : createLocal(input);
|
||
if (!(this.isValid() && localInput.isValid())) {
|
||
return false;
|
||
}
|
||
units = normalizeUnits(units) || 'millisecond';
|
||
if (units === 'millisecond') {
|
||
return this.valueOf() < localInput.valueOf();
|
||
} else {
|
||
return this.clone().endOf(units).valueOf() < localInput.valueOf();
|
||
}
|
||
}
|
||
|
||
function isBetween(from, to, units, inclusivity) {
|
||
var localFrom = isMoment(from) ? from : createLocal(from),
|
||
localTo = isMoment(to) ? to : createLocal(to);
|
||
if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
|
||
return false;
|
||
}
|
||
inclusivity = inclusivity || '()';
|
||
return (
|
||
(inclusivity[0] === '('
|
||
? this.isAfter(localFrom, units)
|
||
: !this.isBefore(localFrom, units)) &&
|
||
(inclusivity[1] === ')'
|
||
? this.isBefore(localTo, units)
|
||
: !this.isAfter(localTo, units))
|
||
);
|
||
}
|
||
|
||
function isSame(input, units) {
|
||
var localInput = isMoment(input) ? input : createLocal(input),
|
||
inputMs;
|
||
if (!(this.isValid() && localInput.isValid())) {
|
||
return false;
|
||
}
|
||
units = normalizeUnits(units) || 'millisecond';
|
||
if (units === 'millisecond') {
|
||
return this.valueOf() === localInput.valueOf();
|
||
} else {
|
||
inputMs = localInput.valueOf();
|
||
return (
|
||
this.clone().startOf(units).valueOf() <= inputMs &&
|
||
inputMs <= this.clone().endOf(units).valueOf()
|
||
);
|
||
}
|
||
}
|
||
|
||
function isSameOrAfter(input, units) {
|
||
return this.isSame(input, units) || this.isAfter(input, units);
|
||
}
|
||
|
||
function isSameOrBefore(input, units) {
|
||
return this.isSame(input, units) || this.isBefore(input, units);
|
||
}
|
||
|
||
function diff(input, units, asFloat) {
|
||
var that, zoneDelta, output;
|
||
|
||
if (!this.isValid()) {
|
||
return NaN;
|
||
}
|
||
|
||
that = cloneWithOffset(input, this);
|
||
|
||
if (!that.isValid()) {
|
||
return NaN;
|
||
}
|
||
|
||
zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
|
||
|
||
units = normalizeUnits(units);
|
||
|
||
switch (units) {
|
||
case 'year':
|
||
output = monthDiff(this, that) / 12;
|
||
break;
|
||
case 'month':
|
||
output = monthDiff(this, that);
|
||
break;
|
||
case 'quarter':
|
||
output = monthDiff(this, that) / 3;
|
||
break;
|
||
case 'second':
|
||
output = (this - that) / 1e3;
|
||
break; // 1000
|
||
case 'minute':
|
||
output = (this - that) / 6e4;
|
||
break; // 1000 * 60
|
||
case 'hour':
|
||
output = (this - that) / 36e5;
|
||
break; // 1000 * 60 * 60
|
||
case 'day':
|
||
output = (this - that - zoneDelta) / 864e5;
|
||
break; // 1000 * 60 * 60 * 24, negate dst
|
||
case 'week':
|
||
output = (this - that - zoneDelta) / 6048e5;
|
||
break; // 1000 * 60 * 60 * 24 * 7, negate dst
|
||
default:
|
||
output = this - that;
|
||
}
|
||
|
||
return asFloat ? output : absFloor(output);
|
||
}
|
||
|
||
function monthDiff(a, b) {
|
||
if (a.date() < b.date()) {
|
||
// end-of-month calculations work correct when the start month has more
|
||
// days than the end month.
|
||
return -monthDiff(b, a);
|
||
}
|
||
// difference in months
|
||
var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
|
||
// b is in (anchor - 1 month, anchor + 1 month)
|
||
anchor = a.clone().add(wholeMonthDiff, 'months'),
|
||
anchor2,
|
||
adjust;
|
||
|
||
if (b - anchor < 0) {
|
||
anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
|
||
// linear across the month
|
||
adjust = (b - anchor) / (anchor - anchor2);
|
||
} else {
|
||
anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
|
||
// linear across the month
|
||
adjust = (b - anchor) / (anchor2 - anchor);
|
||
}
|
||
|
||
//check for negative zero, return zero if negative zero
|
||
return -(wholeMonthDiff + adjust) || 0;
|
||
}
|
||
|
||
hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
|
||
hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
|
||
|
||
function toString() {
|
||
return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
|
||
}
|
||
|
||
function toISOString(keepOffset) {
|
||
if (!this.isValid()) {
|
||
return null;
|
||
}
|
||
var utc = keepOffset !== true,
|
||
m = utc ? this.clone().utc() : this;
|
||
if (m.year() < 0 || m.year() > 9999) {
|
||
return formatMoment(
|
||
m,
|
||
utc
|
||
? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
|
||
: 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
|
||
);
|
||
}
|
||
if (isFunction(Date.prototype.toISOString)) {
|
||
// native implementation is ~50x faster, use it when we can
|
||
if (utc) {
|
||
return this.toDate().toISOString();
|
||
} else {
|
||
return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
|
||
.toISOString()
|
||
.replace('Z', formatMoment(m, 'Z'));
|
||
}
|
||
}
|
||
return formatMoment(
|
||
m,
|
||
utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Return a human readable representation of a moment that can
|
||
* also be evaluated to get a new moment which is the same
|
||
*
|
||
* @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
|
||
*/
|
||
function inspect() {
|
||
if (!this.isValid()) {
|
||
return 'moment.invalid(/* ' + this._i + ' */)';
|
||
}
|
||
var func = 'moment',
|
||
zone = '',
|
||
prefix,
|
||
year,
|
||
datetime,
|
||
suffix;
|
||
if (!this.isLocal()) {
|
||
func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
|
||
zone = 'Z';
|
||
}
|
||
prefix = '[' + func + '("]';
|
||
year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
|
||
datetime = '-MM-DD[T]HH:mm:ss.SSS';
|
||
suffix = zone + '[")]';
|
||
|
||
return this.format(prefix + year + datetime + suffix);
|
||
}
|
||
|
||
function format(inputString) {
|
||
if (!inputString) {
|
||
inputString = this.isUtc()
|
||
? hooks.defaultFormatUtc
|
||
: hooks.defaultFormat;
|
||
}
|
||
var output = formatMoment(this, inputString);
|
||
return this.localeData().postformat(output);
|
||
}
|
||
|
||
function from(time, withoutSuffix) {
|
||
if (
|
||
this.isValid() &&
|
||
((isMoment(time) && time.isValid()) || createLocal(time).isValid())
|
||
) {
|
||
return createDuration({ to: this, from: time })
|
||
.locale(this.locale())
|
||
.humanize(!withoutSuffix);
|
||
} else {
|
||
return this.localeData().invalidDate();
|
||
}
|
||
}
|
||
|
||
function fromNow(withoutSuffix) {
|
||
return this.from(createLocal(), withoutSuffix);
|
||
}
|
||
|
||
function to(time, withoutSuffix) {
|
||
if (
|
||
this.isValid() &&
|
||
((isMoment(time) && time.isValid()) || createLocal(time).isValid())
|
||
) {
|
||
return createDuration({ from: this, to: time })
|
||
.locale(this.locale())
|
||
.humanize(!withoutSuffix);
|
||
} else {
|
||
return this.localeData().invalidDate();
|
||
}
|
||
}
|
||
|
||
function toNow(withoutSuffix) {
|
||
return this.to(createLocal(), withoutSuffix);
|
||
}
|
||
|
||
// If passed a locale key, it will set the locale for this
|
||
// instance. Otherwise, it will return the locale configuration
|
||
// variables for this instance.
|
||
function locale$3(key) {
|
||
var newLocaleData;
|
||
|
||
if (key === undefined) {
|
||
return this._locale._abbr;
|
||
} else {
|
||
newLocaleData = getLocale(key);
|
||
if (newLocaleData != null) {
|
||
this._locale = newLocaleData;
|
||
}
|
||
return this;
|
||
}
|
||
}
|
||
|
||
var lang = deprecate(
|
||
'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
|
||
function (key) {
|
||
if (key === undefined) {
|
||
return this.localeData();
|
||
} else {
|
||
return this.locale(key);
|
||
}
|
||
}
|
||
);
|
||
|
||
function localeData() {
|
||
return this._locale;
|
||
}
|
||
|
||
var MS_PER_SECOND = 1000,
|
||
MS_PER_MINUTE = 60 * MS_PER_SECOND,
|
||
MS_PER_HOUR = 60 * MS_PER_MINUTE,
|
||
MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
|
||
|
||
// actual modulo - handles negative numbers (for dates before 1970):
|
||
function mod(dividend, divisor) {
|
||
return ((dividend % divisor) + divisor) % divisor;
|
||
}
|
||
|
||
function localStartOfDate(y, m, d) {
|
||
// the date constructor remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
return new Date(y + 400, m, d) - MS_PER_400_YEARS;
|
||
} else {
|
||
return new Date(y, m, d).valueOf();
|
||
}
|
||
}
|
||
|
||
function utcStartOfDate(y, m, d) {
|
||
// Date.UTC remaps years 0-99 to 1900-1999
|
||
if (y < 100 && y >= 0) {
|
||
// preserve leap years using a full 400 year cycle, then reset
|
||
return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
|
||
} else {
|
||
return Date.UTC(y, m, d);
|
||
}
|
||
}
|
||
|
||
function startOf(units) {
|
||
var time, startOfDate;
|
||
units = normalizeUnits(units);
|
||
if (units === undefined || units === 'millisecond' || !this.isValid()) {
|
||
return this;
|
||
}
|
||
|
||
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
||
|
||
switch (units) {
|
||
case 'year':
|
||
time = startOfDate(this.year(), 0, 1);
|
||
break;
|
||
case 'quarter':
|
||
time = startOfDate(
|
||
this.year(),
|
||
this.month() - (this.month() % 3),
|
||
1
|
||
);
|
||
break;
|
||
case 'month':
|
||
time = startOfDate(this.year(), this.month(), 1);
|
||
break;
|
||
case 'week':
|
||
time = startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - this.weekday()
|
||
);
|
||
break;
|
||
case 'isoWeek':
|
||
time = startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - (this.isoWeekday() - 1)
|
||
);
|
||
break;
|
||
case 'day':
|
||
case 'date':
|
||
time = startOfDate(this.year(), this.month(), this.date());
|
||
break;
|
||
case 'hour':
|
||
time = this._d.valueOf();
|
||
time -= mod(
|
||
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
||
MS_PER_HOUR
|
||
);
|
||
break;
|
||
case 'minute':
|
||
time = this._d.valueOf();
|
||
time -= mod(time, MS_PER_MINUTE);
|
||
break;
|
||
case 'second':
|
||
time = this._d.valueOf();
|
||
time -= mod(time, MS_PER_SECOND);
|
||
break;
|
||
}
|
||
|
||
this._d.setTime(time);
|
||
hooks.updateOffset(this, true);
|
||
return this;
|
||
}
|
||
|
||
function endOf(units) {
|
||
var time, startOfDate;
|
||
units = normalizeUnits(units);
|
||
if (units === undefined || units === 'millisecond' || !this.isValid()) {
|
||
return this;
|
||
}
|
||
|
||
startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
|
||
|
||
switch (units) {
|
||
case 'year':
|
||
time = startOfDate(this.year() + 1, 0, 1) - 1;
|
||
break;
|
||
case 'quarter':
|
||
time =
|
||
startOfDate(
|
||
this.year(),
|
||
this.month() - (this.month() % 3) + 3,
|
||
1
|
||
) - 1;
|
||
break;
|
||
case 'month':
|
||
time = startOfDate(this.year(), this.month() + 1, 1) - 1;
|
||
break;
|
||
case 'week':
|
||
time =
|
||
startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - this.weekday() + 7
|
||
) - 1;
|
||
break;
|
||
case 'isoWeek':
|
||
time =
|
||
startOfDate(
|
||
this.year(),
|
||
this.month(),
|
||
this.date() - (this.isoWeekday() - 1) + 7
|
||
) - 1;
|
||
break;
|
||
case 'day':
|
||
case 'date':
|
||
time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
|
||
break;
|
||
case 'hour':
|
||
time = this._d.valueOf();
|
||
time +=
|
||
MS_PER_HOUR -
|
||
mod(
|
||
time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
|
||
MS_PER_HOUR
|
||
) -
|
||
1;
|
||
break;
|
||
case 'minute':
|
||
time = this._d.valueOf();
|
||
time += MS_PER_MINUTE - mod(time, MS_PER_MINUTE) - 1;
|
||
break;
|
||
case 'second':
|
||
time = this._d.valueOf();
|
||
time += MS_PER_SECOND - mod(time, MS_PER_SECOND) - 1;
|
||
break;
|
||
}
|
||
|
||
this._d.setTime(time);
|
||
hooks.updateOffset(this, true);
|
||
return this;
|
||
}
|
||
|
||
function valueOf() {
|
||
return this._d.valueOf() - (this._offset || 0) * 60000;
|
||
}
|
||
|
||
function unix() {
|
||
return Math.floor(this.valueOf() / 1000);
|
||
}
|
||
|
||
function toDate() {
|
||
return new Date(this.valueOf());
|
||
}
|
||
|
||
function toArray() {
|
||
var m = this;
|
||
return [
|
||
m.year(),
|
||
m.month(),
|
||
m.date(),
|
||
m.hour(),
|
||
m.minute(),
|
||
m.second(),
|
||
m.millisecond(),
|
||
];
|
||
}
|
||
|
||
function toObject() {
|
||
var m = this;
|
||
return {
|
||
years: m.year(),
|
||
months: m.month(),
|
||
date: m.date(),
|
||
hours: m.hours(),
|
||
minutes: m.minutes(),
|
||
seconds: m.seconds(),
|
||
milliseconds: m.milliseconds(),
|
||
};
|
||
}
|
||
|
||
function toJSON() {
|
||
// new Date(NaN).toJSON() === null
|
||
return this.isValid() ? this.toISOString() : null;
|
||
}
|
||
|
||
function isValid() {
|
||
return isValid$1(this);
|
||
}
|
||
|
||
function parsingFlags() {
|
||
return extend({}, getParsingFlags(this));
|
||
}
|
||
|
||
function invalidAt() {
|
||
return getParsingFlags(this).overflow;
|
||
}
|
||
|
||
function creationData() {
|
||
return {
|
||
input: this._i,
|
||
format: this._f,
|
||
locale: this._locale,
|
||
isUTC: this._isUTC,
|
||
strict: this._strict,
|
||
};
|
||
}
|
||
|
||
addFormatToken('N', 0, 0, 'eraAbbr');
|
||
addFormatToken('NN', 0, 0, 'eraAbbr');
|
||
addFormatToken('NNN', 0, 0, 'eraAbbr');
|
||
addFormatToken('NNNN', 0, 0, 'eraName');
|
||
addFormatToken('NNNNN', 0, 0, 'eraNarrow');
|
||
|
||
addFormatToken('y', ['y', 1], 'yo', 'eraYear');
|
||
addFormatToken('y', ['yy', 2], 0, 'eraYear');
|
||
addFormatToken('y', ['yyy', 3], 0, 'eraYear');
|
||
addFormatToken('y', ['yyyy', 4], 0, 'eraYear');
|
||
|
||
addRegexToken('N', matchEraAbbr);
|
||
addRegexToken('NN', matchEraAbbr);
|
||
addRegexToken('NNN', matchEraAbbr);
|
||
addRegexToken('NNNN', matchEraName);
|
||
addRegexToken('NNNNN', matchEraNarrow);
|
||
|
||
addParseToken(
|
||
['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
|
||
function (input, array, config, token) {
|
||
var era = config._locale.erasParse(input, token, config._strict);
|
||
if (era) {
|
||
getParsingFlags(config).era = era;
|
||
} else {
|
||
getParsingFlags(config).invalidEra = input;
|
||
}
|
||
}
|
||
);
|
||
|
||
addRegexToken('y', matchUnsigned);
|
||
addRegexToken('yy', matchUnsigned);
|
||
addRegexToken('yyy', matchUnsigned);
|
||
addRegexToken('yyyy', matchUnsigned);
|
||
addRegexToken('yo', matchEraYearOrdinal);
|
||
|
||
addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
|
||
addParseToken(['yo'], function (input, array, config, token) {
|
||
var match;
|
||
if (config._locale._eraYearOrdinalRegex) {
|
||
match = input.match(config._locale._eraYearOrdinalRegex);
|
||
}
|
||
|
||
if (config._locale.eraYearOrdinalParse) {
|
||
array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
|
||
} else {
|
||
array[YEAR] = parseInt(input, 10);
|
||
}
|
||
});
|
||
|
||
function getEraName() {
|
||
var i,
|
||
l,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (eras[i].since <= val && val <= eras[i].until) {
|
||
return eras[i].name;
|
||
}
|
||
if (eras[i].until <= val && val <= eras[i].since) {
|
||
return eras[i].name;
|
||
}
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
function getEraNarrow() {
|
||
var i,
|
||
l,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (eras[i].since <= val && val <= eras[i].until) {
|
||
return eras[i].narrow;
|
||
}
|
||
if (eras[i].until <= val && val <= eras[i].since) {
|
||
return eras[i].narrow;
|
||
}
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
function getEraAbbr() {
|
||
var i,
|
||
l,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (eras[i].since <= val && val <= eras[i].until) {
|
||
return eras[i].abbr;
|
||
}
|
||
if (eras[i].until <= val && val <= eras[i].since) {
|
||
return eras[i].abbr;
|
||
}
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
function getEraYear() {
|
||
var i,
|
||
l,
|
||
dir,
|
||
val,
|
||
eras = this.localeData().eras();
|
||
for (i = 0, l = eras.length; i < l; ++i) {
|
||
dir = eras[i].since <= eras[i].until ? 1 : -1;
|
||
|
||
// truncate time
|
||
val = this.clone().startOf('day').valueOf();
|
||
|
||
if (
|
||
(eras[i].since <= val && val <= eras[i].until) ||
|
||
(eras[i].until <= val && val <= eras[i].since)
|
||
) {
|
||
return (
|
||
(this.year() - hooks(eras[i].since).year()) * dir +
|
||
eras[i].offset
|
||
);
|
||
}
|
||
}
|
||
|
||
return this.year();
|
||
}
|
||
|
||
function matchEraAbbr(isStrict, locale) {
|
||
return locale.erasAbbrRegex(isStrict);
|
||
}
|
||
|
||
function matchEraName(isStrict, locale) {
|
||
return locale.erasNameRegex(isStrict);
|
||
}
|
||
|
||
function matchEraNarrow(isStrict, locale) {
|
||
return locale.erasNarrowRegex(isStrict);
|
||
}
|
||
|
||
function matchEraYearOrdinal(isStrict, locale) {
|
||
return locale._eraYearOrdinalRegex || matchUnsigned;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken(0, ['gg', 2], 0, function () {
|
||
return this.weekYear() % 100;
|
||
});
|
||
|
||
addFormatToken(0, ['GG', 2], 0, function () {
|
||
return this.isoWeekYear() % 100;
|
||
});
|
||
|
||
function addWeekYearFormatToken(token, getter) {
|
||
addFormatToken(0, [token, token.length], 0, getter);
|
||
}
|
||
|
||
addWeekYearFormatToken('gggg', 'weekYear');
|
||
addWeekYearFormatToken('ggggg', 'weekYear');
|
||
addWeekYearFormatToken('GGGG', 'isoWeekYear');
|
||
addWeekYearFormatToken('GGGGG', 'isoWeekYear');
|
||
|
||
// ALIASES
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('G', matchSigned);
|
||
addRegexToken('g', matchSigned);
|
||
addRegexToken('GG', match1to2, match2);
|
||
addRegexToken('gg', match1to2, match2);
|
||
addRegexToken('GGGG', match1to4, match4);
|
||
addRegexToken('gggg', match1to4, match4);
|
||
addRegexToken('GGGGG', match1to6, match6);
|
||
addRegexToken('ggggg', match1to6, match6);
|
||
|
||
addWeekParseToken(
|
||
['gggg', 'ggggg', 'GGGG', 'GGGGG'],
|
||
function (input, week, config, token) {
|
||
week[token.substr(0, 2)] = toInt(input);
|
||
}
|
||
);
|
||
|
||
addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
|
||
week[token] = hooks.parseTwoDigitYear(input);
|
||
});
|
||
|
||
// MOMENTS
|
||
|
||
function getSetWeekYear(input) {
|
||
return getSetWeekYearHelper.call(
|
||
this,
|
||
input,
|
||
this.week(),
|
||
this.weekday() + this.localeData()._week.dow,
|
||
this.localeData()._week.dow,
|
||
this.localeData()._week.doy
|
||
);
|
||
}
|
||
|
||
function getSetISOWeekYear(input) {
|
||
return getSetWeekYearHelper.call(
|
||
this,
|
||
input,
|
||
this.isoWeek(),
|
||
this.isoWeekday(),
|
||
1,
|
||
4
|
||
);
|
||
}
|
||
|
||
function getISOWeeksInYear() {
|
||
return weeksInYear(this.year(), 1, 4);
|
||
}
|
||
|
||
function getISOWeeksInISOWeekYear() {
|
||
return weeksInYear(this.isoWeekYear(), 1, 4);
|
||
}
|
||
|
||
function getWeeksInYear() {
|
||
var weekInfo = this.localeData()._week;
|
||
return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
|
||
}
|
||
|
||
function getWeeksInWeekYear() {
|
||
var weekInfo = this.localeData()._week;
|
||
return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
|
||
}
|
||
|
||
function getSetWeekYearHelper(input, week, weekday, dow, doy) {
|
||
var weeksTarget;
|
||
if (input == null) {
|
||
return weekOfYear(this, dow, doy).year;
|
||
} else {
|
||
weeksTarget = weeksInYear(input, dow, doy);
|
||
if (week > weeksTarget) {
|
||
week = weeksTarget;
|
||
}
|
||
return setWeekAll.call(this, input, week, weekday, dow, doy);
|
||
}
|
||
}
|
||
|
||
function setWeekAll(weekYear, week, weekday, dow, doy) {
|
||
var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
|
||
date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
|
||
|
||
this.year(date.getUTCFullYear());
|
||
this.month(date.getUTCMonth());
|
||
this.date(date.getUTCDate());
|
||
return this;
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('Q', 0, 'Qo', 'quarter');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('Q', match1);
|
||
addParseToken('Q', function (input, array) {
|
||
array[MONTH] = (toInt(input) - 1) * 3;
|
||
});
|
||
|
||
// MOMENTS
|
||
|
||
function getSetQuarter(input) {
|
||
return input == null
|
||
? Math.ceil((this.month() + 1) / 3)
|
||
: this.month((input - 1) * 3 + (this.month() % 3));
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('D', ['DD', 2], 'Do', 'date');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('D', match1to2, match1to2NoLeadingZero);
|
||
addRegexToken('DD', match1to2, match2);
|
||
addRegexToken('Do', function (isStrict, locale) {
|
||
// TODO: Remove "ordinalParse" fallback in next major release.
|
||
return isStrict
|
||
? locale._dayOfMonthOrdinalParse || locale._ordinalParse
|
||
: locale._dayOfMonthOrdinalParseLenient;
|
||
});
|
||
|
||
addParseToken(['D', 'DD'], DATE);
|
||
addParseToken('Do', function (input, array) {
|
||
array[DATE] = toInt(input.match(match1to2)[0]);
|
||
});
|
||
|
||
// MOMENTS
|
||
|
||
var getSetDayOfMonth = makeGetSet('Date', true);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('DDD', match1to3);
|
||
addRegexToken('DDDD', match3);
|
||
addParseToken(['DDD', 'DDDD'], function (input, array, config) {
|
||
config._dayOfYear = toInt(input);
|
||
});
|
||
|
||
// HELPERS
|
||
|
||
// MOMENTS
|
||
|
||
function getSetDayOfYear(input) {
|
||
var dayOfYear =
|
||
Math.round(
|
||
(this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
|
||
) + 1;
|
||
return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
|
||
}
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('m', ['mm', 2], 0, 'minute');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('m', match1to2, match1to2HasZero);
|
||
addRegexToken('mm', match1to2, match2);
|
||
addParseToken(['m', 'mm'], MINUTE);
|
||
|
||
// MOMENTS
|
||
|
||
var getSetMinute = makeGetSet('Minutes', false);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('s', ['ss', 2], 0, 'second');
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('s', match1to2, match1to2HasZero);
|
||
addRegexToken('ss', match1to2, match2);
|
||
addParseToken(['s', 'ss'], SECOND);
|
||
|
||
// MOMENTS
|
||
|
||
var getSetSecond = makeGetSet('Seconds', false);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('S', 0, 0, function () {
|
||
return ~~(this.millisecond() / 100);
|
||
});
|
||
|
||
addFormatToken(0, ['SS', 2], 0, function () {
|
||
return ~~(this.millisecond() / 10);
|
||
});
|
||
|
||
addFormatToken(0, ['SSS', 3], 0, 'millisecond');
|
||
addFormatToken(0, ['SSSS', 4], 0, function () {
|
||
return this.millisecond() * 10;
|
||
});
|
||
addFormatToken(0, ['SSSSS', 5], 0, function () {
|
||
return this.millisecond() * 100;
|
||
});
|
||
addFormatToken(0, ['SSSSSS', 6], 0, function () {
|
||
return this.millisecond() * 1000;
|
||
});
|
||
addFormatToken(0, ['SSSSSSS', 7], 0, function () {
|
||
return this.millisecond() * 10000;
|
||
});
|
||
addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
|
||
return this.millisecond() * 100000;
|
||
});
|
||
addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
|
||
return this.millisecond() * 1000000;
|
||
});
|
||
|
||
// PARSING
|
||
|
||
addRegexToken('S', match1to3, match1);
|
||
addRegexToken('SS', match1to3, match2);
|
||
addRegexToken('SSS', match1to3, match3);
|
||
|
||
var token, getSetMillisecond;
|
||
for (token = 'SSSS'; token.length <= 9; token += 'S') {
|
||
addRegexToken(token, matchUnsigned);
|
||
}
|
||
|
||
function parseMs(input, array) {
|
||
array[MILLISECOND] = toInt(('0.' + input) * 1000);
|
||
}
|
||
|
||
for (token = 'S'; token.length <= 9; token += 'S') {
|
||
addParseToken(token, parseMs);
|
||
}
|
||
|
||
getSetMillisecond = makeGetSet('Milliseconds', false);
|
||
|
||
// FORMATTING
|
||
|
||
addFormatToken('z', 0, 0, 'zoneAbbr');
|
||
addFormatToken('zz', 0, 0, 'zoneName');
|
||
|
||
// MOMENTS
|
||
|
||
function getZoneAbbr() {
|
||
return this._isUTC ? 'UTC' : '';
|
||
}
|
||
|
||
function getZoneName() {
|
||
return this._isUTC ? 'Coordinated Universal Time' : '';
|
||
}
|
||
|
||
var proto = Moment.prototype;
|
||
|
||
proto.add = add;
|
||
proto.calendar = calendar;
|
||
proto.clone = clone;
|
||
proto.diff = diff;
|
||
proto.endOf = endOf;
|
||
proto.format = format;
|
||
proto.from = from;
|
||
proto.fromNow = fromNow;
|
||
proto.to = to;
|
||
proto.toNow = toNow;
|
||
proto.get = stringGet;
|
||
proto.invalidAt = invalidAt;
|
||
proto.isAfter = isAfter;
|
||
proto.isBefore = isBefore;
|
||
proto.isBetween = isBetween;
|
||
proto.isSame = isSame;
|
||
proto.isSameOrAfter = isSameOrAfter;
|
||
proto.isSameOrBefore = isSameOrBefore;
|
||
proto.isValid = isValid;
|
||
proto.lang = lang;
|
||
proto.locale = locale$3;
|
||
proto.localeData = localeData;
|
||
proto.max = prototypeMax;
|
||
proto.min = prototypeMin;
|
||
proto.parsingFlags = parsingFlags;
|
||
proto.set = stringSet;
|
||
proto.startOf = startOf;
|
||
proto.subtract = subtract;
|
||
proto.toArray = toArray;
|
||
proto.toObject = toObject;
|
||
proto.toDate = toDate;
|
||
proto.toISOString = toISOString;
|
||
proto.inspect = inspect;
|
||
if (typeof Symbol !== 'undefined' && Symbol.for != null) {
|
||
proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
|
||
return 'Moment<' + this.format() + '>';
|
||
};
|
||
}
|
||
proto.toJSON = toJSON;
|
||
proto.toString = toString;
|
||
proto.unix = unix;
|
||
proto.valueOf = valueOf;
|
||
proto.creationData = creationData;
|
||
proto.eraName = getEraName;
|
||
proto.eraNarrow = getEraNarrow;
|
||
proto.eraAbbr = getEraAbbr;
|
||
proto.eraYear = getEraYear;
|
||
proto.year = getSetYear;
|
||
proto.isLeapYear = getIsLeapYear;
|
||
proto.weekYear = getSetWeekYear;
|
||
proto.isoWeekYear = getSetISOWeekYear;
|
||
proto.quarter = proto.quarters = getSetQuarter;
|
||
proto.month = getSetMonth;
|
||
proto.daysInMonth = getDaysInMonth;
|
||
proto.week = proto.weeks = getSetWeek;
|
||
proto.isoWeek = proto.isoWeeks = getSetISOWeek;
|
||
proto.weeksInYear = getWeeksInYear;
|
||
proto.weeksInWeekYear = getWeeksInWeekYear;
|
||
proto.isoWeeksInYear = getISOWeeksInYear;
|
||
proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
|
||
proto.date = getSetDayOfMonth;
|
||
proto.day = proto.days = getSetDayOfWeek;
|
||
proto.weekday = getSetLocaleDayOfWeek;
|
||
proto.isoWeekday = getSetISODayOfWeek;
|
||
proto.dayOfYear = getSetDayOfYear;
|
||
proto.hour = proto.hours = getSetHour;
|
||
proto.minute = proto.minutes = getSetMinute;
|
||
proto.second = proto.seconds = getSetSecond;
|
||
proto.millisecond = proto.milliseconds = getSetMillisecond;
|
||
proto.utcOffset = getSetOffset;
|
||
proto.utc = setOffsetToUTC;
|
||
proto.local = setOffsetToLocal;
|
||
proto.parseZone = setOffsetToParsedOffset;
|
||
proto.hasAlignedHourOffset = hasAlignedHourOffset;
|
||
proto.isDST = isDaylightSavingTime;
|
||
proto.isLocal = isLocal;
|
||
proto.isUtcOffset = isUtcOffset;
|
||
proto.isUtc = isUtc;
|
||
proto.isUTC = isUtc;
|
||
proto.zoneAbbr = getZoneAbbr;
|
||
proto.zoneName = getZoneName;
|
||
proto.dates = deprecate(
|
||
'dates accessor is deprecated. Use date instead.',
|
||
getSetDayOfMonth
|
||
);
|
||
proto.months = deprecate(
|
||
'months accessor is deprecated. Use month instead',
|
||
getSetMonth
|
||
);
|
||
proto.years = deprecate(
|
||
'years accessor is deprecated. Use year instead',
|
||
getSetYear
|
||
);
|
||
proto.zone = deprecate(
|
||
'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
|
||
getSetZone
|
||
);
|
||
proto.isDSTShifted = deprecate(
|
||
'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
|
||
isDaylightSavingTimeShifted
|
||
);
|
||
|
||
function createUnix(input) {
|
||
return createLocal(input * 1000);
|
||
}
|
||
|
||
function createInZone() {
|
||
return createLocal.apply(null, arguments).parseZone();
|
||
}
|
||
|
||
function get(format, index, field, setter) {
|
||
var locale = getLocale(),
|
||
utc = createUTC().set(setter, index);
|
||
return locale[field](utc, format);
|
||
}
|
||
|
||
function listMonthsImpl(format, index, field) {
|
||
if (isNumber(format)) {
|
||
index = format;
|
||
format = undefined;
|
||
}
|
||
|
||
format = format || '';
|
||
|
||
if (index != null) {
|
||
return get(format, index, field, 'month');
|
||
}
|
||
|
||
var i,
|
||
out = [];
|
||
for (i = 0; i < 12; i++) {
|
||
out[i] = get(format, i, field, 'month');
|
||
}
|
||
return out;
|
||
}
|
||
|
||
// ()
|
||
// (5)
|
||
// (fmt, 5)
|
||
// (fmt)
|
||
// (true)
|
||
// (true, 5)
|
||
// (true, fmt, 5)
|
||
// (true, fmt)
|
||
function listWeekdaysImpl(localeSorted, format, index, field) {
|
||
if (typeof localeSorted === 'boolean') {
|
||
if (isNumber(format)) {
|
||
index = format;
|
||
format = undefined;
|
||
}
|
||
|
||
format = format || '';
|
||
} else {
|
||
format = localeSorted;
|
||
index = format;
|
||
localeSorted = false;
|
||
|
||
if (isNumber(format)) {
|
||
index = format;
|
||
format = undefined;
|
||
}
|
||
|
||
format = format || '';
|
||
}
|
||
|
||
var locale = getLocale(),
|
||
shift = localeSorted ? locale._week.dow : 0,
|
||
i,
|
||
out = [];
|
||
|
||
if (index != null) {
|
||
return get(format, (index + shift) % 7, field, 'day');
|
||
}
|
||
|
||
for (i = 0; i < 7; i++) {
|
||
out[i] = get(format, (i + shift) % 7, field, 'day');
|
||
}
|
||
return out;
|
||
}
|
||
|
||
function listMonths(format, index) {
|
||
return listMonthsImpl(format, index, 'months');
|
||
}
|
||
|
||
function listMonthsShort(format, index) {
|
||
return listMonthsImpl(format, index, 'monthsShort');
|
||
}
|
||
|
||
function listWeekdays(localeSorted, format, index) {
|
||
return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
|
||
}
|
||
|
||
function listWeekdaysShort(localeSorted, format, index) {
|
||
return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
|
||
}
|
||
|
||
function listWeekdaysMin(localeSorted, format, index) {
|
||
return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
|
||
}
|
||
|
||
// Side effect imports
|
||
|
||
hooks.lang = deprecate(
|
||
'moment.lang is deprecated. Use moment.locale instead.',
|
||
getSetGlobalLocale
|
||
);
|
||
hooks.langData = deprecate(
|
||
'moment.langData is deprecated. Use moment.localeData instead.',
|
||
getLocale
|
||
);
|
||
|
||
var round = Math.round,
|
||
thresholds = {
|
||
ss: 44, // a few seconds to seconds
|
||
s: 45, // seconds to minute
|
||
m: 45, // minutes to hour
|
||
h: 22, // hours to day
|
||
d: 26, // days to month/week
|
||
w: null, // weeks to month
|
||
M: 11, // months to year
|
||
};
|
||
|
||
// This function allows you to set the rounding function for relative time strings
|
||
function getSetRelativeTimeRounding(roundingFunction) {
|
||
if (roundingFunction === undefined) {
|
||
return round;
|
||
}
|
||
if (typeof roundingFunction === 'function') {
|
||
round = roundingFunction;
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// This function allows you to set a threshold for relative time strings
|
||
function getSetRelativeTimeThreshold(threshold, limit) {
|
||
if (thresholds[threshold] === undefined) {
|
||
return false;
|
||
}
|
||
if (limit === undefined) {
|
||
return thresholds[threshold];
|
||
}
|
||
thresholds[threshold] = limit;
|
||
if (threshold === 's') {
|
||
thresholds.ss = limit - 1;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
//! moment.js
|
||
//! version : 2.30.1
|
||
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
|
||
//! license : MIT
|
||
//! momentjs.com
|
||
|
||
|
||
hooks.version = '2.30.1';
|
||
|
||
setHookCallback(createLocal);
|
||
|
||
hooks.fn = proto;
|
||
hooks.min = min;
|
||
hooks.max = max;
|
||
hooks.now = now;
|
||
hooks.utc = createUTC;
|
||
hooks.unix = createUnix;
|
||
hooks.months = listMonths;
|
||
hooks.isDate = isDate;
|
||
hooks.locale = getSetGlobalLocale;
|
||
hooks.invalid = createInvalid$1;
|
||
hooks.duration = createDuration;
|
||
hooks.isMoment = isMoment;
|
||
hooks.weekdays = listWeekdays;
|
||
hooks.parseZone = createInZone;
|
||
hooks.localeData = getLocale;
|
||
hooks.isDuration = isDuration;
|
||
hooks.monthsShort = listMonthsShort;
|
||
hooks.weekdaysMin = listWeekdaysMin;
|
||
hooks.defineLocale = defineLocale;
|
||
hooks.updateLocale = updateLocale;
|
||
hooks.locales = listLocales;
|
||
hooks.weekdaysShort = listWeekdaysShort;
|
||
hooks.normalizeUnits = normalizeUnits;
|
||
hooks.relativeTimeRounding = getSetRelativeTimeRounding;
|
||
hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
|
||
hooks.calendarFormat = getCalendarFormat;
|
||
hooks.prototype = proto;
|
||
|
||
// currently HTML5 input type only supports 24-hour formats
|
||
hooks.HTML5_FMT = {
|
||
DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
|
||
DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
|
||
DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
|
||
DATE: 'YYYY-MM-DD', // <input type="date" />
|
||
TIME: 'HH:mm', // <input type="time" />
|
||
TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
|
||
TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
|
||
WEEK: 'GGGG-[W]WW', // <input type="week" />
|
||
MONTH: 'YYYY-MM', // <input type="month" />
|
||
};
|
||
|
||
//! moment.js locale configuration
|
||
//! locale : Persian [fa]
|
||
//! author : Ebrahim Byagowi : https://github.com/ebraminio
|
||
|
||
|
||
var symbolMap = {
|
||
1: '۱',
|
||
2: '۲',
|
||
3: '۳',
|
||
4: '۴',
|
||
5: '۵',
|
||
6: '۶',
|
||
7: '۷',
|
||
8: '۸',
|
||
9: '۹',
|
||
0: '۰',
|
||
},
|
||
numberMap = {
|
||
'۱': '1',
|
||
'۲': '2',
|
||
'۳': '3',
|
||
'۴': '4',
|
||
'۵': '5',
|
||
'۶': '6',
|
||
'۷': '7',
|
||
'۸': '8',
|
||
'۹': '9',
|
||
'۰': '0',
|
||
};
|
||
|
||
const fa = hooks.defineLocale('fa', {
|
||
months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
|
||
'_'
|
||
),
|
||
monthsShort:
|
||
'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
|
||
'_'
|
||
),
|
||
weekdays:
|
||
'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
|
||
'_'
|
||
),
|
||
weekdaysShort:
|
||
'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
|
||
'_'
|
||
),
|
||
weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
|
||
weekdaysParseExact: true,
|
||
longDateFormat: {
|
||
LT: 'HH:mm',
|
||
LTS: 'HH:mm:ss',
|
||
L: 'DD/MM/YYYY',
|
||
LL: 'D MMMM YYYY',
|
||
LLL: 'D MMMM YYYY HH:mm',
|
||
LLLL: 'dddd, D MMMM YYYY HH:mm',
|
||
},
|
||
meridiemParse: /قبل از ظهر|بعد از ظهر/,
|
||
isPM: function (input) {
|
||
return /بعد از ظهر/.test(input);
|
||
},
|
||
meridiem: function (hour, minute, isLower) {
|
||
if (hour < 12) {
|
||
return 'قبل از ظهر';
|
||
} else {
|
||
return 'بعد از ظهر';
|
||
}
|
||
},
|
||
calendar: {
|
||
sameDay: '[امروز ساعت] LT',
|
||
nextDay: '[فردا ساعت] LT',
|
||
nextWeek: 'dddd [ساعت] LT',
|
||
lastDay: '[دیروز ساعت] LT',
|
||
lastWeek: 'dddd [پیش] [ساعت] LT',
|
||
sameElse: 'L',
|
||
},
|
||
relativeTime: {
|
||
future: 'در %s',
|
||
past: '%s پیش',
|
||
s: 'چند ثانیه',
|
||
ss: '%d ثانیه',
|
||
m: 'یک دقیقه',
|
||
mm: '%d دقیقه',
|
||
h: 'یک ساعت',
|
||
hh: '%d ساعت',
|
||
d: 'یک روز',
|
||
dd: '%d روز',
|
||
M: 'یک ماه',
|
||
MM: '%d ماه',
|
||
y: 'یک سال',
|
||
yy: '%d سال',
|
||
},
|
||
preparse: function (string) {
|
||
return string
|
||
.replace(/[۰-۹]/g, function (match) {
|
||
return numberMap[match];
|
||
})
|
||
.replace(/،/g, ',');
|
||
},
|
||
postformat: function (string) {
|
||
return string
|
||
.replace(/\d/g, function (match) {
|
||
return symbolMap[match];
|
||
})
|
||
.replace(/,/g, '،');
|
||
},
|
||
dayOfMonthOrdinalParse: /\d{1,2}م/,
|
||
ordinal: '%dم',
|
||
week: {
|
||
dow: 6, // Saturday is the first day of the week.
|
||
doy: 12, // The week that contains Jan 12th is the first week of the year.
|
||
},
|
||
});
|
||
|
||
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
||
__name: "BaseDatePicker",
|
||
__ssrInlineRender: true,
|
||
props: {
|
||
value: { type: [String, Number, Boolean, Array] },
|
||
disabledDate: { type: Boolean }
|
||
},
|
||
emits: ["update:value"],
|
||
setup(__props, { emit: __emit }) {
|
||
const disabledDate = (current) => {
|
||
if (props.disabledDate)
|
||
return current && current < dayjs().endOf("day");
|
||
else
|
||
return false;
|
||
};
|
||
const emit = __emit;
|
||
const props = __props;
|
||
const localValue = computed({
|
||
get() {
|
||
const dayjsDate = props.value ? dayjs(props.value) : null;
|
||
return dayjsDate;
|
||
},
|
||
set(value) {
|
||
const date = dayjs(value).format("YYYY-MM-DD");
|
||
emit("update:value", date);
|
||
}
|
||
});
|
||
return (_ctx, _push, _parent, _attrs) => {
|
||
_push(ssrRenderComponent(unref(DatePicker$1), mergeProps({
|
||
value: localValue.value,
|
||
"onUpdate:value": ($event) => localValue.value = $event,
|
||
"disabled-date": disabledDate,
|
||
class: "w-full",
|
||
inputReadOnly: ""
|
||
}, _attrs), null, _parent));
|
||
};
|
||
}
|
||
});
|
||
const _sfc_setup$1 = _sfc_main$1.setup;
|
||
_sfc_main$1.setup = (props, ctx) => {
|
||
const ssrContext = useSSRContext();
|
||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue");
|
||
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
|
||
};
|
||
const BaseDatePicker = Object.assign(_sfc_main$1, { __name: "BasicPacksBaseDatePickerSrcBaseDatePicker" });
|
||
const locale$2 = {
|
||
locale: "fa_IR",
|
||
today: "امروز",
|
||
now: "اکنون",
|
||
backToToday: "بازگشت به روز",
|
||
ok: "باشه",
|
||
clear: "پاک کردن",
|
||
month: "ماه",
|
||
year: "سال",
|
||
timeSelect: "انتخاب زمان",
|
||
dateSelect: "انتخاب تاریخ",
|
||
monthSelect: "یک ماه را انتخاب کنید",
|
||
yearSelect: "یک سال را انتخاب کنید",
|
||
decadeSelect: "یک دهه را انتخاب کنید",
|
||
yearFormat: "YYYY",
|
||
dateFormat: "M/D/YYYY",
|
||
dayFormat: "D",
|
||
dateTimeFormat: "M/D/YYYY HH:mm:ss",
|
||
monthBeforeYear: true,
|
||
previousMonth: "ماه قبل (PageUp)",
|
||
nextMonth: "ماه بعد (PageDown)",
|
||
previousYear: "سال قبل (Control + left)",
|
||
nextYear: "سال بعد (Control + right)",
|
||
previousDecade: "دهه قبل",
|
||
nextDecade: "دهه بعد",
|
||
previousCentury: "قرن قبل",
|
||
nextCentury: "قرن بعد"
|
||
};
|
||
const locale$1 = {
|
||
placeholder: "انتخاب زمان",
|
||
rangePlaceholder: ["زمان شروع", "زمان پایان"]
|
||
};
|
||
const locale = {
|
||
lang: _extends({
|
||
placeholder: "انتخاب تاریخ",
|
||
yearPlaceholder: "انتخاب سال",
|
||
quarterPlaceholder: "انتخاب فصل",
|
||
monthPlaceholder: "انتخاب ماه",
|
||
weekPlaceholder: "انتخاب هفته",
|
||
rangePlaceholder: ["تاریخ شروع", "تاریخ پایان"],
|
||
rangeYearPlaceholder: ["سال شروع", "سال پایان"],
|
||
rangeMonthPlaceholder: ["ماه شروع", "ماه پایان"],
|
||
rangeWeekPlaceholder: ["هفته شروع", "هفته پایان"]
|
||
}, locale$2),
|
||
timePickerLocale: _extends({}, locale$1)
|
||
};
|
||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||
__name: "BaseDatePicker",
|
||
__ssrInlineRender: true,
|
||
props: {
|
||
value: { type: [String, Number, Boolean, Array] },
|
||
disabledDate: { type: Boolean }
|
||
},
|
||
emits: ["update:value"],
|
||
setup(__props, { emit: __emit }) {
|
||
const config = useConfigStore();
|
||
moment.locale("fa", fa);
|
||
moment.loadPersian();
|
||
dayjs.extend(jalaliday);
|
||
const months = [
|
||
"فروردین",
|
||
"اردیبهشت",
|
||
"خرداد",
|
||
"تیر",
|
||
"مرداد",
|
||
"شهریور",
|
||
"مهر",
|
||
"آبان",
|
||
"آذر",
|
||
"دی",
|
||
"بهمن",
|
||
"اسفند"
|
||
];
|
||
dayjs.updateLocale("fa", {
|
||
monthsShort: months,
|
||
months
|
||
});
|
||
dayjs.calendar("jalali");
|
||
const disabledDate = (current) => {
|
||
if (props.disabledDate)
|
||
return current && current < dayjs().endOf("day");
|
||
else
|
||
return false;
|
||
};
|
||
const emit = __emit;
|
||
const props = __props;
|
||
const localValue = computed({
|
||
get() {
|
||
const dayjsDate = props.value ? dayjs(props.value) : null;
|
||
return dayjsDate;
|
||
},
|
||
set(value) {
|
||
const date = dayjs(value).format("YYYY-MM-DD");
|
||
console.log(moment(date, "jYYYY/jM/jD HH:mm").format("YYYY-M-D"));
|
||
emit("update:value", moment(date, "jYYYY/jM/jD HH:mm").format("YYYY-M-D"));
|
||
}
|
||
});
|
||
return (_ctx, _push, _parent, _attrs) => {
|
||
_push(ssrRenderComponent(unref(DatePicker$1), mergeProps({
|
||
value: localValue.value,
|
||
"onUpdate:value": ($event) => localValue.value = $event,
|
||
"disabled-date": disabledDate,
|
||
locale: unref(locale),
|
||
class: "w-full",
|
||
placeholder: unref(config).useString("selectDate"),
|
||
inputReadOnly: ""
|
||
}, _attrs), null, _parent));
|
||
};
|
||
}
|
||
});
|
||
const _sfc_setup = _sfc_main.setup;
|
||
_sfc_main.setup = (props, ctx) => {
|
||
const ssrContext = useSSRContext();
|
||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/BasicPacks/BaseDatePickerJalali/src/BaseDatePicker.vue");
|
||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||
};
|
||
const BaseDatePickerJalali = Object.assign(_sfc_main, { __name: "BasicPacksBaseDatePickerJalaliSrcBaseDatePicker" });
|
||
|
||
export { BaseDatePicker as B, BaseDatePickerJalali as a };
|
||
//# sourceMappingURL=BaseDatePicker-L5Qgd4FF.mjs.map
|