UNPKG

jexl-functions-fork

Version:
299 lines (298 loc) 13.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var jexl_1 = require("@digifi/jexl"); var dayjs_1 = __importDefault(require("../dayjs")); var module_1 = require("../utils/module"); var DEFAULT_WEEKEND_MASK = '0000011'; var WEEKEND_MASK_BY_NUMBER = { 1: DEFAULT_WEEKEND_MASK, 2: '1000001', 3: '1100000', 4: '0110000', 5: '0011000', 6: '0001100', 7: '0000110', 11: '0000001', 12: '1000000', 13: '0100000', 14: '0010000', 15: '0001000', 16: '0000100', 17: '0000010', }; exports.default = (0, module_1.createModule)(function (_a, options) { var validateArrayMaxSize = _a.validateArrayMaxSize, coerceToNumber = _a.coerceToNumber, coerceToStringWithValidation = _a.coerceToStringWithValidation; var shortUnitTypeToLongUnitType = { 'M': 'months', 'D': 'days', 'Y': 'years', }; var validateWeekendMask = function (weekend) { var weekendMaskRegex = new RegExp('^[0|1]{7}$'); if (typeof weekend !== 'string') { throw new Error('Weekend should be a string'); } if (!weekendMaskRegex.test(weekend)) { throw new Error('Weekend string doesn\'t much patter'); } if (!weekend.includes('0')) { throw new Error('At least one working day should exists'); } }; var generateHolidaysSet = function (holidays) { var holidaysSet = new Set(); for (var _i = 0, holidays_1 = holidays; _i < holidays_1.length; _i++) { var holiday = holidays_1[_i]; var holidayDate = (0, dayjs_1.default)(holiday); if (!holidayDate.isValid()) { throw new Error('Holiday date is not valid.'); } holidaysSet.add("".concat(holidayDate.month(), "/").concat(holidayDate.date(), "/").concat(holidayDate.year())); } return holidaysSet; }; var getWeekendMask = function (weekend) { if (!weekend) { return DEFAULT_WEEKEND_MASK; } if (typeof weekend === 'string') { return weekend; } if (typeof weekend !== 'number') { return weekend; } var mask = WEEKEND_MASK_BY_NUMBER[weekend]; if (!mask) { throw new Error('Incorrect weekend'); } return mask; }; var WEEKNUM = function (date, format) { return (0, dayjs_1.default)(date, coerceToStringWithValidation(format) || undefined).week(); }; var YEAR = function (date, format) { return (0, dayjs_1.default)(date, coerceToStringWithValidation(format) || undefined).year(); }; var YEARFRAC = function (firstDate, secondDate, basis, format) { if (basis === void 0) { basis = 0; } var coercedFormat = coerceToStringWithValidation(format) || undefined; var coercedBasis = coerceToNumber(basis); var firstDateObject = (0, dayjs_1.default)(firstDate, coercedFormat); var secondDateObject = (0, dayjs_1.default)(secondDate, coercedFormat); var firstDateDay = firstDateObject.date(); var firstDateYear = firstDateObject.year(); var firstDateMonth = firstDateObject.month(); var secondDateDay = secondDateObject.date(); var secondDateYear = secondDateObject.year(); var secondDateMonth = secondDateObject.month(); switch (coercedBasis) { case 0: { var convertedFirstDateDay = firstDateDay === 31 ? 30 : firstDateDay; var convertedSecondDateDay = secondDateDay === 31 ? 30 : secondDateDay; return (convertedSecondDateDay + secondDateMonth * 30 + secondDateYear * 360 - (convertedFirstDateDay + firstDateMonth * 30 + firstDateYear * 360)) / 360; } case 1: { return secondDateObject.diff(firstDateObject, 'days') / 360; } case 2: { return secondDateObject.diff(firstDateObject, 'days') / 365; } case 3: { return (secondDateDay + secondDateMonth * 30 + secondDateYear * 360 - (firstDateDay + firstDateMonth * 30 + firstDateYear * 360)) / 360; } default: { throw new Error('Incorrect basis provided.'); } } }; var NOW = function (format) { return (0, dayjs_1.default)().format(coerceToStringWithValidation(format) || undefined); }; var DATE = function (year, month, day, format) { return (0, dayjs_1.default)({ year: coerceToNumber(year), month: coerceToNumber(month) - 1, day: coerceToNumber(day), }).format(coerceToStringWithValidation(format) || undefined); }; var DAY = function (date, format) { return (0, dayjs_1.default)(date, coerceToStringWithValidation(format) || undefined).date(); }; var DAYS = function (firstDate, secondDate, format) { var coercedFormat = coerceToStringWithValidation(format) || undefined; return (0, dayjs_1.default)(firstDate, coercedFormat).diff((0, dayjs_1.default)(secondDate, coercedFormat), 'days'); }; var DATEVALUE = function (date, format) { return (0, dayjs_1.default)(date).format(coerceToStringWithValidation(format) || undefined); }; var ISOWEEKNUM = function (date, format) { var dateObject = (0, dayjs_1.default)(date, coerceToStringWithValidation(format) || undefined).startOf('date'); var yearStateDateObject = (0, dayjs_1.default)({ year: dateObject.year(), month: 0, day: 0 }); var isoDate = dateObject.add(dateObject.date() + 4 - (dateObject.day() || 7)); return Math.ceil(((isoDate.diff(yearStateDateObject, 'milliseconds')) / 86400000 + 1) / 7); }; var MONTH = function (date, format) { return (0, dayjs_1.default)(date, coerceToStringWithValidation(format) || undefined).month() + 1; }; var TODAY = function (format) { var now = (0, dayjs_1.default)(); return now .set('hour', 0) .set('minute', 0) .set('second', 0) .format(coerceToStringWithValidation(format) || undefined); }; var EOMONTH = function (startDate, months, format) { var coercedMonths = coerceToNumber(months); var flooredMonths = Math.floor(coercedMonths); var startDateObject = (0, dayjs_1.default)(startDate); if (!startDateObject.isValid()) { throw new Error('Invalid start date.'); } return (0, dayjs_1.default)({ year: startDateObject.year(), month: startDateObject.month() + flooredMonths + 1, day: 0, }) .add(-1, 'day') .format(coerceToStringWithValidation(format) || undefined); }; var NETWORKDAYSINTL = function (startDate, endDate, weekend, holidays) { if (holidays === void 0) { holidays = []; } var startDateObject = (0, dayjs_1.default)(startDate); var endDateObject = (0, dayjs_1.default)(endDate); var transformedHolidays = Array.isArray(holidays) ? holidays : [holidays]; var weekendMask = getWeekendMask(weekend); validateArrayMaxSize(holidays); validateWeekendMask(weekendMask); if (!startDateObject.isValid()) { throw new Error('Start date is invalid'); } if (!endDateObject.isValid()) { throw new Error('End date is invalid'); } var holidaysSet = generateHolidaysSet(transformedHolidays); var typedWeekendMask = weekendMask; var days = endDateObject.diff(startDateObject, 'days') || 1; var daysModule = Math.abs(days); var iterationDate = (0, dayjs_1.default)(startDateObject); if (days > options.maxDaysForWorkdaysFunctions) { throw new Error("Days between dates should be less than ".concat(options.maxDaysForWorkdaysFunctions)); } var total = days < 0 ? days - 1 : days + 1; for (var i = 0; i < daysModule; i++) { var iterationDay = iterationDate.date(); var iterationMonth = iterationDate.month(); var iterationYear = iterationDate.year(); var iterationDayOfMonth = iterationDate.day(); var weekendIndex = iterationDayOfMonth ? iterationDayOfMonth - 1 : 6; var isWorkingDay = !Number(typedWeekendMask[weekendIndex]); var isHoliday = holidaysSet.has("".concat(iterationMonth, "/").concat(iterationDay, "/").concat(iterationYear)); if (!isWorkingDay || isHoliday) { total = days < 0 ? total + 1 : total - 1; } iterationDate = iterationDate.add(days < 0 ? -1 : 1, 'day'); } return total; }; var WORKDAYINTL = function (startDate, days, weekend, holidays) { if (holidays === void 0) { holidays = []; } var startDateObject = (0, dayjs_1.default)(startDate); var coercedDays = coerceToNumber(days); var transformedHolidays = Array.isArray(holidays) ? holidays : [holidays]; var weekendMask = getWeekendMask(weekend); if (coercedDays < 0) { throw new jexl_1.ExecutionError('Days should be more than 0'); } if (coercedDays > options.maxDaysForWorkdaysFunctions) { throw new jexl_1.ExecutionError("Days should be less than ".concat(options.maxDaysForWorkdaysFunctions)); } validateWeekendMask(weekendMask); validateArrayMaxSize(holidays); var holidaysSet = generateHolidaysSet(transformedHolidays); var typedWeekendMask = weekendMask; var workingDays = 0; var iterationDate = startDateObject; while (workingDays < coercedDays) { iterationDate = iterationDate.add(1, 'day'); var iterationDay = iterationDate.date(); var iterationMonth = iterationDate.month(); var iterationYear = iterationDate.year(); var iterationDayOfMonth = iterationDate.day(); var weekendIndex = iterationDayOfMonth ? iterationDayOfMonth - 1 : 6; var isWorkingDay = !Number(typedWeekendMask[weekendIndex]); var isHoliday = holidaysSet.has("".concat(iterationMonth, "/").concat(iterationDay, "/").concat(iterationYear)); if (isWorkingDay && !isHoliday) { workingDays++; } } return iterationDate.format(); }; var EDATE = function (date, months, format) { return (0, dayjs_1.default)(date).add(coerceToNumber(months), 'months').format(coerceToStringWithValidation(format) || undefined); }; var DAYS360 = function (startDate, endDate, method) { var startDateObject = (0, dayjs_1.default)(startDate); var endDateObject = (0, dayjs_1.default)(endDate); var endMonth = endDateObject.month(); var startMonth = startDateObject.month(); if (method) { var endMonth_1 = endDateObject.month(); var startMonth_1 = startDateObject.month(); var startDay_1 = startDateObject.date() === 31 ? 30 : startDateObject.date(); var endDay = endDateObject.date() === 31 ? 30 : endDateObject.date(); return 360 * (endDateObject.year() - startDateObject.year()) + 30 * (endMonth_1 - startMonth_1) + (endDay - startDay_1); } var nextMonthStartDate = (0, dayjs_1.default)({ year: startDateObject.year(), month: startMonth + 1, day: 0 }) .add(-1, 'day'); var nextMonthEndDate = (0, dayjs_1.default)({ year: endDateObject.year(), month: endMonth + 1, day: 0 }) .add(-1, 'day'); var startDay = startDateObject.date() === nextMonthStartDate.date() ? 30 : startDateObject.date(); if (endDateObject.date() === nextMonthEndDate.date()) { return startDay < 30 ? 360 * (endDateObject.year() - startDateObject.year()) + 30 * (endMonth + 1 - startMonth) + (1 - startDay) : 360 * (endDateObject.year() - startDateObject.year()) + 30 * (endMonth - startMonth) + (30 - startDay); } return 360 * (endDateObject.year() - startDateObject.year()) + 30 * (endMonth - startMonth) + (endDateObject.date() - startDay); }; var DATEDIF = function (startDate, endDate, unitType) { var startDateObject = (0, dayjs_1.default)(startDate); var endDateObject = (0, dayjs_1.default)(endDate); var coercedUnitType = coerceToStringWithValidation(unitType); var longUnitType = shortUnitTypeToLongUnitType[coercedUnitType]; if (!startDateObject.isValid()) { return NaN; } if (!endDateObject.isValid()) { return NaN; } if (!longUnitType) { return NaN; } return endDateObject.diff(startDateObject, longUnitType); }; return { WEEKNUM: WEEKNUM, YEAR: YEAR, YEARFRAC: YEARFRAC, NOW: NOW, DATE: DATE, DAY: DAY, DAYS: DAYS, DATEVALUE: DATEVALUE, ISOWEEKNUM: ISOWEEKNUM, MONTH: MONTH, TODAY: TODAY, EOMONTH: EOMONTH, NETWORKDAYSINTL: NETWORKDAYSINTL, WORKDAYINTL: WORKDAYINTL, EDATE: EDATE, DAYS360: DAYS360, DATEDIF: DATEDIF, }; }, { maxDaysForWorkdaysFunctions: 3653, });