var DateMapping = /** @class */ (function () { function DateMapping(monthsLengthFlags, gy, gm, gd) { this.hijriMonthsLengthFlags = monthsLengthFlags; this.gregorianDate = new Date(gy, gm, gd); } return DateMapping; }()); var DatePart; (function (DatePart) { DatePart[DatePart["Year"] = 0] = "Year"; DatePart[DatePart["DayOfYear"] = 1] = "DayOfYear"; DatePart[DatePart["Month"] = 2] = "Month"; DatePart[DatePart["Day"] = 3] = "Day"; })(DatePart || (DatePart = {})); var DatePart$1 = DatePart; // Parts of this file are (c) 2007-2009 Steven Levithan // https://github.com/felixge/node-dateformat/blob/master/lib/dateformat.js var token = /d{1,4}|M{1,4}|yy(?:yy)?|([HhmsTt])\1?|[LlSWN]|"[^"]*"|'[^']*'/g; function pad(val, locale, len) { val = String(val); len = len || 2; while (val.length < len) { val = '0' + val; } return locale.localizeNum(val); } function format(date, mask, locale, hy, hm, hd, woy, dow) { mask = String(locale.masks[mask] || mask || locale.masks.default); var _ = 'get'; var d = hd; var D = date[_ + 'Day'](); var m = hm; var y = hy; var H = date[_ + 'Hours'](); var M = date[_ + 'Minutes'](); var s = date[_ + 'Seconds'](); var L = date[_ + 'Milliseconds'](); var W = woy; var N = dow; var flags = { d: locale.localizeNum(d), dd: pad(d, locale), ddd: locale.dayNamesShort[D], dddd: locale.dayNames[D], M: locale.localizeNum(m), MM: pad(m, locale), MMM: locale.monthNamesShort[m - 1], MMMM: locale.monthNames[m - 1], yy: locale.localizeNum(String(y).slice(2)), yyyy: locale.localizeNum(y), h: locale.localizeNum(H % 12 || 12), hh: pad(H % 12 || 12, locale), H: locale.localizeNum(H), HH: pad(H, locale), m: locale.localizeNum(M), mm: pad(M, locale), s: locale.localizeNum(s), ss: pad(s, locale), l: pad(L, locale, 3), L: pad(Math.round(L / 10), locale), t: H < 12 ? locale.timeNames[0] : locale.timeNames[1], tt: H < 12 ? locale.timeNames[2] : locale.timeNames[3], T: H < 12 ? locale.timeNames[4] : locale.timeNames[5], TT: H < 12 ? locale.timeNames[6] : locale.timeNames[7], S: locale.localizeDayNum(d), W: locale.localizeNum(W), N: locale.localizeNum(N), }; return locale.localizeCommas(mask.replace(token, function (match) { return flags[match]; })); } var symbolMap = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩']; var dayNumMap = ['الأول', 'الثاني', 'الثالث', 'الرابع', 'الخامس', 'السادس', 'السابع', 'الثامن', 'التاسع', 'العاشر', 'الحادي عشر']; var ar = { name: 'ar', rtl: true, dayNamesShort: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], dayNames: ['الأحد', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], monthNamesShort: ['محرم', 'صفر', 'ربيع ١', 'ربيع ٢', 'جمادى ١', 'جمادى ٢', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة'], monthNames: ['محرم', 'صفر', 'ربيع الأول', 'ربيع الثاني', 'جمادى الأولى', 'جمادى الآخرة', 'رجب', 'شعبان', 'رمضان', 'شوال', 'ذو القعدة', 'ذو الحجة'], timeNames: ['ص', 'م', 'ص', 'م', 'ص', 'م', 'ص', 'م'], masks: { default: 'ddd dd MMM yyyy HH:mm:ss', shortDate: 'yy/M/d', mediumDate: 'd MMM, yyyy', longDate: 'd MMMM, yyyy', fullDate: 'dddd, d MMMM, yyyy', shortTime: 'h:mm TT', mediumTime: 'h:mm:ss TT', longTime: 'h:mm:ss.l TT', }, localizeNum: function (num) { var s = String(num); var output = ''; for (var i = 0; i < s.length; i++) { output += symbolMap[s.charAt(i)]; } return output; }, localizeDayNum: function (d) { var output = ''; if (d === 11) { output = 'الحادي عشر'; } else if (d === 20) { output = 'العشرون'; } else if (d === 30) { output = 'الثلاثون'; } else { output = dayNumMap[d - 1]; } var section = d / 10; if (section > 1.1 && section < 2) { output = dayNumMap[(d - 1) % 10] + ' عشر'; } else if (section > 2 && section < 3) { output = dayNumMap[(d - 1) % 10] + ' والعشرون'; } return output + ' من'; }, localizeCommas: function (v) { return v.replace(/,/g, '،'); }, }; var en = { name: 'en', dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], monthNamesShort: ['Muh', 'Ṣaf', 'Rab-I', 'Rab-II', 'Jum-I', 'Jum-II', 'Raj', 'Sha', 'Ram', 'Shw', 'Dhū-Q', 'Dhū-Ḥ'], monthNames: ['Muharram', 'Ṣafar', 'Rabīʿ al-Awwal', 'Rabīʿ ath-Thānī', 'Jumādá al-Ūlá', 'Jumādá al-Ākhirah', 'Rajab', 'Sha‘bān', 'Ramaḍān', 'Shawwāl', 'Dhū al-Qa‘dah', 'Dhū al-Ḥijjah'], timeNames: ['a', 'p', 'am', 'pm', 'A', 'P', 'AM', 'PM'], masks: { default: 'ddd MMM dd yyyy HH:mm:ss', shortDate: 'M/d/yy', mediumDate: 'MMM d, yyyy', longDate: 'MMMM d, yyyy', fullDate: 'dddd, MMMM d, yyyy', shortTime: 'h:mm TT', mediumTime: 'h:mm:ss TT', longTime: 'h:mm:ss.l TT', }, localizeNum: function (num) { return String(num); }, // @ts-ignore localizeDayNum: function (d) { return ['th', 'st', 'nd', 'rd'][d % 10 > 3 ? 0 : (d % 100 - d % 10 !== 10) * d % 10]; }, localizeCommas: function (v) { return v; }, }; /// Calendar support range: /// Calendar Minimum Maximum /// ========== ========== ========== /// Gregorian 1900/04/30 2077/11/16 /// UmAlQura 1318/01/01 1500/12/30 var UmAlQuraStatic = /** @class */ (function () { function UmAlQuraStatic() { } /** * Coverts the given Hijri date to Gregorian. * @param hy The Hijri year * @param hm The Hijri month * @param hd The Hijri day */ UmAlQuraStatic.hijriToGregorian = function (hy, hm, hd) { this._checkYearRange(hy); this._checkMonthRange(hm); this._checkDayRange(hd); var nDays = hd - 1; var index = hy - this.minCalendarYear; var dt = this.hijriYearData[index].gregorianDate; var b = this.hijriYearData[index].hijriMonthsLengthFlags; for (var m = 1; m < hm; m++) { nDays = nDays + 29 + (b & 1); b >>= 1; } dt = this.addDays(dt, nDays); return { gy: dt.getFullYear(), gm: dt.getMonth(), gd: dt.getDate(), }; }; /** * Coverts the given Gregorian date to Hijri year, month and day. * @param date The date to be converted */ UmAlQuraStatic.gregorianToHijri = function (date) { this._checkMillsRange(date.getTime()); // Find the index where we should start our search by quessing the Hijri year that we will be in HijriYearInfo. // A Hijri year is 354 or 355 days. Use 355 days so that we will search from a lower index. var index = Math.trunc((date.getTime() - this.minDate.getTime()) / this.millisPerDay / 355); do { } while (date.getTime() > this.hijriYearData[++index].gregorianDate.getTime()); if (date.getTime() !== this.hijriYearData[index].gregorianDate.getTime()) { index--; } var nDays = this._dayDiff(date, this.hijriYearData[index].gregorianDate); var yh1 = index + this.minCalendarYear; var mh1 = 1; var dh1 = 1; var b = this.hijriYearData[index].hijriMonthsLengthFlags; var daysPerThisMonth = 29 + (b & 1); while (nDays >= daysPerThisMonth) { nDays -= daysPerThisMonth; b >>= 1; daysPerThisMonth = 29 + (b & 1); mh1++; } dh1 += Math.trunc(nDays); return { hy: yh1, hm: mh1, hd: dh1, }; }; /** * Adds the specified amount of Hijri years to the given Gregorian date. * @param date The date * @param hys The Hijri years to be added */ UmAlQuraStatic.addYears = function (date, hys) { return this.addMonths(date, hys * 12); }; /** * Adds the specified amount of Hijri months to the given Gregorian date. * @param date The date * @param hms The Hijri months to be added */ UmAlQuraStatic.addMonths = function (date, hms) { // Get the date in UmAlQura calendar. var y = this._getDatePart(date, DatePart$1.Year); var m = this._getDatePart(date, DatePart$1.Month); var d = this._getDatePart(date, DatePart$1.Day); var i = m - 1 + hms; if (i >= 0) { m = i % 12 + 1; y += Math.trunc(i / 12); } else { m = 12 + (i + 1) % 12; y += Math.trunc((i - 11) / 12); } if (d > 29) { var days = this.getDaysInMonth(y, m); if (d > days) { d = days; } } var _a = this.hijriToGregorian(y, m, d), gy = _a.gy, gm = _a.gm, gd = _a.gd; return this._setTime(new Date(gy, gm, gd), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()); }; /** * Adds the specified amount of weeks to the given Gregorian date. * @param date The date * @param wks The weeks to be added */ UmAlQuraStatic.addWeeks = function (date, wks) { return this.addDays(date, wks * 7); }; /** * Adds the specified amount of days to the given Gregorian date. * @param date The date * @param days The days to be added */ UmAlQuraStatic.addDays = function (date, days) { var d = new Date(date.valueOf()); d.setDate(d.getDate() + days); return d; }; /** * Adds the specified amount of units to the given Gregorian date. * @param date The date * @param value The amount of `unit`s to add * @param unit The unit of time */ UmAlQuraStatic.addTime = function (date, value, unit) { var d = new Date(date.valueOf()); switch (unit) { case 'hour': d.setHours(d.getHours() + value); break; case 'minute': d.setMinutes(d.getMinutes() + value); break; case 'second': d.setSeconds(d.getSeconds() + value); break; case 'millisecond': d.setMilliseconds(d.getMilliseconds() + value); break; default: throw new Error('Invalid value for `unit` param'); } return d; }; /** * Returns the Hijri day of year for the specified Gregorian date. * @param date The date */ UmAlQuraStatic.getDayOfYear = function (date) { return this._getDatePart(date, DatePart$1.DayOfYear); }; /** * Returns the Hijri day of month for the specified Gregorian date. * @param date The date */ UmAlQuraStatic.getDayOfMonth = function (date) { return this._getDatePart(date, DatePart$1.Day); }; /** * Returns the day of week for the specified Gregorian date. * @param date The date */ UmAlQuraStatic.getDayOfWeek = function (date) { return date.getDay(); }; /** * Returns the Hijri week of year for the specified Gregorian date. * @param date The date */ UmAlQuraStatic.getWeekOfYear = function (date) { var firstDayOfYear = this.startOf(date, 'year').getDay(); var daysToDayOfWeek = firstDayOfYear - date.getDay(); var d = this.addDays(date, daysToDayOfWeek); return Math.ceil(this.getDayOfYear(d) / 7); }; /** * Returns the number of days in the specified Hijri year. * @param hy The Hijri year */ UmAlQuraStatic.getDaysInYear = function (hy) { this._checkYearRange(hy); var days = 0; var b = this.hijriYearData[hy - this.minCalendarYear].hijriMonthsLengthFlags; for (var m = 1; m <= 12; m++) { days = days + 29 + (b & 1); b >>= 1; } if (days !== 354 && days !== 355) { throw new Error('Days in year assert error. This is possibly a bug.'); } return days; }; /** * Returns the number of days in the specified Hijri year and month. * @param hy The Hijri year * @param hm The Hijri month */ UmAlQuraStatic.getDaysInMonth = function (hy, hm) { this._checkYearRange(hy); this._checkMonthRange(hm); if ((this.hijriYearData[hy - this.minCalendarYear].hijriMonthsLengthFlags & (1 << hm - 1)) === 0) { return 29; } else { return 30; } }; /** * Returns the Hijri year corresponding to the given Gregorian date. * @param date The date */ UmAlQuraStatic.getYear = function (date) { return this._getDatePart(date, DatePart$1.Year); }; /** * Returns the Hijri month corresponding to the given Gregorian date. * @param date The date */ UmAlQuraStatic.getMonth = function (date) { return this._getDatePart(date, DatePart$1.Month); }; /** * Returns the Hijri month array for the given Gregorian date. * @param date The date */ UmAlQuraStatic.getMonthArray = function (date) { var weeks = []; var month = this.getMonth(date); var start = this.startOf(this.startOf(date, 'month'), 'week'); var end = this.endOf(this.endOf(date, 'month'), 'week'); var i = 0; while (start < end) { var w = Math.floor(i / 7); var day = new Date(start.valueOf()); weeks[w] = weeks[w] || []; weeks[w].push(this.getMonth(day) === month ? day : null); start.setDate(start.getDate() + 1); i++; } return weeks; }; /** * Returns the Gregorian date corresponding to the Hijri date starting at the specified unit of time. * @param date: The date * @param unit: The unit of time */ UmAlQuraStatic.startOf = function (date, unit) { var d = new Date(date); var _a = this.gregorianToHijri(d), hy = _a.hy, hm = _a.hm; switch (unit) { case 'year': return this.toDate(hy, 1, 1, 0, 0, 0, 0); case 'month': return this.toDate(hy, hm, 1, 0, 0, 0, 0); case 'week': var dow = this.getDayOfWeek(d); d = this.addDays(d, -dow); case 'day': d.setHours(0); case 'hour': d.setMinutes(0); case 'minute': d.setSeconds(0); case 'second': d.setMilliseconds(0); break; default: throw new Error('Invalid value for `unit` param'); } return d; }; /** * Returns the Gregorian date corresponding to the Hijri date ending at the specified unit of time. * @param date: The date * @param unit: The unit of time */ UmAlQuraStatic.endOf = function (date, unit) { var d = new Date(date); var _a = this.gregorianToHijri(d), hy = _a.hy, hm = _a.hm; var daysInMonth; switch (unit) { case 'year': daysInMonth = this.getDaysInMonth(hy, 12); return this.toDate(hy, 12, daysInMonth, 23, 59, 59, 999); case 'month': daysInMonth = this.getDaysInMonth(hy, hm); return this.toDate(hy, hm, daysInMonth, 23, 59, 59, 999); case 'week': var dow = this.getDayOfWeek(d); d = this.addDays(d, 6 - dow); case 'day': d.setHours(23); case 'hour': d.setMinutes(59); case 'minute': d.setSeconds(59); case 'second': d.setMilliseconds(999); break; default: throw new Error('Invalid value for `unit` param'); } return d; }; /** * Returns whether or not the given Hijri year is a leap year. * A Hijri leap year is where the number of days in that year is 355. * @param hy The Hijri year */ UmAlQuraStatic.isLeapYear = function (hy) { return this.getDaysInYear(hy) === 355; }; /** * Converts the specified Hijri date time to a Gregorian Date instance. * @param hy The Hijri year * @param hm The Hijri month * @param hd The Hijri day * @param hour The Hour component * @param minute The Minute component * @param second The Second component * @param millisecond The Millisecond component */ UmAlQuraStatic.toDate = function (hy, hm, hd, hour, minute, second, millisecond) { if (hour === void 0) { hour = 0; } if (minute === void 0) { minute = 0; } if (second === void 0) { second = 0; } if (millisecond === void 0) { millisecond = 0; } var daysInMonth = this.getDaysInMonth(hy, hm); if (hd < 1 || hd > daysInMonth) { throw new Error("Invalid value for day for the given year/month. Day must be between 1 and " + daysInMonth + "."); } if (hour < 0 || hour >= 24 || minute < 0 || minute >= 60 || second < 0 || second >= 60 || millisecond < 0 || millisecond >= this.millisPerSecond) { throw new Error('Invalid value for hour, minute, second or millisecond.'); } var _a = this.hijriToGregorian(hy, hm, hd), gy = _a.gy, gm = _a.gm, gd = _a.gd; return this._setTime(new Date(gy, gm, gd), hour, minute, second, millisecond); }; /** * Formats the specified Gregorian Date instance in Hijri date. * @param date The date * @param mask The format mask * @param locale The locale to use. If omitted, uses the globally set locale or the default locale. */ UmAlQuraStatic.format = function (date, mask, locale) { var _a = this.gregorianToHijri(date), hy = _a.hy, hm = _a.hm, hd = _a.hd; return format(date, mask, locale ? this._loadLocale(locale) : this.locale, hy, hm, hd, this.getWeekOfYear(date), this.getDayOfWeek(date)); }; /** * Sets global locale to be used for formatting. * @param locale The locale */ UmAlQuraStatic.setLocale = function (locale) { this.locale = this._loadLocale(locale); }; /** * Registers the specified locale. * @param locale The locale */ UmAlQuraStatic.registerLocale = function (locale) { if (!locale.name) { throw new Error("The locale's 'name' property must not be empty."); } if (this.locales[locale.name]) { throw new Error("A locale with the same name '" + locale.name + "' is already registered."); } this.locales[locale.name] = locale; }; UmAlQuraStatic._loadLocale = function (locale) { if (this.locales[locale]) { return this.locales[locale]; } console.warn("The requested locale '" + locale + "' could not be found. Using the default locale instead."); return en; }; UmAlQuraStatic._getDatePart = function (date, part) { var _a = this.gregorianToHijri(date), hy = _a.hy, hm = _a.hm, hd = _a.hd; switch (part) { case DatePart$1.Year: return hy; case DatePart$1.Month: return hm; case DatePart$1.Day: return hd; case DatePart$1.DayOfYear: return Math.trunc(this._getAbsoluteDateUmAlQura(hy, hm, hd) - this._getAbsoluteDateUmAlQura(hy, 1, 1) + 1); } }; UmAlQuraStatic._setTime = function (date, hour, minute, second, millisecond) { date.setHours(hour); date.setMinutes(minute); date.setSeconds(second); date.setMilliseconds(millisecond); return date; }; UmAlQuraStatic._getAbsoluteDateUmAlQura = function (hy, hm, hd) { var _a = this.hijriToGregorian(hy, hm, hd), gy = _a.gy, gm = _a.gm, gd = _a.gd; return new Date(gy, gm, gd).getTime() / this.millisPerDay; }; UmAlQuraStatic._checkYearRange = function (hy) { if (hy < this.minCalendarYear || hy > this.maxCalendarYear) { throw new Error("Invalid value for year. Must be between " + this.minCalendarYear + " and " + this.maxCalendarYear + "."); } }; UmAlQuraStatic._checkMonthRange = function (hm) { if (hm < 1 || hm > 12) { throw new Error("Invalid value for month. Must be between 1 and 12."); } }; UmAlQuraStatic._checkDayRange = function (day) { if (day < 1 || day > 30) { throw new Error("Invalid value for day. Must be between 1 and 30."); } }; UmAlQuraStatic._checkMillsRange = function (millis) { if (millis < this.minDate.getTime() || millis > this.maxDate.getTime()) { throw new Error("Invalid value for epoch. Must be between " + this.minDate.getTime() + " and " + this.maxDate.getTime() + "."); } }; UmAlQuraStatic._dayDiff = function (date, other) { return (date.getTime() - other.getTime()) / (1000 * 60 * 60 * 24); }; UmAlQuraStatic._initDateMapping = function () { var rawData = [ // This data is auto generated from the .net BCL which seemed the most accurate // Other source which have been found having abnormalities include: // http://www.staff.science.uu.nl/~gent0113/islam/addfiles/islamcalendar_dat.js - Has 28 days in one of the month which is impossible // http://www.ummulqura.org.sa/ - Has several inaccurate dates // Generated by /personal-proj/umalqura/data-gen /* DaysPerM GY GM GD D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 1318*/ 0x02EA, 1900, 4, 30, 0x06E9, 1901, 4, 19, 0x0ED2, 1902, 4, 9, 0x0EA4, 1903, 3, 30, 0x0D4A, 1904, 3, 18, 0x0A96, 1905, 3, 7, 0x0536, 1906, 2, 24, 0x0AB5, 1907, 2, 13, 0x0DAA, 1908, 2, 3, 0x0BA4, 1909, 1, 23, 0x0B49, 1910, 1, 12, 0x0A93, 1911, 1, 1, 0x052B, 1911, 12, 21, 0x0A57, 1912, 12, 9, 0x04B6, 1913, 11, 29, 0x0AB5, 1914, 11, 18, 0x05AA, 1915, 11, 8, 0x0D55, 1916, 10, 27, 0x0D2A, 1917, 10, 17, 0x0A56, 1918, 10, 6, 0x04AE, 1919, 9, 25, 0x095D, 1920, 9, 13, 0x02EC, 1921, 9, 3, 0x06D5, 1922, 8, 23, 0x06AA, 1923, 8, 13, 0x0555, 1924, 8, 1, 0x04AB, 1925, 7, 21, 0x095B, 1926, 7, 10, 0x02BA, 1927, 6, 30, 0x0575, 1928, 6, 18, 0x0BB2, 1929, 6, 8, 0x0764, 1930, 5, 29, 0x0749, 1931, 5, 18, 0x0655, 1932, 5, 6, 0x02AB, 1933, 4, 25, 0x055B, 1934, 4, 14, 0x0ADA, 1935, 4, 4, 0x06D4, 1936, 3, 24, 0x0EC9, 1937, 3, 13, 0x0D92, 1938, 3, 3, 0x0D25, 1939, 2, 20, 0x0A4D, 1940, 2, 9, 0x02AD, 1941, 1, 28, 0x056D, 1942, 1, 17, 0x0B6A, 1943, 1, 7, 0x0B52, 1943, 12, 28, 0x0AA5, 1944, 12, 16, 0x0A4B, 1945, 12, 5, 0x0497, 1946, 11, 24, 0x0937, 1947, 11, 13, 0x02B6, 1948, 11, 2, 0x0575, 1949, 10, 22, 0x0D6A, 1950, 10, 12, 0x0D52, 1951, 10, 2, 0x0A96, 1952, 9, 20, 0x092D, 1953, 9, 9, 0x025D, 1954, 8, 29, 0x04DD, 1955, 8, 18, 0x0ADA, 1956, 8, 7, 0x05D4, 1957, 7, 28, 0x0DA9, 1958, 7, 17, 0x0D52, 1959, 7, 7, 0x0AAA, 1960, 6, 25, 0x04D6, 1961, 6, 14, 0x09B6, 1962, 6, 3, 0x0374, 1963, 5, 24, 0x0769, 1964, 5, 12, 0x0752, 1965, 5, 2, 0x06A5, 1966, 4, 21, 0x054B, 1967, 4, 10, 0x0AAB, 1968, 3, 29, 0x055A, 1969, 3, 19, 0x0AD5, 1970, 3, 8, 0x0DD2, 1971, 2, 26, 0x0DA4, 1972, 2, 16, 0x0D49, 1973, 2, 4, 0x0A95, 1974, 1, 24, 0x052D, 1975, 1, 13, 0x0A5D, 1976, 1, 2, 0x055A, 1976, 12, 22, 0x0AD5, 1977, 12, 11, 0x06AA, 1978, 12, 1, 0x0695, 1979, 11, 20, 0x052B, 1980, 11, 8, 0x0A57, 1981, 10, 28, 0x04AE, 1982, 10, 18, 0x0976, 1983, 10, 7, 0x056C, 1984, 9, 26, 0x0B55, 1985, 9, 15, 0x0AAA, 1986, 9, 5, 0x0A55, 1987, 8, 25, 0x04AD, 1988, 8, 13, 0x095D, 1989, 8, 2, 0x02DA, 1990, 7, 23, 0x05D9, 1991, 7, 12, 0x0DB2, 1992, 7, 1, 0x0BA4, 1993, 6, 21, 0x0B4A, 1994, 6, 10, 0x0A55, 1995, 5, 30, 0x02B5, 1996, 5, 18, 0x0575, 1997, 5, 7, 0x0B6A, 1998, 4, 27, 0x0BD2, 1999, 4, 17, 0x0BC4, 2000, 4, 6, 0x0B89, 2001, 3, 26, 0x0A95, 2002, 3, 15, 0x052D, 2003, 3, 4, 0x05AD, 2004, 2, 21, 0x0B6A, 2005, 2, 10, 0x06D4, 2006, 1, 31, 0x0DC9, 2007, 1, 20, 0x0D92, 2008, 1, 10, 0x0AA6, 2008, 12, 29, 0x0956, 2009, 12, 18, 0x02AE, 2010, 12, 7, 0x056D, 2011, 11, 26, 0x036A, 2012, 11, 15, 0x0B55, 2013, 11, 4, 0x0AAA, 2014, 10, 25, 0x094D, 2015, 10, 14, 0x049D, 2016, 10, 2, 0x095D, 2017, 9, 21, 0x02BA, 2018, 9, 11, 0x05B5, 2019, 8, 31, 0x05AA, 2020, 8, 20, 0x0D55, 2021, 8, 9, 0x0A9A, 2022, 7, 30, 0x092E, 2023, 7, 19, 0x026E, 2024, 7, 7, 0x055D, 2025, 6, 26, 0x0ADA, 2026, 6, 16, 0x06D4, 2027, 6, 6, 0x06A5, 2028, 5, 25, 0x054B, 2029, 5, 14, 0x0A97, 2030, 5, 3, 0x054E, 2031, 4, 23, 0x0AAE, 2032, 4, 11, 0x05AC, 2033, 4, 1, 0x0BA9, 2034, 3, 21, 0x0D92, 2035, 3, 11, 0x0B25, 2036, 2, 28, 0x064B, 2037, 2, 16, 0x0CAB, 2038, 2, 5, 0x055A, 2039, 1, 26, 0x0B55, 2040, 1, 15, 0x06D2, 2041, 1, 4, 0x0EA5, 2041, 12, 24, 0x0E4A, 2042, 12, 14, 0x0A95, 2043, 12, 3, 0x052D, 2044, 11, 21, 0x0AAD, 2045, 11, 10, 0x036C, 2046, 10, 31, 0x0759, 2047, 10, 20, 0x06D2, 2048, 10, 9, 0x0695, 2049, 9, 28, 0x052D, 2050, 9, 17, 0x0A5B, 2051, 9, 6, 0x04BA, 2052, 8, 26, 0x09BA, 2053, 8, 15, 0x03B4, 2054, 8, 5, 0x0B69, 2055, 7, 25, 0x0B52, 2056, 7, 14, 0x0AA6, 2057, 7, 3, 0x04B6, 2058, 6, 22, 0x096D, 2059, 6, 11, 0x02EC, 2060, 5, 31, 0x06D9, 2061, 5, 20, 0x0EB2, 2062, 5, 10, 0x0D54, 2063, 4, 30, 0x0D2A, 2064, 4, 18, 0x0A56, 2065, 4, 7, 0x04AE, 2066, 3, 27, 0x096D, 2067, 3, 16, 0x0D6A, 2068, 3, 5, 0x0B54, 2069, 2, 23, 0x0B29, 2070, 2, 12, 0x0A93, 2071, 2, 1, 0x052B, 2072, 1, 21, 0x0A57, 2073, 1, 9, 0x0536, 2073, 12, 30, 0x0AB5, 2074, 12, 19, 0x06AA, 2075, 12, 9, 0x0E93, 2076, 11, 27, 0, 2077, 11, 17 /* 0 0 0 0 0 0 0 0 0 0 0 0 2077-11-17*/ ]; var mapping = []; for (var i = 0; i < rawData.length / 4; i++) { mapping.push(new DateMapping(rawData[i * 4], rawData[i * 4 + 1], rawData[i * 4 + 2] - 1, rawData[i * 4 + 3])); } return mapping; }; // private static readonly maxSeconds = 9223372036854775807 / 10000000; // private static readonly minSeconds = -9223372036854775807 / 10000000; UmAlQuraStatic.millisPerSecond = 1000; UmAlQuraStatic.millisPerMinute = UmAlQuraStatic.millisPerSecond * 60; UmAlQuraStatic.millisPerHour = UmAlQuraStatic.millisPerMinute * 60; UmAlQuraStatic.millisPerDay = UmAlQuraStatic.millisPerHour * 24; UmAlQuraStatic.minDate = new Date(1900, 3, 30); UmAlQuraStatic.maxDate = new Date(2077, 10, 16, 23, 59, 59, 999); UmAlQuraStatic.hijriYearData = UmAlQuraStatic._initDateMapping(); // Holds globally set locale UmAlQuraStatic.locale = en; // Holds registered locales UmAlQuraStatic.locales = {}; UmAlQuraStatic.minCalendarYear = 1318; UmAlQuraStatic.maxCalendarYear = 1500; return UmAlQuraStatic; }()); // Register both locales so they'll be bundled in the package. // This is fine since for this library, there will probably be // only be these two locales. UmAlQuraStatic.registerLocale(ar); UmAlQuraStatic.registerLocale(en); var UmAlQura = /** @class */ (function () { function UmAlQura(dateOrHy, hm, hd, hour, minute, second, millisecond) { if (hour === void 0) { hour = 0; } if (minute === void 0) { minute = 0; } if (second === void 0) { second = 0; } if (millisecond === void 0) { millisecond = 0; } this._date = new Date(0, 0, 0); this._hy = 0; this._hm = 0; this._hd = 0; if (dateOrHy instanceof Date) { this._setDate(dateOrHy); } else if (dateOrHy !== undefined && hm !== undefined && hd !== undefined) { var _a = UmAlQuraStatic.hijriToGregorian(dateOrHy, hm, hd), gy = _a.gy, gm = _a.gm, gd = _a.gd; this._setDate(new Date(gy, gm, gd, hour, minute, second, millisecond)); } else { this._setDate(new Date()); } } Object.defineProperty(UmAlQura.prototype, "date", { /** * Returns the `Date` object of this instance. */ get: function () { return new Date(this._date.valueOf()); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "hy", { /** * Returns the Hijri year of this instance. */ get: function () { return this._hy; }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "hm", { /** * Returns the Hijri month of this instance. */ get: function () { return this._hm; }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "hd", { /** * Returns the Hijri day of month of this instance. */ get: function () { return this._hd; }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "dayOfYear", { /** * Returns the Hijri day of year of this instance. */ get: function () { return UmAlQuraStatic.getDayOfYear(this.date); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "dayOfWeek", { /** * Returns the day of week of this instance. */ get: function () { return UmAlQuraStatic.getDayOfWeek(this.date); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "weekOfYear", { /** * Returns the Hijri week of year of this instance. */ get: function () { return UmAlQuraStatic.getWeekOfYear(this.date); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "daysInYear", { /** * Returns the number of days in year of this instance. */ get: function () { return UmAlQuraStatic.getDaysInYear(this.hy); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "daysInMonth", { /** * Returns the number of days in month of this instance. */ get: function () { return UmAlQuraStatic.getDaysInMonth(this.hy, this.hm); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "isLeapYear", { /** * Returns whether or not the Hijri year of this instance is a leap year. */ get: function () { return UmAlQuraStatic.isLeapYear(this.hy); }, enumerable: true, configurable: true }); Object.defineProperty(UmAlQura.prototype, "monthArray", { /** * Returns the Hijri month array of this instance. */ get: function () { return UmAlQuraStatic.getMonthArray(this.date) .map(function (w) { return w.map(function (d) { return d ? new UmAlQura(d) : null; }); }); }, enumerable: true, configurable: true }); /** * Adds the specified amount of `unit` to the current date and returns a new instance. * @param {number} value The amount of units to be added * @param {UnitOfTimeMs} unit The unit of time */ UmAlQura.prototype.add = function (value, unit) { switch (unit) { case 'year': return new UmAlQura(UmAlQuraStatic.addYears(this.date, value)); case 'month': return new UmAlQura(UmAlQuraStatic.addMonths(this.date, value)); case 'week': return new UmAlQura(UmAlQuraStatic.addWeeks(this.date, value)); case 'day': return new UmAlQura(UmAlQuraStatic.addDays(this.date, value)); case 'hour': case 'minute': case 'second': case 'millisecond': return new UmAlQura(UmAlQuraStatic.addTime(this.date, value, unit)); default: throw new Error('Invalid value for `unit`'); } }; /** * Subtracts the specified amount of `unit` from the current date and returns a new instance. * @param {number} value The amount of units to be subtracted * @param {UnitOfTimeMs} unit The unit of time */ UmAlQura.prototype.subtract = function (value, unit) { return this.add(value * -1, unit); }; /** * Returns a new instance having the Hijri date of this instance starting at the specified unit of time. * @param {UnitOfTime} unit The unit of time */ UmAlQura.prototype.startOf = function (unit) { return new UmAlQura(UmAlQuraStatic.startOf(this.date, unit)); }; /** * Returns a new instance having the Hijri date of this instance ending at the specified unit of time. * @param {UnitOfTime} unit The unit of time */ UmAlQura.prototype.endOf = function (unit) { return new UmAlQura(UmAlQuraStatic.endOf(this.date, unit)); }; /** * Checks if current date is before the specified date. The comparison is made based on milliseconds of both * times. This can be changed by specifying a value for the `unit` parameter. * @param {(UmAlQura | Date)} other The date to compare against * @param {UnitOfTimeMs} [unit='millisecond'] The unit of time */ UmAlQura.prototype.isBefore = function (other, unit) { if (unit === void 0) { unit = 'millisecond'; } var thisDate = this.date; var thatDate = other instanceof Date ? other : other.date; if (unit === 'millisecond') { return thisDate.valueOf() < thatDate.valueOf(); } else { return this.endOf(unit).date.valueOf() < thatDate.valueOf(); } }; /** * Checks if current date is after the specified date. The comparison is made based on milliseconds, * this can be changed by specifying a value for the `unit` parameter. * @param {(UmAlQura | Date)} other The date to compare against * @param {UnitOfTimeMs} [unit='millisecond'] The unit of time */ UmAlQura.prototype.isAfter = function (other, unit) { if (unit === void 0) { unit = 'millisecond'; } var thisDate = this.date; var thatDate = other instanceof Date ? other : other.date; if (unit === 'millisecond') { return thisDate.valueOf() > thatDate.valueOf(); } else { return this.startOf(unit).date.valueOf() > thatDate.valueOf(); } }; /** * Checks if current date is same as the specified date. The comparison is made based on milliseconds, * this can be changed by specifying a value for the `unit` parameter. * @param {(UmAlQura | Date)} other The date to compare against * @param {UnitOfTimeMs} [unit='millisecond'] The unit of time */ UmAlQura.prototype.isSame = function (other, unit) { if (unit === void 0) { unit = 'millisecond'; } var thisDate = this.date; var thatDate = other instanceof Date ? other : other.date; if (unit === 'millisecond') { return thisDate.valueOf() === thatDate.valueOf(); } else { return this.startOf(unit).date.valueOf() === new UmAlQura(thatDate).startOf(unit).date.valueOf(); } }; /** * Checks if current date is same as or before the specified date. The comparison is made based on milliseconds, * this can be changed by specifying a value for the `unit` parameter. * @param {(UmAlQura | Date)} other The date to compare against * @param {UnitOfTimeMs} [unit='millisecond'] The unit of time */ UmAlQura.prototype.isSameOrBefore = function (other, unit) { if (unit === void 0) { unit = 'millisecond'; } return this.isSame(other, unit) || this.isBefore(other, unit); }; /** * Checks if current date is same as or after the specified date. The comparison is made based on milliseconds, * this can be changed by specifying a value for the `unit` parameter. * @param {(UmAlQura | Date)} other The date to compare against * @param {UnitOfTimeMs} [unit='millisecond'] The unit of time */ UmAlQura.prototype.isSameOrAfter = function (other, unit) { if (unit === void 0) { unit = 'millisecond'; } return this.isSame(other, unit) || this.isAfter(other, unit); }; /** * Checks if current date is between the specified `from`/`to` dates. The comparison is made based on milliseconds, * this can be changed by specifying a value for the `unit` parameter. The comparison is exclusive of both ends by default, * this can be controller by `fromInclusive`/`toInclusive` parameters. * @param {(UmAlQura | Date)} from The lower bound date * @param {(UmAlQura | Date)} to The higher bound date * @param {boolean} [fromInclusive=false] Whether lower bound is inclusive, defaults to false. * @param {boolean} [toInclusive=false] Whether upper bound is inclusive, defaults to false. * @param {UnitOfTimeMs} [unit='millisecond'] The unit of time */ UmAlQura.prototype.isBetween = function (from, to, fromInclusive, toInclusive, unit) { if (fromInclusive === void 0) { fromInclusive = false; } if (toInclusive === void 0) { toInclusive = false; } if (unit === void 0) { unit = 'millisecond'; } return (fromInclusive ? this.isSameOrAfter(from, unit) : this.isAfter(from, unit)) && (toInclusive ? this.isSameOrBefore(to, unit) : this.isBefore(to, unit)); }; /** * Formats this instance in Hijri date. * @param {string} mask The mask * @param {string} locale The locale to use. If omitted, uses the locale set via `locale` or the default locale. */ UmAlQura.prototype.format = function (mask, locale) { // tslint:disable-next-line:no-string-literal return UmAlQuraStatic.format(this.date, mask, locale || UmAlQuraStatic['locale'].name); }; /** * Clones this instance and returns a new instance with the same values. */ UmAlQura.prototype.clone = function () { return new UmAlQura(this.date); }; UmAlQura.prototype._setDate = function (date) { var _a = UmAlQuraStatic.gregorianToHijri(date), hy = _a.hy, hm = _a.hm, hd = _a.hd; this._date = new Date(date.valueOf()); this._hy = hy; this._hm = hm; this._hd = hd; }; return UmAlQura; }()); function umalqura(dateOrHy, hm, hd, hour, minute, second, millisecond) { if (hour === void 0) { hour = 0; } if (minute === void 0) { minute = 0; } if (second === void 0) { second = 0; } if (millisecond === void 0) { millisecond = 0; } if (dateOrHy instanceof Date) { return new UmAlQura(dateOrHy); } else if (dateOrHy !== undefined && hm !== undefined && hd !== undefined) { return new UmAlQura(dateOrHy, hm, hd, hour, minute, second, millisecond); } else { return new UmAlQura(); } } /** * Returns the library version. */ umalqura.VERSION = "0.0.7"; /** * Returns a class which exposes static Hijri related functions. */ umalqura.$ = UmAlQuraStatic; /** * Returns the minimum supported Hijri date. */ umalqura.min = umalqura(UmAlQuraStatic['minCalendarYear'], 1, 1); /** * Returns the maximum supported Hijri date. */ umalqura.max = umalqura(UmAlQuraStatic['maxCalendarYear'], 1, 1).endOf('year'); /** * Gets or sets the global locale * @param locale The locale to set. If omitted, returns the current locale */ umalqura.locale = function (locale) { return locale ? UmAlQuraStatic.setLocale(locale) : UmAlQuraStatic['locale'].name; }; /** * Returns whether the currently set locale is RTL or not. */ umalqura.rtl = function () { return !!UmAlQuraStatic['locale'].rtl; }; /** * Returns the times names using the currently set locale. */ umalqura.times = function () { return UmAlQuraStatic['locale'].timeNames.slice(); }; /** * Returns the days names using the currently set locale. */ umalqura.days = function () { return UmAlQuraStatic['locale'].dayNames.slice(); }; /** * Returns the days short names using the currently set locale. */ umalqura.daysShort = function () { return UmAlQuraStatic['locale'].dayNamesShort.slice(); }; /** * Returns the months names using the currently set locale. */ umalqura.months = function () { return UmAlQuraStatic['locale'].monthNames.slice(); }; /** * Returns the months short names using the currently set locale. */ umalqura.monthsShort = function () { return UmAlQuraStatic['locale'].monthNamesShort.slice(); }; /** * Returns the localized number for the given number using the currently set locale. */ umalqura.localizeNum = function (num) { return UmAlQuraStatic['locale'].localizeNum(num); }; /** * Returns the localized day number for the given day number using the currently set locale. */ umalqura.localizeDayNum = function (d) { return UmAlQuraStatic['locale'].localizeDayNum(d); }; export default umalqura;