date-fns-holiday-us
Version:
The purpose of this project is to give an interface to work with holidays using date-fns
329 lines (327 loc) • 8.03 kB
JavaScript
// src/index.ts
import {
addDays as addDays2,
addWeeks,
lastDayOfMonth as lastDayOfMonth2,
getYear,
isEqual,
isSaturday,
isSunday
} from "date-fns";
// src/utils.ts
import {
getDay as getDayOfWeek,
setDate as setDayOfMonth,
addDays,
lastDayOfMonth
} from "date-fns";
function getFirstOccurence(date, dayOfWeekIndex) {
return getNextOccurence(setDayOfMonth(date, 1), dayOfWeekIndex);
}
function getNextOccurence(date, dayOfWeekIndex) {
if (getDayOfWeek(date) === dayOfWeekIndex) {
return date;
}
if (getDayOfWeek(date) > dayOfWeekIndex) {
date = addDays(date, 7 - getDayOfWeek(date) + dayOfWeekIndex);
} else {
date = addDays(date, dayOfWeekIndex - getDayOfWeek(date));
}
return date;
}
function getPrevOccurence(date, dayOfWeekIndex) {
if (getDayOfWeek(date) === dayOfWeekIndex) {
return date;
}
if (getDayOfWeek(date) > dayOfWeekIndex) {
date = addDays(date, -1 * (getDayOfWeek(date) - dayOfWeekIndex));
} else {
date = addDays(date, -1 * (getDayOfWeek(date) - 0 + (7 - dayOfWeekIndex)));
}
return date;
}
function getLastOfMonth(date, dayOfWeekIndex) {
return getPrevOccurence(lastDayOfMonth(date), dayOfWeekIndex);
}
// src/index.ts
function getBlackFriday(year) {
return addDays2(getThanksgiving(year), 1);
}
function getHalloween(year) {
return new Date(year, 9, 31);
}
function getValentinesDay(year) {
return new Date(year, 1, 14);
}
function getMothersDay(year) {
return addWeeks(getFirstOccurence(new Date(year, 4), 0), 1);
}
function getJuneteenth(year) {
return new Date(year, 5, 19);
}
function getEaster(year) {
if (year < 325) {
throw new RangeError("Cannot calculate Easter dates before 325 AD.");
}
function mod(a2, b2) {
return a2 % b2;
}
function div(a2, b2) {
const q = a2 / b2;
if (q < 0) {
throw new Error("Unexpected negative q");
}
return Math.floor(q);
}
const y = year, skipMarchDays = 21, a = mod(y, 19), b = div(y, 100), c = mod(y, 100), d = div(b, 4), e = mod(b, 4), f = div(b + 8, 25), g = div(b - f + 1, 3), h = mod(19 * a + b - d - g + 15, 30), i = div(c, 4), k = mod(c, 4), l = mod(32 + 2 * e + 2 * i - h - k, 7), m = div(a + 11 * h + 22 * l, 451), t = h + l - 7 * m + skipMarchDays, n = div(t, 31) + 3, p = mod(t, 31);
return new Date(year, n - 1, p + 1);
}
function getColumbusDay(year) {
return addWeeks(getFirstOccurence(new Date(year, 9), 1), 1);
}
function getIndependenceDay(year) {
return new Date(year, 6, 4);
}
function getPresidentsDay(year) {
return addWeeks(getFirstOccurence(new Date(year, 1), 1), 2);
}
function getChristmasDay(year) {
return new Date(year, 11, 25);
}
function getChristmasEve(year) {
return new Date(year, 11, 24);
}
function getLaborDay(year) {
return getFirstOccurence(new Date(year, 8), 1);
}
function getVeteransDay(year) {
return new Date(year, 10, 11);
}
function getThanksgiving(year) {
return addWeeks(getFirstOccurence(new Date(year, 10), 4), 3);
}
function getNewYearsEve(year) {
return lastDayOfMonth2(new Date(year, 11));
}
function getMartinLutherKingJrDay(year) {
return addWeeks(getFirstOccurence(new Date(year, 0), 1), 2);
}
function getNewYearsDay(year) {
return new Date(year, 0, 1);
}
function getFathersDay(year) {
return addWeeks(getFirstOccurence(new Date(year, 5), 0), 2);
}
function getMemorialDay(year) {
return getLastOfMonth(new Date(year, 4), 1);
}
function getGoodFriday(year) {
return addDays2(getEaster(year), -2);
}
function getHolidays(year) {
return {
newYearsDay: {
date: getNewYearsDay(year),
bankHoliday: true,
federal: true
},
martinLutherKingJrDay: {
date: getMartinLutherKingJrDay(year),
bankHoliday: true,
federal: true
},
valentinesDay: {
date: getValentinesDay(year),
bankHoliday: false,
federal: false
},
juneteenth: {
date: getJuneteenth(year),
bankHoliday: year < 2022 ? false : true,
federal: true
},
easter: {
date: getEaster(year),
bankHoliday: false,
federal: false
},
presidentsDay: {
date: getPresidentsDay(year),
bankHoliday: true,
federal: false
},
memorialDay: {
date: getMemorialDay(year),
bankHoliday: true,
federal: true
},
independenceDay: {
date: getIndependenceDay(year),
bankHoliday: true,
federal: true
},
laborDay: {
date: getLaborDay(year),
bankHoliday: true,
federal: true
},
goodFriday: {
date: getGoodFriday(year),
bankHoliday: false,
federal: false
},
mothersDay: {
date: getMothersDay(year),
bankHoliday: false,
federal: false
},
columbusDay: {
date: getColumbusDay(year),
bankHoliday: true,
federal: true
},
halloween: {
date: getHalloween(year),
bankHoliday: false,
federal: false
},
fathersDay: {
date: getFathersDay(year),
bankHoliday: false,
federal: false
},
veteransDay: {
date: getVeteransDay(year),
bankHoliday: true,
federal: true
},
thanksgiving: {
date: getThanksgiving(year),
bankHoliday: true,
federal: true
},
blackFriday: {
date: getBlackFriday(year),
bankHoliday: false,
federal: false
},
christmasDay: {
date: getChristmasDay(year),
bankHoliday: true,
federal: true
},
christmasEve: {
date: getChristmasEve(year),
bankHoliday: false,
federal: false
},
newYearsEve: {
date: getNewYearsEve(year),
bankHoliday: false,
federal: false
}
};
}
function getBankHolidays(year) {
const holidays = getHolidays(year);
return Object.keys(holidays).reduce((acc, holidayName) => {
const holiday = holidays[holidayName];
if (holiday.bankHoliday) {
return {
...acc,
[holidayName]: {
date: holiday.date
}
};
}
return acc;
}, {});
}
function getFederalHolidays(year) {
const holidays = getHolidays(year);
return Object.keys(holidays).reduce((acc, holidayName) => {
const holiday = holidays[holidayName];
if (holiday.federal) {
return {
...acc,
[holidayName]: {
date: holiday.date
}
};
}
return acc;
}, {});
}
function getObservedHolidays(year) {
const holidays = getHolidays(year);
return Object.keys(holidays).filter((holidayName) => {
if (holidays[holidayName].federal)
return true;
return false;
}).reduce((acc, holidayName) => {
const holiday = holidays[holidayName];
if (isSaturday(holiday.date)) {
return {
...acc,
[holidayName]: {
date: addDays2(holiday.date, -1)
}
};
}
if (isSunday(holiday.date)) {
return {
...acc,
[holidayName]: {
date: addDays2(holiday.date, 1)
}
};
}
return acc;
}, {});
}
function isInHolidayList(date, getHolidayList) {
const holidays = getHolidayList(getYear(date));
return Object.keys(holidays).filter((holidayName) => {
return isEqual(date, holidays[holidayName].date);
}).length > 0;
}
function isHoliday(date) {
return isInHolidayList(date, getHolidays);
}
function isFederalHoliday(date) {
return isInHolidayList(date, getFederalHolidays);
}
function isBankHoliday(date) {
return isInHolidayList(date, getBankHolidays);
}
export {
getBankHolidays,
getBlackFriday,
getChristmasDay,
getChristmasEve,
getColumbusDay,
getEaster,
getFathersDay,
getFederalHolidays,
getGoodFriday,
getHalloween,
getHolidays,
getIndependenceDay,
getJuneteenth,
getLaborDay,
getMartinLutherKingJrDay,
getMemorialDay,
getMothersDay,
getNewYearsDay,
getNewYearsEve,
getObservedHolidays,
getPresidentsDay,
getThanksgiving,
getValentinesDay,
getVeteransDay,
isBankHoliday,
isFederalHoliday,
isHoliday,
isInHolidayList
};
//# sourceMappingURL=index.js.map