aboutsummaryrefslogtreecommitdiff
path: root/node_modules/moment/src/lib/create
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/moment/src/lib/create')
-rw-r--r--node_modules/moment/src/lib/create/from-array.js5
-rw-r--r--node_modules/moment/src/lib/create/from-string.js142
-rw-r--r--node_modules/moment/src/lib/create/valid.js1
3 files changed, 91 insertions, 57 deletions
diff --git a/node_modules/moment/src/lib/create/from-array.js b/node_modules/moment/src/lib/create/from-array.js
index 0cdf474cf..7626c455d 100644
--- a/node_modules/moment/src/lib/create/from-array.js
+++ b/node_modules/moment/src/lib/create/from-array.js
@@ -80,6 +80,11 @@ export function configFromArray (config) {
if (config._nextDay) {
config._a[HOUR] = 24;
}
+
+ // check for mismatching day of week
+ if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== config._d.getDay()) {
+ getParsingFlags(config).weekdayMismatch = true;
+ }
}
function dayOfYearFromWeekInfo(config) {
diff --git a/node_modules/moment/src/lib/create/from-string.js b/node_modules/moment/src/lib/create/from-string.js
index 7cae76d70..7c1052a3e 100644
--- a/node_modules/moment/src/lib/create/from-string.js
+++ b/node_modules/moment/src/lib/create/from-string.js
@@ -1,7 +1,11 @@
import { configFromStringAndFormat } from './from-string-and-format';
+import { createUTCDate } from './date-from-array';
+import { configFromArray } from './from-array';
import { hooks } from '../utils/hooks';
import { deprecate } from '../utils/deprecate';
import getParsingFlags from './parsing-flags';
+import {defaultLocaleMonthsShort} from '../units/month';
+import {defaultLocaleWeekdaysShort} from '../units/day-of-week';
// iso 8601 regex
// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
@@ -94,70 +98,94 @@ export function configFromISO(config) {
}
// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
-var basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;
+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}))$/;
+
+function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
+ var result = [
+ untruncateYear(yearStr),
+ defaultLocaleMonthsShort.indexOf(monthStr),
+ parseInt(dayStr, 10),
+ parseInt(hourStr, 10),
+ parseInt(minuteStr, 10)
+ ];
+
+ if (secondStr) {
+ result.push(parseInt(secondStr, 10));
+ }
-// date and time from ref 2822 format
-export function configFromRFC2822(config) {
- var string, match, dayFormat,
- dateFormat, timeFormat, tzFormat;
- var timezones = {
- ' GMT': ' +0000',
- ' EDT': ' -0400',
- ' EST': ' -0500',
- ' CDT': ' -0500',
- ' CST': ' -0600',
- ' MDT': ' -0600',
- ' MST': ' -0700',
- ' PDT': ' -0700',
- ' PST': ' -0800'
- };
- var military = 'YXWVUTSRQPONZABCDEFGHIKLM';
- var timezone, timezoneIndex;
-
- string = config._i
- .replace(/\([^\)]*\)|[\n\t]/g, ' ') // Remove comments and folding whitespace
- .replace(/(\s\s+)/g, ' ') // Replace multiple-spaces with a single space
- .replace(/^\s|\s$/g, ''); // Remove leading and trailing spaces
- match = basicRfcRegex.exec(string);
+ return result;
+}
- if (match) {
- dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';
- dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');
- timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');
+function untruncateYear(yearStr) {
+ var year = parseInt(yearStr, 10);
+ if (year <= 49) {
+ return 2000 + year;
+ } else if (year <= 999) {
+ return 1900 + year;
+ }
+ return year;
+}
- // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
- if (match[1]) { // day of week given
- var momentDate = new Date(match[2]);
- var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];
+function preprocessRFC2822(s) {
+ // Remove comments and folding whitespace and replace multiple-spaces with a single space
+ return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim();
+}
- if (match[1].substr(0,3) !== momentDay) {
- getParsingFlags(config).weekdayMismatch = true;
- config._isValid = false;
- return;
- }
+function checkWeekday(weekdayStr, parsedInput, config) {
+ if (weekdayStr) {
+ // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
+ var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
+ weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
+ if (weekdayProvided !== weekdayActual) {
+ getParsingFlags(config).weekdayMismatch = true;
+ config._isValid = false;
+ return false;
}
+ }
+ return true;
+}
- switch (match[5].length) {
- case 2: // military
- if (timezoneIndex === 0) {
- timezone = ' +0000';
- } else {
- timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;
- timezone = ((timezoneIndex < 0) ? ' -' : ' +') +
- (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';
- }
- break;
- case 4: // Zone
- timezone = timezones[match[5]];
- break;
- default: // UT or +/-9999
- timezone = timezones[' GMT'];
+var obsOffsets = {
+ UT: 0,
+ GMT: 0,
+ EDT: -4 * 60,
+ EST: -5 * 60,
+ CDT: -5 * 60,
+ CST: -6 * 60,
+ MDT: -6 * 60,
+ MST: -7 * 60,
+ PDT: -7 * 60,
+ PST: -8 * 60
+};
+
+function calculateOffset(obsOffset, militaryOffset, numOffset) {
+ if (obsOffset) {
+ return obsOffsets[obsOffset];
+ } else if (militaryOffset) {
+ // the only allowed military tz is Z
+ return 0;
+ } else {
+ var hm = parseInt(numOffset, 10);
+ var m = hm % 100, h = (hm - m) / 100;
+ return h * 60 + m;
+ }
+}
+
+// date and time from ref 2822 format
+export function configFromRFC2822(config) {
+ var match = rfc2822.exec(preprocessRFC2822(config._i));
+ if (match) {
+ var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
+ if (!checkWeekday(match[1], parsedArray, config)) {
+ return;
}
- match[5] = timezone;
- config._i = match.splice(1).join('');
- tzFormat = ' ZZ';
- config._f = dayFormat + dateFormat + timeFormat + tzFormat;
- configFromStringAndFormat(config);
+
+ config._a = parsedArray;
+ config._tzm = calculateOffset(match[8], match[9], match[10]);
+
+ config._d = createUTCDate.apply(null, config._a);
+ config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+
getParsingFlags(config).rfc2822 = true;
} else {
config._isValid = false;
diff --git a/node_modules/moment/src/lib/create/valid.js b/node_modules/moment/src/lib/create/valid.js
index 96b1cf615..d13f12f8b 100644
--- a/node_modules/moment/src/lib/create/valid.js
+++ b/node_modules/moment/src/lib/create/valid.js
@@ -14,6 +14,7 @@ export function isValid(m) {
!flags.empty &&
!flags.invalidMonth &&
!flags.invalidWeekday &&
+ !flags.weekdayMismatch &&
!flags.nullInput &&
!flags.invalidFormat &&
!flags.userInvalidated &&