UNPKG

@qvant/qui-max

Version:

A Vue 3 Design system for Web.

88 lines (87 loc) 4.15 kB
import isValid from "../isValid/index.js"; import defaultLocale from "../locale/en-US/index.js"; import subMilliseconds from "../subMilliseconds/index.js"; import toDate from "../toDate/index.js"; import formatters from "../_lib/format/formatters/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 requiredArgs from "../_lib/requiredArgs/index.js"; var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g; var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g; var escapedStringRegExp = /^'([^]*?)'?$/; var doubleQuoteRegExp = /''/g; var unescapedLatinCharacterRegExp = /[a-zA-Z]/; function format(dirtyDate, dirtyFormatStr, dirtyOptions) { requiredArgs(2, arguments); var formatStr = String(dirtyFormatStr); var options = dirtyOptions || {}; var locale = options.locale || defaultLocale; 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 (!locale.localize) { throw new RangeError("locale must contain localize property"); } if (!locale.formatLong) { throw new RangeError("locale must contain formatLong property"); } var originalDate = toDate(dirtyDate); if (!isValid(originalDate)) { throw new RangeError("Invalid time value"); } var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate); var utcDate = subMilliseconds(originalDate, timezoneOffset); var formatterOptions = { firstWeekContainsDate, weekStartsOn, locale, _originalDate: originalDate }; var result = formatStr.match(longFormattingTokensRegExp).map(function(substring) { var firstCharacter = substring[0]; if (firstCharacter === "p" || firstCharacter === "P") { var longFormatter = longFormatters[firstCharacter]; return longFormatter(substring, locale.formatLong, formatterOptions); } return substring; }).join("").match(formattingTokensRegExp).map(function(substring) { if (substring === "''") { return "'"; } var firstCharacter = substring[0]; if (firstCharacter === "'") { return cleanEscapedString(substring); } var formatter = formatters[firstCharacter]; if (formatter) { if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) { throwProtectedError(substring, dirtyFormatStr, dirtyDate); } if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) { throwProtectedError(substring, dirtyFormatStr, dirtyDate); } return formatter(utcDate, substring, locale.localize, formatterOptions); } if (firstCharacter.match(unescapedLatinCharacterRegExp)) { throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"); } return substring; }).join(""); return result; } function cleanEscapedString(input) { return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'"); } export { format as default }; //# sourceMappingURL=index.js.map