UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

204 lines (203 loc) • 7.56 kB
/** * DevExtreme (esm/__internal/core/localization/globalize/date.js) * Version: 25.2.3 * Build date: Fri Dec 12 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import "../../../core/localization/globalize/core"; import "../../../core/localization/globalize/number"; import "globalize/date"; import dateLocalization from "../../../core/localization/date"; import * as iteratorUtils from "../../../core/utils/m_iterator"; import { isObject } from "../../../core/utils/m_type"; import Globalize from "globalize"; const ACCEPTABLE_JSON_FORMAT_PROPERTIES = ["skeleton", "date", "time", "datetime", "raw"]; const RTL_MARKS_REGEX = /[\u200E\u200F]/g; if (null !== Globalize && void 0 !== Globalize && Globalize.formatDate) { if ("en" === Globalize.locale().locale) { Globalize.locale("en") } const formattersCache = {}; const FORMATS_TO_GLOBALIZE_MAP = { shortdate: { path: "dateTimeFormats/availableFormats/yMd" }, shorttime: { path: "timeFormats/short" }, longdate: { path: "dateFormats/full" }, longtime: { path: "timeFormats/medium" }, monthandday: { path: "dateTimeFormats/availableFormats/MMMMd" }, monthandyear: { path: "dateTimeFormats/availableFormats/yMMMM" }, quarterandyear: { path: "dateTimeFormats/availableFormats/yQQQ" }, day: { path: "dateTimeFormats/availableFormats/d" }, year: { path: "dateTimeFormats/availableFormats/y" }, shortdateshorttime: { path: "dateTimeFormats/short", parts: ["shorttime", "shortdate"] }, longdatelongtime: { path: "dateTimeFormats/medium", parts: ["longtime", "longdate"] }, month: { pattern: "LLLL" }, shortyear: { pattern: "yy" }, dayofweek: { pattern: "EEEE" }, quarter: { pattern: "QQQ" }, millisecond: { pattern: "SSS" }, hour: { pattern: "HH" }, minute: { pattern: "mm" }, second: { pattern: "ss" } }; const globalizeDateLocalization = { engine: () => "globalize", _getPatternByFormat(format) { const that = this; const lowerFormat = format.toLowerCase(); const globalizeFormat = FORMATS_TO_GLOBALIZE_MAP[lowerFormat]; if ("datetime-local" === lowerFormat) { return "yyyy-MM-ddTHH':'mm':'ss" } if (!globalizeFormat) { return } let result = "path" in globalizeFormat ? that._getFormatStringByPath(globalizeFormat.path) : globalizeFormat.pattern; if ("parts" in globalizeFormat) { iteratorUtils.each(globalizeFormat.parts, ((index, part) => { result = result.replace(`{${index}}`, that._getPatternByFormat(part)) })) } return result }, _getFormatStringByPath: path => Globalize.locale().main(`dates/calendars/gregorian/${path}`), getPeriodNames(format, type) { format = format || "wide"; type = "format" === type ? type : "stand-alone"; const json = Globalize.locale().main(`dates/calendars/gregorian/dayPeriods/${type}/${format}`); return [json.am, json.pm] }, getMonthNames(format, type) { const months = Globalize.locale().main(`dates/calendars/gregorian/months/${"format"===type?type:"stand-alone"}/${format||"wide"}`); return iteratorUtils.map(months, (month => month)) }, getDayNames(format) { const days = Globalize.locale().main(`dates/calendars/gregorian/days/stand-alone/${format||"wide"}`); return iteratorUtils.map(days, (day => day)) }, getTimeSeparator: () => Globalize.locale().main("numbers/symbols-numberSystem-latn/timeSeparator"), removeRtlMarks: text => text.replace(RTL_MARKS_REGEX, ""), format(date, format) { if (!date) { return } if (!format) { return date } let formatter; let formatCacheKey; if ("function" === typeof format) { return format(date) } if (format.formatter) { return format.formatter(date) } format = format.type ?? format; if ("string" === typeof format) { formatCacheKey = `${Globalize.locale().locale}:${format}`; formatter = formattersCache[formatCacheKey]; if (!formatter) { format = { raw: this._getPatternByFormat(format) || format }; formatter = Globalize.dateFormatter(format); formattersCache[formatCacheKey] = formatter } } else { if (!this._isAcceptableFormat(format)) { return } formatter = Globalize.dateFormatter(format) } return this.removeRtlMarks(formatter(date)) }, parse(text, format) { if (!text) { return } if (!format || "function" === typeof format || isObject(format) && !this._isAcceptableFormat(format)) { if (format) { const parsedValue = this.callBase(text, format); if (parsedValue) { return parsedValue } } return Globalize.parseDate(text) } if (format.parser) { return format.parser(text) } if ("string" === typeof format) { format = { raw: this._getPatternByFormat(format) || format } } const parsedDate = Globalize.parseDate(text, format); return parsedDate ?? this.callBase(text, format) }, _isAcceptableFormat(format) { if (format.parser) { return true } for (let i = 0; i < ACCEPTABLE_JSON_FORMAT_PROPERTIES.length; i += 1) { if (Object.prototype.hasOwnProperty.call(format, ACCEPTABLE_JSON_FORMAT_PROPERTIES[i])) { return true } } return false }, firstDayOfWeekIndex() { const firstDay = Globalize.locale().supplemental.weekData.firstDay(); return this._getDayKeys().indexOf(firstDay) }, _getDayKeys() { const days = Globalize.locale().main("dates/calendars/gregorian/days/format/short"); return iteratorUtils.map(days, ((_, key) => key)) } }; dateLocalization.resetInjection(); dateLocalization.inject(globalizeDateLocalization) }