]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Fix startOf/endOf/utcOffset and getters/setters for immutable API
authorLucas Sanders <butterflyhug@google.com>
Sun, 30 Oct 2016 18:27:55 +0000 (14:27 -0400)
committerLucas Sanders <butterflyhug@google.com>
Wed, 22 Mar 2017 10:12:27 +0000 (06:12 -0400)
17 files changed:
src/lib/create/from-anything.js
src/lib/moment/get-set.js
src/lib/moment/start-end-of.js
src/lib/units/day-of-month.js
src/lib/units/day-of-week.js
src/lib/units/day-of-year.js
src/lib/units/hour.js
src/lib/units/millisecond.js
src/lib/units/minute.js
src/lib/units/month.js
src/lib/units/offset.js
src/lib/units/priorities.js
src/lib/units/quarter.js
src/lib/units/second.js
src/lib/units/week-year.js
src/lib/units/week.js
src/lib/units/year.js

index e692679bc9c780f595ffb2cda1d956322f8639d7..72aad72bf148644fa9e37cdc4dd255f7e0eab3ef 100644 (file)
@@ -22,7 +22,7 @@ function createFromConfig (config) {
     var res = new Moment(checkOverflow(prepareConfig(config)));
     if (res._nextDay) {
         // Adding is smart enough around DST
-        res.add(1, 'd');
+        res = res.add(1, 'd');
         res._nextDay = undefined;
     }
 
index 0d9fe5dfef06c63124251989a4acd721ddb05071..abdb8f4c01aa539dfcedfd5e448b7a851b914882 100644 (file)
@@ -43,7 +43,7 @@ export function stringSet (units, value) {
         units = normalizeObjectUnits(units);
         var prioritized = getPrioritizedUnits(units);
         for (var i = 0; i < prioritized.length; i++) {
-            this[prioritized[i].unit](units[prioritized[i].unit]);
+            prioritized[i].getSet.call(this, prioritized[i].value);
         }
     } else {
         units = normalizeUnits(units);
index 02f982479ad8959af97b4ea99812c110c95e3d98..1a9908fdc0987e25a8eda74532c7977627fb24b3 100644 (file)
@@ -2,46 +2,48 @@ import { normalizeUnits } from '../units/aliases';
 
 export function startOf (units) {
     units = normalizeUnits(units);
+
+    var m = this;
     // the following switch intentionally omits break keywords
     // to utilize falling through the cases.
     switch (units) {
         case 'year':
-            this.month(0);
+            m = m.month(0);
             /* falls through */
         case 'quarter':
         case 'month':
-            this.date(1);
+            m = m.date(1);
             /* falls through */
         case 'week':
         case 'isoWeek':
         case 'day':
         case 'date':
-            this.hours(0);
+            m = m.hours(0);
             /* falls through */
         case 'hour':
-            this.minutes(0);
+            m = m.minutes(0);
             /* falls through */
         case 'minute':
-            this.seconds(0);
+            m = m.seconds(0);
             /* falls through */
         case 'second':
-            this.milliseconds(0);
+            m = m.milliseconds(0);
     }
 
     // weeks are a special case
     if (units === 'week') {
-        this.weekday(0);
+        m = m.weekday(0);
     }
     if (units === 'isoWeek') {
-        this.isoWeekday(1);
+        m = m.isoWeekday(1);
     }
 
     // quarters are also special
     if (units === 'quarter') {
-        this.month(Math.floor(this.month() / 3) * 3);
+        m = m.month(Math.floor(m.month() / 3) * 3);
     }
 
-    return this;
+    return m;
 }
 
 export function endOf (units) {
index 02532534e96c0c32eb7fa7a1c5c8210be0a20d7a..4626977de0bf2f90584ae783d3d3340456ef83dd 100644 (file)
@@ -15,9 +15,6 @@ addFormatToken('D', ['DD', 2], 'Do', 'date');
 
 addUnitAlias('date', 'D');
 
-// PRIOROITY
-addUnitPriority('date', 9);
-
 // PARSING
 
 addRegexToken('D',  match1to2);
@@ -37,3 +34,7 @@ addParseToken('Do', function (input, array) {
 // MOMENTS
 
 export var getSetDayOfMonth = makeGetSet('Date', true);
+
+// PRIORITY
+
+addUnitPriority('date', 9, getSetDayOfMonth);
index 55027608d189a48d613ea2f71f1ef42c789ac842..81ef1bc4dd7a8af3aefa7032ffd085832ec36144 100644 (file)
@@ -35,11 +35,6 @@ addUnitAlias('day', 'd');
 addUnitAlias('weekday', 'e');
 addUnitAlias('isoWeekday', 'E');
 
-// PRIORITY
-addUnitPriority('day', 11);
-addUnitPriority('weekday', 11);
-addUnitPriority('isoWeekday', 11);
-
 // PARSING
 
 addRegexToken('d',    match1to2);
@@ -362,3 +357,9 @@ function computeWeekdaysParse () {
     this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
     this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
 }
+
+// PRIORITY
+
+addUnitPriority('day', 11, getSetDayOfWeek);
+addUnitPriority('weekday', 11, getSetLocaleDayOfWeek);
+addUnitPriority('isoWeekday', 11, getSetISODayOfWeek);
index 6fe931c1e46fbe36794d9b30d0f55c3ebac521bd..1159602e93acd805297a970d69c00c1b8491f419 100644 (file)
@@ -15,9 +15,6 @@ addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
 
 addUnitAlias('dayOfYear', 'DDD');
 
-// PRIORITY
-addUnitPriority('dayOfYear', 4);
-
 // PARSING
 
 addRegexToken('DDD',  match1to3);
@@ -34,3 +31,7 @@ export 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');
 }
+
+// PRIORITY
+
+addUnitPriority('dayOfYear', 4, getSetDayOfYear);
index ef758680370d5392705615eb28e722a22fc1c460..d4aed9c223e3dec392ecbb83431a37ee29b23868 100644 (file)
@@ -54,9 +54,6 @@ meridiem('A', false);
 
 addUnitAlias('hour', 'h');
 
-// PRIORITY
-addUnitPriority('hour', 13);
-
 // PARSING
 
 function matchMeridiem (isStrict, locale) {
@@ -142,3 +139,7 @@ export function localeMeridiem (hours, minutes, isLower) {
 // a new timezone) makes sense. Adding/subtracting hours does not follow
 // this rule.
 export var getSetHour = makeGetSet('Hours', true);
+
+// PRIORITY
+
+addUnitPriority('hour', 13, getSetHour);
index 27c951269360e0498145fbf04d6c6de4e7950144..d37e1ca142fafb61e92eed7f4298fd32be964c35 100644 (file)
@@ -37,15 +37,10 @@ addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
     return this.millisecond() * 1000000;
 });
 
-
 // ALIASES
 
 addUnitAlias('millisecond', 'ms');
 
-// PRIORITY
-
-addUnitPriority('millisecond', 16);
-
 // PARSING
 
 addRegexToken('S',    match1to3, match1);
@@ -67,3 +62,7 @@ for (token = 'S'; token.length <= 9; token += 'S') {
 // MOMENTS
 
 export var getSetMillisecond = makeGetSet('Milliseconds', false);
+
+// PRIORITY
+
+addUnitPriority('millisecond', 16, getSetMillisecond);
index 9f760322e1340536235dc71fd9d71cd968effde2..08b0b6bc4fd48b214cdb8f781f5ea910d0b7fdfb 100644 (file)
@@ -14,10 +14,6 @@ addFormatToken('m', ['mm', 2], 0, 'minute');
 
 addUnitAlias('minute', 'm');
 
-// PRIORITY
-
-addUnitPriority('minute', 14);
-
 // PARSING
 
 addRegexToken('m',  match1to2);
@@ -27,3 +23,7 @@ addParseToken(['m', 'mm'], MINUTE);
 // MOMENTS
 
 export var getSetMinute = makeGetSet('Minutes', false);
+
+// PRIORITY
+
+addUnitPriority('minute', 14, getSetMinute);
index 28b4a1b984686c8ba8f930d409f604c02008aed8..a09ffca7962a09dde81cf064ef3574fe60c74502 100644 (file)
@@ -36,10 +36,6 @@ addFormatToken('MMMM', 0, 0, function (format) {
 
 addUnitAlias('month', 'M');
 
-// PRIORITY
-
-addUnitPriority('month', 8);
-
 // PARSING
 
 addRegexToken('M',    match1to2);
@@ -281,3 +277,7 @@ function computeMonthsParse () {
     this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
     this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
 }
+
+// PRIORITY
+
+addUnitPriority('month', 8, getSetMonth);
index 752358f0d8c367b3bfebe1e7acca003f733402be..d7f5bc20e66fda03afb2b37bf2f6ab836352c6bf 100644 (file)
@@ -146,9 +146,7 @@ export function getSetZone (input, keepLocalTime) {
             input = -input;
         }
 
-        this.utcOffset(input, keepLocalTime);
-
-        return this;
+        return this.utcOffset(input, keepLocalTime);
     } else {
         return -this.utcOffset();
     }
@@ -159,28 +157,30 @@ export function setOffsetToUTC (keepLocalTime) {
 }
 
 export function setOffsetToLocal (keepLocalTime) {
-    if (this._isUTC) {
-        this.utcOffset(0, keepLocalTime);
-        this._isUTC = false;
+    var ret = this;
+    if (ret._isUTC) {
+        ret = ret.utcOffset(0, keepLocalTime);
+        ret._isUTC = false;
 
         if (keepLocalTime) {
-            this.subtract(getDateOffset(this), 'm');
+            ret = ret.subtract(getDateOffset(ret), 'm');
         }
     }
-    return this;
+    return ret;
 }
 
 export function setOffsetToParsedOffset () {
     if (this._tzm != null) {
-        this.utcOffset(this._tzm, false, true);
+        return this.utcOffset(this._tzm, false, true);
     } else if (typeof this._i === 'string') {
         var tZone = offsetFromString(matchOffset, this._i);
         if (tZone != null) {
-            this.utcOffset(tZone);
+            return this.utcOffset(tZone);
         }
         else {
-            this.utcOffset(0, true);
+            return this.utcOffset(0, true);
         }
+        return this.utcOffset(offsetFromString(matchOffset, this._i));
     }
     return this;
 }
index 699017cb80f22b5df9f98ed2f0a16609888e0a6a..05c9dd9825d79f83d08188de9bd78a3f0172e054 100644 (file)
@@ -1,13 +1,18 @@
 var priorities = {};
 
-export function addUnitPriority(unit, priority) {
-    priorities[unit] = priority;
+export function addUnitPriority(unit, priority, getterSetter) {
+    priorities[unit] = {priority: priority, getSet: getterSetter};
 }
 
 export function getPrioritizedUnits(unitsObj) {
     var units = [];
     for (var u in unitsObj) {
-        units.push({unit: u, priority: priorities[u]});
+        units.push({
+            unit: u,
+            value: unitsObj[u],
+            priority: priorities[u].priority,
+            getSet: priorities[u].getSet
+        });
     }
     units.sort(function (a, b) {
         return a.priority - b.priority;
index a6d409a862c8108e29d47effa0dc9b1070a94ff0..c2419c0c66a6f2f437b7b4c25502d3c3c6ba8db9 100644 (file)
@@ -3,6 +3,7 @@ import { addUnitAlias } from './aliases';
 import { addUnitPriority } from './priorities';
 import { addRegexToken, match1 } from '../parse/regex';
 import { addParseToken } from '../parse/token';
+import { getSetMonth } from './month';
 import { MONTH } from './constants';
 import toInt from '../utils/to-int';
 
@@ -14,10 +15,6 @@ addFormatToken('Q', 0, 'Qo', 'quarter');
 
 addUnitAlias('quarter', 'Q');
 
-// PRIORITY
-
-addUnitPriority('quarter', 7);
-
 // PARSING
 
 addRegexToken('Q', match1);
@@ -28,5 +25,9 @@ addParseToken('Q', function (input, array) {
 // MOMENTS
 
 export function getSetQuarter (input) {
-    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+    return input == null ? Math.ceil((this.month() + 1) / 3) : getSetMonth.call(this, (input - 1) * 3 + this.month() % 3);
 }
+
+// PRIORITY
+
+addUnitPriority('quarter', 7, getSetQuarter);
index 179371186e98f1749443a37951d4fc58612ce99f..8f6952f1e9035e69d1ccf1e0ee57a7aa05e57c28 100644 (file)
@@ -14,10 +14,6 @@ addFormatToken('s', ['ss', 2], 0, 'second');
 
 addUnitAlias('second', 's');
 
-// PRIORITY
-
-addUnitPriority('second', 15);
-
 // PARSING
 
 addRegexToken('s',  match1to2);
@@ -27,3 +23,7 @@ addParseToken(['s', 'ss'], SECOND);
 // MOMENTS
 
 export var getSetSecond = makeGetSet('Seconds', false);
+
+// PRIORITY
+
+addUnitPriority('second', 15, getSetSecond);
index 7fa5425bccbf4d0a62e28801c2e9a4ef6da492b8..538f1ca37ec573c85d80d164313490953f05c812 100644 (file)
@@ -8,6 +8,9 @@ import toInt from '../utils/to-int';
 import { hooks } from '../utils/hooks';
 import { createLocal } from '../create/local';
 import { createUTCDate } from '../create/date-from-array';
+import { getSetDayOfMonth } from './day-of-month';
+import { getSetMonth } from './month';
+import { getSetYear } from './year';
 
 // FORMATTING
 
@@ -33,11 +36,6 @@ addWeekYearFormatToken('GGGGG', 'isoWeekYear');
 addUnitAlias('weekYear', 'gg');
 addUnitAlias('isoWeekYear', 'GG');
 
-// PRIORITY
-
-addUnitPriority('weekYear', 1);
-addUnitPriority('isoWeekYear', 1);
-
 
 // PARSING
 
@@ -100,8 +98,13 @@ 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());
+    getSetYear.call(this, date.getUTCFullYear());
+    getSetMonth.call(this, date.getUTCMonth());
+    getSetDayOfMonth.call(this, date.getUTCDate());
     return this;
 }
+
+// PRIORITY
+
+addUnitPriority('weekYear', 1, getSetWeekYear);
+addUnitPriority('isoWeekYear', 1, getSetISOWeekYear);
index da64ffef328a68491c6211b2fbc350ed4d96100c..e63b3e109dd786e2d3f7a61ee7f2b29e204a1ce5 100644 (file)
@@ -17,11 +17,6 @@ addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
 addUnitAlias('week', 'w');
 addUnitAlias('isoWeek', 'W');
 
-// PRIORITIES
-
-addUnitPriority('week', 5);
-addUnitPriority('isoWeek', 5);
-
 // PARSING
 
 addRegexToken('w',  match1to2);
@@ -65,3 +60,8 @@ export function getSetISOWeek (input) {
     var week = weekOfYear(this, 1, 4).week;
     return input == null ? week : this.add((input - week) * 7, 'd');
 }
+
+// PRIORITIES
+
+addUnitPriority('week', 5, getSetWeek);
+addUnitPriority('isoWeek', 5, getSetISOWeek);
index a10e5b4beb3588238208508569b7c4f953aede7e..47353a0442df8601efad13f182bde96b9d15a4c9 100644 (file)
@@ -27,10 +27,6 @@ addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
 
 addUnitAlias('year', 'y');
 
-// PRIORITIES
-
-addUnitPriority('year', 1);
-
 // PARSING
 
 addRegexToken('Y',      matchSigned);
@@ -73,3 +69,7 @@ export var getSetYear = makeGetSet('FullYear', true);
 export function getIsLeapYear () {
     return isLeapYear(this.year());
 }
+
+// PRIORITIES
+
+addUnitPriority('year', 1, getSetYear);