UNPKG

@qvant/qui-max

Version:

A Vue 3 Design system for Web.

180 lines (179 loc) 7.18 kB
import defaultLocale from "../locale/en-US/index.js"; import subMilliseconds from "../subMilliseconds/index.js"; import toDate from "../toDate/index.js"; import assign from "../_lib/assign/index.js"; import longFormatters from "../_lib/format/longFormatters/index.js"; import getTimezoneOffsetInMilliseconds from "../_lib/getTimezoneOffsetInMilliseconds/index.js"; import { isProtectedWeekYearToken, throwProtectedError, isProtectedDayOfYearToken } from "../_lib/protectedTokens/index.js"; import toInteger from "../_lib/toInteger/index.js"; import parsers from "./_lib/parsers/index.js"; import requiredArgs from "../_lib/requiredArgs/index.js"; var TIMEZONE_UNIT_PRIORITY = 10; var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g; var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g; var escapedStringRegExp = /^'([^]*?)'?$/; var doubleQuoteRegExp = /''/g; var notWhitespaceRegExp = /\S/; var unescapedLatinCharacterRegExp = /[a-zA-Z]/; function parse(dirtyDateString, dirtyFormatString, dirtyReferenceDate, dirtyOptions) { requiredArgs(3, arguments); var dateString = String(dirtyDateString); var formatString = String(dirtyFormatString); var options = dirtyOptions || {}; var locale = options.locale || defaultLocale; if (!locale.match) { throw new RangeError("locale must contain match property"); } var localeFirstWeekContainsDate = locale.options && locale.options.firstWeekContainsDate; var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively"); } var localeWeekStartsOn = locale.options && locale.options.weekStartsOn; var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { throw new RangeError("weekStartsOn must be between 0 and 6 inclusively"); } if (formatString === "") { if (dateString === "") { return toDate(dirtyReferenceDate); } else { return new Date(NaN); } } var subFnOptions = { firstWeekContainsDate, weekStartsOn, locale }; var setters = [{ priority: TIMEZONE_UNIT_PRIORITY, subPriority: -1, set: dateToSystemTimezone, index: 0 }]; var i; var tokens = formatString.match(longFormattingTokensRegExp).map(function(substring) { var firstCharacter2 = substring[0]; if (firstCharacter2 === "p" || firstCharacter2 === "P") { var longFormatter = longFormatters[firstCharacter2]; return longFormatter(substring, locale.formatLong, subFnOptions); } return substring; }).join("").match(formattingTokensRegExp); var usedTokens = []; for (i = 0; i < tokens.length; i++) { var token = tokens[i]; if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token)) { throwProtectedError(token, formatString, dirtyDateString); } if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) { throwProtectedError(token, formatString, dirtyDateString); } var firstCharacter = token[0]; var parser = parsers[firstCharacter]; if (parser) { var incompatibleTokens = parser.incompatibleTokens; if (Array.isArray(incompatibleTokens)) { var incompatibleToken = void 0; for (var _i = 0; _i < usedTokens.length; _i++) { var usedToken = usedTokens[_i].token; if (incompatibleTokens.indexOf(usedToken) !== -1 || usedToken === firstCharacter) { incompatibleToken = usedTokens[_i]; break; } } if (incompatibleToken) { throw new RangeError("The format string mustn't contain `".concat(incompatibleToken.fullToken, "` and `").concat(token, "` at the same time")); } } else if (parser.incompatibleTokens === "*" && usedTokens.length) { throw new RangeError("The format string mustn't contain `".concat(token, "` and any other token at the same time")); } usedTokens.push({ token: firstCharacter, fullToken: token }); var parseResult = parser.parse(dateString, token, locale.match, subFnOptions); if (!parseResult) { return new Date(NaN); } setters.push({ priority: parser.priority, subPriority: parser.subPriority || 0, set: parser.set, validate: parser.validate, value: parseResult.value, index: setters.length }); dateString = parseResult.rest; } else { if (firstCharacter.match(unescapedLatinCharacterRegExp)) { throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"); } if (token === "''") { token = "'"; } else if (firstCharacter === "'") { token = cleanEscapedString(token); } if (dateString.indexOf(token) === 0) { dateString = dateString.slice(token.length); } else { return new Date(NaN); } } } if (dateString.length > 0 && notWhitespaceRegExp.test(dateString)) { return new Date(NaN); } var uniquePrioritySetters = setters.map(function(setter2) { return setter2.priority; }).sort(function(a, b) { return b - a; }).filter(function(priority, index, array) { return array.indexOf(priority) === index; }).map(function(priority) { return setters.filter(function(setter2) { return setter2.priority === priority; }).sort(function(a, b) { return b.subPriority - a.subPriority; }); }).map(function(setterArray) { return setterArray[0]; }); var date = toDate(dirtyReferenceDate); if (isNaN(date)) { return new Date(NaN); } var utcDate = subMilliseconds(date, getTimezoneOffsetInMilliseconds(date)); var flags = {}; for (i = 0; i < uniquePrioritySetters.length; i++) { var setter = uniquePrioritySetters[i]; if (setter.validate && !setter.validate(utcDate, setter.value, subFnOptions)) { return new Date(NaN); } var result = setter.set(utcDate, flags, setter.value, subFnOptions); if (result[0]) { utcDate = result[0]; assign(flags, result[1]); } else { utcDate = result; } } return utcDate; } function dateToSystemTimezone(date, flags) { if (flags.timestampIsSet) { return date; } var convertedDate = new Date(0); convertedDate.setFullYear(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()); convertedDate.setHours(date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()); return convertedDate; } function cleanEscapedString(input) { return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'"); } export { parse as default }; //# sourceMappingURL=index.js.map