├── .env ├── src ├── config │ ├── path.constant.ts │ ├── server.config.ts │ ├── alias.config.ts │ ├── keys │ │ ├── public.key │ │ └── private.key │ ├── secret.config.ts │ └── error.constant.ts ├── main.ts ├── utils │ ├── md5_password.ts │ ├── print_router.ts │ └── handle.error.ts ├── router │ ├── login.router.ts │ ├── menu.router.ts │ ├── story.router.ts │ ├── category.router.ts │ ├── department.router.ts │ ├── role.router.ts │ ├── goods.router.ts │ ├── index.ts │ └── user.router.ts ├── shared │ ├── middleware │ │ ├── base_error.middleware.ts │ │ ├── file.middleware.ts │ │ └── verify_auth.middleware.ts │ └── service │ │ ├── catchUserInfo.service.ts │ │ └── permission.service.ts ├── app │ ├── index.ts │ └── databases.ts └── modules │ ├── story │ ├── service │ │ └── story.service.ts │ └── controller │ │ └── story.controller.ts │ ├── category │ ├── service │ │ └── category.service.ts │ └── controller │ │ └── category.controller.ts │ ├── login │ ├── controller │ │ └── login.controller.ts │ └── middleware │ │ └── login.middleware.ts │ ├── menu │ ├── controller │ │ └── menu.controller.ts │ └── service │ │ └── menu.service.ts │ ├── department │ ├── service │ │ └── department.service.ts │ └── controller │ │ └── department.controller.ts │ ├── user │ ├── middleware │ │ └── user.middleware.ts │ ├── controller │ │ └── user.controller.ts │ └── service │ │ └── user.service.ts │ ├── goods │ ├── controller │ │ └── goods.controller.ts │ └── service │ │ └── goods.service.ts │ └── role │ ├── service │ └── role.service.ts │ └── controller │ └── role.controller.ts ├── .prettierrc ├── .env.development ├── .env.production ├── .prettierignore ├── .editorconfig ├── .gitignore ├── nodemon.json ├── typings ├── global.d.ts └── mysql2.d.ts ├── README.md ├── LICENSE ├── .eslintrc.js ├── tsconfig.json ├── package.json └── pnpm-lock.yaml /.env: -------------------------------------------------------------------------------- 1 | SERVER_HOST=http://localhost 2 | SERVER_PORT=9000 3 | -------------------------------------------------------------------------------- /src/config/path.constant.ts: -------------------------------------------------------------------------------- 1 | export const UPLOAD_PATH = './upload/' 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "tabWidth": 2, 4 | "printWidth": 80, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "semi": false, 8 | "endOfLine": "lf" 9 | } 10 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import 'module-alias/register' 2 | import './config/alias.config' 3 | import app from './app' 4 | import '@/utils/handle.error' 5 | import { SERVER_PORT } from '@/config/server.config' 6 | 7 | app.listen(SERVER_PORT, () => { 8 | console.log('koa服务器启动成功') 9 | }) 10 | -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | SERVER_HOST=http://localhost 2 | SERVER_PORT=9000 3 | DB_HOST=localhost 4 | DB_PORT=3306 5 | DB_NAME=cms 6 | DB_USER=root 7 | DB_PASSWORD='123456' 8 | ROUTER_SUFFIX=.router.ts 9 | PRIVATE_KEY_URL=src/config/keys/private.key 10 | PUBLIC_KEY_URL=src/config/keys/public.key 11 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | SERVER_HOST=http://localhost 2 | SERVER_PORT=9000 3 | DB_HOST=localhost 4 | DB_PORT=3306 5 | DB_NAME=cms 6 | DB_USER=root 7 | DB_PASSWORD='123456' 8 | ROUTER_SUFFIX=.router.js 9 | PRIVATE_KEY_URL=src/config/keys/private.key 10 | PUBLIC_KEY_URL=src/config/keys/public.key 11 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # 忽略 node_modules 目录下的所有文件 2 | node_modules/** 3 | 4 | # 忽略打包输出的目录 5 | dist/** 6 | build/** 7 | 8 | # 忽略日志文件 9 | *.log 10 | 11 | # 忽略环境配置文件 12 | .env 13 | 14 | # 忽略特定配置文件 15 | *.json 16 | *.yaml 17 | 18 | # 忽略版本控制系统目录 19 | .git/** 20 | 21 | # 忽略存储上传文件的目录 22 | uploads/** 23 | -------------------------------------------------------------------------------- /src/utils/md5_password.ts: -------------------------------------------------------------------------------- 1 | import crypto from 'crypto' 2 | 3 | function md5Password(password: string): string { 4 | const md5 = crypto.createHash('md5') 5 | 6 | // 使用十六进制(hex)加密密码,默认是二进制,通常用十六进制 7 | const md5pwd = md5.update(password).digest('hex') 8 | 9 | return md5pwd 10 | } 11 | 12 | export default md5Password 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | max_line_length = 80 11 | tab_width = 2 12 | 13 | [{*.markdown,*.md}] 14 | max_line_length = off 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /src/router/login.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import { verifyLogin } from '@/modules/login/middleware/login.middleware' 3 | import { sign } from '@/modules/login/controller/login.controller' 4 | 5 | const loginRouter = new Router({ prefix: '/login' }) 6 | 7 | loginRouter.post('/', verifyLogin, sign) 8 | 9 | export default loginRouter 10 | -------------------------------------------------------------------------------- /src/utils/print_router.ts: -------------------------------------------------------------------------------- 1 | function printError(file: string, env?: string) { 2 | if (env === 'development') { 3 | if (file !== 'index.ts') { 4 | console.log('读取失败的路由:', file) 5 | } 6 | } else if (env === 'production') { 7 | if (file !== 'index.js') { 8 | console.log('读取失败的路由:', file) 9 | } 10 | } 11 | } 12 | 13 | export default printError 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # mac 系统自带的目录 2 | .DS_Store 3 | 4 | # 项目的构建后的文件目录 5 | dist 6 | 7 | # 项目的依赖文件目录 8 | node_modules 9 | 10 | # 日志文件 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # 用户上传文件 16 | upload 17 | 18 | # 数据库配置文件 19 | .env* 20 | 21 | # 相关编辑器的配置文件目录 22 | .idea 23 | .vscode 24 | .project 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw* 30 | -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src"], 3 | "ext": "ts", 4 | "ignore": ["src/**/*.spec.ts", "src/dist"], 5 | "execMap": { 6 | "ts": "ts-node" 7 | }, 8 | "delay": 1000, 9 | "verbose": true, 10 | "restartable": "rs", 11 | "events": { 12 | "restart": "echo 'Koa Server has been restarted due to changes...'" 13 | }, 14 | "exitcrash": true, 15 | "signal": "SIGTERM" 16 | } 17 | -------------------------------------------------------------------------------- /src/router/menu.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import { create, list } from '@/modules/menu/controller/menu.controller' 4 | 5 | const menuRouter = new Router({ prefix: '/menu' }) 6 | 7 | // 新增菜单/菜单列表 8 | menuRouter.post('/', verifyAuth, create) 9 | menuRouter.post('/list', verifyAuth, list) 10 | 11 | export default menuRouter 12 | -------------------------------------------------------------------------------- /src/router/story.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import { create, list } from '@/modules/story/controller/story.controller' 4 | 5 | const storyRouter = new Router({ prefix: '/story' }) 6 | 7 | storyRouter.post('/create', verifyAuth, create) 8 | storyRouter.post('/list', verifyAuth, list) 9 | 10 | export default storyRouter 11 | -------------------------------------------------------------------------------- /src/config/server.config.ts: -------------------------------------------------------------------------------- 1 | // 从 process.env 解构需要的环境变量 2 | const { 3 | SERVER_HOST, 4 | SERVER_PORT, 5 | DB_HOST, 6 | DB_PORT, 7 | DB_NAME, 8 | DB_USER, 9 | DB_PASSWORD, 10 | PRIVATE_KEY_URL, 11 | PUBLIC_KEY_URL 12 | } = process.env 13 | 14 | // 导出环境变量 15 | export { 16 | SERVER_HOST, 17 | SERVER_PORT, 18 | DB_HOST, 19 | DB_PORT, 20 | DB_NAME, 21 | DB_USER, 22 | DB_PASSWORD, 23 | PRIVATE_KEY_URL, 24 | PUBLIC_KEY_URL 25 | } 26 | -------------------------------------------------------------------------------- /src/router/category.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import { create, list } from '@/modules/category/controller/category.controller' 4 | 5 | const categoryRouter = new Router({ prefix: '/category' }) 6 | 7 | // 新建类别 8 | categoryRouter.post('/create', verifyAuth, create) 9 | // 分类列表 10 | categoryRouter.post('/list', verifyAuth, list) 11 | 12 | export default categoryRouter 13 | -------------------------------------------------------------------------------- /src/config/alias.config.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path' 2 | import * as moduleAlias from 'module-alias' 3 | 4 | // 配置路径别名 5 | moduleAlias.addAliases({ 6 | '@/app': path.join(__dirname, '../app'), 7 | '@/config': path.join(__dirname, '../config'), 8 | '@/modules': path.join(__dirname, '../modules'), 9 | '@/router': path.join(__dirname, '../router'), 10 | '@/shared': path.join(__dirname, '../shared'), 11 | '@/utils': path.join(__dirname, '../utils') 12 | }) 13 | -------------------------------------------------------------------------------- /src/shared/middleware/base_error.middleware.ts: -------------------------------------------------------------------------------- 1 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 2 | 3 | function baseServerError(ctx: KoaCTX, next: KoaNext) { 4 | return next().catch((err) => { 5 | // 检查错误是否已经被处理或标记为自定义错误 6 | if (!err.isHandled) { 7 | throw err 8 | } else { 9 | // 记录错误日志 10 | console.error('服务器报错:', err) 11 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 12 | } 13 | }) 14 | } 15 | 16 | export default baseServerError 17 | -------------------------------------------------------------------------------- /src/config/keys/public.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuBYaV0ZptA8pU3V2ik/K 3 | Vkj+AuFEaa/uj84L9wFzZhOjMxZPN/qxLTZnxngyiRxAlFdAxtSlg+50L9Y1MsL3 4 | 4x1p2UVHeIACEWXsZ3uxf86WjH/BwVGY727ajSnJ5W2HAOjTUQ5xAR4czHEn7h4O 5 | MOpz83dhsyW/5LQgNP9wx1rj8FnJLkLhXi8nWnaD5rCG7qHxPLQJcnTwckZRq2t1 6 | sRQwYMhgHDY6XjCW9wNqRBl5fjkoCELGwCAiOsNfCwRDBxvzoDkDYGwSUToSxAo4 7 | PGIw5FV1ASPuZEeEYJdgPisaWJg9Q8tuohyFcTwH2b5kCVnvF60xzKNeuBsl9/cc 8 | lQIDAQAB 9 | -----END PUBLIC KEY----- 10 | -------------------------------------------------------------------------------- /src/shared/service/catchUserInfo.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '../../app/databases' 2 | 3 | class CatchUserInfoService { 4 | findUserName(name: string) { 5 | const statement = 'SELECT * FROM `user` WHERE name = ?;' 6 | return connection.execute(statement, [name]) 7 | } 8 | 9 | findUserId(id: number) { 10 | const statement = 'SELECT * FROM `user` WHERE id = ?;' 11 | return connection.execute(statement, [id]) 12 | } 13 | } 14 | 15 | export default new CatchUserInfoService() 16 | -------------------------------------------------------------------------------- /src/config/secret.config.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs' 2 | import { PRIVATE_KEY_URL, PUBLIC_KEY_URL } from '@/config/server.config' 3 | 4 | // dist/config/keys/ 目录下公钥和私钥不存在则抛出异常 5 | if (!fs.existsSync(PRIVATE_KEY_URL!) || !fs.existsSync(PUBLIC_KEY_URL!)) { 6 | throw new Error('The public or private key does not exist') 7 | } 8 | 9 | // 使用绝对路径读取密钥文件 10 | const PRIVATE_KEY = fs.readFileSync(PRIVATE_KEY_URL!) 11 | const PUBLIC_KEY = fs.readFileSync(PUBLIC_KEY_URL!) 12 | 13 | // 导出密钥 14 | export { PRIVATE_KEY, PUBLIC_KEY } 15 | -------------------------------------------------------------------------------- /src/app/index.ts: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv' 2 | import Koa from 'koa' 3 | import cors from '@koa/cors' 4 | import bodyParser from 'koa-bodyparser' 5 | import registerRouters from '../router' 6 | 7 | // 1.动态引入环境变量 8 | const envFile = process.env.NODE_ENV ? `.env.${process.env.NODE_ENV}` : '.env' 9 | dotenv.config({ path: envFile }) 10 | 11 | // 2.创建app 12 | const app = new Koa() 13 | 14 | // 3.使用CORS中间件 15 | app.use(cors()) 16 | 17 | // 4.对app使用中间件 18 | app.use(bodyParser()) 19 | registerRouters(app) 20 | 21 | // 导出 app 22 | export default app 23 | -------------------------------------------------------------------------------- /typings/global.d.ts: -------------------------------------------------------------------------------- 1 | type UserInfoType = { 2 | id: string 3 | name: string 4 | realname: string 5 | password: string 6 | cellphone: string 7 | enable: number // 1表示启用,0表示禁用 8 | departmentId: number 9 | roleId: number 10 | offset?: number 11 | size?: number 12 | menuList?: Array 13 | intro?: string 14 | } 15 | 16 | declare interface KoaCTX { 17 | app: Record 18 | body: Record 19 | request: { 20 | body: UserInfoType 21 | } 22 | [k: string]: any 23 | } 24 | 25 | type KoaNext = () => Promise 26 | -------------------------------------------------------------------------------- /src/router/department.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import { 4 | create, 5 | update, 6 | remove, 7 | list 8 | } from '@/modules/department/controller/department.controller' 9 | 10 | const departmentRouter = new Router({ prefix: '/department' }) 11 | 12 | // 新建部门 13 | departmentRouter.post('/', verifyAuth, create) 14 | // 编辑部门 15 | departmentRouter.patch('/:id', verifyAuth, update) 16 | // 删除部门 17 | departmentRouter.delete('/:id', verifyAuth, remove) 18 | // 部门列表 19 | departmentRouter.post('/list', verifyAuth, list) 20 | 21 | export default departmentRouter 22 | -------------------------------------------------------------------------------- /src/config/error.constant.ts: -------------------------------------------------------------------------------- 1 | export const NAME_OR_PASSWORD_IS_REQUIRED = 'name_or_password_is_required' 2 | export const NAME_IS_ALREADY_EXISTS = 'name_is_already_exists' 3 | export const NAME_IS_NOT_EXISTS = 'name_is_not_exists' 4 | export const PASSWORD_IS_INCORRENT = 'password_is_incorrent' 5 | export const UNAUTHORIZATION = 'unauthorization' 6 | export const ENABLE_IS_NOT_EXISTS = 'enable_is_not_exists' 7 | export const DEPARTMENTID_IS_NOT_EXISTS = 'departmentId_is_not_exists' 8 | export const ROLEID_IS_NOT_EXISTS = 'roleId_is_not_exists' 9 | export const USER_IS_NOT_EXISTS = 'userId_is_not_exists' 10 | export const SERVER_BASE_ERROR = 'server_base_error' 11 | -------------------------------------------------------------------------------- /src/shared/middleware/file.middleware.ts: -------------------------------------------------------------------------------- 1 | import multer from '@koa/multer' 2 | import { UPLOAD_PATH } from '../../config/path.constant' 3 | 4 | const upload = multer({ 5 | storage: multer.diskStorage({ 6 | destination( 7 | _req: any, 8 | _file: any, 9 | cb: (error: Error | null, destination: string) => void 10 | ) { 11 | cb(null, UPLOAD_PATH) 12 | }, 13 | filename( 14 | _req: any, 15 | file: any, 16 | cb: (error: Error | null, filename: string) => void 17 | ) { 18 | cb(null, Date.now() + '_' + file.originalname) 19 | } 20 | }) 21 | }) 22 | 23 | const handleAvatar = upload.single('avatar') 24 | 25 | export { handleAvatar } 26 | -------------------------------------------------------------------------------- /typings/mysql2.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'mysql2' { 2 | import { 3 | ConnectionOptions, 4 | Pool as BasePool, 5 | PoolConnection as BasePoolConnection, 6 | MysqlError as BaseMysqlError 7 | } from 'mysql' 8 | 9 | export interface Pool extends BasePool { 10 | getConnection( 11 | callback: (err: MysqlError | null, connection: PoolConnection) => void 12 | ): void 13 | promise(): any 14 | } 15 | 16 | export interface PoolConnection extends BasePoolConnection { 17 | connect(callback: (err: MysqlError | null) => void): void 18 | } 19 | 20 | export function createPool(config: ConnectionOptions): Pool 21 | 22 | export type MysqlError = BaseMysqlError 23 | } 24 | -------------------------------------------------------------------------------- /src/shared/middleware/verify_auth.middleware.ts: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken' 2 | import { UNAUTHORIZATION } from '../../config/error.constant' 3 | import { PUBLIC_KEY } from '../../config/secret.config' 4 | 5 | const verifyAuth = async (ctx: KoaCTX, next: KoaNext) => { 6 | const authorization = ctx.headers.authorization 7 | if (!authorization) { 8 | return ctx.app.emit('error', UNAUTHORIZATION, ctx) 9 | } 10 | const token = authorization.replace('Bearer ', '') 11 | 12 | try { 13 | ctx.user = jwt.verify(token, PUBLIC_KEY, { 14 | algorithms: ['RS256'] 15 | }) 16 | 17 | await next() 18 | } catch (error) { 19 | ctx.app.emit('error', UNAUTHORIZATION, ctx) 20 | } 21 | } 22 | 23 | export default verifyAuth 24 | -------------------------------------------------------------------------------- /src/router/role.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import { 4 | create, 5 | remove, 6 | update, 7 | list, 8 | assignMenu, 9 | userMenu 10 | } from '@/modules/role/controller/role.controller' 11 | 12 | const roleRouter = new Router({ prefix: '/role' }) 13 | 14 | // 增删改查 15 | roleRouter.post('/', verifyAuth, create) 16 | roleRouter.delete('/:roleId', verifyAuth, remove) 17 | roleRouter.patch('/:roleId', verifyAuth, update) 18 | roleRouter.post('/list', verifyAuth, list) 19 | // 给角色分配权限 20 | roleRouter.post('/:roleId/menu', verifyAuth, assignMenu) 21 | // 获取当前角色的菜单 22 | roleRouter.get('/:roleId/menu', verifyAuth, userMenu) 23 | 24 | export default roleRouter 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # koa-cms 2 | 群友要求分享的coderwhy的vue3-ts的cms项目后端代码,欢迎pr👏 3 | 4 | ### 运行项目 5 | - 使用 pnpm 6 | - `pnpm install` 7 | - 修改 mysql 的配置 8 | - .env.* 文件中 9 | - 开发环境 10 | - `pnpm start:dev` 11 | - 打包之后部署服务器 12 | - 使用 tsc 编译成 cjs 代码:`pnpm build` 13 | - 需要将 src/config/keys/ 目录拷贝到 dist 对应的目录中(最新版本已不需要) 14 | - 测试打包后的代码是否能正常运行:`pnpm serve` 15 | 16 | ### 理解思路 17 | - 为了方便同学们更好的理解这个项目,可以参照以下理解思路,成功启动项目之后: 18 | - 从 `@/router` 目录找到该模块的路由 19 | - 路由的最后一个中间件是业务的逻辑处理方法 20 | - 根据路由最后的方法去 `@/modules` 目录下找对应的模块 21 | - `controller` 目录是业务逻辑的处理,`service` 目录是数据库的查询 22 | 23 | ### 关于数据库 24 | - 数据库的表设计可以根据前端接口请求的参数去设计,这里不再放出 SQL 语句和表设计 25 | - 实在需要的同学可以联系我 26 | 27 | ### 项目规划 28 | - 后期会做更多的内容,可能包括以下内容: 29 | - 以文件流的形式向前端传输二进制文件 30 | - 实现单点登录 31 | - 使用消息队列 32 | - WebSocket实时通信 33 | - 微服务等 34 | -------------------------------------------------------------------------------- /src/router/goods.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import goods from '../modules/goods/controller/goods.controller' 4 | 5 | const goodsRouter = new Router({ prefix: '/goods' }) 6 | 7 | // 商品列表 8 | goodsRouter.post('/list', verifyAuth, goods.list) 9 | // 商品类别数量 10 | goodsRouter.get('/category/count', verifyAuth, goods.getCategoryCount) 11 | // 商品收藏数量 12 | goodsRouter.get('/category/favor', verifyAuth, goods.getCategoryFavor) 13 | // 查询商品总量 14 | goodsRouter.get('/amount/list', verifyAuth, goods.getAmount) 15 | // 查询类别销量 16 | goodsRouter.get('/category/sale', verifyAuth, goods.getCategorySale) 17 | // 查询地区销量 18 | goodsRouter.get('/address/sale', verifyAuth, goods.getAddressSale) 19 | 20 | export default goodsRouter 21 | -------------------------------------------------------------------------------- /src/modules/story/service/story.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '@/app/databases' 2 | 3 | class StoryService { 4 | async create(storyInfo: Record) { 5 | const statement = 'INSERT INTO story SET ?;' 6 | const [result] = await connection.query(statement, [storyInfo]) 7 | return result 8 | } 9 | async list(offset: number, size: number) { 10 | const statement = 'SELECT SQL_CALC_FOUND_ROWS * FROM story LIMIT ?, ?;' 11 | const totalStatement = 'SELECT FOUND_ROWS() AS total;' 12 | const [result] = await connection.query(statement, [offset, size]) 13 | const [[totalResult]]: any[] = await connection.execute(totalStatement) 14 | return { 15 | list: result, 16 | totalCount: totalResult.total 17 | } 18 | } 19 | } 20 | 21 | export default new StoryService() 22 | -------------------------------------------------------------------------------- /src/shared/service/permission.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '../../app/databases' 2 | 3 | class PermissionService { 4 | async checkMomentAuth(momentId: number, userId: number) { 5 | const statement = 'SELECT * FROM moment WHERE id = ? AND user_id = ?;' 6 | const [result] = await connection.execute(statement, [momentId, userId]) 7 | return Array.isArray(result) && result.length > 0 8 | } 9 | 10 | async checkResource( 11 | resourceName: string, 12 | resourceId: number, 13 | userId: number 14 | ) { 15 | const statement = `SELECT * FROM ${resourceName} WHERE id = ? AND user_id = ?;` 16 | const [result] = await connection.execute(statement, [resourceId, userId]) 17 | return Array.isArray(result) && result.length > 0 18 | } 19 | } 20 | 21 | export default new PermissionService() 22 | -------------------------------------------------------------------------------- /src/modules/category/service/category.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '@/app/databases' 2 | 3 | class CategoryService { 4 | async create(categoryInfo: Record) { 5 | const statement = 'INSERT INTO category SET ?;' 6 | const [result] = await connection.query(statement, [categoryInfo]) 7 | return result 8 | } 9 | async list(offset: number, size: number) { 10 | const statement = 'SELECT SQL_CALC_FOUND_ROWS * FROM category LIMIT ?, ?;' 11 | const totalStatement = 'SELECT FOUND_ROWS() AS total;' 12 | const [result] = await connection.query(statement, [offset, size]) 13 | const [[totalResult]]: any[] = await connection.execute(totalStatement) 14 | return { 15 | list: result, 16 | totalCount: totalResult.total 17 | } 18 | } 19 | } 20 | 21 | export default new CategoryService() 22 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs' 2 | import baseServerError from '../shared/middleware/base_error.middleware' 3 | import printError from '../utils/print_router' 4 | 5 | async function registerRouters(app: Record) { 6 | const { ROUTER_SUFFIX, NODE_ENV } = process.env 7 | 8 | // 1.读取当前文件夹下的所有文件 9 | const files = fs.readdirSync(__dirname) 10 | // 2.应用全局服务器错误拦截中间件 11 | app.use(baseServerError) 12 | 13 | // 3.遍历所有文件,添加路由 14 | for (const file of files) { 15 | if (!file.endsWith(ROUTER_SUFFIX)) { 16 | printError(file, NODE_ENV) 17 | continue 18 | } 19 | // 注意:.router.ts 文件的路由只能使用默认导出的方式 20 | const { default: router } = await import(`./${file}`) 21 | app.use(router.routes()) 22 | app.use(router.allowedMethods()) 23 | } 24 | } 25 | 26 | export default registerRouters 27 | -------------------------------------------------------------------------------- /src/modules/login/controller/login.controller.ts: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | import { PRIVATE_KEY } from '@/config/secret.config' 4 | 5 | class LoginController { 6 | sign(ctx: KoaCTX) { 7 | try { 8 | const { id, name } = ctx.user 9 | const token = jwt.sign({ id, name }, PRIVATE_KEY, { 10 | expiresIn: 24 * 60 * 60, // 设置token的过期时间:1天 11 | algorithm: 'RS256' 12 | }) 13 | ctx.body = { 14 | code: 0, 15 | data: { 16 | id, 17 | name, 18 | token 19 | }, 20 | message: '登录成功' 21 | } 22 | } catch (error) { 23 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 24 | } 25 | } 26 | } 27 | 28 | export default new LoginController() 29 | export const { sign } = new LoginController() 30 | -------------------------------------------------------------------------------- /src/router/user.router.ts: -------------------------------------------------------------------------------- 1 | import Router from '@koa/router' 2 | import verifyAuth from '../shared/middleware/verify_auth.middleware' 3 | import { 4 | create, 5 | update, 6 | remove, 7 | list, 8 | detail 9 | } from '@/modules/user/controller/user.controller' 10 | import { 11 | verifyUser, 12 | handlePassword, 13 | verifyNameExists, 14 | verifyUserExists 15 | } from '@/modules/user/middleware/user.middleware' 16 | 17 | const userRouter = new Router({ prefix: '/users' }) 18 | 19 | // 用户注册 20 | userRouter.post('/', verifyUser, verifyNameExists, handlePassword, create) 21 | // 编辑用户 22 | userRouter.patch('/:id', verifyAuth, verifyUser, verifyUserExists, update) 23 | // 删除用户 24 | userRouter.delete('/:id', verifyAuth, verifyUserExists, remove) 25 | // 用户列表 26 | userRouter.post('/list', verifyAuth, list) 27 | // 用户详情 28 | userRouter.get('/:id', verifyAuth, detail) 29 | 30 | export default userRouter 31 | -------------------------------------------------------------------------------- /src/app/databases.ts: -------------------------------------------------------------------------------- 1 | import mysql, { PoolConnection, MysqlError } from 'mysql2' 2 | import { 3 | DB_HOST, 4 | DB_PORT, 5 | DB_NAME, 6 | DB_USER, 7 | DB_PASSWORD 8 | } from '@/config/server.config' 9 | 10 | const connectionPool = mysql.createPool({ 11 | host: DB_HOST || 'localhost', 12 | port: Number(DB_PORT ?? 3306), 13 | database: DB_NAME || 'cms', 14 | user: DB_USER || 'root', 15 | password: DB_PASSWORD || '', 16 | connectionLimit: 5 17 | }) 18 | 19 | // 检测连接数据库是否成功 20 | connectionPool.getConnection((err: MysqlError | null, conn: PoolConnection) => { 21 | // 判断是否有错误信息 22 | if (err) { 23 | console.error('数据库连接失败', err) 24 | return 25 | } 26 | 27 | // 获取connection,尝试和数据库建立连接 28 | conn.connect((err) => { 29 | if (err) { 30 | console.error('和数据库交互失败', err) 31 | } else { 32 | console.log('数据库连接成功,可以操作') 33 | } 34 | }) 35 | }) 36 | 37 | export default connectionPool.promise() 38 | -------------------------------------------------------------------------------- /src/modules/story/controller/story.controller.ts: -------------------------------------------------------------------------------- 1 | import storyService from '../service/story.service' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | 4 | class StoryController { 5 | async create(ctx: KoaCTX) { 6 | try { 7 | await storyService.create(ctx.request.body) 8 | ctx.body = { 9 | code: 0, 10 | message: '创建故事成功~' 11 | } 12 | } catch (error) { 13 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 14 | } 15 | } 16 | async list(ctx: KoaCTX) { 17 | const { offset = 0, size = 10 } = ctx.request.body 18 | try { 19 | const data = await storyService.list(offset, size) 20 | ctx.body = { 21 | code: 0, 22 | data 23 | } 24 | } catch (error) { 25 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 26 | } 27 | } 28 | } 29 | 30 | export default new StoryController() 31 | export const { create, list } = new StoryController() 32 | -------------------------------------------------------------------------------- /src/modules/category/controller/category.controller.ts: -------------------------------------------------------------------------------- 1 | import CategoryService from '@/modules/category/service/category.service' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | 4 | class CategoryController { 5 | async create(ctx: KoaCTX) { 6 | try { 7 | await CategoryService.create(ctx.request.body) 8 | ctx.body = { 9 | code: 0, 10 | message: '创建类别成功~' 11 | } 12 | } catch (error) { 13 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 14 | } 15 | } 16 | async list(ctx: KoaCTX) { 17 | const { offset = 0, size = 10 } = ctx.request.body 18 | try { 19 | const data = await CategoryService.list(offset, size) 20 | 21 | ctx.body = { 22 | code: 0, 23 | data 24 | } 25 | } catch (error) { 26 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 27 | } 28 | } 29 | } 30 | 31 | export default new CategoryController() 32 | export const { create, list } = new CategoryController() 33 | -------------------------------------------------------------------------------- /src/modules/menu/controller/menu.controller.ts: -------------------------------------------------------------------------------- 1 | import menuService from '../service/menu.service' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | 4 | class MenuController { 5 | async create(ctx: KoaCTX) { 6 | try { 7 | const menu = ctx.request.body 8 | const result = await menuService.create(menu) 9 | ctx.body = { 10 | code: 0, 11 | message: '菜单创建成功', 12 | data: result 13 | } 14 | } catch (err) { 15 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 16 | } 17 | } 18 | async list(ctx: KoaCTX) { 19 | try { 20 | const result = await menuService.wholeMenu() 21 | ctx.body = { 22 | code: 0, 23 | message: '获取完整菜单~', 24 | data: { 25 | list: result 26 | } 27 | } 28 | } catch (e) { 29 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 30 | } 31 | } 32 | } 33 | 34 | export default new MenuController() 35 | export const { create, list } = new MenuController() 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Hersan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/modules/login/middleware/login.middleware.ts: -------------------------------------------------------------------------------- 1 | import userService from '@/modules/user/service/user.service' 2 | import { 3 | NAME_IS_NOT_EXISTS, 4 | NAME_OR_PASSWORD_IS_REQUIRED, 5 | PASSWORD_IS_INCORRENT, 6 | SERVER_BASE_ERROR 7 | } from '@/config/error.constant' 8 | import md5Password from '@/utils/md5_password' 9 | 10 | const verifyLogin = async (ctx: KoaCTX, next: KoaNext) => { 11 | try { 12 | const { name, password } = ctx.request.body 13 | // 1.判断用户名和密码是否为空 14 | if (!name || !password) { 15 | return ctx.app.emit('error', NAME_OR_PASSWORD_IS_REQUIRED, ctx) 16 | } 17 | 18 | // 2.查询该用户是否在数据库中存在 19 | const [[user]]: any = await userService.findUserName(name) 20 | 21 | if (!user) { 22 | return ctx.app.emit('error', NAME_IS_NOT_EXISTS, ctx) 23 | } 24 | 25 | // 3.查询数据库中密码和用户传递的密码是否一致 26 | if (user.password !== md5Password(password)) { 27 | return ctx.app.emit('error', PASSWORD_IS_INCORRENT, ctx) 28 | } 29 | 30 | ctx.user = user 31 | await next() 32 | } catch (error) { 33 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 34 | } 35 | } 36 | 37 | export { verifyLogin } 38 | -------------------------------------------------------------------------------- /src/modules/department/service/department.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '@/app/databases' 2 | 3 | class DepartmentService { 4 | async create(departmentInfo: Record) { 5 | const statement = 'INSERT INTO departments SET ?;' 6 | const [result] = await connection.query(statement, [departmentInfo]) 7 | return result 8 | } 9 | 10 | async update(id: string, departmentInfo: Record) { 11 | const statement = 'UPDATE departments SET ? WHERE id = ?;' 12 | const [result] = await connection.query(statement, [departmentInfo, id]) 13 | return result 14 | } 15 | 16 | async remove(departmentId: string) { 17 | const statement = 'DELETE FROM `departments` WHERE id = ?;' 18 | return await connection.execute(statement, [departmentId]) 19 | } 20 | 21 | async list(offset: number, size: number) { 22 | const statement = 23 | 'SELECT SQL_CALC_FOUND_ROWS * FROM departments LIMIT ?, ?;' 24 | const totalStatement = 'SELECT FOUND_ROWS() AS total;' 25 | const [result] = await connection.query(statement, [offset, size]) 26 | const [[totalResult]]: any[] = await connection.execute(totalStatement) 27 | return { 28 | list: result, 29 | totalCount: totalResult.total 30 | } 31 | } 32 | } 33 | 34 | export default new DepartmentService() 35 | -------------------------------------------------------------------------------- /src/modules/menu/service/menu.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '@/app/databases' 2 | 3 | class MenuService { 4 | async create(menu: Record) { 5 | const statement = `INSERT INTO menus SET ?;` 6 | const [result] = await connection.query(statement, [menu]) 7 | return result 8 | } 9 | 10 | // 获取完整菜单树 11 | async wholeMenu() { 12 | const statement = ` 13 | SELECT 14 | m1.id id, m1.name name, m1.type type, m1.url url, m1.icon icon, m1.sort sort, m1.createAt createAt, 15 | m1.updateAt updateAt, 16 | (SELECT JSON_ARRAYAGG( 17 | JSON_OBJECT("id", m2.id, "name", m2.name, "type", m2.type, "parentId", m2.parentId, "url", m2.url, 18 | "sort", m2.sort, "createAt", m2.createAt, "updateAt", m2.updateAt, 19 | "children", (SELECT JSON_ARRAYAGG( 20 | JSON_OBJECT("id", m3.id, "name", m3.name, "type", m3.type, "parentId", m3.parentId, "url", m3.url, 21 | "sort", m3.sort, "permission", m3.permission, "createAt", m3.createAt, "updateAt", m3.updateAt) 22 | ) FROM menus m3 WHERE m3.parentId = m2.id ORDER BY m3.sort)) 23 | ) FROM menus m2 WHERE m1.id = m2.parentId ORDER BY m2.sort) children 24 | FROM menus m1 25 | WHERE m1.type = 1; 26 | ` 27 | const [result] = await connection.query(statement) 28 | return result 29 | } 30 | } 31 | 32 | export default new MenuService() 33 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | node: true, // 指定脚本的运行环境是 Node.js 4 | es2021: true // 使用 ES2021 的语法支持 5 | }, 6 | extends: [ 7 | 'eslint:recommended', // 使用 ESLint 的推荐规则 8 | 'plugin:@typescript-eslint/recommended', // 使用 TypeScript 插件的推荐规则 9 | 'plugin:prettier/recommended' // 启用 Prettier 插件,确保代码风格的一致性 10 | ], 11 | parser: '@typescript-eslint/parser', // 指定 ESLint 解析器 12 | parserOptions: { 13 | ecmaVersion: 12, // ECMAScript 版本 14 | sourceType: 'module', // 模块化类型,使用 ES 模块 15 | project: './tsconfig.json' // 指向 TypeScript 配置文件,让 ESLint 了解项目结构 16 | }, 17 | plugins: [ 18 | '@typescript-eslint', // 使用 TypeScript 插件 19 | 'prettier' // 使用 Prettier 插件 20 | ], 21 | rules: { 22 | 'prettier/prettier': 'error', // Prettier 的错误显示为 ESLint 错误 23 | 'no-unused-vars': 'off', // 关闭这个规则,因为 TypeScript 已经检查了 24 | '@typescript-eslint/no-unused-vars': ['error', { vars: 'all', args: 'after-used', ignoreRestSiblings: true }], 25 | '@typescript-eslint/no-explicit-any': 'off', 26 | // 对未使用的变量报错,但允许参数在使用之后的变量未被使用 27 | 'no-console': 'off', // 对 console 语句关闭警告 28 | 'eqeqeq': ['error', 'always'], // 要求使用 === 和 !== 29 | 'curly': 'error', // 强制使用大括号的风格 30 | 'no-throw-literal': 'error', // 禁止抛出字面量错误 throw "error"; 必须使用 Error 对象 31 | 'no-return-await': 'off', // 禁止不必要的 return await 32 | 'require-await': 'error' // 禁止没有 await 表达式的 async 函数 33 | }, 34 | ignorePatterns: ['.eslintrc.js'], // 忽略 ESLint 检查的文件 35 | }; 36 | -------------------------------------------------------------------------------- /src/modules/department/controller/department.controller.ts: -------------------------------------------------------------------------------- 1 | import departmentService from '../service/department.service' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | 4 | class DepartmentController { 5 | async create(ctx: KoaCTX) { 6 | try { 7 | await departmentService.create(ctx.request.body) 8 | ctx.body = { 9 | code: 0, 10 | message: '创建部门成功~' 11 | } 12 | } catch (error) { 13 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 14 | } 15 | } 16 | 17 | async remove(ctx: KoaCTX) { 18 | try { 19 | const departmentId = ctx.params.id 20 | await departmentService.remove(departmentId) 21 | ctx.body = { 22 | code: 0, 23 | message: '删除部门成功~' 24 | } 25 | } catch (error) { 26 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 27 | } 28 | } 29 | 30 | async update(ctx: KoaCTX) { 31 | try { 32 | const departmentId = ctx.params.id 33 | await departmentService.update(departmentId, ctx.request.body) 34 | ctx.body = { 35 | code: 0, 36 | message: '更新部门成功~' 37 | } 38 | } catch (error) { 39 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 40 | } 41 | } 42 | 43 | async list(ctx: KoaCTX) { 44 | const { offset = 0, size = 10 } = ctx.request.body 45 | try { 46 | const data = await departmentService.list(offset, size) 47 | 48 | ctx.body = { 49 | code: 0, 50 | data 51 | } 52 | } catch (error) { 53 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 54 | } 55 | } 56 | } 57 | 58 | export default new DepartmentController() 59 | export const { create, update, list, remove } = new DepartmentController() 60 | -------------------------------------------------------------------------------- /src/config/keys/private.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpAIBAAKCAQEAuBYaV0ZptA8pU3V2ik/KVkj+AuFEaa/uj84L9wFzZhOjMxZP 3 | N/qxLTZnxngyiRxAlFdAxtSlg+50L9Y1MsL34x1p2UVHeIACEWXsZ3uxf86WjH/B 4 | wVGY727ajSnJ5W2HAOjTUQ5xAR4czHEn7h4OMOpz83dhsyW/5LQgNP9wx1rj8FnJ 5 | LkLhXi8nWnaD5rCG7qHxPLQJcnTwckZRq2t1sRQwYMhgHDY6XjCW9wNqRBl5fjko 6 | CELGwCAiOsNfCwRDBxvzoDkDYGwSUToSxAo4PGIw5FV1ASPuZEeEYJdgPisaWJg9 7 | Q8tuohyFcTwH2b5kCVnvF60xzKNeuBsl9/cclQIDAQABAoIBABjb0z7J4WhRS9Fb 8 | YWCYGcjBHpwg824aNerxdigq5/x21mkFsDjs/5QNbsIcZSaizA28IqE3Agro3oO/ 9 | N3vdXEAtLqgKdPZOwvi6fMwUpgmOSkI61l1WuYJLw/OgGwWCXuK+jhq6CoSOHnF1 10 | LmE3ac8tOe88xdK9XEZ0FI1TmVUyNDokISt94dnltrLiOjAf37mMnwz7zWeiruPL 11 | tSYM16FYTtx3TxkSEVpBaWAYjTtrr1E2zcg6d0RaHsv+GzyuQJFU7ONsj7yZJpb4 12 | BeRvp1tHbDJA9XY1KqLR7/PjfG+Ek9wtxjLeLJMReSDQCOi+NN2GRqlzeOixE0nJ 13 | jWAiaUECgYEA4rfBViO4B8maWMoC1xxf6iI6YN5zxqJrIWRhLpT2CaAgdyvLIquC 14 | QAPLSLDA1/G87FZ8KpMs42BN5zhHW8IJ0vF127LpXneAKmvJ5YDn18S4eoks6I9a 15 | qrDoUshJxpNWxgV79dvTZrCpHHg5Yk657w+LtzZtktqJyRQgBSo+7h0CgYEAz9zF 16 | td9agPSwGKglFFZRT6ObrBdbNZSe4Y2s4GPdzGLfs0iYtDOiYNwFvjwFq/OSVVvc 17 | QoENzafdtcVOvHM5zwiWsrtXiVaV2AqBGlS8GTkotw9HkOxb1v685LaTl9hFzB3W 18 | nOT6iOtuxq+8Euu3LTAYuknmoeQ3NLYuLcWRftkCgYAmCvmJL8Mwo1af8X3ahKtf 19 | iVDMcmdw/E4Hs2VPQLWsVc88z/9tGORpQ3m3/9jMI4c1DSoWps2Qddd8pgfrULr/ 20 | R38kV3grXtgFxkKBnUjJ/vuJrDz55RwsqjTBt1QR2yVjYwYy8ikeASTPXykZ4uX2 21 | RGCIZLysOLmIITViSH14zQKBgQClccCAESXVDGz5QyQ4Orf/Xmayo+h6DjAjsQNP 22 | ms1YN7570aWRkKOG2rlLgDS3d2gavsHiwRt+fEUwv7n6ru/tRJXF7u0uqBceXMYD 23 | cjxBC0jH48Z/qFE1H46zsEprir2LSJigSnTK9DE4vXlByhIDSov0AowqgR4bu4Gn 24 | 9t/miQKBgQCDIgaXCcp1o+4oM3w/DGtWhTHymejuUgNT8YsKZ/vVVz5BnMHjNBR4 25 | wByDKC5rVsfaxL4iL504JUQBgyASfQiIZ8GTCaOoa2C/e+5KjnoVrsvyjoaBbe/p 26 | yUDbpZSKXF+mGVw7ifK9Co9pxQKZbinSYgr42VRxh2/1XK3B3UWMDA== 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /src/utils/handle.error.ts: -------------------------------------------------------------------------------- 1 | import app from '../app' 2 | import { 3 | NAME_OR_PASSWORD_IS_REQUIRED, 4 | NAME_IS_ALREADY_EXISTS, 5 | NAME_IS_NOT_EXISTS, 6 | PASSWORD_IS_INCORRENT, 7 | UNAUTHORIZATION, 8 | ENABLE_IS_NOT_EXISTS, 9 | ROLEID_IS_NOT_EXISTS, 10 | DEPARTMENTID_IS_NOT_EXISTS, 11 | USER_IS_NOT_EXISTS, 12 | SERVER_BASE_ERROR 13 | } from '@/config/error.constant' 14 | 15 | app.on('error', (error: string, ctx: Record) => { 16 | let code: number = 0 17 | let message: string = '' 18 | let status: number | undefined 19 | 20 | switch (error) { 21 | case SERVER_BASE_ERROR: 22 | status = 500 23 | code = -1000 24 | message = '服务器内部错误' 25 | break 26 | case NAME_OR_PASSWORD_IS_REQUIRED: 27 | code = -1001 28 | message = '用户名或者密码不能为空' 29 | break 30 | case NAME_IS_ALREADY_EXISTS: 31 | code = -1002 32 | message = '用户名已经存在' 33 | break 34 | case NAME_IS_NOT_EXISTS: 35 | code = -1003 36 | message = '用户名不存在' 37 | break 38 | case PASSWORD_IS_INCORRENT: 39 | code = -1004 40 | message = '密码错误,请重新输入' 41 | break 42 | case UNAUTHORIZATION: 43 | code = -1005 44 | message = '无效的token或者token已过期' 45 | break 46 | case ENABLE_IS_NOT_EXISTS: 47 | code = -1006 48 | message = '用户状态不能为空' 49 | break 50 | case USER_IS_NOT_EXISTS: 51 | code = -1007 52 | message = '用户id不存在' 53 | break 54 | case ROLEID_IS_NOT_EXISTS: 55 | code = -2001 56 | message = '角色id不能为空' 57 | break 58 | case DEPARTMENTID_IS_NOT_EXISTS: 59 | code = -3001 60 | message = '部门id不能为空' 61 | break 62 | } 63 | 64 | if (status) { 65 | ctx.status = status 66 | } 67 | ctx.body = { code, message } 68 | }) 69 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "types": ["node"], // 添加 node 类型 4 | "target": "ESNext", // 编译到的 ECMAScript 版本,es2018 支持 async/await 5 | "module": "CommonJS", // 模块系统,Node.js 使用 CommonJS 6 | "lib": ["ESNext"], // 编译时需要引入的库文件的列表 7 | "outDir": "./dist", // 指定输出目录 8 | "rootDir": "./src", // 指定输入文件的根目录 9 | "strict": true, // 启用所有严格类型检查选项 10 | "esModuleInterop": true, // 允许导出非ES模块 11 | "skipLibCheck": true, // 跳过所有声明文件(*.d.ts)的类型检查 12 | "forceConsistentCasingInFileNames": true, // 禁止对同一个文件的不一致的大小写引用 13 | "moduleResolution": "node", // 模块解析策略,Node 适用的是 "node" 14 | "resolveJsonModule": true, // 允许导入.json文件作为模块 15 | "noImplicitAny": true, // 在表达式和声明上有隐含的 'any' 类型时报错 16 | "noUnusedLocals": false, // 报告文件中未使用的局部变量错误 17 | "noUnusedParameters": false, // 报告函数中未使用的参数错误 18 | "noImplicitReturns": true, // 检查函数是否都有返回值 19 | "noFallthroughCasesInSwitch": true, // 检查 Switch 语句,防止 case 穿透 20 | "removeComments": false, // 不删除编译后代码中的注释 21 | "experimentalDecorators": true, // 启用对 ES 装饰器的实验性支持 22 | "emitDecoratorMetadata": true, // 为装饰器提供元数据支持 23 | "baseUrl": "./src", 24 | "paths": { 25 | "mysql2": ["./typings/mysql2.d.ts"], 26 | "@/*": ["*"] 27 | } 28 | }, 29 | "include": [ 30 | "src/**/*", // 包含的文件路径模式 31 | "typings/**/*" 32 | ], 33 | "exclude": [ 34 | "node_modules", // 排除的文件路径模式 35 | "**/*.spec.ts" // 排除所有测试文件 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "koa-cms", 3 | "version": "1.1.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "start": "nodemon ./src/main.ts", 10 | "start:dev": "cross-env-shell NODE_ENV=development nodemon --exec 'ts-node -r module-alias/register' --files -T -P ./tsconfig.json ./src/main.ts", 11 | "start:test": "cross-env-shell NODE_ENV=test nodemon --exec 'ts-node -r module-alias/register' --files -T -P ./tsconfig.json ./src/main.ts", 12 | "start:prod": "cross-env-shell NODE_ENV=production nodemon --exec 'ts-node -r module-alias/register' --files -T -P ./tsconfig.json ./src/main.ts", 13 | "build": "tsc -p ./tsconfig.json", 14 | "serve": "cross-env-shell NODE_ENV=production nodemon dist/main.js" 15 | }, 16 | "keywords": [ 17 | "koa", 18 | "vue3-ts-cms", 19 | "cms" 20 | ], 21 | "author": "HersanKuang", 22 | "license": "MIT", 23 | "dependencies": { 24 | "@koa/cors": "^5.0.0", 25 | "@koa/router": "^12.0.0", 26 | "crypto": "^1.0.1", 27 | "dotenv": "^16.3.1", 28 | "jsonwebtoken": "^9.0.0", 29 | "koa": "^2.14.2", 30 | "koa-bodyparser": "^4.4.1", 31 | "module-alias": "^2.2.3", 32 | "mysql2": "^3.4.1", 33 | "tsconfig-paths": "^4.2.0", 34 | "uuid": "^9.0.0" 35 | }, 36 | "devDependencies": { 37 | "@koa/multer": "^3.0.2", 38 | "@types/jsonwebtoken": "^9.0.6", 39 | "@types/koa": "^2.15.0", 40 | "@types/koa-bodyparser": "^4.3.12", 41 | "@types/koa__cors": "^5.0.0", 42 | "@types/koa__multer": "^2.0.7", 43 | "@types/koa__router": "^12.0.4", 44 | "@types/module-alias": "^2.0.4", 45 | "@types/node": "^20.12.7", 46 | "@types/uuid": "^9.0.8", 47 | "@typescript-eslint/eslint-plugin": "^7.8.0", 48 | "@typescript-eslint/parser": "^7.8.0", 49 | "cross-env": "^7.0.3", 50 | "eslint": "^8.56.0", 51 | "eslint-config-prettier": "^9.1.0", 52 | "eslint-plugin-prettier": "^5.1.3", 53 | "nodemon": "^3.1.0", 54 | "prettier": "^3.2.5", 55 | "ts-node": "^10.9.2", 56 | "typescript": "^5.4.5" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/modules/user/middleware/user.middleware.ts: -------------------------------------------------------------------------------- 1 | import { 2 | NAME_OR_PASSWORD_IS_REQUIRED, 3 | NAME_IS_ALREADY_EXISTS, 4 | ENABLE_IS_NOT_EXISTS, 5 | DEPARTMENTID_IS_NOT_EXISTS, 6 | ROLEID_IS_NOT_EXISTS, 7 | USER_IS_NOT_EXISTS 8 | } from '@/config/error.constant' 9 | import userInfoService from '@/shared/service/catchUserInfo.service' 10 | import md5Password from '@/utils/md5_password' 11 | 12 | const verifyUser = async (ctx: KoaCTX, next: KoaNext) => { 13 | // 1.获取用户传过来的信息 14 | const { name, password, roleId, departmentId, enable } = ctx.request.body 15 | const userId = ctx.params.id 16 | 17 | // 2.验证客户端传递过来的user是否可以保存到数据库中 18 | if (!userId && (!name || !password)) { 19 | console.log(userId) 20 | return ctx.app.emit('error', NAME_OR_PASSWORD_IS_REQUIRED, ctx) 21 | } 22 | 23 | if (enable !== 0 && enable !== 1) { 24 | return ctx.app.emit('error', ENABLE_IS_NOT_EXISTS, ctx) 25 | } 26 | 27 | if (!roleId) { 28 | return ctx.app.emit('error', ROLEID_IS_NOT_EXISTS, ctx) 29 | } 30 | 31 | if (!departmentId) { 32 | return ctx.app.emit('error', DEPARTMENTID_IS_NOT_EXISTS, ctx) 33 | } 34 | await next() 35 | } 36 | 37 | const verifyNameExists = async (ctx: KoaCTX, next: KoaNext) => { 38 | const [values] = await userInfoService.findUserName(ctx.request.body.name) 39 | if (Array.isArray(values) && values.length) { 40 | return ctx.app.emit('error', NAME_IS_ALREADY_EXISTS, ctx) 41 | } 42 | 43 | await next() 44 | } 45 | 46 | const verifyUserExists = async (ctx: KoaCTX, next: KoaNext) => { 47 | try { 48 | const userId = ctx.params.id 49 | const [values] = await userInfoService.findUserId(userId) 50 | if (Array.isArray(values) && !values.length) { 51 | return ctx.app.emit('error', USER_IS_NOT_EXISTS, ctx) 52 | } 53 | 54 | await next() 55 | } catch (error) { 56 | console.log(error) 57 | } 58 | } 59 | 60 | const handlePassword = async (ctx: KoaCTX, next: KoaNext) => { 61 | const { password } = ctx.request.body 62 | // 使用md5加密密码 63 | ctx.request.body.password = md5Password(password) 64 | 65 | await next() 66 | } 67 | 68 | export { verifyUser, handlePassword, verifyNameExists, verifyUserExists } 69 | -------------------------------------------------------------------------------- /src/modules/goods/controller/goods.controller.ts: -------------------------------------------------------------------------------- 1 | import goodService from '@/modules/goods/service/goods.service' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | 4 | class GoodsService { 5 | async list(ctx: KoaCTX) { 6 | const { offset = 0, size = 10 } = ctx.request.body 7 | try { 8 | const data = await goodService.list(offset, size) 9 | ctx.body = { 10 | code: 0, 11 | data 12 | } 13 | } catch (error) { 14 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 15 | } 16 | } 17 | // 根据查询当前商品所属分类的数量 18 | async getCategoryCount(ctx: KoaCTX) { 19 | try { 20 | const data = await goodService.getCategoryCount() 21 | ctx.body = { 22 | code: 0, 23 | data 24 | } 25 | } catch (e) { 26 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 27 | } 28 | } 29 | // 根据查询当前商品所属分类的数量 30 | async getCategoryFavor(ctx: KoaCTX) { 31 | try { 32 | const data = await goodService.getCategoryFavor() 33 | ctx.body = { 34 | code: 0, 35 | data 36 | } 37 | } catch (e) { 38 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 39 | } 40 | } 41 | // 查询总量 42 | async getAmount(ctx: KoaCTX) { 43 | try { 44 | const data = await goodService.getAmount() 45 | ctx.body = { 46 | code: 0, 47 | data 48 | } 49 | } catch (e) { 50 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 51 | } 52 | } 53 | // 根据查询当前商品所属分类的销量 54 | async getCategorySale(ctx: KoaCTX) { 55 | try { 56 | const data = await goodService.getCategorySale() 57 | ctx.body = { 58 | code: 0, 59 | data 60 | } 61 | } catch (e) { 62 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 63 | } 64 | } 65 | // 根据查询当前商品所属地区的销量 66 | async getAddressSale(ctx: KoaCTX) { 67 | try { 68 | const data = await goodService.getAddressSale() 69 | ctx.body = { 70 | code: 0, 71 | data 72 | } 73 | } catch (e) { 74 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 75 | } 76 | } 77 | } 78 | 79 | export default new GoodsService() 80 | export const { 81 | list, 82 | getAddressSale, 83 | getCategorySale, 84 | getCategoryFavor, 85 | getCategoryCount, 86 | getAmount 87 | } = new GoodsService() 88 | -------------------------------------------------------------------------------- /src/modules/user/controller/user.controller.ts: -------------------------------------------------------------------------------- 1 | import userService from '../service/user.service' 2 | import { v4 as uuidv4 } from 'uuid' 3 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 4 | 5 | class UserController { 6 | async create(ctx: KoaCTX) { 7 | // 创建uuid 8 | ctx.request.body.id = uuidv4() 9 | 10 | try { 11 | // 将user信息传入数据库中 12 | await userService.create(ctx.request.body) 13 | ctx.body = { 14 | code: 0, 15 | message: '创建用户成功', 16 | data: ctx.request.body.id 17 | } 18 | } catch (error) { 19 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 20 | } 21 | } 22 | 23 | async update(ctx: KoaCTX) { 24 | try { 25 | const userId = ctx.params.id 26 | await userService.update(userId, ctx.request.body) 27 | ctx.body = { 28 | code: 0, 29 | message: '修改成功', 30 | data: userId 31 | } 32 | } catch (error) { 33 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 34 | } 35 | } 36 | 37 | async remove(ctx: KoaCTX) { 38 | try { 39 | const userId = ctx.params.id 40 | await userService.remove(userId) 41 | ctx.body = { 42 | code: 0, 43 | message: '删除用户成功~' 44 | } 45 | } catch (error) { 46 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 47 | } 48 | } 49 | 50 | async list(ctx: KoaCTX) { 51 | const { offset = 0, size = 10, ...rest } = ctx.request.body 52 | try { 53 | const data = await userService.list(offset, size, rest) 54 | 55 | ctx.body = { 56 | code: 0, 57 | data 58 | } 59 | } catch (error) { 60 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 61 | } 62 | } 63 | 64 | async detail(ctx: KoaCTX) { 65 | try { 66 | const userId = ctx.params.id 67 | const [[result]]: any = await userService.userDetail(userId) 68 | const [[roleResult]]: any = await userService.roleDetail(result.roleId) 69 | const [[departmentResult]]: any = await userService.departmentDetail( 70 | result.departmentId 71 | ) 72 | 73 | if (typeof result === 'object') { 74 | delete result.roleId 75 | delete result.departmentId 76 | delete result.password 77 | } 78 | 79 | ctx.body = { 80 | code: 0, 81 | data: { 82 | ...result, 83 | department: departmentResult, 84 | role: roleResult 85 | } 86 | } 87 | } catch (error) { 88 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 89 | } 90 | } 91 | } 92 | 93 | export default new UserController() 94 | export const { create, list, update, remove, detail } = new UserController() 95 | -------------------------------------------------------------------------------- /src/modules/role/service/role.service.ts: -------------------------------------------------------------------------------- 1 | import menuService from '@/modules/menu/service/menu.service' 2 | import connection from '@/app/databases' 3 | 4 | class RoleService { 5 | async create(role: Record) { 6 | const statement = `INSERT INTO roles SET ?;` 7 | const [result] = await connection.query(statement, [role]) 8 | return result 9 | } 10 | 11 | async update(roleId: string, role: Record) { 12 | const statement = `UPDATE roles SET ? WHERE id = ?;` 13 | const [result] = await connection.query(statement, [role, roleId]) 14 | return result 15 | } 16 | 17 | async remove(roleId: string) { 18 | const statement = 'DELETE FROM `roles` WHERE id = ?;' 19 | return await connection.execute(statement, [roleId]) 20 | } 21 | 22 | async list(offset = 0, size = 100) { 23 | const statement = `SELECT * FROM roles LIMIT ?, ?;` 24 | const [result] = await connection.query(statement, [offset, size]) 25 | return result 26 | } 27 | 28 | async assignMenu(roleId: string, menuIds: string[]) { 29 | // 1.先删除之前的关系 30 | const deleteStatement = `DELETE FROM roles_menus WHERE roleId = ?;` 31 | await connection.query(deleteStatement, [roleId]) 32 | 33 | // 2.插入新的值 34 | const insertStatement = `INSERT INTO roles_menus (roleId, menuId) VALUES (?, ?);` 35 | for (const menuId of menuIds) { 36 | await connection.query(insertStatement, [roleId, menuId]) 37 | } 38 | } 39 | 40 | async queryRoleId() { 41 | const statement = `SELECT id FROM roles ORDER BY updateAt DESC LIMIT 1;` 42 | const [[result]]: any[] = await connection.execute(statement) 43 | return result.id 44 | } 45 | 46 | async getRoleMenu(roleId: string) { 47 | // 1.根据roleId获取所有的menuId 48 | const getMenuIdsStatement = ` 49 | SELECT 50 | rm.roleId, JSON_ARRAYAGG(rm.menuId) menuIds 51 | FROM roles_menus rm 52 | WHERE rm.roleId = ? 53 | GROUP BY rm.roleId; 54 | ` 55 | const [roleMenuIds]: any[] = await connection.query(getMenuIdsStatement, [ 56 | roleId 57 | ]) 58 | const menuIds = roleMenuIds.shift()?.menuIds 59 | 60 | // 2.获取完整的菜单树 61 | const wholeMenu = await menuService.wholeMenu() 62 | 63 | // 3.从完整的菜单树中过滤掉menuIds 64 | function filterMenu(menu: Record[]) { 65 | const newMenu = [] 66 | for (const item of menu) { 67 | if (item.children) { 68 | item.children = filterMenu(item.children) 69 | } 70 | if (menuIds && menuIds.includes(item.id)) { 71 | newMenu.push(item) 72 | } 73 | } 74 | return newMenu 75 | } 76 | return filterMenu(wholeMenu as any[]) 77 | } 78 | } 79 | 80 | export default new RoleService() 81 | -------------------------------------------------------------------------------- /src/modules/user/service/user.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '@/app/databases' 2 | 3 | class UserService { 4 | async create(userInfo: UserInfoType) { 5 | const keys = Object.keys(userInfo) 6 | const values = Object.values(userInfo) 7 | 8 | const columns = keys.join(', ') 9 | const placeholders = keys.map(() => '?').join(', ') 10 | const statement = `INSERT INTO user (${columns}) VALUES (${placeholders});` 11 | return await connection.execute(statement, values) 12 | } 13 | 14 | async update(userId: string, userInfo: Record) { 15 | const keys = Object.keys(userInfo) 16 | const values = Object.values(userInfo) 17 | const setClause = keys.map((key) => `${key} = ?`).join(', ') 18 | 19 | const statement = `UPDATE user SET ${setClause} WHERE id = ?;` 20 | return await connection.execute(statement, [...values, userId]) 21 | } 22 | 23 | async findUserName(name: string) { 24 | const statement = 'SELECT * FROM `user` WHERE name = ?;' 25 | return await connection.execute(statement, [name]) 26 | } 27 | 28 | async remove(userId: string) { 29 | const statement = 'DELETE FROM `user` WHERE id = ?;' 30 | return await connection.execute(statement, [userId]) 31 | } 32 | 33 | async list(offset: number, size: number, rest: Record) { 34 | // 处理查询 35 | const conditions = Object.entries(rest) 36 | .filter(([, value]) => value !== '') 37 | .map(([key]) => `${key} = ?`) 38 | .join(' AND ') 39 | // sql传值处理 40 | const values = Object.values(rest) 41 | .filter((value) => value !== '') 42 | .concat(offset, size) 43 | // 判断当前请求是分页还是查询 44 | const isQuery = 45 | Object.values(rest).filter((value) => value !== '').length > 0 46 | // 查询的sql预处理语句 47 | const queryStatement = ` 48 | SELECT SQL_CALC_FOUND_ROWS 49 | * 50 | FROM 51 | user 52 | WHERE 53 | ${conditions} 54 | ORDER BY 55 | id ASC 56 | LIMIT ?, ?; 57 | ` 58 | // 分页的sql预处理语句 59 | const listStatement = ` 60 | SELECT SQL_CALC_FOUND_ROWS 61 | * 62 | FROM 63 | user 64 | LIMIT ?, ?; 65 | ` 66 | const totalStatement = 'SELECT FOUND_ROWS() AS total;' 67 | const [result] = await connection.query( 68 | isQuery ? queryStatement : listStatement, 69 | values 70 | ) 71 | const [[totalResult]]: any[] = await connection.execute(totalStatement) 72 | return { 73 | list: result, 74 | totalCount: totalResult.total 75 | } 76 | } 77 | 78 | async userDetail(userId: string) { 79 | const statement = 'SELECT * FROM user WHERE id = ?;' 80 | return await connection.execute(statement, [userId]) 81 | } 82 | async departmentDetail(departmentsId: string) { 83 | const statement = 'SELECT * FROM departments WHERE id = ?;' 84 | return await connection.execute(statement, [departmentsId]) 85 | } 86 | async roleDetail(rolesId: string) { 87 | const statement = 'SELECT * FROM roles WHERE id = ?;' 88 | return await connection.execute(statement, [rolesId]) 89 | } 90 | } 91 | 92 | export default new UserService() 93 | -------------------------------------------------------------------------------- /src/modules/goods/service/goods.service.ts: -------------------------------------------------------------------------------- 1 | import connection from '@/app/databases' 2 | 3 | class GoodsService { 4 | private readonly amountMap: { 5 | saleroom: string 6 | sale: string 7 | favor: string 8 | inventory: string 9 | } 10 | constructor() { 11 | this.amountMap = { 12 | sale: '销量', 13 | favor: '收藏', 14 | inventory: '库存', 15 | saleroom: '销售额' 16 | } 17 | } 18 | async list(offset: number, size: number) { 19 | const statement = 'SELECT SQL_CALC_FOUND_ROWS * FROM products LIMIT ?, ?;' 20 | const totalStatement = 'SELECT FOUND_ROWS() AS total;' 21 | const [result] = await connection.query(statement, [offset, size]) 22 | const [[totalResult]]: any[] = await connection.execute(totalStatement) 23 | return { 24 | list: result, 25 | totalCount: totalResult.total 26 | } 27 | } 28 | 29 | async getCategoryCount() { 30 | const statement = 'SELECT id, name FROM category;' 31 | const queryStatement = 32 | 'SELECT COUNT(*) AS goodsCount FROM products WHERE categoryId = ?;' 33 | const [result]: any[] = await connection.query(statement, [statement]) 34 | 35 | for (const item of result) { 36 | const [[{ goodsCount }]]: any[] = await connection.query(queryStatement, [ 37 | item.id 38 | ]) 39 | item.goodsCount = goodsCount 40 | } 41 | return result 42 | } 43 | 44 | async getCategoryFavor() { 45 | const statement = 'SELECT id, name FROM category;' 46 | const queryStatement = 47 | 'SELECT categoryId, SUM(favorCount) AS goodsFavor FROM products WHERE categoryId = ?;' 48 | const [result]: any[] = await connection.query(statement, [statement]) 49 | 50 | for (const item of result) { 51 | const [[{ goodsFavor }]]: any[] = await connection.query(queryStatement, [ 52 | item.id 53 | ]) 54 | item.goodsFavor = goodsFavor 55 | } 56 | return result 57 | } 58 | 59 | async getAmount() { 60 | const keys = Object.keys(this.amountMap) as Array< 61 | keyof typeof this.amountMap 62 | > 63 | const data = [] 64 | 65 | for (const key of keys) { 66 | const name = key === 'saleroom' ? 'saleCount * newPrice' : `${key}Count` 67 | const statement = `SELECT SUM(${name}) AS ${key} FROM products;` 68 | const [[result]]: any[] = await connection.execute(statement) 69 | data.push({ 70 | amount: key, 71 | number1: Math.round(result[key]), 72 | number2: Math.round(result[key]), 73 | subtitle: `商品总${this.amountMap[key]}`, 74 | tips: `所有商品的总${this.amountMap[key]}`, 75 | title: `商品总${this.amountMap[key]}` 76 | }) 77 | } 78 | return data 79 | } 80 | 81 | async getCategorySale() { 82 | const statement = 'SELECT id, name FROM category;' 83 | const queryStatement = 84 | 'SELECT SUM(saleCount) AS goodsCount FROM products WHERE categoryId = ?;' 85 | const [result]: any[] = await connection.query(statement, [statement]) 86 | 87 | for (const item of result) { 88 | const [[{ goodsCount }]]: any[] = await connection.query(queryStatement, [ 89 | item.id 90 | ]) 91 | item.goodsCount = goodsCount 92 | } 93 | return result 94 | } 95 | 96 | async getAddressSale() { 97 | const statement = 98 | 'SELECT address, SUM(saleCount) AS count FROM products GROUP BY address;' 99 | const [result] = await connection.execute(statement) 100 | return result 101 | } 102 | } 103 | 104 | export default new GoodsService() 105 | -------------------------------------------------------------------------------- /src/modules/role/controller/role.controller.ts: -------------------------------------------------------------------------------- 1 | import roleService from '../service/role.service' 2 | import { SERVER_BASE_ERROR } from '@/config/error.constant' 3 | 4 | class RoleController { 5 | async create(ctx: KoaCTX) { 6 | try { 7 | const { name, intro } = ctx.request.body 8 | const result = await roleService.create({ name, intro }) 9 | // 获取新建的角色的id 10 | const roleId = await roleService.queryRoleId() 11 | let menuIds = ctx.request.body.menuList ?? [] 12 | 13 | // 对管理员的权限处理 14 | if (Number(roleId) === 1) { 15 | menuIds = [] 16 | for (let i = 1; i <= 40; i++) { 17 | menuIds.push(i) 18 | } 19 | } 20 | // 对角色授权 21 | await roleService.assignMenu(roleId, menuIds) 22 | 23 | // 返回结果 24 | ctx.body = { 25 | code: 0, 26 | message: '创建角色成功', 27 | data: result 28 | } 29 | } catch (error) { 30 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 31 | } 32 | } 33 | async remove(ctx: KoaCTX) { 34 | try { 35 | const roleId = ctx.params.roleId 36 | await roleService.remove(roleId) 37 | ctx.body = { 38 | code: 0, 39 | message: '删除角色成功~' 40 | } 41 | } catch (error) { 42 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 43 | } 44 | } 45 | 46 | async update(ctx: KoaCTX) { 47 | try { 48 | const roleId = ctx.params.roleId 49 | await roleService.assignMenu(roleId, ctx.request.body?.menuList ?? []) 50 | delete ctx.request.body?.menuList 51 | await roleService.update(roleId, ctx.request.body) 52 | ctx.body = { 53 | code: 0, 54 | message: '更新角色成功~' 55 | } 56 | } catch (error) { 57 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 58 | } 59 | } 60 | 61 | async list(ctx: KoaCTX) { 62 | try { 63 | // 1.获取角色的基本信息 64 | const { offset = 0, size = 100 } = ctx.query 65 | // connection.query的参数要传数字类型 66 | const result: any = await roleService.list(Number(offset), Number(size)) 67 | 68 | // 2.获取角色的菜单信息 69 | for (const role of result) { 70 | role.menuList = await roleService.getRoleMenu(role.id) 71 | } 72 | 73 | ctx.body = { 74 | code: 0, 75 | data: { 76 | list: result, 77 | totalCount: result.length 78 | } 79 | } 80 | } catch (e) { 81 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 82 | } 83 | } 84 | 85 | // 给角色分配权限 86 | async assignMenu(ctx: KoaCTX) { 87 | try { 88 | const roleId = ctx.params.roleId 89 | let menuIds = ctx.request.body.menuList ?? [] 90 | 91 | // 对管理员的权限处理 92 | if (Number(roleId) === 1) { 93 | menuIds = [] 94 | for (let i = 1; i <= 40; i++) { 95 | menuIds.push(i) 96 | } 97 | } 98 | 99 | await roleService.assignMenu(roleId, menuIds) 100 | ctx.body = { 101 | code: 0, 102 | message: '更新角色成功~' 103 | } 104 | } catch (error) { 105 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 106 | } 107 | } 108 | 109 | // 获取当前角色的菜单 110 | async userMenu(ctx: KoaCTX) { 111 | try { 112 | const roleId = ctx.params.roleId 113 | const result = await roleService.getRoleMenu(roleId) 114 | 115 | ctx.body = { 116 | code: 0, 117 | data: result 118 | } 119 | } catch (error) { 120 | ctx.app.emit('error', SERVER_BASE_ERROR, ctx) 121 | } 122 | } 123 | } 124 | 125 | export default new RoleController() 126 | export const { create, remove, update, list, assignMenu, userMenu } = 127 | new RoleController() 128 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@koa/cors': 12 | specifier: ^5.0.0 13 | version: 5.0.0 14 | '@koa/router': 15 | specifier: ^12.0.0 16 | version: 12.0.0 17 | crypto: 18 | specifier: ^1.0.1 19 | version: 1.0.1 20 | dotenv: 21 | specifier: ^16.3.1 22 | version: 16.3.1 23 | jsonwebtoken: 24 | specifier: ^9.0.0 25 | version: 9.0.0 26 | koa: 27 | specifier: ^2.14.2 28 | version: 2.14.2 29 | koa-bodyparser: 30 | specifier: ^4.4.1 31 | version: 4.4.1 32 | module-alias: 33 | specifier: ^2.2.3 34 | version: 2.2.3 35 | mysql2: 36 | specifier: ^3.4.1 37 | version: 3.4.1 38 | tsconfig-paths: 39 | specifier: ^4.2.0 40 | version: 4.2.0 41 | uuid: 42 | specifier: ^9.0.0 43 | version: 9.0.0 44 | devDependencies: 45 | '@koa/multer': 46 | specifier: ^3.0.2 47 | version: 3.0.2(multer@1.4.5-lts.1) 48 | '@types/jsonwebtoken': 49 | specifier: ^9.0.6 50 | version: 9.0.6 51 | '@types/koa': 52 | specifier: ^2.15.0 53 | version: 2.15.0 54 | '@types/koa-bodyparser': 55 | specifier: ^4.3.12 56 | version: 4.3.12 57 | '@types/koa__cors': 58 | specifier: ^5.0.0 59 | version: 5.0.0 60 | '@types/koa__multer': 61 | specifier: ^2.0.7 62 | version: 2.0.7 63 | '@types/koa__router': 64 | specifier: ^12.0.4 65 | version: 12.0.4 66 | '@types/module-alias': 67 | specifier: ^2.0.4 68 | version: 2.0.4 69 | '@types/node': 70 | specifier: ^20.12.7 71 | version: 20.12.7 72 | '@types/uuid': 73 | specifier: ^9.0.8 74 | version: 9.0.8 75 | '@typescript-eslint/eslint-plugin': 76 | specifier: ^7.8.0 77 | version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) 78 | '@typescript-eslint/parser': 79 | specifier: ^7.8.0 80 | version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) 81 | cross-env: 82 | specifier: ^7.0.3 83 | version: 7.0.3 84 | eslint: 85 | specifier: ^8.56.0 86 | version: 8.57.0 87 | eslint-config-prettier: 88 | specifier: ^9.1.0 89 | version: 9.1.0(eslint@8.57.0) 90 | eslint-plugin-prettier: 91 | specifier: ^5.1.3 92 | version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) 93 | nodemon: 94 | specifier: ^3.1.0 95 | version: 3.1.0 96 | prettier: 97 | specifier: ^3.2.5 98 | version: 3.2.5 99 | ts-node: 100 | specifier: ^10.9.2 101 | version: 10.9.2(@types/node@20.12.7)(typescript@5.4.5) 102 | typescript: 103 | specifier: ^5.4.5 104 | version: 5.4.5 105 | 106 | packages: 107 | 108 | '@ampproject/remapping@2.2.1': 109 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 110 | engines: {node: '>=6.0.0'} 111 | 112 | '@babel/code-frame@7.22.10': 113 | resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} 114 | engines: {node: '>=6.9.0'} 115 | 116 | '@babel/compat-data@7.22.9': 117 | resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} 118 | engines: {node: '>=6.9.0'} 119 | 120 | '@babel/core@7.22.10': 121 | resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} 122 | engines: {node: '>=6.9.0'} 123 | 124 | '@babel/generator@7.22.10': 125 | resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} 126 | engines: {node: '>=6.9.0'} 127 | 128 | '@babel/helper-compilation-targets@7.22.10': 129 | resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} 130 | engines: {node: '>=6.9.0'} 131 | 132 | '@babel/helper-environment-visitor@7.22.5': 133 | resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} 134 | engines: {node: '>=6.9.0'} 135 | 136 | '@babel/helper-function-name@7.22.5': 137 | resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} 138 | engines: {node: '>=6.9.0'} 139 | 140 | '@babel/helper-hoist-variables@7.22.5': 141 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 142 | engines: {node: '>=6.9.0'} 143 | 144 | '@babel/helper-module-imports@7.22.5': 145 | resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} 146 | engines: {node: '>=6.9.0'} 147 | 148 | '@babel/helper-module-transforms@7.22.9': 149 | resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} 150 | engines: {node: '>=6.9.0'} 151 | peerDependencies: 152 | '@babel/core': ^7.0.0 153 | 154 | '@babel/helper-plugin-utils@7.22.5': 155 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 156 | engines: {node: '>=6.9.0'} 157 | 158 | '@babel/helper-simple-access@7.22.5': 159 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 160 | engines: {node: '>=6.9.0'} 161 | 162 | '@babel/helper-split-export-declaration@7.22.6': 163 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 164 | engines: {node: '>=6.9.0'} 165 | 166 | '@babel/helper-string-parser@7.22.5': 167 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 168 | engines: {node: '>=6.9.0'} 169 | 170 | '@babel/helper-validator-identifier@7.22.5': 171 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 172 | engines: {node: '>=6.9.0'} 173 | 174 | '@babel/helper-validator-option@7.22.5': 175 | resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} 176 | engines: {node: '>=6.9.0'} 177 | 178 | '@babel/helpers@7.22.10': 179 | resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} 180 | engines: {node: '>=6.9.0'} 181 | 182 | '@babel/highlight@7.22.10': 183 | resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} 184 | engines: {node: '>=6.9.0'} 185 | 186 | '@babel/parser@7.22.10': 187 | resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} 188 | engines: {node: '>=6.0.0'} 189 | hasBin: true 190 | 191 | '@babel/plugin-proposal-export-namespace-from@7.18.9': 192 | resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} 193 | engines: {node: '>=6.9.0'} 194 | peerDependencies: 195 | '@babel/core': ^7.0.0-0 196 | 197 | '@babel/plugin-syntax-export-namespace-from@7.8.3': 198 | resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} 199 | peerDependencies: 200 | '@babel/core': ^7.0.0-0 201 | 202 | '@babel/plugin-transform-modules-commonjs@7.22.5': 203 | resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} 204 | engines: {node: '>=6.9.0'} 205 | peerDependencies: 206 | '@babel/core': ^7.0.0-0 207 | 208 | '@babel/template@7.22.5': 209 | resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} 210 | engines: {node: '>=6.9.0'} 211 | 212 | '@babel/traverse@7.22.10': 213 | resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} 214 | engines: {node: '>=6.9.0'} 215 | 216 | '@babel/types@7.22.10': 217 | resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} 218 | engines: {node: '>=6.9.0'} 219 | 220 | '@cspotcode/source-map-support@0.8.1': 221 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 222 | engines: {node: '>=12'} 223 | 224 | '@eslint-community/eslint-utils@4.4.0': 225 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 226 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 227 | peerDependencies: 228 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 229 | 230 | '@eslint-community/regexpp@4.10.0': 231 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 232 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 233 | 234 | '@eslint/eslintrc@2.1.4': 235 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 236 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 237 | 238 | '@eslint/js@8.57.0': 239 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 240 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 241 | 242 | '@humanwhocodes/config-array@0.11.14': 243 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 244 | engines: {node: '>=10.10.0'} 245 | 246 | '@humanwhocodes/module-importer@1.0.1': 247 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 248 | engines: {node: '>=12.22'} 249 | 250 | '@humanwhocodes/object-schema@2.0.3': 251 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 252 | 253 | '@jridgewell/gen-mapping@0.3.3': 254 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 255 | engines: {node: '>=6.0.0'} 256 | 257 | '@jridgewell/resolve-uri@3.1.1': 258 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 259 | engines: {node: '>=6.0.0'} 260 | 261 | '@jridgewell/set-array@1.1.2': 262 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 263 | engines: {node: '>=6.0.0'} 264 | 265 | '@jridgewell/sourcemap-codec@1.4.15': 266 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 267 | 268 | '@jridgewell/trace-mapping@0.3.19': 269 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 270 | 271 | '@jridgewell/trace-mapping@0.3.9': 272 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 273 | 274 | '@koa/cors@5.0.0': 275 | resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} 276 | engines: {node: '>= 14.0.0'} 277 | 278 | '@koa/multer@3.0.2': 279 | resolution: {integrity: sha512-Q6WfPpE06mJWyZD1fzxM6zWywaoo+zocAn2YA9QYz4RsecoASr1h/kSzG0c5seDpFVKCMZM9raEfuM7XfqbRLw==} 280 | engines: {node: '>= 8'} 281 | peerDependencies: 282 | multer: '*' 283 | 284 | '@koa/router@12.0.0': 285 | resolution: {integrity: sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==} 286 | engines: {node: '>= 12'} 287 | 288 | '@nodelib/fs.scandir@2.1.5': 289 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 290 | engines: {node: '>= 8'} 291 | 292 | '@nodelib/fs.stat@2.0.5': 293 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 294 | engines: {node: '>= 8'} 295 | 296 | '@nodelib/fs.walk@1.2.8': 297 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 298 | engines: {node: '>= 8'} 299 | 300 | '@pkgr/core@0.1.1': 301 | resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} 302 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 303 | 304 | '@tsconfig/node10@1.0.11': 305 | resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 306 | 307 | '@tsconfig/node12@1.0.11': 308 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 309 | 310 | '@tsconfig/node14@1.0.3': 311 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 312 | 313 | '@tsconfig/node16@1.0.4': 314 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 315 | 316 | '@types/accepts@1.3.7': 317 | resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} 318 | 319 | '@types/body-parser@1.19.5': 320 | resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 321 | 322 | '@types/connect@3.4.38': 323 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 324 | 325 | '@types/content-disposition@0.5.8': 326 | resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} 327 | 328 | '@types/cookies@0.9.0': 329 | resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} 330 | 331 | '@types/express-serve-static-core@4.19.0': 332 | resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} 333 | 334 | '@types/express@4.17.21': 335 | resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} 336 | 337 | '@types/http-assert@1.5.5': 338 | resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} 339 | 340 | '@types/http-errors@2.0.4': 341 | resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} 342 | 343 | '@types/json-schema@7.0.15': 344 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 345 | 346 | '@types/jsonwebtoken@9.0.6': 347 | resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} 348 | 349 | '@types/keygrip@1.0.6': 350 | resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} 351 | 352 | '@types/koa-bodyparser@4.3.12': 353 | resolution: {integrity: sha512-hKMmRMVP889gPIdLZmmtou/BijaU1tHPyMNmcK7FAHAdATnRcGQQy78EqTTxLH1D4FTsrxIzklAQCso9oGoebQ==} 354 | 355 | '@types/koa-compose@3.2.8': 356 | resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} 357 | 358 | '@types/koa@2.15.0': 359 | resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} 360 | 361 | '@types/koa__cors@5.0.0': 362 | resolution: {integrity: sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g==} 363 | 364 | '@types/koa__multer@2.0.7': 365 | resolution: {integrity: sha512-O7hiAEpdgW1nly93jQ8TVL2nPC7Bg1HHRf1/LGNQb7ygGBjNgZWpliCm7tswNW3MjcgYbTtz0+Sca5wHne+RyA==} 366 | 367 | '@types/koa__router@12.0.4': 368 | resolution: {integrity: sha512-Y7YBbSmfXZpa/m5UGGzb7XadJIRBRnwNY9cdAojZGp65Cpe5MAP3mOZE7e3bImt8dfKS4UFcR16SLH8L/z7PBw==} 369 | 370 | '@types/mime@1.3.5': 371 | resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} 372 | 373 | '@types/module-alias@2.0.4': 374 | resolution: {integrity: sha512-5+G/QXO/DvHZw60FjvbDzO4JmlD/nG5m2/vVGt25VN1eeP3w2bCoks1Wa7VuptMPM1TxJdx6RjO70N9Fw0nZPA==} 375 | 376 | '@types/node@20.12.7': 377 | resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} 378 | 379 | '@types/qs@6.9.15': 380 | resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} 381 | 382 | '@types/range-parser@1.2.7': 383 | resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} 384 | 385 | '@types/semver@7.5.8': 386 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 387 | 388 | '@types/send@0.17.4': 389 | resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} 390 | 391 | '@types/serve-static@1.15.7': 392 | resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} 393 | 394 | '@types/uuid@9.0.8': 395 | resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} 396 | 397 | '@typescript-eslint/eslint-plugin@7.8.0': 398 | resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} 399 | engines: {node: ^18.18.0 || >=20.0.0} 400 | peerDependencies: 401 | '@typescript-eslint/parser': ^7.0.0 402 | eslint: ^8.56.0 403 | typescript: '*' 404 | peerDependenciesMeta: 405 | typescript: 406 | optional: true 407 | 408 | '@typescript-eslint/parser@7.8.0': 409 | resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} 410 | engines: {node: ^18.18.0 || >=20.0.0} 411 | peerDependencies: 412 | eslint: ^8.56.0 413 | typescript: '*' 414 | peerDependenciesMeta: 415 | typescript: 416 | optional: true 417 | 418 | '@typescript-eslint/scope-manager@7.8.0': 419 | resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} 420 | engines: {node: ^18.18.0 || >=20.0.0} 421 | 422 | '@typescript-eslint/type-utils@7.8.0': 423 | resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} 424 | engines: {node: ^18.18.0 || >=20.0.0} 425 | peerDependencies: 426 | eslint: ^8.56.0 427 | typescript: '*' 428 | peerDependenciesMeta: 429 | typescript: 430 | optional: true 431 | 432 | '@typescript-eslint/types@7.8.0': 433 | resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} 434 | engines: {node: ^18.18.0 || >=20.0.0} 435 | 436 | '@typescript-eslint/typescript-estree@7.8.0': 437 | resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} 438 | engines: {node: ^18.18.0 || >=20.0.0} 439 | peerDependencies: 440 | typescript: '*' 441 | peerDependenciesMeta: 442 | typescript: 443 | optional: true 444 | 445 | '@typescript-eslint/utils@7.8.0': 446 | resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} 447 | engines: {node: ^18.18.0 || >=20.0.0} 448 | peerDependencies: 449 | eslint: ^8.56.0 450 | 451 | '@typescript-eslint/visitor-keys@7.8.0': 452 | resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} 453 | engines: {node: ^18.18.0 || >=20.0.0} 454 | 455 | '@ungap/structured-clone@1.2.0': 456 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 457 | 458 | abbrev@1.1.1: 459 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 460 | 461 | accepts@1.3.8: 462 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 463 | engines: {node: '>= 0.6'} 464 | 465 | acorn-jsx@5.3.2: 466 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 467 | peerDependencies: 468 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 469 | 470 | acorn-walk@8.3.4: 471 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 472 | engines: {node: '>=0.4.0'} 473 | 474 | acorn@8.11.3: 475 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 476 | engines: {node: '>=0.4.0'} 477 | hasBin: true 478 | 479 | ajv@6.12.6: 480 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 481 | 482 | ansi-regex@5.0.1: 483 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 484 | engines: {node: '>=8'} 485 | 486 | ansi-styles@3.2.1: 487 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 488 | engines: {node: '>=4'} 489 | 490 | ansi-styles@4.3.0: 491 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 492 | engines: {node: '>=8'} 493 | 494 | anymatch@3.1.3: 495 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 496 | engines: {node: '>= 8'} 497 | 498 | append-field@1.0.0: 499 | resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} 500 | 501 | arg@4.1.3: 502 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 503 | 504 | argparse@2.0.1: 505 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 506 | 507 | array-union@2.1.0: 508 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 509 | engines: {node: '>=8'} 510 | 511 | balanced-match@1.0.2: 512 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 513 | 514 | binary-extensions@2.3.0: 515 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 516 | engines: {node: '>=8'} 517 | 518 | brace-expansion@1.1.11: 519 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 520 | 521 | brace-expansion@2.0.1: 522 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 523 | 524 | braces@3.0.2: 525 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 526 | engines: {node: '>=8'} 527 | 528 | browserslist@4.21.10: 529 | resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} 530 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 531 | hasBin: true 532 | 533 | buffer-equal-constant-time@1.0.1: 534 | resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} 535 | 536 | buffer-from@1.1.2: 537 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 538 | 539 | busboy@1.6.0: 540 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 541 | engines: {node: '>=10.16.0'} 542 | 543 | bytes@3.1.2: 544 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 545 | engines: {node: '>= 0.8'} 546 | 547 | cache-content-type@1.0.1: 548 | resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} 549 | engines: {node: '>= 6.0.0'} 550 | 551 | call-bind@1.0.2: 552 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 553 | 554 | callsites@3.1.0: 555 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 556 | engines: {node: '>=6'} 557 | 558 | caniuse-lite@1.0.30001520: 559 | resolution: {integrity: sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==} 560 | 561 | chalk@2.4.2: 562 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 563 | engines: {node: '>=4'} 564 | 565 | chalk@4.1.2: 566 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 567 | engines: {node: '>=10'} 568 | 569 | chokidar@3.6.0: 570 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 571 | engines: {node: '>= 8.10.0'} 572 | 573 | co-body@6.1.0: 574 | resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} 575 | 576 | co@4.6.0: 577 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 578 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 579 | 580 | color-convert@1.9.3: 581 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 582 | 583 | color-convert@2.0.1: 584 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 585 | engines: {node: '>=7.0.0'} 586 | 587 | color-name@1.1.3: 588 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 589 | 590 | color-name@1.1.4: 591 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 592 | 593 | concat-map@0.0.1: 594 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 595 | 596 | concat-stream@1.6.2: 597 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} 598 | engines: {'0': node >= 0.8} 599 | 600 | content-disposition@0.5.4: 601 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 602 | engines: {node: '>= 0.6'} 603 | 604 | content-type@1.0.5: 605 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 606 | engines: {node: '>= 0.6'} 607 | 608 | convert-source-map@1.9.0: 609 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 610 | 611 | cookies@0.8.0: 612 | resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} 613 | engines: {node: '>= 0.8'} 614 | 615 | copy-to@2.0.1: 616 | resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} 617 | 618 | core-util-is@1.0.3: 619 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 620 | 621 | create-require@1.1.1: 622 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 623 | 624 | cross-env@7.0.3: 625 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} 626 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} 627 | hasBin: true 628 | 629 | cross-spawn@7.0.3: 630 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 631 | engines: {node: '>= 8'} 632 | 633 | crypto@1.0.1: 634 | resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} 635 | deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. 636 | 637 | debug@4.3.4: 638 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 639 | engines: {node: '>=6.0'} 640 | peerDependencies: 641 | supports-color: '*' 642 | peerDependenciesMeta: 643 | supports-color: 644 | optional: true 645 | 646 | deep-equal@1.0.1: 647 | resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} 648 | 649 | deep-is@0.1.4: 650 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 651 | 652 | delegates@1.0.0: 653 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 654 | 655 | denque@2.1.0: 656 | resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} 657 | engines: {node: '>=0.10'} 658 | 659 | depd@1.1.2: 660 | resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} 661 | engines: {node: '>= 0.6'} 662 | 663 | depd@2.0.0: 664 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 665 | engines: {node: '>= 0.8'} 666 | 667 | destroy@1.2.0: 668 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 669 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 670 | 671 | diff@4.0.2: 672 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 673 | engines: {node: '>=0.3.1'} 674 | 675 | dir-glob@3.0.1: 676 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 677 | engines: {node: '>=8'} 678 | 679 | doctrine@3.0.0: 680 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 681 | engines: {node: '>=6.0.0'} 682 | 683 | dotenv@16.3.1: 684 | resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} 685 | engines: {node: '>=12'} 686 | 687 | ecdsa-sig-formatter@1.0.11: 688 | resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} 689 | 690 | ee-first@1.1.1: 691 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 692 | 693 | electron-to-chromium@1.4.491: 694 | resolution: {integrity: sha512-ZzPqGKghdVzlQJ+qpfE+r6EB321zed7e5JsvHIlMM4zPFF8okXUkF5Of7h7F3l3cltPL0rG7YVmlp5Qro7RQLA==} 695 | 696 | encodeurl@1.0.2: 697 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 698 | engines: {node: '>= 0.8'} 699 | 700 | escalade@3.1.1: 701 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 702 | engines: {node: '>=6'} 703 | 704 | escape-html@1.0.3: 705 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 706 | 707 | escape-string-regexp@1.0.5: 708 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 709 | engines: {node: '>=0.8.0'} 710 | 711 | escape-string-regexp@4.0.0: 712 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 713 | engines: {node: '>=10'} 714 | 715 | eslint-config-prettier@9.1.0: 716 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 717 | hasBin: true 718 | peerDependencies: 719 | eslint: '>=7.0.0' 720 | 721 | eslint-plugin-prettier@5.1.3: 722 | resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} 723 | engines: {node: ^14.18.0 || >=16.0.0} 724 | peerDependencies: 725 | '@types/eslint': '>=8.0.0' 726 | eslint: '>=8.0.0' 727 | eslint-config-prettier: '*' 728 | prettier: '>=3.0.0' 729 | peerDependenciesMeta: 730 | '@types/eslint': 731 | optional: true 732 | eslint-config-prettier: 733 | optional: true 734 | 735 | eslint-scope@7.2.2: 736 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 737 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 738 | 739 | eslint-visitor-keys@3.4.3: 740 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 741 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 742 | 743 | eslint@8.57.0: 744 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 745 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 746 | hasBin: true 747 | 748 | espree@9.6.1: 749 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 750 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 751 | 752 | esquery@1.5.0: 753 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 754 | engines: {node: '>=0.10'} 755 | 756 | esrecurse@4.3.0: 757 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 758 | engines: {node: '>=4.0'} 759 | 760 | estraverse@5.3.0: 761 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 762 | engines: {node: '>=4.0'} 763 | 764 | esutils@2.0.3: 765 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 766 | engines: {node: '>=0.10.0'} 767 | 768 | fast-deep-equal@3.1.3: 769 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 770 | 771 | fast-diff@1.3.0: 772 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 773 | 774 | fast-glob@3.3.2: 775 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 776 | engines: {node: '>=8.6.0'} 777 | 778 | fast-json-stable-stringify@2.1.0: 779 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 780 | 781 | fast-levenshtein@2.0.6: 782 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 783 | 784 | fastq@1.17.1: 785 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 786 | 787 | file-entry-cache@6.0.1: 788 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 789 | engines: {node: ^10.12.0 || >=12.0.0} 790 | 791 | fill-range@7.0.1: 792 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 793 | engines: {node: '>=8'} 794 | 795 | find-up@5.0.0: 796 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 797 | engines: {node: '>=10'} 798 | 799 | fix-esm@1.0.1: 800 | resolution: {integrity: sha512-EZtb7wPXZS54GaGxaWxMlhd1DUDCnAg5srlYdu/1ZVeW+7wwR3Tp59nu52dXByFs3MBRq+SByx1wDOJpRvLEXw==} 801 | 802 | flat-cache@3.2.0: 803 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 804 | engines: {node: ^10.12.0 || >=12.0.0} 805 | 806 | flatted@3.3.1: 807 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 808 | 809 | fresh@0.5.2: 810 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 811 | engines: {node: '>= 0.6'} 812 | 813 | fs.realpath@1.0.0: 814 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 815 | 816 | fsevents@2.3.3: 817 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 818 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 819 | os: [darwin] 820 | 821 | function-bind@1.1.1: 822 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 823 | 824 | generate-function@2.3.1: 825 | resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} 826 | 827 | gensync@1.0.0-beta.2: 828 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 829 | engines: {node: '>=6.9.0'} 830 | 831 | get-intrinsic@1.2.1: 832 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 833 | 834 | glob-parent@5.1.2: 835 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 836 | engines: {node: '>= 6'} 837 | 838 | glob-parent@6.0.2: 839 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 840 | engines: {node: '>=10.13.0'} 841 | 842 | glob@7.2.3: 843 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 844 | 845 | globals@11.12.0: 846 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 847 | engines: {node: '>=4'} 848 | 849 | globals@13.24.0: 850 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 851 | engines: {node: '>=8'} 852 | 853 | globby@11.1.0: 854 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 855 | engines: {node: '>=10'} 856 | 857 | graphemer@1.4.0: 858 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 859 | 860 | has-flag@3.0.0: 861 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 862 | engines: {node: '>=4'} 863 | 864 | has-flag@4.0.0: 865 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 866 | engines: {node: '>=8'} 867 | 868 | has-proto@1.0.1: 869 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 870 | engines: {node: '>= 0.4'} 871 | 872 | has-symbols@1.0.3: 873 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 874 | engines: {node: '>= 0.4'} 875 | 876 | has-tostringtag@1.0.0: 877 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 878 | engines: {node: '>= 0.4'} 879 | 880 | has@1.0.3: 881 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 882 | engines: {node: '>= 0.4.0'} 883 | 884 | http-assert@1.5.0: 885 | resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} 886 | engines: {node: '>= 0.8'} 887 | 888 | http-errors@1.8.1: 889 | resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} 890 | engines: {node: '>= 0.6'} 891 | 892 | http-errors@2.0.0: 893 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 894 | engines: {node: '>= 0.8'} 895 | 896 | iconv-lite@0.4.24: 897 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 898 | engines: {node: '>=0.10.0'} 899 | 900 | iconv-lite@0.6.3: 901 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 902 | engines: {node: '>=0.10.0'} 903 | 904 | ignore-by-default@1.0.1: 905 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 906 | 907 | ignore@5.3.1: 908 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 909 | engines: {node: '>= 4'} 910 | 911 | import-fresh@3.3.0: 912 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 913 | engines: {node: '>=6'} 914 | 915 | imurmurhash@0.1.4: 916 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 917 | engines: {node: '>=0.8.19'} 918 | 919 | inflation@2.0.0: 920 | resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} 921 | engines: {node: '>= 0.8.0'} 922 | 923 | inflight@1.0.6: 924 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 925 | 926 | inherits@2.0.4: 927 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 928 | 929 | is-binary-path@2.1.0: 930 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 931 | engines: {node: '>=8'} 932 | 933 | is-extglob@2.1.1: 934 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 935 | engines: {node: '>=0.10.0'} 936 | 937 | is-generator-function@1.0.10: 938 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 939 | engines: {node: '>= 0.4'} 940 | 941 | is-glob@4.0.3: 942 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 943 | engines: {node: '>=0.10.0'} 944 | 945 | is-number@7.0.0: 946 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 947 | engines: {node: '>=0.12.0'} 948 | 949 | is-path-inside@3.0.3: 950 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 951 | engines: {node: '>=8'} 952 | 953 | is-property@1.0.2: 954 | resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} 955 | 956 | isarray@1.0.0: 957 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 958 | 959 | isexe@2.0.0: 960 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 961 | 962 | js-tokens@4.0.0: 963 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 964 | 965 | js-yaml@4.1.0: 966 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 967 | hasBin: true 968 | 969 | jsesc@2.5.2: 970 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 971 | engines: {node: '>=4'} 972 | hasBin: true 973 | 974 | json-buffer@3.0.1: 975 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 976 | 977 | json-schema-traverse@0.4.1: 978 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 979 | 980 | json-stable-stringify-without-jsonify@1.0.1: 981 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 982 | 983 | json5@2.2.3: 984 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 985 | engines: {node: '>=6'} 986 | hasBin: true 987 | 988 | jsonwebtoken@9.0.0: 989 | resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} 990 | engines: {node: '>=12', npm: '>=6'} 991 | 992 | jwa@1.4.1: 993 | resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} 994 | 995 | jws@3.2.2: 996 | resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} 997 | 998 | keygrip@1.1.0: 999 | resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} 1000 | engines: {node: '>= 0.6'} 1001 | 1002 | keyv@4.5.4: 1003 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1004 | 1005 | koa-bodyparser@4.4.1: 1006 | resolution: {integrity: sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==} 1007 | engines: {node: '>=8.0.0'} 1008 | 1009 | koa-compose@4.1.0: 1010 | resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} 1011 | 1012 | koa-convert@2.0.0: 1013 | resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} 1014 | engines: {node: '>= 10'} 1015 | 1016 | koa@2.14.2: 1017 | resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} 1018 | engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} 1019 | 1020 | levn@0.4.1: 1021 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1022 | engines: {node: '>= 0.8.0'} 1023 | 1024 | locate-path@6.0.0: 1025 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1026 | engines: {node: '>=10'} 1027 | 1028 | lodash.merge@4.6.2: 1029 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1030 | 1031 | lodash@4.17.21: 1032 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1033 | 1034 | long@5.2.3: 1035 | resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} 1036 | 1037 | lru-cache@5.1.1: 1038 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1039 | 1040 | lru-cache@6.0.0: 1041 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1042 | engines: {node: '>=10'} 1043 | 1044 | lru-cache@7.18.3: 1045 | resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} 1046 | engines: {node: '>=12'} 1047 | 1048 | lru-cache@8.0.5: 1049 | resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} 1050 | engines: {node: '>=16.14'} 1051 | 1052 | make-error@1.3.6: 1053 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1054 | 1055 | media-typer@0.3.0: 1056 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 1057 | engines: {node: '>= 0.6'} 1058 | 1059 | merge2@1.4.1: 1060 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1061 | engines: {node: '>= 8'} 1062 | 1063 | methods@1.1.2: 1064 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 1065 | engines: {node: '>= 0.6'} 1066 | 1067 | micromatch@4.0.5: 1068 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1069 | engines: {node: '>=8.6'} 1070 | 1071 | mime-db@1.52.0: 1072 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1073 | engines: {node: '>= 0.6'} 1074 | 1075 | mime-types@2.1.35: 1076 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1077 | engines: {node: '>= 0.6'} 1078 | 1079 | minimatch@3.1.2: 1080 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1081 | 1082 | minimatch@9.0.4: 1083 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 1084 | engines: {node: '>=16 || 14 >=14.17'} 1085 | 1086 | minimist@1.2.8: 1087 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1088 | 1089 | mkdirp@0.5.6: 1090 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1091 | hasBin: true 1092 | 1093 | module-alias@2.2.3: 1094 | resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==} 1095 | 1096 | ms@2.1.2: 1097 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1098 | 1099 | multer@1.4.5-lts.1: 1100 | resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} 1101 | engines: {node: '>= 6.0.0'} 1102 | deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. 1103 | 1104 | mysql2@3.4.1: 1105 | resolution: {integrity: sha512-1VBrTIjDacTgcQ3/jUnMlix7twU3VfQtlAcBFPn5524AnBZcENRnpmdFt6oZaiYu4yGkAWXu0InNMg/LQs4daQ==} 1106 | engines: {node: '>= 8.0'} 1107 | 1108 | named-placeholders@1.1.3: 1109 | resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} 1110 | engines: {node: '>=12.0.0'} 1111 | 1112 | natural-compare@1.4.0: 1113 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1114 | 1115 | negotiator@0.6.3: 1116 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 1117 | engines: {node: '>= 0.6'} 1118 | 1119 | node-releases@2.0.13: 1120 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 1121 | 1122 | nodemon@3.1.0: 1123 | resolution: {integrity: sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==} 1124 | engines: {node: '>=10'} 1125 | hasBin: true 1126 | 1127 | nopt@1.0.10: 1128 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 1129 | hasBin: true 1130 | 1131 | normalize-path@3.0.0: 1132 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1133 | engines: {node: '>=0.10.0'} 1134 | 1135 | object-assign@4.1.1: 1136 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1137 | engines: {node: '>=0.10.0'} 1138 | 1139 | object-inspect@1.12.3: 1140 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 1141 | 1142 | on-finished@2.4.1: 1143 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1144 | engines: {node: '>= 0.8'} 1145 | 1146 | once@1.4.0: 1147 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1148 | 1149 | only@0.0.2: 1150 | resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} 1151 | 1152 | optionator@0.9.4: 1153 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1154 | engines: {node: '>= 0.8.0'} 1155 | 1156 | p-limit@3.1.0: 1157 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1158 | engines: {node: '>=10'} 1159 | 1160 | p-locate@5.0.0: 1161 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1162 | engines: {node: '>=10'} 1163 | 1164 | parent-module@1.0.1: 1165 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1166 | engines: {node: '>=6'} 1167 | 1168 | parseurl@1.3.3: 1169 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1170 | engines: {node: '>= 0.8'} 1171 | 1172 | path-exists@4.0.0: 1173 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1174 | engines: {node: '>=8'} 1175 | 1176 | path-is-absolute@1.0.1: 1177 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1178 | engines: {node: '>=0.10.0'} 1179 | 1180 | path-key@3.1.1: 1181 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1182 | engines: {node: '>=8'} 1183 | 1184 | path-to-regexp@6.2.1: 1185 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 1186 | 1187 | path-type@4.0.0: 1188 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1189 | engines: {node: '>=8'} 1190 | 1191 | picocolors@1.0.0: 1192 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1193 | 1194 | picomatch@2.3.1: 1195 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1196 | engines: {node: '>=8.6'} 1197 | 1198 | prelude-ls@1.2.1: 1199 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1200 | engines: {node: '>= 0.8.0'} 1201 | 1202 | prettier-linter-helpers@1.0.0: 1203 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 1204 | engines: {node: '>=6.0.0'} 1205 | 1206 | prettier@3.2.5: 1207 | resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} 1208 | engines: {node: '>=14'} 1209 | hasBin: true 1210 | 1211 | process-nextick-args@2.0.1: 1212 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1213 | 1214 | pstree.remy@1.1.8: 1215 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 1216 | 1217 | punycode@2.3.1: 1218 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1219 | engines: {node: '>=6'} 1220 | 1221 | qs@6.11.2: 1222 | resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} 1223 | engines: {node: '>=0.6'} 1224 | 1225 | queue-microtask@1.2.3: 1226 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1227 | 1228 | raw-body@2.5.2: 1229 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 1230 | engines: {node: '>= 0.8'} 1231 | 1232 | readable-stream@2.3.8: 1233 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1234 | 1235 | readdirp@3.6.0: 1236 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1237 | engines: {node: '>=8.10.0'} 1238 | 1239 | resolve-from@4.0.0: 1240 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1241 | engines: {node: '>=4'} 1242 | 1243 | reusify@1.0.4: 1244 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1245 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1246 | 1247 | rimraf@3.0.2: 1248 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1249 | hasBin: true 1250 | 1251 | run-parallel@1.2.0: 1252 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1253 | 1254 | safe-buffer@5.1.2: 1255 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1256 | 1257 | safe-buffer@5.2.1: 1258 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1259 | 1260 | safer-buffer@2.1.2: 1261 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1262 | 1263 | semver@6.3.1: 1264 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1265 | hasBin: true 1266 | 1267 | semver@7.5.3: 1268 | resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} 1269 | engines: {node: '>=10'} 1270 | hasBin: true 1271 | 1272 | semver@7.6.0: 1273 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1274 | engines: {node: '>=10'} 1275 | hasBin: true 1276 | 1277 | seq-queue@0.0.5: 1278 | resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} 1279 | 1280 | setprototypeof@1.2.0: 1281 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1282 | 1283 | shebang-command@2.0.0: 1284 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1285 | engines: {node: '>=8'} 1286 | 1287 | shebang-regex@3.0.0: 1288 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1289 | engines: {node: '>=8'} 1290 | 1291 | side-channel@1.0.4: 1292 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1293 | 1294 | simple-update-notifier@2.0.0: 1295 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 1296 | engines: {node: '>=10'} 1297 | 1298 | slash@3.0.0: 1299 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1300 | engines: {node: '>=8'} 1301 | 1302 | sqlstring@2.3.3: 1303 | resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} 1304 | engines: {node: '>= 0.6'} 1305 | 1306 | statuses@1.5.0: 1307 | resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} 1308 | engines: {node: '>= 0.6'} 1309 | 1310 | statuses@2.0.1: 1311 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1312 | engines: {node: '>= 0.8'} 1313 | 1314 | streamsearch@1.1.0: 1315 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1316 | engines: {node: '>=10.0.0'} 1317 | 1318 | string_decoder@1.1.1: 1319 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1320 | 1321 | strip-ansi@6.0.1: 1322 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1323 | engines: {node: '>=8'} 1324 | 1325 | strip-bom@3.0.0: 1326 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1327 | engines: {node: '>=4'} 1328 | 1329 | strip-json-comments@3.1.1: 1330 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1331 | engines: {node: '>=8'} 1332 | 1333 | supports-color@5.5.0: 1334 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1335 | engines: {node: '>=4'} 1336 | 1337 | supports-color@7.2.0: 1338 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1339 | engines: {node: '>=8'} 1340 | 1341 | synckit@0.8.8: 1342 | resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} 1343 | engines: {node: ^14.18.0 || >=16.0.0} 1344 | 1345 | text-table@0.2.0: 1346 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1347 | 1348 | to-fast-properties@2.0.0: 1349 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1350 | engines: {node: '>=4'} 1351 | 1352 | to-regex-range@5.0.1: 1353 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1354 | engines: {node: '>=8.0'} 1355 | 1356 | toidentifier@1.0.1: 1357 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1358 | engines: {node: '>=0.6'} 1359 | 1360 | touch@3.1.0: 1361 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1362 | hasBin: true 1363 | 1364 | ts-api-utils@1.3.0: 1365 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1366 | engines: {node: '>=16'} 1367 | peerDependencies: 1368 | typescript: '>=4.2.0' 1369 | 1370 | ts-node@10.9.2: 1371 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 1372 | hasBin: true 1373 | peerDependencies: 1374 | '@swc/core': '>=1.2.50' 1375 | '@swc/wasm': '>=1.2.50' 1376 | '@types/node': '*' 1377 | typescript: '>=2.7' 1378 | peerDependenciesMeta: 1379 | '@swc/core': 1380 | optional: true 1381 | '@swc/wasm': 1382 | optional: true 1383 | 1384 | tsconfig-paths@4.2.0: 1385 | resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} 1386 | engines: {node: '>=6'} 1387 | 1388 | tslib@2.6.2: 1389 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1390 | 1391 | tsscmp@1.0.6: 1392 | resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} 1393 | engines: {node: '>=0.6.x'} 1394 | 1395 | type-check@0.4.0: 1396 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1397 | engines: {node: '>= 0.8.0'} 1398 | 1399 | type-fest@0.20.2: 1400 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1401 | engines: {node: '>=10'} 1402 | 1403 | type-is@1.6.18: 1404 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1405 | engines: {node: '>= 0.6'} 1406 | 1407 | typedarray@0.0.6: 1408 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 1409 | 1410 | typescript@5.4.5: 1411 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 1412 | engines: {node: '>=14.17'} 1413 | hasBin: true 1414 | 1415 | undefsafe@2.0.5: 1416 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 1417 | 1418 | undici-types@5.26.5: 1419 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1420 | 1421 | unpipe@1.0.0: 1422 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1423 | engines: {node: '>= 0.8'} 1424 | 1425 | update-browserslist-db@1.0.11: 1426 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 1427 | hasBin: true 1428 | peerDependencies: 1429 | browserslist: '>= 4.21.0' 1430 | 1431 | uri-js@4.4.1: 1432 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1433 | 1434 | util-deprecate@1.0.2: 1435 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1436 | 1437 | uuid@9.0.0: 1438 | resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} 1439 | hasBin: true 1440 | 1441 | v8-compile-cache-lib@3.0.1: 1442 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1443 | 1444 | vary@1.1.2: 1445 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1446 | engines: {node: '>= 0.8'} 1447 | 1448 | which@2.0.2: 1449 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1450 | engines: {node: '>= 8'} 1451 | hasBin: true 1452 | 1453 | word-wrap@1.2.5: 1454 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1455 | engines: {node: '>=0.10.0'} 1456 | 1457 | wrappy@1.0.2: 1458 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1459 | 1460 | xtend@4.0.2: 1461 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1462 | engines: {node: '>=0.4'} 1463 | 1464 | yallist@3.1.1: 1465 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1466 | 1467 | yallist@4.0.0: 1468 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1469 | 1470 | ylru@1.3.2: 1471 | resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} 1472 | engines: {node: '>= 4.0.0'} 1473 | 1474 | yn@3.1.1: 1475 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1476 | engines: {node: '>=6'} 1477 | 1478 | yocto-queue@0.1.0: 1479 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1480 | engines: {node: '>=10'} 1481 | 1482 | snapshots: 1483 | 1484 | '@ampproject/remapping@2.2.1': 1485 | dependencies: 1486 | '@jridgewell/gen-mapping': 0.3.3 1487 | '@jridgewell/trace-mapping': 0.3.19 1488 | 1489 | '@babel/code-frame@7.22.10': 1490 | dependencies: 1491 | '@babel/highlight': 7.22.10 1492 | chalk: 2.4.2 1493 | 1494 | '@babel/compat-data@7.22.9': {} 1495 | 1496 | '@babel/core@7.22.10': 1497 | dependencies: 1498 | '@ampproject/remapping': 2.2.1 1499 | '@babel/code-frame': 7.22.10 1500 | '@babel/generator': 7.22.10 1501 | '@babel/helper-compilation-targets': 7.22.10 1502 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) 1503 | '@babel/helpers': 7.22.10 1504 | '@babel/parser': 7.22.10 1505 | '@babel/template': 7.22.5 1506 | '@babel/traverse': 7.22.10 1507 | '@babel/types': 7.22.10 1508 | convert-source-map: 1.9.0 1509 | debug: 4.3.4(supports-color@5.5.0) 1510 | gensync: 1.0.0-beta.2 1511 | json5: 2.2.3 1512 | semver: 6.3.1 1513 | transitivePeerDependencies: 1514 | - supports-color 1515 | 1516 | '@babel/generator@7.22.10': 1517 | dependencies: 1518 | '@babel/types': 7.22.10 1519 | '@jridgewell/gen-mapping': 0.3.3 1520 | '@jridgewell/trace-mapping': 0.3.19 1521 | jsesc: 2.5.2 1522 | 1523 | '@babel/helper-compilation-targets@7.22.10': 1524 | dependencies: 1525 | '@babel/compat-data': 7.22.9 1526 | '@babel/helper-validator-option': 7.22.5 1527 | browserslist: 4.21.10 1528 | lru-cache: 5.1.1 1529 | semver: 6.3.1 1530 | 1531 | '@babel/helper-environment-visitor@7.22.5': {} 1532 | 1533 | '@babel/helper-function-name@7.22.5': 1534 | dependencies: 1535 | '@babel/template': 7.22.5 1536 | '@babel/types': 7.22.10 1537 | 1538 | '@babel/helper-hoist-variables@7.22.5': 1539 | dependencies: 1540 | '@babel/types': 7.22.10 1541 | 1542 | '@babel/helper-module-imports@7.22.5': 1543 | dependencies: 1544 | '@babel/types': 7.22.10 1545 | 1546 | '@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10)': 1547 | dependencies: 1548 | '@babel/core': 7.22.10 1549 | '@babel/helper-environment-visitor': 7.22.5 1550 | '@babel/helper-module-imports': 7.22.5 1551 | '@babel/helper-simple-access': 7.22.5 1552 | '@babel/helper-split-export-declaration': 7.22.6 1553 | '@babel/helper-validator-identifier': 7.22.5 1554 | 1555 | '@babel/helper-plugin-utils@7.22.5': {} 1556 | 1557 | '@babel/helper-simple-access@7.22.5': 1558 | dependencies: 1559 | '@babel/types': 7.22.10 1560 | 1561 | '@babel/helper-split-export-declaration@7.22.6': 1562 | dependencies: 1563 | '@babel/types': 7.22.10 1564 | 1565 | '@babel/helper-string-parser@7.22.5': {} 1566 | 1567 | '@babel/helper-validator-identifier@7.22.5': {} 1568 | 1569 | '@babel/helper-validator-option@7.22.5': {} 1570 | 1571 | '@babel/helpers@7.22.10': 1572 | dependencies: 1573 | '@babel/template': 7.22.5 1574 | '@babel/traverse': 7.22.10 1575 | '@babel/types': 7.22.10 1576 | transitivePeerDependencies: 1577 | - supports-color 1578 | 1579 | '@babel/highlight@7.22.10': 1580 | dependencies: 1581 | '@babel/helper-validator-identifier': 7.22.5 1582 | chalk: 2.4.2 1583 | js-tokens: 4.0.0 1584 | 1585 | '@babel/parser@7.22.10': 1586 | dependencies: 1587 | '@babel/types': 7.22.10 1588 | 1589 | '@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.10)': 1590 | dependencies: 1591 | '@babel/core': 7.22.10 1592 | '@babel/helper-plugin-utils': 7.22.5 1593 | '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) 1594 | 1595 | '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.10)': 1596 | dependencies: 1597 | '@babel/core': 7.22.10 1598 | '@babel/helper-plugin-utils': 7.22.5 1599 | 1600 | '@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.10)': 1601 | dependencies: 1602 | '@babel/core': 7.22.10 1603 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) 1604 | '@babel/helper-plugin-utils': 7.22.5 1605 | '@babel/helper-simple-access': 7.22.5 1606 | 1607 | '@babel/template@7.22.5': 1608 | dependencies: 1609 | '@babel/code-frame': 7.22.10 1610 | '@babel/parser': 7.22.10 1611 | '@babel/types': 7.22.10 1612 | 1613 | '@babel/traverse@7.22.10': 1614 | dependencies: 1615 | '@babel/code-frame': 7.22.10 1616 | '@babel/generator': 7.22.10 1617 | '@babel/helper-environment-visitor': 7.22.5 1618 | '@babel/helper-function-name': 7.22.5 1619 | '@babel/helper-hoist-variables': 7.22.5 1620 | '@babel/helper-split-export-declaration': 7.22.6 1621 | '@babel/parser': 7.22.10 1622 | '@babel/types': 7.22.10 1623 | debug: 4.3.4(supports-color@5.5.0) 1624 | globals: 11.12.0 1625 | transitivePeerDependencies: 1626 | - supports-color 1627 | 1628 | '@babel/types@7.22.10': 1629 | dependencies: 1630 | '@babel/helper-string-parser': 7.22.5 1631 | '@babel/helper-validator-identifier': 7.22.5 1632 | to-fast-properties: 2.0.0 1633 | 1634 | '@cspotcode/source-map-support@0.8.1': 1635 | dependencies: 1636 | '@jridgewell/trace-mapping': 0.3.9 1637 | 1638 | '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': 1639 | dependencies: 1640 | eslint: 8.57.0 1641 | eslint-visitor-keys: 3.4.3 1642 | 1643 | '@eslint-community/regexpp@4.10.0': {} 1644 | 1645 | '@eslint/eslintrc@2.1.4': 1646 | dependencies: 1647 | ajv: 6.12.6 1648 | debug: 4.3.4(supports-color@5.5.0) 1649 | espree: 9.6.1 1650 | globals: 13.24.0 1651 | ignore: 5.3.1 1652 | import-fresh: 3.3.0 1653 | js-yaml: 4.1.0 1654 | minimatch: 3.1.2 1655 | strip-json-comments: 3.1.1 1656 | transitivePeerDependencies: 1657 | - supports-color 1658 | 1659 | '@eslint/js@8.57.0': {} 1660 | 1661 | '@humanwhocodes/config-array@0.11.14': 1662 | dependencies: 1663 | '@humanwhocodes/object-schema': 2.0.3 1664 | debug: 4.3.4(supports-color@5.5.0) 1665 | minimatch: 3.1.2 1666 | transitivePeerDependencies: 1667 | - supports-color 1668 | 1669 | '@humanwhocodes/module-importer@1.0.1': {} 1670 | 1671 | '@humanwhocodes/object-schema@2.0.3': {} 1672 | 1673 | '@jridgewell/gen-mapping@0.3.3': 1674 | dependencies: 1675 | '@jridgewell/set-array': 1.1.2 1676 | '@jridgewell/sourcemap-codec': 1.4.15 1677 | '@jridgewell/trace-mapping': 0.3.19 1678 | 1679 | '@jridgewell/resolve-uri@3.1.1': {} 1680 | 1681 | '@jridgewell/set-array@1.1.2': {} 1682 | 1683 | '@jridgewell/sourcemap-codec@1.4.15': {} 1684 | 1685 | '@jridgewell/trace-mapping@0.3.19': 1686 | dependencies: 1687 | '@jridgewell/resolve-uri': 3.1.1 1688 | '@jridgewell/sourcemap-codec': 1.4.15 1689 | 1690 | '@jridgewell/trace-mapping@0.3.9': 1691 | dependencies: 1692 | '@jridgewell/resolve-uri': 3.1.1 1693 | '@jridgewell/sourcemap-codec': 1.4.15 1694 | 1695 | '@koa/cors@5.0.0': 1696 | dependencies: 1697 | vary: 1.1.2 1698 | 1699 | '@koa/multer@3.0.2(multer@1.4.5-lts.1)': 1700 | dependencies: 1701 | fix-esm: 1.0.1 1702 | multer: 1.4.5-lts.1 1703 | transitivePeerDependencies: 1704 | - supports-color 1705 | 1706 | '@koa/router@12.0.0': 1707 | dependencies: 1708 | http-errors: 2.0.0 1709 | koa-compose: 4.1.0 1710 | methods: 1.1.2 1711 | path-to-regexp: 6.2.1 1712 | 1713 | '@nodelib/fs.scandir@2.1.5': 1714 | dependencies: 1715 | '@nodelib/fs.stat': 2.0.5 1716 | run-parallel: 1.2.0 1717 | 1718 | '@nodelib/fs.stat@2.0.5': {} 1719 | 1720 | '@nodelib/fs.walk@1.2.8': 1721 | dependencies: 1722 | '@nodelib/fs.scandir': 2.1.5 1723 | fastq: 1.17.1 1724 | 1725 | '@pkgr/core@0.1.1': {} 1726 | 1727 | '@tsconfig/node10@1.0.11': {} 1728 | 1729 | '@tsconfig/node12@1.0.11': {} 1730 | 1731 | '@tsconfig/node14@1.0.3': {} 1732 | 1733 | '@tsconfig/node16@1.0.4': {} 1734 | 1735 | '@types/accepts@1.3.7': 1736 | dependencies: 1737 | '@types/node': 20.12.7 1738 | 1739 | '@types/body-parser@1.19.5': 1740 | dependencies: 1741 | '@types/connect': 3.4.38 1742 | '@types/node': 20.12.7 1743 | 1744 | '@types/connect@3.4.38': 1745 | dependencies: 1746 | '@types/node': 20.12.7 1747 | 1748 | '@types/content-disposition@0.5.8': {} 1749 | 1750 | '@types/cookies@0.9.0': 1751 | dependencies: 1752 | '@types/connect': 3.4.38 1753 | '@types/express': 4.17.21 1754 | '@types/keygrip': 1.0.6 1755 | '@types/node': 20.12.7 1756 | 1757 | '@types/express-serve-static-core@4.19.0': 1758 | dependencies: 1759 | '@types/node': 20.12.7 1760 | '@types/qs': 6.9.15 1761 | '@types/range-parser': 1.2.7 1762 | '@types/send': 0.17.4 1763 | 1764 | '@types/express@4.17.21': 1765 | dependencies: 1766 | '@types/body-parser': 1.19.5 1767 | '@types/express-serve-static-core': 4.19.0 1768 | '@types/qs': 6.9.15 1769 | '@types/serve-static': 1.15.7 1770 | 1771 | '@types/http-assert@1.5.5': {} 1772 | 1773 | '@types/http-errors@2.0.4': {} 1774 | 1775 | '@types/json-schema@7.0.15': {} 1776 | 1777 | '@types/jsonwebtoken@9.0.6': 1778 | dependencies: 1779 | '@types/node': 20.12.7 1780 | 1781 | '@types/keygrip@1.0.6': {} 1782 | 1783 | '@types/koa-bodyparser@4.3.12': 1784 | dependencies: 1785 | '@types/koa': 2.15.0 1786 | 1787 | '@types/koa-compose@3.2.8': 1788 | dependencies: 1789 | '@types/koa': 2.15.0 1790 | 1791 | '@types/koa@2.15.0': 1792 | dependencies: 1793 | '@types/accepts': 1.3.7 1794 | '@types/content-disposition': 0.5.8 1795 | '@types/cookies': 0.9.0 1796 | '@types/http-assert': 1.5.5 1797 | '@types/http-errors': 2.0.4 1798 | '@types/keygrip': 1.0.6 1799 | '@types/koa-compose': 3.2.8 1800 | '@types/node': 20.12.7 1801 | 1802 | '@types/koa__cors@5.0.0': 1803 | dependencies: 1804 | '@types/koa': 2.15.0 1805 | 1806 | '@types/koa__multer@2.0.7': 1807 | dependencies: 1808 | '@types/koa': 2.15.0 1809 | 1810 | '@types/koa__router@12.0.4': 1811 | dependencies: 1812 | '@types/koa': 2.15.0 1813 | 1814 | '@types/mime@1.3.5': {} 1815 | 1816 | '@types/module-alias@2.0.4': {} 1817 | 1818 | '@types/node@20.12.7': 1819 | dependencies: 1820 | undici-types: 5.26.5 1821 | 1822 | '@types/qs@6.9.15': {} 1823 | 1824 | '@types/range-parser@1.2.7': {} 1825 | 1826 | '@types/semver@7.5.8': {} 1827 | 1828 | '@types/send@0.17.4': 1829 | dependencies: 1830 | '@types/mime': 1.3.5 1831 | '@types/node': 20.12.7 1832 | 1833 | '@types/serve-static@1.15.7': 1834 | dependencies: 1835 | '@types/http-errors': 2.0.4 1836 | '@types/node': 20.12.7 1837 | '@types/send': 0.17.4 1838 | 1839 | '@types/uuid@9.0.8': {} 1840 | 1841 | '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': 1842 | dependencies: 1843 | '@eslint-community/regexpp': 4.10.0 1844 | '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) 1845 | '@typescript-eslint/scope-manager': 7.8.0 1846 | '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) 1847 | '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) 1848 | '@typescript-eslint/visitor-keys': 7.8.0 1849 | debug: 4.3.4(supports-color@5.5.0) 1850 | eslint: 8.57.0 1851 | graphemer: 1.4.0 1852 | ignore: 5.3.1 1853 | natural-compare: 1.4.0 1854 | semver: 7.6.0 1855 | ts-api-utils: 1.3.0(typescript@5.4.5) 1856 | optionalDependencies: 1857 | typescript: 5.4.5 1858 | transitivePeerDependencies: 1859 | - supports-color 1860 | 1861 | '@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5)': 1862 | dependencies: 1863 | '@typescript-eslint/scope-manager': 7.8.0 1864 | '@typescript-eslint/types': 7.8.0 1865 | '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) 1866 | '@typescript-eslint/visitor-keys': 7.8.0 1867 | debug: 4.3.4(supports-color@5.5.0) 1868 | eslint: 8.57.0 1869 | optionalDependencies: 1870 | typescript: 5.4.5 1871 | transitivePeerDependencies: 1872 | - supports-color 1873 | 1874 | '@typescript-eslint/scope-manager@7.8.0': 1875 | dependencies: 1876 | '@typescript-eslint/types': 7.8.0 1877 | '@typescript-eslint/visitor-keys': 7.8.0 1878 | 1879 | '@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': 1880 | dependencies: 1881 | '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) 1882 | '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) 1883 | debug: 4.3.4(supports-color@5.5.0) 1884 | eslint: 8.57.0 1885 | ts-api-utils: 1.3.0(typescript@5.4.5) 1886 | optionalDependencies: 1887 | typescript: 5.4.5 1888 | transitivePeerDependencies: 1889 | - supports-color 1890 | 1891 | '@typescript-eslint/types@7.8.0': {} 1892 | 1893 | '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': 1894 | dependencies: 1895 | '@typescript-eslint/types': 7.8.0 1896 | '@typescript-eslint/visitor-keys': 7.8.0 1897 | debug: 4.3.4(supports-color@5.5.0) 1898 | globby: 11.1.0 1899 | is-glob: 4.0.3 1900 | minimatch: 9.0.4 1901 | semver: 7.6.0 1902 | ts-api-utils: 1.3.0(typescript@5.4.5) 1903 | optionalDependencies: 1904 | typescript: 5.4.5 1905 | transitivePeerDependencies: 1906 | - supports-color 1907 | 1908 | '@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5)': 1909 | dependencies: 1910 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1911 | '@types/json-schema': 7.0.15 1912 | '@types/semver': 7.5.8 1913 | '@typescript-eslint/scope-manager': 7.8.0 1914 | '@typescript-eslint/types': 7.8.0 1915 | '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) 1916 | eslint: 8.57.0 1917 | semver: 7.6.0 1918 | transitivePeerDependencies: 1919 | - supports-color 1920 | - typescript 1921 | 1922 | '@typescript-eslint/visitor-keys@7.8.0': 1923 | dependencies: 1924 | '@typescript-eslint/types': 7.8.0 1925 | eslint-visitor-keys: 3.4.3 1926 | 1927 | '@ungap/structured-clone@1.2.0': {} 1928 | 1929 | abbrev@1.1.1: {} 1930 | 1931 | accepts@1.3.8: 1932 | dependencies: 1933 | mime-types: 2.1.35 1934 | negotiator: 0.6.3 1935 | 1936 | acorn-jsx@5.3.2(acorn@8.11.3): 1937 | dependencies: 1938 | acorn: 8.11.3 1939 | 1940 | acorn-walk@8.3.4: 1941 | dependencies: 1942 | acorn: 8.11.3 1943 | 1944 | acorn@8.11.3: {} 1945 | 1946 | ajv@6.12.6: 1947 | dependencies: 1948 | fast-deep-equal: 3.1.3 1949 | fast-json-stable-stringify: 2.1.0 1950 | json-schema-traverse: 0.4.1 1951 | uri-js: 4.4.1 1952 | 1953 | ansi-regex@5.0.1: {} 1954 | 1955 | ansi-styles@3.2.1: 1956 | dependencies: 1957 | color-convert: 1.9.3 1958 | 1959 | ansi-styles@4.3.0: 1960 | dependencies: 1961 | color-convert: 2.0.1 1962 | 1963 | anymatch@3.1.3: 1964 | dependencies: 1965 | normalize-path: 3.0.0 1966 | picomatch: 2.3.1 1967 | 1968 | append-field@1.0.0: {} 1969 | 1970 | arg@4.1.3: {} 1971 | 1972 | argparse@2.0.1: {} 1973 | 1974 | array-union@2.1.0: {} 1975 | 1976 | balanced-match@1.0.2: {} 1977 | 1978 | binary-extensions@2.3.0: {} 1979 | 1980 | brace-expansion@1.1.11: 1981 | dependencies: 1982 | balanced-match: 1.0.2 1983 | concat-map: 0.0.1 1984 | 1985 | brace-expansion@2.0.1: 1986 | dependencies: 1987 | balanced-match: 1.0.2 1988 | 1989 | braces@3.0.2: 1990 | dependencies: 1991 | fill-range: 7.0.1 1992 | 1993 | browserslist@4.21.10: 1994 | dependencies: 1995 | caniuse-lite: 1.0.30001520 1996 | electron-to-chromium: 1.4.491 1997 | node-releases: 2.0.13 1998 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 1999 | 2000 | buffer-equal-constant-time@1.0.1: {} 2001 | 2002 | buffer-from@1.1.2: {} 2003 | 2004 | busboy@1.6.0: 2005 | dependencies: 2006 | streamsearch: 1.1.0 2007 | 2008 | bytes@3.1.2: {} 2009 | 2010 | cache-content-type@1.0.1: 2011 | dependencies: 2012 | mime-types: 2.1.35 2013 | ylru: 1.3.2 2014 | 2015 | call-bind@1.0.2: 2016 | dependencies: 2017 | function-bind: 1.1.1 2018 | get-intrinsic: 1.2.1 2019 | 2020 | callsites@3.1.0: {} 2021 | 2022 | caniuse-lite@1.0.30001520: {} 2023 | 2024 | chalk@2.4.2: 2025 | dependencies: 2026 | ansi-styles: 3.2.1 2027 | escape-string-regexp: 1.0.5 2028 | supports-color: 5.5.0 2029 | 2030 | chalk@4.1.2: 2031 | dependencies: 2032 | ansi-styles: 4.3.0 2033 | supports-color: 7.2.0 2034 | 2035 | chokidar@3.6.0: 2036 | dependencies: 2037 | anymatch: 3.1.3 2038 | braces: 3.0.2 2039 | glob-parent: 5.1.2 2040 | is-binary-path: 2.1.0 2041 | is-glob: 4.0.3 2042 | normalize-path: 3.0.0 2043 | readdirp: 3.6.0 2044 | optionalDependencies: 2045 | fsevents: 2.3.3 2046 | 2047 | co-body@6.1.0: 2048 | dependencies: 2049 | inflation: 2.0.0 2050 | qs: 6.11.2 2051 | raw-body: 2.5.2 2052 | type-is: 1.6.18 2053 | 2054 | co@4.6.0: {} 2055 | 2056 | color-convert@1.9.3: 2057 | dependencies: 2058 | color-name: 1.1.3 2059 | 2060 | color-convert@2.0.1: 2061 | dependencies: 2062 | color-name: 1.1.4 2063 | 2064 | color-name@1.1.3: {} 2065 | 2066 | color-name@1.1.4: {} 2067 | 2068 | concat-map@0.0.1: {} 2069 | 2070 | concat-stream@1.6.2: 2071 | dependencies: 2072 | buffer-from: 1.1.2 2073 | inherits: 2.0.4 2074 | readable-stream: 2.3.8 2075 | typedarray: 0.0.6 2076 | 2077 | content-disposition@0.5.4: 2078 | dependencies: 2079 | safe-buffer: 5.2.1 2080 | 2081 | content-type@1.0.5: {} 2082 | 2083 | convert-source-map@1.9.0: {} 2084 | 2085 | cookies@0.8.0: 2086 | dependencies: 2087 | depd: 2.0.0 2088 | keygrip: 1.1.0 2089 | 2090 | copy-to@2.0.1: {} 2091 | 2092 | core-util-is@1.0.3: {} 2093 | 2094 | create-require@1.1.1: {} 2095 | 2096 | cross-env@7.0.3: 2097 | dependencies: 2098 | cross-spawn: 7.0.3 2099 | 2100 | cross-spawn@7.0.3: 2101 | dependencies: 2102 | path-key: 3.1.1 2103 | shebang-command: 2.0.0 2104 | which: 2.0.2 2105 | 2106 | crypto@1.0.1: {} 2107 | 2108 | debug@4.3.4(supports-color@5.5.0): 2109 | dependencies: 2110 | ms: 2.1.2 2111 | optionalDependencies: 2112 | supports-color: 5.5.0 2113 | 2114 | deep-equal@1.0.1: {} 2115 | 2116 | deep-is@0.1.4: {} 2117 | 2118 | delegates@1.0.0: {} 2119 | 2120 | denque@2.1.0: {} 2121 | 2122 | depd@1.1.2: {} 2123 | 2124 | depd@2.0.0: {} 2125 | 2126 | destroy@1.2.0: {} 2127 | 2128 | diff@4.0.2: {} 2129 | 2130 | dir-glob@3.0.1: 2131 | dependencies: 2132 | path-type: 4.0.0 2133 | 2134 | doctrine@3.0.0: 2135 | dependencies: 2136 | esutils: 2.0.3 2137 | 2138 | dotenv@16.3.1: {} 2139 | 2140 | ecdsa-sig-formatter@1.0.11: 2141 | dependencies: 2142 | safe-buffer: 5.2.1 2143 | 2144 | ee-first@1.1.1: {} 2145 | 2146 | electron-to-chromium@1.4.491: {} 2147 | 2148 | encodeurl@1.0.2: {} 2149 | 2150 | escalade@3.1.1: {} 2151 | 2152 | escape-html@1.0.3: {} 2153 | 2154 | escape-string-regexp@1.0.5: {} 2155 | 2156 | escape-string-regexp@4.0.0: {} 2157 | 2158 | eslint-config-prettier@9.1.0(eslint@8.57.0): 2159 | dependencies: 2160 | eslint: 8.57.0 2161 | 2162 | eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): 2163 | dependencies: 2164 | eslint: 8.57.0 2165 | prettier: 3.2.5 2166 | prettier-linter-helpers: 1.0.0 2167 | synckit: 0.8.8 2168 | optionalDependencies: 2169 | eslint-config-prettier: 9.1.0(eslint@8.57.0) 2170 | 2171 | eslint-scope@7.2.2: 2172 | dependencies: 2173 | esrecurse: 4.3.0 2174 | estraverse: 5.3.0 2175 | 2176 | eslint-visitor-keys@3.4.3: {} 2177 | 2178 | eslint@8.57.0: 2179 | dependencies: 2180 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 2181 | '@eslint-community/regexpp': 4.10.0 2182 | '@eslint/eslintrc': 2.1.4 2183 | '@eslint/js': 8.57.0 2184 | '@humanwhocodes/config-array': 0.11.14 2185 | '@humanwhocodes/module-importer': 1.0.1 2186 | '@nodelib/fs.walk': 1.2.8 2187 | '@ungap/structured-clone': 1.2.0 2188 | ajv: 6.12.6 2189 | chalk: 4.1.2 2190 | cross-spawn: 7.0.3 2191 | debug: 4.3.4(supports-color@5.5.0) 2192 | doctrine: 3.0.0 2193 | escape-string-regexp: 4.0.0 2194 | eslint-scope: 7.2.2 2195 | eslint-visitor-keys: 3.4.3 2196 | espree: 9.6.1 2197 | esquery: 1.5.0 2198 | esutils: 2.0.3 2199 | fast-deep-equal: 3.1.3 2200 | file-entry-cache: 6.0.1 2201 | find-up: 5.0.0 2202 | glob-parent: 6.0.2 2203 | globals: 13.24.0 2204 | graphemer: 1.4.0 2205 | ignore: 5.3.1 2206 | imurmurhash: 0.1.4 2207 | is-glob: 4.0.3 2208 | is-path-inside: 3.0.3 2209 | js-yaml: 4.1.0 2210 | json-stable-stringify-without-jsonify: 1.0.1 2211 | levn: 0.4.1 2212 | lodash.merge: 4.6.2 2213 | minimatch: 3.1.2 2214 | natural-compare: 1.4.0 2215 | optionator: 0.9.4 2216 | strip-ansi: 6.0.1 2217 | text-table: 0.2.0 2218 | transitivePeerDependencies: 2219 | - supports-color 2220 | 2221 | espree@9.6.1: 2222 | dependencies: 2223 | acorn: 8.11.3 2224 | acorn-jsx: 5.3.2(acorn@8.11.3) 2225 | eslint-visitor-keys: 3.4.3 2226 | 2227 | esquery@1.5.0: 2228 | dependencies: 2229 | estraverse: 5.3.0 2230 | 2231 | esrecurse@4.3.0: 2232 | dependencies: 2233 | estraverse: 5.3.0 2234 | 2235 | estraverse@5.3.0: {} 2236 | 2237 | esutils@2.0.3: {} 2238 | 2239 | fast-deep-equal@3.1.3: {} 2240 | 2241 | fast-diff@1.3.0: {} 2242 | 2243 | fast-glob@3.3.2: 2244 | dependencies: 2245 | '@nodelib/fs.stat': 2.0.5 2246 | '@nodelib/fs.walk': 1.2.8 2247 | glob-parent: 5.1.2 2248 | merge2: 1.4.1 2249 | micromatch: 4.0.5 2250 | 2251 | fast-json-stable-stringify@2.1.0: {} 2252 | 2253 | fast-levenshtein@2.0.6: {} 2254 | 2255 | fastq@1.17.1: 2256 | dependencies: 2257 | reusify: 1.0.4 2258 | 2259 | file-entry-cache@6.0.1: 2260 | dependencies: 2261 | flat-cache: 3.2.0 2262 | 2263 | fill-range@7.0.1: 2264 | dependencies: 2265 | to-regex-range: 5.0.1 2266 | 2267 | find-up@5.0.0: 2268 | dependencies: 2269 | locate-path: 6.0.0 2270 | path-exists: 4.0.0 2271 | 2272 | fix-esm@1.0.1: 2273 | dependencies: 2274 | '@babel/core': 7.22.10 2275 | '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.22.10) 2276 | '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.10) 2277 | transitivePeerDependencies: 2278 | - supports-color 2279 | 2280 | flat-cache@3.2.0: 2281 | dependencies: 2282 | flatted: 3.3.1 2283 | keyv: 4.5.4 2284 | rimraf: 3.0.2 2285 | 2286 | flatted@3.3.1: {} 2287 | 2288 | fresh@0.5.2: {} 2289 | 2290 | fs.realpath@1.0.0: {} 2291 | 2292 | fsevents@2.3.3: 2293 | optional: true 2294 | 2295 | function-bind@1.1.1: {} 2296 | 2297 | generate-function@2.3.1: 2298 | dependencies: 2299 | is-property: 1.0.2 2300 | 2301 | gensync@1.0.0-beta.2: {} 2302 | 2303 | get-intrinsic@1.2.1: 2304 | dependencies: 2305 | function-bind: 1.1.1 2306 | has: 1.0.3 2307 | has-proto: 1.0.1 2308 | has-symbols: 1.0.3 2309 | 2310 | glob-parent@5.1.2: 2311 | dependencies: 2312 | is-glob: 4.0.3 2313 | 2314 | glob-parent@6.0.2: 2315 | dependencies: 2316 | is-glob: 4.0.3 2317 | 2318 | glob@7.2.3: 2319 | dependencies: 2320 | fs.realpath: 1.0.0 2321 | inflight: 1.0.6 2322 | inherits: 2.0.4 2323 | minimatch: 3.1.2 2324 | once: 1.4.0 2325 | path-is-absolute: 1.0.1 2326 | 2327 | globals@11.12.0: {} 2328 | 2329 | globals@13.24.0: 2330 | dependencies: 2331 | type-fest: 0.20.2 2332 | 2333 | globby@11.1.0: 2334 | dependencies: 2335 | array-union: 2.1.0 2336 | dir-glob: 3.0.1 2337 | fast-glob: 3.3.2 2338 | ignore: 5.3.1 2339 | merge2: 1.4.1 2340 | slash: 3.0.0 2341 | 2342 | graphemer@1.4.0: {} 2343 | 2344 | has-flag@3.0.0: {} 2345 | 2346 | has-flag@4.0.0: {} 2347 | 2348 | has-proto@1.0.1: {} 2349 | 2350 | has-symbols@1.0.3: {} 2351 | 2352 | has-tostringtag@1.0.0: 2353 | dependencies: 2354 | has-symbols: 1.0.3 2355 | 2356 | has@1.0.3: 2357 | dependencies: 2358 | function-bind: 1.1.1 2359 | 2360 | http-assert@1.5.0: 2361 | dependencies: 2362 | deep-equal: 1.0.1 2363 | http-errors: 1.8.1 2364 | 2365 | http-errors@1.8.1: 2366 | dependencies: 2367 | depd: 1.1.2 2368 | inherits: 2.0.4 2369 | setprototypeof: 1.2.0 2370 | statuses: 1.5.0 2371 | toidentifier: 1.0.1 2372 | 2373 | http-errors@2.0.0: 2374 | dependencies: 2375 | depd: 2.0.0 2376 | inherits: 2.0.4 2377 | setprototypeof: 1.2.0 2378 | statuses: 2.0.1 2379 | toidentifier: 1.0.1 2380 | 2381 | iconv-lite@0.4.24: 2382 | dependencies: 2383 | safer-buffer: 2.1.2 2384 | 2385 | iconv-lite@0.6.3: 2386 | dependencies: 2387 | safer-buffer: 2.1.2 2388 | 2389 | ignore-by-default@1.0.1: {} 2390 | 2391 | ignore@5.3.1: {} 2392 | 2393 | import-fresh@3.3.0: 2394 | dependencies: 2395 | parent-module: 1.0.1 2396 | resolve-from: 4.0.0 2397 | 2398 | imurmurhash@0.1.4: {} 2399 | 2400 | inflation@2.0.0: {} 2401 | 2402 | inflight@1.0.6: 2403 | dependencies: 2404 | once: 1.4.0 2405 | wrappy: 1.0.2 2406 | 2407 | inherits@2.0.4: {} 2408 | 2409 | is-binary-path@2.1.0: 2410 | dependencies: 2411 | binary-extensions: 2.3.0 2412 | 2413 | is-extglob@2.1.1: {} 2414 | 2415 | is-generator-function@1.0.10: 2416 | dependencies: 2417 | has-tostringtag: 1.0.0 2418 | 2419 | is-glob@4.0.3: 2420 | dependencies: 2421 | is-extglob: 2.1.1 2422 | 2423 | is-number@7.0.0: {} 2424 | 2425 | is-path-inside@3.0.3: {} 2426 | 2427 | is-property@1.0.2: {} 2428 | 2429 | isarray@1.0.0: {} 2430 | 2431 | isexe@2.0.0: {} 2432 | 2433 | js-tokens@4.0.0: {} 2434 | 2435 | js-yaml@4.1.0: 2436 | dependencies: 2437 | argparse: 2.0.1 2438 | 2439 | jsesc@2.5.2: {} 2440 | 2441 | json-buffer@3.0.1: {} 2442 | 2443 | json-schema-traverse@0.4.1: {} 2444 | 2445 | json-stable-stringify-without-jsonify@1.0.1: {} 2446 | 2447 | json5@2.2.3: {} 2448 | 2449 | jsonwebtoken@9.0.0: 2450 | dependencies: 2451 | jws: 3.2.2 2452 | lodash: 4.17.21 2453 | ms: 2.1.2 2454 | semver: 7.5.3 2455 | 2456 | jwa@1.4.1: 2457 | dependencies: 2458 | buffer-equal-constant-time: 1.0.1 2459 | ecdsa-sig-formatter: 1.0.11 2460 | safe-buffer: 5.2.1 2461 | 2462 | jws@3.2.2: 2463 | dependencies: 2464 | jwa: 1.4.1 2465 | safe-buffer: 5.2.1 2466 | 2467 | keygrip@1.1.0: 2468 | dependencies: 2469 | tsscmp: 1.0.6 2470 | 2471 | keyv@4.5.4: 2472 | dependencies: 2473 | json-buffer: 3.0.1 2474 | 2475 | koa-bodyparser@4.4.1: 2476 | dependencies: 2477 | co-body: 6.1.0 2478 | copy-to: 2.0.1 2479 | type-is: 1.6.18 2480 | 2481 | koa-compose@4.1.0: {} 2482 | 2483 | koa-convert@2.0.0: 2484 | dependencies: 2485 | co: 4.6.0 2486 | koa-compose: 4.1.0 2487 | 2488 | koa@2.14.2: 2489 | dependencies: 2490 | accepts: 1.3.8 2491 | cache-content-type: 1.0.1 2492 | content-disposition: 0.5.4 2493 | content-type: 1.0.5 2494 | cookies: 0.8.0 2495 | debug: 4.3.4(supports-color@5.5.0) 2496 | delegates: 1.0.0 2497 | depd: 2.0.0 2498 | destroy: 1.2.0 2499 | encodeurl: 1.0.2 2500 | escape-html: 1.0.3 2501 | fresh: 0.5.2 2502 | http-assert: 1.5.0 2503 | http-errors: 1.8.1 2504 | is-generator-function: 1.0.10 2505 | koa-compose: 4.1.0 2506 | koa-convert: 2.0.0 2507 | on-finished: 2.4.1 2508 | only: 0.0.2 2509 | parseurl: 1.3.3 2510 | statuses: 1.5.0 2511 | type-is: 1.6.18 2512 | vary: 1.1.2 2513 | transitivePeerDependencies: 2514 | - supports-color 2515 | 2516 | levn@0.4.1: 2517 | dependencies: 2518 | prelude-ls: 1.2.1 2519 | type-check: 0.4.0 2520 | 2521 | locate-path@6.0.0: 2522 | dependencies: 2523 | p-locate: 5.0.0 2524 | 2525 | lodash.merge@4.6.2: {} 2526 | 2527 | lodash@4.17.21: {} 2528 | 2529 | long@5.2.3: {} 2530 | 2531 | lru-cache@5.1.1: 2532 | dependencies: 2533 | yallist: 3.1.1 2534 | 2535 | lru-cache@6.0.0: 2536 | dependencies: 2537 | yallist: 4.0.0 2538 | 2539 | lru-cache@7.18.3: {} 2540 | 2541 | lru-cache@8.0.5: {} 2542 | 2543 | make-error@1.3.6: {} 2544 | 2545 | media-typer@0.3.0: {} 2546 | 2547 | merge2@1.4.1: {} 2548 | 2549 | methods@1.1.2: {} 2550 | 2551 | micromatch@4.0.5: 2552 | dependencies: 2553 | braces: 3.0.2 2554 | picomatch: 2.3.1 2555 | 2556 | mime-db@1.52.0: {} 2557 | 2558 | mime-types@2.1.35: 2559 | dependencies: 2560 | mime-db: 1.52.0 2561 | 2562 | minimatch@3.1.2: 2563 | dependencies: 2564 | brace-expansion: 1.1.11 2565 | 2566 | minimatch@9.0.4: 2567 | dependencies: 2568 | brace-expansion: 2.0.1 2569 | 2570 | minimist@1.2.8: {} 2571 | 2572 | mkdirp@0.5.6: 2573 | dependencies: 2574 | minimist: 1.2.8 2575 | 2576 | module-alias@2.2.3: {} 2577 | 2578 | ms@2.1.2: {} 2579 | 2580 | multer@1.4.5-lts.1: 2581 | dependencies: 2582 | append-field: 1.0.0 2583 | busboy: 1.6.0 2584 | concat-stream: 1.6.2 2585 | mkdirp: 0.5.6 2586 | object-assign: 4.1.1 2587 | type-is: 1.6.18 2588 | xtend: 4.0.2 2589 | 2590 | mysql2@3.4.1: 2591 | dependencies: 2592 | denque: 2.1.0 2593 | generate-function: 2.3.1 2594 | iconv-lite: 0.6.3 2595 | long: 5.2.3 2596 | lru-cache: 8.0.5 2597 | named-placeholders: 1.1.3 2598 | seq-queue: 0.0.5 2599 | sqlstring: 2.3.3 2600 | 2601 | named-placeholders@1.1.3: 2602 | dependencies: 2603 | lru-cache: 7.18.3 2604 | 2605 | natural-compare@1.4.0: {} 2606 | 2607 | negotiator@0.6.3: {} 2608 | 2609 | node-releases@2.0.13: {} 2610 | 2611 | nodemon@3.1.0: 2612 | dependencies: 2613 | chokidar: 3.6.0 2614 | debug: 4.3.4(supports-color@5.5.0) 2615 | ignore-by-default: 1.0.1 2616 | minimatch: 3.1.2 2617 | pstree.remy: 1.1.8 2618 | semver: 7.5.3 2619 | simple-update-notifier: 2.0.0 2620 | supports-color: 5.5.0 2621 | touch: 3.1.0 2622 | undefsafe: 2.0.5 2623 | 2624 | nopt@1.0.10: 2625 | dependencies: 2626 | abbrev: 1.1.1 2627 | 2628 | normalize-path@3.0.0: {} 2629 | 2630 | object-assign@4.1.1: {} 2631 | 2632 | object-inspect@1.12.3: {} 2633 | 2634 | on-finished@2.4.1: 2635 | dependencies: 2636 | ee-first: 1.1.1 2637 | 2638 | once@1.4.0: 2639 | dependencies: 2640 | wrappy: 1.0.2 2641 | 2642 | only@0.0.2: {} 2643 | 2644 | optionator@0.9.4: 2645 | dependencies: 2646 | deep-is: 0.1.4 2647 | fast-levenshtein: 2.0.6 2648 | levn: 0.4.1 2649 | prelude-ls: 1.2.1 2650 | type-check: 0.4.0 2651 | word-wrap: 1.2.5 2652 | 2653 | p-limit@3.1.0: 2654 | dependencies: 2655 | yocto-queue: 0.1.0 2656 | 2657 | p-locate@5.0.0: 2658 | dependencies: 2659 | p-limit: 3.1.0 2660 | 2661 | parent-module@1.0.1: 2662 | dependencies: 2663 | callsites: 3.1.0 2664 | 2665 | parseurl@1.3.3: {} 2666 | 2667 | path-exists@4.0.0: {} 2668 | 2669 | path-is-absolute@1.0.1: {} 2670 | 2671 | path-key@3.1.1: {} 2672 | 2673 | path-to-regexp@6.2.1: {} 2674 | 2675 | path-type@4.0.0: {} 2676 | 2677 | picocolors@1.0.0: {} 2678 | 2679 | picomatch@2.3.1: {} 2680 | 2681 | prelude-ls@1.2.1: {} 2682 | 2683 | prettier-linter-helpers@1.0.0: 2684 | dependencies: 2685 | fast-diff: 1.3.0 2686 | 2687 | prettier@3.2.5: {} 2688 | 2689 | process-nextick-args@2.0.1: {} 2690 | 2691 | pstree.remy@1.1.8: {} 2692 | 2693 | punycode@2.3.1: {} 2694 | 2695 | qs@6.11.2: 2696 | dependencies: 2697 | side-channel: 1.0.4 2698 | 2699 | queue-microtask@1.2.3: {} 2700 | 2701 | raw-body@2.5.2: 2702 | dependencies: 2703 | bytes: 3.1.2 2704 | http-errors: 2.0.0 2705 | iconv-lite: 0.4.24 2706 | unpipe: 1.0.0 2707 | 2708 | readable-stream@2.3.8: 2709 | dependencies: 2710 | core-util-is: 1.0.3 2711 | inherits: 2.0.4 2712 | isarray: 1.0.0 2713 | process-nextick-args: 2.0.1 2714 | safe-buffer: 5.1.2 2715 | string_decoder: 1.1.1 2716 | util-deprecate: 1.0.2 2717 | 2718 | readdirp@3.6.0: 2719 | dependencies: 2720 | picomatch: 2.3.1 2721 | 2722 | resolve-from@4.0.0: {} 2723 | 2724 | reusify@1.0.4: {} 2725 | 2726 | rimraf@3.0.2: 2727 | dependencies: 2728 | glob: 7.2.3 2729 | 2730 | run-parallel@1.2.0: 2731 | dependencies: 2732 | queue-microtask: 1.2.3 2733 | 2734 | safe-buffer@5.1.2: {} 2735 | 2736 | safe-buffer@5.2.1: {} 2737 | 2738 | safer-buffer@2.1.2: {} 2739 | 2740 | semver@6.3.1: {} 2741 | 2742 | semver@7.5.3: 2743 | dependencies: 2744 | lru-cache: 6.0.0 2745 | 2746 | semver@7.6.0: 2747 | dependencies: 2748 | lru-cache: 6.0.0 2749 | 2750 | seq-queue@0.0.5: {} 2751 | 2752 | setprototypeof@1.2.0: {} 2753 | 2754 | shebang-command@2.0.0: 2755 | dependencies: 2756 | shebang-regex: 3.0.0 2757 | 2758 | shebang-regex@3.0.0: {} 2759 | 2760 | side-channel@1.0.4: 2761 | dependencies: 2762 | call-bind: 1.0.2 2763 | get-intrinsic: 1.2.1 2764 | object-inspect: 1.12.3 2765 | 2766 | simple-update-notifier@2.0.0: 2767 | dependencies: 2768 | semver: 7.5.3 2769 | 2770 | slash@3.0.0: {} 2771 | 2772 | sqlstring@2.3.3: {} 2773 | 2774 | statuses@1.5.0: {} 2775 | 2776 | statuses@2.0.1: {} 2777 | 2778 | streamsearch@1.1.0: {} 2779 | 2780 | string_decoder@1.1.1: 2781 | dependencies: 2782 | safe-buffer: 5.1.2 2783 | 2784 | strip-ansi@6.0.1: 2785 | dependencies: 2786 | ansi-regex: 5.0.1 2787 | 2788 | strip-bom@3.0.0: {} 2789 | 2790 | strip-json-comments@3.1.1: {} 2791 | 2792 | supports-color@5.5.0: 2793 | dependencies: 2794 | has-flag: 3.0.0 2795 | 2796 | supports-color@7.2.0: 2797 | dependencies: 2798 | has-flag: 4.0.0 2799 | 2800 | synckit@0.8.8: 2801 | dependencies: 2802 | '@pkgr/core': 0.1.1 2803 | tslib: 2.6.2 2804 | 2805 | text-table@0.2.0: {} 2806 | 2807 | to-fast-properties@2.0.0: {} 2808 | 2809 | to-regex-range@5.0.1: 2810 | dependencies: 2811 | is-number: 7.0.0 2812 | 2813 | toidentifier@1.0.1: {} 2814 | 2815 | touch@3.1.0: 2816 | dependencies: 2817 | nopt: 1.0.10 2818 | 2819 | ts-api-utils@1.3.0(typescript@5.4.5): 2820 | dependencies: 2821 | typescript: 5.4.5 2822 | 2823 | ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.5): 2824 | dependencies: 2825 | '@cspotcode/source-map-support': 0.8.1 2826 | '@tsconfig/node10': 1.0.11 2827 | '@tsconfig/node12': 1.0.11 2828 | '@tsconfig/node14': 1.0.3 2829 | '@tsconfig/node16': 1.0.4 2830 | '@types/node': 20.12.7 2831 | acorn: 8.11.3 2832 | acorn-walk: 8.3.4 2833 | arg: 4.1.3 2834 | create-require: 1.1.1 2835 | diff: 4.0.2 2836 | make-error: 1.3.6 2837 | typescript: 5.4.5 2838 | v8-compile-cache-lib: 3.0.1 2839 | yn: 3.1.1 2840 | 2841 | tsconfig-paths@4.2.0: 2842 | dependencies: 2843 | json5: 2.2.3 2844 | minimist: 1.2.8 2845 | strip-bom: 3.0.0 2846 | 2847 | tslib@2.6.2: {} 2848 | 2849 | tsscmp@1.0.6: {} 2850 | 2851 | type-check@0.4.0: 2852 | dependencies: 2853 | prelude-ls: 1.2.1 2854 | 2855 | type-fest@0.20.2: {} 2856 | 2857 | type-is@1.6.18: 2858 | dependencies: 2859 | media-typer: 0.3.0 2860 | mime-types: 2.1.35 2861 | 2862 | typedarray@0.0.6: {} 2863 | 2864 | typescript@5.4.5: {} 2865 | 2866 | undefsafe@2.0.5: {} 2867 | 2868 | undici-types@5.26.5: {} 2869 | 2870 | unpipe@1.0.0: {} 2871 | 2872 | update-browserslist-db@1.0.11(browserslist@4.21.10): 2873 | dependencies: 2874 | browserslist: 4.21.10 2875 | escalade: 3.1.1 2876 | picocolors: 1.0.0 2877 | 2878 | uri-js@4.4.1: 2879 | dependencies: 2880 | punycode: 2.3.1 2881 | 2882 | util-deprecate@1.0.2: {} 2883 | 2884 | uuid@9.0.0: {} 2885 | 2886 | v8-compile-cache-lib@3.0.1: {} 2887 | 2888 | vary@1.1.2: {} 2889 | 2890 | which@2.0.2: 2891 | dependencies: 2892 | isexe: 2.0.0 2893 | 2894 | word-wrap@1.2.5: {} 2895 | 2896 | wrappy@1.0.2: {} 2897 | 2898 | xtend@4.0.2: {} 2899 | 2900 | yallist@3.1.1: {} 2901 | 2902 | yallist@4.0.0: {} 2903 | 2904 | ylru@1.3.2: {} 2905 | 2906 | yn@3.1.1: {} 2907 | 2908 | yocto-queue@0.1.0: {} 2909 | --------------------------------------------------------------------------------