├── prisma ├── migrations │ ├── migration_lock.toml │ ├── 20240316075310_create_users_table │ │ └── migration.sql │ ├── 20240318144142_create_assesments_table │ │ └── migration.sql │ └── 20240319123851_create_questions_table │ │ └── migration.sql └── schema.prisma ├── src ├── auth │ ├── auth.validation.js │ ├── auth.controller.js │ ├── auth.service.js │ └── auth.route.js ├── common │ ├── utils │ │ ├── database.js │ │ ├── hashing.js │ │ ├── validation.js │ │ ├── jwt.js │ │ ├── logging.js │ │ └── Response.js │ ├── errors │ │ ├── NotFoundError.js │ │ ├── AuthorizationError.js │ │ ├── AuthenticationError.js │ │ └── ResponseError.js │ ├── middleware │ │ ├── logging.middleware.js │ │ ├── auth.middleware.js │ │ ├── token.middleware.js │ │ └── error.middleware.js │ ├── config │ │ ├── config.js │ │ └── swagger.js │ └── helpers │ │ ├── auth.js │ │ └── assesment.js ├── routes.js ├── assesment │ ├── assesment.route.js │ ├── assesment.validation.js │ ├── assesment.controller.js │ └── assesment.service.js ├── questions │ ├── questions.route.js │ ├── questions.validation.js │ ├── questions.service.js │ └── questions.controller.js ├── users │ ├── users.validation.js │ ├── users.controller.js │ ├── users.service.js │ └── users.route.js └── main.js ├── .prettierrc.json ├── .env.example ├── .eslintrc.json ├── .gitignore ├── package.json ├── README.md └── pnpm-lock.yaml /prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "mysql" -------------------------------------------------------------------------------- /src/auth/auth.validation.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | 3 | export const loginSchema = Joi.object({ 4 | email: Joi.string().email().required(), 5 | password: Joi.string().required(), 6 | }); 7 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "printWidth": 80, 6 | "trailingComma": "all", 7 | "bracketSpacing": true, 8 | "arrowParens": "always", 9 | "endOfLine": "auto" 10 | } 11 | -------------------------------------------------------------------------------- /src/common/utils/database.js: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from '@prisma/client'; 2 | 3 | const prisma = new PrismaClient({ 4 | transactionOptions: { 5 | maxRetries: 3, 6 | maxWait: 3000, 7 | isolationLevel: 'Serializable', 8 | }, 9 | }); 10 | 11 | export default prisma; 12 | -------------------------------------------------------------------------------- /src/common/utils/hashing.js: -------------------------------------------------------------------------------- 1 | import bcrypt from 'bcrypt'; 2 | import config from '../config/config.js'; 3 | 4 | export const hash = async (data) => { 5 | const salt = await bcrypt.genSalt(+config.bcrypt.saltRounds); 6 | return bcrypt.hash(data, salt); 7 | }; 8 | 9 | export const compare = async (data, hash) => { 10 | return bcrypt.compare(data, hash); 11 | }; 12 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # Environment 2 | NODE_ENV=development 3 | 4 | # App 5 | APP_NAME=healthplus-api 6 | APP_URL=http://localhost 7 | APP_PORT=3001 8 | 9 | # Database 10 | DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" 11 | 12 | # JWT 13 | JWT_PUBLIC_KEY="your SHA256 public key" 14 | JWT_PRIVATE_KEY="your SHA256 private key" 15 | JWT_EXPIRES_IN=1d 16 | JWT_REFRESH_IN=7d 17 | 18 | # Bcrypt 19 | BCRYPT_SALT_ROUNDS=10 -------------------------------------------------------------------------------- /src/common/utils/validation.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | 3 | const { ValidationError } = Joi; 4 | 5 | const validate = async (schema, payload) => { 6 | const { error, value } = schema.validate(payload, { 7 | abortEarly: false, 8 | allowUnknown: false, 9 | }); 10 | 11 | if (error) { 12 | throw new ValidationError('Validation failed', error.details); 13 | } 14 | return value; 15 | }; 16 | 17 | export default validate; 18 | -------------------------------------------------------------------------------- /src/common/errors/NotFoundError.js: -------------------------------------------------------------------------------- 1 | import ResponseError from './ResponseError.js'; 2 | 3 | /** 4 | * Represents a NotFoundError. 5 | * @extends ResponseError 6 | */ 7 | class NotFoundError extends ResponseError { 8 | /** 9 | * Constructs a NotFoundError with the specified message. 10 | * @param {string} message - The error message. 11 | */ 12 | constructor(message) { 13 | super(message, 404); 14 | this.name = 'NotFoundError'; 15 | } 16 | } 17 | 18 | export default NotFoundError; 19 | -------------------------------------------------------------------------------- /src/common/errors/AuthorizationError.js: -------------------------------------------------------------------------------- 1 | import ResponseError from './ResponseError.js'; 2 | 3 | /** 4 | * Represents an authorization error. 5 | * @extends ResponseError 6 | */ 7 | class AuthorizationError extends ResponseError { 8 | /** 9 | * Constructs a new AuthorizationError instance. 10 | * @param {string} message - The error message. 11 | */ 12 | constructor(message) { 13 | super(message, 403); 14 | this.name = 'AuthorizationError'; 15 | } 16 | } 17 | 18 | export default AuthorizationError; 19 | -------------------------------------------------------------------------------- /src/routes.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import usersRoutes from './users/users.route.js'; 3 | import authRoutes from './auth/auth.route.js'; 4 | import assesmentRoutes from './assesment/assesment.route.js'; 5 | import questionsRoutes from './questions/questions.route.js'; 6 | 7 | const router = Router(); 8 | 9 | router.use('/auth', authRoutes); 10 | router.use('/users', usersRoutes); 11 | router.use('/assesment', assesmentRoutes); 12 | router.use('/questions', questionsRoutes); 13 | 14 | export default router; 15 | -------------------------------------------------------------------------------- /src/common/errors/AuthenticationError.js: -------------------------------------------------------------------------------- 1 | import ResponseError from './ResponseError.js'; 2 | 3 | /** 4 | * Represents an authentication error. 5 | * @extends ResponseError 6 | */ 7 | class AuthenticationError extends ResponseError { 8 | /** 9 | * Constructs a new AuthenticationError instance. 10 | * @param {string} message - The error message. 11 | */ 12 | constructor(message) { 13 | super(message, 401); 14 | this.name = 'AuthenticationError'; 15 | } 16 | } 17 | 18 | export default AuthenticationError; 19 | -------------------------------------------------------------------------------- /src/common/middleware/logging.middleware.js: -------------------------------------------------------------------------------- 1 | import logger from '../utils/logging.js'; 2 | 3 | /** 4 | * Middleware for logging requests. 5 | * @param {Request} req - The request object. 6 | * @param {Response} res - The response object. 7 | * @param {NextFunction} next - The next middleware function. 8 | */ 9 | function loggingMiddleware(req, res, next) { 10 | const { method, originalUrl } = req; 11 | 12 | const logMessage = `${method} ${originalUrl}`; 13 | logger.info(logMessage); 14 | 15 | next(); 16 | } 17 | 18 | export default loggingMiddleware; 19 | -------------------------------------------------------------------------------- /src/assesment/assesment.route.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import assesmentController from './assesment.controller.js'; 3 | import { isAuthenticate } from '../common/middleware/auth.middleware.js'; 4 | 5 | const router = Router(); 6 | 7 | router.post('/', isAuthenticate, assesmentController.create); 8 | router.get('/', isAuthenticate, assesmentController.findDetailByUserId); 9 | router.get('/all', isAuthenticate, assesmentController.findAllByUserId); 10 | router.delete('/:id', isAuthenticate, assesmentController.destroy); 11 | 12 | export default router; 13 | -------------------------------------------------------------------------------- /src/common/config/config.js: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | 3 | dotenv.config(); 4 | 5 | export default { 6 | app: { 7 | name: process.env.APP_NAME || 'healthplus', 8 | url: process.env.APP_URL || 'http://localhost', 9 | port: process.env.APP_PORT || 3000, 10 | }, 11 | jwt: { 12 | publicKey: process.env.JWT_PUBLIC_KEY, 13 | privateKey: process.env.JWT_PRIVATE_KEY, 14 | expiresIn: process.env.JWT_EXPIRES_IN, 15 | refreshIn: process.env.JWT_REFRESH_IN, 16 | }, 17 | bcrypt: { 18 | saltRounds: process.env.BCRYPT_SALT_ROUNDS, 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /src/questions/questions.route.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import questionController from './questions.controller.js'; 3 | import { 4 | isAuthenticate, 5 | isAdmin, 6 | } from '../common/middleware/auth.middleware.js'; 7 | 8 | const router = Router(); 9 | 10 | router.post('/', isAuthenticate, isAdmin, questionController.create); 11 | router.get('/', isAuthenticate, questionController.findAll); 12 | router.put('/:id', isAuthenticate, isAdmin, questionController.update); 13 | router.delete('/:id', isAuthenticate, isAdmin, questionController.remove); 14 | 15 | export default router; 16 | -------------------------------------------------------------------------------- /src/common/errors/ResponseError.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Custom error class for handling response errors 3 | * @param {string} message - Error message 4 | * @param {number} code - HTTP status code 5 | * @example 6 | * throw new ResponseError('Not found', 404); 7 | */ 8 | class ResponseError extends Error { 9 | /** 10 | * Create a new ResponseError instance. 11 | * @param {string} message - Error message. 12 | * @param {number} code - HTTP status code. 13 | */ 14 | constructor(message, code) { 15 | super(message); 16 | this.code = code; 17 | } 18 | } 19 | 20 | export default ResponseError; 21 | -------------------------------------------------------------------------------- /src/common/config/swagger.js: -------------------------------------------------------------------------------- 1 | import swaggerJsdoc from 'swagger-jsdoc'; 2 | import config from './config.js'; 3 | 4 | const swaggerOptions = { 5 | definition: { 6 | openapi: '3.0.0', 7 | info: { 8 | title: 'Health Plus API', 9 | version: '1.0.0', 10 | description: 'API documentation for Health Plus application', 11 | }, 12 | servers: [ 13 | { 14 | url: `${config.app.url}:${config.app.port}/api/v1`, 15 | }, 16 | ], 17 | }, 18 | apis: ['./**/*.route.js'], 19 | }; 20 | 21 | const swaggerSpec = swaggerJsdoc(swaggerOptions); 22 | 23 | export default swaggerSpec; 24 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2021": true, 4 | "node": true 5 | }, 6 | "extends": ["google", "eslint:recommended", "plugin:prettier/recommended"], 7 | "plugins": ["prettier"], 8 | "parserOptions": { 9 | "ecmaVersion": "latest", 10 | "sourceType": "module" 11 | }, 12 | "rules": { 13 | "prettier/prettier": "error", 14 | "no-console": "warn", 15 | "no-unused-vars": "error", 16 | "no-undef": "error", 17 | "no-use-before-define": "error", 18 | "no-undef-init": "error", 19 | "camelcase": "error", 20 | "eqeqeq": "error", 21 | "new-cap": "off" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /prisma/migrations/20240316075310_create_users_table/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `users` ( 3 | `id` VARCHAR(191) NOT NULL, 4 | `name` VARCHAR(100) NOT NULL, 5 | `email` VARCHAR(255) NOT NULL, 6 | `password` VARCHAR(255) NOT NULL, 7 | `role` ENUM('USER', 'ADMIN') NOT NULL DEFAULT 'USER', 8 | `lastLogin` TIMESTAMP NULL, 9 | `refreshToken` VARCHAR(255) NULL, 10 | `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 11 | `updatedAt` DATETIME(3) NOT NULL, 12 | 13 | UNIQUE INDEX `users_email_key`(`email`), 14 | PRIMARY KEY (`id`) 15 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 16 | -------------------------------------------------------------------------------- /src/common/middleware/auth.middleware.js: -------------------------------------------------------------------------------- 1 | import AuthorizationError from '../errors/AuthorizationError.js'; 2 | import AuthenticationError from '../errors/AuthenticationError.js'; 3 | 4 | export const isAuthenticate = (req, res, next) => { 5 | const { user } = res.locals; 6 | if (!user) { 7 | return next(new AuthenticationError('Authentication required')); 8 | } 9 | 10 | return next(); 11 | }; 12 | 13 | export const isAdmin = (req, res, next) => { 14 | const { user } = res.locals; 15 | if (!user.role || user.role !== 'ADMIN') { 16 | return next(new AuthorizationError('Authorization required')); 17 | } 18 | 19 | return next(); 20 | }; 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.log 3 | *.pid 4 | *.seed 5 | *.pid.lock 6 | 7 | # env files 8 | .env 9 | .env.local 10 | .env.development 11 | .env.test 12 | .env.production 13 | .env.*.local 14 | .env.*.development 15 | .env.*.test 16 | .env.*.production 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | # Logs 22 | logs 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # Editor directories 28 | .idea 29 | .vscode 30 | .todos 31 | .requirements 32 | .feature 33 | 34 | # build output 35 | build/ 36 | dist/ 37 | out/ 38 | 39 | # misc 40 | .DS_Store 41 | Thumbs.db 42 | 43 | # testing 44 | coverage/ 45 | .nyc_output/ 46 | -------------------------------------------------------------------------------- /src/users/users.validation.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | 3 | export const createUserSchema = Joi.object({ 4 | name: Joi.string().min(3).max(100).required(), 5 | email: Joi.string().email().max(255).required(), 6 | password: Joi.string().min(6).max(255).required(), 7 | }); 8 | 9 | export const getAllUserSchema = Joi.object({ 10 | limit: Joi.number().integer().min(1).required(), 11 | page: Joi.number().integer().min(1).required(), 12 | }); 13 | 14 | export const getUserByEmailSchema = Joi.object({ 15 | email: Joi.string().email().max(255).required(), 16 | }); 17 | 18 | export const getUserByIdSchema = Joi.object({ 19 | id: Joi.string().uuid().required(), 20 | }); 21 | -------------------------------------------------------------------------------- /src/common/middleware/token.middleware.js: -------------------------------------------------------------------------------- 1 | import { verifyToken } from '../utils/jwt.js'; 2 | 3 | const deserializeTokenMiddleware = async (req, res, next) => { 4 | const authHeader = req.headers.authorization; 5 | const accessToken = authHeader && authHeader?.split(' ')[1]; 6 | 7 | if (!accessToken) { 8 | return next(); 9 | } 10 | 11 | const { isValid, expired, credentials } = verifyToken(accessToken); 12 | 13 | if (credentials) { 14 | res.locals.user = credentials; 15 | return next(); 16 | } 17 | 18 | if (expired || isValid === false) { 19 | return next(); 20 | } 21 | 22 | return next(); 23 | }; 24 | 25 | export default deserializeTokenMiddleware; 26 | -------------------------------------------------------------------------------- /src/assesment/assesment.validation.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | 3 | export const createAssesmentSchema = Joi.object({ 4 | userId: Joi.string().required(), 5 | makanan: Joi.array().items(Joi.number().min(1).max(5)).required(), 6 | aktivitas: Joi.array().items(Joi.number().min(1).max(5)).required(), 7 | mental: Joi.array().items(Joi.number().min(1).max(5)).required(), 8 | }); 9 | 10 | export const findAssessmentByUserIdSchema = Joi.string().required(); 11 | 12 | export const findAllAssessmentSchema = Joi.object({ 13 | userId: Joi.string().required(), 14 | limit: Joi.number().required(), 15 | page: Joi.number().required(), 16 | }); 17 | 18 | export const deleteAssessmentSchema = Joi.string().required(); 19 | -------------------------------------------------------------------------------- /prisma/migrations/20240318144142_create_assesments_table/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `assesments` ( 3 | `id` VARCHAR(191) NOT NULL, 4 | `userId` VARCHAR(191) NOT NULL, 5 | `scoreDiet` FLOAT NOT NULL, 6 | `scorePhysicalActivity` FLOAT NOT NULL, 7 | `scoreMentalHealth` FLOAT NOT NULL, 8 | `totalScore` FLOAT NOT NULL, 9 | `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 10 | `updatedAt` DATETIME(3) NOT NULL, 11 | 12 | PRIMARY KEY (`id`) 13 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 14 | 15 | -- AddForeignKey 16 | ALTER TABLE `assesments` ADD CONSTRAINT `assesments_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; 17 | -------------------------------------------------------------------------------- /src/questions/questions.validation.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | 3 | export const createQuestionSchema = Joi.object({ 4 | question: Joi.string().required(), 5 | category: Joi.string() 6 | .valid('DIET', 'PHYSICAL_ACTIVITY', 'MENTAL_HEALTH') 7 | .required(), 8 | options: Joi.array().required(), 9 | }); 10 | 11 | export const getQuestionsSchema = Joi.object({ 12 | limit: Joi.number().required(), 13 | page: Joi.number().required(), 14 | }); 15 | 16 | export const updateQuestionSchema = Joi.object({ 17 | id: Joi.string().required(), 18 | question: Joi.string(), 19 | category: Joi.string().valid('DIET', 'PHYSICAL_ACTIVITY', 'MENTAL_HEALTH'), 20 | options: Joi.array(), 21 | }); 22 | 23 | export const deleteQuestionSchema = Joi.string().required(); 24 | -------------------------------------------------------------------------------- /src/common/utils/jwt.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | import config from '../config/config.js'; 3 | 4 | export const generateToken = (payload, options = null) => { 5 | return jwt.sign(payload, config.jwt.privateKey, { 6 | ...options, 7 | algorithm: 'RS256', 8 | }); 9 | }; 10 | 11 | export const verifyToken = (token) => { 12 | try { 13 | const decoded = jwt.verify(token, config.jwt.publicKey, { 14 | algorithms: ['RS256'], 15 | }); 16 | 17 | return { 18 | isValid: true, 19 | expired: false, 20 | credentials: decoded, 21 | }; 22 | } catch (error) { 23 | return { 24 | isValid: false, 25 | expired: error.message === 'JWT is expired or not eligible to use', 26 | credentials: null, 27 | }; 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /prisma/migrations/20240319123851_create_questions_table/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - You are about to alter the column `lastLogin` on the `users` table. The data in that column could be lost. The data in that column will be cast from `Timestamp(0)` to `Timestamp`. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE `assesments` MODIFY `totalScore` FLOAT NULL; 9 | 10 | -- AlterTable 11 | ALTER TABLE `users` MODIFY `lastLogin` TIMESTAMP NULL; 12 | 13 | -- CreateTable 14 | CREATE TABLE `questions` ( 15 | `id` VARCHAR(191) NOT NULL, 16 | `question` VARCHAR(255) NOT NULL, 17 | `category` ENUM('DIET', 'PHYSICAL_ACTIVITY', 'MENTAL_HEALTH') NOT NULL, 18 | `options` VARCHAR(255) NOT NULL, 19 | `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 20 | `updatedAt` DATETIME(3) NOT NULL, 21 | 22 | PRIMARY KEY (`id`) 23 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 24 | -------------------------------------------------------------------------------- /src/auth/auth.controller.js: -------------------------------------------------------------------------------- 1 | import authService from './auth.service.js'; 2 | import Response from '../common/utils/Response.js'; 3 | import logger from '../common/utils/logging.js'; 4 | 5 | const response = new Response(); 6 | 7 | const register = async (req, res, next) => { 8 | try { 9 | const result = await authService.register(req.body); 10 | 11 | logger.info(`User has been registered successfully: ${result.id}`); 12 | 13 | res.status(201).json( 14 | response.success({ 15 | code: 201, 16 | message: 'User has been created successfully', 17 | data: result, 18 | }), 19 | ); 20 | } catch (error) { 21 | next(error); 22 | } 23 | }; 24 | 25 | const login = async (req, res, next) => { 26 | try { 27 | const result = await authService.login(req.body); 28 | 29 | logger.info(`User has been logged in successfully: ${result.id}`); 30 | 31 | res.status(200).json( 32 | response.success({ 33 | code: 200, 34 | message: 'User has been logged in successfully', 35 | data: result, 36 | }), 37 | ); 38 | } catch (error) { 39 | next(error); 40 | } 41 | }; 42 | 43 | export default { register, login }; 44 | -------------------------------------------------------------------------------- /src/common/utils/logging.js: -------------------------------------------------------------------------------- 1 | import winston from 'winston'; 2 | import moment from 'moment'; 3 | import { format, transports } from 'winston'; 4 | 5 | const { combine, printf } = format; 6 | 7 | /** 8 | * Get the color based on the log level. 9 | * 10 | * @param {string} level - The log level. 11 | * @return {string} The color code. 12 | */ 13 | function getColor(level) { 14 | switch (level) { 15 | case 'info': 16 | return '\x1b[36m'; // Cyan 17 | case 'warn': 18 | return '\x1b[33m'; // Yellow 19 | case 'error': 20 | return '\x1b[31m'; // Red 21 | default: 22 | return '\x1b[0m'; // Default color (reset) 23 | } 24 | } 25 | 26 | const logFormat = printf(({ level, message, timestamp }) => { 27 | const color = getColor(level); 28 | return `${color}${timestamp} | ${level}: ${message}\x1b[0m`; // Reset color after message 29 | }); 30 | 31 | const customTimestamp = format((info) => { 32 | info.timestamp = moment().format('YYYY-MM-DD HH:mm:ss'); 33 | return info; 34 | }); 35 | 36 | const logger = winston.createLogger({ 37 | level: 'info', 38 | format: combine(customTimestamp(), logFormat), 39 | transports: [ 40 | new transports.Console(), 41 | new transports.File({ filename: 'logs/error.log', level: 'error' }), 42 | new transports.File({ filename: 'logs/server.log' }), 43 | ], 44 | }); 45 | 46 | export default logger; 47 | -------------------------------------------------------------------------------- /src/common/middleware/error.middleware.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | import ResponseError from '../errors/ResponseError.js'; 3 | import logger from '../utils/logging.js'; 4 | import Response from '../utils/response.js'; 5 | 6 | const { ValidationError } = Joi; 7 | 8 | /** 9 | * Error handler middleware. 10 | * 11 | * @param {Error} err - The error object. 12 | * @param {Request} req - The express request object. 13 | * @param {Response} res - The express response object. 14 | * @param {Function} next - The next middleware function. 15 | * @return {void} 16 | */ 17 | const errorHandler = (err, req, res, next) => { 18 | const response = new Response(); 19 | 20 | if (err instanceof ResponseError) { 21 | logger.error(err.message); 22 | res 23 | .status(err.code) 24 | .json(response.error({ code: err.code, error: err.message })); 25 | } else if (err instanceof ValidationError) { 26 | const details = []; 27 | 28 | err.details.forEach((detail) => { 29 | details.push(detail.message); 30 | }); 31 | 32 | logger.error(err.message); 33 | res.status(400).json( 34 | response.error({ 35 | code: 400, 36 | error: 'Validation error', 37 | data: details, 38 | }), 39 | ); 40 | } else { 41 | logger.error(err.stack); 42 | res 43 | .status(500) 44 | .json(response.error({ code: 500, error: 'Internal server error' })); 45 | } 46 | 47 | next(); 48 | }; 49 | 50 | export default errorHandler; 51 | -------------------------------------------------------------------------------- /src/common/helpers/auth.js: -------------------------------------------------------------------------------- 1 | import config from '../config/config.js'; 2 | import prisma from '../utils/database.js'; 3 | import { generateToken as generateJwtToken } from '../utils/jwt.js'; 4 | import { hash } from '../utils/hashing.js'; 5 | 6 | /** 7 | * Update the refresh token of the user 8 | * 9 | * @param {uuid} userId 10 | * @param {string} refreshToken 11 | * @return {Promise} 12 | */ 13 | export const updateRefreshToken = async (userId, refreshToken) => { 14 | const hashedRefreshToken = await hash(refreshToken); 15 | 16 | return prisma.user.update({ 17 | where: { id: userId }, 18 | data: { refreshToken: hashedRefreshToken }, 19 | }); 20 | }; 21 | 22 | /** 23 | * Update the last login date of the user 24 | * 25 | * @param {uuid} userId 26 | * @return {Promise} 27 | */ 28 | export const updateLastLogin = async (userId) => { 29 | return prisma.user.update({ 30 | where: { id: userId }, 31 | data: { lastLogin: new Date() }, 32 | }); 33 | }; 34 | 35 | /** 36 | * Generate access and refresh token 37 | * 38 | * @param {object} data 39 | * @return {Promise} 40 | * @property {string} accessToken 41 | * @property {string} refreshToken 42 | */ 43 | export const generateToken = async (data) => { 44 | const accessToken = generateJwtToken( 45 | { ...data }, 46 | { expiresIn: config.jwt.expiresIn }, 47 | ); 48 | const refreshToken = generateJwtToken( 49 | { ...data }, 50 | { expiresIn: config.jwt.refreshIn }, 51 | ); 52 | 53 | return { accessToken, refreshToken }; 54 | }; 55 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import bodyParser from 'body-parser'; 3 | import cors from 'cors'; 4 | import helmet from 'helmet'; 5 | import swaggerUi from 'swagger-ui-express'; 6 | import config from './common/config/config.js'; 7 | import logger from './common/utils/logging.js'; 8 | import router from './routes.js'; 9 | import loggingMiddleware from './common/middleware/logging.middleware.js'; 10 | import errorMiddleware from './common/middleware/error.middleware.js'; 11 | import deserializeTokenMiddleware from './common/middleware/token.middleware.js'; 12 | import swaggerSpec from './common/config/swagger.js'; 13 | 14 | const app = express(); 15 | const { port } = config.app; 16 | 17 | app.use(bodyParser.json()); 18 | app.use(bodyParser.urlencoded({ extended: true })); 19 | 20 | app.use(cors()); 21 | app.use(helmet()); 22 | 23 | app.use(loggingMiddleware); 24 | app.use(deserializeTokenMiddleware); 25 | 26 | app.use('/api/v1', router); 27 | 28 | app.get('/api/v1', (req, res) => { 29 | logger.info('Welcome to HealthPlus API'); 30 | res.status(200).json({ message: 'Welcome to HealthPlus API' }); 31 | }); 32 | 33 | app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); 34 | 35 | app.use((req, res) => { 36 | const { originalUrl, method } = req; 37 | const message = `Page ${method} | ${originalUrl} Not Found`; 38 | logger.error(message); 39 | res.status(404).json({ message }); 40 | }); 41 | 42 | app.use(errorMiddleware); 43 | 44 | app.listen(port, () => logger.info(`Server is running on port ${port}`)); 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "health-plus-api", 3 | "version": "1.0.0", 4 | "description": "Health Plus API | Micro Challenge Project | Celerates Acceleration Program - Web Development & UI/UX Design", 5 | "main": "src/main.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "node src/main.js", 9 | "start:dev": "nodemon src/main.js", 10 | "format": "prettier --write .src/**/*.js", 11 | "lint": "eslint .src/**/*.js", 12 | "postinstall": "prisma generate", 13 | "migrate": "prisma migrate dev", 14 | "studio": "prisma studio", 15 | "generate": "prisma generate" 16 | }, 17 | "keywords": [ 18 | "Health", 19 | "API" 20 | ], 21 | "author": "Hizkia Reppi", 22 | "license": "ISC", 23 | "dependencies": { 24 | "@prisma/client": "^5.11.0", 25 | "bcrypt": "^5.1.1", 26 | "body-parser": "^1.20.2", 27 | "cors": "^2.8.5", 28 | "dotenv": "^16.4.5", 29 | "express": "^4.18.3", 30 | "helmet": "^7.1.0", 31 | "joi": "^17.12.2", 32 | "jsonwebtoken": "^9.0.2", 33 | "moment": "^2.30.1", 34 | "swagger-jsdoc": "^6.2.8", 35 | "swagger-ui-express": "^5.0.0", 36 | "uuid": "^9.0.1", 37 | "winston": "^3.12.0" 38 | }, 39 | "devDependencies": { 40 | "@types/bcrypt": "^5.0.2", 41 | "@types/express": "^4.17.21", 42 | "@types/uuid": "^9.0.8", 43 | "eslint": "^8.57.0", 44 | "eslint-config-google": "^0.14.0", 45 | "eslint-config-prettier": "^9.1.0", 46 | "eslint-plugin-import": "^2.29.1", 47 | "eslint-plugin-prettier": "^5.1.3", 48 | "nodemon": "^3.1.0", 49 | "prettier": "^3.2.5", 50 | "prisma": "^5.11.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/auth/auth.service.js: -------------------------------------------------------------------------------- 1 | import { loginSchema } from './auth.validation.js'; 2 | import { createUserSchema } from '../users/users.validation.js'; 3 | import { compare } from '../common/utils/hashing.js'; 4 | import { 5 | generateToken, 6 | updateLastLogin, 7 | updateRefreshToken, 8 | } from '../common/helpers/auth.js'; 9 | import validate from '../common/utils/validation.js'; 10 | import ResponseError from '../common/errors/ResponseError.js'; 11 | import NotFoundError from '../common/errors/NotFoundError.js'; 12 | import usersService from '../users/users.service.js'; 13 | 14 | const register = async (payload) => { 15 | const data = await validate(createUserSchema, payload); 16 | 17 | const isEmailExists = await usersService.findByEmail(data.email); 18 | if (isEmailExists) throw new ResponseError('Email already exists', 400); 19 | 20 | const user = await usersService.create(data); 21 | 22 | const { accessToken, refreshToken } = await generateToken(user); 23 | await updateRefreshToken(user.id, refreshToken); 24 | await updateLastLogin(user.id); 25 | 26 | return { accessToken, refreshToken }; 27 | }; 28 | 29 | const login = async (payload) => { 30 | const data = await validate(loginSchema, payload); 31 | 32 | const user = await usersService.findByEmail(data.email); 33 | if (!user) throw new NotFoundError('Email or password is incorrect'); 34 | 35 | const isPasswordMatch = await compare(data.password, user.password); 36 | if (!isPasswordMatch) { 37 | throw new ResponseError('Email or password is incorrect', 400); 38 | } 39 | 40 | const { accessToken, refreshToken } = await generateToken(user); 41 | await updateRefreshToken(user.id, refreshToken); 42 | await updateLastLogin(user.id); 43 | 44 | return { accessToken, refreshToken }; 45 | }; 46 | 47 | export default { register, login }; 48 | -------------------------------------------------------------------------------- /src/users/users.controller.js: -------------------------------------------------------------------------------- 1 | import usersService from './users.service.js'; 2 | import Response from '../common/utils/Response.js'; 3 | import logger from '../common/utils/logging.js'; 4 | 5 | const response = new Response(); 6 | 7 | const create = async (req, res, next) => { 8 | try { 9 | const data = await usersService.create(req.body); 10 | 11 | logger.info(`Data has been created successfully: ${data.id}`); 12 | 13 | res 14 | .status(201) 15 | .location(`/users/${data.id}`) 16 | .json( 17 | response.success({ 18 | code: 201, 19 | message: 'Data has been created successfully', 20 | data, 21 | }), 22 | ); 23 | } catch (error) { 24 | next(error); 25 | } 26 | }; 27 | 28 | const findAll = async (req, res, next) => { 29 | try { 30 | const limit = req.query.limit || 10; 31 | const page = req.query.page || 1; 32 | 33 | const data = await usersService.findAll(limit, page); 34 | const totalData = await usersService.count(); 35 | 36 | logger.info('Data has been retrieved successfully'); 37 | 38 | res.status(200).json( 39 | response.getDataWithPagination({ 40 | code: 200, 41 | message: 'Data has been retrieved successfully', 42 | data, 43 | totalData, 44 | totalPage: Math.ceil(totalData / limit), 45 | limit, 46 | page, 47 | }), 48 | ); 49 | } catch (error) { 50 | next(error); 51 | } 52 | }; 53 | 54 | const findById = async (req, res, next) => { 55 | try { 56 | const data = await usersService.findById(req.params.id); 57 | 58 | logger.info(`Detail Data has been retrieved successfully: ${data.id}`); 59 | 60 | res.status(200).json( 61 | response.success({ 62 | code: 200, 63 | message: 'Data has been retrieved successfully', 64 | data, 65 | }), 66 | ); 67 | } catch (error) { 68 | next(error); 69 | } 70 | }; 71 | 72 | export default { create, findAll, findById }; 73 | -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? 5 | // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init 6 | 7 | generator client { 8 | provider = "prisma-client-js" 9 | } 10 | 11 | datasource db { 12 | provider = "mysql" 13 | url = env("DATABASE_URL") 14 | } 15 | 16 | model User { 17 | id String @id @default(uuid()) 18 | name String @db.VarChar(100) 19 | email String @db.VarChar(255) @unique 20 | password String @db.VarChar(255) 21 | role UserRole @default(USER) 22 | lastLogin DateTime? @db.Timestamp 23 | refreshToken String? @db.VarChar(255) 24 | assesments Assesment[] 25 | createdAt DateTime @default(now()) 26 | updatedAt DateTime @updatedAt 27 | 28 | @@map("users") 29 | } 30 | 31 | model Assesment { 32 | id String @id @default(uuid()) 33 | userId String 34 | scoreDiet Float @db.Float 35 | scorePhysicalActivity Float @db.Float 36 | scoreMentalHealth Float @db.Float 37 | totalScore Float? @db.Float 38 | user User @relation(fields: [userId], references: [id]) 39 | createdAt DateTime @default(now()) 40 | updatedAt DateTime @updatedAt 41 | 42 | @@map("assesments") 43 | } 44 | 45 | model Question { 46 | id String @id @default(uuid()) 47 | question String @db.VarChar(255) 48 | category CategoryType 49 | options String @db.VarChar(255) 50 | createdAt DateTime @default(now()) 51 | updatedAt DateTime @updatedAt 52 | 53 | @@map("questions") 54 | } 55 | 56 | enum CategoryType { 57 | DIET 58 | PHYSICAL_ACTIVITY 59 | MENTAL_HEALTH 60 | } 61 | 62 | enum UserRole { 63 | USER 64 | ADMIN 65 | } -------------------------------------------------------------------------------- /src/users/users.service.js: -------------------------------------------------------------------------------- 1 | import { 2 | createUserSchema, 3 | getAllUserSchema, 4 | getUserByEmailSchema, 5 | getUserByIdSchema, 6 | } from './users.validation.js'; 7 | import { hash } from '../common/utils/hashing.js'; 8 | import validate from '../common/utils/validation.js'; 9 | import prisma from '../common/utils/database.js'; 10 | import ResponseError from '../common/errors/ResponseError.js'; 11 | 12 | const create = async (payload) => { 13 | const data = await validate(createUserSchema, payload); 14 | const hashedPassword = await hash(data.password); 15 | 16 | const user = await prisma.user.create({ 17 | data: { 18 | name: data.name, 19 | email: data.email, 20 | password: hashedPassword, 21 | }, 22 | select: { 23 | id: true, 24 | name: true, 25 | email: true, 26 | createdAt: true, 27 | }, 28 | }); 29 | 30 | return user; 31 | }; 32 | 33 | const findAll = async (limit, page) => { 34 | const data = await validate(getAllUserSchema, { limit, page }); 35 | const skip = (data.page - 1) * data.limit; 36 | const users = await prisma.user.findMany({ 37 | skip, 38 | take: data.limit, 39 | orderBy: { name: 'asc' }, 40 | select: { 41 | id: true, 42 | name: true, 43 | email: true, 44 | createdAt: true, 45 | updatedAt: true, 46 | }, 47 | }); 48 | 49 | if (!users || users.length < 1) { 50 | throw new ResponseError('Users not found', 404); 51 | } 52 | 53 | return users; 54 | }; 55 | 56 | const findByEmail = async (email) => { 57 | const data = await validate(getUserByEmailSchema, { email }); 58 | 59 | const user = await prisma.user.findUnique({ 60 | where: { email: data.email }, 61 | }); 62 | 63 | return user; 64 | }; 65 | 66 | const findById = async (id) => { 67 | const data = await validate(getUserByIdSchema, { id }); 68 | 69 | const user = await prisma.user.findUnique({ 70 | where: { id: data.id }, 71 | }); 72 | 73 | return user; 74 | }; 75 | 76 | const count = async () => { 77 | const count = await prisma.user.count(); 78 | return count; 79 | }; 80 | 81 | export default { create, findAll, findByEmail, findById, count }; 82 | -------------------------------------------------------------------------------- /src/questions/questions.service.js: -------------------------------------------------------------------------------- 1 | import { 2 | createQuestionSchema, 3 | getQuestionsSchema, 4 | updateQuestionSchema, 5 | } from './questions.validation.js'; 6 | import validate from '../common/utils/validation.js'; 7 | import prisma from '../common/utils/database.js'; 8 | import NotFoundError from '../common/errors/NotFoundError.js'; 9 | 10 | const create = async (payload) => { 11 | const data = await validate(createQuestionSchema, payload); 12 | 13 | if (Array.isArray(data.options)) { 14 | data.options = data.options.join(','); 15 | } 16 | 17 | const question = await prisma.question.create({ 18 | data: { 19 | question: data.question, 20 | category: data.category, 21 | options: data.options, 22 | }, 23 | }); 24 | 25 | return question; 26 | }; 27 | 28 | const findAll = async (limit, page) => { 29 | const data = await validate(getQuestionsSchema, { limit, page }); 30 | const skip = (data.page - 1) * data.limit; 31 | const results = await prisma.question.findMany({ 32 | skip, 33 | take: data.limit, 34 | orderBy: { category: 'asc' }, 35 | }); 36 | 37 | const totalData = await prisma.question.count(); 38 | 39 | if (!results || results.length < 1) { 40 | throw new NotFoundError('Questions not found'); 41 | } 42 | 43 | results.forEach((result) => { 44 | result.options = result.options.split(','); 45 | }); 46 | 47 | return { results, totalData }; 48 | }; 49 | 50 | const update = async (id, payload) => { 51 | const data = await validate(updateQuestionSchema, { id, ...payload }); 52 | 53 | const isQuestionExist = await prisma.question.findUnique({ 54 | where: { id: data.id }, 55 | }); 56 | 57 | if (!isQuestionExist) { 58 | throw new NotFoundError('Question not found'); 59 | } 60 | 61 | if (Array.isArray(data.questions)) { 62 | data.questions = data.questions.join(','); 63 | } 64 | 65 | const question = await prisma.question.update({ 66 | where: { id: data.id }, 67 | data: { 68 | question: data.question, 69 | category: data.category, 70 | options: data.options, 71 | }, 72 | }); 73 | 74 | return question; 75 | }; 76 | 77 | const remove = async (id) => { 78 | const question = await prisma.question.delete({ 79 | where: { id }, 80 | }); 81 | 82 | return question; 83 | }; 84 | 85 | export default { 86 | create, 87 | findAll, 88 | update, 89 | remove, 90 | }; 91 | -------------------------------------------------------------------------------- /src/questions/questions.controller.js: -------------------------------------------------------------------------------- 1 | import questionService from './questions.service.js'; 2 | import Response from '../common/utils/Response.js'; 3 | import logger from '../common/utils/logging.js'; 4 | 5 | const response = new Response(); 6 | 7 | const create = async (req, res, next) => { 8 | try { 9 | const result = await questionService.create(req.body); 10 | 11 | logger.info(`Question with id ${result.id} has been created successfully`); 12 | 13 | res.status(201).json( 14 | response.success({ 15 | code: 201, 16 | message: 'Question has been created successfully', 17 | data: result, 18 | }), 19 | ); 20 | } catch (error) { 21 | next(error); 22 | } 23 | }; 24 | 25 | const findAll = async (req, res, next) => { 26 | try { 27 | const limit = +req.query.limit || 10; 28 | const page = +req.query.page || 1; 29 | 30 | const { results, totalData } = await questionService.findAll(limit, page); 31 | 32 | logger.info('Questions has been retrieved successfully'); 33 | 34 | res.status(200).json( 35 | response.getDataWithPagination({ 36 | code: 200, 37 | message: 'Questions has been retrieved successfully', 38 | data: results, 39 | totalData, 40 | totalPage: Math.ceil(totalData / limit), 41 | limit: limit, 42 | page: page, 43 | }), 44 | ); 45 | } catch (error) { 46 | next(error); 47 | } 48 | }; 49 | 50 | const update = async (req, res, next) => { 51 | try { 52 | const { id } = req.params; 53 | const result = await questionService.update(id, req.body); 54 | 55 | logger.info(`Question with id ${id} has been updated successfully`); 56 | 57 | res.status(200).json( 58 | response.success({ 59 | code: 200, 60 | message: 'Question has been updated successfully', 61 | data: result, 62 | }), 63 | ); 64 | } catch (error) { 65 | next(error); 66 | } 67 | }; 68 | 69 | const remove = async (req, res, next) => { 70 | try { 71 | const { id } = req.params; 72 | const result = await questionService.remove(id); 73 | 74 | logger.info(`Question with id ${id} has been deleted successfully`); 75 | 76 | res.status(200).json( 77 | response.success({ 78 | code: 200, 79 | message: 'Question has been deleted successfully', 80 | data: result, 81 | }), 82 | ); 83 | } catch (error) { 84 | next(error); 85 | } 86 | }; 87 | 88 | export default { 89 | create, 90 | findAll, 91 | update, 92 | remove, 93 | }; 94 | -------------------------------------------------------------------------------- /src/common/utils/Response.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A class that handles response objects. 3 | * 4 | * @example 5 | * const response = new Response(); 6 | * 7 | * response.success({ code: 200, message: 'Success', data: {} }); 8 | */ 9 | export default class Response { 10 | /** 11 | * Returns a success response object. 12 | * @param {Object} param - The success parameters. 13 | * @param {number} param.code - The response code. 14 | * @param {string} param.message - The response message. 15 | * @param {Array} param.data - The response data. 16 | * 17 | * @return {Object} - The success response object. 18 | */ 19 | success({ code, message, data }) { 20 | return { 21 | status: true, 22 | code, 23 | message, 24 | data, 25 | }; 26 | } 27 | 28 | /** 29 | * Returns an error response object. 30 | * @param {Object} param - The error parameters. 31 | * @param {number} param.code - The response code. 32 | * @param {string} param.error - The error message. 33 | * @param {any} param.data - The response data. 34 | * 35 | * @return {Object} - The error response object. 36 | */ 37 | error({ code, error, data }) { 38 | return { 39 | status: false, 40 | code, 41 | error, 42 | data, 43 | }; 44 | } 45 | 46 | /** 47 | * Returns a response object with pagination data. 48 | * @param {Object} param - The parameters. 49 | * @param {number} param.code - The response code. 50 | * @param {string} param.message - The response message. 51 | * @param {Array} param.data - The response data. 52 | * @param {number} param.totalData - The total number of data. 53 | * @param {number} param.totalPage - The total number of pages. 54 | * @param {number} param.page - The current page. 55 | * @param {number} param.limit - The number of data per page. 56 | * 57 | * @return {Object} - The response object with pagination data. 58 | */ 59 | getDataWithPagination({ 60 | code, 61 | message, 62 | data, 63 | totalData, 64 | totalPage, 65 | page, 66 | limit, 67 | }) { 68 | return { 69 | status: true, 70 | code, 71 | message, 72 | data, 73 | meta: { 74 | totalData, 75 | totalPage, 76 | page, 77 | limit, 78 | }, 79 | }; 80 | } 81 | 82 | /** 83 | * Returns a response object with no data. 84 | * 85 | * @param {Object} param - The parameters. 86 | * @param {boolean} param.status - The status of the response. 87 | * @param {number} param.code - The response code. 88 | * @param {string} param.message - The response message. 89 | * 90 | * @return {Object} - The response object with no data. 91 | */ 92 | noData({ status, code, message }) { 93 | return { 94 | status, 95 | code, 96 | message, 97 | }; 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/assesment/assesment.controller.js: -------------------------------------------------------------------------------- 1 | import assesmentService from './assesment.service.js'; 2 | import Response from '../common/utils/Response.js'; 3 | import logger from '../common/utils/logging.js'; 4 | 5 | const response = new Response(); 6 | 7 | const create = async (req, res, next) => { 8 | try { 9 | const { user } = res.locals; 10 | 11 | const data = { 12 | ...req.body, 13 | userId: user.id, 14 | }; 15 | 16 | const result = await assesmentService.create(data); 17 | 18 | logger.info(`User ${user.id} created an assessment with id ${result.id}`); 19 | 20 | res.status(201).json( 21 | response.success({ 22 | code: 201, 23 | message: 'Assessment has been created successfully', 24 | data: result, 25 | }), 26 | ); 27 | } catch (error) { 28 | next(error); 29 | } 30 | }; 31 | 32 | const findDetailByUserId = async (req, res, next) => { 33 | try { 34 | const { user } = res.locals; 35 | 36 | const result = await assesmentService.findDetailByUserId(user.id); 37 | 38 | logger.info(`User ${user.id} retrieved an assessment with id ${result.id}`); 39 | 40 | res.status(200).json( 41 | response.success({ 42 | code: 200, 43 | message: 'Assessment has been retrieved successfully', 44 | data: result, 45 | }), 46 | ); 47 | } catch (error) { 48 | next(error); 49 | } 50 | }; 51 | 52 | const findAllByUserId = async (req, res, next) => { 53 | try { 54 | const { user } = res.locals; 55 | 56 | const payload = { 57 | limit: +req.query.limit || 10, 58 | page: +req.query.page || 1, 59 | userId: user.id, 60 | }; 61 | 62 | const { result, totalData } = 63 | await assesmentService.findAllByUserId(payload); 64 | 65 | logger.info(`User ${user.id} retrieved all assessments`); 66 | 67 | res.status(200).json( 68 | response.getDataWithPagination({ 69 | code: 200, 70 | message: 'Assessment has been retrieved successfully', 71 | data: result, 72 | totalData, 73 | totalPage: Math.ceil(totalData / payload.limit), 74 | limit: payload.limit, 75 | page: payload.page, 76 | }), 77 | ); 78 | } catch (error) { 79 | next(error); 80 | } 81 | }; 82 | 83 | const destroy = async (req, res, next) => { 84 | try { 85 | const { user } = res.locals; 86 | const { id } = req.params; 87 | 88 | await assesmentService.destroy(user.id, id); 89 | 90 | logger.info(`User ${user.id} deleted an assessment with id ${id}`); 91 | 92 | res.status(200).json( 93 | response.noData({ 94 | status: true, 95 | code: 200, 96 | message: 'Assessment has been deleted successfully', 97 | }), 98 | ); 99 | } catch (error) { 100 | next(error); 101 | } 102 | }; 103 | 104 | export default { create, findDetailByUserId, findAllByUserId, destroy }; 105 | -------------------------------------------------------------------------------- /src/auth/auth.route.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import authController from './auth.controller.js'; 3 | 4 | const router = Router(); 5 | 6 | /** 7 | * @swagger 8 | * tags: 9 | * name: Auth 10 | * description: Authentication endpoints 11 | * 12 | * components: 13 | * schemas: 14 | * UserRegister: 15 | * type: object 16 | * properties: 17 | * name: 18 | * type: string 19 | * description: User's name 20 | * email: 21 | * type: string 22 | * format: email 23 | * description: User's email address 24 | * password: 25 | * type: string 26 | * format: password 27 | * description: User's password 28 | * required: 29 | * - name 30 | * - email 31 | * - password 32 | * UserLogin: 33 | * type: object 34 | * properties: 35 | * email: 36 | * type: string 37 | * format: email 38 | * description: User's email address 39 | * password: 40 | * type: string 41 | * format: password 42 | * description: User's password 43 | * required: 44 | * - email 45 | * - password 46 | * Response: 47 | * type: object 48 | * properties: 49 | * status: 50 | * type: boolean 51 | * code: 52 | * type: number 53 | * example: 200 54 | * message: 55 | * type: string 56 | * data: 57 | * type: object 58 | * properties: 59 | * accessToken: 60 | * type: string 61 | * description: Access token for user authentication 62 | * refreshToken: 63 | * type: string 64 | * description: Refresh token for user authentication 65 | * 66 | * /auth/register: 67 | * post: 68 | * summary: Register a new user 69 | * tags: [Auth] 70 | * description: Register a new user with provided details 71 | * requestBody: 72 | * required: true 73 | * content: 74 | * application/json: 75 | * schema: 76 | * $ref: '#/components/schemas/UserRegister' 77 | * responses: 78 | * '201': 79 | * description: User successfully registered 80 | * content: 81 | * application/json: 82 | * schema: 83 | * $ref: '#/components/schemas/Response' 84 | * 85 | * /auth/login: 86 | * post: 87 | * summary: Login user 88 | * tags: [Auth] 89 | * description: Login user with provided credentials 90 | * requestBody: 91 | * required: true 92 | * content: 93 | * application/json: 94 | * schema: 95 | * $ref: '#/components/schemas/UserLogin' 96 | * responses: 97 | * '200': 98 | * description: Successful login 99 | * content: 100 | * application/json: 101 | * schema: 102 | * $ref: '#/components/schemas/Response' 103 | */ 104 | router.post('/register', authController.register); 105 | router.post('/login', authController.login); 106 | 107 | export default router; 108 | -------------------------------------------------------------------------------- /src/assesment/assesment.service.js: -------------------------------------------------------------------------------- 1 | import { 2 | berikanUmpanBalik, 3 | calculateAssessmentResult, 4 | calculateAverage, 5 | } from '../common/helpers/assesment.js'; 6 | import { 7 | createAssesmentSchema, 8 | findAllAssessmentSchema, 9 | findAssessmentByUserIdSchema, 10 | } from './assesment.validation.js'; 11 | import validate from '../common/utils/validation.js'; 12 | import prisma from '../common/utils/database.js'; 13 | import NotFoundError from '../common/errors/NotFoundError.js'; 14 | import AuthorizationError from '../common/errors/AuthorizationError.js'; 15 | 16 | const create = async (payload) => { 17 | const data = await validate(createAssesmentSchema, payload); 18 | 19 | const skorMakanan = calculateAverage(data.makanan); 20 | const skorAktivitas = calculateAverage(data.aktivitas); 21 | const skorMental = calculateAverage(data.mental); 22 | 23 | const result = calculateAssessmentResult( 24 | skorMakanan, 25 | skorAktivitas, 26 | skorMental, 27 | ); 28 | 29 | const feedback = berikanUmpanBalik(skorMakanan, skorAktivitas, skorMental); 30 | 31 | const assesment = await prisma.assesment.create({ 32 | data: { 33 | userId: data.userId, 34 | scoreDiet: skorMakanan, 35 | scorePhysicalActivity: skorAktivitas, 36 | scoreMentalHealth: skorMental, 37 | totalScore: result, 38 | }, 39 | }); 40 | 41 | return { ...assesment, totalScore: result, feedback }; 42 | }; 43 | 44 | const findDetailByUserId = async (userId) => { 45 | const data = await validate(findAssessmentByUserIdSchema, userId); 46 | 47 | const result = await prisma.assesment.findFirst({ 48 | where: { 49 | userId: data, 50 | }, 51 | orderBy: { 52 | updatedAt: 'desc', 53 | }, 54 | }); 55 | 56 | if (!result) throw new NotFoundError('User belum melakukan assesment'); 57 | 58 | return result; 59 | }; 60 | 61 | const findAllByUserId = async (payload) => { 62 | const data = await validate(findAllAssessmentSchema, payload); 63 | const skip = (data.page - 1) * data.limit; 64 | 65 | const result = await prisma.assesment.findMany({ 66 | where: { 67 | userId: data.userId, 68 | }, 69 | skip, 70 | take: data.limit, 71 | orderBy: { 72 | updatedAt: 'desc', 73 | }, 74 | }); 75 | 76 | if (!result) throw new NotFoundError('User belum melakukan assesment'); 77 | 78 | const totalData = await prisma.assesment.count({ 79 | where: { 80 | userId: data.userId, 81 | }, 82 | }); 83 | 84 | return { result, totalData }; 85 | }; 86 | 87 | const destroy = async (userId, assesmentId) => { 88 | const id = await validate(findAssessmentByUserIdSchema, assesmentId); 89 | 90 | const assesment = await prisma.assesment.findFirst({ 91 | where: { 92 | id, 93 | }, 94 | }); 95 | 96 | if (!assesment) throw new NotFoundError('Assesment tidak ditemukan'); 97 | if (assesment.userId !== userId) 98 | throw new AuthorizationError( 99 | 'Anda tidak memiliki akses untuk menghapus assesment ini', 100 | ); 101 | 102 | const result = await prisma.assesment.delete({ 103 | where: { 104 | id, 105 | }, 106 | }); 107 | 108 | return result; 109 | }; 110 | 111 | export default { create, findDetailByUserId, findAllByUserId, destroy }; 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HealthPlus API 2 | 3 | **Health Plus API | Micro Challenge Project | Celerates Acceleration Program - Web Development & UI/UX Design** 4 | 5 | ## Research 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 28 | 29 | 30 | 33 | 34 |
Big IdeaHealthly Lifestyle
Problem Statement 15 | Remaja dewasa di Indonesia kesulitan dalam menjaga pola makan karena berbagai faktor, seperti sulitnya mendapatkan informasi tentang pola makan yang sehat. Maka dari itu kebanyakan remaja menjalani pola makan yang tidak sehat. Dimana Pola makan buruk yang dapat terjadi karena beberapa faktor seperti, di rumah, di sekolah, di tempat makan cepat saji, dan di lingkungan sosial remaja. Namun pengaruh tersebut juga dapat disebabkan oleh teman sebaya, keluarga, dan lingkungan sekolah. Solusi untuk masalah ini akan membantu remaja meningkatkan kesehatan dan kualitas hidup mereka, kemudian untuk mencegah penyakit terkait gizi buruk di masa depan, serta membentuk kebiasaan makan yang sehat sejak dini. Menjaga pola makan yang sehat dengan gizi yang seimbang sangat penting untuk membantu menjaga sistem daya tahan tubuh. 16 |
Target UserRemaja Dewasa (12 - 19yo)
Final Solution Concepts 25 | Membantu remaja di Indonesia untuk mendapatkan informasi yang dapat diakses melalui internet dalam mengembangkan dan meningkatkan mutu pola gaya hidup sehat (healthy lifestyle) demi keberlangsungan hidup yang lebih baik dari sebelumnya, agar terhindar dari penyakit maupun hal-hal yang tidak diinginkan di masa yang akan datang. 26 |
Web Statement 31 | Sebuah website yang menyediakan informasi terpercaya mengenai healthy lifestyle yang mudah diakses untuk berbagai kalangan mulai dari remaja hingga orang dewasa. Website ini mengutamakan kemudahan dan kenyamanan user/pengguna. 32 |
35 | 36 | ## Development 37 | 38 | ### Tech Stack 39 | 40 | - **Frontend** 41 | - ReactJS 42 | - TailwindCSS 43 | - **Backend** 44 | - NodeJS 45 | - ExpressJS 46 | - MySQL 47 | 48 | ### Frontend Repository 49 | 50 | [GitHub - Hizkia Reppi](https://github.com/HizkiaReppi/health-plus) 51 | 52 | ### API Documentation 53 | 54 | BASEURL/api-docs 55 | 56 | ## Team Members (7Teen) 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 70 | 73 | 76 | 79 | 82 | 83 | 84 | 87 | 90 | 93 | 96 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 |
Hizkia Jefren ReppiGrace Natalia ZalukhuCitra Dewi Puspita SariNasywa Zafirah SyahraniBintang Mahaputra Ramadhan
68 | 69 | 71 | 72 | 74 | 75 | 77 | 78 | 80 | 81 |
85 | Hizkia Jefren Reppi 86 | 88 | Grace Natalia Zalukhu 89 | 91 | Citra Dewi Puspita Sari 92 | 94 | Nasywa Zafirah Syahrani 95 | 97 | Bintang Mahaputra Ramadhan 98 |
ProgrammerProgrammerUI/UX DesignerUI/UX DesignerProject Manager
108 | 109 | _Health Plus - Powered by 7Teen_ 110 | -------------------------------------------------------------------------------- /src/common/helpers/assesment.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Calculates the average of the given array. 3 | * @param {number[]} array - The array of numbers. 4 | * @return {number} The average. 5 | */ 6 | const calculateAverage = (array) => { 7 | const result = array.reduce((acc, curr) => acc + curr, 0) / array.length; 8 | 9 | return parseFloat(result.toFixed(2)); 10 | }; 11 | 12 | /** 13 | * Calculates the assessment result based on the answers. 14 | * @param {number} nutritionScore - The nutrition score. 15 | * @param {number} physicalActivityScore - The physical activity score. 16 | * @param {number} mentalHealthScore - The mental health score. 17 | * @return {number} The assessment result. 18 | */ 19 | const calculateAssessmentResult = ( 20 | nutritionScore, 21 | physicalActivityScore, 22 | mentalHealthScore, 23 | ) => { 24 | const totalScore = 25 | (nutritionScore + physicalActivityScore + mentalHealthScore) / 3; 26 | 27 | return parseFloat(totalScore.toFixed(2)); 28 | }; 29 | 30 | /** 31 | * Determines the description based on the score. 32 | * @param {number} skor - The score. 33 | * @return {string} The description. 34 | */ 35 | function tentukanDeskripsi(skor) { 36 | if (skor >= 4.5) { 37 | return 'Sangat baik'; 38 | } else if (skor >= 3.5) { 39 | return 'Baik'; 40 | } else if (skor >= 2.5) { 41 | return 'Cukup baik'; 42 | } else if (skor >= 1.5) { 43 | return 'Kurang baik'; 44 | } else { 45 | return 'Sangat kurang baik'; 46 | } 47 | } 48 | 49 | /** 50 | * Determines the improvement suggestion based on the description and aspect. 51 | * @param {string} deskripsi - The description. 52 | * @param {string} aspek - The aspect. 53 | * @return {string} The improvement suggestion. 54 | */ 55 | function tentukanImprovement(deskripsi, aspek) { 56 | switch (deskripsi) { 57 | case 'Sangat baik': 58 | return `Anda telah memiliki kebiasaan yang sangat baik dalam ${aspek}.`; 59 | case 'Baik': 60 | return `Anda memiliki kebiasaan yang baik dalam ${aspek}, tetapi masih ada ruang untuk perbaikan.`; 61 | case 'Cukup baik': 62 | return `Anda telah melakukan beberapa hal yang baik dalam ${aspek}, namun masih perlu ditingkatkan.`; 63 | case 'Kurang baik': 64 | return `Anda perlu meningkatkan kebiasaan dalam ${aspek} untuk memperbaiki kesehatan Anda.`; 65 | case 'Sangat kurang baik': 66 | return `Anda harus segera memperbaiki kebiasaan dalam ${aspek} untuk menjaga kesehatan Anda.`; 67 | default: 68 | return 'Tidak ada saran perbaikan yang tersedia.'; 69 | } 70 | } 71 | 72 | /** 73 | * Determines the suggestion based on the description and aspect. 74 | * @param {string} deskripsi - The description. 75 | * @param {string} aspek - The aspect. 76 | * @return {string} The suggestion. 77 | */ 78 | function tentukanSaran(deskripsi, aspek) { 79 | switch (deskripsi) { 80 | case 'Sangat baik': 81 | return 'Pertahankan kebiasaan yang baik dan tingkatkan lagi di area lain jika perlu.'; 82 | case 'Baik': 83 | return 'Lakukan evaluasi terhadap kebiasaan Anda secara berkala dan terus tingkatkan.'; 84 | case 'Cukup baik': 85 | return 'Tetapkan tujuan kebiasaan yang lebih sehat dan lakukan perubahan perlahan-lahan.'; 86 | case 'Kurang baik': 87 | return `Mulailah dengan perubahan kecil untuk meningkatkan kebiasaan Anda dalam ${aspek}.`; 88 | case 'Sangat kurang baik': 89 | return 'Segera lakukan tindakan perbaikan dan pertimbangkan untuk mencari bantuan profesional jika diperlukan.'; 90 | default: 91 | return 'Tidak ada saran khusus yang tersedia.'; 92 | } 93 | } 94 | 95 | /** 96 | * Generates feedback based on the score and aspect. 97 | * @param {number} skor - The score. 98 | * @param {string} aspek - The aspect. 99 | * @return {Object} The feedback object. 100 | */ 101 | function generateFeedback(skor, aspek) { 102 | const deskripsi = tentukanDeskripsi(skor); 103 | const improvement = tentukanImprovement(deskripsi, aspek); 104 | const saran = tentukanSaran(deskripsi, aspek); 105 | 106 | return { skor, deskripsi, improvement, saran }; 107 | } 108 | 109 | /** 110 | * Provides feedback to the user. 111 | * @param {number} skorMakanan - The score for nutrition. 112 | * @param {number} skorAktivitas - The score for `physical activity`. 113 | * @param {number} skorMental - The score for mental health. 114 | * @return {Object} The feedback object. 115 | */ 116 | function berikanUmpanBalik(skorMakanan, skorAktivitas, skorMental) { 117 | const feedbackMakanan = generateFeedback(skorMakanan, 'pola makan'); 118 | const feedbackAktivitas = generateFeedback(skorAktivitas, 'aktivitas fisik'); 119 | const feedbackMental = generateFeedback(skorMental, 'kesehatan mental'); 120 | 121 | return { 122 | makanan: feedbackMakanan, 123 | aktivitas: feedbackAktivitas, 124 | mental: feedbackMental, 125 | }; 126 | } 127 | 128 | export { calculateAverage, calculateAssessmentResult, berikanUmpanBalik }; 129 | -------------------------------------------------------------------------------- /src/users/users.route.js: -------------------------------------------------------------------------------- 1 | import { Router } from 'express'; 2 | import usersController from './users.controller.js'; 3 | import { 4 | isAuthenticate, 5 | isAdmin, 6 | } from '../common/middleware/auth.middleware.js'; 7 | 8 | const router = Router(); 9 | 10 | /** 11 | * @swagger 12 | * tags: 13 | * name: Users 14 | * description: Endpoints for managing users 15 | * components: 16 | * schemas: 17 | * CreateUserRequest: 18 | * type: object 19 | * properties: 20 | * name: 21 | * type: string 22 | * email: 23 | * type: string 24 | * format: email 25 | * password: 26 | * type: string 27 | * format: password 28 | * required: 29 | * - name 30 | * - email 31 | * - password 32 | * GetAllUsersQuery: 33 | * type: object 34 | * properties: 35 | * limit: 36 | * type: number 37 | * page: 38 | * type: number 39 | * CreateDataResponse: 40 | * type: object 41 | * properties: 42 | * status: 43 | * type: boolean 44 | * code: 45 | * type: number 46 | * example: 201 47 | * message: 48 | * type: string 49 | * data: 50 | * type: object 51 | * properties: 52 | * id: 53 | * type: string 54 | * name: 55 | * type: string 56 | * email: 57 | * type: string 58 | * createdAt: 59 | * type: string 60 | * GetAllDataResponse: 61 | * type: object 62 | * properties: 63 | * status: 64 | * type: boolean 65 | * code: 66 | * type: number 67 | * example: 200 68 | * message: 69 | * type: string 70 | * data: 71 | * type: array 72 | * items: 73 | * type: object 74 | * properties: 75 | * id: 76 | * type: string 77 | * name: 78 | * type: string 79 | * email: 80 | * type: string 81 | * createdAt: 82 | * type: string 83 | * updatedAt: 84 | * type: string 85 | * meta: 86 | * type: object 87 | * properties: 88 | * totalData: 89 | * type: number 90 | * totalPage: 91 | * type: number 92 | * page: 93 | * type: number 94 | * limit: 95 | * type: number 96 | * GetDetailDataResponse: 97 | * type: object 98 | * properties: 99 | * status: 100 | * type: boolean 101 | * code: 102 | * type: number 103 | * example: 200 104 | * message: 105 | * type: string 106 | * data: 107 | * type: object 108 | * properties: 109 | * id: 110 | * type: string 111 | * name: 112 | * type: string 113 | * email: 114 | * type: string 115 | * password: 116 | * type: string 117 | * role: 118 | * type: string 119 | * lastLogin: 120 | * type: string 121 | * refreshToken: 122 | * type: string 123 | * createdAt: 124 | * type: string 125 | * updatedAt: 126 | * type: string 127 | * /users: 128 | * post: 129 | * summary: Create a new user 130 | * tags: [Users] 131 | * description: Allows only authenticated admin users to create a new user 132 | * security: 133 | * - bearerAuth: [] 134 | * requestBody: 135 | * required: true 136 | * content: 137 | * application/json: 138 | * schema: 139 | * $ref: '#/components/schemas/CreateUserRequest' 140 | * responses: 141 | * '201': 142 | * description: User created successfully 143 | * content: 144 | * application/json: 145 | * schema: 146 | * $ref: '#/components/schemas/CreateDataResponse' 147 | * '401': 148 | * description: Unauthorized request 149 | * '403': 150 | * description: Forbidden request, user does not have permission 151 | * 152 | * get: 153 | * summary: Get all users 154 | * tags: [Users] 155 | * description: Allows only authenticated users to retrieve all users 156 | * security: 157 | * - bearerAuth: [] 158 | * parameters: 159 | * - in: query 160 | * name: limit 161 | * schema: 162 | * type: number 163 | * - in: query 164 | * name: page 165 | * schema: 166 | * type: number 167 | * responses: 168 | * '200': 169 | * description: Successfully retrieved users 170 | * content: 171 | * application/json: 172 | * schema: 173 | * $ref: '#/components/schemas/GetAllDataResponse' 174 | * '401': 175 | * description: Unauthorized request 176 | * /users/{id}: 177 | * get: 178 | * summary: Get user by ID 179 | * tags: [Users] 180 | * description: Allows only authenticated users to retrieve a user by ID 181 | * security: 182 | * - bearerAuth: [] 183 | * parameters: 184 | * - in: path 185 | * name: id 186 | * required: true 187 | * schema: 188 | * type: string 189 | * description: ID of the user to retrieve 190 | * responses: 191 | * '200': 192 | * description: Successfully retrieved the user 193 | * content: 194 | * application/json: 195 | * schema: 196 | * $ref: '#/components/schemas/GetDetailDataResponse' 197 | * '401': 198 | * description: Unauthorized request 199 | * '404': 200 | * description: User not found 201 | */ 202 | 203 | router.post('/', isAuthenticate, isAdmin, usersController.create); 204 | router.get('/', isAuthenticate, usersController.findAll); 205 | router.get('/:id', isAuthenticate, usersController.findById); 206 | 207 | export default router; 208 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@prisma/client': 9 | specifier: ^5.11.0 10 | version: 5.11.0(prisma@5.11.0) 11 | bcrypt: 12 | specifier: ^5.1.1 13 | version: 5.1.1 14 | body-parser: 15 | specifier: ^1.20.2 16 | version: 1.20.2 17 | cors: 18 | specifier: ^2.8.5 19 | version: 2.8.5 20 | dotenv: 21 | specifier: ^16.4.5 22 | version: 16.4.5 23 | express: 24 | specifier: ^4.18.3 25 | version: 4.18.3 26 | helmet: 27 | specifier: ^7.1.0 28 | version: 7.1.0 29 | joi: 30 | specifier: ^17.12.2 31 | version: 17.12.2 32 | jsonwebtoken: 33 | specifier: ^9.0.2 34 | version: 9.0.2 35 | moment: 36 | specifier: ^2.30.1 37 | version: 2.30.1 38 | swagger-jsdoc: 39 | specifier: ^6.2.8 40 | version: 6.2.8(openapi-types@12.1.3) 41 | swagger-ui-express: 42 | specifier: ^5.0.0 43 | version: 5.0.0(express@4.18.3) 44 | uuid: 45 | specifier: ^9.0.1 46 | version: 9.0.1 47 | winston: 48 | specifier: ^3.12.0 49 | version: 3.12.0 50 | 51 | devDependencies: 52 | '@types/bcrypt': 53 | specifier: ^5.0.2 54 | version: 5.0.2 55 | '@types/express': 56 | specifier: ^4.17.21 57 | version: 4.17.21 58 | '@types/uuid': 59 | specifier: ^9.0.8 60 | version: 9.0.8 61 | eslint: 62 | specifier: ^8.57.0 63 | version: 8.57.0 64 | eslint-config-google: 65 | specifier: ^0.14.0 66 | version: 0.14.0(eslint@8.57.0) 67 | eslint-config-prettier: 68 | specifier: ^9.1.0 69 | version: 9.1.0(eslint@8.57.0) 70 | eslint-plugin-import: 71 | specifier: ^2.29.1 72 | version: 2.29.1(eslint@8.57.0) 73 | eslint-plugin-prettier: 74 | specifier: ^5.1.3 75 | version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) 76 | nodemon: 77 | specifier: ^3.1.0 78 | version: 3.1.0 79 | prettier: 80 | specifier: ^3.2.5 81 | version: 3.2.5 82 | prisma: 83 | specifier: ^5.11.0 84 | version: 5.11.0 85 | 86 | packages: 87 | 88 | /@aashutoshrathi/word-wrap@1.2.6: 89 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 90 | engines: {node: '>=0.10.0'} 91 | dev: true 92 | 93 | /@apidevtools/json-schema-ref-parser@9.1.2: 94 | resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==} 95 | dependencies: 96 | '@jsdevtools/ono': 7.1.3 97 | '@types/json-schema': 7.0.15 98 | call-me-maybe: 1.0.2 99 | js-yaml: 4.1.0 100 | dev: false 101 | 102 | /@apidevtools/openapi-schemas@2.1.0: 103 | resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} 104 | engines: {node: '>=10'} 105 | dev: false 106 | 107 | /@apidevtools/swagger-methods@3.0.2: 108 | resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} 109 | dev: false 110 | 111 | /@apidevtools/swagger-parser@10.0.3(openapi-types@12.1.3): 112 | resolution: {integrity: sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==} 113 | peerDependencies: 114 | openapi-types: '>=7' 115 | dependencies: 116 | '@apidevtools/json-schema-ref-parser': 9.1.2 117 | '@apidevtools/openapi-schemas': 2.1.0 118 | '@apidevtools/swagger-methods': 3.0.2 119 | '@jsdevtools/ono': 7.1.3 120 | call-me-maybe: 1.0.2 121 | openapi-types: 12.1.3 122 | z-schema: 5.0.5 123 | dev: false 124 | 125 | /@colors/colors@1.6.0: 126 | resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} 127 | engines: {node: '>=0.1.90'} 128 | dev: false 129 | 130 | /@dabh/diagnostics@2.0.3: 131 | resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 132 | dependencies: 133 | colorspace: 1.1.4 134 | enabled: 2.0.0 135 | kuler: 2.0.0 136 | dev: false 137 | 138 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): 139 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 140 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 141 | peerDependencies: 142 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 143 | dependencies: 144 | eslint: 8.57.0 145 | eslint-visitor-keys: 3.4.3 146 | dev: true 147 | 148 | /@eslint-community/regexpp@4.10.0: 149 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 150 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 151 | dev: true 152 | 153 | /@eslint/eslintrc@2.1.4: 154 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 155 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 156 | dependencies: 157 | ajv: 6.12.6 158 | debug: 4.3.4(supports-color@5.5.0) 159 | espree: 9.6.1 160 | globals: 13.24.0 161 | ignore: 5.3.1 162 | import-fresh: 3.3.0 163 | js-yaml: 4.1.0 164 | minimatch: 3.1.2 165 | strip-json-comments: 3.1.1 166 | transitivePeerDependencies: 167 | - supports-color 168 | dev: true 169 | 170 | /@eslint/js@8.57.0: 171 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 172 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 173 | dev: true 174 | 175 | /@hapi/hoek@9.3.0: 176 | resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} 177 | dev: false 178 | 179 | /@hapi/topo@5.1.0: 180 | resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} 181 | dependencies: 182 | '@hapi/hoek': 9.3.0 183 | dev: false 184 | 185 | /@humanwhocodes/config-array@0.11.14: 186 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 187 | engines: {node: '>=10.10.0'} 188 | dependencies: 189 | '@humanwhocodes/object-schema': 2.0.2 190 | debug: 4.3.4(supports-color@5.5.0) 191 | minimatch: 3.1.2 192 | transitivePeerDependencies: 193 | - supports-color 194 | dev: true 195 | 196 | /@humanwhocodes/module-importer@1.0.1: 197 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 198 | engines: {node: '>=12.22'} 199 | dev: true 200 | 201 | /@humanwhocodes/object-schema@2.0.2: 202 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 203 | dev: true 204 | 205 | /@jsdevtools/ono@7.1.3: 206 | resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} 207 | dev: false 208 | 209 | /@mapbox/node-pre-gyp@1.0.11: 210 | resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} 211 | hasBin: true 212 | dependencies: 213 | detect-libc: 2.0.2 214 | https-proxy-agent: 5.0.1 215 | make-dir: 3.1.0 216 | node-fetch: 2.7.0 217 | nopt: 5.0.0 218 | npmlog: 5.0.1 219 | rimraf: 3.0.2 220 | semver: 7.6.0 221 | tar: 6.2.0 222 | transitivePeerDependencies: 223 | - encoding 224 | - supports-color 225 | dev: false 226 | 227 | /@nodelib/fs.scandir@2.1.5: 228 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 229 | engines: {node: '>= 8'} 230 | dependencies: 231 | '@nodelib/fs.stat': 2.0.5 232 | run-parallel: 1.2.0 233 | dev: true 234 | 235 | /@nodelib/fs.stat@2.0.5: 236 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 237 | engines: {node: '>= 8'} 238 | dev: true 239 | 240 | /@nodelib/fs.walk@1.2.8: 241 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 242 | engines: {node: '>= 8'} 243 | dependencies: 244 | '@nodelib/fs.scandir': 2.1.5 245 | fastq: 1.17.1 246 | dev: true 247 | 248 | /@pkgr/core@0.1.1: 249 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 250 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 251 | dev: true 252 | 253 | /@prisma/client@5.11.0(prisma@5.11.0): 254 | resolution: {integrity: sha512-SWshvS5FDXvgJKM/a0y9nDC1rqd7KG0Q6ZVzd+U7ZXK5soe73DJxJJgbNBt2GNXOa+ysWB4suTpdK5zfFPhwiw==} 255 | engines: {node: '>=16.13'} 256 | requiresBuild: true 257 | peerDependencies: 258 | prisma: '*' 259 | peerDependenciesMeta: 260 | prisma: 261 | optional: true 262 | dependencies: 263 | prisma: 5.11.0 264 | dev: false 265 | 266 | /@prisma/debug@5.11.0: 267 | resolution: {integrity: sha512-N6yYr3AbQqaiUg+OgjkdPp3KPW1vMTAgtKX6+BiB/qB2i1TjLYCrweKcUjzOoRM5BriA4idrkTej9A9QqTfl3A==} 268 | 269 | /@prisma/engines-version@5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102: 270 | resolution: {integrity: sha512-WXCuyoymvrS4zLz4wQagSsc3/nE6CHy8znyiMv8RKazKymOMd5o9FP5RGwGHAtgoxd+aB/BWqxuP/Ckfu7/3MA==} 271 | 272 | /@prisma/engines@5.11.0: 273 | resolution: {integrity: sha512-gbrpQoBTYWXDRqD+iTYMirDlF9MMlQdxskQXbhARhG6A/uFQjB7DZMYocMQLoiZXO/IskfDOZpPoZE8TBQKtEw==} 274 | requiresBuild: true 275 | dependencies: 276 | '@prisma/debug': 5.11.0 277 | '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 278 | '@prisma/fetch-engine': 5.11.0 279 | '@prisma/get-platform': 5.11.0 280 | 281 | /@prisma/fetch-engine@5.11.0: 282 | resolution: {integrity: sha512-994viazmHTJ1ymzvWugXod7dZ42T2ROeFuH6zHPcUfp/69+6cl5r9u3NFb6bW8lLdNjwLYEVPeu3hWzxpZeC0w==} 283 | dependencies: 284 | '@prisma/debug': 5.11.0 285 | '@prisma/engines-version': 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102 286 | '@prisma/get-platform': 5.11.0 287 | 288 | /@prisma/get-platform@5.11.0: 289 | resolution: {integrity: sha512-rxtHpMLxNTHxqWuGOLzR2QOyQi79rK1u1XYAVLZxDGTLz/A+uoDnjz9veBFlicrpWjwuieM4N6jcnjj/DDoidw==} 290 | dependencies: 291 | '@prisma/debug': 5.11.0 292 | 293 | /@sideway/address@4.1.5: 294 | resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} 295 | dependencies: 296 | '@hapi/hoek': 9.3.0 297 | dev: false 298 | 299 | /@sideway/formula@3.0.1: 300 | resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} 301 | dev: false 302 | 303 | /@sideway/pinpoint@2.0.0: 304 | resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} 305 | dev: false 306 | 307 | /@types/bcrypt@5.0.2: 308 | resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} 309 | dependencies: 310 | '@types/node': 20.11.28 311 | dev: true 312 | 313 | /@types/body-parser@1.19.5: 314 | resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 315 | dependencies: 316 | '@types/connect': 3.4.38 317 | '@types/node': 20.11.28 318 | dev: true 319 | 320 | /@types/connect@3.4.38: 321 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 322 | dependencies: 323 | '@types/node': 20.11.28 324 | dev: true 325 | 326 | /@types/express-serve-static-core@4.17.43: 327 | resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} 328 | dependencies: 329 | '@types/node': 20.11.28 330 | '@types/qs': 6.9.12 331 | '@types/range-parser': 1.2.7 332 | '@types/send': 0.17.4 333 | dev: true 334 | 335 | /@types/express@4.17.21: 336 | resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} 337 | dependencies: 338 | '@types/body-parser': 1.19.5 339 | '@types/express-serve-static-core': 4.17.43 340 | '@types/qs': 6.9.12 341 | '@types/serve-static': 1.15.5 342 | dev: true 343 | 344 | /@types/http-errors@2.0.4: 345 | resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} 346 | dev: true 347 | 348 | /@types/json-schema@7.0.15: 349 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 350 | dev: false 351 | 352 | /@types/json5@0.0.29: 353 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 354 | dev: true 355 | 356 | /@types/mime@1.3.5: 357 | resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} 358 | dev: true 359 | 360 | /@types/mime@3.0.4: 361 | resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} 362 | dev: true 363 | 364 | /@types/node@20.11.28: 365 | resolution: {integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==} 366 | dependencies: 367 | undici-types: 5.26.5 368 | dev: true 369 | 370 | /@types/qs@6.9.12: 371 | resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} 372 | dev: true 373 | 374 | /@types/range-parser@1.2.7: 375 | resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} 376 | dev: true 377 | 378 | /@types/send@0.17.4: 379 | resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} 380 | dependencies: 381 | '@types/mime': 1.3.5 382 | '@types/node': 20.11.28 383 | dev: true 384 | 385 | /@types/serve-static@1.15.5: 386 | resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} 387 | dependencies: 388 | '@types/http-errors': 2.0.4 389 | '@types/mime': 3.0.4 390 | '@types/node': 20.11.28 391 | dev: true 392 | 393 | /@types/triple-beam@1.3.5: 394 | resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} 395 | dev: false 396 | 397 | /@types/uuid@9.0.8: 398 | resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} 399 | dev: true 400 | 401 | /@ungap/structured-clone@1.2.0: 402 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 403 | dev: true 404 | 405 | /abbrev@1.1.1: 406 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 407 | 408 | /accepts@1.3.8: 409 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 410 | engines: {node: '>= 0.6'} 411 | dependencies: 412 | mime-types: 2.1.35 413 | negotiator: 0.6.3 414 | dev: false 415 | 416 | /acorn-jsx@5.3.2(acorn@8.11.3): 417 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 418 | peerDependencies: 419 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 420 | dependencies: 421 | acorn: 8.11.3 422 | dev: true 423 | 424 | /acorn@8.11.3: 425 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 426 | engines: {node: '>=0.4.0'} 427 | hasBin: true 428 | dev: true 429 | 430 | /agent-base@6.0.2: 431 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 432 | engines: {node: '>= 6.0.0'} 433 | dependencies: 434 | debug: 4.3.4(supports-color@5.5.0) 435 | transitivePeerDependencies: 436 | - supports-color 437 | dev: false 438 | 439 | /ajv@6.12.6: 440 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 441 | dependencies: 442 | fast-deep-equal: 3.1.3 443 | fast-json-stable-stringify: 2.1.0 444 | json-schema-traverse: 0.4.1 445 | uri-js: 4.4.1 446 | dev: true 447 | 448 | /ansi-regex@5.0.1: 449 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 450 | engines: {node: '>=8'} 451 | 452 | /ansi-styles@4.3.0: 453 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 454 | engines: {node: '>=8'} 455 | dependencies: 456 | color-convert: 2.0.1 457 | dev: true 458 | 459 | /anymatch@3.1.3: 460 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 461 | engines: {node: '>= 8'} 462 | dependencies: 463 | normalize-path: 3.0.0 464 | picomatch: 2.3.1 465 | dev: true 466 | 467 | /aproba@2.0.0: 468 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} 469 | dev: false 470 | 471 | /are-we-there-yet@2.0.0: 472 | resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} 473 | engines: {node: '>=10'} 474 | dependencies: 475 | delegates: 1.0.0 476 | readable-stream: 3.6.2 477 | dev: false 478 | 479 | /argparse@2.0.1: 480 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 481 | 482 | /array-buffer-byte-length@1.0.1: 483 | resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 484 | engines: {node: '>= 0.4'} 485 | dependencies: 486 | call-bind: 1.0.7 487 | is-array-buffer: 3.0.4 488 | dev: true 489 | 490 | /array-flatten@1.1.1: 491 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 492 | dev: false 493 | 494 | /array-includes@3.1.7: 495 | resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} 496 | engines: {node: '>= 0.4'} 497 | dependencies: 498 | call-bind: 1.0.7 499 | define-properties: 1.2.1 500 | es-abstract: 1.22.5 501 | get-intrinsic: 1.2.4 502 | is-string: 1.0.7 503 | dev: true 504 | 505 | /array.prototype.filter@1.0.3: 506 | resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} 507 | engines: {node: '>= 0.4'} 508 | dependencies: 509 | call-bind: 1.0.7 510 | define-properties: 1.2.1 511 | es-abstract: 1.22.5 512 | es-array-method-boxes-properly: 1.0.0 513 | is-string: 1.0.7 514 | dev: true 515 | 516 | /array.prototype.findlastindex@1.2.4: 517 | resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} 518 | engines: {node: '>= 0.4'} 519 | dependencies: 520 | call-bind: 1.0.7 521 | define-properties: 1.2.1 522 | es-abstract: 1.22.5 523 | es-errors: 1.3.0 524 | es-shim-unscopables: 1.0.2 525 | dev: true 526 | 527 | /array.prototype.flat@1.3.2: 528 | resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 529 | engines: {node: '>= 0.4'} 530 | dependencies: 531 | call-bind: 1.0.7 532 | define-properties: 1.2.1 533 | es-abstract: 1.22.5 534 | es-shim-unscopables: 1.0.2 535 | dev: true 536 | 537 | /array.prototype.flatmap@1.3.2: 538 | resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} 539 | engines: {node: '>= 0.4'} 540 | dependencies: 541 | call-bind: 1.0.7 542 | define-properties: 1.2.1 543 | es-abstract: 1.22.5 544 | es-shim-unscopables: 1.0.2 545 | dev: true 546 | 547 | /arraybuffer.prototype.slice@1.0.3: 548 | resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} 549 | engines: {node: '>= 0.4'} 550 | dependencies: 551 | array-buffer-byte-length: 1.0.1 552 | call-bind: 1.0.7 553 | define-properties: 1.2.1 554 | es-abstract: 1.22.5 555 | es-errors: 1.3.0 556 | get-intrinsic: 1.2.4 557 | is-array-buffer: 3.0.4 558 | is-shared-array-buffer: 1.0.3 559 | dev: true 560 | 561 | /async@3.2.5: 562 | resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} 563 | dev: false 564 | 565 | /available-typed-arrays@1.0.7: 566 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 567 | engines: {node: '>= 0.4'} 568 | dependencies: 569 | possible-typed-array-names: 1.0.0 570 | dev: true 571 | 572 | /balanced-match@1.0.2: 573 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 574 | 575 | /bcrypt@5.1.1: 576 | resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} 577 | engines: {node: '>= 10.0.0'} 578 | requiresBuild: true 579 | dependencies: 580 | '@mapbox/node-pre-gyp': 1.0.11 581 | node-addon-api: 5.1.0 582 | transitivePeerDependencies: 583 | - encoding 584 | - supports-color 585 | dev: false 586 | 587 | /binary-extensions@2.3.0: 588 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 589 | engines: {node: '>=8'} 590 | dev: true 591 | 592 | /body-parser@1.20.2: 593 | resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} 594 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 595 | dependencies: 596 | bytes: 3.1.2 597 | content-type: 1.0.5 598 | debug: 2.6.9 599 | depd: 2.0.0 600 | destroy: 1.2.0 601 | http-errors: 2.0.0 602 | iconv-lite: 0.4.24 603 | on-finished: 2.4.1 604 | qs: 6.11.0 605 | raw-body: 2.5.2 606 | type-is: 1.6.18 607 | unpipe: 1.0.0 608 | transitivePeerDependencies: 609 | - supports-color 610 | dev: false 611 | 612 | /brace-expansion@1.1.11: 613 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 614 | dependencies: 615 | balanced-match: 1.0.2 616 | concat-map: 0.0.1 617 | 618 | /braces@3.0.2: 619 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 620 | engines: {node: '>=8'} 621 | dependencies: 622 | fill-range: 7.0.1 623 | dev: true 624 | 625 | /buffer-equal-constant-time@1.0.1: 626 | resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} 627 | dev: false 628 | 629 | /bytes@3.1.2: 630 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 631 | engines: {node: '>= 0.8'} 632 | dev: false 633 | 634 | /call-bind@1.0.7: 635 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 636 | engines: {node: '>= 0.4'} 637 | dependencies: 638 | es-define-property: 1.0.0 639 | es-errors: 1.3.0 640 | function-bind: 1.1.2 641 | get-intrinsic: 1.2.4 642 | set-function-length: 1.2.2 643 | 644 | /call-me-maybe@1.0.2: 645 | resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} 646 | dev: false 647 | 648 | /callsites@3.1.0: 649 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 650 | engines: {node: '>=6'} 651 | dev: true 652 | 653 | /chalk@4.1.2: 654 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 655 | engines: {node: '>=10'} 656 | dependencies: 657 | ansi-styles: 4.3.0 658 | supports-color: 7.2.0 659 | dev: true 660 | 661 | /chokidar@3.6.0: 662 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 663 | engines: {node: '>= 8.10.0'} 664 | dependencies: 665 | anymatch: 3.1.3 666 | braces: 3.0.2 667 | glob-parent: 5.1.2 668 | is-binary-path: 2.1.0 669 | is-glob: 4.0.3 670 | normalize-path: 3.0.0 671 | readdirp: 3.6.0 672 | optionalDependencies: 673 | fsevents: 2.3.3 674 | dev: true 675 | 676 | /chownr@2.0.0: 677 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 678 | engines: {node: '>=10'} 679 | dev: false 680 | 681 | /color-convert@1.9.3: 682 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 683 | dependencies: 684 | color-name: 1.1.3 685 | dev: false 686 | 687 | /color-convert@2.0.1: 688 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 689 | engines: {node: '>=7.0.0'} 690 | dependencies: 691 | color-name: 1.1.4 692 | dev: true 693 | 694 | /color-name@1.1.3: 695 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 696 | dev: false 697 | 698 | /color-name@1.1.4: 699 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 700 | 701 | /color-string@1.9.1: 702 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 703 | dependencies: 704 | color-name: 1.1.4 705 | simple-swizzle: 0.2.2 706 | dev: false 707 | 708 | /color-support@1.1.3: 709 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} 710 | hasBin: true 711 | dev: false 712 | 713 | /color@3.2.1: 714 | resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} 715 | dependencies: 716 | color-convert: 1.9.3 717 | color-string: 1.9.1 718 | dev: false 719 | 720 | /colorspace@1.1.4: 721 | resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 722 | dependencies: 723 | color: 3.2.1 724 | text-hex: 1.0.0 725 | dev: false 726 | 727 | /commander@6.2.0: 728 | resolution: {integrity: sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==} 729 | engines: {node: '>= 6'} 730 | dev: false 731 | 732 | /commander@9.5.0: 733 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 734 | engines: {node: ^12.20.0 || >=14} 735 | requiresBuild: true 736 | dev: false 737 | optional: true 738 | 739 | /concat-map@0.0.1: 740 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 741 | 742 | /console-control-strings@1.1.0: 743 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 744 | dev: false 745 | 746 | /content-disposition@0.5.4: 747 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 748 | engines: {node: '>= 0.6'} 749 | dependencies: 750 | safe-buffer: 5.2.1 751 | dev: false 752 | 753 | /content-type@1.0.5: 754 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 755 | engines: {node: '>= 0.6'} 756 | dev: false 757 | 758 | /cookie-signature@1.0.6: 759 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 760 | dev: false 761 | 762 | /cookie@0.5.0: 763 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 764 | engines: {node: '>= 0.6'} 765 | dev: false 766 | 767 | /cors@2.8.5: 768 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 769 | engines: {node: '>= 0.10'} 770 | dependencies: 771 | object-assign: 4.1.1 772 | vary: 1.1.2 773 | dev: false 774 | 775 | /cross-spawn@7.0.3: 776 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 777 | engines: {node: '>= 8'} 778 | dependencies: 779 | path-key: 3.1.1 780 | shebang-command: 2.0.0 781 | which: 2.0.2 782 | dev: true 783 | 784 | /debug@2.6.9: 785 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 786 | peerDependencies: 787 | supports-color: '*' 788 | peerDependenciesMeta: 789 | supports-color: 790 | optional: true 791 | dependencies: 792 | ms: 2.0.0 793 | dev: false 794 | 795 | /debug@3.2.7: 796 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 797 | peerDependencies: 798 | supports-color: '*' 799 | peerDependenciesMeta: 800 | supports-color: 801 | optional: true 802 | dependencies: 803 | ms: 2.1.3 804 | dev: true 805 | 806 | /debug@4.3.4(supports-color@5.5.0): 807 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 808 | engines: {node: '>=6.0'} 809 | peerDependencies: 810 | supports-color: '*' 811 | peerDependenciesMeta: 812 | supports-color: 813 | optional: true 814 | dependencies: 815 | ms: 2.1.2 816 | supports-color: 5.5.0 817 | 818 | /deep-is@0.1.4: 819 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 820 | dev: true 821 | 822 | /define-data-property@1.1.4: 823 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 824 | engines: {node: '>= 0.4'} 825 | dependencies: 826 | es-define-property: 1.0.0 827 | es-errors: 1.3.0 828 | gopd: 1.0.1 829 | 830 | /define-properties@1.2.1: 831 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 832 | engines: {node: '>= 0.4'} 833 | dependencies: 834 | define-data-property: 1.1.4 835 | has-property-descriptors: 1.0.2 836 | object-keys: 1.1.1 837 | dev: true 838 | 839 | /delegates@1.0.0: 840 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 841 | dev: false 842 | 843 | /depd@2.0.0: 844 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 845 | engines: {node: '>= 0.8'} 846 | dev: false 847 | 848 | /destroy@1.2.0: 849 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 850 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 851 | dev: false 852 | 853 | /detect-libc@2.0.2: 854 | resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} 855 | engines: {node: '>=8'} 856 | dev: false 857 | 858 | /doctrine@2.1.0: 859 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 860 | engines: {node: '>=0.10.0'} 861 | dependencies: 862 | esutils: 2.0.3 863 | dev: true 864 | 865 | /doctrine@3.0.0: 866 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 867 | engines: {node: '>=6.0.0'} 868 | dependencies: 869 | esutils: 2.0.3 870 | 871 | /dotenv@16.4.5: 872 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 873 | engines: {node: '>=12'} 874 | dev: false 875 | 876 | /ecdsa-sig-formatter@1.0.11: 877 | resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} 878 | dependencies: 879 | safe-buffer: 5.2.1 880 | dev: false 881 | 882 | /ee-first@1.1.1: 883 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 884 | dev: false 885 | 886 | /emoji-regex@8.0.0: 887 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 888 | dev: false 889 | 890 | /enabled@2.0.0: 891 | resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 892 | dev: false 893 | 894 | /encodeurl@1.0.2: 895 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 896 | engines: {node: '>= 0.8'} 897 | dev: false 898 | 899 | /es-abstract@1.22.5: 900 | resolution: {integrity: sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==} 901 | engines: {node: '>= 0.4'} 902 | dependencies: 903 | array-buffer-byte-length: 1.0.1 904 | arraybuffer.prototype.slice: 1.0.3 905 | available-typed-arrays: 1.0.7 906 | call-bind: 1.0.7 907 | es-define-property: 1.0.0 908 | es-errors: 1.3.0 909 | es-set-tostringtag: 2.0.3 910 | es-to-primitive: 1.2.1 911 | function.prototype.name: 1.1.6 912 | get-intrinsic: 1.2.4 913 | get-symbol-description: 1.0.2 914 | globalthis: 1.0.3 915 | gopd: 1.0.1 916 | has-property-descriptors: 1.0.2 917 | has-proto: 1.0.3 918 | has-symbols: 1.0.3 919 | hasown: 2.0.2 920 | internal-slot: 1.0.7 921 | is-array-buffer: 3.0.4 922 | is-callable: 1.2.7 923 | is-negative-zero: 2.0.3 924 | is-regex: 1.1.4 925 | is-shared-array-buffer: 1.0.3 926 | is-string: 1.0.7 927 | is-typed-array: 1.1.13 928 | is-weakref: 1.0.2 929 | object-inspect: 1.13.1 930 | object-keys: 1.1.1 931 | object.assign: 4.1.5 932 | regexp.prototype.flags: 1.5.2 933 | safe-array-concat: 1.1.2 934 | safe-regex-test: 1.0.3 935 | string.prototype.trim: 1.2.8 936 | string.prototype.trimend: 1.0.7 937 | string.prototype.trimstart: 1.0.7 938 | typed-array-buffer: 1.0.2 939 | typed-array-byte-length: 1.0.1 940 | typed-array-byte-offset: 1.0.2 941 | typed-array-length: 1.0.5 942 | unbox-primitive: 1.0.2 943 | which-typed-array: 1.1.15 944 | dev: true 945 | 946 | /es-array-method-boxes-properly@1.0.0: 947 | resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} 948 | dev: true 949 | 950 | /es-define-property@1.0.0: 951 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 952 | engines: {node: '>= 0.4'} 953 | dependencies: 954 | get-intrinsic: 1.2.4 955 | 956 | /es-errors@1.3.0: 957 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 958 | engines: {node: '>= 0.4'} 959 | 960 | /es-set-tostringtag@2.0.3: 961 | resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} 962 | engines: {node: '>= 0.4'} 963 | dependencies: 964 | get-intrinsic: 1.2.4 965 | has-tostringtag: 1.0.2 966 | hasown: 2.0.2 967 | dev: true 968 | 969 | /es-shim-unscopables@1.0.2: 970 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 971 | dependencies: 972 | hasown: 2.0.2 973 | dev: true 974 | 975 | /es-to-primitive@1.2.1: 976 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 977 | engines: {node: '>= 0.4'} 978 | dependencies: 979 | is-callable: 1.2.7 980 | is-date-object: 1.0.5 981 | is-symbol: 1.0.4 982 | dev: true 983 | 984 | /escape-html@1.0.3: 985 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 986 | dev: false 987 | 988 | /escape-string-regexp@4.0.0: 989 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 990 | engines: {node: '>=10'} 991 | dev: true 992 | 993 | /eslint-config-google@0.14.0(eslint@8.57.0): 994 | resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} 995 | engines: {node: '>=0.10.0'} 996 | peerDependencies: 997 | eslint: '>=5.16.0' 998 | dependencies: 999 | eslint: 8.57.0 1000 | dev: true 1001 | 1002 | /eslint-config-prettier@9.1.0(eslint@8.57.0): 1003 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 1004 | hasBin: true 1005 | peerDependencies: 1006 | eslint: '>=7.0.0' 1007 | dependencies: 1008 | eslint: 8.57.0 1009 | dev: true 1010 | 1011 | /eslint-import-resolver-node@0.3.9: 1012 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 1013 | dependencies: 1014 | debug: 3.2.7 1015 | is-core-module: 2.13.1 1016 | resolve: 1.22.8 1017 | transitivePeerDependencies: 1018 | - supports-color 1019 | dev: true 1020 | 1021 | /eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): 1022 | resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} 1023 | engines: {node: '>=4'} 1024 | peerDependencies: 1025 | '@typescript-eslint/parser': '*' 1026 | eslint: '*' 1027 | eslint-import-resolver-node: '*' 1028 | eslint-import-resolver-typescript: '*' 1029 | eslint-import-resolver-webpack: '*' 1030 | peerDependenciesMeta: 1031 | '@typescript-eslint/parser': 1032 | optional: true 1033 | eslint: 1034 | optional: true 1035 | eslint-import-resolver-node: 1036 | optional: true 1037 | eslint-import-resolver-typescript: 1038 | optional: true 1039 | eslint-import-resolver-webpack: 1040 | optional: true 1041 | dependencies: 1042 | debug: 3.2.7 1043 | eslint: 8.57.0 1044 | eslint-import-resolver-node: 0.3.9 1045 | transitivePeerDependencies: 1046 | - supports-color 1047 | dev: true 1048 | 1049 | /eslint-plugin-import@2.29.1(eslint@8.57.0): 1050 | resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} 1051 | engines: {node: '>=4'} 1052 | peerDependencies: 1053 | '@typescript-eslint/parser': '*' 1054 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 1055 | peerDependenciesMeta: 1056 | '@typescript-eslint/parser': 1057 | optional: true 1058 | dependencies: 1059 | array-includes: 3.1.7 1060 | array.prototype.findlastindex: 1.2.4 1061 | array.prototype.flat: 1.3.2 1062 | array.prototype.flatmap: 1.3.2 1063 | debug: 3.2.7 1064 | doctrine: 2.1.0 1065 | eslint: 8.57.0 1066 | eslint-import-resolver-node: 0.3.9 1067 | eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) 1068 | hasown: 2.0.2 1069 | is-core-module: 2.13.1 1070 | is-glob: 4.0.3 1071 | minimatch: 3.1.2 1072 | object.fromentries: 2.0.7 1073 | object.groupby: 1.0.2 1074 | object.values: 1.1.7 1075 | semver: 6.3.1 1076 | tsconfig-paths: 3.15.0 1077 | transitivePeerDependencies: 1078 | - eslint-import-resolver-typescript 1079 | - eslint-import-resolver-webpack 1080 | - supports-color 1081 | dev: true 1082 | 1083 | /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): 1084 | resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} 1085 | engines: {node: ^14.18.0 || >=16.0.0} 1086 | peerDependencies: 1087 | '@types/eslint': '>=8.0.0' 1088 | eslint: '>=8.0.0' 1089 | eslint-config-prettier: '*' 1090 | prettier: '>=3.0.0' 1091 | peerDependenciesMeta: 1092 | '@types/eslint': 1093 | optional: true 1094 | eslint-config-prettier: 1095 | optional: true 1096 | dependencies: 1097 | eslint: 8.57.0 1098 | eslint-config-prettier: 9.1.0(eslint@8.57.0) 1099 | prettier: 3.2.5 1100 | prettier-linter-helpers: 1.0.0 1101 | synckit: 0.8.8 1102 | dev: true 1103 | 1104 | /eslint-scope@7.2.2: 1105 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1106 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1107 | dependencies: 1108 | esrecurse: 4.3.0 1109 | estraverse: 5.3.0 1110 | dev: true 1111 | 1112 | /eslint-visitor-keys@3.4.3: 1113 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1114 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1115 | dev: true 1116 | 1117 | /eslint@8.57.0: 1118 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 1119 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1120 | hasBin: true 1121 | dependencies: 1122 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1123 | '@eslint-community/regexpp': 4.10.0 1124 | '@eslint/eslintrc': 2.1.4 1125 | '@eslint/js': 8.57.0 1126 | '@humanwhocodes/config-array': 0.11.14 1127 | '@humanwhocodes/module-importer': 1.0.1 1128 | '@nodelib/fs.walk': 1.2.8 1129 | '@ungap/structured-clone': 1.2.0 1130 | ajv: 6.12.6 1131 | chalk: 4.1.2 1132 | cross-spawn: 7.0.3 1133 | debug: 4.3.4(supports-color@5.5.0) 1134 | doctrine: 3.0.0 1135 | escape-string-regexp: 4.0.0 1136 | eslint-scope: 7.2.2 1137 | eslint-visitor-keys: 3.4.3 1138 | espree: 9.6.1 1139 | esquery: 1.5.0 1140 | esutils: 2.0.3 1141 | fast-deep-equal: 3.1.3 1142 | file-entry-cache: 6.0.1 1143 | find-up: 5.0.0 1144 | glob-parent: 6.0.2 1145 | globals: 13.24.0 1146 | graphemer: 1.4.0 1147 | ignore: 5.3.1 1148 | imurmurhash: 0.1.4 1149 | is-glob: 4.0.3 1150 | is-path-inside: 3.0.3 1151 | js-yaml: 4.1.0 1152 | json-stable-stringify-without-jsonify: 1.0.1 1153 | levn: 0.4.1 1154 | lodash.merge: 4.6.2 1155 | minimatch: 3.1.2 1156 | natural-compare: 1.4.0 1157 | optionator: 0.9.3 1158 | strip-ansi: 6.0.1 1159 | text-table: 0.2.0 1160 | transitivePeerDependencies: 1161 | - supports-color 1162 | dev: true 1163 | 1164 | /espree@9.6.1: 1165 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1166 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1167 | dependencies: 1168 | acorn: 8.11.3 1169 | acorn-jsx: 5.3.2(acorn@8.11.3) 1170 | eslint-visitor-keys: 3.4.3 1171 | dev: true 1172 | 1173 | /esquery@1.5.0: 1174 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1175 | engines: {node: '>=0.10'} 1176 | dependencies: 1177 | estraverse: 5.3.0 1178 | dev: true 1179 | 1180 | /esrecurse@4.3.0: 1181 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1182 | engines: {node: '>=4.0'} 1183 | dependencies: 1184 | estraverse: 5.3.0 1185 | dev: true 1186 | 1187 | /estraverse@5.3.0: 1188 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1189 | engines: {node: '>=4.0'} 1190 | dev: true 1191 | 1192 | /esutils@2.0.3: 1193 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1194 | engines: {node: '>=0.10.0'} 1195 | 1196 | /etag@1.8.1: 1197 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1198 | engines: {node: '>= 0.6'} 1199 | dev: false 1200 | 1201 | /express@4.18.3: 1202 | resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==} 1203 | engines: {node: '>= 0.10.0'} 1204 | dependencies: 1205 | accepts: 1.3.8 1206 | array-flatten: 1.1.1 1207 | body-parser: 1.20.2 1208 | content-disposition: 0.5.4 1209 | content-type: 1.0.5 1210 | cookie: 0.5.0 1211 | cookie-signature: 1.0.6 1212 | debug: 2.6.9 1213 | depd: 2.0.0 1214 | encodeurl: 1.0.2 1215 | escape-html: 1.0.3 1216 | etag: 1.8.1 1217 | finalhandler: 1.2.0 1218 | fresh: 0.5.2 1219 | http-errors: 2.0.0 1220 | merge-descriptors: 1.0.1 1221 | methods: 1.1.2 1222 | on-finished: 2.4.1 1223 | parseurl: 1.3.3 1224 | path-to-regexp: 0.1.7 1225 | proxy-addr: 2.0.7 1226 | qs: 6.11.0 1227 | range-parser: 1.2.1 1228 | safe-buffer: 5.2.1 1229 | send: 0.18.0 1230 | serve-static: 1.15.0 1231 | setprototypeof: 1.2.0 1232 | statuses: 2.0.1 1233 | type-is: 1.6.18 1234 | utils-merge: 1.0.1 1235 | vary: 1.1.2 1236 | transitivePeerDependencies: 1237 | - supports-color 1238 | dev: false 1239 | 1240 | /fast-deep-equal@3.1.3: 1241 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1242 | dev: true 1243 | 1244 | /fast-diff@1.3.0: 1245 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 1246 | dev: true 1247 | 1248 | /fast-json-stable-stringify@2.1.0: 1249 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1250 | dev: true 1251 | 1252 | /fast-levenshtein@2.0.6: 1253 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1254 | dev: true 1255 | 1256 | /fastq@1.17.1: 1257 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1258 | dependencies: 1259 | reusify: 1.0.4 1260 | dev: true 1261 | 1262 | /fecha@4.2.3: 1263 | resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 1264 | dev: false 1265 | 1266 | /file-entry-cache@6.0.1: 1267 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1268 | engines: {node: ^10.12.0 || >=12.0.0} 1269 | dependencies: 1270 | flat-cache: 3.2.0 1271 | dev: true 1272 | 1273 | /fill-range@7.0.1: 1274 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1275 | engines: {node: '>=8'} 1276 | dependencies: 1277 | to-regex-range: 5.0.1 1278 | dev: true 1279 | 1280 | /finalhandler@1.2.0: 1281 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 1282 | engines: {node: '>= 0.8'} 1283 | dependencies: 1284 | debug: 2.6.9 1285 | encodeurl: 1.0.2 1286 | escape-html: 1.0.3 1287 | on-finished: 2.4.1 1288 | parseurl: 1.3.3 1289 | statuses: 2.0.1 1290 | unpipe: 1.0.0 1291 | transitivePeerDependencies: 1292 | - supports-color 1293 | dev: false 1294 | 1295 | /find-up@5.0.0: 1296 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1297 | engines: {node: '>=10'} 1298 | dependencies: 1299 | locate-path: 6.0.0 1300 | path-exists: 4.0.0 1301 | dev: true 1302 | 1303 | /flat-cache@3.2.0: 1304 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1305 | engines: {node: ^10.12.0 || >=12.0.0} 1306 | dependencies: 1307 | flatted: 3.3.1 1308 | keyv: 4.5.4 1309 | rimraf: 3.0.2 1310 | dev: true 1311 | 1312 | /flatted@3.3.1: 1313 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 1314 | dev: true 1315 | 1316 | /fn.name@1.1.0: 1317 | resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} 1318 | dev: false 1319 | 1320 | /for-each@0.3.3: 1321 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1322 | dependencies: 1323 | is-callable: 1.2.7 1324 | dev: true 1325 | 1326 | /forwarded@0.2.0: 1327 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 1328 | engines: {node: '>= 0.6'} 1329 | dev: false 1330 | 1331 | /fresh@0.5.2: 1332 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 1333 | engines: {node: '>= 0.6'} 1334 | dev: false 1335 | 1336 | /fs-minipass@2.1.0: 1337 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 1338 | engines: {node: '>= 8'} 1339 | dependencies: 1340 | minipass: 3.3.6 1341 | dev: false 1342 | 1343 | /fs.realpath@1.0.0: 1344 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1345 | 1346 | /fsevents@2.3.3: 1347 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1348 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1349 | os: [darwin] 1350 | requiresBuild: true 1351 | dev: true 1352 | optional: true 1353 | 1354 | /function-bind@1.1.2: 1355 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1356 | 1357 | /function.prototype.name@1.1.6: 1358 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 1359 | engines: {node: '>= 0.4'} 1360 | dependencies: 1361 | call-bind: 1.0.7 1362 | define-properties: 1.2.1 1363 | es-abstract: 1.22.5 1364 | functions-have-names: 1.2.3 1365 | dev: true 1366 | 1367 | /functions-have-names@1.2.3: 1368 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1369 | dev: true 1370 | 1371 | /gauge@3.0.2: 1372 | resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} 1373 | engines: {node: '>=10'} 1374 | dependencies: 1375 | aproba: 2.0.0 1376 | color-support: 1.1.3 1377 | console-control-strings: 1.1.0 1378 | has-unicode: 2.0.1 1379 | object-assign: 4.1.1 1380 | signal-exit: 3.0.7 1381 | string-width: 4.2.3 1382 | strip-ansi: 6.0.1 1383 | wide-align: 1.1.5 1384 | dev: false 1385 | 1386 | /get-intrinsic@1.2.4: 1387 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 1388 | engines: {node: '>= 0.4'} 1389 | dependencies: 1390 | es-errors: 1.3.0 1391 | function-bind: 1.1.2 1392 | has-proto: 1.0.3 1393 | has-symbols: 1.0.3 1394 | hasown: 2.0.2 1395 | 1396 | /get-symbol-description@1.0.2: 1397 | resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} 1398 | engines: {node: '>= 0.4'} 1399 | dependencies: 1400 | call-bind: 1.0.7 1401 | es-errors: 1.3.0 1402 | get-intrinsic: 1.2.4 1403 | dev: true 1404 | 1405 | /glob-parent@5.1.2: 1406 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1407 | engines: {node: '>= 6'} 1408 | dependencies: 1409 | is-glob: 4.0.3 1410 | dev: true 1411 | 1412 | /glob-parent@6.0.2: 1413 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1414 | engines: {node: '>=10.13.0'} 1415 | dependencies: 1416 | is-glob: 4.0.3 1417 | dev: true 1418 | 1419 | /glob@7.1.6: 1420 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 1421 | dependencies: 1422 | fs.realpath: 1.0.0 1423 | inflight: 1.0.6 1424 | inherits: 2.0.4 1425 | minimatch: 3.1.2 1426 | once: 1.4.0 1427 | path-is-absolute: 1.0.1 1428 | dev: false 1429 | 1430 | /glob@7.2.3: 1431 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1432 | dependencies: 1433 | fs.realpath: 1.0.0 1434 | inflight: 1.0.6 1435 | inherits: 2.0.4 1436 | minimatch: 3.1.2 1437 | once: 1.4.0 1438 | path-is-absolute: 1.0.1 1439 | 1440 | /globals@13.24.0: 1441 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1442 | engines: {node: '>=8'} 1443 | dependencies: 1444 | type-fest: 0.20.2 1445 | dev: true 1446 | 1447 | /globalthis@1.0.3: 1448 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1449 | engines: {node: '>= 0.4'} 1450 | dependencies: 1451 | define-properties: 1.2.1 1452 | dev: true 1453 | 1454 | /gopd@1.0.1: 1455 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1456 | dependencies: 1457 | get-intrinsic: 1.2.4 1458 | 1459 | /graphemer@1.4.0: 1460 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1461 | dev: true 1462 | 1463 | /has-bigints@1.0.2: 1464 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1465 | dev: true 1466 | 1467 | /has-flag@3.0.0: 1468 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1469 | engines: {node: '>=4'} 1470 | 1471 | /has-flag@4.0.0: 1472 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1473 | engines: {node: '>=8'} 1474 | dev: true 1475 | 1476 | /has-property-descriptors@1.0.2: 1477 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1478 | dependencies: 1479 | es-define-property: 1.0.0 1480 | 1481 | /has-proto@1.0.3: 1482 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 1483 | engines: {node: '>= 0.4'} 1484 | 1485 | /has-symbols@1.0.3: 1486 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1487 | engines: {node: '>= 0.4'} 1488 | 1489 | /has-tostringtag@1.0.2: 1490 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1491 | engines: {node: '>= 0.4'} 1492 | dependencies: 1493 | has-symbols: 1.0.3 1494 | dev: true 1495 | 1496 | /has-unicode@2.0.1: 1497 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 1498 | dev: false 1499 | 1500 | /hasown@2.0.2: 1501 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1502 | engines: {node: '>= 0.4'} 1503 | dependencies: 1504 | function-bind: 1.1.2 1505 | 1506 | /helmet@7.1.0: 1507 | resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} 1508 | engines: {node: '>=16.0.0'} 1509 | dev: false 1510 | 1511 | /http-errors@2.0.0: 1512 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 1513 | engines: {node: '>= 0.8'} 1514 | dependencies: 1515 | depd: 2.0.0 1516 | inherits: 2.0.4 1517 | setprototypeof: 1.2.0 1518 | statuses: 2.0.1 1519 | toidentifier: 1.0.1 1520 | dev: false 1521 | 1522 | /https-proxy-agent@5.0.1: 1523 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1524 | engines: {node: '>= 6'} 1525 | dependencies: 1526 | agent-base: 6.0.2 1527 | debug: 4.3.4(supports-color@5.5.0) 1528 | transitivePeerDependencies: 1529 | - supports-color 1530 | dev: false 1531 | 1532 | /iconv-lite@0.4.24: 1533 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1534 | engines: {node: '>=0.10.0'} 1535 | dependencies: 1536 | safer-buffer: 2.1.2 1537 | dev: false 1538 | 1539 | /ignore-by-default@1.0.1: 1540 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 1541 | dev: true 1542 | 1543 | /ignore@5.3.1: 1544 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1545 | engines: {node: '>= 4'} 1546 | dev: true 1547 | 1548 | /import-fresh@3.3.0: 1549 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1550 | engines: {node: '>=6'} 1551 | dependencies: 1552 | parent-module: 1.0.1 1553 | resolve-from: 4.0.0 1554 | dev: true 1555 | 1556 | /imurmurhash@0.1.4: 1557 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1558 | engines: {node: '>=0.8.19'} 1559 | dev: true 1560 | 1561 | /inflight@1.0.6: 1562 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1563 | dependencies: 1564 | once: 1.4.0 1565 | wrappy: 1.0.2 1566 | 1567 | /inherits@2.0.4: 1568 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1569 | 1570 | /internal-slot@1.0.7: 1571 | resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} 1572 | engines: {node: '>= 0.4'} 1573 | dependencies: 1574 | es-errors: 1.3.0 1575 | hasown: 2.0.2 1576 | side-channel: 1.0.6 1577 | dev: true 1578 | 1579 | /ipaddr.js@1.9.1: 1580 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 1581 | engines: {node: '>= 0.10'} 1582 | dev: false 1583 | 1584 | /is-array-buffer@3.0.4: 1585 | resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 1586 | engines: {node: '>= 0.4'} 1587 | dependencies: 1588 | call-bind: 1.0.7 1589 | get-intrinsic: 1.2.4 1590 | dev: true 1591 | 1592 | /is-arrayish@0.3.2: 1593 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 1594 | dev: false 1595 | 1596 | /is-bigint@1.0.4: 1597 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1598 | dependencies: 1599 | has-bigints: 1.0.2 1600 | dev: true 1601 | 1602 | /is-binary-path@2.1.0: 1603 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1604 | engines: {node: '>=8'} 1605 | dependencies: 1606 | binary-extensions: 2.3.0 1607 | dev: true 1608 | 1609 | /is-boolean-object@1.1.2: 1610 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1611 | engines: {node: '>= 0.4'} 1612 | dependencies: 1613 | call-bind: 1.0.7 1614 | has-tostringtag: 1.0.2 1615 | dev: true 1616 | 1617 | /is-callable@1.2.7: 1618 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1619 | engines: {node: '>= 0.4'} 1620 | dev: true 1621 | 1622 | /is-core-module@2.13.1: 1623 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1624 | dependencies: 1625 | hasown: 2.0.2 1626 | dev: true 1627 | 1628 | /is-date-object@1.0.5: 1629 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1630 | engines: {node: '>= 0.4'} 1631 | dependencies: 1632 | has-tostringtag: 1.0.2 1633 | dev: true 1634 | 1635 | /is-extglob@2.1.1: 1636 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1637 | engines: {node: '>=0.10.0'} 1638 | dev: true 1639 | 1640 | /is-fullwidth-code-point@3.0.0: 1641 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1642 | engines: {node: '>=8'} 1643 | dev: false 1644 | 1645 | /is-glob@4.0.3: 1646 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1647 | engines: {node: '>=0.10.0'} 1648 | dependencies: 1649 | is-extglob: 2.1.1 1650 | dev: true 1651 | 1652 | /is-negative-zero@2.0.3: 1653 | resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 1654 | engines: {node: '>= 0.4'} 1655 | dev: true 1656 | 1657 | /is-number-object@1.0.7: 1658 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1659 | engines: {node: '>= 0.4'} 1660 | dependencies: 1661 | has-tostringtag: 1.0.2 1662 | dev: true 1663 | 1664 | /is-number@7.0.0: 1665 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1666 | engines: {node: '>=0.12.0'} 1667 | dev: true 1668 | 1669 | /is-path-inside@3.0.3: 1670 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1671 | engines: {node: '>=8'} 1672 | dev: true 1673 | 1674 | /is-regex@1.1.4: 1675 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1676 | engines: {node: '>= 0.4'} 1677 | dependencies: 1678 | call-bind: 1.0.7 1679 | has-tostringtag: 1.0.2 1680 | dev: true 1681 | 1682 | /is-shared-array-buffer@1.0.3: 1683 | resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} 1684 | engines: {node: '>= 0.4'} 1685 | dependencies: 1686 | call-bind: 1.0.7 1687 | dev: true 1688 | 1689 | /is-stream@2.0.1: 1690 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1691 | engines: {node: '>=8'} 1692 | dev: false 1693 | 1694 | /is-string@1.0.7: 1695 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1696 | engines: {node: '>= 0.4'} 1697 | dependencies: 1698 | has-tostringtag: 1.0.2 1699 | dev: true 1700 | 1701 | /is-symbol@1.0.4: 1702 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1703 | engines: {node: '>= 0.4'} 1704 | dependencies: 1705 | has-symbols: 1.0.3 1706 | dev: true 1707 | 1708 | /is-typed-array@1.1.13: 1709 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 1710 | engines: {node: '>= 0.4'} 1711 | dependencies: 1712 | which-typed-array: 1.1.15 1713 | dev: true 1714 | 1715 | /is-weakref@1.0.2: 1716 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1717 | dependencies: 1718 | call-bind: 1.0.7 1719 | dev: true 1720 | 1721 | /isarray@2.0.5: 1722 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1723 | dev: true 1724 | 1725 | /isexe@2.0.0: 1726 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1727 | dev: true 1728 | 1729 | /joi@17.12.2: 1730 | resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} 1731 | dependencies: 1732 | '@hapi/hoek': 9.3.0 1733 | '@hapi/topo': 5.1.0 1734 | '@sideway/address': 4.1.5 1735 | '@sideway/formula': 3.0.1 1736 | '@sideway/pinpoint': 2.0.0 1737 | dev: false 1738 | 1739 | /js-yaml@4.1.0: 1740 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1741 | hasBin: true 1742 | dependencies: 1743 | argparse: 2.0.1 1744 | 1745 | /json-buffer@3.0.1: 1746 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1747 | dev: true 1748 | 1749 | /json-schema-traverse@0.4.1: 1750 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1751 | dev: true 1752 | 1753 | /json-stable-stringify-without-jsonify@1.0.1: 1754 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1755 | dev: true 1756 | 1757 | /json5@1.0.2: 1758 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1759 | hasBin: true 1760 | dependencies: 1761 | minimist: 1.2.8 1762 | dev: true 1763 | 1764 | /jsonwebtoken@9.0.2: 1765 | resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} 1766 | engines: {node: '>=12', npm: '>=6'} 1767 | dependencies: 1768 | jws: 3.2.2 1769 | lodash.includes: 4.3.0 1770 | lodash.isboolean: 3.0.3 1771 | lodash.isinteger: 4.0.4 1772 | lodash.isnumber: 3.0.3 1773 | lodash.isplainobject: 4.0.6 1774 | lodash.isstring: 4.0.1 1775 | lodash.once: 4.1.1 1776 | ms: 2.1.3 1777 | semver: 7.6.0 1778 | dev: false 1779 | 1780 | /jwa@1.4.1: 1781 | resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} 1782 | dependencies: 1783 | buffer-equal-constant-time: 1.0.1 1784 | ecdsa-sig-formatter: 1.0.11 1785 | safe-buffer: 5.2.1 1786 | dev: false 1787 | 1788 | /jws@3.2.2: 1789 | resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} 1790 | dependencies: 1791 | jwa: 1.4.1 1792 | safe-buffer: 5.2.1 1793 | dev: false 1794 | 1795 | /keyv@4.5.4: 1796 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1797 | dependencies: 1798 | json-buffer: 3.0.1 1799 | dev: true 1800 | 1801 | /kuler@2.0.0: 1802 | resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 1803 | dev: false 1804 | 1805 | /levn@0.4.1: 1806 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1807 | engines: {node: '>= 0.8.0'} 1808 | dependencies: 1809 | prelude-ls: 1.2.1 1810 | type-check: 0.4.0 1811 | dev: true 1812 | 1813 | /locate-path@6.0.0: 1814 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1815 | engines: {node: '>=10'} 1816 | dependencies: 1817 | p-locate: 5.0.0 1818 | dev: true 1819 | 1820 | /lodash.get@4.4.2: 1821 | resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} 1822 | dev: false 1823 | 1824 | /lodash.includes@4.3.0: 1825 | resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} 1826 | dev: false 1827 | 1828 | /lodash.isboolean@3.0.3: 1829 | resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} 1830 | dev: false 1831 | 1832 | /lodash.isequal@4.5.0: 1833 | resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} 1834 | dev: false 1835 | 1836 | /lodash.isinteger@4.0.4: 1837 | resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} 1838 | dev: false 1839 | 1840 | /lodash.isnumber@3.0.3: 1841 | resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} 1842 | dev: false 1843 | 1844 | /lodash.isplainobject@4.0.6: 1845 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 1846 | dev: false 1847 | 1848 | /lodash.isstring@4.0.1: 1849 | resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} 1850 | dev: false 1851 | 1852 | /lodash.merge@4.6.2: 1853 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1854 | dev: true 1855 | 1856 | /lodash.mergewith@4.6.2: 1857 | resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} 1858 | dev: false 1859 | 1860 | /lodash.once@4.1.1: 1861 | resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} 1862 | dev: false 1863 | 1864 | /logform@2.6.0: 1865 | resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} 1866 | engines: {node: '>= 12.0.0'} 1867 | dependencies: 1868 | '@colors/colors': 1.6.0 1869 | '@types/triple-beam': 1.3.5 1870 | fecha: 4.2.3 1871 | ms: 2.1.3 1872 | safe-stable-stringify: 2.4.3 1873 | triple-beam: 1.4.1 1874 | dev: false 1875 | 1876 | /lru-cache@6.0.0: 1877 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1878 | engines: {node: '>=10'} 1879 | dependencies: 1880 | yallist: 4.0.0 1881 | 1882 | /make-dir@3.1.0: 1883 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 1884 | engines: {node: '>=8'} 1885 | dependencies: 1886 | semver: 6.3.1 1887 | dev: false 1888 | 1889 | /media-typer@0.3.0: 1890 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1891 | engines: {node: '>= 0.6'} 1892 | dev: false 1893 | 1894 | /merge-descriptors@1.0.1: 1895 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 1896 | dev: false 1897 | 1898 | /methods@1.1.2: 1899 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 1900 | engines: {node: '>= 0.6'} 1901 | dev: false 1902 | 1903 | /mime-db@1.52.0: 1904 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1905 | engines: {node: '>= 0.6'} 1906 | dev: false 1907 | 1908 | /mime-types@2.1.35: 1909 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1910 | engines: {node: '>= 0.6'} 1911 | dependencies: 1912 | mime-db: 1.52.0 1913 | dev: false 1914 | 1915 | /mime@1.6.0: 1916 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 1917 | engines: {node: '>=4'} 1918 | hasBin: true 1919 | dev: false 1920 | 1921 | /minimatch@3.1.2: 1922 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1923 | dependencies: 1924 | brace-expansion: 1.1.11 1925 | 1926 | /minimist@1.2.8: 1927 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1928 | dev: true 1929 | 1930 | /minipass@3.3.6: 1931 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 1932 | engines: {node: '>=8'} 1933 | dependencies: 1934 | yallist: 4.0.0 1935 | dev: false 1936 | 1937 | /minipass@5.0.0: 1938 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 1939 | engines: {node: '>=8'} 1940 | dev: false 1941 | 1942 | /minizlib@2.1.2: 1943 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1944 | engines: {node: '>= 8'} 1945 | dependencies: 1946 | minipass: 3.3.6 1947 | yallist: 4.0.0 1948 | dev: false 1949 | 1950 | /mkdirp@1.0.4: 1951 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1952 | engines: {node: '>=10'} 1953 | hasBin: true 1954 | dev: false 1955 | 1956 | /moment@2.30.1: 1957 | resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 1958 | dev: false 1959 | 1960 | /ms@2.0.0: 1961 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1962 | dev: false 1963 | 1964 | /ms@2.1.2: 1965 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1966 | 1967 | /ms@2.1.3: 1968 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1969 | 1970 | /natural-compare@1.4.0: 1971 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1972 | dev: true 1973 | 1974 | /negotiator@0.6.3: 1975 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1976 | engines: {node: '>= 0.6'} 1977 | dev: false 1978 | 1979 | /node-addon-api@5.1.0: 1980 | resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} 1981 | dev: false 1982 | 1983 | /node-fetch@2.7.0: 1984 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1985 | engines: {node: 4.x || >=6.0.0} 1986 | peerDependencies: 1987 | encoding: ^0.1.0 1988 | peerDependenciesMeta: 1989 | encoding: 1990 | optional: true 1991 | dependencies: 1992 | whatwg-url: 5.0.0 1993 | dev: false 1994 | 1995 | /nodemon@3.1.0: 1996 | resolution: {integrity: sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==} 1997 | engines: {node: '>=10'} 1998 | hasBin: true 1999 | dependencies: 2000 | chokidar: 3.6.0 2001 | debug: 4.3.4(supports-color@5.5.0) 2002 | ignore-by-default: 1.0.1 2003 | minimatch: 3.1.2 2004 | pstree.remy: 1.1.8 2005 | semver: 7.6.0 2006 | simple-update-notifier: 2.0.0 2007 | supports-color: 5.5.0 2008 | touch: 3.1.0 2009 | undefsafe: 2.0.5 2010 | dev: true 2011 | 2012 | /nopt@1.0.10: 2013 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 2014 | hasBin: true 2015 | dependencies: 2016 | abbrev: 1.1.1 2017 | dev: true 2018 | 2019 | /nopt@5.0.0: 2020 | resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} 2021 | engines: {node: '>=6'} 2022 | hasBin: true 2023 | dependencies: 2024 | abbrev: 1.1.1 2025 | dev: false 2026 | 2027 | /normalize-path@3.0.0: 2028 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2029 | engines: {node: '>=0.10.0'} 2030 | dev: true 2031 | 2032 | /npmlog@5.0.1: 2033 | resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} 2034 | dependencies: 2035 | are-we-there-yet: 2.0.0 2036 | console-control-strings: 1.1.0 2037 | gauge: 3.0.2 2038 | set-blocking: 2.0.0 2039 | dev: false 2040 | 2041 | /object-assign@4.1.1: 2042 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2043 | engines: {node: '>=0.10.0'} 2044 | dev: false 2045 | 2046 | /object-inspect@1.13.1: 2047 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 2048 | 2049 | /object-keys@1.1.1: 2050 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 2051 | engines: {node: '>= 0.4'} 2052 | dev: true 2053 | 2054 | /object.assign@4.1.5: 2055 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 2056 | engines: {node: '>= 0.4'} 2057 | dependencies: 2058 | call-bind: 1.0.7 2059 | define-properties: 1.2.1 2060 | has-symbols: 1.0.3 2061 | object-keys: 1.1.1 2062 | dev: true 2063 | 2064 | /object.fromentries@2.0.7: 2065 | resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} 2066 | engines: {node: '>= 0.4'} 2067 | dependencies: 2068 | call-bind: 1.0.7 2069 | define-properties: 1.2.1 2070 | es-abstract: 1.22.5 2071 | dev: true 2072 | 2073 | /object.groupby@1.0.2: 2074 | resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} 2075 | dependencies: 2076 | array.prototype.filter: 1.0.3 2077 | call-bind: 1.0.7 2078 | define-properties: 1.2.1 2079 | es-abstract: 1.22.5 2080 | es-errors: 1.3.0 2081 | dev: true 2082 | 2083 | /object.values@1.1.7: 2084 | resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} 2085 | engines: {node: '>= 0.4'} 2086 | dependencies: 2087 | call-bind: 1.0.7 2088 | define-properties: 1.2.1 2089 | es-abstract: 1.22.5 2090 | dev: true 2091 | 2092 | /on-finished@2.4.1: 2093 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 2094 | engines: {node: '>= 0.8'} 2095 | dependencies: 2096 | ee-first: 1.1.1 2097 | dev: false 2098 | 2099 | /once@1.4.0: 2100 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2101 | dependencies: 2102 | wrappy: 1.0.2 2103 | 2104 | /one-time@1.0.0: 2105 | resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} 2106 | dependencies: 2107 | fn.name: 1.1.0 2108 | dev: false 2109 | 2110 | /openapi-types@12.1.3: 2111 | resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} 2112 | dev: false 2113 | 2114 | /optionator@0.9.3: 2115 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 2116 | engines: {node: '>= 0.8.0'} 2117 | dependencies: 2118 | '@aashutoshrathi/word-wrap': 1.2.6 2119 | deep-is: 0.1.4 2120 | fast-levenshtein: 2.0.6 2121 | levn: 0.4.1 2122 | prelude-ls: 1.2.1 2123 | type-check: 0.4.0 2124 | dev: true 2125 | 2126 | /p-limit@3.1.0: 2127 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2128 | engines: {node: '>=10'} 2129 | dependencies: 2130 | yocto-queue: 0.1.0 2131 | dev: true 2132 | 2133 | /p-locate@5.0.0: 2134 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2135 | engines: {node: '>=10'} 2136 | dependencies: 2137 | p-limit: 3.1.0 2138 | dev: true 2139 | 2140 | /parent-module@1.0.1: 2141 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2142 | engines: {node: '>=6'} 2143 | dependencies: 2144 | callsites: 3.1.0 2145 | dev: true 2146 | 2147 | /parseurl@1.3.3: 2148 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 2149 | engines: {node: '>= 0.8'} 2150 | dev: false 2151 | 2152 | /path-exists@4.0.0: 2153 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2154 | engines: {node: '>=8'} 2155 | dev: true 2156 | 2157 | /path-is-absolute@1.0.1: 2158 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2159 | engines: {node: '>=0.10.0'} 2160 | 2161 | /path-key@3.1.1: 2162 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2163 | engines: {node: '>=8'} 2164 | dev: true 2165 | 2166 | /path-parse@1.0.7: 2167 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2168 | dev: true 2169 | 2170 | /path-to-regexp@0.1.7: 2171 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 2172 | dev: false 2173 | 2174 | /picomatch@2.3.1: 2175 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2176 | engines: {node: '>=8.6'} 2177 | dev: true 2178 | 2179 | /possible-typed-array-names@1.0.0: 2180 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 2181 | engines: {node: '>= 0.4'} 2182 | dev: true 2183 | 2184 | /prelude-ls@1.2.1: 2185 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2186 | engines: {node: '>= 0.8.0'} 2187 | dev: true 2188 | 2189 | /prettier-linter-helpers@1.0.0: 2190 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 2191 | engines: {node: '>=6.0.0'} 2192 | dependencies: 2193 | fast-diff: 1.3.0 2194 | dev: true 2195 | 2196 | /prettier@3.2.5: 2197 | resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} 2198 | engines: {node: '>=14'} 2199 | hasBin: true 2200 | dev: true 2201 | 2202 | /prisma@5.11.0: 2203 | resolution: {integrity: sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==} 2204 | engines: {node: '>=16.13'} 2205 | hasBin: true 2206 | requiresBuild: true 2207 | dependencies: 2208 | '@prisma/engines': 5.11.0 2209 | 2210 | /proxy-addr@2.0.7: 2211 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 2212 | engines: {node: '>= 0.10'} 2213 | dependencies: 2214 | forwarded: 0.2.0 2215 | ipaddr.js: 1.9.1 2216 | dev: false 2217 | 2218 | /pstree.remy@1.1.8: 2219 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 2220 | dev: true 2221 | 2222 | /punycode@2.3.1: 2223 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2224 | engines: {node: '>=6'} 2225 | dev: true 2226 | 2227 | /qs@6.11.0: 2228 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 2229 | engines: {node: '>=0.6'} 2230 | dependencies: 2231 | side-channel: 1.0.6 2232 | dev: false 2233 | 2234 | /queue-microtask@1.2.3: 2235 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2236 | dev: true 2237 | 2238 | /range-parser@1.2.1: 2239 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 2240 | engines: {node: '>= 0.6'} 2241 | dev: false 2242 | 2243 | /raw-body@2.5.2: 2244 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 2245 | engines: {node: '>= 0.8'} 2246 | dependencies: 2247 | bytes: 3.1.2 2248 | http-errors: 2.0.0 2249 | iconv-lite: 0.4.24 2250 | unpipe: 1.0.0 2251 | dev: false 2252 | 2253 | /readable-stream@3.6.2: 2254 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2255 | engines: {node: '>= 6'} 2256 | dependencies: 2257 | inherits: 2.0.4 2258 | string_decoder: 1.3.0 2259 | util-deprecate: 1.0.2 2260 | dev: false 2261 | 2262 | /readdirp@3.6.0: 2263 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2264 | engines: {node: '>=8.10.0'} 2265 | dependencies: 2266 | picomatch: 2.3.1 2267 | dev: true 2268 | 2269 | /regexp.prototype.flags@1.5.2: 2270 | resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} 2271 | engines: {node: '>= 0.4'} 2272 | dependencies: 2273 | call-bind: 1.0.7 2274 | define-properties: 1.2.1 2275 | es-errors: 1.3.0 2276 | set-function-name: 2.0.2 2277 | dev: true 2278 | 2279 | /resolve-from@4.0.0: 2280 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2281 | engines: {node: '>=4'} 2282 | dev: true 2283 | 2284 | /resolve@1.22.8: 2285 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2286 | hasBin: true 2287 | dependencies: 2288 | is-core-module: 2.13.1 2289 | path-parse: 1.0.7 2290 | supports-preserve-symlinks-flag: 1.0.0 2291 | dev: true 2292 | 2293 | /reusify@1.0.4: 2294 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2295 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2296 | dev: true 2297 | 2298 | /rimraf@3.0.2: 2299 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2300 | hasBin: true 2301 | dependencies: 2302 | glob: 7.2.3 2303 | 2304 | /run-parallel@1.2.0: 2305 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2306 | dependencies: 2307 | queue-microtask: 1.2.3 2308 | dev: true 2309 | 2310 | /safe-array-concat@1.1.2: 2311 | resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} 2312 | engines: {node: '>=0.4'} 2313 | dependencies: 2314 | call-bind: 1.0.7 2315 | get-intrinsic: 1.2.4 2316 | has-symbols: 1.0.3 2317 | isarray: 2.0.5 2318 | dev: true 2319 | 2320 | /safe-buffer@5.2.1: 2321 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2322 | dev: false 2323 | 2324 | /safe-regex-test@1.0.3: 2325 | resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} 2326 | engines: {node: '>= 0.4'} 2327 | dependencies: 2328 | call-bind: 1.0.7 2329 | es-errors: 1.3.0 2330 | is-regex: 1.1.4 2331 | dev: true 2332 | 2333 | /safe-stable-stringify@2.4.3: 2334 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 2335 | engines: {node: '>=10'} 2336 | dev: false 2337 | 2338 | /safer-buffer@2.1.2: 2339 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2340 | dev: false 2341 | 2342 | /semver@6.3.1: 2343 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2344 | hasBin: true 2345 | 2346 | /semver@7.6.0: 2347 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 2348 | engines: {node: '>=10'} 2349 | hasBin: true 2350 | dependencies: 2351 | lru-cache: 6.0.0 2352 | 2353 | /send@0.18.0: 2354 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 2355 | engines: {node: '>= 0.8.0'} 2356 | dependencies: 2357 | debug: 2.6.9 2358 | depd: 2.0.0 2359 | destroy: 1.2.0 2360 | encodeurl: 1.0.2 2361 | escape-html: 1.0.3 2362 | etag: 1.8.1 2363 | fresh: 0.5.2 2364 | http-errors: 2.0.0 2365 | mime: 1.6.0 2366 | ms: 2.1.3 2367 | on-finished: 2.4.1 2368 | range-parser: 1.2.1 2369 | statuses: 2.0.1 2370 | transitivePeerDependencies: 2371 | - supports-color 2372 | dev: false 2373 | 2374 | /serve-static@1.15.0: 2375 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 2376 | engines: {node: '>= 0.8.0'} 2377 | dependencies: 2378 | encodeurl: 1.0.2 2379 | escape-html: 1.0.3 2380 | parseurl: 1.3.3 2381 | send: 0.18.0 2382 | transitivePeerDependencies: 2383 | - supports-color 2384 | dev: false 2385 | 2386 | /set-blocking@2.0.0: 2387 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 2388 | dev: false 2389 | 2390 | /set-function-length@1.2.2: 2391 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 2392 | engines: {node: '>= 0.4'} 2393 | dependencies: 2394 | define-data-property: 1.1.4 2395 | es-errors: 1.3.0 2396 | function-bind: 1.1.2 2397 | get-intrinsic: 1.2.4 2398 | gopd: 1.0.1 2399 | has-property-descriptors: 1.0.2 2400 | 2401 | /set-function-name@2.0.2: 2402 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 2403 | engines: {node: '>= 0.4'} 2404 | dependencies: 2405 | define-data-property: 1.1.4 2406 | es-errors: 1.3.0 2407 | functions-have-names: 1.2.3 2408 | has-property-descriptors: 1.0.2 2409 | dev: true 2410 | 2411 | /setprototypeof@1.2.0: 2412 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 2413 | dev: false 2414 | 2415 | /shebang-command@2.0.0: 2416 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2417 | engines: {node: '>=8'} 2418 | dependencies: 2419 | shebang-regex: 3.0.0 2420 | dev: true 2421 | 2422 | /shebang-regex@3.0.0: 2423 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2424 | engines: {node: '>=8'} 2425 | dev: true 2426 | 2427 | /side-channel@1.0.6: 2428 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 2429 | engines: {node: '>= 0.4'} 2430 | dependencies: 2431 | call-bind: 1.0.7 2432 | es-errors: 1.3.0 2433 | get-intrinsic: 1.2.4 2434 | object-inspect: 1.13.1 2435 | 2436 | /signal-exit@3.0.7: 2437 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2438 | dev: false 2439 | 2440 | /simple-swizzle@0.2.2: 2441 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 2442 | dependencies: 2443 | is-arrayish: 0.3.2 2444 | dev: false 2445 | 2446 | /simple-update-notifier@2.0.0: 2447 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 2448 | engines: {node: '>=10'} 2449 | dependencies: 2450 | semver: 7.6.0 2451 | dev: true 2452 | 2453 | /stack-trace@0.0.10: 2454 | resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 2455 | dev: false 2456 | 2457 | /statuses@2.0.1: 2458 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 2459 | engines: {node: '>= 0.8'} 2460 | dev: false 2461 | 2462 | /string-width@4.2.3: 2463 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2464 | engines: {node: '>=8'} 2465 | dependencies: 2466 | emoji-regex: 8.0.0 2467 | is-fullwidth-code-point: 3.0.0 2468 | strip-ansi: 6.0.1 2469 | dev: false 2470 | 2471 | /string.prototype.trim@1.2.8: 2472 | resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} 2473 | engines: {node: '>= 0.4'} 2474 | dependencies: 2475 | call-bind: 1.0.7 2476 | define-properties: 1.2.1 2477 | es-abstract: 1.22.5 2478 | dev: true 2479 | 2480 | /string.prototype.trimend@1.0.7: 2481 | resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} 2482 | dependencies: 2483 | call-bind: 1.0.7 2484 | define-properties: 1.2.1 2485 | es-abstract: 1.22.5 2486 | dev: true 2487 | 2488 | /string.prototype.trimstart@1.0.7: 2489 | resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} 2490 | dependencies: 2491 | call-bind: 1.0.7 2492 | define-properties: 1.2.1 2493 | es-abstract: 1.22.5 2494 | dev: true 2495 | 2496 | /string_decoder@1.3.0: 2497 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2498 | dependencies: 2499 | safe-buffer: 5.2.1 2500 | dev: false 2501 | 2502 | /strip-ansi@6.0.1: 2503 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2504 | engines: {node: '>=8'} 2505 | dependencies: 2506 | ansi-regex: 5.0.1 2507 | 2508 | /strip-bom@3.0.0: 2509 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2510 | engines: {node: '>=4'} 2511 | dev: true 2512 | 2513 | /strip-json-comments@3.1.1: 2514 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2515 | engines: {node: '>=8'} 2516 | dev: true 2517 | 2518 | /supports-color@5.5.0: 2519 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2520 | engines: {node: '>=4'} 2521 | dependencies: 2522 | has-flag: 3.0.0 2523 | 2524 | /supports-color@7.2.0: 2525 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2526 | engines: {node: '>=8'} 2527 | dependencies: 2528 | has-flag: 4.0.0 2529 | dev: true 2530 | 2531 | /supports-preserve-symlinks-flag@1.0.0: 2532 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2533 | engines: {node: '>= 0.4'} 2534 | dev: true 2535 | 2536 | /swagger-jsdoc@6.2.8(openapi-types@12.1.3): 2537 | resolution: {integrity: sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==} 2538 | engines: {node: '>=12.0.0'} 2539 | hasBin: true 2540 | dependencies: 2541 | commander: 6.2.0 2542 | doctrine: 3.0.0 2543 | glob: 7.1.6 2544 | lodash.mergewith: 4.6.2 2545 | swagger-parser: 10.0.3(openapi-types@12.1.3) 2546 | yaml: 2.0.0-1 2547 | transitivePeerDependencies: 2548 | - openapi-types 2549 | dev: false 2550 | 2551 | /swagger-parser@10.0.3(openapi-types@12.1.3): 2552 | resolution: {integrity: sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==} 2553 | engines: {node: '>=10'} 2554 | dependencies: 2555 | '@apidevtools/swagger-parser': 10.0.3(openapi-types@12.1.3) 2556 | transitivePeerDependencies: 2557 | - openapi-types 2558 | dev: false 2559 | 2560 | /swagger-ui-dist@5.12.0: 2561 | resolution: {integrity: sha512-Rt1xUpbHulJVGbiQjq9yy9/r/0Pg6TmpcG+fXTaMePDc8z5WUw4LfaWts5qcNv/8ewPvBIbY7DKq7qReIKNCCQ==} 2562 | dev: false 2563 | 2564 | /swagger-ui-express@5.0.0(express@4.18.3): 2565 | resolution: {integrity: sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==} 2566 | engines: {node: '>= v0.10.32'} 2567 | peerDependencies: 2568 | express: '>=4.0.0 || >=5.0.0-beta' 2569 | dependencies: 2570 | express: 4.18.3 2571 | swagger-ui-dist: 5.12.0 2572 | dev: false 2573 | 2574 | /synckit@0.8.8: 2575 | resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} 2576 | engines: {node: ^14.18.0 || >=16.0.0} 2577 | dependencies: 2578 | '@pkgr/core': 0.1.1 2579 | tslib: 2.6.2 2580 | dev: true 2581 | 2582 | /tar@6.2.0: 2583 | resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} 2584 | engines: {node: '>=10'} 2585 | dependencies: 2586 | chownr: 2.0.0 2587 | fs-minipass: 2.1.0 2588 | minipass: 5.0.0 2589 | minizlib: 2.1.2 2590 | mkdirp: 1.0.4 2591 | yallist: 4.0.0 2592 | dev: false 2593 | 2594 | /text-hex@1.0.0: 2595 | resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 2596 | dev: false 2597 | 2598 | /text-table@0.2.0: 2599 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2600 | dev: true 2601 | 2602 | /to-regex-range@5.0.1: 2603 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2604 | engines: {node: '>=8.0'} 2605 | dependencies: 2606 | is-number: 7.0.0 2607 | dev: true 2608 | 2609 | /toidentifier@1.0.1: 2610 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 2611 | engines: {node: '>=0.6'} 2612 | dev: false 2613 | 2614 | /touch@3.1.0: 2615 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 2616 | hasBin: true 2617 | dependencies: 2618 | nopt: 1.0.10 2619 | dev: true 2620 | 2621 | /tr46@0.0.3: 2622 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2623 | dev: false 2624 | 2625 | /triple-beam@1.4.1: 2626 | resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 2627 | engines: {node: '>= 14.0.0'} 2628 | dev: false 2629 | 2630 | /tsconfig-paths@3.15.0: 2631 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 2632 | dependencies: 2633 | '@types/json5': 0.0.29 2634 | json5: 1.0.2 2635 | minimist: 1.2.8 2636 | strip-bom: 3.0.0 2637 | dev: true 2638 | 2639 | /tslib@2.6.2: 2640 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2641 | dev: true 2642 | 2643 | /type-check@0.4.0: 2644 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2645 | engines: {node: '>= 0.8.0'} 2646 | dependencies: 2647 | prelude-ls: 1.2.1 2648 | dev: true 2649 | 2650 | /type-fest@0.20.2: 2651 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2652 | engines: {node: '>=10'} 2653 | dev: true 2654 | 2655 | /type-is@1.6.18: 2656 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 2657 | engines: {node: '>= 0.6'} 2658 | dependencies: 2659 | media-typer: 0.3.0 2660 | mime-types: 2.1.35 2661 | dev: false 2662 | 2663 | /typed-array-buffer@1.0.2: 2664 | resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} 2665 | engines: {node: '>= 0.4'} 2666 | dependencies: 2667 | call-bind: 1.0.7 2668 | es-errors: 1.3.0 2669 | is-typed-array: 1.1.13 2670 | dev: true 2671 | 2672 | /typed-array-byte-length@1.0.1: 2673 | resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} 2674 | engines: {node: '>= 0.4'} 2675 | dependencies: 2676 | call-bind: 1.0.7 2677 | for-each: 0.3.3 2678 | gopd: 1.0.1 2679 | has-proto: 1.0.3 2680 | is-typed-array: 1.1.13 2681 | dev: true 2682 | 2683 | /typed-array-byte-offset@1.0.2: 2684 | resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} 2685 | engines: {node: '>= 0.4'} 2686 | dependencies: 2687 | available-typed-arrays: 1.0.7 2688 | call-bind: 1.0.7 2689 | for-each: 0.3.3 2690 | gopd: 1.0.1 2691 | has-proto: 1.0.3 2692 | is-typed-array: 1.1.13 2693 | dev: true 2694 | 2695 | /typed-array-length@1.0.5: 2696 | resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} 2697 | engines: {node: '>= 0.4'} 2698 | dependencies: 2699 | call-bind: 1.0.7 2700 | for-each: 0.3.3 2701 | gopd: 1.0.1 2702 | has-proto: 1.0.3 2703 | is-typed-array: 1.1.13 2704 | possible-typed-array-names: 1.0.0 2705 | dev: true 2706 | 2707 | /unbox-primitive@1.0.2: 2708 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 2709 | dependencies: 2710 | call-bind: 1.0.7 2711 | has-bigints: 1.0.2 2712 | has-symbols: 1.0.3 2713 | which-boxed-primitive: 1.0.2 2714 | dev: true 2715 | 2716 | /undefsafe@2.0.5: 2717 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 2718 | dev: true 2719 | 2720 | /undici-types@5.26.5: 2721 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2722 | dev: true 2723 | 2724 | /unpipe@1.0.0: 2725 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 2726 | engines: {node: '>= 0.8'} 2727 | dev: false 2728 | 2729 | /uri-js@4.4.1: 2730 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2731 | dependencies: 2732 | punycode: 2.3.1 2733 | dev: true 2734 | 2735 | /util-deprecate@1.0.2: 2736 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2737 | dev: false 2738 | 2739 | /utils-merge@1.0.1: 2740 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 2741 | engines: {node: '>= 0.4.0'} 2742 | dev: false 2743 | 2744 | /uuid@9.0.1: 2745 | resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} 2746 | hasBin: true 2747 | dev: false 2748 | 2749 | /validator@13.11.0: 2750 | resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} 2751 | engines: {node: '>= 0.10'} 2752 | dev: false 2753 | 2754 | /vary@1.1.2: 2755 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 2756 | engines: {node: '>= 0.8'} 2757 | dev: false 2758 | 2759 | /webidl-conversions@3.0.1: 2760 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2761 | dev: false 2762 | 2763 | /whatwg-url@5.0.0: 2764 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2765 | dependencies: 2766 | tr46: 0.0.3 2767 | webidl-conversions: 3.0.1 2768 | dev: false 2769 | 2770 | /which-boxed-primitive@1.0.2: 2771 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 2772 | dependencies: 2773 | is-bigint: 1.0.4 2774 | is-boolean-object: 1.1.2 2775 | is-number-object: 1.0.7 2776 | is-string: 1.0.7 2777 | is-symbol: 1.0.4 2778 | dev: true 2779 | 2780 | /which-typed-array@1.1.15: 2781 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} 2782 | engines: {node: '>= 0.4'} 2783 | dependencies: 2784 | available-typed-arrays: 1.0.7 2785 | call-bind: 1.0.7 2786 | for-each: 0.3.3 2787 | gopd: 1.0.1 2788 | has-tostringtag: 1.0.2 2789 | dev: true 2790 | 2791 | /which@2.0.2: 2792 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2793 | engines: {node: '>= 8'} 2794 | hasBin: true 2795 | dependencies: 2796 | isexe: 2.0.0 2797 | dev: true 2798 | 2799 | /wide-align@1.1.5: 2800 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 2801 | dependencies: 2802 | string-width: 4.2.3 2803 | dev: false 2804 | 2805 | /winston-transport@4.7.0: 2806 | resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} 2807 | engines: {node: '>= 12.0.0'} 2808 | dependencies: 2809 | logform: 2.6.0 2810 | readable-stream: 3.6.2 2811 | triple-beam: 1.4.1 2812 | dev: false 2813 | 2814 | /winston@3.12.0: 2815 | resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} 2816 | engines: {node: '>= 12.0.0'} 2817 | dependencies: 2818 | '@colors/colors': 1.6.0 2819 | '@dabh/diagnostics': 2.0.3 2820 | async: 3.2.5 2821 | is-stream: 2.0.1 2822 | logform: 2.6.0 2823 | one-time: 1.0.0 2824 | readable-stream: 3.6.2 2825 | safe-stable-stringify: 2.4.3 2826 | stack-trace: 0.0.10 2827 | triple-beam: 1.4.1 2828 | winston-transport: 4.7.0 2829 | dev: false 2830 | 2831 | /wrappy@1.0.2: 2832 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2833 | 2834 | /yallist@4.0.0: 2835 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2836 | 2837 | /yaml@2.0.0-1: 2838 | resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} 2839 | engines: {node: '>= 6'} 2840 | dev: false 2841 | 2842 | /yocto-queue@0.1.0: 2843 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2844 | engines: {node: '>=10'} 2845 | dev: true 2846 | 2847 | /z-schema@5.0.5: 2848 | resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} 2849 | engines: {node: '>=8.0.0'} 2850 | hasBin: true 2851 | dependencies: 2852 | lodash.get: 4.4.2 2853 | lodash.isequal: 4.5.0 2854 | validator: 13.11.0 2855 | optionalDependencies: 2856 | commander: 9.5.0 2857 | dev: false 2858 | --------------------------------------------------------------------------------