├── .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 | --------------------------------------------------------------------------------