@calj.net/jdates
Version:
The Jewish Dates library from https://CalJ.net
374 lines (373 loc) • 18.5 kB
JavaScript
;
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 },
};