-import { normalizeUnits } from '../units/aliases';
+import { normalizeUnits, normalizeObjectUnits } from '../units/aliases';
+import { getPrioritizedUnits } from '../units/priorities';
import { hooks } from '../utils/hooks';
import isFunction from '../utils/is-function';
+
export function makeGetSet (unit, keepTime) {
return function (value) {
if (value != null) {
// MOMENTS
-export function getSet (units, value) {
- var unit;
+export function stringGet (units) {
+ units = normalizeUnits(units);
+ if (isFunction(this[units])) {
+ return this[units]();
+ }
+ return this;
+}
+
+
+export function stringSet (units, value) {
if (typeof units === 'object') {
- for (unit in units) {
- this.set(unit, units[unit]);
+ units = normalizeObjectUnits(units);
+ var prioritized = getPrioritizedUnits(units);
+ for (var i = 0; i < prioritized.length; i++) {
+ this[prioritized[i].unit](units[prioritized[i].unit]);
}
} else {
units = normalizeUnits(units);
import { format, toString, toISOString } from './format';
import { from, fromNow } from './from';
import { to, toNow } from './to';
-import { getSet } from './get-set';
+import { stringGet, stringSet } from './get-set';
import { locale, localeData, lang } from './locale';
import { prototypeMin, prototypeMax } from './min-max';
import { startOf, endOf } from './start-end-of';
proto.fromNow = fromNow;
proto.to = to;
proto.toNow = toNow;
-proto.get = getSet;
+proto.get = stringGet;
proto.invalidAt = invalidAt;
proto.isAfter = isAfter;
proto.isBefore = isBefore;
proto.max = prototypeMax;
proto.min = prototypeMin;
proto.parsingFlags = parsingFlags;
-proto.set = getSet;
+proto.set = stringSet;
proto.startOf = startOf;
proto.subtract = subtract;
proto.toArray = toArray;
return normalizedInput;
}
+
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { DATE } from './constants';
addUnitAlias('date', 'D');
+// PRIOROITY
+addUnitPriority('date', 9);
+
// PARSING
addRegexToken('D', match1to2);
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, matchWord, regexEscape } from '../parse/regex';
import { addWeekParseToken } from '../parse/token';
import toInt from '../utils/to-int';
addUnitAlias('weekday', 'e');
addUnitAlias('isoWeekday', 'E');
+// PRIORITY
+addUnitPriority('day', 11);
+addUnitPriority('weekday', 11);
+addUnitPriority('isoWeekday', 11);
+
// PARSING
addRegexToken('d', match1to2);
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match3, match1to3 } from '../parse/regex';
import { daysInYear } from './year';
import { createUTCDate } from '../create/date-from-array';
addUnitAlias('dayOfYear', 'DDD');
+// PRIORITY
+addUnitPriority('dayOfYear', 4);
+
// PARSING
addRegexToken('DDD', match1to3);
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2, match3to4, match5to6 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { HOUR, MINUTE, SECOND } from './constants';
addUnitAlias('hour', 'h');
+// PRIORITY
+addUnitPriority('hour', 13);
+
// PARSING
function matchMeridiem (isStrict, locale) {
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1, match2, match3, match1to3, matchUnsigned } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { MILLISECOND } from './constants';
addUnitAlias('millisecond', 'ms');
+// PRIORITY
+
+addUnitPriority('millisecond', 16);
+
// PARSING
addRegexToken('S', match1to3, match1);
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { MINUTE } from './constants';
addUnitAlias('minute', 'm');
+// PRIORITY
+
+addUnitPriority('minute', 14);
+
// PARSING
addRegexToken('m', match1to2);
import hasOwnProp from '../utils/has-own-prop';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2, matchWord, regexEscape } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { hooks } from '../utils/hooks';
addUnitAlias('month', 'M');
+// PRIORITY
+
+addUnitPriority('month', 8);
+
// PARSING
addRegexToken('M', match1to2);
--- /dev/null
+var priorities = {};
+
+export function addUnitPriority(unit, priority) {
+ priorities[unit] = priority;
+}
+
+export function getPrioritizedUnits(unitsObj) {
+ var units = [];
+ for (var u in unitsObj) {
+ units.push({unit: u, priority: priorities[u]});
+ }
+ units.sort(function (a, b) {
+ return a.priority - b.priority;
+ });
+ return units;
+}
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { MONTH } from './constants';
addUnitAlias('quarter', 'Q');
+// PRIORITY
+
+addUnitPriority('quarter', 7);
+
// PARSING
addRegexToken('Q', match1);
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { SECOND } from './constants';
addUnitAlias('second', 's');
+// PRIORITY
+
+addUnitPriority('second', 15);
+
// PARSING
addRegexToken('s', match1to2);
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex';
import { addWeekParseToken } from '../parse/token';
import { weekOfYear, weeksInYear, dayOfYearFromWeeks } from './week-calendar-utils';
addUnitAlias('weekYear', 'gg');
addUnitAlias('isoWeekYear', 'GG');
+// PRIORITY
+
+addUnitPriority('weekYear', 1);
+addUnitPriority('isoWeekYear', 1);
+
+
// PARSING
addRegexToken('G', matchSigned);
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addWeekParseToken } from '../parse/token';
import toInt from '../utils/to-int';
addUnitAlias('week', 'w');
addUnitAlias('isoWeek', 'W');
+// PRIORITIES
+
+addUnitPriority('week', 5);
+addUnitPriority('isoWeek', 5);
+
// PARSING
addRegexToken('w', match1to2);
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { hooks } from '../utils/hooks';
addUnitAlias('year', 'y');
+// PRIORITIES
+
+addUnitPriority('year', 1);
+
// PARSING
addRegexToken('Y', matchSigned);
assert.equal(a.get('week'), a.week(), 'week');
assert.equal(a.get('isoWeek'), a.isoWeek(), 'isoWeek');
assert.equal(a.get('dayOfYear'), a.dayOfYear(), 'dayOfYear');
+
+ //getter no longer sets values when passed an object
+ assert.equal(moment([2016,0,1]).get({year:2015}).year(), 2016, 'getter no longer sets values when passed an object');
});
test('setters plural', function (assert) {
assert.equal(a.minutes(), 7, 'minute');
assert.equal(a.seconds(), 8, 'second');
assert.equal(a.milliseconds(), 9, 'milliseconds');
+
+ var c = moment([2016,0,1]);
+ assert.equal(c.set({weekYear: 2016}).weekYear(), 2016, 'week year correctly sets with object syntax');
+ assert.equal(c.set({quarter: 3}).quarter(), 3, 'quarter sets correctly with object syntax');
});
test('day setter', function (assert) {
assert.equal(moment(a).day(17).date(), 26, 'set from wednesday to second next wednesday');
});
+test('object set ordering', function (assert) {
+ var a = moment([2016,3,30]);
+ assert.equal(a.set({date:31, month:4}).date(), 31, 'setter order automatically arranged by size');
+ var b = moment([2015,1,28]);
+ assert.equal(b.set({date:29, year: 2016}).format('YYYY-MM-DD'), '2016-02-29', 'year is prioritized over date');
+ //check a nonexistent time in US isn't set
+ var c = moment([2016,2,13]);
+ c.set({
+ hour:2,
+ minutes:30,
+ date: 14
+ });
+ assert.equal(c.format('YYYY-MM-DDTHH:mm'), '2016-03-14T02:30', 'setting hours, minutes date puts date first allowing time set to work');
+});
+
test('string setters', function (assert) {
var a = moment();
a.year('2011');