@jbouduin/holidays-lib
Version:
Get World-Wide Holidays
136 lines (135 loc) • 6.72 kB
JavaScript
"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;