diff --git a/clockIn.html b/clockIn.html index 949c37d..0241112 100644 --- a/clockIn.html +++ b/clockIn.html @@ -11,7 +11,6 @@ and open the template in the editor. - @@ -36,12 +35,12 @@ and open the template in the editor. - +
diff --git a/css/style.css b/css/style.css index 4a9628a..ff22a3f 100644 --- a/css/style.css +++ b/css/style.css @@ -193,17 +193,15 @@ h3 { background-size: cover; background-repeat: no-repeat; } -.footer { - display: none; +footer { position: absolute; bottom: 0; width: 100%; - height: 100px; + height: 115px; text-align: center; + animation: fadeIn 0.2s ease-in-out; } -.footer { - animation: faceIn 0.2s ease-in-out; -} + .in, .inMiddle { display: inline; position: static; @@ -342,7 +340,7 @@ header { opacity: 1; } .confirm { - display: none; + visibility: hidden; position: fixed; top: 0; left: 0; @@ -371,6 +369,14 @@ header { font-size: 2.5em; margin-bottom: 20px; } +.fade-in { + visibility: visible; + animation: fadeIn 0.2s ease-in-out forwards; +} +.fade-out { + visibility: hidden; + animation: fadeOut 0.2s ease-in-out forwards; +} @keyframes slideIn { 0% { @@ -382,7 +388,7 @@ header { opacity: 1; } } -@keyframes faceIn { +@keyframes fadeIn { 0% { opacity: 0; } @@ -390,6 +396,14 @@ header { opacity: 1; } } +@keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} @font-face { font-family: 'Poppins'; diff --git a/index.html b/index.html index 37f61f8..7747dbc 100644 --- a/index.html +++ b/index.html @@ -11,7 +11,6 @@ and open the template in the editor. - @@ -80,7 +79,7 @@ and open the template in the editor.

- developed by Verdnatura with + powered by Verdnatura with

diff --git a/js/clockIn.js b/js/clockIn.js index 50bb19d..5552db3 100644 --- a/js/clockIn.js +++ b/js/clockIn.js @@ -1,237 +1,142 @@ let userData = ""; +const footer = document.querySelector("footer"); +const txtName = document.querySelector("#txtNombre"); +const inBtn = document.querySelector(".in"); +const inMiddleBtn = document.querySelector(".inMiddle"); +const outMiddleBtn = document.querySelector(".outMiddle"); +const outBtn = document.querySelector(".out"); +const timetableList = document.querySelector(".listHorario"); +const weekDays = ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]; -$(document).ready(function () { +document.addEventListener("DOMContentLoaded", () => { userData = JSON.parse(localStorage.getItem("userData")); - FastClick.attach(document.body); setView(); setEvents(); }); function setEvents() { + document.querySelector(".btnSalir").addEventListener("click", close); - $(".btnSalir").on("click", function () { - cerrar(); - }); + inBtn.addEventListener("click", () => clockIn("in")); + inMiddleBtn.addEventListener("click", () => clockIn("middle")); + outMiddleBtn.addEventListener("click", () => clockIn("middle")); + outBtn.addEventListener("click", () => clockIn("out")); - $(".in").on("click", function () { - fichar('in'); - }); - - $(".inMiddle").on("click", function () { - fichar('middle'); - }); - - $(".outMiddle").on("click", function () { - fichar('middle'); - }); - - $(".out").on("click", function () { - fichar('out'); - }); - - setTimeout(function () { - cerrar(); - }, 5000); + setTimeout(close, 5000); } -function setView() { - $(".footer").hide(); - $("#txtNombre").text(userData["name"] + " " + userData["surname"]); - getInfo(); - $("." + userData["button1"]).show(); - $("." + userData["button2"]).show(); -} - -function fichar(direction) { - const data = { - workerFk: userData['userFk'], - direction, - device: localStorage.getItem("device") - } - - $.post({ - urlPath: 'WorkerTimeControls/clockIn', - jsonData: data, - processData: false, - success: function (msg) { - if (msg.error){ - printErrores(msg); - setTimeout(function () { - cerrar(); - }, 2000); - }else { - $(".confirm").fadeIn(200); - $(".txtConfirm").append('Fichada registrada correctamente'); - setTimeout(function () { - cerrar(); - }, 1000); - } - } +async function clockIn(direction) { + let timeout = 1000; + const data = await call("WorkerTimeControls/clockIn", { + method: "POST", + body: { + workerFk: userData["userFk"], + direction, + device: localStorage.getItem("device"), + }, }); -} -function setView() { - $(".footer").hide(); - $(".in").hide(); - $(".inMiddle").hide(); - $(".outMiddle").hide(); - $(".out").hide(); - $("#txtNombre").text(userData["name"] + " " + userData["surname"]); - getInfo(); - if(userData["button1"] === null && userData["button2"] === null ) { - printError ("Contacta con tu responsable") + if (data.error) { + let msg = ""; + for (const val of data) if (val.error) msg += `${val.error}\n`; + printError(msg); } else { - $("." + userData["button1"]).show(); - $("." + userData["button2"]).show(); + document.querySelector(".confirm").classList.add("fade-in"); + txtConfirm.textContent = "Fichada registrada correctamente"; + timeout = 2000; } + + setTimeout(close, timeout); } -function getInfo() { - const queryString = $.param({ workerFk: userData['userFk'] }); - - $.get({ - urlPath: `WorkerTimeControls/getClockIn?${queryString}`, - processData: false, - success: function (data) { - $('.footer').show(); - printTimetable(data); - } - }); +function setView() { + footer.style.hidden = true; + inBtn.style.display = "none"; + inMiddleBtn.style.display = "none"; + outMiddleBtn.style.display = "none"; + outBtn.style.display = "none"; + + txtName.textContent = `${userData.name} ${userData.surname}`; + getInfo(); + + if (userData.button1 === null && userData.button2 === null) return printError("Contacta con tu responsable"); + + document.querySelector(`.${userData.button1}`).style.display = "inline-block"; + if (userData.button2) document.querySelector(`.${userData.button2}`).style.display = "inline-block"; +} + +async function getInfo() { + const data = await call("WorkerTimeControls/getClockIn", { params: { workerFk: userData["userFk"] } }); + footer.style.hidden = false; + printTimetable(data); } function printTimetable(timetable) { - const listWeekName = [ - 'Domingo', - 'Lunes', - 'Martes', - 'Miércoles', - 'Jueves', - 'Viernes', - 'Sábado' - ];; - let dated = new Date(); + const dated = new Date(); dated.setDate(dated.getDate() - 6); - for (let i = 0; i < 6; i++) { - $(".listHorario").append(''); + const table = document.createDocumentFragment(); + const totalEl = document.querySelector(".total"); + let totalHr = 0; + + for (let day = 0; day < weekDays.length - 1; day++) { + const label = createElement("label", { text: weekDays[dated.getDay()] }); + table.append(label); dated.setDate(dated.getDate() + 1); } - $(".listHorario").append(''); - $(".listHorario").append('
  • '); - - for (let i = 0; i < timetable.length; i++) { - - $(".listHorario").append( - '
  • ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["6daysAgo"]) + '

    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["5daysAgo"]) + '

    '+ - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["4daysAgo"]) + '

    '+ - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["3daysAgo"]) + '

    '+ - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["2daysAgo"]) + '

    '+ - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["1daysAgo"]) + '

    '+ - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '

    ' + ifIsEmptyText(timetable[i]["0daysAgo"]) + '

    '+ - '
    ' + - '
    ' + - '
  • ' - ); - } - printTotalHours(timetable); -} -function printTotalHours(timetable) { - if(timetable.length > 0) { + table.append(createElement("label", { text: "HOY", classes: ["hoy"] }), createElement("li", { classes: ["hrTop"] })); - $(".listHorario").append('
    '); - $(".listHorario").append('
  • ' + secondsToHm(ifIsEmptyText(timetable[0]["6daysAgoTotal"])) - + ' h
    ' + secondsToHm(ifIsEmptyText(timetable[0]["5daysAgoTotal"])) - + ' h
    ' + secondsToHm(ifIsEmptyText(timetable[0]["4daysAgoTotal"])) - + ' h
    ' + secondsToHm(ifIsEmptyText(timetable[0]["3daysAgoTotal"])) - + ' h
    ' + secondsToHm(ifIsEmptyText(timetable[0]["2daysAgoTotal"])) - + ' h
    ' + secondsToHm(ifIsEmptyText(timetable[0]["1daysAgoTotal"])) - + ' h
    ' + secondsToHm(ifIsEmptyText(timetable[0]["0daysAgoTotal"])) - + ' h
  • '); - - $(".total").text('Total: ' + - secondsToHm( - Number(timetable[0]["6daysAgoTotal"] == null) + - Number(timetable[0]["5daysAgoTotal"]) + - Number(timetable[0]["4daysAgoTotal"]) + - Number(timetable[0]["3daysAgoTotal"]) + - Number(timetable[0]["2daysAgoTotal"]) + - Number(timetable[0]["1daysAgoTotal"]) + - Number(timetable[0]["0daysAgoTotal"]) - ) + ' h'); - } else{ - $(".total").text('Total: 0h'); - } + const liContent = createElement("li", {}); + const liTotals = createElement("li", {}); + timetable.forEach((row, index) => { + for (let day = weekDays.length - 1; day >= 0; day--) { + const img = createElement("img", { attrs: { src: isEmpty(row[`${day}daysAgoDirection`], "image") } }); + const p = createElement("p", { text: isEmpty(row[`${day}daysAgo`], "text") }); -} + const innerDiv = createElement("div", { childs: [img, p] }); + const outerDiv = createElement("div", { classes: ["time", isEmpty(row[`${day}daysAgo`])], childs: [innerDiv] }); + liContent.append(outerDiv); -function printErrores(errores) { - let error = ''; - for (let i = 0; i < errores.length; i++) { - if (errores[i].error) { - error += errores[i].error + "
    "; + if (index === 0) { + const div = createElement("div", { classes: ["time"], text: secondsToHm(timetable[0][`${day}daysAgoTotal`]) }); + liTotals.append(div); + totalHr += timetable[0][`${day}daysAgoTotal`] || 0; + } } - } - printError(error); + table.append(liContent); + if (index === timetable.length - 1) table.append(createElement("hr", {}), liTotals); + }); + + totalEl.innerText = `Total: ${totalHr ? secondsToHm(totalHr) : 0} h`; + timetableList.append(table); } -function ifIsEmpty(value) { - return value.trim() ? "show" : "hide"; -} +const isEmpty = (value, type) => { + const val = value?.toString()?.trim(); + if (!type) return val ? "show" : "hide"; + if (type === "image") return val ? `img/${val}.svg` : "img/in.svg"; + if (type === "text") return val ? val : "00:00"; +}; -function ifIsEmptyImage(value) { - return value.trim() ? `img/${value}.svg` :"img/in.svg"; -} - -function ifIsEmptyText(value) { - return value.toString().trim() ? value : "00:00"; -} - -function cerrar(){ +function close() { localStorage.removeItem("userData"); - setTimeout(function () { - window.location='index.html'; - }, 200); + setTimeout(() => (window.location = "index.html"), 200); } function secondsToHm(seconds) { - seconds = Number(seconds); + seconds = +seconds; let hours = Math.floor(seconds / 3600); - let minutes = Math.floor(seconds % 3600 / 60); - return hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0'); -} \ No newline at end of file + let minutes = Math.floor((seconds % 3600) / 60); + return hours.toString().padStart(2, "0") + ":" + minutes.toString().padStart(2, "0"); +} + +function createElement(tag, { classes = [], text, attrs = {}, childs = [] }) { + const el = document.createElement(tag); + if (classes) el.classList.add(...classes); + if (text) el.textContent = text; + for (const [key, value] of Object.entries(attrs)) el.setAttribute(key, value); + if (childs) el.append(...childs); + + return el; +} diff --git a/js/index.js b/js/index.js index 929e86d..bb95b9c 100644 --- a/js/index.js +++ b/js/index.js @@ -1,84 +1,70 @@ let pin = ""; +if ("addEventListener" in document) { + document.addEventListener("DOMContentLoaded", () => { + FastClick.attach(document.body); -$(document).ready(function () { - FastClick.attach(document.body); - setEvents(); -}); + const heartEl = document.querySelector("body > h1 > span"); + const txtPin = document.querySelector("#txtPin"); + refreshDeviceLabel(); -function setEvents() { - const heartEl = document.querySelector('body > h1 > span'); - refreshDeviceLabel() - - heartEl.addEventListener('click', function() { - Swal.fire({ - title: 'Iniciar sesión', - html: - ` - - `, - confirmButtonText: 'Login', - showCloseButton: true, - showCancelButton: false, - }).then(async (result) => { - if(result.isConfirmed) { - const user = $('#user').val(); - const pass = $('#pass').val(); - const device = $('#device').val(); - signIn(user, pass, device); - } + heartEl.addEventListener("click", () => { + Swal.fire({ + title: "Iniciar sesión", + html: ` + + + `, + confirmButtonText: "Login", + showCloseButton: true, + showCancelButton: false, + }).then(async (result) => { + if (result.isConfirmed) + signIn(document.querySelector("#user").value, document.querySelector("#pass").value, document.querySelector("#device").value); + }); }); - }); - $(".btnnum").on("click", function () { - pin += parseInt($(this).children().html()); - $("#txtPin").text(pin); - }); + document.querySelectorAll(".btnnum").forEach((btn) => { + btn.addEventListener("click", (e) => { + pin += +e.currentTarget.children[0].innerHTML; + txtPin.textContent = pin; + }); + }); - $(".btnCancel").on("click", function () { - pin = ""; - $("#txtPin").text("ID USUARIO"); - }); - - $(".btnOk").on("click", function () { - if (pin) { - login(); - }; - }); -} - -function login() { - $.post({ - urlPath: 'WorkerTimeControls/login', - jsonData: {pin}, - processData: false, - success: function (data) { - localStorage.setItem("userData", JSON.stringify(data)); - window.location = "clockIn.html"; - }, - error: function() { - $("#txtPin").text("ID USUARIO"); + document.querySelector(".btnCancel").addEventListener("click", () => { pin = ""; - } + txtPin.textContent = "ID USUARIO"; + }); + + document.querySelector(".btnOk").addEventListener("click", () => pin && login()); }); } -function signIn(user, password, device) { - $.post({ - urlPath: 'vnUsers/sign-in', - jsonData: {user, password}, - processData: false, - success: function (data) { - localStorage.setItem("token", data.token); - localStorage.setItem("ttl", data.ttl); - localStorage.setItem("user", user); - localStorage.setItem("device", device); - localStorage.setItem("created", Date.now()); - getTokenConfig(); - refreshDeviceLabel(); - }, - }) +async function login() { + try { + const data = await call("WorkerTimeControls/login", { + method: "POST", + body: { pin }, + }); + localStorage.setItem("userData", JSON.stringify(data)); + window.location = "clockIn.html"; + } catch (e) { + document.querySelector("#txtPin").textContent = "ID USUARIO"; + pin = ""; + } } -function refreshDeviceLabel() { - $("#deviceLabel").text(localStorage.getItem('device') ?? '') -} \ No newline at end of file +async function signIn(user, password, device) { + const data = await call("vnUsers/sign-in", { + method: "POST", + body: { user, password }, + }); + localStorage.setItem("token", data.token); + localStorage.setItem("ttl", data.ttl); + localStorage.setItem("user", user); + localStorage.setItem("device", device); + localStorage.setItem("created", Date.now()); + getTokenConfig(); + refreshDeviceLabel(); +} + +const refreshDeviceLabel = () => (document.querySelector("#deviceLabel").textContent = localStorage.getItem("device") ?? ""); diff --git a/js/main.js b/js/main.js index 1d4f89b..8c255ce 100644 --- a/js/main.js +++ b/js/main.js @@ -1,130 +1,124 @@ -const renewPeriod = localStorage.getItem('renewPeriod'); +const renewPeriod = localStorage.getItem("renewPeriod"); let intervalId, isCheckingToken; +const txtConfirm = document.querySelector(".txtConfirm"); +const confirmBtn = document.querySelector(".confirm"); function confirmReset() { - $(".confirm").removeClass('confirmKO'); - $(".txtConfirm").empty(); + confirmBtn.classList.remove("confirmKO", "fade-in", "fade-out"); + confirmBtn.style.hidden = true; + txtConfirm.textContent = ""; } -function printError(msg){ +function printError(msg) { confirmReset(); - $(".txtConfirm").append(msg); - $(".confirm").addClass('confirmKO'); - $(".confirm").fadeIn(200); - setTimeout(function() { - $(".confirm").fadeOut(200); + const txtConfirm = document.querySelector(".txtConfirm"); + txtConfirm.textContent = msg; + confirmBtn.classList.add("confirmKO"); + confirmBtn.style.hidden = false; + + confirmBtn.classList.add("fade-in"); + setTimeout(() => { + confirmBtn.classList.add("fade-out"); setTimeout(confirmReset, 200); }, 2300); } -function renewToken() { - $.post({ - urlPath: 'vnUsers/renewToken', - processData: false, - success: function (data) { - localStorage.setItem("token", data.id); - localStorage.setItem("ttl", data.ttl); - localStorage.setItem("created", Date.now()); - }, - }) +async function renewToken() { + const data = await call("vnUsers/renewToken", { method: "POST" }); + + localStorage.setItem("ttl", data.ttl); + localStorage.setItem("created", Date.now()); } -function getTokenConfig() { - const filter = {fields: ['renewInterval', 'renewPeriod']}; - $.get({ - urlPath: 'AccessTokenConfigs/findOne', - jsonData: filter, - processData: false, - success: function (data) { - if (!data) return; - localStorage.setItem('renewPeriod', data.renewPeriod); - clearInterval(intervalId); - intervalId = setInterval(() => checkValidity(), data.renewInterval * 1000); - }, - }) -} - -function checkValidity() { - const created = +localStorage.getItem('created'); - const ttl = localStorage.getItem('ttl'); - - if (isCheckingToken || !created) return; - isCheckingToken = true; - - const renewPeriodInSeconds = Math.min(ttl, renewPeriod) * 1000; - const maxDate = created + renewPeriodInSeconds; - const now = new Date(); - - if (now.getTime() <= maxDate) return isCheckingToken = false; - - renewToken(); - isCheckingToken = false; -} - -$.ajaxPrefilter(function(xhr) { - const orgErrorHandler = xhr.error; - const token = localStorage.getItem('token') - - Object.assign(xhr, { - url: `/api/${xhr.urlPath}`, - headers: { - Authorization : token - }, - timeout: 2000, - contentType: 'application/json; charset=utf-8', - dataType: 'json', - processData: false, - data: JSON.stringify(xhr.jsonData), - error: function(xhr, textStatus, err) { - if (orgErrorHandler) { - try { - orgErrorHandler(xhr, textStatus, err); - } catch (e) { - err = e; - } - } - - if(xhr?.responseJSON?.error?.code == 'periodNotExceeded') return; - - switch (textStatus){ - case 'parsererror': - mensaje = 'Requested JSON parse failed'; - break; - case 'timeout': - mensaje = 'Time out error'; - break; - case 'abort': - mensaje = 'Ajax request aborted'; - break; - case 'error': - if (xhr?.responseJSON?.error?.name == 'UserError') { - mensaje = xhr.responseJSON.error.message; - break; - } - switch (xhr.status){ - case 0: - mensaje = 'Not connect: Verify Network'; - break; - case 504: - mensaje = 'No se ha podido conectar con Salix, consulta con informática'; - break; - case 555: - mensaje = JSON.parse(xhr.statusText).Message; - break; - default: - if (xhr.status >= 400 && xhr.status < 500) - mensaje = xhr.statusText; - else - mensaje = 'Ha ocurrido un error, consulta con informática'; - } - break; - default: - mensaje = 'Ha ocurrido un error, consulta con informática'; - } - printError(mensaje); - - } +async function getTokenConfig() { + const data = await call("AccessTokenConfigs/findOne", { + params: { filter: { fields: ["renewInterval", "renewPeriod"] } }, }); -}); -if(renewPeriod) getTokenConfig(); \ No newline at end of file + if (!data) return; + + localStorage.setItem("renewPeriod", data.renewPeriod); + clearInterval(intervalId); + + intervalId = setInterval(() => { + const created = +localStorage.getItem("created"); + const ttl = localStorage.getItem("ttl"); + + if (isCheckingToken || !created) return; + isCheckingToken = true; + + const renewPeriodInSeconds = Math.min(ttl, renewPeriod) * 1000; + const maxDate = created + renewPeriodInSeconds; + + if (new Date().getTime() <= maxDate) return (isCheckingToken = false); + + renewToken(); + isCheckingToken = false; + }, data.renewInterval * 1000); +} + +async function call(url, { method = "GET", body = {}, params = {} }) { + const controller = new AbortController(); + const { signal } = controller; + const timeoutId = setTimeout(() => controller.abort(), 2000); + const opts = { + method, + headers: { + Authorization: localStorage.getItem("token"), + "Content-Type": "application/json; charset=utf-8", + }, + signal, + }; + + if (method === "GET") { + const searchParams = new URLSearchParams(); + for (let [key, value] of Object.entries(params)) { + searchParams.append(key, typeof value === "object" ? JSON.stringify(value) : value); + } + url += "?" + searchParams.toString(); + } else if (method === "POST") opts.body = JSON.stringify(body); + + try { + const res = await fetch(`/api/${url}`, opts); + const data = await res.json(); + + if (res.ok) return data; + clearTimeout(timeoutId); + throw data.error; + } catch (e) { + let mensaje = "Ha ocurrido un error, consulta con informática"; + + switch (e.name) { + case "SyntaxError": + mensaje = "Requested JSON parse failed"; + break; + case "TimeoutError": + mensaje = "Time out error"; + break; + case "AbortError": + mensaje = "Ajax request aborted"; + break; + case "UserError": + mensaje = e.message; + break; + default: + switch (e.statusCode) { + case 0: + mensaje = "Not connect: Verify Network"; + break; + case 504: + mensaje = "No se ha podido conectar con Salix, consulta con informática"; + break; + case 555: + mensaje = "Error 555"; + break; + default: + if (e.statusCode >= 400 && e.statusCode < 500) mensaje = e.message; + } + } + printError(mensaje); + throw e; + } +} + +if (renewPeriod) getTokenConfig(); diff --git a/package-lock.json b/package-lock.json index d8203db..39c1c9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,51 +1,72 @@ { "name": "worker-time-control", - "version": "1.0.2", - "lockfileVersion": 1, + "version": "24.22.1", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@types/http-proxy": { + "packages": { + "": { + "name": "worker-time-control", + "version": "24.22.1", + "license": "GPL-3.0", + "dependencies": { + "dotenv": "^16.3.1", + "fastclick": "^1.0.6", + "sweetalert2": "^11.6.13" + }, + "devDependencies": { + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=8" + } + }, + "node_modules/@types/http-proxy": { "version": "1.17.14", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/node": { + "node_modules/@types/node": { "version": "20.10.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.7.tgz", "integrity": "sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==", "dev": true, - "requires": { + "dependencies": { "undici-types": "~5.26.4" } }, - "accepts": { + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "array-flatten": { + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, - "requires": { + "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -53,143 +74,228 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { - "fill-range": "^7.0.1" + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "bytes": { + "node_modules/braces/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "engines": { + "node": ">= 0.8" } }, - "content-disposition": { + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "depd": { + "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "dotenv": { + "node_modules/dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "escape-html": { + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "eventemitter3": { + "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -215,28 +321,22 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" } }, - "fastclick": { + "node_modules/fastclick": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fastclick/-/fastclick-1.0.6.tgz", "integrity": "sha512-cXyDBT4g0uWl/Xe75QspBDAgAWQ0lkPi/zgp6YFEUHj6WV6VIZl7R6TiDZhdOVU3W4ehp/8tG61Jev1jit+ztQ==" }, - "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" - } - }, - "finalhandler": { + "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -244,328 +344,483 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", - "dev": true + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, - "requires": { + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "gopd": { + "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "requires": { + "dependencies": { "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, - "requires": { - "get-intrinsic": "^1.2.2" + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, - "requires": { - "function-bind": "^1.1.2" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "http-errors": { + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "requires": { + "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, - "http-proxy": { + "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "requires": { + "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "http-proxy-middleware": { + "node_modules/http-proxy-middleware": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, - "requires": { + "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "inherits": { + "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 }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "is-extglob": { + "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-glob": { + "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, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "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 + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" - }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "qs": { + "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "requires": { + "dependencies": { "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, - "requires": { + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "requires-port": { + "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "safe-buffer": { + "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 + "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" + } + ] }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "send": { + "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -580,115 +835,156 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, - "dependencies": { - "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 - } + "engines": { + "node": ">= 0.8.0" } }, - "serve-static": { + "node_modules/send/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/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "statuses": { + "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "sweetalert2": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.1.tgz", - "integrity": "sha512-qu145oBuFfjYr5yZW9OSdG6YmRxDf8CnkgT/sXMfrXGe+asFy2imC2vlaLQ/L/naZ/JZna1MPAY56G4qYM0VUQ==" + "node_modules/sweetalert2": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.12.0.tgz", + "integrity": "sha512-Fe6sitTNReNdPF1q1w4uz1GAVv9acZff9Q7YILH5n6O/ti3MzwgfEA0aQ6tLjpy+O1NLXnZjUE//xrbluGXzJw==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } }, - "to-regex-range": { + "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, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "undici-types": { + "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } } } } diff --git a/package.json b/package.json index fd39dfd..aa2f3d6 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,10 @@ "dependencies": { "dotenv": "^16.3.1", "fastclick": "^1.0.6", - "jquery": "^3.7.0", - "sweetalert2": "11.10.1" + "sweetalert2": "^11.6.13" }, "devDependencies": { - "express": "^4.18.2", + "express": "^4.19.2", "http-proxy-middleware": "^2.0.6" } }