├── .gitignore
├── 01_relaciones_entre_modelos
├── consultas.http
├── src
│ ├── models
│ │ ├── role.model.js
│ │ ├── person.model.js
│ │ ├── user_role.model.js
│ │ ├── user.model.js
│ │ └── task.model.js
│ └── config
│ │ └── database.js
├── package.json
├── app.js
└── package-lock.json
├── 02_eliminaciones_y_validaciones
├── consultas.http
├── src
│ ├── models
│ │ ├── index.js
│ │ ├── role.model.js
│ │ ├── person.model.js
│ │ ├── user_role.model.js
│ │ ├── task.model.js
│ │ └── user.model.js
│ ├── routes
│ │ ├── task.routes.js
│ │ ├── user.routes.js
│ │ └── person.routes.js
│ ├── middlewares
│ │ ├── validator.js
│ │ └── validations
│ │ │ └── person.validations.js
│ ├── config
│ │ └── database.js
│ └── controllers
│ │ ├── user.controllers.js
│ │ ├── task.controllers.js
│ │ └── person.controllers.js
├── package.json
├── app.js
└── package-lock.json
├── 03_autenticacion_y_autorizacion
├── src
│ ├── models
│ │ ├── index.js
│ │ ├── role.model.js
│ │ ├── person.model.js
│ │ ├── user_role.model.js
│ │ ├── task.model.js
│ │ └── user.model.js
│ ├── routes
│ │ ├── user.routes.js
│ │ ├── task.routes.js
│ │ ├── auth.routes.js
│ │ └── person.routes.js
│ ├── middlewares
│ │ ├── validator.js
│ │ ├── auth.js
│ │ └── validations
│ │ │ └── person.validations.js
│ ├── config
│ │ └── database.js
│ └── controllers
│ │ ├── user.controllers.js
│ │ ├── task.controllers.js
│ │ ├── auth.controllers.js
│ │ └── person.controllers.js
├── package.json
├── app.js
└── package-lock.json
├── 04_autenticacion_y_autorizacion_cookies
├── src
│ ├── models
│ │ ├── index.js
│ │ ├── role.model.js
│ │ ├── person.model.js
│ │ ├── user_role.model.js
│ │ ├── task.model.js
│ │ └── user.model.js
│ ├── routes
│ │ ├── user.routes.js
│ │ ├── task.routes.js
│ │ ├── auth.routes.js
│ │ └── person.routes.js
│ ├── middlewares
│ │ ├── validator.js
│ │ ├── authAdmin.js
│ │ ├── auth.js
│ │ └── validations
│ │ │ └── person.validations.js
│ ├── helpers
│ │ ├── bcrypt.helper.js
│ │ └── jwt.helper.js
│ ├── config
│ │ └── database.js
│ └── controllers
│ │ ├── user.controllers.js
│ │ ├── task.controllers.js
│ │ ├── person.controllers.js
│ │ └── auth.controllers.js
├── package.json
└── app.js
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | env
3 | consultas.http
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/consultas.http:
--------------------------------------------------------------------------------
1 | GET http://localhost:3005/tasks
2 |
3 | ### GET USERS
4 | GET http://localhost:3005/users
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/consultas.http:
--------------------------------------------------------------------------------
1 | GET http://localhost:3005/tasks
2 |
3 | ### GET USERS
4 | GET http://localhost:3005/users
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/models/index.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "./person.model.js";
2 | import { TaskModel } from "./task.model.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export { PersonModel, TaskModel, UserModel };
6 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/routes/task.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { getAllTasks } from "../controllers/task.controllers.js";
3 |
4 | export const taskRoutes = Router();
5 |
6 | taskRoutes.get("/tasks", getAllTasks);
7 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/routes/user.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { getAllUsers } from "../controllers/user.controllers.js";
3 |
4 | export const userRoutes = Router();
5 |
6 | userRoutes.get("/users", getAllUsers);
7 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/models/index.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "./person.model.js";
2 | import { TaskModel } from "./task.model.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export { PersonModel, TaskModel, UserModel };
6 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/routes/user.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { getAllUsers } from "../controllers/user.controllers.js";
3 |
4 | export const userRoutes = Router();
5 |
6 | userRoutes.get("/users", getAllUsers);
7 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/models/index.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "./person.model.js";
2 | import { TaskModel } from "./task.model.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export { PersonModel, TaskModel, UserModel };
6 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/routes/user.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { getAllUsers } from "../controllers/user.controllers.js";
3 |
4 | export const userRoutes = Router();
5 |
6 | userRoutes.get("/users", getAllUsers);
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
DEJA LA ⭐
2 |
3 |
4 |
5 |
SINOOO... HAY TABLA
6 |
7 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/routes/task.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { getAllTasks } from "../controllers/task.controllers.js";
3 | import { authMiddleware } from "../middlewares/auth.js";
4 |
5 | export const taskRoutes = Router();
6 |
7 | taskRoutes.get("/tasks", authMiddleware, getAllTasks);
8 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/middlewares/validator.js:
--------------------------------------------------------------------------------
1 | import { validationResult } from "express-validator";
2 |
3 | export const validator = (req, res, next) => {
4 | const result = validationResult(req);
5 |
6 | if (!result.isEmpty()) {
7 | return res.json({ errors: result.mapped() });
8 | }
9 |
10 | next();
11 | };
12 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/middlewares/validator.js:
--------------------------------------------------------------------------------
1 | import { validationResult } from "express-validator";
2 |
3 | export const validator = (req, res, next) => {
4 | const result = validationResult(req);
5 |
6 | if (!result.isEmpty()) {
7 | return res.json({ errors: result.mapped() });
8 | }
9 |
10 | next();
11 | };
12 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/middlewares/validator.js:
--------------------------------------------------------------------------------
1 | import { validationResult } from "express-validator";
2 |
3 | export const validator = (req, res, next) => {
4 | const result = validationResult(req);
5 |
6 | if (!result.isEmpty()) {
7 | return res.json({ errors: result.mapped() });
8 | }
9 |
10 | next();
11 | };
12 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/middlewares/auth.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 |
3 | export const authMiddleware = (req, res, next) => {
4 | const authHeader = req.headers.authorization;
5 |
6 | const token = authHeader.split(" ")[1];
7 |
8 | const decoded = jwt.verify(token, "s3cr3t");
9 |
10 | req.userLogged = decoded;
11 |
12 | next();
13 | };
14 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/src/models/role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const RoleModel = sequelize.define(
5 | "Role",
6 | {
7 | rolename: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | },
12 | {
13 | timestamps: false,
14 | }
15 | );
16 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/models/role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const RoleModel = sequelize.define(
5 | "Role",
6 | {
7 | rolename: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | },
12 | {
13 | timestamps: false,
14 | }
15 | );
16 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/models/role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const RoleModel = sequelize.define(
5 | "Role",
6 | {
7 | rolename: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | },
12 | {
13 | timestamps: false,
14 | }
15 | );
16 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/models/role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const RoleModel = sequelize.define(
5 | "Role",
6 | {
7 | rolename: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | },
12 | {
13 | timestamps: false,
14 | }
15 | );
16 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/routes/auth.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { login, register } from "../controllers/auth.controllers.js";
3 |
4 | export const authRoutes = Router();
5 |
6 | authRoutes.post("/login", login);
7 |
8 | authRoutes.post("/register", register);
9 |
10 | // authRoutes.get("/profile", profile);
11 |
12 | // authRoutes.post("/login", logout);
13 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/routes/task.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import { getAllTasks } from "../controllers/task.controllers.js";
3 | import { authMiddleware } from "../middlewares/auth.js";
4 | import { authAdminMiddleware } from "../middlewares/authAdmin.js";
5 |
6 | export const taskRoutes = Router();
7 |
8 | taskRoutes.get("/tasks", authMiddleware, authAdminMiddleware, getAllTasks);
9 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "main": "app.js",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "node --watch app.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "description": "",
13 | "dependencies": {
14 | "express": "^5.1.0",
15 | "mysql2": "^3.14.3",
16 | "sequelize": "^6.37.7"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/middlewares/authAdmin.js:
--------------------------------------------------------------------------------
1 | export const authAdminMiddleware = (req, res, next) => {
2 | const userLogged = req.usuario;
3 |
4 | // userLogged.id
5 |
6 | // req.body
7 | // req.params id
8 |
9 | // req.header
10 |
11 | if (!decoded.role !== "admin") {
12 | return res.status(401).json({
13 | msg: "Usted no tiene los permisos",
14 | });
15 | }
16 |
17 | next();
18 | };
19 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/helpers/bcrypt.helper.js:
--------------------------------------------------------------------------------
1 | import bcrypt from "bcrypt";
2 | // Hashear contraseña
3 | export const hashPassword = async (password) => {
4 | const saltRounds = 10; // Entre 10-12 es recomendado
5 | return await bcrypt.hash(password, saltRounds);
6 | };
7 | // Verificar contraseña
8 | export const comparePassword = async (password, hashedPassword) => {
9 | return await bcrypt.compare(password, hashedPassword);
10 | };
11 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "main": "app.js",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "node --watch app.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "description": "",
13 | "dependencies": {
14 | "express": "^5.1.0",
15 | "express-validator": "^7.2.1",
16 | "mysql2": "^3.14.3",
17 | "sequelize": "^6.37.7"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/src/models/person.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const PersonModel = sequelize.define(
5 | "Person",
6 | {
7 | name: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | lastname: {
12 | type: DataTypes.STRING(100),
13 | unique: true,
14 | allowNull: false,
15 | },
16 | },
17 | {
18 | timestamps: false,
19 | }
20 | );
21 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "main": "app.js",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "node --watch app.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "description": "",
13 | "dependencies": {
14 | "express": "^5.1.0",
15 | "express-validator": "^7.2.1",
16 | "jsonwebtoken": "^9.0.2",
17 | "mysql2": "^3.14.3",
18 | "sequelize": "^6.37.7"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/src/config/database.js:
--------------------------------------------------------------------------------
1 | import { Sequelize } from "sequelize";
2 |
3 | export const sequelize = new Sequelize("diagnostico_db", "root", "", {
4 | host: "localhost",
5 | dialect: "mysql",
6 | });
7 |
8 | export const connectDB = async () => {
9 | try {
10 | await sequelize.authenticate();
11 | console.log("Connection has been established successfully.");
12 | await sequelize.sync();
13 | } catch (error) {
14 | console.error("Unable to connect to the database:", error);
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/models/person.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const PersonModel = sequelize.define(
5 | "Person",
6 | {
7 | name: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | lastname: {
12 | type: DataTypes.STRING(100),
13 | unique: true,
14 | allowNull: false,
15 | },
16 | },
17 | {
18 | paranoid: true,
19 | // timestamps: false
20 | }
21 | );
22 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/models/person.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const PersonModel = sequelize.define(
5 | "Person",
6 | {
7 | name: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | lastname: {
12 | type: DataTypes.STRING(100),
13 | unique: true,
14 | allowNull: false,
15 | },
16 | },
17 | {
18 | paranoid: true,
19 | // timestamps: false
20 | }
21 | );
22 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/models/person.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 |
4 | export const PersonModel = sequelize.define(
5 | "Person",
6 | {
7 | name: {
8 | type: DataTypes.STRING(100),
9 | allowNull: false,
10 | },
11 | lastname: {
12 | type: DataTypes.STRING(100),
13 | unique: true,
14 | allowNull: false,
15 | },
16 | },
17 | {
18 | paranoid: true,
19 | // timestamps: false
20 | }
21 | );
22 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/routes/auth.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import {
3 | login,
4 | logout,
5 | profile,
6 | register,
7 | } from "../controllers/auth.controllers.js";
8 | import { authMiddleware } from "../middlewares/auth.js";
9 |
10 | export const authRoutes = Router();
11 |
12 | authRoutes.post("/login", login);
13 |
14 | authRoutes.post("/register", register);
15 |
16 | authRoutes.post("/logout", logout);
17 |
18 | // rutas publica
19 | authRoutes.get("/profile", authMiddleware, profile);
20 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/app.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import { connectDB } from "./src/config/database.js";
3 | import { personRoutes } from "./src/routes/person.routes.js";
4 | import { userRoutes } from "./src/routes/user.routes.js";
5 |
6 | const app = express();
7 | const PORT = 3005;
8 |
9 | app.use(express.json());
10 |
11 | app.use("/api", personRoutes);
12 | app.use("/api", userRoutes);
13 |
14 | app.listen(PORT, async () => {
15 | await connectDB();
16 | console.log(`servidor corriendo en el puerto ${PORT}`);
17 | });
18 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/config/database.js:
--------------------------------------------------------------------------------
1 | import { Sequelize } from "sequelize";
2 |
3 | export const sequelize = new Sequelize("diagnostico_db", "root", "", {
4 | host: "localhost",
5 | dialect: "mysql",
6 | });
7 |
8 | export const connectDB = async () => {
9 | try {
10 | await sequelize.authenticate();
11 | console.log("Connection has been established successfully.");
12 | await sequelize.sync({ alter: true });
13 | } catch (error) {
14 | console.error("Unable to connect to the database:", error);
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/config/database.js:
--------------------------------------------------------------------------------
1 | import { Sequelize } from "sequelize";
2 |
3 | export const sequelize = new Sequelize("diagnostico_db", "root", "", {
4 | host: "localhost",
5 | dialect: "mysql",
6 | });
7 |
8 | export const connectDB = async () => {
9 | try {
10 | await sequelize.authenticate();
11 | console.log("Connection has been established successfully.");
12 | await sequelize.sync({ force: false });
13 | } catch (error) {
14 | console.error("Unable to connect to the database:", error);
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "main": "app.js",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "node --watch app.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "description": "",
13 | "dependencies": {
14 | "cookie-parser": "^1.4.7",
15 | "express": "^5.1.0",
16 | "express-validator": "^7.2.1",
17 | "jsonwebtoken": "^9.0.2",
18 | "mysql2": "^3.14.3",
19 | "sequelize": "^6.37.7"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/config/database.js:
--------------------------------------------------------------------------------
1 | import { Sequelize } from "sequelize";
2 |
3 | export const sequelize = new Sequelize("diagnostico_db", "root", "", {
4 | host: "localhost",
5 | dialect: "mysql",
6 | });
7 |
8 | export const connectDB = async () => {
9 | try {
10 | await sequelize.authenticate();
11 | console.log("Connection has been established successfully.");
12 | await sequelize.sync({ force: false });
13 | } catch (error) {
14 | console.error("Unable to connect to the database:", error);
15 | }
16 | };
17 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/middlewares/auth.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 |
3 | export const authMiddleware = (req, res, next) => {
4 | const token = req.cookies.token;
5 |
6 | // falta loguearse
7 |
8 | // forma 1
9 |
10 | // const decoded = jwt.verify(token, "s3cr3t", (err, decoded) => {
11 | // throw new Error("")
12 |
13 | // return decoded_dentro
14 | // });
15 |
16 | // return decoded;
17 |
18 | // forma 2
19 | const decoded = jwt.verify(token, "secreto");
20 |
21 | req.usuario = decoded;
22 |
23 | next();
24 | };
25 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/controllers/user.controllers.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "../models/person.model.js";
2 | import { UserModel } from "../models/user.model.js";
3 |
4 | export const getAllUsers = async (req, res) => {
5 | try {
6 | const users = await UserModel.findAll({
7 | include: {
8 | model: PersonModel,
9 | as: "person",
10 | paranoid: false,
11 | },
12 | });
13 |
14 | res.json(users);
15 | } catch (error) {
16 | console.log(error);
17 | return res.status(500).json({ message: "Error interno del servidor" });
18 | }
19 | };
20 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/controllers/user.controllers.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "../models/person.model.js";
2 | import { UserModel } from "../models/user.model.js";
3 |
4 | export const getAllUsers = async (req, res) => {
5 | try {
6 | const users = await UserModel.findAll({
7 | include: {
8 | model: PersonModel,
9 | as: "person",
10 | paranoid: false,
11 | },
12 | });
13 |
14 | res.json(users);
15 | } catch (error) {
16 | console.log(error);
17 | return res.status(500).json({ message: "Error interno del servidor" });
18 | }
19 | };
20 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/helpers/jwt.helper.js:
--------------------------------------------------------------------------------
1 | export const generateToken = (user) => {
2 | // LOGICA PARA GENERAR EL TOKEN Y MANEJAR ERRORES (AGREGAR)
3 |
4 | // generar un token
5 | const token = jwt.sign(
6 | {
7 | id: user.id,
8 | name: user.person.name,
9 | lastname: user.person.lastname,
10 | },
11 | "s3cr3t",
12 | {
13 | expiresIn: "1h",
14 | }
15 | );
16 |
17 | return token;
18 | };
19 |
20 | export const verifyToken = (token) => {
21 | // AGREGAR LOGICA PARA VERIFICAR EL TOKEN Y MANEJAR ERRORES
22 |
23 | return decoded;
24 | };
25 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/app.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import { connectDB } from "./src/config/database.js";
3 | import { personRoutes } from "./src/routes/person.routes.js";
4 | import { userRoutes } from "./src/routes/user.routes.js";
5 | import { authRoutes } from "./src/routes/auth.routes.js";
6 | import { taskRoutes } from "./src/routes/task.routes.js";
7 |
8 | const app = express();
9 | const PORT = 3005;
10 |
11 | app.use(express.json());
12 |
13 | app.use("/api", personRoutes);
14 | app.use("/api", userRoutes);
15 | app.use("/api", taskRoutes);
16 | app.use("/api", authRoutes);
17 |
18 | app.listen(PORT, async () => {
19 | await connectDB();
20 | console.log(`servidor corriendo en el puerto ${PORT}`);
21 | });
22 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/controllers/user.controllers.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "../models/person.model.js";
2 | import { UserModel } from "../models/user.model.js";
3 |
4 | export const getAllUsers = async (req, res) => {
5 | // if (!userLogged.role === "usuario") {
6 | // return res.status(401).json({
7 | // msg: "Usted no tiene los permisos",
8 | // });
9 | // }
10 | try {
11 | const users = await UserModel.findAll({
12 | include: {
13 | model: PersonModel,
14 | as: "person",
15 | paranoid: false,
16 | },
17 | });
18 |
19 | res.json(users);
20 | } catch (error) {
21 | console.log(error);
22 | return res.status(500).json({ message: "Error interno del servidor" });
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/routes/person.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import {
3 | createPerson,
4 | deletePerson,
5 | getAllPeople,
6 | updatePerson,
7 | } from "../controllers/person.controllers.js";
8 | import {
9 | createPersonValidation,
10 | updatePersonValidation,
11 | } from "../middlewares/validations/person.validations.js";
12 | import { validator } from "../middlewares/validator.js";
13 |
14 | export const personRoutes = Router();
15 |
16 | personRoutes.get("/people", getAllPeople);
17 | personRoutes.post("/people", createPersonValidation, validator, createPerson);
18 | personRoutes.put(
19 | "/people/:id",
20 | updatePersonValidation,
21 | validator,
22 | updatePerson
23 | );
24 | personRoutes.delete("/people/:id", deletePerson);
25 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/src/models/user_role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { RoleModel } from "./role.model.js";
4 | import { UserModel } from "./user.model.js";
5 |
6 | export const UserRoleModel = sequelize.define(
7 | "User_Role",
8 | {
9 | id: {
10 | type: DataTypes.INTEGER,
11 | primaryKey: true,
12 | autoIncrement: true,
13 | allowNull: false,
14 | },
15 | },
16 | {
17 | timestamps: false,
18 | }
19 | );
20 |
21 | //RELACIONES
22 | UserModel.belongsToMany(RoleModel, {
23 | through: UserRoleModel,
24 | foreignKey: "user_id",
25 | as: "roles",
26 | });
27 |
28 | RoleModel.belongsToMany(UserModel, {
29 | through: UserRoleModel,
30 | foreignKey: "role_id",
31 | as: "users",
32 | });
33 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/models/user_role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { RoleModel } from "./role.model.js";
4 | import { UserModel } from "./user.model.js";
5 |
6 | export const UserRoleModel = sequelize.define(
7 | "User_Role",
8 | {
9 | id: {
10 | type: DataTypes.INTEGER,
11 | primaryKey: true,
12 | autoIncrement: true,
13 | allowNull: false,
14 | },
15 | },
16 | {
17 | timestamps: false,
18 | }
19 | );
20 |
21 | //RELACIONES
22 | UserModel.belongsToMany(RoleModel, {
23 | through: UserRoleModel,
24 | foreignKey: "user_id",
25 | as: "roles",
26 | });
27 |
28 | RoleModel.belongsToMany(UserModel, {
29 | through: UserRoleModel,
30 | foreignKey: "role_id",
31 | as: "users",
32 | });
33 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/models/user_role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { RoleModel } from "./role.model.js";
4 | import { UserModel } from "./user.model.js";
5 |
6 | export const UserRoleModel = sequelize.define(
7 | "User_Role",
8 | {
9 | id: {
10 | type: DataTypes.INTEGER,
11 | primaryKey: true,
12 | autoIncrement: true,
13 | allowNull: false,
14 | },
15 | },
16 | {
17 | timestamps: false,
18 | }
19 | );
20 |
21 | //RELACIONES
22 | UserModel.belongsToMany(RoleModel, {
23 | through: UserRoleModel,
24 | foreignKey: "user_id",
25 | as: "roles",
26 | });
27 |
28 | RoleModel.belongsToMany(UserModel, {
29 | through: UserRoleModel,
30 | foreignKey: "role_id",
31 | as: "users",
32 | });
33 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/src/models/user.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { PersonModel } from "./person.model.js";
4 |
5 | export const UserModel = sequelize.define(
6 | "User",
7 | {
8 | username: {
9 | type: DataTypes.STRING(100),
10 | allowNull: false,
11 | },
12 | email: {
13 | type: DataTypes.STRING(100),
14 | unique: true,
15 | allowNull: false,
16 | },
17 | password: {
18 | type: DataTypes.STRING(100),
19 | allowNull: false,
20 | },
21 | },
22 | {
23 | timestamps: false,
24 | }
25 | );
26 |
27 | // RELACIONES UNO A UNO
28 | UserModel.belongsTo(PersonModel, { foreignKey: "person_id", as: "person" });
29 |
30 | PersonModel.hasOne(UserModel, { foreignKey: "person_id" });
31 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/models/user_role.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { RoleModel } from "./role.model.js";
4 | import { UserModel } from "./user.model.js";
5 |
6 | export const UserRoleModel = sequelize.define(
7 | "User_Role",
8 | {
9 | id: {
10 | type: DataTypes.INTEGER,
11 | primaryKey: true,
12 | autoIncrement: true,
13 | allowNull: false,
14 | },
15 | },
16 | {
17 | timestamps: false,
18 | }
19 | );
20 |
21 | //RELACIONES
22 | UserModel.belongsToMany(RoleModel, {
23 | through: UserRoleModel,
24 | foreignKey: "user_id",
25 | as: "roles",
26 | });
27 |
28 | RoleModel.belongsToMany(UserModel, {
29 | through: UserRoleModel,
30 | foreignKey: "role_id",
31 | as: "users",
32 | });
33 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/app.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import cookieParser from "cookie-parser";
3 | import { connectDB } from "./src/config/database.js";
4 | import { personRoutes } from "./src/routes/person.routes.js";
5 | import { userRoutes } from "./src/routes/user.routes.js";
6 | import { authRoutes } from "./src/routes/auth.routes.js";
7 | import { taskRoutes } from "./src/routes/task.routes.js";
8 |
9 | const app = express();
10 | const PORT = 3005;
11 |
12 | app.use(express.json());
13 | app.use(cookieParser()); // NECESARIO: para leer req.cookies
14 |
15 | app.use("/api", personRoutes);
16 | app.use("/api", userRoutes);
17 | app.use("/api", taskRoutes);
18 | app.use("/api", authRoutes);
19 |
20 | app.listen(PORT, async () => {
21 | await connectDB();
22 | console.log(`servidor corriendo en el puerto ${PORT}`);
23 | });
24 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/src/models/task.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export const TaskModel = sequelize.define(
6 | "Task",
7 | {
8 | title: {
9 | type: DataTypes.STRING(100),
10 | unique: true,
11 | allowNull: false,
12 | },
13 | description: {
14 | type: DataTypes.STRING(100),
15 | allowNull: false,
16 | },
17 | is_completed: {
18 | type: DataTypes.BOOLEAN,
19 | defaultValue: false,
20 | },
21 | },
22 | {
23 | timestamps: false,
24 | // createdAt: created_at,
25 | }
26 | );
27 |
28 | // RELACIONES UNO A MUCHOS
29 | TaskModel.belongsTo(UserModel, { foreignKey: "user_id", as: "author" });
30 |
31 | UserModel.hasMany(TaskModel, { foreignKey: "user_id" });
32 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/routes/person.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import {
3 | createPerson,
4 | deletePerson,
5 | getAllPeople,
6 | updatePerson,
7 | } from "../controllers/person.controllers.js";
8 | import {
9 | createPersonValidation,
10 | updatePersonValidation,
11 | } from "../middlewares/validations/person.validations.js";
12 | import { validator } from "../middlewares/validator.js";
13 | import { authMiddleware } from "../middlewares/auth.js";
14 |
15 | export const personRoutes = Router();
16 |
17 | personRoutes.get("/people", getAllPeople);
18 | personRoutes.post(
19 | "/people",
20 | createPersonValidation,
21 | validator,
22 | authMiddleware,
23 | createPerson
24 | );
25 | personRoutes.put(
26 | "/people/:id",
27 | updatePersonValidation,
28 | validator,
29 | updatePerson
30 | );
31 | personRoutes.delete("/people/:id", deletePerson);
32 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/routes/person.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import {
3 | createPerson,
4 | deletePerson,
5 | getAllPeople,
6 | updatePerson,
7 | } from "../controllers/person.controllers.js";
8 | import {
9 | createPersonValidation,
10 | updatePersonValidation,
11 | } from "../middlewares/validations/person.validations.js";
12 | import { validator } from "../middlewares/validator.js";
13 | import { authMiddleware } from "../middlewares/auth.js";
14 |
15 | export const personRoutes = Router();
16 |
17 | personRoutes.get("/people", getAllPeople);
18 | personRoutes.post(
19 | "/people",
20 | createPersonValidation,
21 | validator,
22 | authMiddleware,
23 | createPerson
24 | );
25 | personRoutes.put(
26 | "/people/:id",
27 | updatePersonValidation,
28 | validator,
29 | updatePerson
30 | );
31 | personRoutes.delete("/people/:id", deletePerson);
32 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/controllers/task.controllers.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "../models/person.model.js";
2 | import { TaskModel } from "../models/task.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const getAllTasks = async (req, res) => {
6 | try {
7 | const tasks = await TaskModel.findAll({
8 | include: [
9 | {
10 | model: UserModel,
11 | as: "author",
12 | attributes: {
13 | exclude: ["password", "person_id"],
14 | },
15 | include: [
16 | {
17 | model: PersonModel,
18 | as: "person",
19 | },
20 | ],
21 | },
22 | ],
23 | });
24 |
25 | res.json(tasks);
26 | } catch (error) {
27 | console.log(error);
28 | return res.status(500).json({ message: "Error interno del servidor" });
29 | }
30 | };
31 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/models/task.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export const TaskModel = sequelize.define(
6 | "Task",
7 | {
8 | title: {
9 | type: DataTypes.STRING(100),
10 | unique: true,
11 | allowNull: false,
12 | },
13 | description: {
14 | type: DataTypes.STRING(100),
15 | allowNull: false,
16 | },
17 | is_completed: {
18 | type: DataTypes.BOOLEAN,
19 | defaultValue: false,
20 | },
21 | },
22 | {
23 | timestamps: false,
24 | // createdAt: created_at,
25 | }
26 | );
27 |
28 | // RELACIONES UNO A MUCHOS
29 | TaskModel.belongsTo(UserModel, {
30 | foreignKey: "user_id",
31 | as: "author",
32 | onDelete: "CASCADE",
33 | });
34 |
35 | UserModel.hasMany(TaskModel, { foreignKey: "user_id", as: "tasks" });
36 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/models/task.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export const TaskModel = sequelize.define(
6 | "Task",
7 | {
8 | title: {
9 | type: DataTypes.STRING(100),
10 | unique: true,
11 | allowNull: false,
12 | },
13 | description: {
14 | type: DataTypes.STRING(100),
15 | allowNull: false,
16 | },
17 | is_completed: {
18 | type: DataTypes.BOOLEAN,
19 | defaultValue: false,
20 | },
21 | },
22 | {
23 | timestamps: false,
24 | // createdAt: created_at,
25 | }
26 | );
27 |
28 | // RELACIONES UNO A MUCHOS
29 | TaskModel.belongsTo(UserModel, {
30 | foreignKey: "user_id",
31 | as: "author",
32 | onDelete: "CASCADE",
33 | });
34 |
35 | UserModel.hasMany(TaskModel, { foreignKey: "user_id", as: "tasks" });
36 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/models/task.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { UserModel } from "./user.model.js";
4 |
5 | export const TaskModel = sequelize.define(
6 | "Task",
7 | {
8 | title: {
9 | type: DataTypes.STRING(100),
10 | unique: true,
11 | allowNull: false,
12 | },
13 | description: {
14 | type: DataTypes.STRING(100),
15 | allowNull: false,
16 | },
17 | is_completed: {
18 | type: DataTypes.BOOLEAN,
19 | defaultValue: false,
20 | },
21 | },
22 | {
23 | timestamps: false,
24 | // createdAt: created_at,
25 | }
26 | );
27 |
28 | // RELACIONES UNO A MUCHOS
29 | TaskModel.belongsTo(UserModel, {
30 | foreignKey: "user_id",
31 | as: "author",
32 | onDelete: "CASCADE",
33 | });
34 |
35 | UserModel.hasMany(TaskModel, { foreignKey: "user_id", as: "tasks" });
36 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/controllers/task.controllers.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "../models/person.model.js";
2 | import { TaskModel } from "../models/task.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const getAllTasks = async (req, res) => {
6 | const userLogged = req.userLogged;
7 |
8 | try {
9 | const tasks = await TaskModel.findAll({
10 | where: {
11 | user_id: userLogged.id,
12 | },
13 | include: [
14 | {
15 | model: UserModel,
16 | as: "author",
17 | attributes: {
18 | exclude: ["password", "person_id"],
19 | },
20 | include: [
21 | {
22 | model: PersonModel,
23 | as: "person",
24 | },
25 | ],
26 | },
27 | ],
28 | });
29 |
30 | res.json(tasks);
31 | } catch (error) {
32 | console.log(error.message);
33 | return res.status(500).json({ message: "Error interno del servidor" });
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/models/user.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { PersonModel } from "./person.model.js";
4 |
5 | export const UserModel = sequelize.define(
6 | "User",
7 | {
8 | username: {
9 | type: DataTypes.STRING(100),
10 | allowNull: false,
11 | },
12 | email: {
13 | type: DataTypes.STRING(100),
14 | unique: true,
15 | allowNull: false,
16 | },
17 | password: {
18 | type: DataTypes.STRING(100),
19 | allowNull: false,
20 | },
21 | },
22 | {
23 | // paranoid: true,
24 | }
25 | );
26 |
27 | // RELACIONES UNO A UNO
28 | UserModel.belongsTo(PersonModel, {
29 | foreignKey: "person_id",
30 | as: "person",
31 | onDelete: "CASCADE",
32 | });
33 |
34 | PersonModel.hasOne(UserModel, { foreignKey: "person_id", as: "user" });
35 |
36 | PersonModel.addHook("afterDestroy", async (person) => {
37 | const user = await UserModel.findOne({
38 | where: { person_id: person.dataValues.id },
39 | });
40 |
41 | await user.destroy();
42 | });
43 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/models/user.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { PersonModel } from "./person.model.js";
4 |
5 | export const UserModel = sequelize.define(
6 | "User",
7 | {
8 | username: {
9 | type: DataTypes.STRING(100),
10 | allowNull: false,
11 | },
12 | email: {
13 | type: DataTypes.STRING(100),
14 | unique: true,
15 | allowNull: false,
16 | },
17 | password: {
18 | type: DataTypes.STRING(100),
19 | allowNull: false,
20 | },
21 | },
22 | {
23 | // paranoid: true,
24 | }
25 | );
26 |
27 | // RELACIONES UNO A UNO
28 | UserModel.belongsTo(PersonModel, {
29 | foreignKey: "person_id",
30 | as: "person",
31 | onDelete: "CASCADE",
32 | });
33 |
34 | PersonModel.hasOne(UserModel, { foreignKey: "person_id", as: "user" });
35 |
36 | PersonModel.addHook("afterDestroy", async (person) => {
37 | const user = await UserModel.findOne({
38 | where: { person_id: person.dataValues.id },
39 | });
40 |
41 | await user.destroy();
42 | });
43 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/models/user.model.js:
--------------------------------------------------------------------------------
1 | import { DataTypes } from "sequelize";
2 | import { sequelize } from "../config/database.js";
3 | import { PersonModel } from "./person.model.js";
4 |
5 | export const UserModel = sequelize.define(
6 | "User",
7 | {
8 | username: {
9 | type: DataTypes.STRING(100),
10 | allowNull: false,
11 | },
12 | email: {
13 | type: DataTypes.STRING(100),
14 | unique: true,
15 | allowNull: false,
16 | },
17 | password: {
18 | type: DataTypes.STRING(100),
19 | allowNull: false,
20 | },
21 | },
22 | {
23 | // paranoid: true,
24 | }
25 | );
26 |
27 | // RELACIONES UNO A UNO
28 | UserModel.belongsTo(PersonModel, {
29 | foreignKey: "person_id",
30 | as: "person",
31 | onDelete: "CASCADE",
32 | });
33 |
34 | PersonModel.hasOne(UserModel, { foreignKey: "person_id", as: "user" });
35 |
36 | PersonModel.addHook("afterDestroy", async (person) => {
37 | const user = await UserModel.findOne({
38 | where: { person_id: person.dataValues.id },
39 | });
40 |
41 | await user.destroy();
42 | });
43 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/middlewares/validations/person.validations.js:
--------------------------------------------------------------------------------
1 | import { body, param } from "express-validator";
2 | import { PersonModel } from "../../models/person.model.js";
3 |
4 | export const createPersonValidation = [
5 | body("name").notEmpty().withMessage("El campo name debe ser obligatorio"),
6 | body("lastname")
7 | .notEmpty()
8 | .withMessage("El campo lastname debe ser obligatorio"),
9 | ];
10 |
11 | export const updatePersonValidation = [
12 | param("id")
13 | .isInt()
14 | .withMessage("El id debe ser un entero")
15 | .custom(async (value) => {
16 | const person = await PersonModel.findByPk(value);
17 |
18 | if (!person) {
19 | throw new Error("La persona no existe");
20 | }
21 | }),
22 | body("name")
23 | .optional()
24 | .isString()
25 | .withMessage("El campo name debe ser una cadena de caracteres")
26 | .isLength({ min: 2, max: 5 })
27 | .withMessage("El name debe ser entre 2 y 5 caracteres"),
28 | body("lastname")
29 | .optional()
30 | .notEmpty()
31 | .withMessage("El campo lastname debe ser obligatorio"),
32 | ];
33 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/middlewares/validations/person.validations.js:
--------------------------------------------------------------------------------
1 | import { body, param } from "express-validator";
2 | import { PersonModel } from "../../models/person.model.js";
3 |
4 | export const createPersonValidation = [
5 | body("name").notEmpty().withMessage("El campo name debe ser obligatorio"),
6 | body("lastname")
7 | .notEmpty()
8 | .withMessage("El campo lastname debe ser obligatorio"),
9 | ];
10 |
11 | export const updatePersonValidation = [
12 | param("id")
13 | .isInt()
14 | .withMessage("El id debe ser un entero")
15 | .custom(async (value) => {
16 | const person = await PersonModel.findByPk(value);
17 |
18 | if (!person) {
19 | throw new Error("La persona no existe");
20 | }
21 | }),
22 | body("name")
23 | .optional()
24 | .isString()
25 | .withMessage("El campo name debe ser una cadena de caracteres")
26 | .isLength({ min: 2, max: 5 })
27 | .withMessage("El name debe ser entre 2 y 5 caracteres"),
28 | body("lastname")
29 | .optional()
30 | .notEmpty()
31 | .withMessage("El campo lastname debe ser obligatorio"),
32 | ];
33 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/middlewares/validations/person.validations.js:
--------------------------------------------------------------------------------
1 | import { body, param } from "express-validator";
2 | import { PersonModel } from "../../models/person.model.js";
3 |
4 | export const createPersonValidation = [
5 | body("name").notEmpty().withMessage("El campo name debe ser obligatorio"),
6 | body("lastname")
7 | .notEmpty()
8 | .withMessage("El campo lastname debe ser obligatorio"),
9 | ];
10 |
11 | export const updatePersonValidation = [
12 | param("id")
13 | .isInt()
14 | .withMessage("El id debe ser un entero")
15 | .custom(async (value) => {
16 | const person = await PersonModel.findByPk(value);
17 |
18 | if (!person) {
19 | throw new Error("La persona no existe");
20 | }
21 | }),
22 | body("name")
23 | .optional()
24 | .isString()
25 | .withMessage("El campo name debe ser una cadena de caracteres")
26 | .isLength({ min: 2, max: 5 })
27 | .withMessage("El name debe ser entre 2 y 5 caracteres"),
28 | body("lastname")
29 | .optional()
30 | .notEmpty()
31 | .withMessage("El campo lastname debe ser obligatorio"),
32 | ];
33 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/controllers/task.controllers.js:
--------------------------------------------------------------------------------
1 | import { PersonModel } from "../models/person.model.js";
2 | import { TaskModel } from "../models/task.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const getAllTasks = async (req, res) => {
6 | const userLogged = req.usuario;
7 |
8 | if (!userLogged.role === "user") {
9 | return res.status(401).json({
10 | msg: "Usted no tiene los permisos",
11 | });
12 | }
13 |
14 | // const token = req.cookies.token;
15 | // const decoded = jwt.verify(token, "s3cr3t");
16 |
17 | try {
18 | const tasks = await TaskModel.findAll({
19 | where: {
20 | user_id: userLogged.id,
21 | },
22 | include: [
23 | {
24 | model: UserModel,
25 | as: "author",
26 | attributes: {
27 | exclude: ["password", "person_id"],
28 | },
29 | include: [
30 | {
31 | model: PersonModel,
32 | as: "person",
33 | },
34 | ],
35 | },
36 | ],
37 | });
38 |
39 | res.json(tasks);
40 | } catch (error) {
41 | console.log(error.message);
42 | return res.status(500).json({ message: "Error interno del servidor" });
43 | }
44 | };
45 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/app.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import { connectDB } from "./src/config/database.js";
3 | // import "./src/models/user.model.js";
4 | // import "./src/models/person.model.js";
5 | // import "./src/models/role.model.js";
6 | // import "./src/models/user_role.model.js";
7 | import { TaskModel } from "./src/models/task.model.js";
8 | import { UserModel } from "./src/models/user.model.js";
9 | import { PersonModel } from "./src/models/person.model.js";
10 | import { RoleModel } from "./src/models/role.model.js";
11 |
12 | const app = express();
13 | const PORT = 3005;
14 |
15 | app.get("/tasks", async (req, res) => {
16 | const tasks = await TaskModel.findAll({
17 | // attributes: ["title", "description"],
18 | attributes: {
19 | exclude: ["user_id"],
20 | },
21 | include: [
22 | {
23 | model: UserModel,
24 | as: "author",
25 | attributes: {
26 | exclude: ["password", "person_id"],
27 | },
28 | include: [
29 | {
30 | model: PersonModel,
31 | as: "person",
32 | },
33 | ],
34 | },
35 | ],
36 | });
37 |
38 | res.json(tasks);
39 | });
40 |
41 | app.get("/users", async (req, res) => {
42 | const users = await UserModel.findAll({
43 | attributes: {
44 | exclude: ["password", "person_id"],
45 | },
46 | include: [
47 | {
48 | model: RoleModel,
49 | as: "roles",
50 | through: {
51 | attributes: [],
52 | },
53 | },
54 | ],
55 | });
56 |
57 | res.json(users);
58 | });
59 |
60 | app.listen(PORT, async () => {
61 | await connectDB();
62 | console.log(`servidor corriendo en el puerto ${PORT}`);
63 | });
64 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/controllers/auth.controllers.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 | import { PersonModel } from "../models/person.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const register = async (req, res) => {
6 | const { name, lastname, username, email, password } = req.body;
7 | try {
8 | const person = await PersonModel.create({
9 | name: name,
10 | lastname: lastname,
11 | });
12 |
13 | await UserModel.create({
14 | username: username,
15 | email: email,
16 | password: password,
17 | person_id: person.id,
18 | });
19 |
20 | res.status(201).json({
21 | msg: "usuario creado correctamente",
22 | });
23 | } catch (error) {
24 | res.status(500).json({
25 | msg: "Error interno del servidor",
26 | });
27 | }
28 | };
29 |
30 | export const login = async (req, res) => {
31 | const { username, password } = req.body;
32 | try {
33 | const user = await UserModel.findOne({
34 | where: {
35 | username: username,
36 | password: password,
37 | },
38 | include: {
39 | model: PersonModel,
40 | as: "person",
41 | },
42 | });
43 |
44 | if (!user) {
45 | return res.status(404).json({
46 | msg: "Credenciales Incorrectas",
47 | });
48 | }
49 |
50 | // generar un token
51 |
52 | const token = jwt.sign(
53 | {
54 | id: user.id,
55 | name: user.person.name,
56 | lastname: user.person.lastname,
57 | },
58 | "s3cr3t",
59 | {
60 | expiresIn: "1h",
61 | }
62 | );
63 |
64 | return res.status(200).json({
65 | msg: "Logueado correctamente",
66 | token,
67 | });
68 | } catch (error) {
69 | res.status(500).json({
70 | msg: "Error interno del servidor",
71 | });
72 | }
73 | };
74 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/src/controllers/person.controllers.js:
--------------------------------------------------------------------------------
1 | import { matchedData, validationResult } from "express-validator";
2 | import { PersonModel } from "../models/person.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const getAllPeople = async (req, res) => {
6 | try {
7 | const people = await PersonModel.findAll({
8 | // paranoid: false,
9 | include: {
10 | model: UserModel,
11 | as: "user",
12 | },
13 | });
14 |
15 | return res.status(200).json(people);
16 | } catch (error) {
17 | console.log(error);
18 | return res.status(500).json({ message: "Error interno del servidor" });
19 | }
20 | };
21 |
22 | export const createPerson = async (req, res) => {
23 | // const { name, lastname } = req.body;
24 | try {
25 | // const person = await PersonModel.create(req.body);
26 |
27 | return res.status(200).json({ msg: "creado correctamente" });
28 | } catch (error) {
29 | console.log(error);
30 | return res.status(500).json({ message: "Error interno del servidor" });
31 | }
32 | };
33 |
34 | export const updatePerson = async (req, res) => {
35 | try {
36 | // if (typeof req.body === "object") {
37 | // return res.status(404).json({ message: "Debe mandar algo" });
38 | // }
39 |
40 | const data = matchedData(req, { locations: ["body"] });
41 |
42 | if (Object.keys(data).length === 0) {
43 | return res
44 | .status(404)
45 | .json({ message: "La data tiene que ser correcta" });
46 | }
47 |
48 | await PersonModel.update(data, {
49 | where: {
50 | id: req.params.id,
51 | },
52 | });
53 |
54 | return res.status(200).json({ msg: "actualizado correctamente" });
55 | } catch (error) {
56 | console.log(error);
57 | return res.status(500).json({ message: "Error interno del servidor" });
58 | }
59 | };
60 |
61 | export const deletePerson = async (req, res) => {
62 | const { id } = req.params;
63 |
64 | try {
65 | const person = await PersonModel.findByPk(id);
66 |
67 | await person.destroy();
68 |
69 | return res.status(200).json({ msg: "Persona eliminada correctamente" });
70 | } catch (error) {
71 | console.log(error);
72 | return res.status(500).json({ message: "Error interno del servidor" });
73 | }
74 | };
75 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/src/controllers/person.controllers.js:
--------------------------------------------------------------------------------
1 | import { matchedData, validationResult } from "express-validator";
2 | import { PersonModel } from "../models/person.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const getAllPeople = async (req, res) => {
6 | try {
7 | const people = await PersonModel.findAll({
8 | // paranoid: false,
9 | include: {
10 | model: UserModel,
11 | as: "user",
12 | },
13 | });
14 |
15 | return res.status(200).json(people);
16 | } catch (error) {
17 | console.log(error);
18 | return res.status(500).json({ message: "Error interno del servidor" });
19 | }
20 | };
21 |
22 | export const createPerson = async (req, res) => {
23 | // const { name, lastname } = req.body;
24 | try {
25 | // const person = await PersonModel.create(req.body);
26 |
27 | return res.status(200).json({ msg: "creado correctamente" });
28 | } catch (error) {
29 | console.log(error);
30 | return res.status(500).json({ message: "Error interno del servidor" });
31 | }
32 | };
33 |
34 | export const updatePerson = async (req, res) => {
35 | try {
36 | // if (typeof req.body === "object") {
37 | // return res.status(404).json({ message: "Debe mandar algo" });
38 | // }
39 |
40 | const data = matchedData(req, { locations: ["body"] });
41 |
42 | if (Object.keys(data).length === 0) {
43 | return res
44 | .status(404)
45 | .json({ message: "La data tiene que ser correcta" });
46 | }
47 |
48 | await PersonModel.update(data, {
49 | where: {
50 | id: req.params.id,
51 | },
52 | });
53 |
54 | return res.status(200).json({ msg: "actualizado correctamente" });
55 | } catch (error) {
56 | console.log(error);
57 | return res.status(500).json({ message: "Error interno del servidor" });
58 | }
59 | };
60 |
61 | export const deletePerson = async (req, res) => {
62 | const { id } = req.params;
63 |
64 | try {
65 | const person = await PersonModel.findByPk(id);
66 |
67 | await person.destroy();
68 |
69 | return res.status(200).json({ msg: "Persona eliminada correctamente" });
70 | } catch (error) {
71 | console.log(error);
72 | return res.status(500).json({ message: "Error interno del servidor" });
73 | }
74 | };
75 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/controllers/person.controllers.js:
--------------------------------------------------------------------------------
1 | import { matchedData, validationResult } from "express-validator";
2 | import { PersonModel } from "../models/person.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 |
5 | export const getAllPeople = async (req, res) => {
6 | try {
7 | // const token = req.cookies.token;
8 | // const decoded = jwt.verify(token, "s3cr3t");
9 |
10 | // req.userLogged = decoded;
11 |
12 | // next();
13 |
14 | const people = await PersonModel.findAll({
15 | // paranoid: false,
16 | include: {
17 | model: UserModel,
18 | as: "user",
19 | },
20 | });
21 |
22 | return res.status(200).json(people);
23 | } catch (error) {
24 | console.log(error);
25 | return res.status(500).json({ message: "Error interno del servidor" });
26 | }
27 | };
28 |
29 | export const createPerson = async (req, res) => {
30 | // const { name, lastname } = req.body;
31 | try {
32 | const token = req.cookies.token;
33 | const decoded = jwt.verify(token, "s3cr3t");
34 | // const person = await PersonModel.create(req.body);
35 |
36 | return res.status(200).json({ msg: "creado correctamente" });
37 | } catch (error) {
38 | console.log(error);
39 | return res.status(500).json({ message: "Error interno del servidor" });
40 | }
41 | };
42 |
43 | export const updatePerson = async (req, res) => {
44 | try {
45 | const token = req.cookies.token;
46 | const decoded = jwt.verify(token, "s3cr3t");
47 | // if (typeof req.body === "object") {
48 | // return res.status(404).json({ message: "Debe mandar algo" });
49 | // }
50 |
51 | const data = matchedData(req, { locations: ["body"] });
52 |
53 | if (Object.keys(data).length === 0) {
54 | return res
55 | .status(404)
56 | .json({ message: "La data tiene que ser correcta" });
57 | }
58 |
59 | await PersonModel.update(data, {
60 | where: {
61 | id: req.params.id,
62 | },
63 | });
64 |
65 | return res.status(200).json({ msg: "actualizado correctamente" });
66 | } catch (error) {
67 | console.log(error);
68 | return res.status(500).json({ message: "Error interno del servidor" });
69 | }
70 | };
71 |
72 | export const deletePerson = async (req, res) => {
73 | const { id } = req.params;
74 |
75 | try {
76 | const token = req.cookies.token;
77 | const decoded = jwt.verify(token, "s3cr3t");
78 | const person = await PersonModel.findByPk(id);
79 |
80 | await person.destroy();
81 |
82 | return res.status(200).json({ msg: "Persona eliminada correctamente" });
83 | } catch (error) {
84 | console.log(error);
85 | return res.status(500).json({ message: "Error interno del servidor" });
86 | }
87 | };
88 |
--------------------------------------------------------------------------------
/04_autenticacion_y_autorizacion_cookies/src/controllers/auth.controllers.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 | import { PersonModel } from "../models/person.model.js";
3 | import { UserModel } from "../models/user.model.js";
4 | import { comparePassword, hashPassword } from "../helpers/bcrypt.helper.js";
5 |
6 | export const register = async (req, res) => {
7 | const { name, lastname, username, email, password } = req.body;
8 | try {
9 | const person = await PersonModel.create({
10 | name: name,
11 | lastname: lastname,
12 | });
13 |
14 | const hashedPassword = await hashPassword(password);
15 |
16 | await UserModel.create({
17 | username: username,
18 | email: email,
19 | password: hashedPassword,
20 | person_id: person.id,
21 | });
22 |
23 | res.status(201).json({
24 | msg: "usuario creado correctamente",
25 | });
26 | } catch (error) {
27 | res.status(500).json({
28 | msg: "Error interno del servidor",
29 | });
30 | }
31 | };
32 |
33 | export const login = async (req, res) => {
34 | const { username, password } = req.body;
35 |
36 | try {
37 | const user = await UserModel.findOne({
38 | where: {
39 | username: username,
40 | // password: askdjakshd123123,
41 | },
42 | include: {
43 | model: PersonModel,
44 | as: "person",
45 | },
46 | });
47 |
48 | if (!user) {
49 | return res.status(404).json({
50 | msg: "El usuario o la contraseña no coincide",
51 | });
52 | }
53 |
54 | const isMatch = await comparePassword(password, user.password);
55 |
56 | if (!isMatch) {
57 | return res.status(404).json({
58 | msg: "El usuario o la contraseña no coincide",
59 | });
60 | }
61 |
62 | if (!user) {
63 | return res.status(404).json({
64 | msg: "Credenciales Incorrectas",
65 | });
66 | }
67 |
68 | // generar un token forma 1 con helpers (RECOMENDADA)
69 | // const token = generateToken(user);
70 |
71 | // generar un token forma 2
72 | const token = jwt.sign(
73 | {
74 | id: user.id,
75 | name: user.person.name,
76 | lastname: user.person.lastname,
77 | },
78 | "s3cr3t",
79 | {
80 | expiresIn: "1h",
81 | }
82 | );
83 |
84 | // Enviar token como cookie
85 | res.cookie("token", token, {
86 | httpOnly: true, // No accesible desde JavaScript
87 | maxAge: 1000 * 60 * 60, // 1 hora
88 | });
89 |
90 | return res.status(200).json({
91 | msg: "Logueado correctamente",
92 | });
93 | } catch (error) {
94 | res.status(500).json({
95 | msg: "Error interno del servidor",
96 | });
97 | }
98 | };
99 |
100 | export const logout = async (req, res) => {
101 | res.clearCookie("token"); // Eliminar cookie del navegador
102 | return res.json({ message: "Logout exitoso" });
103 | };
104 |
105 | export const profile = async (req, res) => {
106 | const user = req.userLogged;
107 |
108 | try {
109 | res.status(200).json({
110 | name: user.name,
111 | lastname: user.lastname,
112 | });
113 | } catch (error) {}
114 | };
115 |
--------------------------------------------------------------------------------
/01_relaciones_entre_modelos/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "servidor_diagnostico",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^5.1.0",
13 | "mysql2": "^3.14.3",
14 | "sequelize": "^6.37.7"
15 | }
16 | },
17 | "node_modules/@types/debug": {
18 | "version": "4.1.12",
19 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
20 | "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
21 | "license": "MIT",
22 | "dependencies": {
23 | "@types/ms": "*"
24 | }
25 | },
26 | "node_modules/@types/ms": {
27 | "version": "2.1.0",
28 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
29 | "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
30 | "license": "MIT"
31 | },
32 | "node_modules/@types/node": {
33 | "version": "24.2.0",
34 | "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz",
35 | "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
36 | "license": "MIT",
37 | "dependencies": {
38 | "undici-types": "~7.10.0"
39 | }
40 | },
41 | "node_modules/@types/validator": {
42 | "version": "13.15.2",
43 | "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.2.tgz",
44 | "integrity": "sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==",
45 | "license": "MIT"
46 | },
47 | "node_modules/accepts": {
48 | "version": "2.0.0",
49 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
50 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
51 | "license": "MIT",
52 | "dependencies": {
53 | "mime-types": "^3.0.0",
54 | "negotiator": "^1.0.0"
55 | },
56 | "engines": {
57 | "node": ">= 0.6"
58 | }
59 | },
60 | "node_modules/aws-ssl-profiles": {
61 | "version": "1.1.2",
62 | "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
63 | "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
64 | "license": "MIT",
65 | "engines": {
66 | "node": ">= 6.0.0"
67 | }
68 | },
69 | "node_modules/body-parser": {
70 | "version": "2.2.0",
71 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
72 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
73 | "license": "MIT",
74 | "dependencies": {
75 | "bytes": "^3.1.2",
76 | "content-type": "^1.0.5",
77 | "debug": "^4.4.0",
78 | "http-errors": "^2.0.0",
79 | "iconv-lite": "^0.6.3",
80 | "on-finished": "^2.4.1",
81 | "qs": "^6.14.0",
82 | "raw-body": "^3.0.0",
83 | "type-is": "^2.0.0"
84 | },
85 | "engines": {
86 | "node": ">=18"
87 | }
88 | },
89 | "node_modules/bytes": {
90 | "version": "3.1.2",
91 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
92 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
93 | "license": "MIT",
94 | "engines": {
95 | "node": ">= 0.8"
96 | }
97 | },
98 | "node_modules/call-bind-apply-helpers": {
99 | "version": "1.0.2",
100 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
101 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
102 | "license": "MIT",
103 | "dependencies": {
104 | "es-errors": "^1.3.0",
105 | "function-bind": "^1.1.2"
106 | },
107 | "engines": {
108 | "node": ">= 0.4"
109 | }
110 | },
111 | "node_modules/call-bound": {
112 | "version": "1.0.4",
113 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
114 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
115 | "license": "MIT",
116 | "dependencies": {
117 | "call-bind-apply-helpers": "^1.0.2",
118 | "get-intrinsic": "^1.3.0"
119 | },
120 | "engines": {
121 | "node": ">= 0.4"
122 | },
123 | "funding": {
124 | "url": "https://github.com/sponsors/ljharb"
125 | }
126 | },
127 | "node_modules/content-disposition": {
128 | "version": "1.0.0",
129 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
130 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
131 | "license": "MIT",
132 | "dependencies": {
133 | "safe-buffer": "5.2.1"
134 | },
135 | "engines": {
136 | "node": ">= 0.6"
137 | }
138 | },
139 | "node_modules/content-type": {
140 | "version": "1.0.5",
141 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
142 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
143 | "license": "MIT",
144 | "engines": {
145 | "node": ">= 0.6"
146 | }
147 | },
148 | "node_modules/cookie": {
149 | "version": "0.7.2",
150 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
151 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
152 | "license": "MIT",
153 | "engines": {
154 | "node": ">= 0.6"
155 | }
156 | },
157 | "node_modules/cookie-signature": {
158 | "version": "1.2.2",
159 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
160 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
161 | "license": "MIT",
162 | "engines": {
163 | "node": ">=6.6.0"
164 | }
165 | },
166 | "node_modules/debug": {
167 | "version": "4.4.1",
168 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
169 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
170 | "license": "MIT",
171 | "dependencies": {
172 | "ms": "^2.1.3"
173 | },
174 | "engines": {
175 | "node": ">=6.0"
176 | },
177 | "peerDependenciesMeta": {
178 | "supports-color": {
179 | "optional": true
180 | }
181 | }
182 | },
183 | "node_modules/denque": {
184 | "version": "2.1.0",
185 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
186 | "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
187 | "license": "Apache-2.0",
188 | "engines": {
189 | "node": ">=0.10"
190 | }
191 | },
192 | "node_modules/depd": {
193 | "version": "2.0.0",
194 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
195 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
196 | "license": "MIT",
197 | "engines": {
198 | "node": ">= 0.8"
199 | }
200 | },
201 | "node_modules/dottie": {
202 | "version": "2.0.6",
203 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
204 | "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==",
205 | "license": "MIT"
206 | },
207 | "node_modules/dunder-proto": {
208 | "version": "1.0.1",
209 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
210 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
211 | "license": "MIT",
212 | "dependencies": {
213 | "call-bind-apply-helpers": "^1.0.1",
214 | "es-errors": "^1.3.0",
215 | "gopd": "^1.2.0"
216 | },
217 | "engines": {
218 | "node": ">= 0.4"
219 | }
220 | },
221 | "node_modules/ee-first": {
222 | "version": "1.1.1",
223 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
224 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
225 | "license": "MIT"
226 | },
227 | "node_modules/encodeurl": {
228 | "version": "2.0.0",
229 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
230 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
231 | "license": "MIT",
232 | "engines": {
233 | "node": ">= 0.8"
234 | }
235 | },
236 | "node_modules/es-define-property": {
237 | "version": "1.0.1",
238 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
239 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
240 | "license": "MIT",
241 | "engines": {
242 | "node": ">= 0.4"
243 | }
244 | },
245 | "node_modules/es-errors": {
246 | "version": "1.3.0",
247 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
248 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
249 | "license": "MIT",
250 | "engines": {
251 | "node": ">= 0.4"
252 | }
253 | },
254 | "node_modules/es-object-atoms": {
255 | "version": "1.1.1",
256 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
257 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
258 | "license": "MIT",
259 | "dependencies": {
260 | "es-errors": "^1.3.0"
261 | },
262 | "engines": {
263 | "node": ">= 0.4"
264 | }
265 | },
266 | "node_modules/escape-html": {
267 | "version": "1.0.3",
268 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
269 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
270 | "license": "MIT"
271 | },
272 | "node_modules/etag": {
273 | "version": "1.8.1",
274 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
275 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
276 | "license": "MIT",
277 | "engines": {
278 | "node": ">= 0.6"
279 | }
280 | },
281 | "node_modules/express": {
282 | "version": "5.1.0",
283 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
284 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
285 | "license": "MIT",
286 | "dependencies": {
287 | "accepts": "^2.0.0",
288 | "body-parser": "^2.2.0",
289 | "content-disposition": "^1.0.0",
290 | "content-type": "^1.0.5",
291 | "cookie": "^0.7.1",
292 | "cookie-signature": "^1.2.1",
293 | "debug": "^4.4.0",
294 | "encodeurl": "^2.0.0",
295 | "escape-html": "^1.0.3",
296 | "etag": "^1.8.1",
297 | "finalhandler": "^2.1.0",
298 | "fresh": "^2.0.0",
299 | "http-errors": "^2.0.0",
300 | "merge-descriptors": "^2.0.0",
301 | "mime-types": "^3.0.0",
302 | "on-finished": "^2.4.1",
303 | "once": "^1.4.0",
304 | "parseurl": "^1.3.3",
305 | "proxy-addr": "^2.0.7",
306 | "qs": "^6.14.0",
307 | "range-parser": "^1.2.1",
308 | "router": "^2.2.0",
309 | "send": "^1.1.0",
310 | "serve-static": "^2.2.0",
311 | "statuses": "^2.0.1",
312 | "type-is": "^2.0.1",
313 | "vary": "^1.1.2"
314 | },
315 | "engines": {
316 | "node": ">= 18"
317 | },
318 | "funding": {
319 | "type": "opencollective",
320 | "url": "https://opencollective.com/express"
321 | }
322 | },
323 | "node_modules/finalhandler": {
324 | "version": "2.1.0",
325 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
326 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
327 | "license": "MIT",
328 | "dependencies": {
329 | "debug": "^4.4.0",
330 | "encodeurl": "^2.0.0",
331 | "escape-html": "^1.0.3",
332 | "on-finished": "^2.4.1",
333 | "parseurl": "^1.3.3",
334 | "statuses": "^2.0.1"
335 | },
336 | "engines": {
337 | "node": ">= 0.8"
338 | }
339 | },
340 | "node_modules/forwarded": {
341 | "version": "0.2.0",
342 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
343 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
344 | "license": "MIT",
345 | "engines": {
346 | "node": ">= 0.6"
347 | }
348 | },
349 | "node_modules/fresh": {
350 | "version": "2.0.0",
351 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
352 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
353 | "license": "MIT",
354 | "engines": {
355 | "node": ">= 0.8"
356 | }
357 | },
358 | "node_modules/function-bind": {
359 | "version": "1.1.2",
360 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
361 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
362 | "license": "MIT",
363 | "funding": {
364 | "url": "https://github.com/sponsors/ljharb"
365 | }
366 | },
367 | "node_modules/generate-function": {
368 | "version": "2.3.1",
369 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
370 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
371 | "license": "MIT",
372 | "dependencies": {
373 | "is-property": "^1.0.2"
374 | }
375 | },
376 | "node_modules/get-intrinsic": {
377 | "version": "1.3.0",
378 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
379 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
380 | "license": "MIT",
381 | "dependencies": {
382 | "call-bind-apply-helpers": "^1.0.2",
383 | "es-define-property": "^1.0.1",
384 | "es-errors": "^1.3.0",
385 | "es-object-atoms": "^1.1.1",
386 | "function-bind": "^1.1.2",
387 | "get-proto": "^1.0.1",
388 | "gopd": "^1.2.0",
389 | "has-symbols": "^1.1.0",
390 | "hasown": "^2.0.2",
391 | "math-intrinsics": "^1.1.0"
392 | },
393 | "engines": {
394 | "node": ">= 0.4"
395 | },
396 | "funding": {
397 | "url": "https://github.com/sponsors/ljharb"
398 | }
399 | },
400 | "node_modules/get-proto": {
401 | "version": "1.0.1",
402 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
403 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
404 | "license": "MIT",
405 | "dependencies": {
406 | "dunder-proto": "^1.0.1",
407 | "es-object-atoms": "^1.0.0"
408 | },
409 | "engines": {
410 | "node": ">= 0.4"
411 | }
412 | },
413 | "node_modules/gopd": {
414 | "version": "1.2.0",
415 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
416 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
417 | "license": "MIT",
418 | "engines": {
419 | "node": ">= 0.4"
420 | },
421 | "funding": {
422 | "url": "https://github.com/sponsors/ljharb"
423 | }
424 | },
425 | "node_modules/has-symbols": {
426 | "version": "1.1.0",
427 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
428 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
429 | "license": "MIT",
430 | "engines": {
431 | "node": ">= 0.4"
432 | },
433 | "funding": {
434 | "url": "https://github.com/sponsors/ljharb"
435 | }
436 | },
437 | "node_modules/hasown": {
438 | "version": "2.0.2",
439 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
440 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
441 | "license": "MIT",
442 | "dependencies": {
443 | "function-bind": "^1.1.2"
444 | },
445 | "engines": {
446 | "node": ">= 0.4"
447 | }
448 | },
449 | "node_modules/http-errors": {
450 | "version": "2.0.0",
451 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
452 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
453 | "license": "MIT",
454 | "dependencies": {
455 | "depd": "2.0.0",
456 | "inherits": "2.0.4",
457 | "setprototypeof": "1.2.0",
458 | "statuses": "2.0.1",
459 | "toidentifier": "1.0.1"
460 | },
461 | "engines": {
462 | "node": ">= 0.8"
463 | }
464 | },
465 | "node_modules/http-errors/node_modules/statuses": {
466 | "version": "2.0.1",
467 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
468 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
469 | "license": "MIT",
470 | "engines": {
471 | "node": ">= 0.8"
472 | }
473 | },
474 | "node_modules/iconv-lite": {
475 | "version": "0.6.3",
476 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
477 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
478 | "license": "MIT",
479 | "dependencies": {
480 | "safer-buffer": ">= 2.1.2 < 3.0.0"
481 | },
482 | "engines": {
483 | "node": ">=0.10.0"
484 | }
485 | },
486 | "node_modules/inflection": {
487 | "version": "1.13.4",
488 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
489 | "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
490 | "engines": [
491 | "node >= 0.4.0"
492 | ],
493 | "license": "MIT"
494 | },
495 | "node_modules/inherits": {
496 | "version": "2.0.4",
497 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
498 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
499 | "license": "ISC"
500 | },
501 | "node_modules/ipaddr.js": {
502 | "version": "1.9.1",
503 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
504 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
505 | "license": "MIT",
506 | "engines": {
507 | "node": ">= 0.10"
508 | }
509 | },
510 | "node_modules/is-promise": {
511 | "version": "4.0.0",
512 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
513 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
514 | "license": "MIT"
515 | },
516 | "node_modules/is-property": {
517 | "version": "1.0.2",
518 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
519 | "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
520 | "license": "MIT"
521 | },
522 | "node_modules/lodash": {
523 | "version": "4.17.21",
524 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
525 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
526 | "license": "MIT"
527 | },
528 | "node_modules/long": {
529 | "version": "5.3.2",
530 | "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
531 | "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
532 | "license": "Apache-2.0"
533 | },
534 | "node_modules/lru-cache": {
535 | "version": "7.18.3",
536 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
537 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
538 | "license": "ISC",
539 | "engines": {
540 | "node": ">=12"
541 | }
542 | },
543 | "node_modules/lru.min": {
544 | "version": "1.1.2",
545 | "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
546 | "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
547 | "license": "MIT",
548 | "engines": {
549 | "bun": ">=1.0.0",
550 | "deno": ">=1.30.0",
551 | "node": ">=8.0.0"
552 | },
553 | "funding": {
554 | "type": "github",
555 | "url": "https://github.com/sponsors/wellwelwel"
556 | }
557 | },
558 | "node_modules/math-intrinsics": {
559 | "version": "1.1.0",
560 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
561 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
562 | "license": "MIT",
563 | "engines": {
564 | "node": ">= 0.4"
565 | }
566 | },
567 | "node_modules/media-typer": {
568 | "version": "1.1.0",
569 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
570 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
571 | "license": "MIT",
572 | "engines": {
573 | "node": ">= 0.8"
574 | }
575 | },
576 | "node_modules/merge-descriptors": {
577 | "version": "2.0.0",
578 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
579 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
580 | "license": "MIT",
581 | "engines": {
582 | "node": ">=18"
583 | },
584 | "funding": {
585 | "url": "https://github.com/sponsors/sindresorhus"
586 | }
587 | },
588 | "node_modules/mime-db": {
589 | "version": "1.54.0",
590 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
591 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
592 | "license": "MIT",
593 | "engines": {
594 | "node": ">= 0.6"
595 | }
596 | },
597 | "node_modules/mime-types": {
598 | "version": "3.0.1",
599 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
600 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
601 | "license": "MIT",
602 | "dependencies": {
603 | "mime-db": "^1.54.0"
604 | },
605 | "engines": {
606 | "node": ">= 0.6"
607 | }
608 | },
609 | "node_modules/moment": {
610 | "version": "2.30.1",
611 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
612 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
613 | "license": "MIT",
614 | "engines": {
615 | "node": "*"
616 | }
617 | },
618 | "node_modules/moment-timezone": {
619 | "version": "0.5.48",
620 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
621 | "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
622 | "license": "MIT",
623 | "dependencies": {
624 | "moment": "^2.29.4"
625 | },
626 | "engines": {
627 | "node": "*"
628 | }
629 | },
630 | "node_modules/ms": {
631 | "version": "2.1.3",
632 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
633 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
634 | "license": "MIT"
635 | },
636 | "node_modules/mysql2": {
637 | "version": "3.14.3",
638 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.3.tgz",
639 | "integrity": "sha512-fD6MLV8XJ1KiNFIF0bS7Msl8eZyhlTDCDl75ajU5SJtpdx9ZPEACulJcqJWr1Y8OYyxsFc4j3+nflpmhxCU5aQ==",
640 | "license": "MIT",
641 | "dependencies": {
642 | "aws-ssl-profiles": "^1.1.1",
643 | "denque": "^2.1.0",
644 | "generate-function": "^2.3.1",
645 | "iconv-lite": "^0.6.3",
646 | "long": "^5.2.1",
647 | "lru.min": "^1.0.0",
648 | "named-placeholders": "^1.1.3",
649 | "seq-queue": "^0.0.5",
650 | "sqlstring": "^2.3.2"
651 | },
652 | "engines": {
653 | "node": ">= 8.0"
654 | }
655 | },
656 | "node_modules/named-placeholders": {
657 | "version": "1.1.3",
658 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
659 | "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
660 | "license": "MIT",
661 | "dependencies": {
662 | "lru-cache": "^7.14.1"
663 | },
664 | "engines": {
665 | "node": ">=12.0.0"
666 | }
667 | },
668 | "node_modules/negotiator": {
669 | "version": "1.0.0",
670 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
671 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
672 | "license": "MIT",
673 | "engines": {
674 | "node": ">= 0.6"
675 | }
676 | },
677 | "node_modules/object-inspect": {
678 | "version": "1.13.4",
679 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
680 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
681 | "license": "MIT",
682 | "engines": {
683 | "node": ">= 0.4"
684 | },
685 | "funding": {
686 | "url": "https://github.com/sponsors/ljharb"
687 | }
688 | },
689 | "node_modules/on-finished": {
690 | "version": "2.4.1",
691 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
692 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
693 | "license": "MIT",
694 | "dependencies": {
695 | "ee-first": "1.1.1"
696 | },
697 | "engines": {
698 | "node": ">= 0.8"
699 | }
700 | },
701 | "node_modules/once": {
702 | "version": "1.4.0",
703 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
704 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
705 | "license": "ISC",
706 | "dependencies": {
707 | "wrappy": "1"
708 | }
709 | },
710 | "node_modules/parseurl": {
711 | "version": "1.3.3",
712 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
713 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
714 | "license": "MIT",
715 | "engines": {
716 | "node": ">= 0.8"
717 | }
718 | },
719 | "node_modules/path-to-regexp": {
720 | "version": "8.2.0",
721 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
722 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
723 | "license": "MIT",
724 | "engines": {
725 | "node": ">=16"
726 | }
727 | },
728 | "node_modules/pg-connection-string": {
729 | "version": "2.9.1",
730 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
731 | "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
732 | "license": "MIT"
733 | },
734 | "node_modules/proxy-addr": {
735 | "version": "2.0.7",
736 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
737 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
738 | "license": "MIT",
739 | "dependencies": {
740 | "forwarded": "0.2.0",
741 | "ipaddr.js": "1.9.1"
742 | },
743 | "engines": {
744 | "node": ">= 0.10"
745 | }
746 | },
747 | "node_modules/qs": {
748 | "version": "6.14.0",
749 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
750 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
751 | "license": "BSD-3-Clause",
752 | "dependencies": {
753 | "side-channel": "^1.1.0"
754 | },
755 | "engines": {
756 | "node": ">=0.6"
757 | },
758 | "funding": {
759 | "url": "https://github.com/sponsors/ljharb"
760 | }
761 | },
762 | "node_modules/range-parser": {
763 | "version": "1.2.1",
764 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
765 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
766 | "license": "MIT",
767 | "engines": {
768 | "node": ">= 0.6"
769 | }
770 | },
771 | "node_modules/raw-body": {
772 | "version": "3.0.0",
773 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
774 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
775 | "license": "MIT",
776 | "dependencies": {
777 | "bytes": "3.1.2",
778 | "http-errors": "2.0.0",
779 | "iconv-lite": "0.6.3",
780 | "unpipe": "1.0.0"
781 | },
782 | "engines": {
783 | "node": ">= 0.8"
784 | }
785 | },
786 | "node_modules/retry-as-promised": {
787 | "version": "7.1.1",
788 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz",
789 | "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==",
790 | "license": "MIT"
791 | },
792 | "node_modules/router": {
793 | "version": "2.2.0",
794 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
795 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
796 | "license": "MIT",
797 | "dependencies": {
798 | "debug": "^4.4.0",
799 | "depd": "^2.0.0",
800 | "is-promise": "^4.0.0",
801 | "parseurl": "^1.3.3",
802 | "path-to-regexp": "^8.0.0"
803 | },
804 | "engines": {
805 | "node": ">= 18"
806 | }
807 | },
808 | "node_modules/safe-buffer": {
809 | "version": "5.2.1",
810 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
811 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
812 | "funding": [
813 | {
814 | "type": "github",
815 | "url": "https://github.com/sponsors/feross"
816 | },
817 | {
818 | "type": "patreon",
819 | "url": "https://www.patreon.com/feross"
820 | },
821 | {
822 | "type": "consulting",
823 | "url": "https://feross.org/support"
824 | }
825 | ],
826 | "license": "MIT"
827 | },
828 | "node_modules/safer-buffer": {
829 | "version": "2.1.2",
830 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
831 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
832 | "license": "MIT"
833 | },
834 | "node_modules/semver": {
835 | "version": "7.7.2",
836 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
837 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
838 | "license": "ISC",
839 | "bin": {
840 | "semver": "bin/semver.js"
841 | },
842 | "engines": {
843 | "node": ">=10"
844 | }
845 | },
846 | "node_modules/send": {
847 | "version": "1.2.0",
848 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
849 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
850 | "license": "MIT",
851 | "dependencies": {
852 | "debug": "^4.3.5",
853 | "encodeurl": "^2.0.0",
854 | "escape-html": "^1.0.3",
855 | "etag": "^1.8.1",
856 | "fresh": "^2.0.0",
857 | "http-errors": "^2.0.0",
858 | "mime-types": "^3.0.1",
859 | "ms": "^2.1.3",
860 | "on-finished": "^2.4.1",
861 | "range-parser": "^1.2.1",
862 | "statuses": "^2.0.1"
863 | },
864 | "engines": {
865 | "node": ">= 18"
866 | }
867 | },
868 | "node_modules/seq-queue": {
869 | "version": "0.0.5",
870 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
871 | "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
872 | },
873 | "node_modules/sequelize": {
874 | "version": "6.37.7",
875 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz",
876 | "integrity": "sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA==",
877 | "funding": [
878 | {
879 | "type": "opencollective",
880 | "url": "https://opencollective.com/sequelize"
881 | }
882 | ],
883 | "license": "MIT",
884 | "dependencies": {
885 | "@types/debug": "^4.1.8",
886 | "@types/validator": "^13.7.17",
887 | "debug": "^4.3.4",
888 | "dottie": "^2.0.6",
889 | "inflection": "^1.13.4",
890 | "lodash": "^4.17.21",
891 | "moment": "^2.29.4",
892 | "moment-timezone": "^0.5.43",
893 | "pg-connection-string": "^2.6.1",
894 | "retry-as-promised": "^7.0.4",
895 | "semver": "^7.5.4",
896 | "sequelize-pool": "^7.1.0",
897 | "toposort-class": "^1.0.1",
898 | "uuid": "^8.3.2",
899 | "validator": "^13.9.0",
900 | "wkx": "^0.5.0"
901 | },
902 | "engines": {
903 | "node": ">=10.0.0"
904 | },
905 | "peerDependenciesMeta": {
906 | "ibm_db": {
907 | "optional": true
908 | },
909 | "mariadb": {
910 | "optional": true
911 | },
912 | "mysql2": {
913 | "optional": true
914 | },
915 | "oracledb": {
916 | "optional": true
917 | },
918 | "pg": {
919 | "optional": true
920 | },
921 | "pg-hstore": {
922 | "optional": true
923 | },
924 | "snowflake-sdk": {
925 | "optional": true
926 | },
927 | "sqlite3": {
928 | "optional": true
929 | },
930 | "tedious": {
931 | "optional": true
932 | }
933 | }
934 | },
935 | "node_modules/sequelize-pool": {
936 | "version": "7.1.0",
937 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
938 | "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
939 | "license": "MIT",
940 | "engines": {
941 | "node": ">= 10.0.0"
942 | }
943 | },
944 | "node_modules/serve-static": {
945 | "version": "2.2.0",
946 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
947 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
948 | "license": "MIT",
949 | "dependencies": {
950 | "encodeurl": "^2.0.0",
951 | "escape-html": "^1.0.3",
952 | "parseurl": "^1.3.3",
953 | "send": "^1.2.0"
954 | },
955 | "engines": {
956 | "node": ">= 18"
957 | }
958 | },
959 | "node_modules/setprototypeof": {
960 | "version": "1.2.0",
961 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
962 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
963 | "license": "ISC"
964 | },
965 | "node_modules/side-channel": {
966 | "version": "1.1.0",
967 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
968 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
969 | "license": "MIT",
970 | "dependencies": {
971 | "es-errors": "^1.3.0",
972 | "object-inspect": "^1.13.3",
973 | "side-channel-list": "^1.0.0",
974 | "side-channel-map": "^1.0.1",
975 | "side-channel-weakmap": "^1.0.2"
976 | },
977 | "engines": {
978 | "node": ">= 0.4"
979 | },
980 | "funding": {
981 | "url": "https://github.com/sponsors/ljharb"
982 | }
983 | },
984 | "node_modules/side-channel-list": {
985 | "version": "1.0.0",
986 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
987 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
988 | "license": "MIT",
989 | "dependencies": {
990 | "es-errors": "^1.3.0",
991 | "object-inspect": "^1.13.3"
992 | },
993 | "engines": {
994 | "node": ">= 0.4"
995 | },
996 | "funding": {
997 | "url": "https://github.com/sponsors/ljharb"
998 | }
999 | },
1000 | "node_modules/side-channel-map": {
1001 | "version": "1.0.1",
1002 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1003 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1004 | "license": "MIT",
1005 | "dependencies": {
1006 | "call-bound": "^1.0.2",
1007 | "es-errors": "^1.3.0",
1008 | "get-intrinsic": "^1.2.5",
1009 | "object-inspect": "^1.13.3"
1010 | },
1011 | "engines": {
1012 | "node": ">= 0.4"
1013 | },
1014 | "funding": {
1015 | "url": "https://github.com/sponsors/ljharb"
1016 | }
1017 | },
1018 | "node_modules/side-channel-weakmap": {
1019 | "version": "1.0.2",
1020 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1021 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1022 | "license": "MIT",
1023 | "dependencies": {
1024 | "call-bound": "^1.0.2",
1025 | "es-errors": "^1.3.0",
1026 | "get-intrinsic": "^1.2.5",
1027 | "object-inspect": "^1.13.3",
1028 | "side-channel-map": "^1.0.1"
1029 | },
1030 | "engines": {
1031 | "node": ">= 0.4"
1032 | },
1033 | "funding": {
1034 | "url": "https://github.com/sponsors/ljharb"
1035 | }
1036 | },
1037 | "node_modules/sqlstring": {
1038 | "version": "2.3.3",
1039 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
1040 | "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
1041 | "license": "MIT",
1042 | "engines": {
1043 | "node": ">= 0.6"
1044 | }
1045 | },
1046 | "node_modules/statuses": {
1047 | "version": "2.0.2",
1048 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1049 | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1050 | "license": "MIT",
1051 | "engines": {
1052 | "node": ">= 0.8"
1053 | }
1054 | },
1055 | "node_modules/toidentifier": {
1056 | "version": "1.0.1",
1057 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1058 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1059 | "license": "MIT",
1060 | "engines": {
1061 | "node": ">=0.6"
1062 | }
1063 | },
1064 | "node_modules/toposort-class": {
1065 | "version": "1.0.1",
1066 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
1067 | "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==",
1068 | "license": "MIT"
1069 | },
1070 | "node_modules/type-is": {
1071 | "version": "2.0.1",
1072 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1073 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1074 | "license": "MIT",
1075 | "dependencies": {
1076 | "content-type": "^1.0.5",
1077 | "media-typer": "^1.1.0",
1078 | "mime-types": "^3.0.0"
1079 | },
1080 | "engines": {
1081 | "node": ">= 0.6"
1082 | }
1083 | },
1084 | "node_modules/undici-types": {
1085 | "version": "7.10.0",
1086 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
1087 | "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
1088 | "license": "MIT"
1089 | },
1090 | "node_modules/unpipe": {
1091 | "version": "1.0.0",
1092 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1093 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1094 | "license": "MIT",
1095 | "engines": {
1096 | "node": ">= 0.8"
1097 | }
1098 | },
1099 | "node_modules/uuid": {
1100 | "version": "8.3.2",
1101 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
1102 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
1103 | "license": "MIT",
1104 | "bin": {
1105 | "uuid": "dist/bin/uuid"
1106 | }
1107 | },
1108 | "node_modules/validator": {
1109 | "version": "13.15.15",
1110 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz",
1111 | "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==",
1112 | "license": "MIT",
1113 | "engines": {
1114 | "node": ">= 0.10"
1115 | }
1116 | },
1117 | "node_modules/vary": {
1118 | "version": "1.1.2",
1119 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1120 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1121 | "license": "MIT",
1122 | "engines": {
1123 | "node": ">= 0.8"
1124 | }
1125 | },
1126 | "node_modules/wkx": {
1127 | "version": "0.5.0",
1128 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
1129 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
1130 | "license": "MIT",
1131 | "dependencies": {
1132 | "@types/node": "*"
1133 | }
1134 | },
1135 | "node_modules/wrappy": {
1136 | "version": "1.0.2",
1137 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1138 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1139 | "license": "ISC"
1140 | }
1141 | }
1142 | }
1143 |
--------------------------------------------------------------------------------
/02_eliminaciones_y_validaciones/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "servidor_diagnostico",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^5.1.0",
13 | "express-validator": "^7.2.1",
14 | "mysql2": "^3.14.3",
15 | "sequelize": "^6.37.7"
16 | }
17 | },
18 | "node_modules/@types/debug": {
19 | "version": "4.1.12",
20 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
21 | "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
22 | "license": "MIT",
23 | "dependencies": {
24 | "@types/ms": "*"
25 | }
26 | },
27 | "node_modules/@types/ms": {
28 | "version": "2.1.0",
29 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
30 | "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
31 | "license": "MIT"
32 | },
33 | "node_modules/@types/node": {
34 | "version": "24.2.0",
35 | "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz",
36 | "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
37 | "license": "MIT",
38 | "dependencies": {
39 | "undici-types": "~7.10.0"
40 | }
41 | },
42 | "node_modules/@types/validator": {
43 | "version": "13.15.2",
44 | "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.2.tgz",
45 | "integrity": "sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==",
46 | "license": "MIT"
47 | },
48 | "node_modules/accepts": {
49 | "version": "2.0.0",
50 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
51 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
52 | "license": "MIT",
53 | "dependencies": {
54 | "mime-types": "^3.0.0",
55 | "negotiator": "^1.0.0"
56 | },
57 | "engines": {
58 | "node": ">= 0.6"
59 | }
60 | },
61 | "node_modules/aws-ssl-profiles": {
62 | "version": "1.1.2",
63 | "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
64 | "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
65 | "license": "MIT",
66 | "engines": {
67 | "node": ">= 6.0.0"
68 | }
69 | },
70 | "node_modules/body-parser": {
71 | "version": "2.2.0",
72 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
73 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
74 | "license": "MIT",
75 | "dependencies": {
76 | "bytes": "^3.1.2",
77 | "content-type": "^1.0.5",
78 | "debug": "^4.4.0",
79 | "http-errors": "^2.0.0",
80 | "iconv-lite": "^0.6.3",
81 | "on-finished": "^2.4.1",
82 | "qs": "^6.14.0",
83 | "raw-body": "^3.0.0",
84 | "type-is": "^2.0.0"
85 | },
86 | "engines": {
87 | "node": ">=18"
88 | }
89 | },
90 | "node_modules/bytes": {
91 | "version": "3.1.2",
92 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
93 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
94 | "license": "MIT",
95 | "engines": {
96 | "node": ">= 0.8"
97 | }
98 | },
99 | "node_modules/call-bind-apply-helpers": {
100 | "version": "1.0.2",
101 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
102 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
103 | "license": "MIT",
104 | "dependencies": {
105 | "es-errors": "^1.3.0",
106 | "function-bind": "^1.1.2"
107 | },
108 | "engines": {
109 | "node": ">= 0.4"
110 | }
111 | },
112 | "node_modules/call-bound": {
113 | "version": "1.0.4",
114 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
115 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
116 | "license": "MIT",
117 | "dependencies": {
118 | "call-bind-apply-helpers": "^1.0.2",
119 | "get-intrinsic": "^1.3.0"
120 | },
121 | "engines": {
122 | "node": ">= 0.4"
123 | },
124 | "funding": {
125 | "url": "https://github.com/sponsors/ljharb"
126 | }
127 | },
128 | "node_modules/content-disposition": {
129 | "version": "1.0.0",
130 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
131 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
132 | "license": "MIT",
133 | "dependencies": {
134 | "safe-buffer": "5.2.1"
135 | },
136 | "engines": {
137 | "node": ">= 0.6"
138 | }
139 | },
140 | "node_modules/content-type": {
141 | "version": "1.0.5",
142 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
143 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
144 | "license": "MIT",
145 | "engines": {
146 | "node": ">= 0.6"
147 | }
148 | },
149 | "node_modules/cookie": {
150 | "version": "0.7.2",
151 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
152 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
153 | "license": "MIT",
154 | "engines": {
155 | "node": ">= 0.6"
156 | }
157 | },
158 | "node_modules/cookie-signature": {
159 | "version": "1.2.2",
160 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
161 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
162 | "license": "MIT",
163 | "engines": {
164 | "node": ">=6.6.0"
165 | }
166 | },
167 | "node_modules/debug": {
168 | "version": "4.4.1",
169 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
170 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
171 | "license": "MIT",
172 | "dependencies": {
173 | "ms": "^2.1.3"
174 | },
175 | "engines": {
176 | "node": ">=6.0"
177 | },
178 | "peerDependenciesMeta": {
179 | "supports-color": {
180 | "optional": true
181 | }
182 | }
183 | },
184 | "node_modules/denque": {
185 | "version": "2.1.0",
186 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
187 | "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
188 | "license": "Apache-2.0",
189 | "engines": {
190 | "node": ">=0.10"
191 | }
192 | },
193 | "node_modules/depd": {
194 | "version": "2.0.0",
195 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
196 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
197 | "license": "MIT",
198 | "engines": {
199 | "node": ">= 0.8"
200 | }
201 | },
202 | "node_modules/dottie": {
203 | "version": "2.0.6",
204 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
205 | "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==",
206 | "license": "MIT"
207 | },
208 | "node_modules/dunder-proto": {
209 | "version": "1.0.1",
210 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
211 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
212 | "license": "MIT",
213 | "dependencies": {
214 | "call-bind-apply-helpers": "^1.0.1",
215 | "es-errors": "^1.3.0",
216 | "gopd": "^1.2.0"
217 | },
218 | "engines": {
219 | "node": ">= 0.4"
220 | }
221 | },
222 | "node_modules/ee-first": {
223 | "version": "1.1.1",
224 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
225 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
226 | "license": "MIT"
227 | },
228 | "node_modules/encodeurl": {
229 | "version": "2.0.0",
230 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
231 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
232 | "license": "MIT",
233 | "engines": {
234 | "node": ">= 0.8"
235 | }
236 | },
237 | "node_modules/es-define-property": {
238 | "version": "1.0.1",
239 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
240 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
241 | "license": "MIT",
242 | "engines": {
243 | "node": ">= 0.4"
244 | }
245 | },
246 | "node_modules/es-errors": {
247 | "version": "1.3.0",
248 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
249 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
250 | "license": "MIT",
251 | "engines": {
252 | "node": ">= 0.4"
253 | }
254 | },
255 | "node_modules/es-object-atoms": {
256 | "version": "1.1.1",
257 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
258 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
259 | "license": "MIT",
260 | "dependencies": {
261 | "es-errors": "^1.3.0"
262 | },
263 | "engines": {
264 | "node": ">= 0.4"
265 | }
266 | },
267 | "node_modules/escape-html": {
268 | "version": "1.0.3",
269 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
270 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
271 | "license": "MIT"
272 | },
273 | "node_modules/etag": {
274 | "version": "1.8.1",
275 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
276 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
277 | "license": "MIT",
278 | "engines": {
279 | "node": ">= 0.6"
280 | }
281 | },
282 | "node_modules/express": {
283 | "version": "5.1.0",
284 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
285 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
286 | "license": "MIT",
287 | "dependencies": {
288 | "accepts": "^2.0.0",
289 | "body-parser": "^2.2.0",
290 | "content-disposition": "^1.0.0",
291 | "content-type": "^1.0.5",
292 | "cookie": "^0.7.1",
293 | "cookie-signature": "^1.2.1",
294 | "debug": "^4.4.0",
295 | "encodeurl": "^2.0.0",
296 | "escape-html": "^1.0.3",
297 | "etag": "^1.8.1",
298 | "finalhandler": "^2.1.0",
299 | "fresh": "^2.0.0",
300 | "http-errors": "^2.0.0",
301 | "merge-descriptors": "^2.0.0",
302 | "mime-types": "^3.0.0",
303 | "on-finished": "^2.4.1",
304 | "once": "^1.4.0",
305 | "parseurl": "^1.3.3",
306 | "proxy-addr": "^2.0.7",
307 | "qs": "^6.14.0",
308 | "range-parser": "^1.2.1",
309 | "router": "^2.2.0",
310 | "send": "^1.1.0",
311 | "serve-static": "^2.2.0",
312 | "statuses": "^2.0.1",
313 | "type-is": "^2.0.1",
314 | "vary": "^1.1.2"
315 | },
316 | "engines": {
317 | "node": ">= 18"
318 | },
319 | "funding": {
320 | "type": "opencollective",
321 | "url": "https://opencollective.com/express"
322 | }
323 | },
324 | "node_modules/express-validator": {
325 | "version": "7.2.1",
326 | "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.1.tgz",
327 | "integrity": "sha512-CjNE6aakfpuwGaHQZ3m8ltCG2Qvivd7RHtVMS/6nVxOM7xVGqr4bhflsm4+N5FP5zI7Zxp+Hae+9RE+o8e3ZOQ==",
328 | "license": "MIT",
329 | "dependencies": {
330 | "lodash": "^4.17.21",
331 | "validator": "~13.12.0"
332 | },
333 | "engines": {
334 | "node": ">= 8.0.0"
335 | }
336 | },
337 | "node_modules/express-validator/node_modules/validator": {
338 | "version": "13.12.0",
339 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
340 | "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
341 | "license": "MIT",
342 | "engines": {
343 | "node": ">= 0.10"
344 | }
345 | },
346 | "node_modules/finalhandler": {
347 | "version": "2.1.0",
348 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
349 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
350 | "license": "MIT",
351 | "dependencies": {
352 | "debug": "^4.4.0",
353 | "encodeurl": "^2.0.0",
354 | "escape-html": "^1.0.3",
355 | "on-finished": "^2.4.1",
356 | "parseurl": "^1.3.3",
357 | "statuses": "^2.0.1"
358 | },
359 | "engines": {
360 | "node": ">= 0.8"
361 | }
362 | },
363 | "node_modules/forwarded": {
364 | "version": "0.2.0",
365 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
366 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
367 | "license": "MIT",
368 | "engines": {
369 | "node": ">= 0.6"
370 | }
371 | },
372 | "node_modules/fresh": {
373 | "version": "2.0.0",
374 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
375 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
376 | "license": "MIT",
377 | "engines": {
378 | "node": ">= 0.8"
379 | }
380 | },
381 | "node_modules/function-bind": {
382 | "version": "1.1.2",
383 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
384 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
385 | "license": "MIT",
386 | "funding": {
387 | "url": "https://github.com/sponsors/ljharb"
388 | }
389 | },
390 | "node_modules/generate-function": {
391 | "version": "2.3.1",
392 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
393 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
394 | "license": "MIT",
395 | "dependencies": {
396 | "is-property": "^1.0.2"
397 | }
398 | },
399 | "node_modules/get-intrinsic": {
400 | "version": "1.3.0",
401 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
402 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
403 | "license": "MIT",
404 | "dependencies": {
405 | "call-bind-apply-helpers": "^1.0.2",
406 | "es-define-property": "^1.0.1",
407 | "es-errors": "^1.3.0",
408 | "es-object-atoms": "^1.1.1",
409 | "function-bind": "^1.1.2",
410 | "get-proto": "^1.0.1",
411 | "gopd": "^1.2.0",
412 | "has-symbols": "^1.1.0",
413 | "hasown": "^2.0.2",
414 | "math-intrinsics": "^1.1.0"
415 | },
416 | "engines": {
417 | "node": ">= 0.4"
418 | },
419 | "funding": {
420 | "url": "https://github.com/sponsors/ljharb"
421 | }
422 | },
423 | "node_modules/get-proto": {
424 | "version": "1.0.1",
425 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
426 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
427 | "license": "MIT",
428 | "dependencies": {
429 | "dunder-proto": "^1.0.1",
430 | "es-object-atoms": "^1.0.0"
431 | },
432 | "engines": {
433 | "node": ">= 0.4"
434 | }
435 | },
436 | "node_modules/gopd": {
437 | "version": "1.2.0",
438 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
439 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
440 | "license": "MIT",
441 | "engines": {
442 | "node": ">= 0.4"
443 | },
444 | "funding": {
445 | "url": "https://github.com/sponsors/ljharb"
446 | }
447 | },
448 | "node_modules/has-symbols": {
449 | "version": "1.1.0",
450 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
451 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
452 | "license": "MIT",
453 | "engines": {
454 | "node": ">= 0.4"
455 | },
456 | "funding": {
457 | "url": "https://github.com/sponsors/ljharb"
458 | }
459 | },
460 | "node_modules/hasown": {
461 | "version": "2.0.2",
462 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
463 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
464 | "license": "MIT",
465 | "dependencies": {
466 | "function-bind": "^1.1.2"
467 | },
468 | "engines": {
469 | "node": ">= 0.4"
470 | }
471 | },
472 | "node_modules/http-errors": {
473 | "version": "2.0.0",
474 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
475 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
476 | "license": "MIT",
477 | "dependencies": {
478 | "depd": "2.0.0",
479 | "inherits": "2.0.4",
480 | "setprototypeof": "1.2.0",
481 | "statuses": "2.0.1",
482 | "toidentifier": "1.0.1"
483 | },
484 | "engines": {
485 | "node": ">= 0.8"
486 | }
487 | },
488 | "node_modules/http-errors/node_modules/statuses": {
489 | "version": "2.0.1",
490 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
491 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
492 | "license": "MIT",
493 | "engines": {
494 | "node": ">= 0.8"
495 | }
496 | },
497 | "node_modules/iconv-lite": {
498 | "version": "0.6.3",
499 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
500 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
501 | "license": "MIT",
502 | "dependencies": {
503 | "safer-buffer": ">= 2.1.2 < 3.0.0"
504 | },
505 | "engines": {
506 | "node": ">=0.10.0"
507 | }
508 | },
509 | "node_modules/inflection": {
510 | "version": "1.13.4",
511 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
512 | "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
513 | "engines": [
514 | "node >= 0.4.0"
515 | ],
516 | "license": "MIT"
517 | },
518 | "node_modules/inherits": {
519 | "version": "2.0.4",
520 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
521 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
522 | "license": "ISC"
523 | },
524 | "node_modules/ipaddr.js": {
525 | "version": "1.9.1",
526 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
527 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
528 | "license": "MIT",
529 | "engines": {
530 | "node": ">= 0.10"
531 | }
532 | },
533 | "node_modules/is-promise": {
534 | "version": "4.0.0",
535 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
536 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
537 | "license": "MIT"
538 | },
539 | "node_modules/is-property": {
540 | "version": "1.0.2",
541 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
542 | "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
543 | "license": "MIT"
544 | },
545 | "node_modules/lodash": {
546 | "version": "4.17.21",
547 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
548 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
549 | "license": "MIT"
550 | },
551 | "node_modules/long": {
552 | "version": "5.3.2",
553 | "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
554 | "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
555 | "license": "Apache-2.0"
556 | },
557 | "node_modules/lru-cache": {
558 | "version": "7.18.3",
559 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
560 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
561 | "license": "ISC",
562 | "engines": {
563 | "node": ">=12"
564 | }
565 | },
566 | "node_modules/lru.min": {
567 | "version": "1.1.2",
568 | "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
569 | "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
570 | "license": "MIT",
571 | "engines": {
572 | "bun": ">=1.0.0",
573 | "deno": ">=1.30.0",
574 | "node": ">=8.0.0"
575 | },
576 | "funding": {
577 | "type": "github",
578 | "url": "https://github.com/sponsors/wellwelwel"
579 | }
580 | },
581 | "node_modules/math-intrinsics": {
582 | "version": "1.1.0",
583 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
584 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
585 | "license": "MIT",
586 | "engines": {
587 | "node": ">= 0.4"
588 | }
589 | },
590 | "node_modules/media-typer": {
591 | "version": "1.1.0",
592 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
593 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
594 | "license": "MIT",
595 | "engines": {
596 | "node": ">= 0.8"
597 | }
598 | },
599 | "node_modules/merge-descriptors": {
600 | "version": "2.0.0",
601 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
602 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
603 | "license": "MIT",
604 | "engines": {
605 | "node": ">=18"
606 | },
607 | "funding": {
608 | "url": "https://github.com/sponsors/sindresorhus"
609 | }
610 | },
611 | "node_modules/mime-db": {
612 | "version": "1.54.0",
613 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
614 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
615 | "license": "MIT",
616 | "engines": {
617 | "node": ">= 0.6"
618 | }
619 | },
620 | "node_modules/mime-types": {
621 | "version": "3.0.1",
622 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
623 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
624 | "license": "MIT",
625 | "dependencies": {
626 | "mime-db": "^1.54.0"
627 | },
628 | "engines": {
629 | "node": ">= 0.6"
630 | }
631 | },
632 | "node_modules/moment": {
633 | "version": "2.30.1",
634 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
635 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
636 | "license": "MIT",
637 | "engines": {
638 | "node": "*"
639 | }
640 | },
641 | "node_modules/moment-timezone": {
642 | "version": "0.5.48",
643 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
644 | "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
645 | "license": "MIT",
646 | "dependencies": {
647 | "moment": "^2.29.4"
648 | },
649 | "engines": {
650 | "node": "*"
651 | }
652 | },
653 | "node_modules/ms": {
654 | "version": "2.1.3",
655 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
656 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
657 | "license": "MIT"
658 | },
659 | "node_modules/mysql2": {
660 | "version": "3.14.3",
661 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.3.tgz",
662 | "integrity": "sha512-fD6MLV8XJ1KiNFIF0bS7Msl8eZyhlTDCDl75ajU5SJtpdx9ZPEACulJcqJWr1Y8OYyxsFc4j3+nflpmhxCU5aQ==",
663 | "license": "MIT",
664 | "dependencies": {
665 | "aws-ssl-profiles": "^1.1.1",
666 | "denque": "^2.1.0",
667 | "generate-function": "^2.3.1",
668 | "iconv-lite": "^0.6.3",
669 | "long": "^5.2.1",
670 | "lru.min": "^1.0.0",
671 | "named-placeholders": "^1.1.3",
672 | "seq-queue": "^0.0.5",
673 | "sqlstring": "^2.3.2"
674 | },
675 | "engines": {
676 | "node": ">= 8.0"
677 | }
678 | },
679 | "node_modules/named-placeholders": {
680 | "version": "1.1.3",
681 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
682 | "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
683 | "license": "MIT",
684 | "dependencies": {
685 | "lru-cache": "^7.14.1"
686 | },
687 | "engines": {
688 | "node": ">=12.0.0"
689 | }
690 | },
691 | "node_modules/negotiator": {
692 | "version": "1.0.0",
693 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
694 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
695 | "license": "MIT",
696 | "engines": {
697 | "node": ">= 0.6"
698 | }
699 | },
700 | "node_modules/object-inspect": {
701 | "version": "1.13.4",
702 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
703 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
704 | "license": "MIT",
705 | "engines": {
706 | "node": ">= 0.4"
707 | },
708 | "funding": {
709 | "url": "https://github.com/sponsors/ljharb"
710 | }
711 | },
712 | "node_modules/on-finished": {
713 | "version": "2.4.1",
714 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
715 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
716 | "license": "MIT",
717 | "dependencies": {
718 | "ee-first": "1.1.1"
719 | },
720 | "engines": {
721 | "node": ">= 0.8"
722 | }
723 | },
724 | "node_modules/once": {
725 | "version": "1.4.0",
726 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
727 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
728 | "license": "ISC",
729 | "dependencies": {
730 | "wrappy": "1"
731 | }
732 | },
733 | "node_modules/parseurl": {
734 | "version": "1.3.3",
735 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
736 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
737 | "license": "MIT",
738 | "engines": {
739 | "node": ">= 0.8"
740 | }
741 | },
742 | "node_modules/path-to-regexp": {
743 | "version": "8.2.0",
744 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
745 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
746 | "license": "MIT",
747 | "engines": {
748 | "node": ">=16"
749 | }
750 | },
751 | "node_modules/pg-connection-string": {
752 | "version": "2.9.1",
753 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
754 | "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
755 | "license": "MIT"
756 | },
757 | "node_modules/proxy-addr": {
758 | "version": "2.0.7",
759 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
760 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
761 | "license": "MIT",
762 | "dependencies": {
763 | "forwarded": "0.2.0",
764 | "ipaddr.js": "1.9.1"
765 | },
766 | "engines": {
767 | "node": ">= 0.10"
768 | }
769 | },
770 | "node_modules/qs": {
771 | "version": "6.14.0",
772 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
773 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
774 | "license": "BSD-3-Clause",
775 | "dependencies": {
776 | "side-channel": "^1.1.0"
777 | },
778 | "engines": {
779 | "node": ">=0.6"
780 | },
781 | "funding": {
782 | "url": "https://github.com/sponsors/ljharb"
783 | }
784 | },
785 | "node_modules/range-parser": {
786 | "version": "1.2.1",
787 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
788 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
789 | "license": "MIT",
790 | "engines": {
791 | "node": ">= 0.6"
792 | }
793 | },
794 | "node_modules/raw-body": {
795 | "version": "3.0.0",
796 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
797 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
798 | "license": "MIT",
799 | "dependencies": {
800 | "bytes": "3.1.2",
801 | "http-errors": "2.0.0",
802 | "iconv-lite": "0.6.3",
803 | "unpipe": "1.0.0"
804 | },
805 | "engines": {
806 | "node": ">= 0.8"
807 | }
808 | },
809 | "node_modules/retry-as-promised": {
810 | "version": "7.1.1",
811 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz",
812 | "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==",
813 | "license": "MIT"
814 | },
815 | "node_modules/router": {
816 | "version": "2.2.0",
817 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
818 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
819 | "license": "MIT",
820 | "dependencies": {
821 | "debug": "^4.4.0",
822 | "depd": "^2.0.0",
823 | "is-promise": "^4.0.0",
824 | "parseurl": "^1.3.3",
825 | "path-to-regexp": "^8.0.0"
826 | },
827 | "engines": {
828 | "node": ">= 18"
829 | }
830 | },
831 | "node_modules/safe-buffer": {
832 | "version": "5.2.1",
833 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
834 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
835 | "funding": [
836 | {
837 | "type": "github",
838 | "url": "https://github.com/sponsors/feross"
839 | },
840 | {
841 | "type": "patreon",
842 | "url": "https://www.patreon.com/feross"
843 | },
844 | {
845 | "type": "consulting",
846 | "url": "https://feross.org/support"
847 | }
848 | ],
849 | "license": "MIT"
850 | },
851 | "node_modules/safer-buffer": {
852 | "version": "2.1.2",
853 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
854 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
855 | "license": "MIT"
856 | },
857 | "node_modules/semver": {
858 | "version": "7.7.2",
859 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
860 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
861 | "license": "ISC",
862 | "bin": {
863 | "semver": "bin/semver.js"
864 | },
865 | "engines": {
866 | "node": ">=10"
867 | }
868 | },
869 | "node_modules/send": {
870 | "version": "1.2.0",
871 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
872 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
873 | "license": "MIT",
874 | "dependencies": {
875 | "debug": "^4.3.5",
876 | "encodeurl": "^2.0.0",
877 | "escape-html": "^1.0.3",
878 | "etag": "^1.8.1",
879 | "fresh": "^2.0.0",
880 | "http-errors": "^2.0.0",
881 | "mime-types": "^3.0.1",
882 | "ms": "^2.1.3",
883 | "on-finished": "^2.4.1",
884 | "range-parser": "^1.2.1",
885 | "statuses": "^2.0.1"
886 | },
887 | "engines": {
888 | "node": ">= 18"
889 | }
890 | },
891 | "node_modules/seq-queue": {
892 | "version": "0.0.5",
893 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
894 | "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
895 | },
896 | "node_modules/sequelize": {
897 | "version": "6.37.7",
898 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz",
899 | "integrity": "sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA==",
900 | "funding": [
901 | {
902 | "type": "opencollective",
903 | "url": "https://opencollective.com/sequelize"
904 | }
905 | ],
906 | "license": "MIT",
907 | "dependencies": {
908 | "@types/debug": "^4.1.8",
909 | "@types/validator": "^13.7.17",
910 | "debug": "^4.3.4",
911 | "dottie": "^2.0.6",
912 | "inflection": "^1.13.4",
913 | "lodash": "^4.17.21",
914 | "moment": "^2.29.4",
915 | "moment-timezone": "^0.5.43",
916 | "pg-connection-string": "^2.6.1",
917 | "retry-as-promised": "^7.0.4",
918 | "semver": "^7.5.4",
919 | "sequelize-pool": "^7.1.0",
920 | "toposort-class": "^1.0.1",
921 | "uuid": "^8.3.2",
922 | "validator": "^13.9.0",
923 | "wkx": "^0.5.0"
924 | },
925 | "engines": {
926 | "node": ">=10.0.0"
927 | },
928 | "peerDependenciesMeta": {
929 | "ibm_db": {
930 | "optional": true
931 | },
932 | "mariadb": {
933 | "optional": true
934 | },
935 | "mysql2": {
936 | "optional": true
937 | },
938 | "oracledb": {
939 | "optional": true
940 | },
941 | "pg": {
942 | "optional": true
943 | },
944 | "pg-hstore": {
945 | "optional": true
946 | },
947 | "snowflake-sdk": {
948 | "optional": true
949 | },
950 | "sqlite3": {
951 | "optional": true
952 | },
953 | "tedious": {
954 | "optional": true
955 | }
956 | }
957 | },
958 | "node_modules/sequelize-pool": {
959 | "version": "7.1.0",
960 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
961 | "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
962 | "license": "MIT",
963 | "engines": {
964 | "node": ">= 10.0.0"
965 | }
966 | },
967 | "node_modules/serve-static": {
968 | "version": "2.2.0",
969 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
970 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
971 | "license": "MIT",
972 | "dependencies": {
973 | "encodeurl": "^2.0.0",
974 | "escape-html": "^1.0.3",
975 | "parseurl": "^1.3.3",
976 | "send": "^1.2.0"
977 | },
978 | "engines": {
979 | "node": ">= 18"
980 | }
981 | },
982 | "node_modules/setprototypeof": {
983 | "version": "1.2.0",
984 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
985 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
986 | "license": "ISC"
987 | },
988 | "node_modules/side-channel": {
989 | "version": "1.1.0",
990 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
991 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
992 | "license": "MIT",
993 | "dependencies": {
994 | "es-errors": "^1.3.0",
995 | "object-inspect": "^1.13.3",
996 | "side-channel-list": "^1.0.0",
997 | "side-channel-map": "^1.0.1",
998 | "side-channel-weakmap": "^1.0.2"
999 | },
1000 | "engines": {
1001 | "node": ">= 0.4"
1002 | },
1003 | "funding": {
1004 | "url": "https://github.com/sponsors/ljharb"
1005 | }
1006 | },
1007 | "node_modules/side-channel-list": {
1008 | "version": "1.0.0",
1009 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1010 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1011 | "license": "MIT",
1012 | "dependencies": {
1013 | "es-errors": "^1.3.0",
1014 | "object-inspect": "^1.13.3"
1015 | },
1016 | "engines": {
1017 | "node": ">= 0.4"
1018 | },
1019 | "funding": {
1020 | "url": "https://github.com/sponsors/ljharb"
1021 | }
1022 | },
1023 | "node_modules/side-channel-map": {
1024 | "version": "1.0.1",
1025 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1026 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1027 | "license": "MIT",
1028 | "dependencies": {
1029 | "call-bound": "^1.0.2",
1030 | "es-errors": "^1.3.0",
1031 | "get-intrinsic": "^1.2.5",
1032 | "object-inspect": "^1.13.3"
1033 | },
1034 | "engines": {
1035 | "node": ">= 0.4"
1036 | },
1037 | "funding": {
1038 | "url": "https://github.com/sponsors/ljharb"
1039 | }
1040 | },
1041 | "node_modules/side-channel-weakmap": {
1042 | "version": "1.0.2",
1043 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1044 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1045 | "license": "MIT",
1046 | "dependencies": {
1047 | "call-bound": "^1.0.2",
1048 | "es-errors": "^1.3.0",
1049 | "get-intrinsic": "^1.2.5",
1050 | "object-inspect": "^1.13.3",
1051 | "side-channel-map": "^1.0.1"
1052 | },
1053 | "engines": {
1054 | "node": ">= 0.4"
1055 | },
1056 | "funding": {
1057 | "url": "https://github.com/sponsors/ljharb"
1058 | }
1059 | },
1060 | "node_modules/sqlstring": {
1061 | "version": "2.3.3",
1062 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
1063 | "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
1064 | "license": "MIT",
1065 | "engines": {
1066 | "node": ">= 0.6"
1067 | }
1068 | },
1069 | "node_modules/statuses": {
1070 | "version": "2.0.2",
1071 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1072 | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1073 | "license": "MIT",
1074 | "engines": {
1075 | "node": ">= 0.8"
1076 | }
1077 | },
1078 | "node_modules/toidentifier": {
1079 | "version": "1.0.1",
1080 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1081 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1082 | "license": "MIT",
1083 | "engines": {
1084 | "node": ">=0.6"
1085 | }
1086 | },
1087 | "node_modules/toposort-class": {
1088 | "version": "1.0.1",
1089 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
1090 | "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==",
1091 | "license": "MIT"
1092 | },
1093 | "node_modules/type-is": {
1094 | "version": "2.0.1",
1095 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1096 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1097 | "license": "MIT",
1098 | "dependencies": {
1099 | "content-type": "^1.0.5",
1100 | "media-typer": "^1.1.0",
1101 | "mime-types": "^3.0.0"
1102 | },
1103 | "engines": {
1104 | "node": ">= 0.6"
1105 | }
1106 | },
1107 | "node_modules/undici-types": {
1108 | "version": "7.10.0",
1109 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
1110 | "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
1111 | "license": "MIT"
1112 | },
1113 | "node_modules/unpipe": {
1114 | "version": "1.0.0",
1115 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1116 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1117 | "license": "MIT",
1118 | "engines": {
1119 | "node": ">= 0.8"
1120 | }
1121 | },
1122 | "node_modules/uuid": {
1123 | "version": "8.3.2",
1124 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
1125 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
1126 | "license": "MIT",
1127 | "bin": {
1128 | "uuid": "dist/bin/uuid"
1129 | }
1130 | },
1131 | "node_modules/validator": {
1132 | "version": "13.15.15",
1133 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz",
1134 | "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==",
1135 | "license": "MIT",
1136 | "engines": {
1137 | "node": ">= 0.10"
1138 | }
1139 | },
1140 | "node_modules/vary": {
1141 | "version": "1.1.2",
1142 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1143 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1144 | "license": "MIT",
1145 | "engines": {
1146 | "node": ">= 0.8"
1147 | }
1148 | },
1149 | "node_modules/wkx": {
1150 | "version": "0.5.0",
1151 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
1152 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
1153 | "license": "MIT",
1154 | "dependencies": {
1155 | "@types/node": "*"
1156 | }
1157 | },
1158 | "node_modules/wrappy": {
1159 | "version": "1.0.2",
1160 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1161 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1162 | "license": "ISC"
1163 | }
1164 | }
1165 | }
1166 |
--------------------------------------------------------------------------------
/03_autenticacion_y_autorizacion/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "servidor_diagnostico",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "servidor_diagnostico",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^5.1.0",
13 | "express-validator": "^7.2.1",
14 | "jsonwebtoken": "^9.0.2",
15 | "mysql2": "^3.14.3",
16 | "sequelize": "^6.37.7"
17 | }
18 | },
19 | "node_modules/@types/debug": {
20 | "version": "4.1.12",
21 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
22 | "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
23 | "license": "MIT",
24 | "dependencies": {
25 | "@types/ms": "*"
26 | }
27 | },
28 | "node_modules/@types/ms": {
29 | "version": "2.1.0",
30 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
31 | "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
32 | "license": "MIT"
33 | },
34 | "node_modules/@types/node": {
35 | "version": "24.2.0",
36 | "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz",
37 | "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
38 | "license": "MIT",
39 | "dependencies": {
40 | "undici-types": "~7.10.0"
41 | }
42 | },
43 | "node_modules/@types/validator": {
44 | "version": "13.15.2",
45 | "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.2.tgz",
46 | "integrity": "sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==",
47 | "license": "MIT"
48 | },
49 | "node_modules/accepts": {
50 | "version": "2.0.0",
51 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
52 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
53 | "license": "MIT",
54 | "dependencies": {
55 | "mime-types": "^3.0.0",
56 | "negotiator": "^1.0.0"
57 | },
58 | "engines": {
59 | "node": ">= 0.6"
60 | }
61 | },
62 | "node_modules/aws-ssl-profiles": {
63 | "version": "1.1.2",
64 | "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
65 | "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
66 | "license": "MIT",
67 | "engines": {
68 | "node": ">= 6.0.0"
69 | }
70 | },
71 | "node_modules/body-parser": {
72 | "version": "2.2.0",
73 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
74 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
75 | "license": "MIT",
76 | "dependencies": {
77 | "bytes": "^3.1.2",
78 | "content-type": "^1.0.5",
79 | "debug": "^4.4.0",
80 | "http-errors": "^2.0.0",
81 | "iconv-lite": "^0.6.3",
82 | "on-finished": "^2.4.1",
83 | "qs": "^6.14.0",
84 | "raw-body": "^3.0.0",
85 | "type-is": "^2.0.0"
86 | },
87 | "engines": {
88 | "node": ">=18"
89 | }
90 | },
91 | "node_modules/buffer-equal-constant-time": {
92 | "version": "1.0.1",
93 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
94 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
95 | "license": "BSD-3-Clause"
96 | },
97 | "node_modules/bytes": {
98 | "version": "3.1.2",
99 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
100 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
101 | "license": "MIT",
102 | "engines": {
103 | "node": ">= 0.8"
104 | }
105 | },
106 | "node_modules/call-bind-apply-helpers": {
107 | "version": "1.0.2",
108 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
109 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
110 | "license": "MIT",
111 | "dependencies": {
112 | "es-errors": "^1.3.0",
113 | "function-bind": "^1.1.2"
114 | },
115 | "engines": {
116 | "node": ">= 0.4"
117 | }
118 | },
119 | "node_modules/call-bound": {
120 | "version": "1.0.4",
121 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
122 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
123 | "license": "MIT",
124 | "dependencies": {
125 | "call-bind-apply-helpers": "^1.0.2",
126 | "get-intrinsic": "^1.3.0"
127 | },
128 | "engines": {
129 | "node": ">= 0.4"
130 | },
131 | "funding": {
132 | "url": "https://github.com/sponsors/ljharb"
133 | }
134 | },
135 | "node_modules/content-disposition": {
136 | "version": "1.0.0",
137 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
138 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
139 | "license": "MIT",
140 | "dependencies": {
141 | "safe-buffer": "5.2.1"
142 | },
143 | "engines": {
144 | "node": ">= 0.6"
145 | }
146 | },
147 | "node_modules/content-type": {
148 | "version": "1.0.5",
149 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
150 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
151 | "license": "MIT",
152 | "engines": {
153 | "node": ">= 0.6"
154 | }
155 | },
156 | "node_modules/cookie": {
157 | "version": "0.7.2",
158 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
159 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
160 | "license": "MIT",
161 | "engines": {
162 | "node": ">= 0.6"
163 | }
164 | },
165 | "node_modules/cookie-signature": {
166 | "version": "1.2.2",
167 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
168 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
169 | "license": "MIT",
170 | "engines": {
171 | "node": ">=6.6.0"
172 | }
173 | },
174 | "node_modules/debug": {
175 | "version": "4.4.1",
176 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
177 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
178 | "license": "MIT",
179 | "dependencies": {
180 | "ms": "^2.1.3"
181 | },
182 | "engines": {
183 | "node": ">=6.0"
184 | },
185 | "peerDependenciesMeta": {
186 | "supports-color": {
187 | "optional": true
188 | }
189 | }
190 | },
191 | "node_modules/denque": {
192 | "version": "2.1.0",
193 | "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
194 | "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
195 | "license": "Apache-2.0",
196 | "engines": {
197 | "node": ">=0.10"
198 | }
199 | },
200 | "node_modules/depd": {
201 | "version": "2.0.0",
202 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
203 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
204 | "license": "MIT",
205 | "engines": {
206 | "node": ">= 0.8"
207 | }
208 | },
209 | "node_modules/dottie": {
210 | "version": "2.0.6",
211 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
212 | "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==",
213 | "license": "MIT"
214 | },
215 | "node_modules/dunder-proto": {
216 | "version": "1.0.1",
217 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
218 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
219 | "license": "MIT",
220 | "dependencies": {
221 | "call-bind-apply-helpers": "^1.0.1",
222 | "es-errors": "^1.3.0",
223 | "gopd": "^1.2.0"
224 | },
225 | "engines": {
226 | "node": ">= 0.4"
227 | }
228 | },
229 | "node_modules/ecdsa-sig-formatter": {
230 | "version": "1.0.11",
231 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
232 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
233 | "license": "Apache-2.0",
234 | "dependencies": {
235 | "safe-buffer": "^5.0.1"
236 | }
237 | },
238 | "node_modules/ee-first": {
239 | "version": "1.1.1",
240 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
241 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
242 | "license": "MIT"
243 | },
244 | "node_modules/encodeurl": {
245 | "version": "2.0.0",
246 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
247 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
248 | "license": "MIT",
249 | "engines": {
250 | "node": ">= 0.8"
251 | }
252 | },
253 | "node_modules/es-define-property": {
254 | "version": "1.0.1",
255 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
256 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
257 | "license": "MIT",
258 | "engines": {
259 | "node": ">= 0.4"
260 | }
261 | },
262 | "node_modules/es-errors": {
263 | "version": "1.3.0",
264 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
265 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
266 | "license": "MIT",
267 | "engines": {
268 | "node": ">= 0.4"
269 | }
270 | },
271 | "node_modules/es-object-atoms": {
272 | "version": "1.1.1",
273 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
274 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
275 | "license": "MIT",
276 | "dependencies": {
277 | "es-errors": "^1.3.0"
278 | },
279 | "engines": {
280 | "node": ">= 0.4"
281 | }
282 | },
283 | "node_modules/escape-html": {
284 | "version": "1.0.3",
285 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
286 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
287 | "license": "MIT"
288 | },
289 | "node_modules/etag": {
290 | "version": "1.8.1",
291 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
292 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
293 | "license": "MIT",
294 | "engines": {
295 | "node": ">= 0.6"
296 | }
297 | },
298 | "node_modules/express": {
299 | "version": "5.1.0",
300 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
301 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
302 | "license": "MIT",
303 | "dependencies": {
304 | "accepts": "^2.0.0",
305 | "body-parser": "^2.2.0",
306 | "content-disposition": "^1.0.0",
307 | "content-type": "^1.0.5",
308 | "cookie": "^0.7.1",
309 | "cookie-signature": "^1.2.1",
310 | "debug": "^4.4.0",
311 | "encodeurl": "^2.0.0",
312 | "escape-html": "^1.0.3",
313 | "etag": "^1.8.1",
314 | "finalhandler": "^2.1.0",
315 | "fresh": "^2.0.0",
316 | "http-errors": "^2.0.0",
317 | "merge-descriptors": "^2.0.0",
318 | "mime-types": "^3.0.0",
319 | "on-finished": "^2.4.1",
320 | "once": "^1.4.0",
321 | "parseurl": "^1.3.3",
322 | "proxy-addr": "^2.0.7",
323 | "qs": "^6.14.0",
324 | "range-parser": "^1.2.1",
325 | "router": "^2.2.0",
326 | "send": "^1.1.0",
327 | "serve-static": "^2.2.0",
328 | "statuses": "^2.0.1",
329 | "type-is": "^2.0.1",
330 | "vary": "^1.1.2"
331 | },
332 | "engines": {
333 | "node": ">= 18"
334 | },
335 | "funding": {
336 | "type": "opencollective",
337 | "url": "https://opencollective.com/express"
338 | }
339 | },
340 | "node_modules/express-validator": {
341 | "version": "7.2.1",
342 | "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.1.tgz",
343 | "integrity": "sha512-CjNE6aakfpuwGaHQZ3m8ltCG2Qvivd7RHtVMS/6nVxOM7xVGqr4bhflsm4+N5FP5zI7Zxp+Hae+9RE+o8e3ZOQ==",
344 | "license": "MIT",
345 | "dependencies": {
346 | "lodash": "^4.17.21",
347 | "validator": "~13.12.0"
348 | },
349 | "engines": {
350 | "node": ">= 8.0.0"
351 | }
352 | },
353 | "node_modules/express-validator/node_modules/validator": {
354 | "version": "13.12.0",
355 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
356 | "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
357 | "license": "MIT",
358 | "engines": {
359 | "node": ">= 0.10"
360 | }
361 | },
362 | "node_modules/finalhandler": {
363 | "version": "2.1.0",
364 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
365 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
366 | "license": "MIT",
367 | "dependencies": {
368 | "debug": "^4.4.0",
369 | "encodeurl": "^2.0.0",
370 | "escape-html": "^1.0.3",
371 | "on-finished": "^2.4.1",
372 | "parseurl": "^1.3.3",
373 | "statuses": "^2.0.1"
374 | },
375 | "engines": {
376 | "node": ">= 0.8"
377 | }
378 | },
379 | "node_modules/forwarded": {
380 | "version": "0.2.0",
381 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
382 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
383 | "license": "MIT",
384 | "engines": {
385 | "node": ">= 0.6"
386 | }
387 | },
388 | "node_modules/fresh": {
389 | "version": "2.0.0",
390 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
391 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
392 | "license": "MIT",
393 | "engines": {
394 | "node": ">= 0.8"
395 | }
396 | },
397 | "node_modules/function-bind": {
398 | "version": "1.1.2",
399 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
400 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
401 | "license": "MIT",
402 | "funding": {
403 | "url": "https://github.com/sponsors/ljharb"
404 | }
405 | },
406 | "node_modules/generate-function": {
407 | "version": "2.3.1",
408 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
409 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
410 | "license": "MIT",
411 | "dependencies": {
412 | "is-property": "^1.0.2"
413 | }
414 | },
415 | "node_modules/get-intrinsic": {
416 | "version": "1.3.0",
417 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
418 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
419 | "license": "MIT",
420 | "dependencies": {
421 | "call-bind-apply-helpers": "^1.0.2",
422 | "es-define-property": "^1.0.1",
423 | "es-errors": "^1.3.0",
424 | "es-object-atoms": "^1.1.1",
425 | "function-bind": "^1.1.2",
426 | "get-proto": "^1.0.1",
427 | "gopd": "^1.2.0",
428 | "has-symbols": "^1.1.0",
429 | "hasown": "^2.0.2",
430 | "math-intrinsics": "^1.1.0"
431 | },
432 | "engines": {
433 | "node": ">= 0.4"
434 | },
435 | "funding": {
436 | "url": "https://github.com/sponsors/ljharb"
437 | }
438 | },
439 | "node_modules/get-proto": {
440 | "version": "1.0.1",
441 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
442 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
443 | "license": "MIT",
444 | "dependencies": {
445 | "dunder-proto": "^1.0.1",
446 | "es-object-atoms": "^1.0.0"
447 | },
448 | "engines": {
449 | "node": ">= 0.4"
450 | }
451 | },
452 | "node_modules/gopd": {
453 | "version": "1.2.0",
454 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
455 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
456 | "license": "MIT",
457 | "engines": {
458 | "node": ">= 0.4"
459 | },
460 | "funding": {
461 | "url": "https://github.com/sponsors/ljharb"
462 | }
463 | },
464 | "node_modules/has-symbols": {
465 | "version": "1.1.0",
466 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
467 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
468 | "license": "MIT",
469 | "engines": {
470 | "node": ">= 0.4"
471 | },
472 | "funding": {
473 | "url": "https://github.com/sponsors/ljharb"
474 | }
475 | },
476 | "node_modules/hasown": {
477 | "version": "2.0.2",
478 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
479 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
480 | "license": "MIT",
481 | "dependencies": {
482 | "function-bind": "^1.1.2"
483 | },
484 | "engines": {
485 | "node": ">= 0.4"
486 | }
487 | },
488 | "node_modules/http-errors": {
489 | "version": "2.0.0",
490 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
491 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
492 | "license": "MIT",
493 | "dependencies": {
494 | "depd": "2.0.0",
495 | "inherits": "2.0.4",
496 | "setprototypeof": "1.2.0",
497 | "statuses": "2.0.1",
498 | "toidentifier": "1.0.1"
499 | },
500 | "engines": {
501 | "node": ">= 0.8"
502 | }
503 | },
504 | "node_modules/http-errors/node_modules/statuses": {
505 | "version": "2.0.1",
506 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
507 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
508 | "license": "MIT",
509 | "engines": {
510 | "node": ">= 0.8"
511 | }
512 | },
513 | "node_modules/iconv-lite": {
514 | "version": "0.6.3",
515 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
516 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
517 | "license": "MIT",
518 | "dependencies": {
519 | "safer-buffer": ">= 2.1.2 < 3.0.0"
520 | },
521 | "engines": {
522 | "node": ">=0.10.0"
523 | }
524 | },
525 | "node_modules/inflection": {
526 | "version": "1.13.4",
527 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
528 | "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
529 | "engines": [
530 | "node >= 0.4.0"
531 | ],
532 | "license": "MIT"
533 | },
534 | "node_modules/inherits": {
535 | "version": "2.0.4",
536 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
537 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
538 | "license": "ISC"
539 | },
540 | "node_modules/ipaddr.js": {
541 | "version": "1.9.1",
542 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
543 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
544 | "license": "MIT",
545 | "engines": {
546 | "node": ">= 0.10"
547 | }
548 | },
549 | "node_modules/is-promise": {
550 | "version": "4.0.0",
551 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
552 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
553 | "license": "MIT"
554 | },
555 | "node_modules/is-property": {
556 | "version": "1.0.2",
557 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
558 | "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
559 | "license": "MIT"
560 | },
561 | "node_modules/jsonwebtoken": {
562 | "version": "9.0.2",
563 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
564 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
565 | "license": "MIT",
566 | "dependencies": {
567 | "jws": "^3.2.2",
568 | "lodash.includes": "^4.3.0",
569 | "lodash.isboolean": "^3.0.3",
570 | "lodash.isinteger": "^4.0.4",
571 | "lodash.isnumber": "^3.0.3",
572 | "lodash.isplainobject": "^4.0.6",
573 | "lodash.isstring": "^4.0.1",
574 | "lodash.once": "^4.0.0",
575 | "ms": "^2.1.1",
576 | "semver": "^7.5.4"
577 | },
578 | "engines": {
579 | "node": ">=12",
580 | "npm": ">=6"
581 | }
582 | },
583 | "node_modules/jwa": {
584 | "version": "1.4.2",
585 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
586 | "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
587 | "license": "MIT",
588 | "dependencies": {
589 | "buffer-equal-constant-time": "^1.0.1",
590 | "ecdsa-sig-formatter": "1.0.11",
591 | "safe-buffer": "^5.0.1"
592 | }
593 | },
594 | "node_modules/jws": {
595 | "version": "3.2.2",
596 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
597 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
598 | "license": "MIT",
599 | "dependencies": {
600 | "jwa": "^1.4.1",
601 | "safe-buffer": "^5.0.1"
602 | }
603 | },
604 | "node_modules/lodash": {
605 | "version": "4.17.21",
606 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
607 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
608 | "license": "MIT"
609 | },
610 | "node_modules/lodash.includes": {
611 | "version": "4.3.0",
612 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
613 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
614 | "license": "MIT"
615 | },
616 | "node_modules/lodash.isboolean": {
617 | "version": "3.0.3",
618 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
619 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
620 | "license": "MIT"
621 | },
622 | "node_modules/lodash.isinteger": {
623 | "version": "4.0.4",
624 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
625 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
626 | "license": "MIT"
627 | },
628 | "node_modules/lodash.isnumber": {
629 | "version": "3.0.3",
630 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
631 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
632 | "license": "MIT"
633 | },
634 | "node_modules/lodash.isplainobject": {
635 | "version": "4.0.6",
636 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
637 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
638 | "license": "MIT"
639 | },
640 | "node_modules/lodash.isstring": {
641 | "version": "4.0.1",
642 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
643 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
644 | "license": "MIT"
645 | },
646 | "node_modules/lodash.once": {
647 | "version": "4.1.1",
648 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
649 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
650 | "license": "MIT"
651 | },
652 | "node_modules/long": {
653 | "version": "5.3.2",
654 | "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
655 | "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
656 | "license": "Apache-2.0"
657 | },
658 | "node_modules/lru-cache": {
659 | "version": "7.18.3",
660 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
661 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
662 | "license": "ISC",
663 | "engines": {
664 | "node": ">=12"
665 | }
666 | },
667 | "node_modules/lru.min": {
668 | "version": "1.1.2",
669 | "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
670 | "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
671 | "license": "MIT",
672 | "engines": {
673 | "bun": ">=1.0.0",
674 | "deno": ">=1.30.0",
675 | "node": ">=8.0.0"
676 | },
677 | "funding": {
678 | "type": "github",
679 | "url": "https://github.com/sponsors/wellwelwel"
680 | }
681 | },
682 | "node_modules/math-intrinsics": {
683 | "version": "1.1.0",
684 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
685 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
686 | "license": "MIT",
687 | "engines": {
688 | "node": ">= 0.4"
689 | }
690 | },
691 | "node_modules/media-typer": {
692 | "version": "1.1.0",
693 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
694 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
695 | "license": "MIT",
696 | "engines": {
697 | "node": ">= 0.8"
698 | }
699 | },
700 | "node_modules/merge-descriptors": {
701 | "version": "2.0.0",
702 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
703 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
704 | "license": "MIT",
705 | "engines": {
706 | "node": ">=18"
707 | },
708 | "funding": {
709 | "url": "https://github.com/sponsors/sindresorhus"
710 | }
711 | },
712 | "node_modules/mime-db": {
713 | "version": "1.54.0",
714 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
715 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
716 | "license": "MIT",
717 | "engines": {
718 | "node": ">= 0.6"
719 | }
720 | },
721 | "node_modules/mime-types": {
722 | "version": "3.0.1",
723 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
724 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
725 | "license": "MIT",
726 | "dependencies": {
727 | "mime-db": "^1.54.0"
728 | },
729 | "engines": {
730 | "node": ">= 0.6"
731 | }
732 | },
733 | "node_modules/moment": {
734 | "version": "2.30.1",
735 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
736 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
737 | "license": "MIT",
738 | "engines": {
739 | "node": "*"
740 | }
741 | },
742 | "node_modules/moment-timezone": {
743 | "version": "0.5.48",
744 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz",
745 | "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
746 | "license": "MIT",
747 | "dependencies": {
748 | "moment": "^2.29.4"
749 | },
750 | "engines": {
751 | "node": "*"
752 | }
753 | },
754 | "node_modules/ms": {
755 | "version": "2.1.3",
756 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
757 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
758 | "license": "MIT"
759 | },
760 | "node_modules/mysql2": {
761 | "version": "3.14.3",
762 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.3.tgz",
763 | "integrity": "sha512-fD6MLV8XJ1KiNFIF0bS7Msl8eZyhlTDCDl75ajU5SJtpdx9ZPEACulJcqJWr1Y8OYyxsFc4j3+nflpmhxCU5aQ==",
764 | "license": "MIT",
765 | "dependencies": {
766 | "aws-ssl-profiles": "^1.1.1",
767 | "denque": "^2.1.0",
768 | "generate-function": "^2.3.1",
769 | "iconv-lite": "^0.6.3",
770 | "long": "^5.2.1",
771 | "lru.min": "^1.0.0",
772 | "named-placeholders": "^1.1.3",
773 | "seq-queue": "^0.0.5",
774 | "sqlstring": "^2.3.2"
775 | },
776 | "engines": {
777 | "node": ">= 8.0"
778 | }
779 | },
780 | "node_modules/named-placeholders": {
781 | "version": "1.1.3",
782 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
783 | "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
784 | "license": "MIT",
785 | "dependencies": {
786 | "lru-cache": "^7.14.1"
787 | },
788 | "engines": {
789 | "node": ">=12.0.0"
790 | }
791 | },
792 | "node_modules/negotiator": {
793 | "version": "1.0.0",
794 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
795 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
796 | "license": "MIT",
797 | "engines": {
798 | "node": ">= 0.6"
799 | }
800 | },
801 | "node_modules/object-inspect": {
802 | "version": "1.13.4",
803 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
804 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
805 | "license": "MIT",
806 | "engines": {
807 | "node": ">= 0.4"
808 | },
809 | "funding": {
810 | "url": "https://github.com/sponsors/ljharb"
811 | }
812 | },
813 | "node_modules/on-finished": {
814 | "version": "2.4.1",
815 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
816 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
817 | "license": "MIT",
818 | "dependencies": {
819 | "ee-first": "1.1.1"
820 | },
821 | "engines": {
822 | "node": ">= 0.8"
823 | }
824 | },
825 | "node_modules/once": {
826 | "version": "1.4.0",
827 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
828 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
829 | "license": "ISC",
830 | "dependencies": {
831 | "wrappy": "1"
832 | }
833 | },
834 | "node_modules/parseurl": {
835 | "version": "1.3.3",
836 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
837 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
838 | "license": "MIT",
839 | "engines": {
840 | "node": ">= 0.8"
841 | }
842 | },
843 | "node_modules/path-to-regexp": {
844 | "version": "8.2.0",
845 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
846 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
847 | "license": "MIT",
848 | "engines": {
849 | "node": ">=16"
850 | }
851 | },
852 | "node_modules/pg-connection-string": {
853 | "version": "2.9.1",
854 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
855 | "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
856 | "license": "MIT"
857 | },
858 | "node_modules/proxy-addr": {
859 | "version": "2.0.7",
860 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
861 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
862 | "license": "MIT",
863 | "dependencies": {
864 | "forwarded": "0.2.0",
865 | "ipaddr.js": "1.9.1"
866 | },
867 | "engines": {
868 | "node": ">= 0.10"
869 | }
870 | },
871 | "node_modules/qs": {
872 | "version": "6.14.0",
873 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
874 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
875 | "license": "BSD-3-Clause",
876 | "dependencies": {
877 | "side-channel": "^1.1.0"
878 | },
879 | "engines": {
880 | "node": ">=0.6"
881 | },
882 | "funding": {
883 | "url": "https://github.com/sponsors/ljharb"
884 | }
885 | },
886 | "node_modules/range-parser": {
887 | "version": "1.2.1",
888 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
889 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
890 | "license": "MIT",
891 | "engines": {
892 | "node": ">= 0.6"
893 | }
894 | },
895 | "node_modules/raw-body": {
896 | "version": "3.0.0",
897 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
898 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
899 | "license": "MIT",
900 | "dependencies": {
901 | "bytes": "3.1.2",
902 | "http-errors": "2.0.0",
903 | "iconv-lite": "0.6.3",
904 | "unpipe": "1.0.0"
905 | },
906 | "engines": {
907 | "node": ">= 0.8"
908 | }
909 | },
910 | "node_modules/retry-as-promised": {
911 | "version": "7.1.1",
912 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz",
913 | "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==",
914 | "license": "MIT"
915 | },
916 | "node_modules/router": {
917 | "version": "2.2.0",
918 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
919 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
920 | "license": "MIT",
921 | "dependencies": {
922 | "debug": "^4.4.0",
923 | "depd": "^2.0.0",
924 | "is-promise": "^4.0.0",
925 | "parseurl": "^1.3.3",
926 | "path-to-regexp": "^8.0.0"
927 | },
928 | "engines": {
929 | "node": ">= 18"
930 | }
931 | },
932 | "node_modules/safe-buffer": {
933 | "version": "5.2.1",
934 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
935 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
936 | "funding": [
937 | {
938 | "type": "github",
939 | "url": "https://github.com/sponsors/feross"
940 | },
941 | {
942 | "type": "patreon",
943 | "url": "https://www.patreon.com/feross"
944 | },
945 | {
946 | "type": "consulting",
947 | "url": "https://feross.org/support"
948 | }
949 | ],
950 | "license": "MIT"
951 | },
952 | "node_modules/safer-buffer": {
953 | "version": "2.1.2",
954 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
955 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
956 | "license": "MIT"
957 | },
958 | "node_modules/semver": {
959 | "version": "7.7.2",
960 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
961 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
962 | "license": "ISC",
963 | "bin": {
964 | "semver": "bin/semver.js"
965 | },
966 | "engines": {
967 | "node": ">=10"
968 | }
969 | },
970 | "node_modules/send": {
971 | "version": "1.2.0",
972 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
973 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
974 | "license": "MIT",
975 | "dependencies": {
976 | "debug": "^4.3.5",
977 | "encodeurl": "^2.0.0",
978 | "escape-html": "^1.0.3",
979 | "etag": "^1.8.1",
980 | "fresh": "^2.0.0",
981 | "http-errors": "^2.0.0",
982 | "mime-types": "^3.0.1",
983 | "ms": "^2.1.3",
984 | "on-finished": "^2.4.1",
985 | "range-parser": "^1.2.1",
986 | "statuses": "^2.0.1"
987 | },
988 | "engines": {
989 | "node": ">= 18"
990 | }
991 | },
992 | "node_modules/seq-queue": {
993 | "version": "0.0.5",
994 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
995 | "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
996 | },
997 | "node_modules/sequelize": {
998 | "version": "6.37.7",
999 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.7.tgz",
1000 | "integrity": "sha512-mCnh83zuz7kQxxJirtFD7q6Huy6liPanI67BSlbzSYgVNl5eXVdE2CN1FuAeZwG1SNpGsNRCV+bJAVVnykZAFA==",
1001 | "funding": [
1002 | {
1003 | "type": "opencollective",
1004 | "url": "https://opencollective.com/sequelize"
1005 | }
1006 | ],
1007 | "license": "MIT",
1008 | "dependencies": {
1009 | "@types/debug": "^4.1.8",
1010 | "@types/validator": "^13.7.17",
1011 | "debug": "^4.3.4",
1012 | "dottie": "^2.0.6",
1013 | "inflection": "^1.13.4",
1014 | "lodash": "^4.17.21",
1015 | "moment": "^2.29.4",
1016 | "moment-timezone": "^0.5.43",
1017 | "pg-connection-string": "^2.6.1",
1018 | "retry-as-promised": "^7.0.4",
1019 | "semver": "^7.5.4",
1020 | "sequelize-pool": "^7.1.0",
1021 | "toposort-class": "^1.0.1",
1022 | "uuid": "^8.3.2",
1023 | "validator": "^13.9.0",
1024 | "wkx": "^0.5.0"
1025 | },
1026 | "engines": {
1027 | "node": ">=10.0.0"
1028 | },
1029 | "peerDependenciesMeta": {
1030 | "ibm_db": {
1031 | "optional": true
1032 | },
1033 | "mariadb": {
1034 | "optional": true
1035 | },
1036 | "mysql2": {
1037 | "optional": true
1038 | },
1039 | "oracledb": {
1040 | "optional": true
1041 | },
1042 | "pg": {
1043 | "optional": true
1044 | },
1045 | "pg-hstore": {
1046 | "optional": true
1047 | },
1048 | "snowflake-sdk": {
1049 | "optional": true
1050 | },
1051 | "sqlite3": {
1052 | "optional": true
1053 | },
1054 | "tedious": {
1055 | "optional": true
1056 | }
1057 | }
1058 | },
1059 | "node_modules/sequelize-pool": {
1060 | "version": "7.1.0",
1061 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
1062 | "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
1063 | "license": "MIT",
1064 | "engines": {
1065 | "node": ">= 10.0.0"
1066 | }
1067 | },
1068 | "node_modules/serve-static": {
1069 | "version": "2.2.0",
1070 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
1071 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
1072 | "license": "MIT",
1073 | "dependencies": {
1074 | "encodeurl": "^2.0.0",
1075 | "escape-html": "^1.0.3",
1076 | "parseurl": "^1.3.3",
1077 | "send": "^1.2.0"
1078 | },
1079 | "engines": {
1080 | "node": ">= 18"
1081 | }
1082 | },
1083 | "node_modules/setprototypeof": {
1084 | "version": "1.2.0",
1085 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1086 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1087 | "license": "ISC"
1088 | },
1089 | "node_modules/side-channel": {
1090 | "version": "1.1.0",
1091 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1092 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1093 | "license": "MIT",
1094 | "dependencies": {
1095 | "es-errors": "^1.3.0",
1096 | "object-inspect": "^1.13.3",
1097 | "side-channel-list": "^1.0.0",
1098 | "side-channel-map": "^1.0.1",
1099 | "side-channel-weakmap": "^1.0.2"
1100 | },
1101 | "engines": {
1102 | "node": ">= 0.4"
1103 | },
1104 | "funding": {
1105 | "url": "https://github.com/sponsors/ljharb"
1106 | }
1107 | },
1108 | "node_modules/side-channel-list": {
1109 | "version": "1.0.0",
1110 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1111 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1112 | "license": "MIT",
1113 | "dependencies": {
1114 | "es-errors": "^1.3.0",
1115 | "object-inspect": "^1.13.3"
1116 | },
1117 | "engines": {
1118 | "node": ">= 0.4"
1119 | },
1120 | "funding": {
1121 | "url": "https://github.com/sponsors/ljharb"
1122 | }
1123 | },
1124 | "node_modules/side-channel-map": {
1125 | "version": "1.0.1",
1126 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1127 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1128 | "license": "MIT",
1129 | "dependencies": {
1130 | "call-bound": "^1.0.2",
1131 | "es-errors": "^1.3.0",
1132 | "get-intrinsic": "^1.2.5",
1133 | "object-inspect": "^1.13.3"
1134 | },
1135 | "engines": {
1136 | "node": ">= 0.4"
1137 | },
1138 | "funding": {
1139 | "url": "https://github.com/sponsors/ljharb"
1140 | }
1141 | },
1142 | "node_modules/side-channel-weakmap": {
1143 | "version": "1.0.2",
1144 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1145 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1146 | "license": "MIT",
1147 | "dependencies": {
1148 | "call-bound": "^1.0.2",
1149 | "es-errors": "^1.3.0",
1150 | "get-intrinsic": "^1.2.5",
1151 | "object-inspect": "^1.13.3",
1152 | "side-channel-map": "^1.0.1"
1153 | },
1154 | "engines": {
1155 | "node": ">= 0.4"
1156 | },
1157 | "funding": {
1158 | "url": "https://github.com/sponsors/ljharb"
1159 | }
1160 | },
1161 | "node_modules/sqlstring": {
1162 | "version": "2.3.3",
1163 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
1164 | "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
1165 | "license": "MIT",
1166 | "engines": {
1167 | "node": ">= 0.6"
1168 | }
1169 | },
1170 | "node_modules/statuses": {
1171 | "version": "2.0.2",
1172 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1173 | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1174 | "license": "MIT",
1175 | "engines": {
1176 | "node": ">= 0.8"
1177 | }
1178 | },
1179 | "node_modules/toidentifier": {
1180 | "version": "1.0.1",
1181 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1182 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1183 | "license": "MIT",
1184 | "engines": {
1185 | "node": ">=0.6"
1186 | }
1187 | },
1188 | "node_modules/toposort-class": {
1189 | "version": "1.0.1",
1190 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
1191 | "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==",
1192 | "license": "MIT"
1193 | },
1194 | "node_modules/type-is": {
1195 | "version": "2.0.1",
1196 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1197 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1198 | "license": "MIT",
1199 | "dependencies": {
1200 | "content-type": "^1.0.5",
1201 | "media-typer": "^1.1.0",
1202 | "mime-types": "^3.0.0"
1203 | },
1204 | "engines": {
1205 | "node": ">= 0.6"
1206 | }
1207 | },
1208 | "node_modules/undici-types": {
1209 | "version": "7.10.0",
1210 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
1211 | "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
1212 | "license": "MIT"
1213 | },
1214 | "node_modules/unpipe": {
1215 | "version": "1.0.0",
1216 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1217 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1218 | "license": "MIT",
1219 | "engines": {
1220 | "node": ">= 0.8"
1221 | }
1222 | },
1223 | "node_modules/uuid": {
1224 | "version": "8.3.2",
1225 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
1226 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
1227 | "license": "MIT",
1228 | "bin": {
1229 | "uuid": "dist/bin/uuid"
1230 | }
1231 | },
1232 | "node_modules/validator": {
1233 | "version": "13.15.15",
1234 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz",
1235 | "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==",
1236 | "license": "MIT",
1237 | "engines": {
1238 | "node": ">= 0.10"
1239 | }
1240 | },
1241 | "node_modules/vary": {
1242 | "version": "1.1.2",
1243 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1244 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1245 | "license": "MIT",
1246 | "engines": {
1247 | "node": ">= 0.8"
1248 | }
1249 | },
1250 | "node_modules/wkx": {
1251 | "version": "0.5.0",
1252 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
1253 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
1254 | "license": "MIT",
1255 | "dependencies": {
1256 | "@types/node": "*"
1257 | }
1258 | },
1259 | "node_modules/wrappy": {
1260 | "version": "1.0.2",
1261 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1262 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1263 | "license": "ISC"
1264 | }
1265 | }
1266 | }
1267 |
--------------------------------------------------------------------------------