jexl-functions-fork
Version:
Package with available JEXL functions
299 lines (298 loc) • 13.6 kB
JavaScript
"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,
});