diff --git a/.gitignore b/.gitignore index c6bba59..57d9462 100644 --- a/.gitignore +++ b/.gitignore @@ -89,7 +89,6 @@ out # Nuxt.js build / generate output .nuxt -dist # Gatsby files .cache/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..2729121 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +test/ +doc/ \ No newline at end of file diff --git a/README.md b/README.md index 812d412..54d1bd1 100644 --- a/README.md +++ b/README.md @@ -1 +1,140 @@ -# holidaysRD \ No newline at end of file +# holidaysRD + +## Descripción + +HolidaysRD es una biblioteca JavaScript que proporciona una colección de funciones para trabajar con días festivos en la República Dominicana. + +## Características + +- Recuperar una lista de todos los días festivos de un año determinado. +- Consultar si una fecha concreta es festiva. +- Obtener el próximo feriado a partir de una fecha determinada. +- Obtener los feriados de un mes determinado. +- Recupera una lista de los dias feriados de fines de semana largos +- Calcular el número de días hábiles entre dos fechas, excluyendo festivos. + +## Instalación + +Puede instalar HolidaysRD a través de npm: + +```node +npm i holidaysrd +``` + +## Object holidayRD + +Consta de propiedades como: + +- **dayOfYear** dia del año representa la fecha. +- **day** dia de la semana +- **celebration** Nombre de la festividad +- **date** Fecha de la festividad +- **longWeekend** Representa si esta festidad toca en fin de semana largo +```js +type holidayRD = { + dayOfYear: number, + day: string, + celebration: string, + date: string, + longWeekend: boolean +}; +``` + + +## Funciones Disponibles + +**getHolidays(year: Date): holidayRD[]** + +Obtiene todos los días feriados para el año dado. + +```js +const holidays = getHolidays(new Date()); +console.log(holidays); +``` +**getHolidaysOfMonth(date: Date): holidayRD[]** + +Devuelve todos los días feriados para el mes del año proporcionado. + +```js +const monthHolidays = getHolidaysOfMonth(new Date(2023, 0)); // Enero 2023 +console.log(monthHolidays); +``` + +**isHoliday(date: Date): boolean** + +Verifica si una fecha específica es un día feriado. + +```js +const isHolidayFlag = isHoliday(new Date(2023, 0, 1)); // 1 de enero de 2023 +console.log(isHolidayFlag ? 'Es feriado' : 'No es feriado'); +``` + +**upcomingHolidays(date: Date): holidayRD[]** + +Devuelve el Lista de los proximos días feriados para la fecha proporcionado + +```js +const Holidays = upcomingHolidays(new Date(2023, 0, 1)); +console.log(Holidays); +``` + +**nextHoliday(date: Date): holidayRD[]** + +Devuelve el siguiente días feriados para la fecha proporcionado + +```js +const Holidays = nextHoliday(new Date(2023, 0, 1)); +console.log(Holidays); +``` + +**getLongWeekends(year: number): holidayRD[]** + +Lista todos los fines de semana largos para el año proporcionado. + +```js +const longWeekends = getLongWeekends(2023); +console.log(longWeekends); +``` + +**getLongWeekendsOfMonth(date: Date): holidayRD[]** +Lista de Fines de semana largo en el mes del año indicado. +```js +const monthLongWeekends = getLongWeekendsOfMonth(new Date(2023, 0)); // Enero 2023 +console.log(monthLongWeekends); +``` + +**isLongWeekend(date: Date): boolean** + +Verifica si una fecha específica es un día feriado de fin de semana largo. + +```js +const isLongWeekend = isLongWeekend(new Date(2023, 0, 1)); // 1 de enero de 2023 +console.log(isLongWeekend ? 'Es Fin de semana largo' : 'No es Fin de semana largo'); +``` + +**upcomingLongWeekends(date: Date): holidayRD[]** + +Obtiene los próximos fines de semana largos a partir de la fecha proporcionada. + +```js +const upcomingWeekends = upcomingLongWeekends(new Date()); +console.log(upcomingWeekends); +``` + +**nextLongWeekend(date: Date): holidayRD | undefined** + +Devuelve el próximo fin de semana largo después de la fecha dada. + +```js +const nextWeekend = nextLongWeekend(new Date()); +console.log(nextWeekend); +``` + +**countBusinessDays(startDate: Date, endDate: Date): number** + +Cuenta los días hábiles entre dos fechas. + +```js +const businessDays = countBusinessDays(new Date(2023, 0, 1), new Date(2023, 0, 31)); +console.log(`Días hábiles en enero: ${businessDays}`); +``` \ No newline at end of file diff --git a/dist/holidayRD.js b/dist/holidayRD.js new file mode 100644 index 0000000..1c7eb5f --- /dev/null +++ b/dist/holidayRD.js @@ -0,0 +1,337 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.holidaysRD = exports.countBusinessDays = exports.nextLongWeekend = exports.upcomingLongWeekends = exports.isLongWeekend = exports.getLongWeekendsOfMonth = exports.getLongWeekends = exports.upcomingHolidays = exports.nextHoliday = exports.getHolidaysOfMonth = exports.getHolidays = exports.isHoliday = exports.getHolidaysChangeByYear = exports.getHolidaysDoNotChange = void 0; +// @ts-check +const helper_1 = require("./utils/helper.js"); +/** + * @type {holidayRD[]} holidaysRD - Array de objetos con los feriados de la República Dominicana. +**/ +let _holidaysRD = []; +function existHolidays(year) { + const getYear = (date) => { + return parseInt(date.substring(6, 10)); + }; + const Exist = _holidaysRD.some((A) => getYear(A.date) === year); + return Exist; +} +const assignHolidays = (year) => { + _holidaysRD.push(...getHolidaysDoNotChange(year)); + _holidaysRD.push(...getHolidaysChangeByYear(year)); + _holidaysRD.sort((a, b) => { + return a.dayOfYear - b.dayOfYear; + }); +}; +/** + * @function getHolidaysDoNotChange + * @param {number} year Año para el cual se calcularán los feriados. + * @returns {holidayRD[]} holidayRD Devuelve un array de objetos con los feriados que no cambian de fecha. +**/ +function getHolidaysDoNotChange(year) { + const _holidaysRD = []; + let date2 = `01-01-${year}`; + let day = (0, helper_1.getDayName)(new Date(date2)); + _holidaysRD.push({ dayOfYear: 1, celebration: 'Año Nuevo', date: date2, day: day, longWeekend: (0, helper_1.isDayLongWeekend)(day) }); + date2 = `01-21-${year}`; + day = (0, helper_1.getDayName)(new Date(date2)); + _holidaysRD.push({ dayOfYear: 21, celebration: 'día de la Altagracia', date: date2, day: day, longWeekend: (0, helper_1.isDayLongWeekend)(day) }); + date2 = `02-27-${year}`; + day = (0, helper_1.getDayName)(new Date(date2)); + _holidaysRD.push({ dayOfYear: 58, celebration: 'día de la Independencia', date: date2, day: day, longWeekend: (0, helper_1.isDayLongWeekend)(day) }); + date2 = `08-16-${year}`; + day = (0, helper_1.getDayName)(new Date(date2)); + _holidaysRD.push({ dayOfYear: 228, celebration: 'día de la Restauración', date: date2, day: day, longWeekend: (0, helper_1.isDayLongWeekend)(day) }); + date2 = `09-24-${year}`; + day = (0, helper_1.getDayName)(new Date(date2)); + _holidaysRD.push({ dayOfYear: 267, celebration: 'día de las Mercedes', date: date2, day: day, longWeekend: (0, helper_1.isDayLongWeekend)(day) }); + date2 = `12-25-${year}`; + day = (0, helper_1.getDayName)(new Date(date2)); + _holidaysRD.push({ dayOfYear: 359, celebration: 'Navidad', date: date2, day: day, longWeekend: (0, helper_1.isDayLongWeekend)(day) }); + //Días que se calculan por año. + let date; + //Viernes Santo + const holidayRD = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = (0, helper_1.addDays)((0, helper_1.Computus)(year), -2); + holidayRD.dayOfYear = (0, helper_1.getDayOfYear)(date); + holidayRD.celebration = "Viernes Santo"; + holidayRD.date = (0, helper_1.getDateOfDay)(year, holidayRD.dayOfYear); + holidayRD.day = (0, helper_1.getDayName)(date); + holidayRD.longWeekend = (0, helper_1.isDayLongWeekend)(holidayRD.day); + _holidaysRD.push(holidayRD); + //Corpus Christi + const Item2 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = (0, helper_1.addDays)((0, helper_1.Computus)(year), 60); + Item2.dayOfYear = (0, helper_1.getDayOfYear)(date); + Item2.celebration = "Corpus Christi"; + Item2.date = (0, helper_1.getDateOfDay)(year, Item2.dayOfYear); + Item2.day = (0, helper_1.getDayName)(date); + Item2.longWeekend = (0, helper_1.isDayLongWeekend)(Item2.day); + _holidaysRD.push(Item2); + return _holidaysRD; +} +exports.getHolidaysDoNotChange = getHolidaysDoNotChange; +/** + * @function getHolidaysChangeByYear + * @param {number} year Año para el cual se calcularán los feriados. + * @returns {holidayRD[]} holidaysRD Devuelve un array de objetos con los feriados que cambian de fecha. + **/ +function getHolidaysChangeByYear(year) { + const _holidaysRD = []; + let date; + const holidayRD = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = (0, helper_1.setDay)(new Date(year, 0, 6)); + holidayRD.dayOfYear = (0, helper_1.getDayOfYear)(date); + holidayRD.celebration = "día de los Santos Reyes"; + holidayRD.date = (0, helper_1.getDateOfDay)(year, holidayRD.dayOfYear); + holidayRD.day = (0, helper_1.getDayName)(date); + holidayRD.longWeekend = (0, helper_1.isDayLongWeekend)(holidayRD.day); + _holidaysRD.push(holidayRD); + const Item2 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = (0, helper_1.setDay)(new Date(year, 0, 26)); + Item2.dayOfYear = (0, helper_1.getDayOfYear)(date); + Item2.celebration = "día de Duarte"; + Item2.date = (0, helper_1.getDateOfDay)(year, Item2.dayOfYear); + Item2.day = (0, helper_1.getDayName)(date); + Item2.longWeekend = (0, helper_1.isDayLongWeekend)(Item2.day); + _holidaysRD.push(Item2); + const Item3 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = (0, helper_1.setDay)(new Date(year, 4, 1)); + Item3.dayOfYear = (0, helper_1.getDayOfYear)(date); + Item3.celebration = "día del trabajo"; + Item3.date = (0, helper_1.getDateOfDay)(year, Item3.dayOfYear); + Item3.day = (0, helper_1.getDayName)(date); + Item3.longWeekend = (0, helper_1.isDayLongWeekend)(Item3.day); + _holidaysRD.push(Item3); + const Item4 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = (0, helper_1.setDay)(new Date(year, 10, 6)); + Item4.dayOfYear = (0, helper_1.getDayOfYear)(date); + Item4.celebration = "día de la constitución"; + Item4.date = (0, helper_1.getDateOfDay)(year, Item4.dayOfYear); + Item4.day = (0, helper_1.getDayName)(date); + Item4.longWeekend = (0, helper_1.isDayLongWeekend)(Item4.day); + _holidaysRD.push(Item4); + return _holidaysRD; +} +exports.getHolidaysChangeByYear = getHolidaysChangeByYear; +/** + * @function isHoliday + * @param {Date} date Fecha para validar si es feriado. + * @returns {boolean} Devuelve true si la fecha es feriado, de lo contrario false. +*/ +function isHoliday(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year); + } + const date2 = (0, helper_1.formatDate)(date); + return _holidaysRD.some((A) => A.date === date2); +} +exports.isHoliday = isHoliday; +/** + * @function getHolidays + * @param {Date} date + * @returns {holidayRD[]} holidaysRD Devuelve un array de objetos con los feriados del año de la fecha proporcionada. + */ +function getHolidays(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError('Fecha proporcionada invalida. verifique que contenga un formato de fecha valida'); + } + const year = date.getFullYear(); + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year); + } + return _holidaysRD; +} +exports.getHolidays = getHolidays; +/** + * @function getHolidaysOfMonth + * @param date + * @returns {holidayRD[]} holidayRD Devuelve un array de objetos con los feriados del mes de la fecha proporcionada. +**/ +function getHolidaysOfMonth(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + const month = date.getMonth() + 1; + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year); + } + let getMonth = (date) => { + return parseInt(date.substring(0, 2)); + }; + const holidaysRDOfMonth = _holidaysRD.filter((A) => { + return getMonth(A.date) == month; + }); + return holidaysRDOfMonth; +} +exports.getHolidaysOfMonth = getHolidaysOfMonth; +/** + * @function nextHoliday + * @param {number} date + * @returns {holidayRD} holidaysRD Proximo dia feriado para la fecha proporcionado. + */ +function nextHoliday(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + const Holidays = getHolidays(date); + return Holidays.find(holiday => new Date(holiday.date) >= date); +} +exports.nextHoliday = nextHoliday; +/** + * @function upcomingHolidays + * @param {Date} date + * @returns {holidayRD[]} holidaysRD Lista de Siguientes dias feriados para el año proporcionado. + */ +function upcomingHolidays(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + const Holidays = getHolidays(date); + return Holidays.filter(holiday => new Date(holiday.date) >= date); +} +exports.upcomingHolidays = upcomingHolidays; +/** + * @function getLongWeekends + * @param {number} year + * @returns {holidayRD[]} holidayRD Lista de feriados de fines de semana largos para el año proporcionado. + */ +function getLongWeekends(year) { + if (!existHolidays(year)) { + assignHolidays(year); + } + return _holidaysRD.filter(holiday => holiday.longWeekend); +} +exports.getLongWeekends = getLongWeekends; +/** + * @function getLongWeekendsOfMonth + * @param date + * @returns {holidayRD[]} holidayRD Devuelve un array de objetos con los feriados de fines de semana largos del mes de la fecha proporcionada. +**/ +function getLongWeekendsOfMonth(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + const month = date.getMonth() + 1; + const longWeekends = getLongWeekends(year); + return longWeekends.filter(holiday => parseInt(holiday.date.substring(0, 2)) === month); +} +exports.getLongWeekendsOfMonth = getLongWeekendsOfMonth; +/** + * @function isLongWeekend + * @param {Date} date Fecha para validar si es feriado. + * @returns {boolean} Devuelve true si la fecha es feriado de fin de semana largo, de lo contrario false. +*/ +function isLongWeekend(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year); + } + const date2 = (0, helper_1.formatDate)(date); + return _holidaysRD.some((A) => A.date === date2 && A.longWeekend); +} +exports.isLongWeekend = isLongWeekend; +/** + * @function upcomingLongWeekends + * @param {Date} date + * @returns {holidayRD[]} holidaysRD Lista de Siguientes fines de semana largos para el año proporcionado. + */ +function upcomingLongWeekends(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + const longWeekends = getLongWeekends(year); + return longWeekends.filter(holiday => new Date(holiday.date) >= date); +} +exports.upcomingLongWeekends = upcomingLongWeekends; +/** + * @function nextLongWeekend + * @param {Date} date + * @returns {holidayRD} holidaysRD Proximo fin de semana largos para la fecha proporcionado. + */ +function nextLongWeekend(date = new Date()) { + if (!(0, helper_1.isDate)(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida"); + } + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + const longWeekends = getLongWeekends(year); + return longWeekends.find(holiday => new Date(holiday.date) >= date); +} +exports.nextLongWeekend = nextLongWeekend; +/** + * @function countBusinessDays + * @param {Date} startDate + * @param {Date} endDate + * @returns {number} countholidaysRD Lista de fines de semana largos para el año proporcionado. + */ +function countBusinessDays(startDate = new Date(), endDate = new Date()) { + if (!(0, helper_1.isDate)(startDate) || !(0, helper_1.isDate)(endDate) || startDate > endDate) { + throw new Error("Las fechas proporcionadas son inválidas o la fecha de inicio es posterior a la fecha de fin."); + } + const dayMilliseconds = 24 * 60 * 60 * 1000; + let businessDays = 0; + let currentDate = new Date(startDate); + while (currentDate <= endDate) { + const dayOfWeek = currentDate.getDay(); + const formattedDate = (0, helper_1.formatDate)(currentDate); + // Verificar si es día de semana y no es feriado + if (dayOfWeek !== 0 && dayOfWeek !== 6 && !_holidaysRD.some(holiday => holiday.date === formattedDate)) { + businessDays++; + } + currentDate = new Date(currentDate.getTime() + dayMilliseconds); + } + return businessDays; +} +exports.countBusinessDays = countBusinessDays; +/** + * @module holidayRD + * @fileoverview Librería holidayRD - Proporciona funciones para calcular y validar días feriados en la República Dominicana. + * @description Esta librería es ideal para aplicaciones que requieren agendar citas o eventos, y necesitan saber si un día es feriado o no. + * + * @author Carlos I. Ynfante R. + * @license MIT + * @copyright Carlos I. Ynfante R. + * @version 0.0.1 +*/ +exports.holidaysRD = { + getHolidays, + getHolidaysOfMonth, + isHoliday, + nextHoliday, + upcomingHolidays, + getLongWeekends, + getLongWeekendsOfMonth, + isLongWeekend, + upcomingLongWeekends, + nextLongWeekend, + countBusinessDays +}; diff --git a/dist/holidaysRD.min.js b/dist/holidaysRD.min.js new file mode 100644 index 0000000..07442f6 --- /dev/null +++ b/dist/holidaysRD.min.js @@ -0,0 +1,12 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.holidaysRD=exports.countBusinessDays=exports.nextLongWeekend=exports.upcomingLongWeekends=exports.isLongWeekend=exports.getLongWeekendsOfMonth=exports.getLongWeekends=exports.upcomingHolidays=exports.nextHoliday=exports.getHolidaysOfMonth=exports.getHolidays=exports.isHoliday=exports.getHolidaysChangeByYear=exports.getHolidaysDoNotChange=void 0;const helper_1=require("./utils/helper.min.js");let _holidaysRD=[];function existHolidays(e){return _holidaysRD.some((a=>{return n=a.date,parseInt(n.substring(6,10))===e;var n}))}const assignHolidays=e=>{_holidaysRD.push(...getHolidaysDoNotChange(e)),_holidaysRD.push(...getHolidaysChangeByYear(e)),_holidaysRD.sort(((e,a)=>e.dayOfYear-a.dayOfYear))};function getHolidaysDoNotChange(e){const a=[];let n,o=`01-01-${e}`,t=(0,helper_1.getDayName)(new Date(o));a.push({dayOfYear:1,celebration:"Año Nuevo",date:o,day:t,longWeekend:(0,helper_1.isDayLongWeekend)(t)}),o=`01-21-${e}`,t=(0,helper_1.getDayName)(new Date(o)),a.push({dayOfYear:21,celebration:"día de la Altagracia",date:o,day:t,longWeekend:(0,helper_1.isDayLongWeekend)(t)}),o=`02-27-${e}`,t=(0,helper_1.getDayName)(new Date(o)),a.push({dayOfYear:58,celebration:"día de la Independencia",date:o,day:t,longWeekend:(0,helper_1.isDayLongWeekend)(t)}),o=`08-16-${e}`,t=(0,helper_1.getDayName)(new Date(o)),a.push({dayOfYear:228,celebration:"día de la Restauración",date:o,day:t,longWeekend:(0,helper_1.isDayLongWeekend)(t)}),o=`09-24-${e}`,t=(0,helper_1.getDayName)(new Date(o)),a.push({dayOfYear:267,celebration:"día de las Mercedes",date:o,day:t,longWeekend:(0,helper_1.isDayLongWeekend)(t)}),o=`12-25-${e}`,t=(0,helper_1.getDayName)(new Date(o)),a.push({dayOfYear:359,celebration:"Navidad",date:o,day:t,longWeekend:(0,helper_1.isDayLongWeekend)(t)});const d={dayOfYear:0,celebration:"",date:"",day:"",longWeekend:!1};n=(0,helper_1.addDays)((0,helper_1.Computus)(e),-2),d.dayOfYear=(0,helper_1.getDayOfYear)(n),d.celebration="Viernes Santo",d.date=(0,helper_1.getDateOfDay)(e,d.dayOfYear),d.day=(0,helper_1.getDayName)(n),d.longWeekend=(0,helper_1.isDayLongWeekend)(d.day),a.push(d);const r={dayOfYear:0,celebration:"",date:"",day:"",longWeekend:!1};return n=(0,helper_1.addDays)((0,helper_1.Computus)(e),60),r.dayOfYear=(0,helper_1.getDayOfYear)(n),r.celebration="Corpus Christi",r.date=(0,helper_1.getDateOfDay)(e,r.dayOfYear),r.day=(0,helper_1.getDayName)(n),r.longWeekend=(0,helper_1.isDayLongWeekend)(r.day),a.push(r),a}function getHolidaysChangeByYear(e){const a=[];let n;const o={dayOfYear:0,celebration:"",date:"",day:"",longWeekend:!1};n=(0,helper_1.setDay)(new Date(e,0,6)),o.dayOfYear=(0,helper_1.getDayOfYear)(n),o.celebration="día de los Santos Reyes",o.date=(0,helper_1.getDateOfDay)(e,o.dayOfYear),o.day=(0,helper_1.getDayName)(n),o.longWeekend=(0,helper_1.isDayLongWeekend)(o.day),a.push(o);const t={dayOfYear:0,celebration:"",date:"",day:"",longWeekend:!1};n=(0,helper_1.setDay)(new Date(e,0,26)),t.dayOfYear=(0,helper_1.getDayOfYear)(n),t.celebration="día de Duarte",t.date=(0,helper_1.getDateOfDay)(e,t.dayOfYear),t.day=(0,helper_1.getDayName)(n),t.longWeekend=(0,helper_1.isDayLongWeekend)(t.day),a.push(t);const d={dayOfYear:0,celebration:"",date:"",day:"",longWeekend:!1};n=(0,helper_1.setDay)(new Date(e,4,1)),d.dayOfYear=(0,helper_1.getDayOfYear)(n),d.celebration="día del trabajo",d.date=(0,helper_1.getDateOfDay)(e,d.dayOfYear),d.day=(0,helper_1.getDayName)(n),d.longWeekend=(0,helper_1.isDayLongWeekend)(d.day),a.push(d);const r={dayOfYear:0,celebration:"",date:"",day:"",longWeekend:!1};return n=(0,helper_1.setDay)(new Date(e,10,6)),r.dayOfYear=(0,helper_1.getDayOfYear)(n),r.celebration="día de la constitución",r.date=(0,helper_1.getDateOfDay)(e,r.dayOfYear),r.day=(0,helper_1.getDayName)(n),r.longWeekend=(0,helper_1.isDayLongWeekend)(r.day),a.push(r),a}function isHoliday(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();1!=existHolidays(a)&&(_holidaysRD=[],assignHolidays(a));const n=(0,helper_1.formatDate)(e);return _holidaysRD.some((e=>e.date===n))}function getHolidays(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();return 1!=existHolidays(a)&&(_holidaysRD=[],assignHolidays(a)),_holidaysRD}function getHolidaysOfMonth(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear(),n=e.getMonth()+1;1!=existHolidays(a)&&(_holidaysRD=[],assignHolidays(a));const o=_holidaysRD.filter((e=>(e=>parseInt(e.substring(0,2)))(e.date)==n));return o}function nextHoliday(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();existHolidays(a)||assignHolidays(a);return getHolidays(e).find((a=>new Date(a.date)>=e))}function upcomingHolidays(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();existHolidays(a)||assignHolidays(a);return getHolidays(e).filter((a=>new Date(a.date)>=e))}function getLongWeekends(e){return existHolidays(e)||assignHolidays(e),_holidaysRD.filter((e=>e.longWeekend))}function getLongWeekendsOfMonth(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();existHolidays(a)||assignHolidays(a);const n=e.getMonth()+1;return getLongWeekends(a).filter((e=>parseInt(e.date.substring(0,2))===n))}function isLongWeekend(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();1!=existHolidays(a)&&(_holidaysRD=[],assignHolidays(a));const n=(0,helper_1.formatDate)(e);return _holidaysRD.some((e=>e.date===n&&e.longWeekend))}function upcomingLongWeekends(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();existHolidays(a)||assignHolidays(a);return getLongWeekends(a).filter((a=>new Date(a.date)>=e))}function nextLongWeekend(e=new Date){if(!(0,helper_1.isDate)(e))throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida");const a=e.getFullYear();existHolidays(a)||assignHolidays(a);return getLongWeekends(a).find((a=>new Date(a.date)>=e))}function countBusinessDays(e=new Date,a=new Date){if(!(0,helper_1.isDate)(e)||!(0,helper_1.isDate)(a)||e>a)throw new Error("Las fechas proporcionadas son inválidas o la fecha de inicio es posterior a la fecha de fin.");let n=0,o=new Date(e);for(;o<=a;){const e=o.getDay(),a=(0,helper_1.formatDate)(o);0===e||6===e||_holidaysRD.some((e=>e.date===a))||n++,o=new Date(o.getTime()+864e5)}return n}exports.getHolidaysDoNotChange=getHolidaysDoNotChange,exports.getHolidaysChangeByYear=getHolidaysChangeByYear,exports.isHoliday=isHoliday,exports.getHolidays=getHolidays,exports.getHolidaysOfMonth=getHolidaysOfMonth,exports.nextHoliday=nextHoliday,exports.upcomingHolidays=upcomingHolidays,exports.getLongWeekends=getLongWeekends,exports.getLongWeekendsOfMonth=getLongWeekendsOfMonth,exports.isLongWeekend=isLongWeekend,exports.upcomingLongWeekends=upcomingLongWeekends,exports.nextLongWeekend=nextLongWeekend,exports.countBusinessDays=countBusinessDays, +/** + * @module holidayRD + * @fileoverview Librería holidayRD - Proporciona funciones para calcular y validar días feriados en la República Dominicana. + * @description Esta librería es ideal para aplicaciones que requieren agendar citas o eventos, y necesitan saber si un día es feriado o no. + * + * @author Carlos I. Ynfante R. + * @license MIT + * @copyright Carlos I. Ynfante R. + * @version 0.0.1 +*/ +exports.holidaysRD={getHolidays:getHolidays,getHolidaysOfMonth:getHolidaysOfMonth,isHoliday:isHoliday,nextHoliday:nextHoliday,upcomingHolidays:upcomingHolidays,getLongWeekends:getLongWeekends,getLongWeekendsOfMonth:getLongWeekendsOfMonth,isLongWeekend:isLongWeekend,upcomingLongWeekends:upcomingLongWeekends,nextLongWeekend:nextLongWeekend,countBusinessDays:countBusinessDays}; \ No newline at end of file diff --git a/dist/utils/helper.js b/dist/utils/helper.js new file mode 100644 index 0000000..86de834 --- /dev/null +++ b/dist/utils/helper.js @@ -0,0 +1,136 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Computus = exports.isDate = exports.setDay = exports.addDays = exports.getDayOfYear = exports.isDayLongWeekend = exports.getDayName = exports.getDateOfDay = exports.formatDate = void 0; +function formatDate(date) { + const month = String(date.getMonth() + 1).padStart(2, '0'); // Agregar 1 al mes ya que enero es el mes 0 + const day = String(date.getDate()).padStart(2, '0'); + const year = date.getFullYear(); + return `${month}-${day}-${year}`; +} +exports.formatDate = formatDate; +function getDateOfDay(year, day) { + const fecha = new Date(year, 0); // Iniciar en enero del año + fecha.setDate(day); // Establecer el día del año + return formatDate(fecha); +} +exports.getDateOfDay = getDateOfDay; +function getDayName(date) { + switch (date.getUTCDay()) { + case 0: return "domingo"; + case 1: return "lunes"; + case 2: return "martes"; + case 3: return "miércoles"; + case 4: return "jueves"; + case 5: return "viernes"; + default: return "sábado"; + } +} +exports.getDayName = getDayName; +function isDayLongWeekend(day) { + return ["lunes", "viernes"].includes(day); +} +exports.isDayLongWeekend = isDayLongWeekend; +function getDayOfYear(date) { + // Clone the date so as not to alter the original + const clonedDate = new Date(date); + const Date2 = new Date(clonedDate.getFullYear(), 0, 0).getTime(); + // Calculate the day of the year by adding 1 (January is month 0) + const dayOfYear = Math.floor((clonedDate.getTime() - Date2) / 86400000); + return dayOfYear; +} +exports.getDayOfYear = getDayOfYear; +function addDays(date, day = 0) { + date.setTime((date.getTime() + (day * 86400000))); + return date; +} +exports.addDays = addDays; +function setDay(date) { + const day = date.getDay(); + if ((getDayOfYear(date) != 121) && (day <= 3)) { + switch (day) { + //Martes + case 2: return addDays(date, -1); + //Miercoles + case 3: return addDays(date, -2); + //Jueves + case 4: return addDays(date, -3); + //Viernes + case 5: return addDays(date, -4); + //Si es Lunes, Sabado, o Domingo + default: return date; + } + } + switch (day) { + //Martes + case 2: return addDays(date, 6); + //Miercoles + case 3: return addDays(date, 5); + //Jueves + case 4: return addDays(date, 4); + //Viernes + case 5: return addDays(date, 3); + //Si es Lunes, Sabado, o Domingo + default: return date; + } +} +exports.setDay = setDay; +//Func to validate an instance of a Date class +function isDate(date) { + if (Object.prototype.toString.call(date) !== "[object Date]") + return false; + return !isNaN(date.getTime()); +} +exports.isDate = isDate; +//El Computus es el cálculo de la fecha de Pascua +//Source => http://es.wikipedia.org/wiki/Computus +function Computus(year) { + let M = 25; + let N = 5; + if (year >= 1583 && year <= 1699) { + M = 22; + N = 2; + } + else if (year >= 1700 && year <= 1799) { + M = 23; + N = 3; + } + else if (year >= 1800 && year <= 1899) { + M = 23; + N = 4; + } + else if (year >= 1900 && year <= 2099) { + M = 24; + N = 5; + } + else if (year >= 2100 && year <= 2199) { + M = 24; + N = 6; + } + else if (year >= 2200 && year <= 2299) { + M = 25; + N = 0; + } + let a, b, c, d, e, dia, mes; + //Cálculo de residuos + a = year % 19; + b = year % 4; + c = year % 7; + d = (19 * a + M) % 30; + e = (2 * b + 4 * c + 6 * d + N) % 7; + // Decidir entre los 2 casos: + if (d + e < 10) { + dia = d + e + 22; + mes = 3; + } + else { + dia = d + e - 9; + mes = 4; + } + // Excepciones especiales + if (dia == 26 && mes == 4) + dia = 19; + if (dia == 25 && mes == 4 && d == 28 && e == 6 && a > 10) + dia = 18; + return new Date(year, --mes, dia); +} +exports.Computus = Computus; diff --git a/dist/utils/helper.min.js b/dist/utils/helper.min.js new file mode 100644 index 0000000..7f154a5 --- /dev/null +++ b/dist/utils/helper.min.js @@ -0,0 +1 @@ +"use strict";function formatDate(e){return`${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}-${e.getFullYear()}`}function getDateOfDay(e,t){const a=new Date(e,0);return a.setDate(t),formatDate(a)}function getDayName(e){switch(e.getUTCDay()){case 0:return"domingo";case 1:return"lunes";case 2:return"martes";case 3:return"miércoles";case 4:return"jueves";case 5:return"viernes";default:return"sábado"}}function isDayLongWeekend(e){return["lunes","viernes"].includes(e)}function getDayOfYear(e){const t=new Date(e),a=new Date(t.getFullYear(),0,0).getTime();return Math.floor((t.getTime()-a)/864e5)}function addDays(e,t=0){return e.setTime(e.getTime()+864e5*t),e}function setDay(e){const t=e.getDay();if(121!=getDayOfYear(e)&&t<=3)switch(t){case 2:return addDays(e,-1);case 3:return addDays(e,-2);case 4:return addDays(e,-3);case 5:return addDays(e,-4);default:return e}switch(t){case 2:return addDays(e,6);case 3:return addDays(e,5);case 4:return addDays(e,4);case 5:return addDays(e,3);default:return e}}function isDate(e){return"[object Date]"===Object.prototype.toString.call(e)&&!isNaN(e.getTime())}function Computus(e){let t,a,r,s,n,o,D,u=25,d=5;return e>=1583&&e<=1699?(u=22,d=2):e>=1700&&e<=1799?(u=23,d=3):e>=1800&&e<=1899?(u=23,d=4):e>=1900&&e<=2099?(u=24,d=5):e>=2100&&e<=2199?(u=24,d=6):e>=2200&&e<=2299&&(u=25,d=0),t=e%19,a=e%4,r=e%7,s=(19*t+u)%30,n=(2*a+4*r+6*s+d)%7,s+n<10?(o=s+n+22,D=3):(o=s+n-9,D=4),26==o&&4==D&&(o=19),25==o&&4==D&&28==s&&6==n&&t>10&&(o=18),new Date(e,--D,o)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Computus=exports.isDate=exports.setDay=exports.addDays=exports.getDayOfYear=exports.isDayLongWeekend=exports.getDayName=exports.getDateOfDay=exports.formatDate=void 0,exports.formatDate=formatDate,exports.getDateOfDay=getDateOfDay,exports.getDayName=getDayName,exports.isDayLongWeekend=isDayLongWeekend,exports.getDayOfYear=getDayOfYear,exports.addDays=addDays,exports.setDay=setDay,exports.isDate=isDate,exports.Computus=Computus; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6e95ca5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2858 @@ +{ + "name": "holidaysrd", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "holidaysrd", + "version": "0.0.1", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.5.8", + "chai": "^4.3.8", + "clipboardy": "^3.0.0", + "mocha": "^10.2.0", + "terser": "^5.31.0", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "optional": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", + "dev": true, + "dependencies": { + "ts-node": "7.0.1" + }, + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "optionalDependencies": { + "tsconfig-paths": "^3.5.0" + }, + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X" + } + }, + "node_modules/ts-mocha/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-mocha/node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-mocha/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "optional": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "optional": true + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==", + "dev": true + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dev": true, + "requires": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "optional": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "terser": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-mocha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", + "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", + "dev": true, + "requires": { + "ts-node": "7.0.1", + "tsconfig-paths": "^3.5.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true + } + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "optional": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3524bed --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "holidaysrd", + "version": "0.0.1", + "description": "holidayRD es una libreria que te permite validar si una fecha es feriado en la Republica Dominicana", + "main": "dist/holidayRD.js", + "scripts": { + "build": "tsc && terser dist/*.js --compress --mangle --output dist/holidaysRD.min.js && terser dist/utils/*.js --compress --mangle --output dist/utils/helper.min.js", + "test": "ts-mocha test/*", + "prepublish": "npm run build" + }, + "keywords": [ + "holiday RD", + "dias Feriados", + "Republica Dominicana", + "validacion de citas" + ], + "author": "Carlos Ismael .Y .R", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.5.8", + "chai": "^4.3.8", + "clipboardy": "^3.0.0", + "mocha": "^10.2.0", + "terser": "^5.31.0", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + } +} diff --git a/src/holidayRD.ts b/src/holidayRD.ts new file mode 100644 index 0000000..9abdd83 --- /dev/null +++ b/src/holidayRD.ts @@ -0,0 +1,390 @@ +// @ts-check +import { formatDate, isDate, Computus, getDayName, isDayLongWeekend, getDayOfYear, getDateOfDay, addDays, setDay } from './utils/helper'; +export type holidayRD = { + dayOfYear: number, + day: string, + celebration: string, + date: string, + longWeekend: boolean +}; +/** + * @type {holidayRD[]} holidaysRD - Array de objetos con los feriados de la República Dominicana. +**/ +let _holidaysRD: holidayRD[] = []; + +function existHolidays(year: number): boolean { + const getYear = (date: string): number => { + return parseInt(date.substring(6, 10)); + } + + const Exist = _holidaysRD.some((A) => getYear(A.date) === year); + return Exist; +} + +const assignHolidays = (year: number):void =>{ + _holidaysRD.push(...getHolidaysDoNotChange(year)); + _holidaysRD.push(...getHolidaysChangeByYear(year)); + + _holidaysRD.sort((a, b) => { + return a.dayOfYear - b.dayOfYear + }); +} + +/** + * @function getHolidaysDoNotChange + * @param {number} year Año para el cual se calcularán los feriados. + * @returns {holidayRD[]} holidayRD Devuelve un array de objetos con los feriados que no cambian de fecha. +**/ +export function getHolidaysDoNotChange(year: number): holidayRD[] { + const _holidaysRD: holidayRD[] = []; + + let date2 = `01-01-${year}`; + let day = getDayName(new Date(date2)) + _holidaysRD.push({ dayOfYear: 1, celebration: 'Año Nuevo', date: date2, day: day, longWeekend: isDayLongWeekend(day) }); + + date2 = `01-21-${year}`; + day = getDayName(new Date(date2)) + _holidaysRD.push({ dayOfYear: 21, celebration: 'día de la Altagracia', date: date2, day: day, longWeekend: isDayLongWeekend(day) }); + + date2 = `02-27-${year}`; + day = getDayName(new Date(date2)) + _holidaysRD.push({ dayOfYear: 58, celebration: 'día de la Independencia', date: date2, day: day, longWeekend: isDayLongWeekend(day) }); + + date2 = `08-16-${year}`; + day = getDayName(new Date(date2)) + _holidaysRD.push({ dayOfYear: 228, celebration: 'día de la Restauración', date: date2, day: day, longWeekend: isDayLongWeekend(day) }); + + date2 = `09-24-${year}`; + day = getDayName(new Date(date2)) + _holidaysRD.push({ dayOfYear: 267, celebration: 'día de las Mercedes', date: date2, day: day, longWeekend: isDayLongWeekend(day) }); + + date2 = `12-25-${year}`; + day = getDayName(new Date(date2)) + _holidaysRD.push({ dayOfYear: 359, celebration: 'Navidad', date: date2, day: day, longWeekend: isDayLongWeekend(day) }); + + //Días que se calculan por año. + + let date; + //Viernes Santo + const holidayRD = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = addDays(Computus(year), -2) + holidayRD.dayOfYear = getDayOfYear(date); + holidayRD.celebration = "Viernes Santo" + holidayRD.date = getDateOfDay(year, holidayRD.dayOfYear) + holidayRD.day = getDayName(date) + holidayRD.longWeekend = isDayLongWeekend(holidayRD.day); + _holidaysRD.push(holidayRD); + + //Corpus Christi + const Item2 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = addDays(Computus(year), 60) + Item2.dayOfYear = getDayOfYear(date); + Item2.celebration = "Corpus Christi" + Item2.date = getDateOfDay(year, Item2.dayOfYear) + Item2.day = getDayName(date) + Item2.longWeekend = isDayLongWeekend(Item2.day); + _holidaysRD.push(Item2); + + return _holidaysRD; +} + +/** + * @function getHolidaysChangeByYear + * @param {number} year Año para el cual se calcularán los feriados. + * @returns {holidayRD[]} holidaysRD Devuelve un array de objetos con los feriados que cambian de fecha. + **/ +export function getHolidaysChangeByYear(year: number): holidayRD[]{ + const _holidaysRD: holidayRD[] = []; + + let date; + const holidayRD = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = setDay(new Date(year, 0, 6)) + holidayRD.dayOfYear = getDayOfYear(date); + holidayRD.celebration = "día de los Santos Reyes" + holidayRD.date = getDateOfDay(year, holidayRD.dayOfYear) + holidayRD.day = getDayName(date) + holidayRD.longWeekend = isDayLongWeekend(holidayRD.day); + _holidaysRD.push(holidayRD); + + const Item2 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = setDay(new Date(year, 0, 26)) + Item2.dayOfYear = getDayOfYear(date); + Item2.celebration = "día de Duarte" + Item2.date = getDateOfDay(year, Item2.dayOfYear) + Item2.day = getDayName(date) + Item2.longWeekend = isDayLongWeekend(Item2.day); + _holidaysRD.push(Item2); + + const Item3 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = setDay(new Date(year, 4, 1)) + Item3.dayOfYear = getDayOfYear(date); + Item3.celebration = "día del trabajo" + Item3.date = getDateOfDay(year, Item3.dayOfYear) + Item3.day = getDayName(date) + Item3.longWeekend = isDayLongWeekend(Item3.day); + _holidaysRD.push(Item3); + + const Item4 = { dayOfYear: 0, celebration: '', date: '', day: '', longWeekend: false }; + date = setDay(new Date(year, 10, 6)) + Item4.dayOfYear = getDayOfYear(date); + Item4.celebration = "día de la constitución" + Item4.date = getDateOfDay(year, Item4.dayOfYear) + Item4.day = getDayName(date) + Item4.longWeekend = isDayLongWeekend(Item4.day); + _holidaysRD.push(Item4); + return _holidaysRD; +} + +/** + * @function isHoliday + * @param {Date} date Fecha para validar si es feriado. + * @returns {boolean} Devuelve true si la fecha es feriado, de lo contrario false. +*/ +export function isHoliday(date: Date= new Date()): boolean { + + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year: number = date.getFullYear(); + + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year) + } + + const date2 = formatDate(date); + return _holidaysRD.some((A) => A.date === date2) +} + +/** + * @function getHolidays + * @param {Date} date + * @returns {holidayRD[]} holidaysRD Devuelve un array de objetos con los feriados del año de la fecha proporcionada. + */ +export function getHolidays(date: Date= new Date()): holidayRD[] { + if (!isDate(date)) { + throw new TypeError('Fecha proporcionada invalida. verifique que contenga un formato de fecha valida'); + } + + const year: number = date.getFullYear(); + + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year) + } + + return _holidaysRD +} + +/** + * @function getHolidaysOfMonth + * @param date + * @returns {holidayRD[]} holidayRD Devuelve un array de objetos con los feriados del mes de la fecha proporcionada. +**/ +export function getHolidaysOfMonth(date: Date= new Date()): holidayRD[] { + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year: number = date.getFullYear(); + const month: number = date.getMonth() + 1 + + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year) + } + + let getMonth = (date: string) => { + return parseInt(date.substring(0, 2)) + } + + const holidaysRDOfMonth = _holidaysRD.filter((A) => { + return getMonth(A.date) == month + }) + + return holidaysRDOfMonth +} + +/** + * @function nextHoliday + * @param {number} date + * @returns {holidayRD} holidaysRD Proximo dia feriado para la fecha proporcionado. + */ +export function nextHoliday(date : Date = new Date()): holidayRD | undefined { + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + + const Holidays = getHolidays(date); + return Holidays.find(holiday => new Date(holiday.date) >= date); +} + +/** + * @function upcomingHolidays + * @param {Date} date + * @returns {holidayRD[]} holidaysRD Lista de Siguientes dias feriados para el año proporcionado. + */ +export function upcomingHolidays(date : Date = new Date()): holidayRD[] { + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + + const Holidays = getHolidays(date); + return Holidays.filter(holiday => new Date(holiday.date) >= date); +} + +/** + * @function getLongWeekends + * @param {number} year + * @returns {holidayRD[]} holidayRD Lista de feriados de fines de semana largos para el año proporcionado. + */ +export function getLongWeekends(year: number): holidayRD[] { + if (!existHolidays(year)) { + assignHolidays(year); + } + + return _holidaysRD.filter(holiday => holiday.longWeekend); +} + +/** + * @function getLongWeekendsOfMonth + * @param date + * @returns {holidayRD[]} holidayRD Devuelve un array de objetos con los feriados de fines de semana largos del mes de la fecha proporcionada. +**/ +export function getLongWeekendsOfMonth(date: Date = new Date()): holidayRD[] { + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + + const month = date.getMonth() + 1; + const longWeekends = getLongWeekends(year); + return longWeekends.filter(holiday => parseInt(holiday.date.substring(0, 2)) === month); +} + +/** + * @function isLongWeekend + * @param {Date} date Fecha para validar si es feriado. + * @returns {boolean} Devuelve true si la fecha es feriado de fin de semana largo, de lo contrario false. +*/ +export function isLongWeekend(date: Date = new Date()): boolean { + + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year: number = date.getFullYear(); + + if (existHolidays(year) != true) { + _holidaysRD = []; + assignHolidays(year) + } + + const date2 = formatDate(date); + return _holidaysRD.some((A) => A.date === date2 && A.longWeekend) +} +/** + * @function upcomingLongWeekends + * @param {Date} date + * @returns {holidayRD[]} holidaysRD Lista de Siguientes fines de semana largos para el año proporcionado. + */ +export function upcomingLongWeekends(date : Date = new Date()): holidayRD[] { + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + + const longWeekends = getLongWeekends(year); + return longWeekends.filter(holiday => new Date(holiday.date) >= date); +} + +/** + * @function nextLongWeekend + * @param {Date} date + * @returns {holidayRD} holidaysRD Proximo fin de semana largos para la fecha proporcionado. + */ +export function nextLongWeekend(date : Date = new Date()): holidayRD | undefined { + if (!isDate(date)) { + throw new TypeError("Fecha proporcionada invalida. verifique que contenga un formato de fecha valida") + } + + const year = date.getFullYear(); + if (!existHolidays(year)) { + assignHolidays(year); + } + + const longWeekends = getLongWeekends(year); + return longWeekends.find(holiday => new Date(holiday.date) >= date); +} + +/** + * @function countBusinessDays + * @param {Date} startDate + * @param {Date} endDate + * @returns {number} countholidaysRD Lista de fines de semana largos para el año proporcionado. + */ +export function countBusinessDays(startDate: Date = new Date(), endDate: Date = new Date()): number { + if (!isDate(startDate) || !isDate(endDate) || startDate > endDate) { + throw new Error("Las fechas proporcionadas son inválidas o la fecha de inicio es posterior a la fecha de fin."); + } + + const dayMilliseconds = 24 * 60 * 60 * 1000; + let businessDays = 0; + let currentDate = new Date(startDate); + + while (currentDate <= endDate) { + const dayOfWeek = currentDate.getDay(); + const formattedDate = formatDate(currentDate); + + // Verificar si es día de semana y no es feriado + if (dayOfWeek !== 0 && dayOfWeek !== 6 && !_holidaysRD.some(holiday => holiday.date === formattedDate)) { + businessDays++; + } + + currentDate = new Date(currentDate.getTime() + dayMilliseconds); + } + + return businessDays; +} +/** + * @module holidayRD + * @fileoverview Librería holidayRD - Proporciona funciones para calcular y validar días feriados en la República Dominicana. + * @description Esta librería es ideal para aplicaciones que requieren agendar citas o eventos, y necesitan saber si un día es feriado o no. + * + * @author Carlos I. Ynfante R. + * @license MIT + * @copyright Carlos I. Ynfante R. + * @version 0.0.1 +*/ +export const holidaysRD = { + getHolidays, + getHolidaysOfMonth, + isHoliday, + nextHoliday, + upcomingHolidays, + getLongWeekends, + getLongWeekendsOfMonth, + isLongWeekend, + upcomingLongWeekends, + nextLongWeekend, + countBusinessDays +}; \ No newline at end of file diff --git a/src/utils/helper.ts b/src/utils/helper.ts new file mode 100644 index 0000000..863b152 --- /dev/null +++ b/src/utils/helper.ts @@ -0,0 +1,117 @@ +export function formatDate(date: Date): string { + const month = String(date.getMonth() + 1).padStart(2, '0'); // Agregar 1 al mes ya que enero es el mes 0 + const day = String(date.getDate()).padStart(2, '0'); + const year = date.getFullYear(); + return `${month}-${day}-${year}`; +} + +export function getDateOfDay(year: number, day: number): string { + const fecha = new Date(year, 0); // Iniciar en enero del año + fecha.setDate(day); // Establecer el día del año + return formatDate(fecha); +} + +export function getDayName(date: Date): string { + switch (date.getUTCDay()) { + case 0: return "domingo"; + case 1: return "lunes"; + case 2: return "martes"; + case 3: return "miércoles"; + case 4: return "jueves"; + case 5: return "viernes"; + default: return "sábado"; + } +} + +export function isDayLongWeekend(day: string): boolean { + return ["lunes", "viernes"].includes(day) +} + +export function getDayOfYear(date: Date): number { + // Clone the date so as not to alter the original + const clonedDate = new Date(date); + const Date2 = new Date(clonedDate.getFullYear(), 0, 0).getTime() + + // Calculate the day of the year by adding 1 (January is month 0) + const dayOfYear = Math.floor((clonedDate.getTime() - Date2) / 86400000); + + return dayOfYear; +} + +export function addDays(date: Date, day: number = 0): Date { + date.setTime((date.getTime() + (day * 86400000))); + return date; +} + +export function setDay(date: Date) { + + const day = date.getDay(); + + if ((getDayOfYear(date) != 121) && (day <= 3)) { + switch (day) { + //Martes + case 2: return addDays(date, -1); + //Miercoles + case 3: return addDays(date, -2); + //Jueves + case 4: return addDays(date, -3); + //Viernes + case 5: return addDays(date, -4); + //Si es Lunes, Sabado, o Domingo + default: return date; + } + } + + switch (day) { + //Martes + case 2: return addDays(date, 6); + //Miercoles + case 3: return addDays(date, 5); + //Jueves + case 4: return addDays(date, 4); + //Viernes + case 5: return addDays(date, 3); + //Si es Lunes, Sabado, o Domingo + default: return date; + } +} + +//Func to validate an instance of a Date class +export function isDate(date: Date) { + if (Object.prototype.toString.call(date) !== "[object Date]") + return false; + return !isNaN(date.getTime()); +} + +//El Computus es el cálculo de la fecha de Pascua +//Source => http://es.wikipedia.org/wiki/Computus +export function Computus(year: number) { + let M = 25; + let N = 5; + + if (year >= 1583 && year <= 1699) { M = 22; N = 2; } + else if (year >= 1700 && year <= 1799) { M = 23; N = 3; } + else if (year >= 1800 && year <= 1899) { M = 23; N = 4; } + else if (year >= 1900 && year <= 2099) { M = 24; N = 5; } + else if (year >= 2100 && year <= 2199) { M = 24; N = 6; } + else if (year >= 2200 && year <= 2299) { M = 25; N = 0; } + + let a, b, c, d, e, dia, mes; + + //Cálculo de residuos + a = year % 19; + b = year % 4; + c = year % 7; + d = (19 * a + M) % 30; + e = (2 * b + 4 * c + 6 * d + N) % 7; + + // Decidir entre los 2 casos: + if (d + e < 10) { dia = d + e + 22; mes = 3; } + else { dia = d + e - 9; mes = 4; } + + // Excepciones especiales + if (dia == 26 && mes == 4) dia = 19; + if (dia == 25 && mes == 4 && d == 28 && e == 6 && a > 10) dia = 18; + + return new Date(year, --mes, dia); +} \ No newline at end of file diff --git a/test/IsHoliday.spec.ts b/test/IsHoliday.spec.ts new file mode 100644 index 0000000..1db3a57 --- /dev/null +++ b/test/IsHoliday.spec.ts @@ -0,0 +1,46 @@ +// test.ts +const { expect } = require("chai"); +const { describe, it } = require("mocha"); +import { isHoliday } from '../src/holidayRD'; + +const holiday = [{ "dayOfYear": 1, "celebration": "Año Nuevo", "date": "01-01-2023", "day": "domingo", "longWeekend": false }, +{ "dayOfYear": 9, "celebration": "día de los Santos Reyes", "date": "01-09-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 21, "celebration": "día de la Altagracia", "date": "01-21-2023", "day": "sábado", "longWeekend": false }, +{ "dayOfYear": 30, "celebration": "día de Duarte", "date": "01-30-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 58, "celebration": "día de la Independencia", "date": "02-27-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 97, "celebration": "Viernes Santo", "date": "04-07-2023", "day": "viernes", "longWeekend": true }, +{ "dayOfYear": 121, "celebration": "día del trabajo", "date": "05-01-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 159, "celebration": "Corpus Christi", "date": "06-08-2023", "day": "jueves", "longWeekend": false }, +{ "dayOfYear": 228, "celebration": "día de la Restauración", "date": "08-16-2023", "day": "miércoles", "longWeekend": false }, +{ "dayOfYear": 267, "celebration": "día de las Mercedes", "date": "09-24-2023", "day": "domingo", "longWeekend": false }, +{ "dayOfYear": 310, "celebration": "día de la constitución", "date": "11-06-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 359, "celebration": "Navidad", "date": "12-25-2023", "day": "lunes", "longWeekend": true }] + +describe('isHoliday', () => { + holiday.forEach((A)=>{ + it(`debería devolver true para la fecha ${A.date} (${A.celebration})`, () => { + const date = new Date(A.date); + const result = isHoliday(date); + expect(result).to.equal(true); + }); + }) + + it('debería devolver true para el 29 de marzo del 2024 (Viernes Santo)', () => { + const date = new Date(2024, 2, 29); + const result = isHoliday(date); + expect(result).to.equal(true); + }); + + it('debería devolver true para el 30 de mayo del 2024 (Corpus Christi)', () => { + const date = new Date(2024, 4, 30); + const result = isHoliday(date); + expect(result).to.equal(true); + }); + + it('debería devolver false para el 15 de Marzo del 2023 (dia no feriado)', () => { + // Definir una fecha que no es un feriado + const date = new Date('03-15-2023'); + const result = isHoliday(date); + expect(result).to.equal(false); + }); +}); \ No newline at end of file diff --git a/test/getHoliday.spec.ts b/test/getHoliday.spec.ts new file mode 100644 index 0000000..dd4f420 --- /dev/null +++ b/test/getHoliday.spec.ts @@ -0,0 +1,221 @@ +// test.ts +const { assert } = require("chai"); +const { describe, it } = require("mocha"); +import { getHolidays, getHolidaysDoNotChange, getHolidaysChangeByYear } from '../src/holidayRD'; + + +const holidays2023NotChange = [ + { + dayOfYear: 1, + celebration: 'Año Nuevo', + date: '01-01-2023', + day: 'domingo', + longWeekend: false + }, + { + dayOfYear: 21, + celebration: 'día de la Altagracia', + date: '01-21-2023', + day: 'sábado', + longWeekend: false + }, + { + dayOfYear: 58, + celebration: 'día de la Independencia', + date: '02-27-2023', + day: 'lunes', + longWeekend: true + }, + { + dayOfYear: 228, + celebration: 'día de la Restauración', + date: '08-16-2023', + day: 'miércoles', + longWeekend: false + }, + { + dayOfYear: 267, + celebration: 'día de las Mercedes', + date: '09-24-2023', + day: 'domingo', + longWeekend: false + }, + { + dayOfYear: 359, + celebration: 'Navidad', + date: '12-25-2023', + day: 'lunes', + longWeekend: true + }, + { + dayOfYear: 97, + celebration: 'Viernes Santo', + date: '04-07-2023', + day: 'viernes', + longWeekend: true + }, + { + dayOfYear: 159, + celebration: 'Corpus Christi', + date: '06-08-2023', + day: 'jueves', + longWeekend: false + } +] + +const holidays2023Change =[ + { + dayOfYear: 9, + celebration: 'día de los Santos Reyes', + date: '01-09-2023', + day: 'lunes', + longWeekend: true + }, + { + dayOfYear: 30, + celebration: 'día de Duarte', + date: '01-30-2023', + day: 'lunes', + longWeekend: true + }, + { + dayOfYear: 121, + celebration: 'día del trabajo', + date: '05-01-2023', + day: 'lunes', + longWeekend: true + }, + { + dayOfYear: 310, + celebration: 'día de la constitución', + date: '11-06-2023', + day: 'lunes', + longWeekend: true + } +] + +const holidays2023 = [...holidays2023NotChange, ...holidays2023Change].sort((a, b) => a.dayOfYear - b.dayOfYear) +let resultado: any[] = []; + +const validHoliday = (index: number = 0) => { + const objeto = resultado[index] + const item = holidays2023[index] + + assert.strictEqual(typeof objeto.day, 'string'); + assert.strictEqual(typeof objeto.dayOfYear, 'number'); + assert.strictEqual(typeof objeto.celebration, 'string'); + assert.strictEqual(typeof objeto.date, 'string'); + assert.strictEqual(typeof objeto.longWeekend, 'boolean'); + + assert.equal(objeto.day, item.day, `La propiedad day deberia tener el valor ${item.day}`); + assert.equal(objeto.dayOfYear, item.dayOfYear, `La propiedad dayOfYear deberia tener el valor ${item.dayOfYear}`); + assert.equal(objeto.celebration, item.celebration, `La propiedad celebration deberia tener el valor ${item.celebration}`); + assert.equal(objeto.date, item.date, `La propiedad date deberia tener el valor ${item.date}`); + assert.equal(objeto.longWeekend, item.longWeekend, `La propiedad longWeekend deberia tener el valor ${item.longWeekend}`); +} + +describe('getHolidays', () => { + + const date = new Date('01-01-2023'); + resultado = getHolidays(date); + + it('debería devolver un Array de 12 objetos', () => { + assert(Array.isArray(resultado)); + //expect(resultado).to.be.an('array').not.empty + assert.strictEqual(resultado.length, 12, 'Deberia ser un Array de longuitud 12'); + }) + + it('debería devolver un objetos referente al 01-01-2023', () => { + validHoliday(0) + }); + + it('debería devolver un objetos referente al 01-09-2023', () => { + validHoliday(1) + }); + + it('debería devolver un objetos referente al 01-21-2023', () => { + validHoliday(2) + }); + + it('debería devolver un objetos referente al 01-30-2023', () => { + validHoliday(3) + }); + + it('debería devolver un objetos referente al 02-27-2023', () => { + validHoliday(4) + }); + + it('debería devolver un objetos referente al 04-07-2023', () => { + validHoliday(5) + }); + + it('debería devolver un objetos referente al 05-01-2023', () => { + validHoliday(6) + }); + + it('debería devolver un objetos referente al 06-08-2023', () => { + validHoliday(7) + }); + + it('debería devolver un objetos referente al 08-16-2023', () => { + validHoliday(8) + }); + + it('debería devolver un objetos referente al 09-24-2023', () => { + validHoliday(9) + }); + + it('debería devolver un objetos referente al 11-06-2023', () => { + validHoliday(10) + }); + + it('debería devolver un objetos referente al 12-25-2023', () => { + validHoliday(11) + }); + + +}); + +describe('getHolidaysDoNotChange', () => { + const holidays = getHolidaysDoNotChange(2023) + + holidays.forEach((holiday, index) => { + it(`debería devolver un objeto para la fecha ${holiday.date}`, () => { + const item = holidays2023NotChange[index] + + assert.strictEqual(typeof holiday.day, 'string'); + assert.strictEqual(typeof holiday.dayOfYear, 'number'); + assert.strictEqual(typeof holiday.celebration, 'string'); + assert.strictEqual(typeof holiday.date, 'string'); + assert.strictEqual(typeof holiday.longWeekend, 'boolean'); + + assert.equal(holiday.day, item.day, `La propiedad day deberia tener el valor ${item.day}`); + assert.equal(holiday.dayOfYear, item.dayOfYear, `La propiedad dayOfYear deberia tener el valor ${item.dayOfYear}`); + assert.equal(holiday.celebration, item.celebration, `La propiedad celebration deberia tener el valor ${item.celebration}`); + assert.equal(holiday.date, item.date, `La propiedad date deberia tener el valor ${item.date}`); + assert.equal(holiday.longWeekend, item.longWeekend, `La propiedad longWeekend deberia tener el valor ${item.longWeekend}`); + }) + }) + +}) + +describe('getHolidaysChangeByYear', () => { + const holidays = getHolidaysChangeByYear(2023) + holidays.forEach((holiday, index) => { + it(`debería devolver un objeto para la fecha ${holiday.date}`, () => { + const item = holidays2023Change[index] + + assert.strictEqual(typeof holiday.day, 'string'); + assert.strictEqual(typeof holiday.dayOfYear, 'number'); + assert.strictEqual(typeof holiday.celebration, 'string'); + assert.strictEqual(typeof holiday.date, 'string'); + assert.strictEqual(typeof holiday.longWeekend, 'boolean'); + + assert.equal(holiday.day, item.day, `La propiedad day deberia tener el valor ${item.day}`); + assert.equal(holiday.dayOfYear, item.dayOfYear, `La propiedad dayOfYear deberia tener el valor ${item.dayOfYear}`); + assert.equal(holiday.celebration, item.celebration, `La propiedad celebration deberia tener el valor ${item.celebration}`); + assert.equal(holiday.date, item.date, `La propiedad date deberia tener el valor ${item.date}`); + assert.equal(holiday.longWeekend, item.longWeekend, `La propiedad longWeekend deberia tener el valor ${item.longWeekend}`); + }) + }) +}) diff --git a/test/holidaysInMonth.spec.ts b/test/holidaysInMonth.spec.ts new file mode 100644 index 0000000..695a753 --- /dev/null +++ b/test/holidaysInMonth.spec.ts @@ -0,0 +1,87 @@ +// test.ts +const { expect, assert } = require("chai"); +const { describe, it } = require("mocha"); +import { getHolidaysOfMonth} from '../src/holidayRD'; + + +const existHolidayInMonth = (day = 31, month = 0, count = 1) => { + for (let dia = 1; dia <= day; dia++) { + const fecha = new Date(2023, month, dia); + + const resultado = getHolidaysOfMonth(fecha); + + // Verificamos que el resultado sea un array de objetos + assert(Array.isArray(resultado)); + + assert.strictEqual(resultado.length, count, `Deberia ser un Array de longuitud ${count}`); + // Verificamos que cada objeto tenga las propiedades correctas + resultado.forEach((objeto) => { + assert.strictEqual(typeof objeto.day, 'string'); + assert.strictEqual(typeof objeto.dayOfYear, 'number'); + assert.strictEqual(typeof objeto.celebration, 'string'); + assert.strictEqual(typeof objeto.date, 'string'); + assert.strictEqual(typeof objeto.longWeekend, 'boolean'); + }); + } +} + +const notExistHolidayInMonth = (day = 31, month = 0) => { + for (let dia = 1; dia <= day; dia++) { + const fecha = new Date(2023, month, dia); + + const resultado = getHolidaysOfMonth(fecha); + // Verificamos que el resultado sea un array Empty + expect(resultado).to.be.an('array').that.is.empty; + } +} + + +describe('getHolidaysOfMonth', function () { + it('debería devolver 4 objetos para cualquier día de Enero (2023)', function () { + existHolidayInMonth(31, 0, 4) + }); + + it('debería devolver un objeto para cualquier día de Febrero (2023)', function () { + existHolidayInMonth(28, 1) + }); + + it('No debería devolver ningun objeto para ningun día de Marzo (2023)', function () { + notExistHolidayInMonth(31, 2) + }); + + it('debería devolver un objeto para cualquier día de Abril (2023)', function () { + existHolidayInMonth(30, 3) + }); + + it('debería devolver un objeto para cualquier día de Mayo (2023)', function () { + existHolidayInMonth(31, 4) + }); + + it('debería devolver un objeto para cualquier día de Junio (2023)', function () { + existHolidayInMonth(30, 5) + }); + + it('No debería devolver ningun objeto para ningun día de Julio (2023)', function () { + notExistHolidayInMonth(31, 6) + }); + + it('debería devolver un objeto para cualquier día de Agosto (2023)', function () { + existHolidayInMonth(31, 7) + }); + + it('debería devolver un objeto para cualquier día de Septiembre (2023)', function () { + existHolidayInMonth(30, 8) + }); + + it('No debería devolver ningun objeto para ningun día de Noviembre (2023)', function () { + notExistHolidayInMonth(30, 9) + }); + + it('debería devolver un objeto para cualquier día de Noviembre (2023)', function () { + existHolidayInMonth(30, 10) + }); + + it('debería devolver un objeto para cualquier día de Diciembre (2023)', function () { + existHolidayInMonth(31, 11) + }); +}); \ No newline at end of file diff --git a/test/longWeekends.spec.ts b/test/longWeekends.spec.ts new file mode 100644 index 0000000..1608f12 --- /dev/null +++ b/test/longWeekends.spec.ts @@ -0,0 +1,104 @@ +// test.ts +const { expect, assert } = require("chai"); +const { describe, it } = require("mocha"); +import { listLongWeekends, countBusinessDays, upcomingLongWeekends, nextLongWeekend} from '../src/holidayRD'; +const holidays2023 = [ +{ "dayOfYear": 9, "celebration": "día de los Santos Reyes", "date": "01-09-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 30, "celebration": "día de Duarte", "date": "01-30-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 58, "celebration": "día de la Independencia", "date": "02-27-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 97, "celebration": "Viernes Santo", "date": "04-07-2023", "day": "viernes", "longWeekend": true }, +{ "dayOfYear": 121, "celebration": "día del trabajo", "date": "05-01-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 310, "celebration": "día de la constitución", "date": "11-06-2023", "day": "lunes", "longWeekend": true }, +{ "dayOfYear": 359, "celebration": "Navidad", "date": "12-25-2023", "day": "lunes", "longWeekend": true }] + +describe('listLongWeekends', () => { + it(`debería devolver la Lista de fines de semana Largos para el año 2023`, () => { + const longWeekends = listLongWeekends(2023); + expect(longWeekends.length).to.equal(holidays2023.length); + + longWeekends.forEach((objeto, index) => { + const item = holidays2023[index] + + assert.strictEqual(typeof objeto.day, 'string'); + assert.strictEqual(typeof objeto.dayOfYear, 'number'); + assert.strictEqual(typeof objeto.celebration, 'string'); + assert.strictEqual(typeof objeto.date, 'string'); + assert.strictEqual(typeof objeto.longWeekend, 'boolean'); + + assert.equal(objeto.day, item.day, `La propiedad day deberia tener el valor ${item.day}`); + assert.equal(objeto.dayOfYear, item.dayOfYear, `La propiedad dayOfYear deberia tener el valor ${item.dayOfYear}`); + assert.equal(objeto.celebration, item.celebration, `La propiedad celebration deberia tener el valor ${item.celebration}`); + assert.equal(objeto.date, item.date, `La propiedad date deberia tener el valor ${item.date}`); + assert.equal(objeto.longWeekend, item.longWeekend, `La propiedad longWeekend deberia tener el valor ${item.longWeekend}`); + }) + }); +}); + +describe('countBusinessDays', () => { + it('Dias del 1 de enero al 31 de enero 2023', () => { + const startDate = new Date('01-01-2023'); // Domingo + const endDate = new Date('01-31-2023'); // Martes + + const businessDays = countBusinessDays(startDate, endDate); + expect(businessDays).to.equal(20); // 31 días totales, menos 4 domingos, 4 sábados y 3 feriados + }); + + it('Dias del 31 de enero al 1 de enero 2023', () => { + const startDate = new Date('01-31-2023'); + const endDate = new Date('01-01-2023'); + + expect(()=> countBusinessDays(startDate, endDate)).to.throw(Error, "Las fechas proporcionadas son inválidas o la fecha de inicio es posterior a la fecha de fin."); + }); +}) + +describe('upcomingLongWeekends', () => { + it('Siguientes Fines de semanas largos 01-31-2023', () => { + const date = new Date('01-31-2023'); + const longWeekends = upcomingLongWeekends(date); + const upcomingHolidays2023 = holidays2023.slice() + upcomingHolidays2023.shift(); + upcomingHolidays2023.shift(); + + expect(longWeekends.length).to.equal(upcomingHolidays2023.length); + + longWeekends.forEach((objeto, index) => { + const item = upcomingHolidays2023[index] + + assert.strictEqual(typeof objeto.day, 'string'); + assert.strictEqual(typeof objeto.dayOfYear, 'number'); + assert.strictEqual(typeof objeto.celebration, 'string'); + assert.strictEqual(typeof objeto.date, 'string'); + assert.strictEqual(typeof objeto.longWeekend, 'boolean'); + + assert.equal(objeto.day, item.day, `La propiedad day deberia tener el valor ${item.day}`); + assert.equal(objeto.dayOfYear, item.dayOfYear, `La propiedad dayOfYear deberia tener el valor ${item.dayOfYear}`); + assert.equal(objeto.celebration, item.celebration, `La propiedad celebration deberia tener el valor ${item.celebration}`); + assert.equal(objeto.date, item.date, `La propiedad date deberia tener el valor ${item.date}`); + assert.equal(objeto.longWeekend, item.longWeekend, `La propiedad longWeekend deberia tener el valor ${item.longWeekend}`); + }) + }) +}) + +describe('nextLongWeekend', () => { + const listDate =['01-01-2023', '01-10-2023', '02-01-2023', '03-09-2023', '05-01-2023', '11-01-2023', '12-18-2023']; + + listDate.forEach((data, index) => { + it(`Para la fecha ${data}`, () => { + const date = new Date(data); + const objeto = nextLongWeekend(date); + const item = holidays2023[index] + + assert.strictEqual(typeof objeto?.day, 'string'); + assert.strictEqual(typeof objeto?.dayOfYear, 'number'); + assert.strictEqual(typeof objeto?.celebration, 'string'); + assert.strictEqual(typeof objeto?.date, 'string'); + assert.strictEqual(typeof objeto?.longWeekend, 'boolean'); + + assert.equal(objeto?.day, item.day, `La propiedad day deberia tener el valor ${item.day}`); + assert.equal(objeto?.dayOfYear, item.dayOfYear, `La propiedad dayOfYear deberia tener el valor ${item.dayOfYear}`); + assert.equal(objeto?.celebration, item.celebration, `La propiedad celebration deberia tener el valor ${item.celebration}`); + assert.equal(objeto?.date, item.date, `La propiedad date deberia tener el valor ${item.date}`); + assert.equal(objeto?.longWeekend, item.longWeekend, `La propiedad longWeekend deberia tener el valor ${item.longWeekend}`); + }); + }); +}) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d36652e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "CommonJS", + "strict": true, + "esModuleInterop": true, + "outDir": "./dist", + "rootDir": "./src/" + }, + "include": [ + "src/**/*", + + ], + "exclude": [ + "node_modules", + "test/**/*" + ] +} \ No newline at end of file