UNPKG

@jbouduin/holidays-lib

Version:
136 lines (135 loc) 6.72 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ChristianHolidayCalculator = void 0; var configuration_1 = require("../configuration"); var base_calculator_1 = require("./base-calculator"); var ChristianHolidayCalculator = /** @class */ (function (_super) { __extends(ChristianHolidayCalculator, _super); //#region Constructor function ChristianHolidayCalculator() { return _super.call(this) || this; } //#endregion //#region Abstract method implementation ChristianHolidayCalculator.prototype.calculateDate = function (holiday, year) { var easternSunday = this.getEasternSunday(holiday.chronology, year); switch (holiday.key) { case configuration_1.ChristianHolidayType.CLEAN_MONDAY: case configuration_1.ChristianHolidayType.SHROVE_MONDAY: { return this.calendarHelper.addDays(easternSunday, -48); } case configuration_1.ChristianHolidayType.MARDI_GRAS: case configuration_1.ChristianHolidayType.CARNIVAL: { return this.calendarHelper.addDays(easternSunday, -47); } case configuration_1.ChristianHolidayType.ASH_WEDNESDAY: { return this.calendarHelper.addDays(easternSunday, -46); } case configuration_1.ChristianHolidayType.MAUNDY_THURSDAY: { return this.calendarHelper.addDays(easternSunday, -3); } case configuration_1.ChristianHolidayType.GOOD_FRIDAY: { return this.calendarHelper.addDays(easternSunday, -2); } case configuration_1.ChristianHolidayType.EASTER_SATURDAY: { return this.calendarHelper.addDays(easternSunday, -1); } case configuration_1.ChristianHolidayType.EASTER: { return easternSunday; } case configuration_1.ChristianHolidayType.EASTER_MONDAY: { return this.calendarHelper.addDays(easternSunday, 1); } case configuration_1.ChristianHolidayType.EASTER_TUESDAY: { return this.calendarHelper.addDays(easternSunday, 2); } case configuration_1.ChristianHolidayType.GENERAL_PRAYER_DAY: { return this.calendarHelper.addDays(easternSunday, 26); } case configuration_1.ChristianHolidayType.ASCENSION_DAY: return this.calendarHelper.addDays(easternSunday, 39); case configuration_1.ChristianHolidayType.WHIT_SUNDAY: case configuration_1.ChristianHolidayType.PENTECOST: { return this.calendarHelper.addDays(easternSunday, 49); } case configuration_1.ChristianHolidayType.WHIT_MONDAY: case configuration_1.ChristianHolidayType.PENTECOST_MONDAY: { return this.calendarHelper.addDays(easternSunday, 50); } case configuration_1.ChristianHolidayType.CORPUS_CHRISTI: { return this.calendarHelper.addDays(easternSunday, 60); } case configuration_1.ChristianHolidayType.SACRED_HEART: { return this.calendarHelper.addDays(easternSunday, 68); } } }; //#endregion //#region IChristianHolidayCalculator interface methods ChristianHolidayCalculator.prototype.getEasternSunday = function (chronology, year) { switch (chronology) { case configuration_1.ChronologyType.JULIAN: { // TODO: originally this checked on the year <= 1583. Took it out. return this.getJulianEasternSunday(year); } case configuration_1.ChronologyType.GREGORIAN: { return this.getGregorianEasterSunday(year); } } }; //#endregion //#region Private methods ChristianHolidayCalculator.prototype.getJulianEasternSunday = function (year) { // source: https://www.staff.science.uu.nl/~gent0113/easter/easter_text2a.htm var a = this.calendarHelper.generalizedModulo(year, 19); var goldenNumber = a + 1; var b = this.calendarHelper.generalizedModulo(year, 4); var c = this.calendarHelper.generalizedModulo(year, 7); var d = this.calendarHelper.generalizedModulo((19 * a + 15), 30); if (goldenNumber === 1) { d++; } var e = this.calendarHelper.generalizedModulo((2 * b + 4 * c - d + 6), 7); var fmj = 113 + d; // Easter full moon [days after -92 March] var dmj = fmj + e + 1; // Easter Sunday [days after -92 March] var esmj = Math.floor(dmj / 31); // month Easter Sunday [March = 3; April = 4] var esdj = this.calendarHelper.generalizedModulo(dmj, 31) + 1; // day Easter Sunday return this.calendarHelper.addDays(new Date(Date.UTC(year, esmj === 3 ? 2 : 3, esdj)), 13); }; ChristianHolidayCalculator.prototype.getGregorianEasterSunday = function (year) { // adapted jollyday code var a = year % 19; var b = Math.floor(year / 100); var c = year % 100; var d = b / 4; var e = b % 4; var f = Math.floor((b + 8) / 25); var g = Math.floor((b - f + 1) / 3); var h = (19 * a + b - d - g + 15) % 30; var i = Math.floor(c / 4); var j = c % 4; var k = (32 + 2 * e + 2 * i - h - j) % 7; var l = Math.floor((a + 11 * h + 22 * k) / 451); var x = h + k - 7 * l + 114; var month = Math.floor(x / 31); var day = (x % 31) + 1; return new Date(Date.UTC(year, month === 3 ? 2 : 3, day)); }; return ChristianHolidayCalculator; }(base_calculator_1.BaseCalculator)); exports.ChristianHolidayCalculator = ChristianHolidayCalculator;