UNPKG

calendar-ops

Version:

JS library for operations with days, weeks, months and years. Configure weekends and holidays.

115 lines (96 loc) 3.04 kB
import moment from 'moment'; class Calendar { constructor() { this._holidays = {}; this._weeklyHolidays = [6, 0]; //Saturday and Sunday this._format = "MM/DD/YYYY"; } _convertToMomentObj(date) { if(moment(date)._isValid) { return moment(date).startOf('day'); } throw new Error("Expected Date obj!"); } _addToHolidays(param) { this._holidays[param.valueOf()] = param; } /** * Number between 0 and 6 indicating days from Sunday to Saturday. * @param {Array} arr */ setWeeklyHolidays(arr) { arr.forEach((day) => { if(day < 0 || day > 6) { throw new Error("Illegal Argument. Expecting: Array of numbers between 1 and 7 indicating days from Monday to Sunday."); } }); this._weeklyHolidays = arr; } /** * Set return date format on all operations performed on date * @param {string} param */ setDateFormat(param) { if(typeof param !== "string") { throw new Error("Expected string"); } this._format = param; } /** * Accepts a date * Accepts arrays of date * @param {Array/Date} param */ addHolidays(param) { if(Array.isArray(param)){ param.forEach((p) => this._addToHolidays(this._convertToMomentObj(p))); } else { this._addToHolidays(this._convertToMomentObj(param)); } return this._holidays; } /** * Array of date objects. Start and end date * @param {Array} param */ addHolidayRange(param) { if(param.length !== 2) { throw new Error("Expecting [startDate, endDate]"); } let startDate = moment(param[0]); let endDate = moment(param[1]); if(!(startDate._isValid && endDate._isValid)) { throw new Error("Invalid dates!"); } if(endDate.isSameOrBefore(startDate)) { throw new Error("End date should be after start date"); } while(startDate.isSameOrBefore(endDate)) { this._addToHolidays(this._convertToMomentObj(startDate)); startDate.add(1, 'days'); } return this._holidays; } /** * Add number of days to the provided date with holidays and weekends calculated within * @param {Date} date * @param {Number} duration */ addDays(date, duration) { let rtnDate = moment(date); let addedDays = 1; if(!rtnDate._isValid) { throw new Date("Expected valid date obj"); } while(addedDays < duration) { rtnDate.add(1, 'days'); let newDate = rtnDate.clone().startOf('day'); if(this._weeklyHolidays.indexOf(newDate.day()) == -1 && !this._holidays[newDate.valueOf()]) { addedDays += 1; } } return rtnDate.format(this._format); } } export default Calendar;