|
1 | 1 | //! moment.js |
2 | | -//! version : 2.29.1 |
| 2 | +//! version : 2.29.4 |
3 | 3 | //! authors : Tim Wood, Iskren Chernev, Moment.js contributors |
4 | 4 | //! license : MIT |
5 | 5 | //! momentjs.com |
|
76 | 76 |
|
77 | 77 | function map(arr, fn) { |
78 | 78 | var res = [], |
79 | | - i; |
80 | | - for (i = 0; i < arr.length; ++i) { |
| 79 | + i, |
| 80 | + arrLen = arr.length; |
| 81 | + for (i = 0; i < arrLen; ++i) { |
81 | 82 | res.push(fn(arr[i], i)); |
82 | 83 | } |
83 | 84 | return res; |
|
206 | 207 | updateInProgress = false; |
207 | 208 |
|
208 | 209 | function copyConfig(to, from) { |
209 | | - var i, prop, val; |
| 210 | + var i, |
| 211 | + prop, |
| 212 | + val, |
| 213 | + momentPropertiesLen = momentProperties.length; |
210 | 214 |
|
211 | 215 | if (!isUndefined(from._isAMomentObject)) { |
212 | 216 | to._isAMomentObject = from._isAMomentObject; |
|
239 | 243 | to._locale = from._locale; |
240 | 244 | } |
241 | 245 |
|
242 | | - if (momentProperties.length > 0) { |
243 | | - for (i = 0; i < momentProperties.length; i++) { |
| 246 | + if (momentPropertiesLen > 0) { |
| 247 | + for (i = 0; i < momentPropertiesLen; i++) { |
244 | 248 | prop = momentProperties[i]; |
245 | 249 | val = from[prop]; |
246 | 250 | if (!isUndefined(val)) { |
|
295 | 299 | var args = [], |
296 | 300 | arg, |
297 | 301 | i, |
298 | | - key; |
299 | | - for (i = 0; i < arguments.length; i++) { |
| 302 | + key, |
| 303 | + argLen = arguments.length; |
| 304 | + for (i = 0; i < argLen; i++) { |
300 | 305 | arg = ''; |
301 | 306 | if (typeof arguments[i] === 'object') { |
302 | 307 | arg += '\n[' + i + '] '; |
|
446 | 451 | ); |
447 | 452 | } |
448 | 453 |
|
449 | | - 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, |
| 454 | + var formattingTokens = |
| 455 | + /(\[[^\[]*\])|(\\)?([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, |
450 | 456 | localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, |
451 | 457 | formatFunctions = {}, |
452 | 458 | formatTokenFunctions = {}; |
|
750 | 756 | if (typeof units === 'object') { |
751 | 757 | units = normalizeObjectUnits(units); |
752 | 758 | var prioritized = getPrioritizedUnits(units), |
753 | | - i; |
754 | | - for (i = 0; i < prioritized.length; i++) { |
| 759 | + i, |
| 760 | + prioritizedLen = prioritized.length; |
| 761 | + for (i = 0; i < prioritizedLen; i++) { |
755 | 762 | this[prioritized[i].unit](units[prioritized[i].unit]); |
756 | 763 | } |
757 | 764 | } else { |
|
781 | 788 | matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 |
782 | 789 | // any word (or two) characters or numbers including two/three word month in arabic. |
783 | 790 | // includes scottish gaelic two word and hyphenated months |
784 | | - matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, |
| 791 | + matchWord = |
| 792 | + /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, |
785 | 793 | regexes; |
786 | 794 |
|
787 | 795 | regexes = {}; |
|
807 | 815 | return regexEscape( |
808 | 816 | s |
809 | 817 | .replace('\\', '') |
810 | | - .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( |
811 | | - matched, |
812 | | - p1, |
813 | | - p2, |
814 | | - p3, |
815 | | - p4 |
816 | | - ) { |
817 | | - return p1 || p2 || p3 || p4; |
818 | | - }) |
| 818 | + .replace( |
| 819 | + /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, |
| 820 | + function (matched, p1, p2, p3, p4) { |
| 821 | + return p1 || p2 || p3 || p4; |
| 822 | + } |
| 823 | + ) |
819 | 824 | ); |
820 | 825 | } |
821 | 826 |
|
|
827 | 832 |
|
828 | 833 | function addParseToken(token, callback) { |
829 | 834 | var i, |
830 | | - func = callback; |
| 835 | + func = callback, |
| 836 | + tokenLen; |
831 | 837 | if (typeof token === 'string') { |
832 | 838 | token = [token]; |
833 | 839 | } |
|
836 | 842 | array[callback] = toInt(input); |
837 | 843 | }; |
838 | 844 | } |
839 | | - for (i = 0; i < token.length; i++) { |
| 845 | + tokenLen = token.length; |
| 846 | + for (i = 0; i < tokenLen; i++) { |
840 | 847 | tokens[token[i]] = func; |
841 | 848 | } |
842 | 849 | } |
|
947 | 954 |
|
948 | 955 | // LOCALES |
949 | 956 |
|
950 | | - var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( |
951 | | - '_' |
952 | | - ), |
953 | | - defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( |
954 | | - '_' |
955 | | - ), |
| 957 | + var defaultLocaleMonths = |
| 958 | + 'January_February_March_April_May_June_July_August_September_October_November_December'.split( |
| 959 | + '_' |
| 960 | + ), |
| 961 | + defaultLocaleMonthsShort = |
| 962 | + 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), |
956 | 963 | MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, |
957 | 964 | defaultMonthsShortRegex = matchWord, |
958 | 965 | defaultMonthsRegex = matchWord; |
|
1394 | 1401 | addRegexToken('W', match1to2); |
1395 | 1402 | addRegexToken('WW', match1to2, match2); |
1396 | 1403 |
|
1397 | | - addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( |
1398 | | - input, |
1399 | | - week, |
1400 | | - config, |
1401 | | - token |
1402 | | - ) { |
1403 | | - week[token.substr(0, 1)] = toInt(input); |
1404 | | - }); |
| 1404 | + addWeekParseToken( |
| 1405 | + ['w', 'ww', 'W', 'WW'], |
| 1406 | + function (input, week, config, token) { |
| 1407 | + week[token.substr(0, 1)] = toInt(input); |
| 1408 | + } |
| 1409 | + ); |
1405 | 1410 |
|
1406 | 1411 | // HELPERS |
1407 | 1412 |
|
|
1526 | 1531 | return ws.slice(n, 7).concat(ws.slice(0, n)); |
1527 | 1532 | } |
1528 | 1533 |
|
1529 | | - var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( |
1530 | | - '_' |
1531 | | - ), |
| 1534 | + var defaultLocaleWeekdays = |
| 1535 | + 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), |
1532 | 1536 | defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), |
1533 | 1537 | defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), |
1534 | 1538 | defaultWeekdaysRegex = matchWord, |
|
2076 | 2080 | return globalLocale; |
2077 | 2081 | } |
2078 | 2082 |
|
| 2083 | + function isLocaleNameSane(name) { |
| 2084 | + // Prevent names that look like filesystem paths, i.e contain '/' or '\' |
| 2085 | + return name.match('^[^/\\\\]*$') != null; |
| 2086 | + } |
| 2087 | + |
2079 | 2088 | function loadLocale(name) { |
2080 | 2089 | var oldLocale = null, |
2081 | 2090 | aliasedRequire; |
|
2084 | 2093 | locales[name] === undefined && |
2085 | 2094 | typeof module !== 'undefined' && |
2086 | 2095 | module && |
2087 | | - module.exports |
| 2096 | + module.exports && |
| 2097 | + isLocaleNameSane(name) |
2088 | 2098 | ) { |
2089 | 2099 | try { |
2090 | 2100 | oldLocale = globalLocale._abbr; |
|
2301 | 2311 |
|
2302 | 2312 | // iso 8601 regex |
2303 | 2313 | // 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) |
2304 | | - 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)?)?$/, |
2305 | | - 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)?)?$/, |
| 2314 | + var extendedIsoRegex = |
| 2315 | + /^\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)?)?$/, |
| 2316 | + basicIsoRegex = |
| 2317 | + /^\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)?)?$/, |
2306 | 2318 | tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, |
2307 | 2319 | isoDates = [ |
2308 | 2320 | ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], |
|
2333 | 2345 | ], |
2334 | 2346 | aspNetJsonRegex = /^\/?Date\((-?\d+)/i, |
2335 | 2347 | // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 |
2336 | | - 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}))$/, |
| 2348 | + rfc2822 = |
| 2349 | + /^(?:(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}))$/, |
2337 | 2350 | obsOffsets = { |
2338 | 2351 | UT: 0, |
2339 | 2352 | GMT: 0, |
|
2356 | 2369 | allowTime, |
2357 | 2370 | dateFormat, |
2358 | 2371 | timeFormat, |
2359 | | - tzFormat; |
| 2372 | + tzFormat, |
| 2373 | + isoDatesLen = isoDates.length, |
| 2374 | + isoTimesLen = isoTimes.length; |
2360 | 2375 |
|
2361 | 2376 | if (match) { |
2362 | 2377 | getParsingFlags(config).iso = true; |
2363 | | - |
2364 | | - for (i = 0, l = isoDates.length; i < l; i++) { |
| 2378 | + for (i = 0, l = isoDatesLen; i < l; i++) { |
2365 | 2379 | if (isoDates[i][1].exec(match[1])) { |
2366 | 2380 | dateFormat = isoDates[i][0]; |
2367 | 2381 | allowTime = isoDates[i][2] !== false; |
|
2373 | 2387 | return; |
2374 | 2388 | } |
2375 | 2389 | if (match[3]) { |
2376 | | - for (i = 0, l = isoTimes.length; i < l; i++) { |
| 2390 | + for (i = 0, l = isoTimesLen; i < l; i++) { |
2377 | 2391 | if (isoTimes[i][1].exec(match[3])) { |
2378 | 2392 | // match[2] should be 'T' or space |
2379 | 2393 | timeFormat = (match[2] || ' ') + isoTimes[i][0]; |
|
2440 | 2454 | function preprocessRFC2822(s) { |
2441 | 2455 | // Remove comments and folding whitespace and replace multiple-spaces with a single space |
2442 | 2456 | return s |
2443 | | - .replace(/\([^)]*\)|[\n\t]/g, ' ') |
| 2457 | + .replace(/\([^()]*\)|[\n\t]/g, ' ') |
2444 | 2458 | .replace(/(\s\s+)/g, ' ') |
2445 | 2459 | .replace(/^\s\s*/, '') |
2446 | 2460 | .replace(/\s\s*$/, ''); |
|
2753 | 2767 | skipped, |
2754 | 2768 | stringLength = string.length, |
2755 | 2769 | totalParsedInputLength = 0, |
2756 | | - era; |
| 2770 | + era, |
| 2771 | + tokenLen; |
2757 | 2772 |
|
2758 | 2773 | tokens = |
2759 | 2774 | expandFormat(config._f, config._locale).match(formattingTokens) || []; |
2760 | | - |
2761 | | - for (i = 0; i < tokens.length; i++) { |
| 2775 | + tokenLen = tokens.length; |
| 2776 | + for (i = 0; i < tokenLen; i++) { |
2762 | 2777 | token = tokens[i]; |
2763 | 2778 | parsedInput = (string.match(getParseRegexForToken(token, config)) || |
2764 | 2779 | [])[0]; |
|
2853 | 2868 | i, |
2854 | 2869 | currentScore, |
2855 | 2870 | validFormatFound, |
2856 | | - bestFormatIsValid = false; |
| 2871 | + bestFormatIsValid = false, |
| 2872 | + configfLen = config._f.length; |
2857 | 2873 |
|
2858 | | - if (config._f.length === 0) { |
| 2874 | + if (configfLen === 0) { |
2859 | 2875 | getParsingFlags(config).invalidFormat = true; |
2860 | 2876 | config._d = new Date(NaN); |
2861 | 2877 | return; |
2862 | 2878 | } |
2863 | 2879 |
|
2864 | | - for (i = 0; i < config._f.length; i++) { |
| 2880 | + for (i = 0; i < configfLen; i++) { |
2865 | 2881 | currentScore = 0; |
2866 | 2882 | validFormatFound = false; |
2867 | 2883 | tempConfig = copyConfig({}, config); |
|
3102 | 3118 | function isDurationValid(m) { |
3103 | 3119 | var key, |
3104 | 3120 | unitHasDecimal = false, |
3105 | | - i; |
| 3121 | + i, |
| 3122 | + orderLen = ordering.length; |
3106 | 3123 | for (key in m) { |
3107 | 3124 | if ( |
3108 | 3125 | hasOwnProp(m, key) && |
|
3115 | 3132 | } |
3116 | 3133 | } |
3117 | 3134 |
|
3118 | | - for (i = 0; i < ordering.length; ++i) { |
| 3135 | + for (i = 0; i < orderLen; ++i) { |
3119 | 3136 | if (m[ordering[i]]) { |
3120 | 3137 | if (unitHasDecimal) { |
3121 | 3138 | return false; // only allow non-integers for smallest unit |
|
3440 | 3457 | // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html |
3441 | 3458 | // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere |
3442 | 3459 | // and further modified to allow for strings containing both week and day |
3443 | | - isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; |
| 3460 | + isoRegex = |
| 3461 | + /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; |
3444 | 3462 |
|
3445 | 3463 | function createDuration(input, key) { |
3446 | 3464 | var duration = input, |
|
3661 | 3679 | 'ms', |
3662 | 3680 | ], |
3663 | 3681 | i, |
3664 | | - property; |
| 3682 | + property, |
| 3683 | + propertyLen = properties.length; |
3665 | 3684 |
|
3666 | | - for (i = 0; i < properties.length; i += 1) { |
| 3685 | + for (i = 0; i < propertyLen; i += 1) { |
3667 | 3686 | property = properties[i]; |
3668 | 3687 | propertyTest = propertyTest || hasOwnProp(input, property); |
3669 | 3688 | } |
|
4286 | 4305 | addRegexToken('NNNN', matchEraName); |
4287 | 4306 | addRegexToken('NNNNN', matchEraNarrow); |
4288 | 4307 |
|
4289 | | - addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( |
4290 | | - input, |
4291 | | - array, |
4292 | | - config, |
4293 | | - token |
4294 | | - ) { |
4295 | | - var era = config._locale.erasParse(input, token, config._strict); |
4296 | | - if (era) { |
4297 | | - getParsingFlags(config).era = era; |
4298 | | - } else { |
4299 | | - getParsingFlags(config).invalidEra = input; |
| 4308 | + addParseToken( |
| 4309 | + ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], |
| 4310 | + function (input, array, config, token) { |
| 4311 | + var era = config._locale.erasParse(input, token, config._strict); |
| 4312 | + if (era) { |
| 4313 | + getParsingFlags(config).era = era; |
| 4314 | + } else { |
| 4315 | + getParsingFlags(config).invalidEra = input; |
| 4316 | + } |
4300 | 4317 | } |
4301 | | - }); |
| 4318 | + ); |
4302 | 4319 |
|
4303 | 4320 | addRegexToken('y', matchUnsigned); |
4304 | 4321 | addRegexToken('yy', matchUnsigned); |
|
4590 | 4607 | addRegexToken('GGGGG', match1to6, match6); |
4591 | 4608 | addRegexToken('ggggg', match1to6, match6); |
4592 | 4609 |
|
4593 | | - addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( |
4594 | | - input, |
4595 | | - week, |
4596 | | - config, |
4597 | | - token |
4598 | | - ) { |
4599 | | - week[token.substr(0, 2)] = toInt(input); |
4600 | | - }); |
| 4610 | + addWeekParseToken( |
| 4611 | + ['gggg', 'ggggg', 'GGGG', 'GGGGG'], |
| 4612 | + function (input, week, config, token) { |
| 4613 | + week[token.substr(0, 2)] = toInt(input); |
| 4614 | + } |
| 4615 | + ); |
4601 | 4616 |
|
4602 | 4617 | addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { |
4603 | 4618 | week[token] = hooks.parseTwoDigitYear(input); |
|
5620 | 5635 |
|
5621 | 5636 | //! moment.js |
5622 | 5637 |
|
5623 | | - hooks.version = '2.29.1'; |
| 5638 | + hooks.version = '2.29.4'; |
5624 | 5639 |
|
5625 | 5640 | setHookCallback(createLocal); |
5626 | 5641 |
|
|
0 commit comments