UNPKG

@calj.net/jdates

Version:

The Jewish Dates library from https://CalJ.net

374 lines (373 loc) 18.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Festival = void 0; const HDate_1 = require("./HDate"); const JDate_1 = require("./JDate"); const ParashaScheme_1 = require("./ParashaScheme"); const GDate_1 = require("./GDate"); var FestivalType; (function (FestivalType) { FestivalType[FestivalType["ROSH_HASHANA"] = 0] = "ROSH_HASHANA"; FestivalType[FestivalType["GDALIA"] = 1] = "GDALIA"; FestivalType[FestivalType["YOM_KIPPUR"] = 2] = "YOM_KIPPUR"; FestivalType[FestivalType["SUCCOT"] = 3] = "SUCCOT"; FestivalType[FestivalType["HOSHAANA_RABBA"] = 4] = "HOSHAANA_RABBA"; FestivalType[FestivalType["SHMINI_ATSERET"] = 5] = "SHMINI_ATSERET"; FestivalType[FestivalType["SIMCHAT_TORAH"] = 6] = "SIMCHAT_TORAH"; FestivalType[FestivalType["CHANUKA"] = 7] = "CHANUKA"; FestivalType[FestivalType["TEVET_10"] = 8] = "TEVET_10"; FestivalType[FestivalType["SHVAT_15"] = 9] = "SHVAT_15"; FestivalType[FestivalType["PURIM_QATAN"] = 10] = "PURIM_QATAN"; FestivalType[FestivalType["PURIM_FAST"] = 11] = "PURIM_FAST"; FestivalType[FestivalType["PURIM"] = 12] = "PURIM"; FestivalType[FestivalType["PURIM_SHUSHAN"] = 13] = "PURIM_SHUSHAN"; FestivalType[FestivalType["PESACH"] = 14] = "PESACH"; FestivalType[FestivalType["YOM_HASHOA"] = 15] = "YOM_HASHOA"; FestivalType[FestivalType["YOM_HAZICARON"] = 16] = "YOM_HAZICARON"; FestivalType[FestivalType["YOM_HAATSMAUT"] = 17] = "YOM_HAATSMAUT"; FestivalType[FestivalType["PESACH_SHENI"] = 18] = "PESACH_SHENI"; FestivalType[FestivalType["OMER_33"] = 19] = "OMER_33"; FestivalType[FestivalType["YOM_YERUSHALAYM"] = 20] = "YOM_YERUSHALAYM"; FestivalType[FestivalType["SHAVUOT"] = 21] = "SHAVUOT"; FestivalType[FestivalType["TAMUZ_17"] = 22] = "TAMUZ_17"; FestivalType[FestivalType["AV_9"] = 23] = "AV_9"; FestivalType[FestivalType["AV_15"] = 24] = "AV_15"; })(FestivalType || (FestivalType = {})); const cache = new Map(); const cacheKey = (type, hyear, israel) => (type << 14) + (hyear << 1) + (israel ? 1 : 0); const checkCache = (type, hyear, israel, calculator) => { const key = cacheKey(type, hyear, !!israel); let festival = cache.get(key); if (!festival) { festival = calculator(); cache.set(key, festival); } return festival; }; class Festival { static roshHashana(hyear) { return checkCache(FestivalType.ROSH_HASHANA, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.ROSH_HASHANA, HDate_1.HDate.make(1, HDate_1.HDateMonth.TISHRI, hyear), HDate_1.HDate.make(2, HDate_1.HDateMonth.TISHRI, hyear), [true, true], true)); } static gdalia(hyear) { return checkCache(FestivalType.GDALIA, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { const h3 = HDate_1.HDate.make(3, HDate_1.HDateMonth.TISHRI, hyear); const h = h3.getDayOfWeek() === JDate_1.DayOfWeek.SHABBAT ? h3.plus(1) : h3; return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.GDALIA, h, h, [], false); }); } static yomKippur(hyear) { return checkCache(FestivalType.PESACH, hyear, ParashaScheme_1.ParashaScheme.ISRAEL, () => { const hStart = HDate_1.HDate.make(10, HDate_1.HDateMonth.TISHRI, hyear); return new Festival(ParashaScheme_1.ParashaScheme.ISRAEL, FestivalType.YOM_KIPPUR, hStart, hStart, [true], true); }); } static succot(hyear, israel) { return checkCache(FestivalType.SUCCOT, hyear, israel, () => new Festival(israel, FestivalType.SUCCOT, HDate_1.HDate.make(15, HDate_1.HDateMonth.TISHRI, hyear), HDate_1.HDate.make(22 + (israel ? 0 : 1), HDate_1.HDateMonth.TISHRI, hyear), [ true, !israel, false, false, false, false, false, true, ...(israel ? [] : [true]), ], true)); } static hoshaanaRabba(hyear) { return checkCache(FestivalType.HOSHAANA_RABBA, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.HOSHAANA_RABBA, HDate_1.HDate.make(21, HDate_1.HDateMonth.TISHRI, hyear), null, null, true)); } static shminiAtseret(hyear, israel) { return checkCache(FestivalType.SHMINI_ATSERET, hyear, israel, () => new Festival(israel, FestivalType.SHMINI_ATSERET, HDate_1.HDate.make(22, HDate_1.HDateMonth.TISHRI, hyear), israel ? null : HDate_1.HDate.make(23, HDate_1.HDateMonth.TISHRI, hyear), [true, ...(israel ? [true] : [])], true)); } static simchatTorah(hyear, israel) { return checkCache(FestivalType.SIMCHAT_TORAH, hyear, israel, () => new Festival(israel, FestivalType.SIMCHAT_TORAH, HDate_1.HDate.make(22 + (israel ? 0 : 1), HDate_1.HDateMonth.TISHRI, hyear), null, [true], true)); } static chanuka(hyear) { return checkCache(FestivalType.CHANUKA, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.CHANUKA, HDate_1.HDate.make(25, HDate_1.HDateMonth.KISLEV, hyear), HDate_1.HDate.make(25, HDate_1.HDateMonth.KISLEV, hyear).plus(7), null, true)); } static tevet10(hyear) { return checkCache(FestivalType.TEVET_10, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { const h10 = HDate_1.HDate.make(10, HDate_1.HDateMonth.TEVET, hyear); const h = h10.getDayOfWeek() === JDate_1.DayOfWeek.SHABBAT ? h10.plus(1) : h10; return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.TEVET_10, h, null, null, false); }); } static shvat15(hyear) { return checkCache(FestivalType.SHVAT_15, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.SHVAT_15, HDate_1.HDate.make(15, HDate_1.HDateMonth.SHVAT, hyear), null, null, true)); } static purimQatan(hyear) { if (!HDate_1.HDate.embolismicYear(hyear)) { return null; } return checkCache(FestivalType.PURIM_QATAN, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.PURIM_QATAN, HDate_1.HDate.make(14, HDate_1.HDateMonth.ADAR, hyear), null, null, false); }); } static purimFast(hyear) { return checkCache(FestivalType.PURIM_FAST, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { const h = HDate_1.HDate.make(13, HDate_1.HDateMonth.ADAR2, hyear); const hPurimFast = h.getDayOfWeek() === JDate_1.DayOfWeek.SHABBAT ? h.plus(-2) : h.getDayOfWeek() === JDate_1.DayOfWeek.SHISHI ? h.plus(-1) : h; return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.PURIM_FAST, hPurimFast, null, null, false); }); } static purim(hyear) { return checkCache(FestivalType.PURIM, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.PURIM, HDate_1.HDate.make(14, HDate_1.HDateMonth.ADAR2, hyear), null, null, false)); } static purimShushan(hyear) { return checkCache(FestivalType.PURIM_SHUSHAN, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { const h = HDate_1.HDate.make(15, HDate_1.HDateMonth.ADAR2, hyear); const hPurimShushan = h.getDayOfWeek() === JDate_1.DayOfWeek.SHABBAT ? h.plus(1) : h; return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.PURIM_SHUSHAN, hPurimShushan, null, null, false); }); } static pesach(hyear, israel) { return checkCache(FestivalType.PESACH, hyear, israel, () => { const hStart = HDate_1.HDate.make(15, HDate_1.HDateMonth.NISSAN, hyear); const hEnd = HDate_1.HDate.make(21 + (israel ? 0 : 1), HDate_1.HDateMonth.NISSAN, hyear); return new Festival(israel, FestivalType.PESACH, hStart, hEnd, [ true, !israel, false, false, false, false, true, ...(israel ? [] : [true]), ], true); }); } static yomHaShoa(hyear) { //TODO: pas de yom hashoa avant la shoa. Verifier l'annee de la premier occurrence. return checkCache(FestivalType.YOM_HASHOA, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { const h = HDate_1.HDate.make(27, HDate_1.HDateMonth.NISSAN, hyear); // It can never be Shabbat, as per Dechiot (would mean subsequent Rosh Hashana on Wed, wich is excluded). // Fri: advanced to Thu, because following Sunday is Rosh Chodesh. const hShoa = h.getDayOfWeek() === JDate_1.DayOfWeek.SHISHI ? h.plus(-1) : h.getDayOfWeek() === JDate_1.DayOfWeek.RISHON ? h.plus(1) : h; return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.YOM_HASHOA, hShoa, null, null, true); }); } static yomHaAtsmaut(hyear) { if (hyear < 5708) { return null; } return checkCache(FestivalType.YOM_HAATSMAUT, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { let h = HDate_1.HDate.make(5, HDate_1.HDateMonth.IYAR, hyear); if (hyear !== 5708 && hyear !== 5710 && hyear !== 5711) { if (h.getDayOfWeek() === JDate_1.DayOfWeek.SHABBAT) { h = h.plus(-2); } else if (h.getDayOfWeek() === JDate_1.DayOfWeek.SHISHI) { h = h.plus(-1); } else if (h.getDayOfWeek() == JDate_1.DayOfWeek.MONDAY) { //Si ça tombe un lundi, on reporte au mardi, car ferait un Zikaron le dimanche, //or pour éviter les préparatifs shabbat on repousse d'un jour les deux. h = h.plus(1); } } return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.YOM_HAATSMAUT, h, null, null, true); }); } static yomHaZicaron(hyear) { const yomHaAtsmaut = Festival.yomHaAtsmaut(hyear); // On a year when there is no Yom haAtsma'ut, there isn't a Yom haZicaron too. if (null === yomHaAtsmaut) { return null; } return checkCache(FestivalType.YOM_HAZICARON, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.YOM_HAZICARON, yomHaAtsmaut.getStartDate().plus(-1), null, null, true); }); } static pesachSheni(hyear) { return checkCache(FestivalType.PESACH_SHENI, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.PESACH_SHENI, HDate_1.HDate.make(14, HDate_1.HDateMonth.IYAR, hyear), null, null, true)); } static omer33(hyear) { return checkCache(FestivalType.OMER_33, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.OMER_33, HDate_1.HDate.make(18, HDate_1.HDateMonth.IYAR, hyear), null, null, true)); } /** * Yom Yerushalaym is 28 Iyar, unless it falls on Friday, where it's advanced to Thu. */ static yomYerushalaym(hyear) { return checkCache(FestivalType.YOM_YERUSHALAYM, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { let hdate = HDate_1.HDate.make(28, HDate_1.HDateMonth.IYAR, hyear); if (hdate.getDayOfWeek() === JDate_1.DayOfWeek.SHISHI && hyear != 5780) { // In 2020 despite what I thought, the Friday Yom Yerushalaim was not advanced to Thu. hdate = hdate.plus(-1); } return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.YOM_YERUSHALAYM, hdate, null, null, false); }); } static shavuot(hyear, israel) { return checkCache(FestivalType.SHAVUOT, hyear, israel, () => { const hStart = HDate_1.HDate.make(6, HDate_1.HDateMonth.SIVAN, hyear); const hEnd = HDate_1.HDate.make(6 + (israel ? 0 : 1), HDate_1.HDateMonth.SIVAN, hyear); return new Festival(israel, FestivalType.SHAVUOT, hStart, hEnd, [true, ...(israel ? [] : [true])], true); }); } static tamuz17(hyear) { return checkCache(FestivalType.TAMUZ_17, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { let h = HDate_1.HDate.make(17, HDate_1.HDateMonth.TAMUZ, hyear); if (h.getDayOfWeek() === JDate_1.DayOfWeek.SHABBAT) { h = h.plus(1); } return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.TAMUZ_17, h, null, null, false); }); } static av9(hyear) { return checkCache(FestivalType.AV_9, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { let h = HDate_1.HDate.make(9, HDate_1.HDateMonth.AV, hyear); if (h.getDayOfWeek() == JDate_1.DayOfWeek.SHABBAT) { h = h.plus(1); } return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.AV_9, h, null, null, true); }); } static av15(hyear) { return checkCache(FestivalType.AV_15, hyear, ParashaScheme_1.ParashaScheme.WORLD, () => { return new Festival(ParashaScheme_1.ParashaScheme.WORLD, FestivalType.AV_15, HDate_1.HDate.make(15, HDate_1.HDateMonth.AV, hyear), null, null, true); }); } static onDate(hdate, israel) { const festivals = []; const hyear = hdate.getYear(); let started = false; for (let type = FestivalType.ROSH_HASHANA; type <= FestivalType.AV_15; type++) { const festival = Festival.make(type, hyear, israel); if (!festival) { continue; } if (festival.contains(hdate)) { festivals.push(festival); started = true; } else { if (started) { break; } } } return festivals; } contains(jdate) { return jdate.gte(this.startDate) && jdate.lte(this.endDate); } getEndDate() { return this.endDate; } getStartDate() { return this.startDate; } constructor(_israel, type, startDate, endDate, _yamimTovim, _startsEve) { this._israel = _israel; this.type = type; this.startDate = startDate; this._startsEve = _startsEve; this.yamimTovim = _yamimTovim !== null && _yamimTovim !== void 0 ? _yamimTovim : []; this.endDate = endDate !== null && endDate !== void 0 ? endDate : startDate; } getName() { return Festival.executorMap[this.type].name; } getYamimTovim() { return this.yamimTovim; } /** * Returns the Gregorian day _whose evening_ (Arvit) is first time * we recite Barekh Aleinu (winter prayer in Amida) * In Israel: 7th Cheshvan * In Hu"L : Dec. 4th (or 5th, if the following Greg year is a leap year). * If Friday night -> postponed to Sat. night. */ static winterEve(gyear, israel) { if (israel) { return GDate_1.GDate.make(HDate_1.HDate.make(6, HDate_1.HDateMonth.CHESHVAN, HDate_1.HDate.make(GDate_1.GDate.make(1, 12, gyear)).getYear())); } let g = GDate_1.GDate.make(GDate_1.GDate.isLeapYear(gyear + 1) ? 5 : 4, 12, gyear); if (g.getDayOfWeek() === JDate_1.DayOfWeek.SHISHI) { return g.plus(1); } return g; } static make(type, hyear, israel) { return Festival.executorMap[type].executor(hyear, israel); } } exports.Festival = Festival; Festival.executorMap = { [FestivalType.ROSH_HASHANA]: { name: "ראש השנה", executor: Festival.roshHashana, }, [FestivalType.GDALIA]: { name: "גדליה", executor: Festival.gdalia }, [FestivalType.YOM_KIPPUR]: { name: "יום כיפור", executor: Festival.yomKippur, }, [FestivalType.SUCCOT]: { name: "סוכות", executor: Festival.succot }, [FestivalType.HOSHAANA_RABBA]: { name: "הושענה רבה", executor: Festival.hoshaanaRabba, }, [FestivalType.SHMINI_ATSERET]: { name: "שמיני עצרת", executor: Festival.shminiAtseret, }, [FestivalType.SIMCHAT_TORAH]: { name: "שמחת תורה", executor: Festival.simchatTorah, }, [FestivalType.CHANUKA]: { name: "חנוכה", executor: Festival.chanuka }, [FestivalType.TEVET_10]: { name: "תענית טבת", executor: Festival.tevet10, }, [FestivalType.SHVAT_15]: { name: "טו בשבט", executor: Festival.shvat15 }, [FestivalType.PURIM_QATAN]: { name: "פורים קטן", executor: Festival.purimQatan, }, [FestivalType.PURIM_FAST]: { name: "תענית אסתר", executor: Festival.purimFast, }, [FestivalType.PURIM]: { name: "פורים", executor: Festival.purim }, [FestivalType.PURIM_SHUSHAN]: { name: "פורים שושן", executor: Festival.purimShushan, }, [FestivalType.PESACH]: { name: "פסח", executor: Festival.pesach }, [FestivalType.YOM_HASHOA]: { name: "יום השואה", executor: Festival.yomHaShoa, }, [FestivalType.YOM_HAZICARON]: { name: "יום הזכרון", executor: Festival.yomHaZicaron, }, [FestivalType.YOM_HAATSMAUT]: { name: "יום העצמאות", executor: Festival.yomHaAtsmaut, }, [FestivalType.PESACH_SHENI]: { name: "פסח שני", executor: Festival.pesachSheni, }, [FestivalType.OMER_33]: { name: "לג בעומר", executor: Festival.omer33 }, [FestivalType.YOM_YERUSHALAYM]: { name: "יום ירושלים", executor: Festival.yomYerushalaym, }, [FestivalType.SHAVUOT]: { name: "שבועות", executor: Festival.shavuot }, [FestivalType.TAMUZ_17]: { name: "יז תמוז", executor: Festival.tamuz17 }, [FestivalType.AV_9]: { name: "תשעה באב", executor: Festival.av9 }, [FestivalType.AV_15]: { name: "טו באב", executor: Festival.av15 }, };