momentjs-rails 2.17.1 → 2.20.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +1 -1
  3. data/news.md +3 -0
  4. data/test/integration/navigation_test.rb +1 -1
  5. data/vendor/assets/javascripts/moment.js +616 -382
  6. data/vendor/assets/javascripts/moment/af.js +2 -1
  7. data/vendor/assets/javascripts/moment/ar-dz.js +1 -0
  8. data/vendor/assets/javascripts/moment/ar-kw.js +60 -0
  9. data/vendor/assets/javascripts/moment/ar-ly.js +2 -1
  10. data/vendor/assets/javascripts/moment/ar-ma.js +1 -0
  11. data/vendor/assets/javascripts/moment/ar-sa.js +1 -0
  12. data/vendor/assets/javascripts/moment/ar-tn.js +1 -0
  13. data/vendor/assets/javascripts/moment/ar.js +14 -13
  14. data/vendor/assets/javascripts/moment/az.js +2 -1
  15. data/vendor/assets/javascripts/moment/be.js +2 -1
  16. data/vendor/assets/javascripts/moment/bg.js +2 -1
  17. data/vendor/assets/javascripts/moment/bm.js +60 -0
  18. data/vendor/assets/javascripts/moment/bn.js +1 -0
  19. data/vendor/assets/javascripts/moment/bo.js +1 -0
  20. data/vendor/assets/javascripts/moment/br.js +2 -1
  21. data/vendor/assets/javascripts/moment/bs.js +11 -1
  22. data/vendor/assets/javascripts/moment/ca.js +15 -7
  23. data/vendor/assets/javascripts/moment/cs.js +9 -1
  24. data/vendor/assets/javascripts/moment/cv.js +2 -1
  25. data/vendor/assets/javascripts/moment/cy.js +2 -1
  26. data/vendor/assets/javascripts/moment/da.js +9 -8
  27. data/vendor/assets/javascripts/moment/de-at.js +3 -2
  28. data/vendor/assets/javascripts/moment/de-ch.js +79 -0
  29. data/vendor/assets/javascripts/moment/de.js +3 -2
  30. data/vendor/assets/javascripts/moment/dv.js +1 -0
  31. data/vendor/assets/javascripts/moment/el.js +5 -2
  32. data/vendor/assets/javascripts/moment/en-au.js +2 -1
  33. data/vendor/assets/javascripts/moment/en-ca.js +2 -1
  34. data/vendor/assets/javascripts/moment/en-gb.js +2 -1
  35. data/vendor/assets/javascripts/moment/en-ie.js +2 -1
  36. data/vendor/assets/javascripts/moment/en-nz.js +2 -1
  37. data/vendor/assets/javascripts/moment/eo.js +11 -10
  38. data/vendor/assets/javascripts/moment/es-do.js +15 -3
  39. data/vendor/assets/javascripts/moment/es-us.js +84 -0
  40. data/vendor/assets/javascripts/moment/es.js +15 -3
  41. data/vendor/assets/javascripts/moment/et.js +3 -1
  42. data/vendor/assets/javascripts/moment/eu.js +2 -1
  43. data/vendor/assets/javascripts/moment/fa.js +3 -2
  44. data/vendor/assets/javascripts/moment/fi.js +4 -1
  45. data/vendor/assets/javascripts/moment/fo.js +2 -1
  46. data/vendor/assets/javascripts/moment/fr-ca.js +25 -10
  47. data/vendor/assets/javascripts/moment/fr-ch.js +25 -10
  48. data/vendor/assets/javascripts/moment/fr.js +30 -10
  49. data/vendor/assets/javascripts/moment/fy.js +5 -2
  50. data/vendor/assets/javascripts/moment/gd.js +2 -1
  51. data/vendor/assets/javascripts/moment/gl.js +2 -1
  52. data/vendor/assets/javascripts/moment/gom-latn.js +124 -0
  53. data/vendor/assets/javascripts/moment/gu.js +125 -0
  54. data/vendor/assets/javascripts/moment/he.js +1 -0
  55. data/vendor/assets/javascripts/moment/hi.js +1 -0
  56. data/vendor/assets/javascripts/moment/hr.js +11 -1
  57. data/vendor/assets/javascripts/moment/hu.js +5 -3
  58. data/vendor/assets/javascripts/moment/hy-am.js +2 -1
  59. data/vendor/assets/javascripts/moment/id.js +1 -0
  60. data/vendor/assets/javascripts/moment/is.js +7 -1
  61. data/vendor/assets/javascripts/moment/it.js +6 -5
  62. data/vendor/assets/javascripts/moment/ja.js +10 -5
  63. data/vendor/assets/javascripts/moment/jv.js +1 -0
  64. data/vendor/assets/javascripts/moment/ka.js +4 -3
  65. data/vendor/assets/javascripts/moment/kk.js +2 -1
  66. data/vendor/assets/javascripts/moment/km.js +1 -0
  67. data/vendor/assets/javascripts/moment/kn.js +127 -0
  68. data/vendor/assets/javascripts/moment/ko.js +25 -7
  69. data/vendor/assets/javascripts/moment/ky.js +2 -1
  70. data/vendor/assets/javascripts/moment/lb.js +2 -1
  71. data/vendor/assets/javascripts/moment/lo.js +2 -1
  72. data/vendor/assets/javascripts/moment/lt.js +3 -1
  73. data/vendor/assets/javascripts/moment/lv.js +3 -1
  74. data/vendor/assets/javascripts/moment/me.js +3 -1
  75. data/vendor/assets/javascripts/moment/mi.js +2 -1
  76. data/vendor/assets/javascripts/moment/mk.js +2 -1
  77. data/vendor/assets/javascripts/moment/ml.js +1 -0
  78. data/vendor/assets/javascripts/moment/mr.js +3 -0
  79. data/vendor/assets/javascripts/moment/ms-my.js +1 -0
  80. data/vendor/assets/javascripts/moment/ms.js +1 -0
  81. data/vendor/assets/javascripts/moment/mt.js +61 -0
  82. data/vendor/assets/javascripts/moment/my.js +1 -0
  83. data/vendor/assets/javascripts/moment/nb.js +2 -1
  84. data/vendor/assets/javascripts/moment/ne.js +1 -0
  85. data/vendor/assets/javascripts/moment/nl-be.js +6 -3
  86. data/vendor/assets/javascripts/moment/nl.js +6 -3
  87. data/vendor/assets/javascripts/moment/nn.js +2 -1
  88. data/vendor/assets/javascripts/moment/pa-in.js +1 -0
  89. data/vendor/assets/javascripts/moment/pl.js +25 -3
  90. data/vendor/assets/javascripts/moment/pt-br.js +5 -4
  91. data/vendor/assets/javascripts/moment/pt.js +6 -5
  92. data/vendor/assets/javascripts/moment/ro.js +2 -0
  93. data/vendor/assets/javascripts/moment/ru.js +8 -6
  94. data/vendor/assets/javascripts/moment/sd.js +99 -0
  95. data/vendor/assets/javascripts/moment/se.js +2 -1
  96. data/vendor/assets/javascripts/moment/si.js +2 -1
  97. data/vendor/assets/javascripts/moment/sk.js +9 -1
  98. data/vendor/assets/javascripts/moment/sl.js +13 -1
  99. data/vendor/assets/javascripts/moment/sq.js +2 -1
  100. data/vendor/assets/javascripts/moment/sr-cyrl.js +3 -1
  101. data/vendor/assets/javascripts/moment/sr.js +3 -1
  102. data/vendor/assets/javascripts/moment/ss.js +2 -1
  103. data/vendor/assets/javascripts/moment/sv.js +2 -1
  104. data/vendor/assets/javascripts/moment/sw.js +1 -0
  105. data/vendor/assets/javascripts/moment/ta.js +2 -1
  106. data/vendor/assets/javascripts/moment/te.js +2 -1
  107. data/vendor/assets/javascripts/moment/tet.js +2 -1
  108. data/vendor/assets/javascripts/moment/th.js +2 -1
  109. data/vendor/assets/javascripts/moment/tl-ph.js +2 -1
  110. data/vendor/assets/javascripts/moment/tlh.js +4 -1
  111. data/vendor/assets/javascripts/moment/tr.js +4 -3
  112. data/vendor/assets/javascripts/moment/tzl.js +3 -1
  113. data/vendor/assets/javascripts/moment/tzm-latn.js +1 -0
  114. data/vendor/assets/javascripts/moment/tzm.js +1 -0
  115. data/vendor/assets/javascripts/moment/uk.js +10 -3
  116. data/vendor/assets/javascripts/moment/ur.js +100 -0
  117. data/vendor/assets/javascripts/moment/uz-latn.js +59 -0
  118. data/vendor/assets/javascripts/moment/uz.js +1 -0
  119. data/vendor/assets/javascripts/moment/vi.js +2 -1
  120. data/vendor/assets/javascripts/moment/x-pseudo.js +2 -1
  121. data/vendor/assets/javascripts/moment/yo.js +2 -1
  122. data/vendor/assets/javascripts/moment/zh-cn.js +18 -33
  123. data/vendor/assets/javascripts/moment/zh-hk.js +12 -11
  124. data/vendor/assets/javascripts/moment/zh-tw.js +12 -11
  125. metadata +25 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: be5ccb55eec06675131fd72a57d3eaf5cea824da
4
- data.tar.gz: a1843e5d3254988e3dbb1f923b0a47bfb7b26eac
2
+ SHA256:
3
+ metadata.gz: a3de3d0bd118bca7104b63a2dd3e429d57c21842dbbfed8d902ee96e59b29316
4
+ data.tar.gz: abf7bd2b333d676c3e9a7bcc3467160c417cc7e56d48b4a45e169143dd4fc618
5
5
  SHA512:
6
- metadata.gz: 9d2ebd66515c51ae1327fc141cc90fadd78c226102b42f77c7a5991a201db7b52cbb7406c5cbea80721e03be20bac9da91eea96779b29bec2321b1cb3296c227
7
- data.tar.gz: 1b904b5e16332a0d7d4501192b56f6fa18303079302cff3901043e6ed8e4d83e0c5d5849ce10b0f40a39fa6bd8f6bcb6fdad2466ba427661b86fcf06c93553c5
6
+ metadata.gz: 308b133e705b60ccf10c56a3f4fa4fbc1d32ac31f9f414e6709694e56c4f7b659067911a56ee6bae5c2dcedab0bfd4c0647a945b5cc2dea86ad5e8d39b4c84f1
7
+ data.tar.gz: 9d0d8cf3c344648890bd4145d47622c39b1c2d2c3f27f879c8beec2fa2e6ed55319ca70438dfc6c49bd70154203831fe7b5482a1aaaee88675d3d61973e5d3c0
data/README.md CHANGED
@@ -26,7 +26,7 @@ If you want to include a localization file, also add the following directive:
26
26
 
27
27
  ## Versioning
28
28
 
29
- momentjs-rails 2.17.1 == Moment.js 2.17.1
29
+ momentjs-rails 2.20.1 == Moment.js 2.20.1
30
30
 
31
31
  Every attempt is made to mirror the currently shipping Moment.js version number
32
32
  wherever possible. The major, minor, and patch version numbers will always
data/news.md CHANGED
@@ -1,3 +1,6 @@
1
+ ### Version 2.20.1 (2018-03-22)
2
+ - Updated Moment.js to 2.20.1
3
+
1
4
  ### Version 2.17.1 (2017-01-15)
2
5
  - Updated Moment.js to 2.17.1
3
6
 
@@ -8,7 +8,7 @@ class NavigationTest < ActionDispatch::IntegrationTest
8
8
 
9
9
  test 'momentjs response is for the expected version' do
10
10
  get '/assets/moment.js'
11
- assert_match(/hooks.version = '2\.17\.1'/, @response.body)
11
+ assert_match(/hooks.version = '2\.20\.1'/, @response.body)
12
12
  end
13
13
 
14
14
  test 'can access momentjs translation' do
@@ -1,5 +1,5 @@
1
1
  //! moment.js
2
- //! version : 2.17.1
2
+ //! version : 2.20.1
3
3
  //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
4
4
  //! license : MIT
5
5
  //! momentjs.com
@@ -33,12 +33,21 @@ function isObject(input) {
33
33
  }
34
34
 
35
35
  function isObjectEmpty(obj) {
36
- var k;
37
- for (k in obj) {
38
- // even if its not own property I'd still call it non-empty
39
- return false;
36
+ if (Object.getOwnPropertyNames) {
37
+ return (Object.getOwnPropertyNames(obj).length === 0);
38
+ } else {
39
+ var k;
40
+ for (k in obj) {
41
+ if (obj.hasOwnProperty(k)) {
42
+ return false;
43
+ }
44
+ }
45
+ return true;
40
46
  }
41
- return true;
47
+ }
48
+
49
+ function isUndefined(input) {
50
+ return input === void 0;
42
51
  }
43
52
 
44
53
  function isNumber(input) {
@@ -97,7 +106,9 @@ function defaultParsingFlags() {
97
106
  userInvalidated : false,
98
107
  iso : false,
99
108
  parsedDateParts : [],
100
- meridiem : null
109
+ meridiem : null,
110
+ rfc2822 : false,
111
+ weekdayMismatch : false
101
112
  };
102
113
  }
103
114
 
@@ -126,12 +137,10 @@ if (Array.prototype.some) {
126
137
  };
127
138
  }
128
139
 
129
- var some$1 = some;
130
-
131
140
  function isValid(m) {
132
141
  if (m._isValid == null) {
133
142
  var flags = getParsingFlags(m);
134
- var parsedParts = some$1.call(flags.parsedDateParts, function (i) {
143
+ var parsedParts = some.call(flags.parsedDateParts, function (i) {
135
144
  return i != null;
136
145
  });
137
146
  var isNowValid = !isNaN(m._d.getTime()) &&
@@ -139,6 +148,7 @@ function isValid(m) {
139
148
  !flags.empty &&
140
149
  !flags.invalidMonth &&
141
150
  !flags.invalidWeekday &&
151
+ !flags.weekdayMismatch &&
142
152
  !flags.nullInput &&
143
153
  !flags.invalidFormat &&
144
154
  !flags.userInvalidated &&
@@ -173,10 +183,6 @@ function createInvalid (flags) {
173
183
  return m;
174
184
  }
175
185
 
176
- function isUndefined(input) {
177
- return input === void 0;
178
- }
179
-
180
186
  // Plugins that add properties should also add the key here (null value),
181
187
  // so we can properly clone ourselves.
182
188
  var momentProperties = hooks.momentProperties = [];
@@ -216,7 +222,7 @@ function copyConfig(to, from) {
216
222
  }
217
223
 
218
224
  if (momentProperties.length > 0) {
219
- for (i in momentProperties) {
225
+ for (i = 0; i < momentProperties.length; i++) {
220
226
  prop = momentProperties[i];
221
227
  val = from[prop];
222
228
  if (!isUndefined(val)) {
@@ -353,8 +359,11 @@ function set (config) {
353
359
  }
354
360
  this._config = config;
355
361
  // Lenient ordinal parsing accepts just a number in addition to
356
- // number + (possibly) stuff coming from _ordinalParseLenient.
357
- this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\d{1,2}/).source);
362
+ // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
363
+ // TODO: Remove "ordinalParse" fallback in next major release.
364
+ this._dayOfMonthOrdinalParseLenient = new RegExp(
365
+ (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
366
+ '|' + (/\d{1,2}/).source);
358
367
  }
359
368
 
360
369
  function mergeConfigs(parentConfig, childConfig) {
@@ -405,8 +414,6 @@ if (Object.keys) {
405
414
  };
406
415
  }
407
416
 
408
- var keys$1 = keys;
409
-
410
417
  var defaultCalendar = {
411
418
  sameDay : '[Today at] LT',
412
419
  nextDay : '[Tomorrow at] LT',
@@ -452,7 +459,7 @@ function invalidDate () {
452
459
  }
453
460
 
454
461
  var defaultOrdinal = '%d';
455
- var defaultOrdinalParse = /\d{1,2}/;
462
+ var defaultDayOfMonthOrdinalParse = /\d{1,2}/;
456
463
 
457
464
  function ordinal (number) {
458
465
  return this._ordinal.replace('%d', number);
@@ -462,6 +469,7 @@ var defaultRelativeTime = {
462
469
  future : 'in %s',
463
470
  past : '%s ago',
464
471
  s : 'a few seconds',
472
+ ss : '%d seconds',
465
473
  m : 'a minute',
466
474
  mm : '%d minutes',
467
475
  h : 'an hour',
@@ -531,56 +539,6 @@ function getPrioritizedUnits(unitsObj) {
531
539
  return units;
532
540
  }
533
541
 
534
- function makeGetSet (unit, keepTime) {
535
- return function (value) {
536
- if (value != null) {
537
- set$1(this, unit, value);
538
- hooks.updateOffset(this, keepTime);
539
- return this;
540
- } else {
541
- return get(this, unit);
542
- }
543
- };
544
- }
545
-
546
- function get (mom, unit) {
547
- return mom.isValid() ?
548
- mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
549
- }
550
-
551
- function set$1 (mom, unit, value) {
552
- if (mom.isValid()) {
553
- mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
554
- }
555
- }
556
-
557
- // MOMENTS
558
-
559
- function stringGet (units) {
560
- units = normalizeUnits(units);
561
- if (isFunction(this[units])) {
562
- return this[units]();
563
- }
564
- return this;
565
- }
566
-
567
-
568
- function stringSet (units, value) {
569
- if (typeof units === 'object') {
570
- units = normalizeObjectUnits(units);
571
- var prioritized = getPrioritizedUnits(units);
572
- for (var i = 0; i < prioritized.length; i++) {
573
- this[prioritized[i].unit](units[prioritized[i].unit]);
574
- }
575
- } else {
576
- units = normalizeUnits(units);
577
- if (isFunction(this[units])) {
578
- return this[units](value);
579
- }
580
- }
581
- return this;
582
- }
583
-
584
542
  function zeroFill(number, targetLength, forceSign) {
585
543
  var absNumber = '' + Math.abs(number),
586
544
  zerosToFill = targetLength - absNumber.length,
@@ -644,7 +602,7 @@ function makeFormatFunction(format) {
644
602
  return function (mom) {
645
603
  var output = '', i;
646
604
  for (i = 0; i < length; i++) {
647
- output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
605
+ output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
648
606
  }
649
607
  return output;
650
608
  };
@@ -701,7 +659,7 @@ var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
701
659
 
702
660
  // any word (or two) characters or numbers including two/three word month in arabic.
703
661
  // includes scottish gaelic two word and hyphenated months
704
- var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
662
+ var 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;
705
663
 
706
664
 
707
665
  var regexes = {};
@@ -771,6 +729,131 @@ var MILLISECOND = 6;
771
729
  var WEEK = 7;
772
730
  var WEEKDAY = 8;
773
731
 
732
+ // FORMATTING
733
+
734
+ addFormatToken('Y', 0, 0, function () {
735
+ var y = this.year();
736
+ return y <= 9999 ? '' + y : '+' + y;
737
+ });
738
+
739
+ addFormatToken(0, ['YY', 2], 0, function () {
740
+ return this.year() % 100;
741
+ });
742
+
743
+ addFormatToken(0, ['YYYY', 4], 0, 'year');
744
+ addFormatToken(0, ['YYYYY', 5], 0, 'year');
745
+ addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
746
+
747
+ // ALIASES
748
+
749
+ addUnitAlias('year', 'y');
750
+
751
+ // PRIORITIES
752
+
753
+ addUnitPriority('year', 1);
754
+
755
+ // PARSING
756
+
757
+ addRegexToken('Y', matchSigned);
758
+ addRegexToken('YY', match1to2, match2);
759
+ addRegexToken('YYYY', match1to4, match4);
760
+ addRegexToken('YYYYY', match1to6, match6);
761
+ addRegexToken('YYYYYY', match1to6, match6);
762
+
763
+ addParseToken(['YYYYY', 'YYYYYY'], YEAR);
764
+ addParseToken('YYYY', function (input, array) {
765
+ array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
766
+ });
767
+ addParseToken('YY', function (input, array) {
768
+ array[YEAR] = hooks.parseTwoDigitYear(input);
769
+ });
770
+ addParseToken('Y', function (input, array) {
771
+ array[YEAR] = parseInt(input, 10);
772
+ });
773
+
774
+ // HELPERS
775
+
776
+ function daysInYear(year) {
777
+ return isLeapYear(year) ? 366 : 365;
778
+ }
779
+
780
+ function isLeapYear(year) {
781
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
782
+ }
783
+
784
+ // HOOKS
785
+
786
+ hooks.parseTwoDigitYear = function (input) {
787
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
788
+ };
789
+
790
+ // MOMENTS
791
+
792
+ var getSetYear = makeGetSet('FullYear', true);
793
+
794
+ function getIsLeapYear () {
795
+ return isLeapYear(this.year());
796
+ }
797
+
798
+ function makeGetSet (unit, keepTime) {
799
+ return function (value) {
800
+ if (value != null) {
801
+ set$1(this, unit, value);
802
+ hooks.updateOffset(this, keepTime);
803
+ return this;
804
+ } else {
805
+ return get(this, unit);
806
+ }
807
+ };
808
+ }
809
+
810
+ function get (mom, unit) {
811
+ return mom.isValid() ?
812
+ mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
813
+ }
814
+
815
+ function set$1 (mom, unit, value) {
816
+ if (mom.isValid() && !isNaN(value)) {
817
+ if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
818
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
819
+ }
820
+ else {
821
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
822
+ }
823
+ }
824
+ }
825
+
826
+ // MOMENTS
827
+
828
+ function stringGet (units) {
829
+ units = normalizeUnits(units);
830
+ if (isFunction(this[units])) {
831
+ return this[units]();
832
+ }
833
+ return this;
834
+ }
835
+
836
+
837
+ function stringSet (units, value) {
838
+ if (typeof units === 'object') {
839
+ units = normalizeObjectUnits(units);
840
+ var prioritized = getPrioritizedUnits(units);
841
+ for (var i = 0; i < prioritized.length; i++) {
842
+ this[prioritized[i].unit](units[prioritized[i].unit]);
843
+ }
844
+ } else {
845
+ units = normalizeUnits(units);
846
+ if (isFunction(this[units])) {
847
+ return this[units](value);
848
+ }
849
+ }
850
+ return this;
851
+ }
852
+
853
+ function mod(n, x) {
854
+ return ((n % x) + x) % x;
855
+ }
856
+
774
857
  var indexOf;
775
858
 
776
859
  if (Array.prototype.indexOf) {
@@ -788,10 +871,13 @@ if (Array.prototype.indexOf) {
788
871
  };
789
872
  }
790
873
 
791
- var indexOf$1 = indexOf;
792
-
793
874
  function daysInMonth(year, month) {
794
- return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
875
+ if (isNaN(year) || isNaN(month)) {
876
+ return NaN;
877
+ }
878
+ var modMonth = mod(month, 12);
879
+ year += (month - modMonth) / 12;
880
+ return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
795
881
  }
796
882
 
797
883
  // FORMATTING
@@ -847,7 +933,8 @@ var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
847
933
  var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
848
934
  function localeMonths (m, format) {
849
935
  if (!m) {
850
- return this._months;
936
+ return isArray(this._months) ? this._months :
937
+ this._months['standalone'];
851
938
  }
852
939
  return isArray(this._months) ? this._months[m.month()] :
853
940
  this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
@@ -856,7 +943,8 @@ function localeMonths (m, format) {
856
943
  var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
857
944
  function localeMonthsShort (m, format) {
858
945
  if (!m) {
859
- return this._monthsShort;
946
+ return isArray(this._monthsShort) ? this._monthsShort :
947
+ this._monthsShort['standalone'];
860
948
  }
861
949
  return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
862
950
  this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
@@ -878,26 +966,26 @@ function handleStrictParse(monthName, format, strict) {
878
966
 
879
967
  if (strict) {
880
968
  if (format === 'MMM') {
881
- ii = indexOf$1.call(this._shortMonthsParse, llc);
969
+ ii = indexOf.call(this._shortMonthsParse, llc);
882
970
  return ii !== -1 ? ii : null;
883
971
  } else {
884
- ii = indexOf$1.call(this._longMonthsParse, llc);
972
+ ii = indexOf.call(this._longMonthsParse, llc);
885
973
  return ii !== -1 ? ii : null;
886
974
  }
887
975
  } else {
888
976
  if (format === 'MMM') {
889
- ii = indexOf$1.call(this._shortMonthsParse, llc);
977
+ ii = indexOf.call(this._shortMonthsParse, llc);
890
978
  if (ii !== -1) {
891
979
  return ii;
892
980
  }
893
- ii = indexOf$1.call(this._longMonthsParse, llc);
981
+ ii = indexOf.call(this._longMonthsParse, llc);
894
982
  return ii !== -1 ? ii : null;
895
983
  } else {
896
- ii = indexOf$1.call(this._longMonthsParse, llc);
984
+ ii = indexOf.call(this._longMonthsParse, llc);
897
985
  if (ii !== -1) {
898
986
  return ii;
899
987
  }
900
- ii = indexOf$1.call(this._shortMonthsParse, llc);
988
+ ii = indexOf.call(this._shortMonthsParse, llc);
901
989
  return ii !== -1 ? ii : null;
902
990
  }
903
991
  }
@@ -1056,78 +1144,12 @@ function computeMonthsParse () {
1056
1144
  this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
1057
1145
  }
1058
1146
 
1059
- // FORMATTING
1060
-
1061
- addFormatToken('Y', 0, 0, function () {
1062
- var y = this.year();
1063
- return y <= 9999 ? '' + y : '+' + y;
1064
- });
1065
-
1066
- addFormatToken(0, ['YY', 2], 0, function () {
1067
- return this.year() % 100;
1068
- });
1069
-
1070
- addFormatToken(0, ['YYYY', 4], 0, 'year');
1071
- addFormatToken(0, ['YYYYY', 5], 0, 'year');
1072
- addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
1073
-
1074
- // ALIASES
1075
-
1076
- addUnitAlias('year', 'y');
1077
-
1078
- // PRIORITIES
1079
-
1080
- addUnitPriority('year', 1);
1081
-
1082
- // PARSING
1083
-
1084
- addRegexToken('Y', matchSigned);
1085
- addRegexToken('YY', match1to2, match2);
1086
- addRegexToken('YYYY', match1to4, match4);
1087
- addRegexToken('YYYYY', match1to6, match6);
1088
- addRegexToken('YYYYYY', match1to6, match6);
1089
-
1090
- addParseToken(['YYYYY', 'YYYYYY'], YEAR);
1091
- addParseToken('YYYY', function (input, array) {
1092
- array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
1093
- });
1094
- addParseToken('YY', function (input, array) {
1095
- array[YEAR] = hooks.parseTwoDigitYear(input);
1096
- });
1097
- addParseToken('Y', function (input, array) {
1098
- array[YEAR] = parseInt(input, 10);
1099
- });
1100
-
1101
- // HELPERS
1102
-
1103
- function daysInYear(year) {
1104
- return isLeapYear(year) ? 366 : 365;
1105
- }
1106
-
1107
- function isLeapYear(year) {
1108
- return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
1109
- }
1110
-
1111
- // HOOKS
1112
-
1113
- hooks.parseTwoDigitYear = function (input) {
1114
- return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
1115
- };
1116
-
1117
- // MOMENTS
1118
-
1119
- var getSetYear = makeGetSet('FullYear', true);
1120
-
1121
- function getIsLeapYear () {
1122
- return isLeapYear(this.year());
1123
- }
1124
-
1125
1147
  function createDate (y, m, d, h, M, s, ms) {
1126
- //can't just apply() to create a date:
1127
- //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
1148
+ // can't just apply() to create a date:
1149
+ // https://stackoverflow.com/q/181348
1128
1150
  var date = new Date(y, m, d, h, M, s, ms);
1129
1151
 
1130
- //the date constructor remaps years 0-99 to 1900-1999
1152
+ // the date constructor remaps years 0-99 to 1900-1999
1131
1153
  if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
1132
1154
  date.setFullYear(y);
1133
1155
  }
@@ -1137,7 +1159,7 @@ function createDate (y, m, d, h, M, s, ms) {
1137
1159
  function createUTCDate (y) {
1138
1160
  var date = new Date(Date.UTC.apply(null, arguments));
1139
1161
 
1140
- //the Date.UTC function remaps years 0-99 to 1900-1999
1162
+ // the Date.UTC function remaps years 0-99 to 1900-1999
1141
1163
  if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
1142
1164
  date.setUTCFullYear(y);
1143
1165
  }
@@ -1154,7 +1176,7 @@ function firstWeekOffset(year, dow, doy) {
1154
1176
  return -fwdlw + fwd - 1;
1155
1177
  }
1156
1178
 
1157
- //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
1179
+ // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
1158
1180
  function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
1159
1181
  var localWeekday = (7 + weekday - dow) % 7,
1160
1182
  weekOffset = firstWeekOffset(year, dow, doy),
@@ -1355,7 +1377,8 @@ function parseIsoWeekday(input, locale) {
1355
1377
  var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
1356
1378
  function localeWeekdays (m, format) {
1357
1379
  if (!m) {
1358
- return this._weekdays;
1380
+ return isArray(this._weekdays) ? this._weekdays :
1381
+ this._weekdays['standalone'];
1359
1382
  }
1360
1383
  return isArray(this._weekdays) ? this._weekdays[m.day()] :
1361
1384
  this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
@@ -1388,48 +1411,48 @@ function handleStrictParse$1(weekdayName, format, strict) {
1388
1411
 
1389
1412
  if (strict) {
1390
1413
  if (format === 'dddd') {
1391
- ii = indexOf$1.call(this._weekdaysParse, llc);
1414
+ ii = indexOf.call(this._weekdaysParse, llc);
1392
1415
  return ii !== -1 ? ii : null;
1393
1416
  } else if (format === 'ddd') {
1394
- ii = indexOf$1.call(this._shortWeekdaysParse, llc);
1417
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1395
1418
  return ii !== -1 ? ii : null;
1396
1419
  } else {
1397
- ii = indexOf$1.call(this._minWeekdaysParse, llc);
1420
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1398
1421
  return ii !== -1 ? ii : null;
1399
1422
  }
1400
1423
  } else {
1401
1424
  if (format === 'dddd') {
1402
- ii = indexOf$1.call(this._weekdaysParse, llc);
1425
+ ii = indexOf.call(this._weekdaysParse, llc);
1403
1426
  if (ii !== -1) {
1404
1427
  return ii;
1405
1428
  }
1406
- ii = indexOf$1.call(this._shortWeekdaysParse, llc);
1429
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1407
1430
  if (ii !== -1) {
1408
1431
  return ii;
1409
1432
  }
1410
- ii = indexOf$1.call(this._minWeekdaysParse, llc);
1433
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1411
1434
  return ii !== -1 ? ii : null;
1412
1435
  } else if (format === 'ddd') {
1413
- ii = indexOf$1.call(this._shortWeekdaysParse, llc);
1436
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1414
1437
  if (ii !== -1) {
1415
1438
  return ii;
1416
1439
  }
1417
- ii = indexOf$1.call(this._weekdaysParse, llc);
1440
+ ii = indexOf.call(this._weekdaysParse, llc);
1418
1441
  if (ii !== -1) {
1419
1442
  return ii;
1420
1443
  }
1421
- ii = indexOf$1.call(this._minWeekdaysParse, llc);
1444
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1422
1445
  return ii !== -1 ? ii : null;
1423
1446
  } else {
1424
- ii = indexOf$1.call(this._minWeekdaysParse, llc);
1447
+ ii = indexOf.call(this._minWeekdaysParse, llc);
1425
1448
  if (ii !== -1) {
1426
1449
  return ii;
1427
1450
  }
1428
- ii = indexOf$1.call(this._weekdaysParse, llc);
1451
+ ii = indexOf.call(this._weekdaysParse, llc);
1429
1452
  if (ii !== -1) {
1430
1453
  return ii;
1431
1454
  }
1432
- ii = indexOf$1.call(this._shortWeekdaysParse, llc);
1455
+ ii = indexOf.call(this._shortWeekdaysParse, llc);
1433
1456
  return ii !== -1 ? ii : null;
1434
1457
  }
1435
1458
  }
@@ -1675,8 +1698,10 @@ addRegexToken('a', matchMeridiem);
1675
1698
  addRegexToken('A', matchMeridiem);
1676
1699
  addRegexToken('H', match1to2);
1677
1700
  addRegexToken('h', match1to2);
1701
+ addRegexToken('k', match1to2);
1678
1702
  addRegexToken('HH', match1to2, match2);
1679
1703
  addRegexToken('hh', match1to2, match2);
1704
+ addRegexToken('kk', match1to2, match2);
1680
1705
 
1681
1706
  addRegexToken('hmm', match3to4);
1682
1707
  addRegexToken('hmmss', match5to6);
@@ -1684,6 +1709,10 @@ addRegexToken('Hmm', match3to4);
1684
1709
  addRegexToken('Hmmss', match5to6);
1685
1710
 
1686
1711
  addParseToken(['H', 'HH'], HOUR);
1712
+ addParseToken(['k', 'kk'], function (input, array, config) {
1713
+ var kInput = toInt(input);
1714
+ array[HOUR] = kInput === 24 ? 0 : kInput;
1715
+ });
1687
1716
  addParseToken(['a', 'A'], function (input, array, config) {
1688
1717
  config._isPm = config._locale.isPM(input);
1689
1718
  config._meridiem = input;
@@ -1754,7 +1783,7 @@ var baseConfig = {
1754
1783
  longDateFormat: defaultLongDateFormat,
1755
1784
  invalidDate: defaultInvalidDate,
1756
1785
  ordinal: defaultOrdinal,
1757
- ordinalParse: defaultOrdinalParse,
1786
+ dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
1758
1787
  relativeTime: defaultRelativeTime,
1759
1788
 
1760
1789
  months: defaultLocaleMonths,
@@ -1812,11 +1841,10 @@ function loadLocale(name) {
1812
1841
  module && module.exports) {
1813
1842
  try {
1814
1843
  oldLocale = globalLocale._abbr;
1815
- require('./locale/' + name);
1816
- // because defineLocale currently also sets the global locale, we
1817
- // want to undo that for lazy loaded locales
1844
+ var aliasedRequire = require;
1845
+ aliasedRequire('./locale/' + name);
1818
1846
  getSetGlobalLocale(oldLocale);
1819
- } catch (e) { }
1847
+ } catch (e) {}
1820
1848
  }
1821
1849
  return locales[name];
1822
1850
  }
@@ -1892,10 +1920,11 @@ function defineLocale (name, config) {
1892
1920
 
1893
1921
  function updateLocale(name, config) {
1894
1922
  if (config != null) {
1895
- var locale, parentConfig = baseConfig;
1923
+ var locale, tmpLocale, parentConfig = baseConfig;
1896
1924
  // MERGE
1897
- if (locales[name] != null) {
1898
- parentConfig = locales[name]._config;
1925
+ tmpLocale = loadLocale(name);
1926
+ if (tmpLocale != null) {
1927
+ parentConfig = tmpLocale._config;
1899
1928
  }
1900
1929
  config = mergeConfigs(parentConfig, config);
1901
1930
  locale = new Locale(config);
@@ -1942,7 +1971,7 @@ function getLocale (key) {
1942
1971
  }
1943
1972
 
1944
1973
  function listLocales() {
1945
- return keys$1(locales);
1974
+ return keys(locales);
1946
1975
  }
1947
1976
 
1948
1977
  function checkOverflow (m) {
@@ -1953,144 +1982,28 @@ function checkOverflow (m) {
1953
1982
  overflow =
1954
1983
  a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
1955
1984
  a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
1956
- a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
1957
- a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
1958
- a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
1959
- a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
1960
- -1;
1961
-
1962
- if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
1963
- overflow = DATE;
1964
- }
1965
- if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
1966
- overflow = WEEK;
1967
- }
1968
- if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
1969
- overflow = WEEKDAY;
1970
- }
1971
-
1972
- getParsingFlags(m).overflow = overflow;
1973
- }
1974
-
1975
- return m;
1976
- }
1977
-
1978
- // iso 8601 regex
1979
- // 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)
1980
- 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)?)?$/;
1981
- var 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)?)?$/;
1982
-
1983
- var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
1984
-
1985
- var isoDates = [
1986
- ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
1987
- ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
1988
- ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
1989
- ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
1990
- ['YYYY-DDD', /\d{4}-\d{3}/],
1991
- ['YYYY-MM', /\d{4}-\d\d/, false],
1992
- ['YYYYYYMMDD', /[+-]\d{10}/],
1993
- ['YYYYMMDD', /\d{8}/],
1994
- // YYYYMM is NOT allowed by the standard
1995
- ['GGGG[W]WWE', /\d{4}W\d{3}/],
1996
- ['GGGG[W]WW', /\d{4}W\d{2}/, false],
1997
- ['YYYYDDD', /\d{7}/]
1998
- ];
1999
-
2000
- // iso time formats and regexes
2001
- var isoTimes = [
2002
- ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
2003
- ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
2004
- ['HH:mm:ss', /\d\d:\d\d:\d\d/],
2005
- ['HH:mm', /\d\d:\d\d/],
2006
- ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
2007
- ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
2008
- ['HHmmss', /\d\d\d\d\d\d/],
2009
- ['HHmm', /\d\d\d\d/],
2010
- ['HH', /\d\d/]
2011
- ];
2012
-
2013
- var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
2014
-
2015
- // date from iso format
2016
- function configFromISO(config) {
2017
- var i, l,
2018
- string = config._i,
2019
- match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
2020
- allowTime, dateFormat, timeFormat, tzFormat;
2021
-
2022
- if (match) {
2023
- getParsingFlags(config).iso = true;
2024
-
2025
- for (i = 0, l = isoDates.length; i < l; i++) {
2026
- if (isoDates[i][1].exec(match[1])) {
2027
- dateFormat = isoDates[i][0];
2028
- allowTime = isoDates[i][2] !== false;
2029
- break;
2030
- }
2031
- }
2032
- if (dateFormat == null) {
2033
- config._isValid = false;
2034
- return;
2035
- }
2036
- if (match[3]) {
2037
- for (i = 0, l = isoTimes.length; i < l; i++) {
2038
- if (isoTimes[i][1].exec(match[3])) {
2039
- // match[2] should be 'T' or space
2040
- timeFormat = (match[2] || ' ') + isoTimes[i][0];
2041
- break;
2042
- }
2043
- }
2044
- if (timeFormat == null) {
2045
- config._isValid = false;
2046
- return;
2047
- }
2048
- }
2049
- if (!allowTime && timeFormat != null) {
2050
- config._isValid = false;
2051
- return;
2052
- }
2053
- if (match[4]) {
2054
- if (tzRegex.exec(match[4])) {
2055
- tzFormat = 'Z';
2056
- } else {
2057
- config._isValid = false;
2058
- return;
2059
- }
2060
- }
2061
- config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
2062
- configFromStringAndFormat(config);
2063
- } else {
2064
- config._isValid = false;
2065
- }
2066
- }
1985
+ a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
1986
+ a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
1987
+ a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
1988
+ a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
1989
+ -1;
2067
1990
 
2068
- // date from iso format or fallback
2069
- function configFromString(config) {
2070
- var matched = aspNetJsonRegex.exec(config._i);
1991
+ if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
1992
+ overflow = DATE;
1993
+ }
1994
+ if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
1995
+ overflow = WEEK;
1996
+ }
1997
+ if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
1998
+ overflow = WEEKDAY;
1999
+ }
2071
2000
 
2072
- if (matched !== null) {
2073
- config._d = new Date(+matched[1]);
2074
- return;
2001
+ getParsingFlags(m).overflow = overflow;
2075
2002
  }
2076
2003
 
2077
- configFromISO(config);
2078
- if (config._isValid === false) {
2079
- delete config._isValid;
2080
- hooks.createFromInputFallback(config);
2081
- }
2004
+ return m;
2082
2005
  }
2083
2006
 
2084
- hooks.createFromInputFallback = deprecate(
2085
- 'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +
2086
- 'which is not reliable across all browsers and versions. Non ISO date formats are ' +
2087
- 'discouraged and will be removed in an upcoming major release. Please refer to ' +
2088
- 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
2089
- function (config) {
2090
- config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
2091
- }
2092
- );
2093
-
2094
2007
  // Pick the first defined of two or three arguments.
2095
2008
  function defaults(a, b, c) {
2096
2009
  if (a != null) {
@@ -2116,7 +2029,7 @@ function currentDateArray(config) {
2116
2029
  // note: all values past the year are optional and will default to the lowest possible value.
2117
2030
  // [year, month, day , hour, minute, second, millisecond]
2118
2031
  function configFromArray (config) {
2119
- var i, date, input = [], currentDate, yearToUse;
2032
+ var i, date, input = [], currentDate, expectedWeekday, yearToUse;
2120
2033
 
2121
2034
  if (config._d) {
2122
2035
  return;
@@ -2130,10 +2043,10 @@ function configFromArray (config) {
2130
2043
  }
2131
2044
 
2132
2045
  //if the day of the year is set, figure out what it is
2133
- if (config._dayOfYear) {
2046
+ if (config._dayOfYear != null) {
2134
2047
  yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
2135
2048
 
2136
- if (config._dayOfYear > daysInYear(yearToUse)) {
2049
+ if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
2137
2050
  getParsingFlags(config)._overflowDayOfYear = true;
2138
2051
  }
2139
2052
 
@@ -2166,6 +2079,8 @@ function configFromArray (config) {
2166
2079
  }
2167
2080
 
2168
2081
  config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
2082
+ expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
2083
+
2169
2084
  // Apply timezone offset from input. The actual utcOffset can be changed
2170
2085
  // with parseZone.
2171
2086
  if (config._tzm != null) {
@@ -2175,6 +2090,11 @@ function configFromArray (config) {
2175
2090
  if (config._nextDay) {
2176
2091
  config._a[HOUR] = 24;
2177
2092
  }
2093
+
2094
+ // check for mismatching day of week
2095
+ if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
2096
+ getParsingFlags(config).weekdayMismatch = true;
2097
+ }
2178
2098
  }
2179
2099
 
2180
2100
  function dayOfYearFromWeekInfo(config) {
@@ -2234,9 +2154,234 @@ function dayOfYearFromWeekInfo(config) {
2234
2154
  }
2235
2155
  }
2236
2156
 
2157
+ // iso 8601 regex
2158
+ // 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)
2159
+ 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)?)?$/;
2160
+ var 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)?)?$/;
2161
+
2162
+ var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
2163
+
2164
+ var isoDates = [
2165
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
2166
+ ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
2167
+ ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
2168
+ ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
2169
+ ['YYYY-DDD', /\d{4}-\d{3}/],
2170
+ ['YYYY-MM', /\d{4}-\d\d/, false],
2171
+ ['YYYYYYMMDD', /[+-]\d{10}/],
2172
+ ['YYYYMMDD', /\d{8}/],
2173
+ // YYYYMM is NOT allowed by the standard
2174
+ ['GGGG[W]WWE', /\d{4}W\d{3}/],
2175
+ ['GGGG[W]WW', /\d{4}W\d{2}/, false],
2176
+ ['YYYYDDD', /\d{7}/]
2177
+ ];
2178
+
2179
+ // iso time formats and regexes
2180
+ var isoTimes = [
2181
+ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
2182
+ ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
2183
+ ['HH:mm:ss', /\d\d:\d\d:\d\d/],
2184
+ ['HH:mm', /\d\d:\d\d/],
2185
+ ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
2186
+ ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
2187
+ ['HHmmss', /\d\d\d\d\d\d/],
2188
+ ['HHmm', /\d\d\d\d/],
2189
+ ['HH', /\d\d/]
2190
+ ];
2191
+
2192
+ var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
2193
+
2194
+ // date from iso format
2195
+ function configFromISO(config) {
2196
+ var i, l,
2197
+ string = config._i,
2198
+ match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
2199
+ allowTime, dateFormat, timeFormat, tzFormat;
2200
+
2201
+ if (match) {
2202
+ getParsingFlags(config).iso = true;
2203
+
2204
+ for (i = 0, l = isoDates.length; i < l; i++) {
2205
+ if (isoDates[i][1].exec(match[1])) {
2206
+ dateFormat = isoDates[i][0];
2207
+ allowTime = isoDates[i][2] !== false;
2208
+ break;
2209
+ }
2210
+ }
2211
+ if (dateFormat == null) {
2212
+ config._isValid = false;
2213
+ return;
2214
+ }
2215
+ if (match[3]) {
2216
+ for (i = 0, l = isoTimes.length; i < l; i++) {
2217
+ if (isoTimes[i][1].exec(match[3])) {
2218
+ // match[2] should be 'T' or space
2219
+ timeFormat = (match[2] || ' ') + isoTimes[i][0];
2220
+ break;
2221
+ }
2222
+ }
2223
+ if (timeFormat == null) {
2224
+ config._isValid = false;
2225
+ return;
2226
+ }
2227
+ }
2228
+ if (!allowTime && timeFormat != null) {
2229
+ config._isValid = false;
2230
+ return;
2231
+ }
2232
+ if (match[4]) {
2233
+ if (tzRegex.exec(match[4])) {
2234
+ tzFormat = 'Z';
2235
+ } else {
2236
+ config._isValid = false;
2237
+ return;
2238
+ }
2239
+ }
2240
+ config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
2241
+ configFromStringAndFormat(config);
2242
+ } else {
2243
+ config._isValid = false;
2244
+ }
2245
+ }
2246
+
2247
+ // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
2248
+ var 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}))$/;
2249
+
2250
+ function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
2251
+ var result = [
2252
+ untruncateYear(yearStr),
2253
+ defaultLocaleMonthsShort.indexOf(monthStr),
2254
+ parseInt(dayStr, 10),
2255
+ parseInt(hourStr, 10),
2256
+ parseInt(minuteStr, 10)
2257
+ ];
2258
+
2259
+ if (secondStr) {
2260
+ result.push(parseInt(secondStr, 10));
2261
+ }
2262
+
2263
+ return result;
2264
+ }
2265
+
2266
+ function untruncateYear(yearStr) {
2267
+ var year = parseInt(yearStr, 10);
2268
+ if (year <= 49) {
2269
+ return 2000 + year;
2270
+ } else if (year <= 999) {
2271
+ return 1900 + year;
2272
+ }
2273
+ return year;
2274
+ }
2275
+
2276
+ function preprocessRFC2822(s) {
2277
+ // Remove comments and folding whitespace and replace multiple-spaces with a single space
2278
+ return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim();
2279
+ }
2280
+
2281
+ function checkWeekday(weekdayStr, parsedInput, config) {
2282
+ if (weekdayStr) {
2283
+ // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
2284
+ var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
2285
+ weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
2286
+ if (weekdayProvided !== weekdayActual) {
2287
+ getParsingFlags(config).weekdayMismatch = true;
2288
+ config._isValid = false;
2289
+ return false;
2290
+ }
2291
+ }
2292
+ return true;
2293
+ }
2294
+
2295
+ var obsOffsets = {
2296
+ UT: 0,
2297
+ GMT: 0,
2298
+ EDT: -4 * 60,
2299
+ EST: -5 * 60,
2300
+ CDT: -5 * 60,
2301
+ CST: -6 * 60,
2302
+ MDT: -6 * 60,
2303
+ MST: -7 * 60,
2304
+ PDT: -7 * 60,
2305
+ PST: -8 * 60
2306
+ };
2307
+
2308
+ function calculateOffset(obsOffset, militaryOffset, numOffset) {
2309
+ if (obsOffset) {
2310
+ return obsOffsets[obsOffset];
2311
+ } else if (militaryOffset) {
2312
+ // the only allowed military tz is Z
2313
+ return 0;
2314
+ } else {
2315
+ var hm = parseInt(numOffset, 10);
2316
+ var m = hm % 100, h = (hm - m) / 100;
2317
+ return h * 60 + m;
2318
+ }
2319
+ }
2320
+
2321
+ // date and time from ref 2822 format
2322
+ function configFromRFC2822(config) {
2323
+ var match = rfc2822.exec(preprocessRFC2822(config._i));
2324
+ if (match) {
2325
+ var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
2326
+ if (!checkWeekday(match[1], parsedArray, config)) {
2327
+ return;
2328
+ }
2329
+
2330
+ config._a = parsedArray;
2331
+ config._tzm = calculateOffset(match[8], match[9], match[10]);
2332
+
2333
+ config._d = createUTCDate.apply(null, config._a);
2334
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
2335
+
2336
+ getParsingFlags(config).rfc2822 = true;
2337
+ } else {
2338
+ config._isValid = false;
2339
+ }
2340
+ }
2341
+
2342
+ // date from iso format or fallback
2343
+ function configFromString(config) {
2344
+ var matched = aspNetJsonRegex.exec(config._i);
2345
+
2346
+ if (matched !== null) {
2347
+ config._d = new Date(+matched[1]);
2348
+ return;
2349
+ }
2350
+
2351
+ configFromISO(config);
2352
+ if (config._isValid === false) {
2353
+ delete config._isValid;
2354
+ } else {
2355
+ return;
2356
+ }
2357
+
2358
+ configFromRFC2822(config);
2359
+ if (config._isValid === false) {
2360
+ delete config._isValid;
2361
+ } else {
2362
+ return;
2363
+ }
2364
+
2365
+ // Final attempt, use Input Fallback
2366
+ hooks.createFromInputFallback(config);
2367
+ }
2368
+
2369
+ hooks.createFromInputFallback = deprecate(
2370
+ 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
2371
+ 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
2372
+ 'discouraged and will be removed in an upcoming major release. Please refer to ' +
2373
+ 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
2374
+ function (config) {
2375
+ config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
2376
+ }
2377
+ );
2378
+
2237
2379
  // constant that refers to the ISO standard
2238
2380
  hooks.ISO_8601 = function () {};
2239
2381
 
2382
+ // constant that refers to the RFC 2822 form
2383
+ hooks.RFC_2822 = function () {};
2384
+
2240
2385
  // date from string and format string
2241
2386
  function configFromStringAndFormat(config) {
2242
2387
  // TODO: Move this to another part of the creation flow to prevent circular deps
@@ -2244,7 +2389,10 @@ function configFromStringAndFormat(config) {
2244
2389
  configFromISO(config);
2245
2390
  return;
2246
2391
  }
2247
-
2392
+ if (config._f === hooks.RFC_2822) {
2393
+ configFromRFC2822(config);
2394
+ return;
2395
+ }
2248
2396
  config._a = [];
2249
2397
  getParsingFlags(config).empty = true;
2250
2398
 
@@ -2436,7 +2584,7 @@ function prepareConfig (config) {
2436
2584
 
2437
2585
  function configFromInput(config) {
2438
2586
  var input = config._i;
2439
- if (input === undefined) {
2587
+ if (isUndefined(input)) {
2440
2588
  config._d = new Date(hooks.now());
2441
2589
  } else if (isDate(input)) {
2442
2590
  config._d = new Date(input.valueOf());
@@ -2447,7 +2595,7 @@ function configFromInput(config) {
2447
2595
  return parseInt(obj, 10);
2448
2596
  });
2449
2597
  configFromArray(config);
2450
- } else if (typeof(input) === 'object') {
2598
+ } else if (isObject(input)) {
2451
2599
  configFromObject(config);
2452
2600
  } else if (isNumber(input)) {
2453
2601
  // from milliseconds
@@ -2548,6 +2696,38 @@ var now = function () {
2548
2696
  return Date.now ? Date.now() : +(new Date());
2549
2697
  };
2550
2698
 
2699
+ var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
2700
+
2701
+ function isDurationValid(m) {
2702
+ for (var key in m) {
2703
+ if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
2704
+ return false;
2705
+ }
2706
+ }
2707
+
2708
+ var unitHasDecimal = false;
2709
+ for (var i = 0; i < ordering.length; ++i) {
2710
+ if (m[ordering[i]]) {
2711
+ if (unitHasDecimal) {
2712
+ return false; // only allow non-integers for smallest unit
2713
+ }
2714
+ if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
2715
+ unitHasDecimal = true;
2716
+ }
2717
+ }
2718
+ }
2719
+
2720
+ return true;
2721
+ }
2722
+
2723
+ function isValid$1() {
2724
+ return this._isValid;
2725
+ }
2726
+
2727
+ function createInvalid$1() {
2728
+ return createDuration(NaN);
2729
+ }
2730
+
2551
2731
  function Duration (duration) {
2552
2732
  var normalizedInput = normalizeObjectUnits(duration),
2553
2733
  years = normalizedInput.year || 0,
@@ -2560,6 +2740,8 @@ function Duration (duration) {
2560
2740
  seconds = normalizedInput.second || 0,
2561
2741
  milliseconds = normalizedInput.millisecond || 0;
2562
2742
 
2743
+ this._isValid = isDurationValid(normalizedInput);
2744
+
2563
2745
  // representation for dateAddRemove
2564
2746
  this._milliseconds = +milliseconds +
2565
2747
  seconds * 1e3 + // 1000
@@ -2569,7 +2751,7 @@ function Duration (duration) {
2569
2751
  // day when working around DST, we need to store them separately
2570
2752
  this._days = +days +
2571
2753
  weeks * 7;
2572
- // It is impossible translate months into days without knowing
2754
+ // It is impossible to translate months into days without knowing
2573
2755
  // which months you are are talking about, so we have to store
2574
2756
  // it separately.
2575
2757
  this._months = +months +
@@ -2683,7 +2865,7 @@ hooks.updateOffset = function () {};
2683
2865
  // a second time. In case it wants us to change the offset again
2684
2866
  // _changeInProgress == true case, then we have to adjust, because
2685
2867
  // there is no such time in the given timezone.
2686
- function getSetOffset (input, keepLocalTime) {
2868
+ function getSetOffset (input, keepLocalTime, keepMinutes) {
2687
2869
  var offset = this._offset || 0,
2688
2870
  localAdjust;
2689
2871
  if (!this.isValid()) {
@@ -2695,7 +2877,7 @@ function getSetOffset (input, keepLocalTime) {
2695
2877
  if (input === null) {
2696
2878
  return this;
2697
2879
  }
2698
- } else if (Math.abs(input) < 16) {
2880
+ } else if (Math.abs(input) < 16 && !keepMinutes) {
2699
2881
  input = input * 60;
2700
2882
  }
2701
2883
  if (!this._isUTC && keepLocalTime) {
@@ -2753,7 +2935,7 @@ function setOffsetToLocal (keepLocalTime) {
2753
2935
 
2754
2936
  function setOffsetToParsedOffset () {
2755
2937
  if (this._tzm != null) {
2756
- this.utcOffset(this._tzm);
2938
+ this.utcOffset(this._tzm, false, true);
2757
2939
  } else if (typeof this._i === 'string') {
2758
2940
  var tZone = offsetFromString(matchOffset, this._i);
2759
2941
  if (tZone != null) {
@@ -2816,12 +2998,12 @@ function isUtc () {
2816
2998
  }
2817
2999
 
2818
3000
  // ASP.NET json date format regex
2819
- var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
3001
+ var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
2820
3002
 
2821
3003
  // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
2822
3004
  // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
2823
3005
  // and further modified to allow for strings containing both week and day
2824
- var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
3006
+ var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
2825
3007
 
2826
3008
  function createDuration (input, key) {
2827
3009
  var duration = input,
@@ -2855,7 +3037,7 @@ function createDuration (input, key) {
2855
3037
  ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
2856
3038
  };
2857
3039
  } else if (!!(match = isoRegex.exec(input))) {
2858
- sign = (match[1] === '-') ? -1 : 1;
3040
+ sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;
2859
3041
  duration = {
2860
3042
  y : parseIso(match[2], sign),
2861
3043
  M : parseIso(match[3], sign),
@@ -2885,6 +3067,7 @@ function createDuration (input, key) {
2885
3067
  }
2886
3068
 
2887
3069
  createDuration.fn = Duration.prototype;
3070
+ createDuration.invalid = createInvalid$1;
2888
3071
 
2889
3072
  function parseIso (inp, sign) {
2890
3073
  // We'd normally use ~~inp for this, but unfortunately it also
@@ -2957,14 +3140,14 @@ function addSubtract (mom, duration, isAdding, updateOffset) {
2957
3140
 
2958
3141
  updateOffset = updateOffset == null ? true : updateOffset;
2959
3142
 
2960
- if (milliseconds) {
2961
- mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
3143
+ if (months) {
3144
+ setMonth(mom, get(mom, 'Month') + months * isAdding);
2962
3145
  }
2963
3146
  if (days) {
2964
3147
  set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
2965
3148
  }
2966
- if (months) {
2967
- setMonth(mom, get(mom, 'Month') + months * isAdding);
3149
+ if (milliseconds) {
3150
+ mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
2968
3151
  }
2969
3152
  if (updateOffset) {
2970
3153
  hooks.updateOffset(mom, days || months);
@@ -3074,22 +3257,18 @@ function diff (input, units, asFloat) {
3074
3257
 
3075
3258
  units = normalizeUnits(units);
3076
3259
 
3077
- if (units === 'year' || units === 'month' || units === 'quarter') {
3078
- output = monthDiff(this, that);
3079
- if (units === 'quarter') {
3080
- output = output / 3;
3081
- } else if (units === 'year') {
3082
- output = output / 12;
3083
- }
3084
- } else {
3085
- delta = this - that;
3086
- output = units === 'second' ? delta / 1e3 : // 1000
3087
- units === 'minute' ? delta / 6e4 : // 1000 * 60
3088
- units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
3089
- units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
3090
- units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
3091
- delta;
3260
+ switch (units) {
3261
+ case 'year': output = monthDiff(this, that) / 12; break;
3262
+ case 'month': output = monthDiff(this, that); break;
3263
+ case 'quarter': output = monthDiff(this, that) / 3; break;
3264
+ case 'second': output = (this - that) / 1e3; break; // 1000
3265
+ case 'minute': output = (this - that) / 6e4; break; // 1000 * 60
3266
+ case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60
3267
+ case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst
3268
+ case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst
3269
+ default: output = this - that;
3092
3270
  }
3271
+
3093
3272
  return asFloat ? output : absFloor(output);
3094
3273
  }
3095
3274
 
@@ -3121,18 +3300,24 @@ function toString () {
3121
3300
  return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
3122
3301
  }
3123
3302
 
3124
- function toISOString () {
3125
- var m = this.clone().utc();
3126
- if (0 < m.year() && m.year() <= 9999) {
3127
- if (isFunction(Date.prototype.toISOString)) {
3128
- // native implementation is ~50x faster, use it when we can
3303
+ function toISOString(keepOffset) {
3304
+ if (!this.isValid()) {
3305
+ return null;
3306
+ }
3307
+ var utc = keepOffset !== true;
3308
+ var m = utc ? this.clone().utc() : this;
3309
+ if (m.year() < 0 || m.year() > 9999) {
3310
+ return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
3311
+ }
3312
+ if (isFunction(Date.prototype.toISOString)) {
3313
+ // native implementation is ~50x faster, use it when we can
3314
+ if (utc) {
3129
3315
  return this.toDate().toISOString();
3130
3316
  } else {
3131
- return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
3317
+ return new Date(this._d.valueOf()).toISOString().replace('Z', formatMoment(m, 'Z'));
3132
3318
  }
3133
- } else {
3134
- return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
3135
3319
  }
3320
+ return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
3136
3321
  }
3137
3322
 
3138
3323
  /**
@@ -3152,7 +3337,7 @@ function inspect () {
3152
3337
  zone = 'Z';
3153
3338
  }
3154
3339
  var prefix = '[' + func + '("]';
3155
- var year = (0 < this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
3340
+ var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
3156
3341
  var datetime = '-MM-DD[T]HH:mm:ss.SSS';
3157
3342
  var suffix = zone + '[")]';
3158
3343
 
@@ -3320,7 +3505,7 @@ function toJSON () {
3320
3505
  return this.isValid() ? this.toISOString() : null;
3321
3506
  }
3322
3507
 
3323
- function isValid$1 () {
3508
+ function isValid$2 () {
3324
3509
  return isValid(this);
3325
3510
  }
3326
3511
 
@@ -3480,12 +3665,15 @@ addUnitPriority('date', 9);
3480
3665
  addRegexToken('D', match1to2);
3481
3666
  addRegexToken('DD', match1to2, match2);
3482
3667
  addRegexToken('Do', function (isStrict, locale) {
3483
- return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;
3668
+ // TODO: Remove "ordinalParse" fallback in next major release.
3669
+ return isStrict ?
3670
+ (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
3671
+ locale._dayOfMonthOrdinalParseLenient;
3484
3672
  });
3485
3673
 
3486
3674
  addParseToken(['D', 'DD'], DATE);
3487
3675
  addParseToken('Do', function (input, array) {
3488
- array[DATE] = toInt(input.match(match1to2)[0], 10);
3676
+ array[DATE] = toInt(input.match(match1to2)[0]);
3489
3677
  });
3490
3678
 
3491
3679
  // MOMENTS
@@ -3660,7 +3848,7 @@ proto.isBetween = isBetween;
3660
3848
  proto.isSame = isSame;
3661
3849
  proto.isSameOrAfter = isSameOrAfter;
3662
3850
  proto.isSameOrBefore = isSameOrBefore;
3663
- proto.isValid = isValid$1;
3851
+ proto.isValid = isValid$2;
3664
3852
  proto.lang = lang;
3665
3853
  proto.locale = locale;
3666
3854
  proto.localeData = localeData;
@@ -3885,7 +4073,7 @@ function listWeekdaysMin (localeSorted, format, index) {
3885
4073
  }
3886
4074
 
3887
4075
  getSetGlobalLocale('en', {
3888
- ordinalParse: /\d{1,2}(th|st|nd|rd)/,
4076
+ dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
3889
4077
  ordinal : function (number) {
3890
4078
  var b = number % 10,
3891
4079
  output = (toInt(number % 100 / 10) === 1) ? 'th' :
@@ -4006,6 +4194,9 @@ function monthsToDays (months) {
4006
4194
  }
4007
4195
 
4008
4196
  function as (units) {
4197
+ if (!this.isValid()) {
4198
+ return NaN;
4199
+ }
4009
4200
  var days;
4010
4201
  var months;
4011
4202
  var milliseconds = this._milliseconds;
@@ -4034,6 +4225,9 @@ function as (units) {
4034
4225
 
4035
4226
  // TODO: Use this.as('ms')?
4036
4227
  function valueOf$1 () {
4228
+ if (!this.isValid()) {
4229
+ return NaN;
4230
+ }
4037
4231
  return (
4038
4232
  this._milliseconds +
4039
4233
  this._days * 864e5 +
@@ -4057,14 +4251,18 @@ var asWeeks = makeAs('w');
4057
4251
  var asMonths = makeAs('M');
4058
4252
  var asYears = makeAs('y');
4059
4253
 
4254
+ function clone$1 () {
4255
+ return createDuration(this);
4256
+ }
4257
+
4060
4258
  function get$2 (units) {
4061
4259
  units = normalizeUnits(units);
4062
- return this[units + 's']();
4260
+ return this.isValid() ? this[units + 's']() : NaN;
4063
4261
  }
4064
4262
 
4065
4263
  function makeGetter(name) {
4066
4264
  return function () {
4067
- return this._data[name];
4265
+ return this.isValid() ? this._data[name] : NaN;
4068
4266
  };
4069
4267
  }
4070
4268
 
@@ -4082,11 +4280,12 @@ function weeks () {
4082
4280
 
4083
4281
  var round = Math.round;
4084
4282
  var thresholds = {
4085
- s: 45, // seconds to minute
4086
- m: 45, // minutes to hour
4087
- h: 22, // hours to day
4088
- d: 26, // days to month
4089
- M: 11 // months to year
4283
+ ss: 44, // a few seconds to seconds
4284
+ s : 45, // seconds to minute
4285
+ m : 45, // minutes to hour
4286
+ h : 22, // hours to day
4287
+ d : 26, // days to month
4288
+ M : 11 // months to year
4090
4289
  };
4091
4290
 
4092
4291
  // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
@@ -4103,16 +4302,17 @@ function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
4103
4302
  var months = round(duration.as('M'));
4104
4303
  var years = round(duration.as('y'));
4105
4304
 
4106
- var a = seconds < thresholds.s && ['s', seconds] ||
4107
- minutes <= 1 && ['m'] ||
4108
- minutes < thresholds.m && ['mm', minutes] ||
4109
- hours <= 1 && ['h'] ||
4110
- hours < thresholds.h && ['hh', hours] ||
4111
- days <= 1 && ['d'] ||
4112
- days < thresholds.d && ['dd', days] ||
4113
- months <= 1 && ['M'] ||
4114
- months < thresholds.M && ['MM', months] ||
4115
- years <= 1 && ['y'] || ['yy', years];
4305
+ var a = seconds <= thresholds.ss && ['s', seconds] ||
4306
+ seconds < thresholds.s && ['ss', seconds] ||
4307
+ minutes <= 1 && ['m'] ||
4308
+ minutes < thresholds.m && ['mm', minutes] ||
4309
+ hours <= 1 && ['h'] ||
4310
+ hours < thresholds.h && ['hh', hours] ||
4311
+ days <= 1 && ['d'] ||
4312
+ days < thresholds.d && ['dd', days] ||
4313
+ months <= 1 && ['M'] ||
4314
+ months < thresholds.M && ['MM', months] ||
4315
+ years <= 1 && ['y'] || ['yy', years];
4116
4316
 
4117
4317
  a[2] = withoutSuffix;
4118
4318
  a[3] = +posNegDuration > 0;
@@ -4141,10 +4341,17 @@ function getSetRelativeTimeThreshold (threshold, limit) {
4141
4341
  return thresholds[threshold];
4142
4342
  }
4143
4343
  thresholds[threshold] = limit;
4344
+ if (threshold === 's') {
4345
+ thresholds.ss = limit - 1;
4346
+ }
4144
4347
  return true;
4145
4348
  }
4146
4349
 
4147
4350
  function humanize (withSuffix) {
4351
+ if (!this.isValid()) {
4352
+ return this.localeData().invalidDate();
4353
+ }
4354
+
4148
4355
  var locale = this.localeData();
4149
4356
  var output = relativeTime$1(this, !withSuffix, locale);
4150
4357
 
@@ -4157,6 +4364,10 @@ function humanize (withSuffix) {
4157
4364
 
4158
4365
  var abs$1 = Math.abs;
4159
4366
 
4367
+ function sign(x) {
4368
+ return ((x > 0) - (x < 0)) || +x;
4369
+ }
4370
+
4160
4371
  function toISOString$1() {
4161
4372
  // for ISO strings we do not use the normal bubbling rules:
4162
4373
  // * milliseconds bubble up until they become hours
@@ -4165,6 +4376,10 @@ function toISOString$1() {
4165
4376
  // This is because there is no context-free conversion between hours and days
4166
4377
  // (think of clock changes)
4167
4378
  // and also not between days and months (28-31 days per month)
4379
+ if (!this.isValid()) {
4380
+ return this.localeData().invalidDate();
4381
+ }
4382
+
4168
4383
  var seconds = abs$1(this._milliseconds) / 1000;
4169
4384
  var days = abs$1(this._days);
4170
4385
  var months = abs$1(this._months);
@@ -4187,7 +4402,7 @@ function toISOString$1() {
4187
4402
  var D = days;
4188
4403
  var h = hours;
4189
4404
  var m = minutes;
4190
- var s = seconds;
4405
+ var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
4191
4406
  var total = this.asSeconds();
4192
4407
 
4193
4408
  if (!total) {
@@ -4196,19 +4411,24 @@ function toISOString$1() {
4196
4411
  return 'P0D';
4197
4412
  }
4198
4413
 
4199
- return (total < 0 ? '-' : '') +
4200
- 'P' +
4201
- (Y ? Y + 'Y' : '') +
4202
- (M ? M + 'M' : '') +
4203
- (D ? D + 'D' : '') +
4414
+ var totalSign = total < 0 ? '-' : '';
4415
+ var ymSign = sign(this._months) !== sign(total) ? '-' : '';
4416
+ var daysSign = sign(this._days) !== sign(total) ? '-' : '';
4417
+ var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
4418
+
4419
+ return totalSign + 'P' +
4420
+ (Y ? ymSign + Y + 'Y' : '') +
4421
+ (M ? ymSign + M + 'M' : '') +
4422
+ (D ? daysSign + D + 'D' : '') +
4204
4423
  ((h || m || s) ? 'T' : '') +
4205
- (h ? h + 'H' : '') +
4206
- (m ? m + 'M' : '') +
4207
- (s ? s + 'S' : '');
4424
+ (h ? hmsSign + h + 'H' : '') +
4425
+ (m ? hmsSign + m + 'M' : '') +
4426
+ (s ? hmsSign + s + 'S' : '');
4208
4427
  }
4209
4428
 
4210
4429
  var proto$2 = Duration.prototype;
4211
4430
 
4431
+ proto$2.isValid = isValid$1;
4212
4432
  proto$2.abs = abs;
4213
4433
  proto$2.add = add$1;
4214
4434
  proto$2.subtract = subtract$1;
@@ -4223,6 +4443,7 @@ proto$2.asMonths = asMonths;
4223
4443
  proto$2.asYears = asYears;
4224
4444
  proto$2.valueOf = valueOf$1;
4225
4445
  proto$2._bubble = bubble;
4446
+ proto$2.clone = clone$1;
4226
4447
  proto$2.get = get$2;
4227
4448
  proto$2.milliseconds = milliseconds;
4228
4449
  proto$2.seconds = seconds;
@@ -4264,7 +4485,7 @@ addParseToken('x', function (input, array, config) {
4264
4485
  // Side effect imports
4265
4486
 
4266
4487
 
4267
- hooks.version = '2.17.1';
4488
+ hooks.version = '2.20.1';
4268
4489
 
4269
4490
  setHookCallback(createLocal);
4270
4491
 
@@ -4291,11 +4512,24 @@ hooks.updateLocale = updateLocale;
4291
4512
  hooks.locales = listLocales;
4292
4513
  hooks.weekdaysShort = listWeekdaysShort;
4293
4514
  hooks.normalizeUnits = normalizeUnits;
4294
- hooks.relativeTimeRounding = getSetRelativeTimeRounding;
4515
+ hooks.relativeTimeRounding = getSetRelativeTimeRounding;
4295
4516
  hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
4296
4517
  hooks.calendarFormat = getCalendarFormat;
4297
4518
  hooks.prototype = proto;
4298
4519
 
4520
+ // currently HTML5 input type only supports 24-hour formats
4521
+ hooks.HTML5_FMT = {
4522
+ DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
4523
+ DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
4524
+ DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
4525
+ DATE: 'YYYY-MM-DD', // <input type="date" />
4526
+ TIME: 'HH:mm', // <input type="time" />
4527
+ TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
4528
+ TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
4529
+ WEEK: 'YYYY-[W]WW', // <input type="week" />
4530
+ MONTH: 'YYYY-MM' // <input type="month" />
4531
+ };
4532
+
4299
4533
  return hooks;
4300
4534
 
4301
4535
  })));