diff --git a/.gitignore b/.gitignore index ec318e3f..c0b25c17 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ config.yaml prisma/client/ .env +config.json apps/server/.env # IDE diff --git a/config.example.yaml b/config.example.yaml deleted file mode 100644 index 57b1862f..00000000 --- a/config.example.yaml +++ /dev/null @@ -1,97 +0,0 @@ -debug: false # 如无必要,请设置为 false -site: - # 网站主标题 Main site title - title: 'ChatGPT Admin Web' - # 网站副标题下显示的微信公众号, 留空则不显示 - # WeChat OA displayed under the subheading of the website, leave it blank, and it will not be displayed. - oa: -url: - # 当使用 Nginx 时,请将此处的地址留空 Leave this address blank when using Nginx - # 末尾不需要 / Not required at the end / - frontend: http://localhost:3000 # docker-compose 默认地址 - backend: http://localhost:3001 # docker-compose 默认地址 -port: - frontend: 3000 - backend: 3001 -# JWT 用户加密用户令牌 JWT User Encryption User Token -jwt: - # 可选用 ES256(推荐) 和 HS256 - # ES256 (recommended) and HS256 are available. - algorithm: HS256 - # HS256 - secret: secret - # ES256 填写 JWK格式 - # ES256 filled in JWK format - publicKey: - privateKey: -# Redis 数据库设置,如不使用外部数据库请勿修改 -# Redis database settings, do not modify if you are not using an external database. -redis: - url: redis://localhost:6379/0 -# Postgres 数据库设置,如不使用外部数据库请勿修改 -# Postgres database settings, do not change if you are not using an external database -postgres: - url: postgresql://postgres:postgres@postgres:5432/postgres -openai: - # 对于一般的服务如 openai, api2d 等,你只需要填写 baseUrl - # For general services such as openai, api2d, etc., you only need to fill in the baseUrl. - # eg: https://api.openai.com/v1 - baseUrl: 'https://renailu.deno.dev/v1' - # 如果你清楚完整的地址,请填写 endpointUrl - # If you know the full address, please fill in the endpointUrl - endpointUrl: '' - # 初始化 Keys, 仅会首次或数据库为空时读入 - keys: - - 'sk-fff' -# 邮件发送配置 Mail Delivery Configuration -email: - # 使用的邮件服务,可选值:resend, mailgun, elastic - # The mail service to use, options: resend, mailgun, elastic - use: - domain: # 域名 - # 发件人邮箱,不填则默认使用 no-reply@ - # Sender's email, no-reply@ is used by default if you don't fill it in. - sender: - # 文档:https://resend.com/docs/api-reference/api-keys/create-api-key - resend: - apikey: - mailgun: - apiKey: - elastic: - apiKey: -# 短信发送配置 SMS sending configuration -sms: - # 使用的短信服务,可选值:uni - # SMS service used, optional value: uni - use: - # 以下为短信服务商的配置,仅需填写所选 use 的配置 - # The following is the configuration of the SMS service provider, only the configuration of the selected use needs to be filled out - uni: # https://unisms.apistd.com/console/ - signature: - apiKey: - apiSecret: # 填写则启用 HMAC 模式 -# 微信登录设置 WeChat Login Settings -wechat: - # Official OAuth - # 官方 OAuth - oauth: - appId: - appSecret: - redirectUrl: - # Via WeChat OA Code - mp: - appId: - appSecret: -# 收款配置 Receipt configuration -payment: - # Optional value: xunhu - use: 'xunhu' - xunhu: # 虎皮椒,文档:https://www.xunhupay.com/doc/prepare.html - # 店铺名称 Store Name - wapName: - appId: - appSecret: - # 填写服务地址 Fill in the service address - # eg: https://chat.xjt.lu - notifyUrl: - returnUrl: diff --git a/package.json b/package.json index 84bd9660..0fa067d0 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "prettier": "latest", "ts-node": "latest", "turbo": "latest", - "typescript": "latest" + "typescript": "latest", + "prisma": "5.5.2" }, "prisma": { "schema": "prisma/schema.prisma" diff --git a/packages/backend/package.json b/packages/backend/package.json index 63a4de2a..4c9f8ff3 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -19,12 +19,10 @@ }, "dependencies": { "@liaoliaots/nestjs-redis": "^9.0.5", - "@nestjs/common": "^10.0.0", - "@nestjs/config": "^3.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/mapped-types": "*", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/platform-fastify": "^10.2.7", + "@nestjs/common": "^10.2.8", + "@nestjs/config": "^3.1.1", + "@nestjs/core": "^10.2.8", + "@nestjs/platform-fastify": "^10.2.8", "@prisma/client": "workspace:@nest-http/prisma@*", "bcrypt": "^5.1.0", "fastify": "^4.24.3", @@ -34,7 +32,6 @@ "jose": "^4.14.1", "js-yaml": "^4.1.0", "mint-filter": "^4.0.3", - "nest-router": "^1.0.9", "nestjs-prisma": "^0.22.0", "openai": "^4.14.0", "prisma-extension-pagination": "^0.5.0", @@ -43,11 +40,9 @@ "spark-md5": "^3.0.2" }, "devDependencies": { - "@nestjs/cli": "^10.0.0", - "@nestjs/schematics": "^10.0.0", - "@nestjs/testing": "^10.0.0", - "@trivago/prettier-plugin-sort-imports": "*", - "@types/express": "^4.17.17", + "@nestjs/cli": "^10.2.1", + "@nestjs/schematics": "^10.0.3", + "@nestjs/testing": "^10.2.8", "@types/jest": "^29.5.2", "@types/js-yaml": "^4.0.5", "@types/mocha": "^10.0.2", @@ -60,8 +55,7 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-simple-import-sort": "^10.0.0", "jest": "^29.5.0", - "prettier": "*", - "prisma": "^5.1.1", + "prisma": "*", "shared": "workspace:*", "source-map-support": "^0.5.21", "supertest": "^6.3.3", diff --git a/packages/backend/src/app.module.ts b/packages/backend/src/app.module.ts index ad80db9f..70e4742d 100644 --- a/packages/backend/src/app.module.ts +++ b/packages/backend/src/app.module.ts @@ -2,9 +2,9 @@ import { CustomPrismaModule } from 'nestjs-prisma'; import { RedisModule } from '@liaoliaots/nestjs-redis'; import { Module } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; import { APP_GUARD } from '@nestjs/core'; +import { ConfigModule } from '@/common/config'; import { AuthGuard } from '@/common/guards/auth.guard'; import { JwtModule } from '@/libs/jwt/jwt.module'; import { AuthModule } from '@/modules/auth/auth.module'; @@ -17,14 +17,10 @@ import { ExtendedPrismaConfigService } from '@/processors/database/prisma.servic import { AppController } from './app.controller'; import { AppService } from './app.service'; -import configuration from './configuration'; @Module({ imports: [ - ConfigModule.forRoot({ - load: [configuration], - isGlobal: true, - }), + ConfigModule, CustomPrismaModule.forRootAsync({ name: 'PrismaService', useClass: ExtendedPrismaConfigService, @@ -32,7 +28,7 @@ import configuration from './configuration'; }), RedisModule.forRoot({ config: { - url: configuration().redis.url, + url: process.env.REDIS_URL, }, }), AuthModule, diff --git a/packages/backend/src/common/config/config.module.ts b/packages/backend/src/common/config/config.module.ts new file mode 100644 index 00000000..6b65bc2e --- /dev/null +++ b/packages/backend/src/common/config/config.module.ts @@ -0,0 +1,10 @@ +import { Global, Module } from '@nestjs/common'; + +import { ConfigService } from './config.service'; + +@Global() +@Module({ + providers: [ConfigService], + exports: [ConfigService], +}) +export class ConfigModule {} diff --git a/packages/backend/src/common/config/config.service.ts b/packages/backend/src/common/config/config.service.ts new file mode 100644 index 00000000..c0a9fb69 --- /dev/null +++ b/packages/backend/src/common/config/config.service.ts @@ -0,0 +1,125 @@ +import * as fs from 'fs'; +import { join } from 'path'; + +import { Injectable } from '@nestjs/common'; + +import { BizException } from '@/common/exceptions/biz.exception'; + +import { ConfigType, ISettingSchema } from 'shared'; +import { ErrorCodeEnum } from 'shared/dist/error-code'; + +const DEFAULT_CONFIG = { + mode: 'nginx', + title: 'ChatGPT Admin Web', + port: { + frontend: 3000, + backend: 3001, + }, + jwt: { + algorithm: 'HS256', + }, +}; + +const CONFIG_SCHEMA: ISettingSchema[] = [ + { + key: 'mode', + type: 'select', + label: '运行模式', + selectOptions: ['nginx', 'docker', 'debug'], + }, + { + key: 'title', + type: 'input', + label: '网站标题', + }, + { + key: 'port', + label: '端口', + items: [ + { + key: 'frontend', + type: 'input' as any, + label: '前端端口', + }, + { + key: 'backend', + type: 'input' as any, + label: '后端端口', + }, + ], + }, + { + key: 'jwt', + label: 'JWT', + items: [ + { + key: 'algorithm', + type: 'select' as any, + label: '算法', + selectOptions: ['HS256', 'RS256'], + }, + { + key: 'secret', + type: 'input' as any, + label: '密钥', + }, + ], + }, + { + key: 'email', + label: '邮箱', + items: [ + { + key: 'use', + type: 'select' as any, + label: '启用', + selectOptions: ['disable', 'resend'], + }, + ], + }, +]; + +@Injectable() +export class ConfigService { + private config: ConfigType; + private readonly defaultConfig = DEFAULT_CONFIG; + private readonly configFilePath = join(__dirname, '../../../config.json'); + + constructor() { + this.loadConfig(); + } + + private loadConfig(): void { + this.config = fs.existsSync(this.configFilePath) + ? JSON.parse(fs.readFileSync(this.configFilePath, 'utf8')) + : this.defaultConfig; + } + + /* 结构 */ + getConfigSchema(isPublic = false) { + if (isPublic && fs.existsSync(this.configFilePath)) { + throw new BizException(ErrorCodeEnum.ConfigExists); + } + return CONFIG_SCHEMA; + } + + /* 获取默认值 */ + getDefaultValue() { + return this.defaultConfig; + } + + get(key: K): ConfigType[K] { + return this.config[key]; + } + + getAll() { + return this.config; + } + + updateConfig(updateConfig: Partial) { + const newConfig = { ...this.config, ...updateConfig }; + const jsonData = JSON.stringify(newConfig, null, 2); + fs.writeFileSync(this.configFilePath, jsonData, 'utf8'); + this.loadConfig(); + } +} diff --git a/packages/backend/src/common/config/index.ts b/packages/backend/src/common/config/index.ts new file mode 100644 index 00000000..4c678970 --- /dev/null +++ b/packages/backend/src/common/config/index.ts @@ -0,0 +1,2 @@ +export * from './config.service'; +export * from './config.module'; diff --git a/packages/backend/src/common/exceptions/biz.exception.ts b/packages/backend/src/common/exceptions/biz.exception.ts index 2814f35c..a96bb346 100644 --- a/packages/backend/src/common/exceptions/biz.exception.ts +++ b/packages/backend/src/common/exceptions/biz.exception.ts @@ -2,70 +2,80 @@ import { HttpException } from '@nestjs/common'; import { ErrorCodeEnum } from 'shared/dist/error-code'; -export const ErrorCode = Object.freeze>( - { - /* Service Error */ - [ErrorCodeEnum.OutOfQuota]: [ - 'You have exceeded your current planned usage', - '您已超出当前计划的用量', - ], +export const ErrorCode = Object.freeze< + Record +>({ + /* Service Error */ + [ErrorCodeEnum.OutOfQuota]: [ + 'You have exceeded your current planned usage', + '您已超出当前计划的用量', + 429, + ], - /* 403 */ - [ErrorCodeEnum.AuthFail]: ['Auth failed', '认证失败'], - [ErrorCodeEnum.PasswordError]: ['The password is incorrect', '密码错误'], - [ErrorCodeEnum.CodeValidationError]: [ - 'The validation code is incorrect', - '验证码错误', - ], - [ErrorCodeEnum.UserNotExist]: [ - 'Auth failed, the user not exist', - '认证失败,用户不存在', - ], - [ErrorCodeEnum.PhoneDuplicated]: [ - 'The phone already bind with another account', - '手机号ban', - ], - [ErrorCodeEnum.EmailDuplicated]: [ - 'This email already bind with another account', - '邮箱已存在', - ], - [ErrorCodeEnum.BindEmailExist]: [ - 'The account already bind with email', - '邮箱已存在', - ], - [ErrorCodeEnum.BindPhoneExist]: [ - 'The account already bind with phone', - '手机已存在', - ], - /* 404 */ - [ErrorCodeEnum.NotFound]: ['Not found', '未找到'], - [ErrorCodeEnum.SessionNotFound]: ['Session not found', '会话未找到'], + /* 403 */ + [ErrorCodeEnum.ConfigExists]: ['Config already exists', '配置已存在', 400], + [ErrorCodeEnum.AuthFail]: ['Auth failed', '认证失败', 401], + [ErrorCodeEnum.PasswordError]: ['The password is incorrect', '密码错误', 400], + [ErrorCodeEnum.CodeValidationError]: [ + 'The validation code is incorrect', + '验证码错误', + 400, + ], + [ErrorCodeEnum.UserNotExist]: [ + 'Auth failed, the user not exist', + '认证失败,用户不存在', + 400, + ], + [ErrorCodeEnum.PhoneDuplicated]: [ + 'The phone already bind with another account', + '手机号ban', + 400, + ], + [ErrorCodeEnum.EmailDuplicated]: [ + 'This email already bind with another account', + '邮箱已存在', + 400, + ], + [ErrorCodeEnum.BindEmailExist]: [ + 'The account already bind with email', + '邮箱已存在', + 400, + ], + [ErrorCodeEnum.BindPhoneExist]: [ + 'The account already bind with phone', + '手机已存在', + 400, + ], + /* 404 */ + [ErrorCodeEnum.NotFound]: ['Not found', '未找到', 400], + [ErrorCodeEnum.SessionNotFound]: ['Session not found', '会话未找到', 400], - /* 429 */ - [ErrorCodeEnum.TooManyRequests]: ['Too many requests', '请求过多'], + /* 429 */ + [ErrorCodeEnum.TooManyRequests]: ['Too many requests', '请求过多', 400], - /* 406 */ - [ErrorCodeEnum.ValidationError]: [ - 'Request data validation error', - '请求参数错误', - ], + /* 406 */ + [ErrorCodeEnum.ValidationError]: [ + 'Request data validation error', + '请求参数错误', + 400, + ], - /* 500 */ - [ErrorCodeEnum.ServerError]: ['Server error', '服务器错误'], - [ErrorCodeEnum.DatabaseError]: ['Database error', '数据库错误'], - [ErrorCodeEnum.RedisError]: ['Redis error', 'Redis错误'], - [ErrorCodeEnum.EmailError]: ['Email error', '邮件错误'], - [ErrorCodeEnum.SmsError]: ['Sms error', '短信错误'], - [ErrorCodeEnum.WechatError]: ['Wechat error', '微信错误'], - }, -); + /* 500 */ + [ErrorCodeEnum.ServerError]: ['Server error', '服务器错误', 500], + [ErrorCodeEnum.DatabaseError]: ['Database error', '数据库错误', 500], + [ErrorCodeEnum.RedisError]: ['Redis error', 'Redis错误', 500], + [ErrorCodeEnum.EmailError]: ['Email error', '邮件错误', 500], + [ErrorCodeEnum.SmsError]: ['Sms error', '短信错误', 500], + [ErrorCodeEnum.WechatError]: ['Wechat error', '微信错误', 500], + [ErrorCodeEnum.UnknownError]: ['Unknown error', '未知错误', 500], +}); export class BizException extends HttpException { constructor(code: ErrorCodeEnum) { - const [message, chMessage] = ErrorCode[code]; + const [message, chMessage, statusCode] = ErrorCode[code]; super( HttpException.createBody({ success: false, code, message, chMessage }), - 400, + statusCode, ); } } diff --git a/packages/backend/src/common/filters/all-execption.filter.ts b/packages/backend/src/common/filters/all-execption.filter.ts index 34696625..70fe9bbd 100644 --- a/packages/backend/src/common/filters/all-execption.filter.ts +++ b/packages/backend/src/common/filters/all-execption.filter.ts @@ -8,6 +8,8 @@ import { HttpStatus, } from '@nestjs/common'; +import { ErrorCodeEnum } from 'shared/dist/error-code'; + @Catch() export class AllExceptionFilter implements ExceptionFilter { catch(exception: unknown, host: ArgumentsHost) { @@ -20,14 +22,17 @@ export class AllExceptionFilter implements ExceptionFilter { } const code = - (exception as any)?.response?.code || HttpStatus.INTERNAL_SERVER_ERROR; + (exception as any)?.response?.code || ErrorCodeEnum.UnknownError; + + const statusCode = + (exception as any)?.status || HttpStatus.INTERNAL_SERVER_ERROR; const message = (exception as any)?.response?.message || (exception as any)?.message || 'Unknown Error'; - response.status(400).type('application/json').send({ + response.status(statusCode).type('application/json').send({ success: false, code, message, diff --git a/packages/backend/src/common/guards/auth.guard.ts b/packages/backend/src/common/guards/auth.guard.ts index 8d4a62da..709f980b 100644 --- a/packages/backend/src/common/guards/auth.guard.ts +++ b/packages/backend/src/common/guards/auth.guard.ts @@ -3,14 +3,16 @@ import { ExecutionContext, Injectable, SetMetadata, - UnauthorizedException, createParamDecorator, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { Role } from '@prisma/client'; +import { BizException } from '@/common/exceptions/biz.exception'; import { JWTPayload, JwtService } from '@/libs/jwt/jwt.service'; +import { ErrorCodeEnum } from 'shared/dist/error-code'; + export { Role } from '@prisma/client'; export const ROLES_KEY = 'roles'; export const IS_PUBLIC_KEY = 'isPublic'; @@ -26,10 +28,6 @@ export const Payload = createParamDecorator( }, ); -export interface AuthUser { - userId: string; -} - @Injectable() export class AuthGuard implements CanActivate { constructor( @@ -47,17 +45,16 @@ export class AuthGuard implements CanActivate { const token = this.extractTokenFromHeader(request); if (!token) { if (isPublic) return true; - throw new UnauthorizedException(); + throw new BizException(ErrorCodeEnum.AuthFail); } else { try { request['payload'] = await this.jwtService.verify(token); } catch { if (isPublic) return true; - throw new UnauthorizedException(); + throw new BizException(ErrorCodeEnum.AuthFail); } } - /* RBAC */ const roles = this.reflector.getAllAndOverride('roles', [ context.getHandler(), context.getClass(), @@ -67,12 +64,8 @@ export class AuthGuard implements CanActivate { return this.matchRoles(roles, request['payload']?.role); } - /* Check if there are elements in the payload array that are also in the roles array. */ private matchRoles(roles: Role[], payload: Role): boolean { return roles.includes(payload); - // return payload.some((role) => - // roles.map((role) => role.toLowerCase()).includes(role.toLowerCase()), - // ); } private extractTokenFromHeader(request: Request): string | undefined { diff --git a/packages/backend/src/configuration.ts b/packages/backend/src/configuration.ts deleted file mode 100644 index 703f78a0..00000000 --- a/packages/backend/src/configuration.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { readFileSync } from 'fs'; -import * as yaml from 'js-yaml'; -import { join } from 'path'; - -const YAML_CONFIG_FILENAME = '../../../config.yaml'; - -export default () => { - return yaml.load( - readFileSync(join(__dirname, YAML_CONFIG_FILENAME), 'utf8'), - ) as Record; -}; diff --git a/packages/backend/src/libs/email/email.service.ts b/packages/backend/src/libs/email/email.service.ts index 591b8d88..9bcff277 100644 --- a/packages/backend/src/libs/email/email.service.ts +++ b/packages/backend/src/libs/email/email.service.ts @@ -1,5 +1,8 @@ import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; + +import { ConfigService } from '@/common/config'; + +import { ConfigType } from 'shared'; type IEmailArgs = { from: string; @@ -10,12 +13,14 @@ type IEmailArgs = { @Injectable() export class EmailService { - private emailConfig = this.configService.get('email'); + private readonly emailConfig: ConfigType['email']; - constructor(private configService: ConfigService) {} + constructor(configService: ConfigService) { + this.emailConfig = configService.get('email'); + } /* Resend email */ - async resend(args: IEmailArgs) { + async #resend(args: IEmailArgs) { const res = await fetch('https://api.resend.com/emails', { method: 'POST', headers: { @@ -33,7 +38,7 @@ export class EmailService { } /* Elastic Email sender */ - async elastic(args: IEmailArgs) { + async #elastic(args: IEmailArgs) { const params = { apikey: this.emailConfig.elastic.apiKey, from: args.from, @@ -60,7 +65,7 @@ export class EmailService { * This is a program for sending emails, with the email service provided by Mailgun. * Need further processing of error reporting for emails. */ - async mailgun(args: IEmailArgs) { + async #mailgun(args: IEmailArgs) { const url = `https://api.mailgun.net/v3/${this.emailConfig.mailgun.domain}/messages`; const formData = new URLSearchParams(); @@ -93,13 +98,14 @@ export class EmailService { content: `你的激活码是 ${code}`, }; - switch (this.configService.get('email').use?.toLowerCase()) { + switch (this.emailConfig.use?.toLowerCase()) { case 'resend': - return this.resend(args); + return this.#resend(args); case 'elastic': - return this.elastic(args); + return this.#elastic(args); case 'mailgun': - return this.mailgun(args); + return this.#mailgun(args); + case undefined: default: return false; } diff --git a/packages/backend/src/libs/jwt/jwt.service.ts b/packages/backend/src/libs/jwt/jwt.service.ts index a824e329..1564ebeb 100644 --- a/packages/backend/src/libs/jwt/jwt.service.ts +++ b/packages/backend/src/libs/jwt/jwt.service.ts @@ -6,9 +6,10 @@ import { } from 'jose'; import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; import { Role } from '@prisma/client'; +import { ConfigService } from '@/common/config'; + export type JWTPayload = JWTPayloadDefault & { id: number; role: Role; diff --git a/packages/backend/src/libs/payment/payment.service.ts b/packages/backend/src/libs/payment/payment.service.ts index 70b2bb30..8bce0aaf 100644 --- a/packages/backend/src/libs/payment/payment.service.ts +++ b/packages/backend/src/libs/payment/payment.service.ts @@ -1,7 +1,8 @@ import * as md5 from 'spark-md5'; import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; + +import { ConfigService } from '@/common/config'; import { ConfigType } from 'shared'; @@ -38,10 +39,10 @@ function sortAndSignParameters(parameters: PaymentArgs | CallbackBody): string { @Injectable() export class PaymentService { - private xhConfig: ConfigType['payment']['xunhu']; + private paymentConfig: ConfigType['payment']; constructor(configService: ConfigService) { - this.xhConfig = configService.get('payment').xunhu; + this.paymentConfig = configService.get('payment'); } async xhStartPay({ @@ -55,25 +56,26 @@ export class PaymentService { attach: string; title?: string; }) { + const xhConfig = this.paymentConfig.xunhu; const fetchBody: PaymentArgs = { version: '1.1', - appid: this.xhConfig.appId, + appid: xhConfig.appId, trade_order_id: orderId, - total_fee: price, + total_fee: price / 100, // 此处为实际价格,单位为元 title: title ?? 'ChatGPT Admin Web', time: Math.floor(Date.now() / 1000), - notify_url: `${this.xhConfig.notifyUrl}/api/order/callback/xunhu`, - return_url: this.xhConfig.returnUrl, // After the user has successfully made the payment, we will automatically redirect the user's browser to this URL. - callback_url: this.xhConfig.returnUrl, // After the user cancels the payment, we may guide the user to redirect to this URL to make the payment again. + notify_url: `${xhConfig.notifyUrl}/api/order/callback/xunhu`, + return_url: xhConfig.returnUrl, // After the user has successfully made the payment, we will automatically redirect the user's browser to this URL. + callback_url: xhConfig.returnUrl, // After the user cancels the payment, we may guide the user to redirect to this URL to make the payment again. // plugins: string; attach, // Return as is during callback. 📢We use it to confirm that the order has not been tampered with. nonce_str: orderId, // 1. Avoid server page caching 2. Prevent security keys from being guessed type: 'WAP', - wap_url: this.xhConfig.returnUrl, - wap_name: this.xhConfig.wapName, + wap_url: xhConfig.returnUrl, + wap_name: xhConfig.wapName, }; const stringA = sortAndSignParameters(fetchBody); - const hash = md5.hash(stringA + this.xhConfig.appSecret); + const hash = md5.hash(stringA + xhConfig.appSecret); const resp = await fetch('https://api.xunhupay.com/payment/do.html', { cache: 'no-store', @@ -103,7 +105,8 @@ export class PaymentService { Currently only the appId is being validated. In the future, attach will also need to be validated to improve security. */ - if (body.appid.toString() !== this.xhConfig.appId.toString()) return null; + if (body.appid.toString() !== this.paymentConfig.xunhu.appId.toString()) + return null; /* == Verify Signature == */ // const trueHash = body.hash! diff --git a/packages/backend/src/libs/sms/sms.service.ts b/packages/backend/src/libs/sms/sms.service.ts index a743940b..b4b58621 100644 --- a/packages/backend/src/libs/sms/sms.service.ts +++ b/packages/backend/src/libs/sms/sms.service.ts @@ -1,5 +1,8 @@ import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; + +import { ConfigService } from '@/common/config'; + +import { ConfigType } from 'shared'; type ISMSArgs = { to: string; @@ -8,9 +11,11 @@ type ISMSArgs = { @Injectable() export class SmsService { - private smsConfig = this.configService.get('sms'); + private readonly smsConfig: ConfigType['sms']; - constructor(private configService: ConfigService) {} + constructor(configService: ConfigService) { + this.smsConfig = configService.get('sms') ?? {}; + } async uni(args: ISMSArgs) { if (!this.smsConfig.uni.apiKey || !this.smsConfig.uni.signature) { diff --git a/packages/backend/src/main.ts b/packages/backend/src/main.ts index edabe123..7ef43c4d 100644 --- a/packages/backend/src/main.ts +++ b/packages/backend/src/main.ts @@ -1,8 +1,8 @@ -import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; import { NestFastifyApplication } from '@nestjs/platform-fastify'; import { fastifyApp } from '@/common/adapter/fastify.adapter'; +import { ConfigService } from '@/common/config'; import { AllExceptionFilter } from '@/common/filters/all-execption.filter'; import { PrismaExceptionFilter } from '@/common/filters/prisma-client-execption'; diff --git a/packages/backend/src/modules/auth/wechat.service.ts b/packages/backend/src/modules/auth/wechat.service.ts index 0e6ef888..7d342837 100644 --- a/packages/backend/src/modules/auth/wechat.service.ts +++ b/packages/backend/src/modules/auth/wechat.service.ts @@ -1,9 +1,9 @@ import { CustomPrismaService } from 'nestjs-prisma'; import { Inject, Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; import { OAuthProvider } from '@prisma/client'; +import { ConfigService } from '@/common/config'; import { JwtService } from '@/libs/jwt/jwt.service'; import { ExtendedPrismaClient } from '@/processors/database/prisma.extension'; diff --git a/packages/backend/src/modules/chat/chat.service.ts b/packages/backend/src/modules/chat/chat.service.ts index dca65d70..314191b6 100644 --- a/packages/backend/src/modules/chat/chat.service.ts +++ b/packages/backend/src/modules/chat/chat.service.ts @@ -9,9 +9,9 @@ import { import { Observable } from 'rxjs'; import { Inject, Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; import { type ChatMessage, ChatMessageRole } from '@prisma/client'; +import { ConfigService } from '@/common/config'; import { BizException } from '@/common/exceptions/biz.exception'; import { ExtendedPrismaClient } from '@/processors/database/prisma.extension'; @@ -25,9 +25,9 @@ export class ChatService { constructor( @Inject('PrismaService') private prisma: CustomPrismaService, - config: ConfigService, + configService: ConfigService, ) { - this.openaiConfig = config.get('openai'); + this.openaiConfig = configService.get('openai'); } /* 获取指定用户最近时间内消息的总计,用于limit */ diff --git a/packages/backend/src/modules/dashboard/dashboard.controller.ts b/packages/backend/src/modules/dashboard/dashboard.controller.ts index aa6f907e..72ad5a52 100644 --- a/packages/backend/src/modules/dashboard/dashboard.controller.ts +++ b/packages/backend/src/modules/dashboard/dashboard.controller.ts @@ -1,6 +1,7 @@ -import { Controller, Delete, Get, Post, Query } from '@nestjs/common'; +import { Controller, Delete, Get, Post, Put, Query } from '@nestjs/common'; -import { Role, Roles } from '@/common/guards/auth.guard'; +import { ConfigService } from '@/common/config/config.service'; +import { Public, Role, Roles } from '@/common/guards/auth.guard'; import { JoiValidationPipe } from '@/common/pipes/joi'; import { PagerQuery, PagerQuerySchema } from '@/shared'; @@ -9,7 +10,10 @@ import { DashboardService } from './dashboard.service'; @Roles(Role.Admin) @Controller('dashboard') export class DashboardController { - constructor(private readonly dashboardService: DashboardService) {} + constructor( + private readonly dashboardService: DashboardService, + private readonly configService: ConfigService, + ) {} @Get('analytics') async getAnalytics() { @@ -86,4 +90,33 @@ export class DashboardController { meta, }; } + + @Public() + @Get('install') + install() { + return { + success: true, + data: { + schema: this.configService.getConfigSchema(true), + value: this.configService.getDefaultValue(), + }, + }; + } + + @Get('config') + getAllConfig() { + return { + success: true, + data: { + schema: this.configService.getConfigSchema(), + value: this.configService.getAll(), + }, + }; + } + + @Put('config') + updateConfig() { + // this.configService.updateConfig({ '1': '2' }); + return {}; + } } diff --git a/packages/backend/src/modules/dashboard/dashboard.module.ts b/packages/backend/src/modules/dashboard/dashboard.module.ts index 08ebeeff..964d297d 100644 --- a/packages/backend/src/modules/dashboard/dashboard.module.ts +++ b/packages/backend/src/modules/dashboard/dashboard.module.ts @@ -1,10 +1,14 @@ import { Module } from '@nestjs/common'; +import { ConfigModule } from '@/common/config/config.module'; +import { ConfigService } from '@/common/config/config.service'; + import { DashboardController } from './dashboard.controller'; import { DashboardService } from './dashboard.service'; @Module({ + imports: [ConfigModule], controllers: [DashboardController], - providers: [DashboardService], + providers: [DashboardService, ConfigService], }) export class DashboardModule {} diff --git a/packages/backend/src/processors/database/prisma.service.ts b/packages/backend/src/processors/database/prisma.service.ts index d3fdde92..f5feab55 100644 --- a/packages/backend/src/processors/database/prisma.service.ts +++ b/packages/backend/src/processors/database/prisma.service.ts @@ -1,7 +1,6 @@ import { CustomPrismaClientFactory } from 'nestjs-prisma'; import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; import { type ExtendedPrismaClient, @@ -14,8 +13,9 @@ export class ExtendedPrismaConfigService { private readonly url: string; - constructor(configService: ConfigService) { - this.url = configService.getOrThrow('postgres').url; + constructor() { + // TODO Read from configuration file + this.url = process.env.DATABASE_URL; } createPrismaClient(): ExtendedPrismaClient { diff --git a/packages/frontend/next.config.js b/packages/frontend/next.config.js index ea3a9f9e..38627925 100644 --- a/packages/frontend/next.config.js +++ b/packages/frontend/next.config.js @@ -1,14 +1,25 @@ const fs = require('fs'); -const yaml = require('js-yaml'); +const path = require('path'); +const CONFIG_FILE = path.join(__dirname, '../../config.json'); -const config = yaml.load(fs.readFileSync('../../config.yaml', 'utf8')); -const BASE_URL = config?.url?.backend ?? ''; +const config = fs.existsSync(CONFIG_FILE) + ? JSON.parse(fs.readFileSync('../../config.json', 'utf8')) + : { + mode: 'dev', + title: 'ChatGPT Admin Web', + port: { + frontend: 3000, + backend: 3001, + }, + jwt: { + algorithm: 'HS256', + }, + }; /** @type {import('next').NextConfig} */ const nextConfig = { env: { - NEXT_PUBLIC_TITLE: config?.site?.title ?? 'ChatGPT Admin Web', - NEXT_PUBLIC_BASE_URL: BASE_URL, + NEXT_PUBLIC_TITLE: config?.title ?? 'ChatGPT Admin Web', }, webpack(config) { config.module.rules.push({ @@ -21,7 +32,9 @@ const nextConfig = { return [ { source: '/api/:slug*', - destination: `${BASE_URL}/api/:slug*`, + destination: `http://localhost:${ + config.port.backend ?? '3001' + }/api/:slug*`, }, ]; }, diff --git a/packages/frontend/package.json b/packages/frontend/package.json index f221a6aa..281f4289 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -8,27 +8,17 @@ "lint": "next lint" }, "dependencies": { - "@edge-runtime/ponyfill": "^2.1.2", - "@edge-runtime/types": "^2.0.8", "@radix-ui/colors": "^3.0.0", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/themes": "^2.0.0", "@svgr/webpack": "^6.5.1", "@types/ramda": "^0.29.7", - "@upstash/redis": "^1.20.2", - "array.prototype.at": "^1.1.1", - "client-only": "^0.0.1", "clsx": "^2.0.0", - "cross-env": "^7.0.3", - "edge-runtime": "^2.1.2", "emoji-picker-react": "^4.4.7", "eslint": "8.35.0", "eslint-config-next": "13.2.3", - "eventsource-parser": "^0.1.0", - "iron-session": "^6.3.1", "js-yaml": "^4.1.0", "next": "^13.5.6", - "openai": "^3.2.1", "ramda": "^0.29.1", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -41,22 +31,14 @@ "remark-math": "^5.1.1", "sass": "^1.59.2", "shared": "workspace:*", - "spark-md5": "^3.0.2", "swr": "^2.1.3", - "uuid": "^9.0.1", "zustand": "^4.3.6" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "*", - "@types/node": "*", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-katex": "^3.0.0", - "@types/spark-md5": "^3.0.2", - "@types/uuid": "^9.0.6", - "prettier": "*", - "typescript": "*", - "zod": "^3.21.4" + "typescript": "*" }, "packageManager": "pnpm@8.6.3" } diff --git a/packages/frontend/src/app/(need-auth)/page.tsx b/packages/frontend/src/app/(need-auth)/page.tsx index d162ce44..73e03526 100644 --- a/packages/frontend/src/app/(need-auth)/page.tsx +++ b/packages/frontend/src/app/(need-auth)/page.tsx @@ -6,6 +6,7 @@ import { IconButton } from '@/components/button'; import Chat from '@/components/chat'; import AddIcon from '@/icons/add.svg'; import ReturnIcon from '@/icons/return.svg'; +import ChatGptIcon from '@/icons/bot.svg'; import Locale from '@/locales'; import { useStore } from '@/store'; import styles from '@/styles/module/welcome.module.scss'; @@ -25,9 +26,10 @@ export default function ChatPage() { className={styles['return-btn']} >
-
{Locale.Index.WelcomeTitle}
-
{Locale.Index.WelcomeMessage}
-
{Locale.Index.WelcomeCaption}
+
+
+
{Locale.Index.Title}
+
{Locale.Index.WelcomeCaption}
} diff --git a/packages/frontend/src/app/auth/auth.module.scss b/packages/frontend/src/app/auth/auth.module.scss index 5e99d991..be53eeda 100644 --- a/packages/frontend/src/app/auth/auth.module.scss +++ b/packages/frontend/src/app/auth/auth.module.scss @@ -214,3 +214,7 @@ background-color: var(--primary-hover-color); } } + +.forceauth-button { + padding: 10px 16px; +} \ No newline at end of file diff --git a/packages/frontend/src/app/auth/modal.tsx b/packages/frontend/src/app/auth/modal.tsx index d00b6cce..1b558e78 100644 --- a/packages/frontend/src/app/auth/modal.tsx +++ b/packages/frontend/src/app/auth/modal.tsx @@ -7,6 +7,7 @@ import { useUserData } from '@/hooks/data/use-user'; import usePreventFormSubmit from '@/hooks/use-prevent-form'; import Locales from '@/locales'; import { useStore } from '@/store'; +import clsx from 'clsx'; export function SetUsernameAndPassword(props: { onClose: () => void }) { const { fetcher } = useStore(); @@ -68,7 +69,7 @@ export function SetUsernameAndPassword(props: { onClose: () => void }) { disabled={isSubmitting} onClick={() => handleSubmit(undefined, setup)} text={Locales.Auth.Submit} - className={styles['auth-submit-btn']} + className={clsx(styles['auth-submit-btn'], styles['forceauth-button'])} type="primary" />
diff --git a/packages/frontend/src/app/dashboard/setting/page.tsx b/packages/frontend/src/app/dashboard/setting/page.tsx index 04f1a105..23c27cce 100644 --- a/packages/frontend/src/app/dashboard/setting/page.tsx +++ b/packages/frontend/src/app/dashboard/setting/page.tsx @@ -1,3 +1,30 @@ +'use client'; + +import useSWR from 'swr'; + +import { Loading } from '@/components/loading'; +import { OptionListRoot, OptionNode } from '@/components/radix-ui-lib'; +import { useStore } from '@/store'; +import useInstallStore from '@/store/install'; + export default function AdminSettingPage() { - return
; + const { fetcher } = useStore(); + const { updateSettingItem } = useInstallStore(); + const { data, isLoading } = useSWR('/dashboard/config', (url) => + fetcher(url) + .then((res) => res.json()) + .then((res) => { + updateSettingItem([], res.data.value); + return res.data; + }), + ); + if (isLoading || !data) return ; + + return ( + + {data.schema.map((item: any) => ( + + ))} + + ); } diff --git a/packages/frontend/src/app/provider/client-provider.tsx b/packages/frontend/src/app/provider/client-provider.tsx index 8f7077a6..32e3a2bd 100644 --- a/packages/frontend/src/app/provider/client-provider.tsx +++ b/packages/frontend/src/app/provider/client-provider.tsx @@ -14,7 +14,7 @@ export function AuthProvider({ children: React.ReactNode; admin?: boolean; }) { - const { sessionToken } = useStore(); + const { sessionToken, setSessionToken } = useStore(); const pathname = usePathname(); const router = useRouter(); diff --git a/packages/frontend/src/components/radix-ui-lib.tsx b/packages/frontend/src/components/radix-ui-lib.tsx index d620e0f3..db111782 100644 --- a/packages/frontend/src/components/radix-ui-lib.tsx +++ b/packages/frontend/src/components/radix-ui-lib.tsx @@ -1,123 +1,306 @@ 'use client'; -import { Switch, TextField, Select, Button, Table } from '@radix-ui/themes'; -import { ISettingSchema } from 'shared'; -import styles from '@/styles/module/radix-ui-lib.module.scss'; -import { PlusIcon, MinusIcon } from '@radix-ui/react-icons'; +import clsx from 'clsx'; +import { ChangeEvent, useState } from 'react'; + +import { MinusIcon, PlusIcon } from '@radix-ui/react-icons'; +import { Button, Select, Switch, Table, TextField } from '@radix-ui/themes'; + import useInstallStore from '@/store/install'; -import { useState } from 'react'; +import styles from '@/styles/module/radix-ui-lib.module.scss'; + +import { + ISettingResult, + ISettingSchema, + MultiInputSettingSchema, + SelectSettingSchema, + TypeSettingSchema, +} from 'shared'; + +export function OptionListRoot(props: { + children: JSX.Element | JSX.Element[]; +}) { + return
{props.children}
; +} + +/* 开关选项 */ +function SwitchItem(props: { + schema: ISettingSchema; + value: boolean; + onCheckedChange: (boolean: boolean) => void; +}) { + return ( + + ); +} -export function OptionListRoot(props: { children: JSX.Element | JSX.Element[] }) { +/* 输入选项 */ +function InputItem(props: { + schema: TypeSettingSchema; + value: string; + onChange: (e: ChangeEvent) => void; +}) { return ( -
{props.children}
+ { + console.log(e.target.value); + props.onChange(e); + }} + /> ); } -export function OptionListItem(props: { schema: ISettingSchema, masterKeyTree?: string[] }) { - const installStore = useInstallStore(); - const [tableItems, setTableItems] = useState([]); +/* 选择 */ +function SelectItem(props: { + schema: SelectSettingSchema; + value: string; + onValueChange: (value: string) => void; +}) { + return ( + + + + {props.schema.selectOptions.map((option) => ( + + {option} + + ))} + + + ); +} + +/* List组件 */ +function ListInputHeaderArea(props: { + schema: TypeSettingSchema; + addValue: () => void; +}) { + return ( + + ); +} +function ListInputChildrenArea(props: { schema: TypeSettingSchema }) { + return ( + + + + {/*{props.schema.keys.map((key, index) => (*/} + {/* */} + {/* {*/} + {/* // installStore.updateItemRamda(*/} + {/* // [...getKeyTree(), parseInt(event.currentTarget.id), key],*/} + {/* // event.target.value,*/} + {/* // );*/} + {/* // }}*/} + {/* />*/} + {/* */} + {/*))}*/} + + + + + + + ); +} + +function MultiInputHeaderArea(props: { + schema: MultiInputSettingSchema; + addKeyValue: () => void; +}) { + return ( + + ); +} + +function MultiInputChildrenArea(props: { + values: { [key: string]: string }[]; + schema: MultiInputSettingSchema; + onKeyValueChange: (index: number, key: string, value: string) => void; + removeKeyValue: (index: number) => void; +}) { + return ( + + + + {props.schema.keys.map((key, index) => ( + + {key} + + ))} + Actions + + + + + {props.values?.map((row, indexRow) => ( + + {Object.entries(row).map(([k, v], indexCol) => ( + + + props.onKeyValueChange(indexRow, k, event.target.value) + } + /> + + ))} + + + + + ))} + + + ); +} + +/** + * 树形结构的配置选项 + * @param schema 节点结构 + * @param masterKeyTree 父树路径 + */ +export function OptionNode({ + schema, + masterKeyTree = [], +}: { + schema: ISettingSchema; + masterKeyTree?: string[]; +}) { + const { + settings, + getSettingItem, + updateSettingItem, + addEmptyValue, + addEmptyKeyValue, + updateKeyValue, + removeKeyValue, + } = useInstallStore(); + + /* 获取当前节点的完整路径 */ function getKeyTree() { - return [...props.masterKeyTree ?? props.schema.key]; + return [...masterKeyTree, schema.key]; } - function addSingleItem(keys?: string[]) { - if (!keys) { - const item = - - { - installStore.updateItemRamda([...getKeyTree(), parseInt(event.currentTarget.id)], event.target.value); - }}> - - - - - ; - setTableItems([...tableItems, item]); - return; - } - - const item = - {keys.map((key: string) => { - return ( - - { - installStore.updateItemRamda([...getKeyTree(), parseInt(event.currentTarget.id), key], event.target.value); - }}> - - ); - })} - - - - ; - setTableItems([...tableItems, item]); + let headerArea, childrenArea; + switch (schema.type) { + case 'switch': + headerArea = ( + updateSettingItem(getKeyTree(), e)} + /> + ); + break; + case 'input': + headerArea = ( + updateSettingItem(getKeyTree(), e.target.value)} + /> + ); + break; + case 'select': + headerArea = ( + updateSettingItem(getKeyTree(), value)} + /> + ); + break; + case 'list': + headerArea = ( + addEmptyValue(masterKeyTree)} + /> + ); + childrenArea = ; + break; + case 'multi-input': + headerArea = ( + addEmptyKeyValue(getKeyTree(), schema.keys)} + /> + ); + childrenArea = ( + + updateKeyValue(getKeyTree(), index, key, value) + } + removeKeyValue={(index) => removeKeyValue(getKeyTree(), index)} + /> + ); + break; + case undefined: // items + if (schema.items) { + childrenArea = schema.items.map((item) => ( + + )); + } + default: + break; } return ( -
-
-
{props.schema.label}
-
{props.schema.description}
-
-
- { - props.schema.type === 'switch' ? { - installStore.updateItemRamda(getKeyTree(), boolean); - }}> : - props.schema.type === 'input' ? { - installStore.updateItemRamda(getKeyTree(), event.target.value); - }}> : - props.schema.type === 'select' ? - { - installStore.updateItemRamda(getKeyTree(), value); - }}> - - - {props.schema.selectOptions.map((option) => ( - {option} - ), - )} - - : - props.schema.type === 'multi-input' || props.schema.type === 'list' ? - : '' - } +
+ {/* Main Area, Header and Input Area */} +
+
+
{schema.label}
+
{schema.description}
+
+
{!!headerArea && headerArea}
+ {/* Children item including group, list, multi-input */}
- { - props.schema.items ? props.schema.items.map((item) => ( - )) : - props.schema.type === 'multi-input' || props.schema.type === 'list' ? - - { - props.schema.type === 'multi-input' ? - - - {props.schema.keys.map((key) => ( - {key}))} - Actions - - - : '' - } - - {tableItems} - - - : '' - } + {!!childrenArea && childrenArea}
); diff --git a/packages/frontend/src/components/sidebar/index.tsx b/packages/frontend/src/components/sidebar/index.tsx index fa73ce86..2380eea0 100644 --- a/packages/frontend/src/components/sidebar/index.tsx +++ b/packages/frontend/src/components/sidebar/index.tsx @@ -1,9 +1,11 @@ 'use client'; import Link from 'next/link'; +import clsx from 'clsx'; import { useEffect, useState } from 'react'; import { createRoot } from 'react-dom/client'; import useSWR from 'swr'; +import Router from 'next/router'; import { SetUsernameAndPassword } from '@/app/auth/modal'; import { ChatList } from '@/components/chat/chat-list'; @@ -22,6 +24,9 @@ import MaskIcon from '@/icons/mask.svg'; import PremiumIcon from '@/icons/premium.svg'; import SettingsIcon from '@/icons/settings.svg'; import UserIcon from '@/icons/user.svg'; +import MoreIcon from '@/icons/more.svg'; +import LogoutIcon from '@/icons/logout.svg'; +import PersonIcon from '@/icons/person.svg'; import Locale from '@/locales'; import { useStore } from '@/store'; import styles from '@/styles/module/home.module.scss'; @@ -91,7 +96,7 @@ function bindPassword() { } }; root.render( - + , ); @@ -99,6 +104,7 @@ function bindPassword() { export function Sidebar({ children }: { children: React.ReactNode }) { const { + setSessionToken, showSideBar, setShowSideBar, fetcher, @@ -107,6 +113,7 @@ export function Sidebar({ children }: { children: React.ReactNode }) { config, } = useStore(); const [newbtnExpanded, setNewbtnExpanded] = useState(false); + const [morebtnExpanded, setMorebtnExpanded] = useState(false); useSWR('/announcement/recent', (url) => fetcher(url) @@ -159,11 +166,10 @@ export function Sidebar({ children }: { children: React.ReactNode }) { return (
{ setShowSideBar(false); setNewbtnExpanded(false); + setMorebtnExpanded(false); }} className={styles['link-full']} style={{ color: 'inherit', textDecoration: 'inherit' }} @@ -250,41 +257,92 @@ export function Sidebar({ children }: { children: React.ReactNode }) {
{userData && } - { - setShowSideBar(false); - }} - style={{ color: 'inherit', textDecoration: 'inherit' }} - prefetch={true} - className={styles['link-full']} - > -
-
+
+ { setShowSideBar(false); + setNewbtnExpanded(false); + setMorebtnExpanded(false); }} + className={styles['link-full']} + style={{ color: 'inherit', textDecoration: 'inherit' }} > -
- -
-
- {userData?.name ?? Locale.Index.DefaultUser} +
+
+ +
+
+ {Locale.Index.Profile} +
-
+ { setShowSideBar(false); + setNewbtnExpanded(false); + setMorebtnExpanded(false); }} + className={styles['link-full']} + style={{ color: 'inherit', textDecoration: 'inherit' }} > -
+
+
+
+ {Locale.Index.Settings} +
+
+ + { + setShowSideBar(false); + setNewbtnExpanded(false); + setMorebtnExpanded(false); + }} + className={styles['link-full']} + style={{ color: 'inherit', textDecoration: 'inherit' }} + > +
+
+ +
+
+ {Locale.Index.Announcement} +
+
+
{ + setSessionToken(undefined); + setShowSideBar(false); + setNewbtnExpanded(false); + setMorebtnExpanded(false); + Router.reload(); + }}> +
+ +
+
+ {Locale.Index.LogOut} +
+
- +
setMorebtnExpanded(!morebtnExpanded)}> +
+ +
+
+ {userData?.name ?? Locale.Index.DefaultUser} +
+
+ +
+
+
{children}
diff --git a/packages/frontend/src/components/ui-lib.tsx b/packages/frontend/src/components/ui-lib.tsx index ab7958e8..a9d4434f 100644 --- a/packages/frontend/src/components/ui-lib.tsx +++ b/packages/frontend/src/components/ui-lib.tsx @@ -6,6 +6,7 @@ import ReturnIcon from '@/icons/return.svg'; import LoadingIcon from '@/icons/three-dots.svg'; import Locale from '@/locales'; import styles from '@/styles/module/ui-lib.module.scss'; +import clsx from 'clsx'; export function Popover(props: { children: JSX.Element; @@ -79,11 +80,13 @@ interface ModalProps { children?: JSX.Element; actions?: JSX.Element[]; onClose?: () => void; + className?: string; + style?: React.CSSProperties; } export function Modal(props: ModalProps) { return ( -
+
{props.title}
diff --git a/packages/frontend/src/global.d.ts b/packages/frontend/src/global.d.ts index d3fa86c4..ab4d3b4e 100644 --- a/packages/frontend/src/global.d.ts +++ b/packages/frontend/src/global.d.ts @@ -13,7 +13,5 @@ declare namespace NodeJS { interface ProcessEnv { NODE_ENV: 'development' | 'production'; NEXT_PUBLIC_TITLE: string; - NEXT_PUBLIC_OA: string; - NEXT_PUBLIC_BASE_URL: string; } } diff --git a/packages/frontend/src/icons/logout.svg b/packages/frontend/src/icons/logout.svg new file mode 100644 index 00000000..48814535 --- /dev/null +++ b/packages/frontend/src/icons/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/frontend/src/icons/more.svg b/packages/frontend/src/icons/more.svg new file mode 100644 index 00000000..e7771548 --- /dev/null +++ b/packages/frontend/src/icons/more.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/frontend/src/icons/person.svg b/packages/frontend/src/icons/person.svg new file mode 100644 index 00000000..a3f6b246 --- /dev/null +++ b/packages/frontend/src/icons/person.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/frontend/src/locales/cn.ts b/packages/frontend/src/locales/cn.ts index 197f1d9d..8a67218b 100644 --- a/packages/frontend/src/locales/cn.ts +++ b/packages/frontend/src/locales/cn.ts @@ -23,11 +23,12 @@ const cn = { SubTitle: '欢迎关注微信公众号:', PremiumLimit: (count: number) => `当前可用:${count} 条`, UpgradePremium: '升级到高级版', - WelcomeTitle: `欢迎使用${TITLE}`, - WelcomeMessage: - '你好,我是ChatGPT,一个基于GPT架构的人工智能助手。我被设计用来回答各种问题、提供信息、提供建议和与您进行对话。我在各种主题上有一定的知识,并且可以用多种语言与您交流。如果您有任何问题或需要帮助,随时问我,我会尽力为您提供所需的信息和支持。', Return: '返回', - WelcomeCaption: '点击下面的按钮开始聊天吧!', + WelcomeCaption: '生产力的飞跃', + Settings: '设置', + Profile: '用户信息', + Announcement: '公告', + LogOut: '退出登录', }, Premium: { Title: '升级到高级版', diff --git a/packages/frontend/src/locales/en.ts b/packages/frontend/src/locales/en.ts index 04d519c8..34bb1387 100644 --- a/packages/frontend/src/locales/en.ts +++ b/packages/frontend/src/locales/en.ts @@ -23,13 +23,14 @@ const en: LocaleType = { DefaultUser: 'User', Title: TITLE, SubTitle: 'Welcome to follow WeChat official account:', - PremiumLimit: (count: number) => `Currently available: ${count} items`, + PremiumLimit: (count: number) => `${count} times available.`, UpgradePremium: 'Upgrade to Premium', - WelcomeTitle: `Welcome to ${TITLE}`, - WelcomeMessage: - 'Hello, I am ChatGPT, an artificial intelligence assistant based on GPT. I am designed to answer various questions, provide information, offer suggestions, and engage in conversation with you. I have knowledge on a variety of topics and can communicate with you in multiple languages. If you have any questions or need assistance, feel free to ask me, and I will do my best to provide you with the required information and support.', Return: 'Return', - WelcomeCaption: 'Click the button below to start chatting!', + WelcomeCaption: 'Leap of productivity', + Settings: 'Settings', + Profile: 'Profile', + Announcement: 'Announcements', + LogOut: 'Log Out', }, Premium: { Title: 'Upgrade to Premium', diff --git a/packages/frontend/src/store/install.ts b/packages/frontend/src/store/install.ts index 96bef669..41a6bf92 100644 --- a/packages/frontend/src/store/install.ts +++ b/packages/frontend/src/store/install.ts @@ -1,32 +1,66 @@ -import { create } from 'zustand' -import ramda from 'ramda' - +import * as ramda from 'ramda'; +import { create } from 'zustand'; + +import { ISettingResult, ISettingResultValue } from 'shared'; + +type pathLens = (string | number)[]; + interface InstallStoreState { - items: { [key: string]: string | boolean | number | object | object[] | string[] | null }; - addItem: (key: string, item: string | boolean | number | object | object[] | string[] | number[] | null) => void; - updateItem: (key: string, updatedItem: Partial) => void; - getItem: (key: string) => string | boolean | number | object | object[] | string[] | number[] | null; - updateItemRamda: (path: (string | number)[], key: string | boolean | number) => void; - getAll: () => { [key: string]: string | boolean | number | object | object[] | string[] | number[] | null}; + settings: ISettingResult; + _getFullPath: (key: pathLens) => pathLens; + getSettingItem: (path: pathLens) => ISettingResultValue | undefined; + updateSettingItem: (path: pathLens, value: ISettingResultValue) => void; + addEmptyValue: (path: pathLens) => void; + addEmptyKeyValue: (path: pathLens, keys: string[]) => void; + updateKeyValue: ( + path: pathLens, + index: number, + key: string, + value: ISettingResultValue, + ) => void; + removeKeyValue: (path: pathLens, index: number) => void; } - - + const useInstallStore = create((set, get) => ({ - items: {}, - addItem: (key, item) => - set((state) => ({ items: { ...state.items, [key]: item } })), - updateItem: (key, updatedItem) => - set((state) => ({ - items: { - ...state.items, - [key]: updatedItem, - }, - })), - getItem: (key) => get().items[key] || null, - getAll: () => get().items, - updateItemRamda: (path, key) => - set(ramda.over(ramda.lensPath(path), () => key)), + settings: {}, + _getFullPath: (key) => ['settings', ...key], + getSettingItem: (path) => ramda.path(path, get().settings), + updateSettingItem: (path, value) => + set(ramda.over(ramda.lensPath(get()._getFullPath(path)), () => value)), + addEmptyValue: (path) => { + set( + ramda.over(ramda.lensPath(get()._getFullPath(path)), (old) => [ + ...old, + '', + ]), + ); + }, + addEmptyKeyValue: (path, keys) => { + set( + ramda.over(ramda.lensPath(get()._getFullPath(path)), (old) => { + const newPart = keys.reduce((obj, key) => ({ ...obj, [key]: '' }), {}); + return !!old ? [...old, newPart] : [newPart]; + }), + ); + }, + updateKeyValue: (path, index, key, value) => { + set( + ramda.over( + ramda.lensPath([...get()._getFullPath(path), index]), + (old) => ({ + ...old, + [key]: value, + }), + ), + ); + }, + removeKeyValue: (path, index) => { + set( + ramda.over(ramda.lensPath(get()._getFullPath(path)), (oldArray) => + ramda.remove(index, 1, oldArray), + ), + ); + }, })); - + export default useInstallStore; - \ No newline at end of file diff --git a/packages/frontend/src/store/shared.ts b/packages/frontend/src/store/shared.ts index 2b1ed269..2ac09bb6 100644 --- a/packages/frontend/src/store/shared.ts +++ b/packages/frontend/src/store/shared.ts @@ -2,8 +2,6 @@ import { StateCreator } from 'zustand'; import { LocalConfig, SharedSlice, StoreType } from '@/store/types'; -const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL!; - export enum SubmitKey { Enter = 'Enter', CtrlEnter = 'Ctrl + Enter', @@ -29,7 +27,7 @@ export const createSharedStore: StateCreator = ( get, ) => ({ // Auth - setSessionToken(token: string) { + setSessionToken(token: string | undefined) { set({ sessionToken: token }); }, @@ -53,13 +51,18 @@ export const createSharedStore: StateCreator = ( // utils fetcher(url: string, init?: RequestInit) { - return fetch(`${BASE_URL}/api${url}`, { + return fetch(`/api${url}`, { ...init, headers: { ...init?.headers, 'Content-Type': 'application/json', Authorization: `Bearer ${get().sessionToken}`, }, + }).then((res) => { + if (res.status === 401) { + set({ sessionToken: undefined }); + } + return res; }); }, // Config diff --git a/packages/frontend/src/store/types.ts b/packages/frontend/src/store/types.ts index 95fcbbd9..847af18d 100644 --- a/packages/frontend/src/store/types.ts +++ b/packages/frontend/src/store/types.ts @@ -25,7 +25,7 @@ export interface SharedSlice { // auth sessionToken?: string; - setSessionToken: (token: string) => void; + setSessionToken: (token: string | undefined) => void; // layout latestAnnouncementId?: number; diff --git a/packages/frontend/src/styles/module/button.module.scss b/packages/frontend/src/styles/module/button.module.scss index 05cb0c6c..43e22750 100644 --- a/packages/frontend/src/styles/module/button.module.scss +++ b/packages/frontend/src/styles/module/button.module.scss @@ -67,7 +67,9 @@ } .icon-button-text { - margin-left: 5px; + &:not(:only-child) { + margin-left: 5px; + } font-size: 12px; overflow: hidden; text-overflow: ellipsis; diff --git a/packages/frontend/src/styles/module/home.module.scss b/packages/frontend/src/styles/module/home.module.scss index c22cbd52..ca164186 100644 --- a/packages/frontend/src/styles/module/home.module.scss +++ b/packages/frontend/src/styles/module/home.module.scss @@ -196,23 +196,7 @@ cursor: pointer; } - animation: buttonClick 0.4s; -} - -.account-announcebtn { - height: 40px; - width: 40px; - display: flex; - justify-content: center; - align-items: center; - - svg { - fill: var(--black); - height: 20px; - width: 20px; - margin-right: 10px; - margin-left: 10px; - } + animation: slide-in ease 0.3s; } .sidebar-body { @@ -239,6 +223,7 @@ } .chat-item { + animation: slide-in ease 0.3s; display: flex; margin: 10px; padding: 10px; @@ -361,6 +346,7 @@ padding-top: 20px; .sidebar-premium { + overflow: hidden; user-select: none; outline: none; @@ -371,7 +357,7 @@ transform: scale(1); transition: 0.3s; background-color: transparent; - width: calc(100% - 20px); + width: calc(100% - 24px); &:active { transform: scale(0.95); @@ -411,18 +397,21 @@ } .sidebar-accountbtn { + + &:has(.sidebar-account-ext-dis) { + background-color: transparent; + } + + background-color: var(--secondary-hover-color); overflow: hidden; - user-select: none; - outline: none; - border: none; border-radius: 10px; padding: 10px; display: flex; align-items: center; height: 40px; - transition: background-color ease 0.3s; + transition: all ease 0.3s; justify-content: space-between; - margin: 0 12px 0 12px; + margin: 5px 12px 0 12px; &:hover { background-color: var(--secondary-hover-color); @@ -432,6 +421,7 @@ .sidebar-account { display: flex; align-items: center; + width: 100%; .avatar { height: 40px; @@ -461,7 +451,7 @@ text-overflow: ellipsis; overflow: hidden; white-space: nowrap; - max-width: 160px; + max-width: 140px; } } } @@ -475,6 +465,7 @@ display: flex; align-items: center; justify-content: center; + margin-left: auto; svg { fill: var(--black); @@ -821,4 +812,61 @@ margin-right: 5px; } } +} + +.force-auth-modal { + max-width: 400px; +} + +.sidebar-account-ext { + opacity: 1; + display: flex; + flex-direction: column; + position: absolute; + bottom: 65px; + margin: 12px -10px; + width: calc(100% - 48px); + background-color: var(--white); + border-radius: 10px; + border: 2px solid var(--inactive); + overflow: hidden; + transition: all ease 0.1s; + box-shadow: var(--card-shadow); + + .sidebar-account-ext-item { + padding: 10px; + display: flex; + width: calc(100% - 20px); + transition: all ease 0.3s; + + &:hover { + background-color: var(--secondary-hover-color); + cursor: pointer; + } + + .icon { + width: 40px; + display: flex; + justify-content: center; + margin-right: 10px; + + svg { + fill: var(--black); + height: 20px; + width: 20px; + } + } + + .text { + font-family: "Poppins", "Noto Sans SC", "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif; + font-size: 14px; + text-align: center; + } + } +} + +.sidebar-account-ext-dis { + opacity: 0; + pointer-events: none; + bottom: 60px; } \ No newline at end of file diff --git a/packages/frontend/src/styles/module/radix-ui-lib.module.scss b/packages/frontend/src/styles/module/radix-ui-lib.module.scss index 69f283b9..d9bcbc38 100644 --- a/packages/frontend/src/styles/module/radix-ui-lib.module.scss +++ b/packages/frontend/src/styles/module/radix-ui-lib.module.scss @@ -1,13 +1,13 @@ -@import '@radix-ui/colors/gray.css'; -@import '@radix-ui/colors/teal.css'; -@import '@radix-ui/colors/gray-dark.css'; -@import '@radix-ui/colors/teal-dark.css'; +//@import '@radix-ui/colors/gray.css'; +//@import '@radix-ui/colors/teal.css'; +//@import '@radix-ui/colors/gray-dark.css'; +//@import '@radix-ui/colors/teal-dark.css'; .option-list-root { background-color: var(--gray-2); display: flex; flex-direction: column; - width: 100%; + max-width: 100%; box-shadow: 0 2px 10px var(--gray-11); padding: 20px; } @@ -15,34 +15,49 @@ .option-list-item { width: 100%; display: flex; + flex-direction: column; justify-content: space-between; transition: all 0.3s ease-in-out; - &:hover { - background-color: var(--gray-4); - } - - .item-info { + .item-main-area { + height: 70px; + align-items: center; display: flex; - flex-direction: column; - align-items: start; + justify-content: space-between; + padding: 10px; + border-bottom: 1px solid var(--gray-4); + transition: all 0.3s ease; + + .item-info { + display: flex; + flex-direction: column; + align-items: baseline; + + .label { + font-size: 1rem; + font-weight: 600; + } - .label { - font-size: 1.2rem; - font-weight: 600; + .description { + font-size: 0.8rem; + font-weight: 300; + margin-top: 5px; + } } - .description { - font-size: 1rem; - font-weight: 300; + .item-value { + display: flex; + align-items: center; } + } - .item-value { + .item-additional-area { + padding-left: 50px; + } +} +.option-list-item-nested { + .item-main-area { - .item-additional-area { - padding-left: 10px; - } - } } -} \ No newline at end of file +} diff --git a/packages/frontend/src/styles/module/welcome.module.scss b/packages/frontend/src/styles/module/welcome.module.scss index dbcea0b2..f7b4e218 100644 --- a/packages/frontend/src/styles/module/welcome.module.scss +++ b/packages/frontend/src/styles/module/welcome.module.scss @@ -13,37 +13,30 @@ padding: 20px; display: flex; flex-direction: column; - height: 100%; align-items: center; max-width: 800px; - margin: 0 auto; + margin: auto; .title { - font-weight: 100; font-size: 2.5rem; + color: var(--inactive); justify-content: center; - padding-top: 80px; - margin-bottom: 50px; } - @media only screen and (max-width: 600px) { + @media only screen and (max-width: 800px) { .title { - font-weight: 300; - font-size: 1.5rem; - justify-content: center; - padding-top: 50px; - margin-bottom: 50px; + font-size: 2rem; } } .message { font-size: 1rem; margin-bottom: 50px; + color: var(--inactive); } - .caption { - font-size: 1rem; - font-weight: 200; + .logo { + opacity: 0.5; margin-bottom: 20px; } } \ No newline at end of file diff --git a/packages/frontend/tsconfig.json b/packages/frontend/tsconfig.json index 7e5d9cdb..34ada2cc 100644 --- a/packages/frontend/tsconfig.json +++ b/packages/frontend/tsconfig.json @@ -27,10 +27,7 @@ "@/*": [ "./src/*" ] - }, - "types": [ - "@edge-runtime/types" - ] + } }, "include": [ "**/*.ts", diff --git a/packages/shared/src/config.ts b/packages/shared/src/config.ts index 86917c0d..732c6050 100644 --- a/packages/shared/src/config.ts +++ b/packages/shared/src/config.ts @@ -1,14 +1,15 @@ export interface ConfigType { - debug: boolean; + mode: 'nginx' | 'docker' | 'debug'; + title: string; port: { frontend: number; backend: number; }; jwt: { - algorithm: string; - secret: string; - publicKey: string; - privateKey: string; + algorithm: 'HS256' | 'ES256'; + secret?: string; + publicKey?: string; + privateKey?: string; }; redis: { url: string; @@ -17,14 +18,31 @@ export interface ConfigType { url: string; }; openai: { - baseUrl?: string; - endpoint?: string; - keys: string[]; - keyPath: string; + baseUrl: string; + keys: string; + }; + sms: { + use?: 'aliyun' | 'tencent' | 'uni'; + uni?: { + signature: string; + templateId: string; + apiKey: string; + apiSecret?: string; + }; }; email: { - use: 'resend'; - resend?: { + use?: 'smtp' | 'resend' | 'mailgun' | 'elastic'; + domain: string; + sender?: string; + smtp: {}; + resend: { + apiKey: string; + }; + mailgun: { + apiKey: string; + domain: string; + }; + elastic: { apiKey: string; }; }; @@ -35,7 +53,8 @@ export interface ConfigType { }; }; payment: { - xunhu: { + use: 'xunhu'; + xunhu?: { wapName: string; appId: string; appSecret: string; diff --git a/packages/shared/src/error-code.ts b/packages/shared/src/error-code.ts index 258227d2..06dfc6a2 100644 --- a/packages/shared/src/error-code.ts +++ b/packages/shared/src/error-code.ts @@ -2,6 +2,9 @@ export enum ErrorCodeEnum { /* 200 */ OutOfQuota = 20001, + /* 400 */ + ConfigExists = 40000, + /* 403 */ AuthFail = 40300, PasswordError = 40301, @@ -29,4 +32,6 @@ export enum ErrorCodeEnum { EmailError = 50003, SmsError = 50004, WechatError = 50005, + + UnknownError = 99999, } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 58d524f8..59d1cf80 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -6,3 +6,4 @@ export * from './product'; export * from './types/database'; export * from './user'; export * from './install'; +export { Role } from '@prisma/client'; diff --git a/packages/shared/src/install.ts b/packages/shared/src/install.ts index 7021548f..c9316592 100644 --- a/packages/shared/src/install.ts +++ b/packages/shared/src/install.ts @@ -1,30 +1,31 @@ -interface BaseSettingOptions { +export interface BaseSettingOptions { label: string; description?: string; isOptional?: boolean; + value?: string | boolean | number; } -interface TypeSettingSchema extends BaseSettingOptions { +export interface TypeSettingSchema extends BaseSettingOptions { key: string; type: 'switch' | 'input' | 'list'; items?: never; } -interface MultiInputSettingSchema extends BaseSettingOptions { +export interface MultiInputSettingSchema extends BaseSettingOptions { key: string; keys: string[]; type: 'multi-input'; items?: never; } -interface SelectSettingSchema extends BaseSettingOptions { +export interface SelectSettingSchema extends BaseSettingOptions { key: string; type: 'select'; items?: never; selectOptions: string[]; } -interface ItemsSettingSchema extends BaseSettingOptions { +export interface ItemsSettingSchema extends BaseSettingOptions { key: string; type?: never; items: ISettingSchema[]; @@ -37,7 +38,16 @@ export type ISettingSchema = | SelectSettingSchema | MultiInputSettingSchema; +export type ISettingResultValue = + | string + | boolean + | number + | string[] + | number[] + | Record[] + | ISettingResult; + /* 回传表单的数据 */ export interface ISettingResult { - [key: string]: string | boolean | number | ISettingResult; + [key: string]: ISettingResultValue; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2c385eb..d4020493 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: prettier: specifier: latest version: 3.0.3 + prisma: + specifier: 5.5.2 + version: 5.5.2 ts-node: specifier: latest version: 10.9.1(@types/node@20.8.10)(typescript@5.2.2) @@ -37,25 +40,19 @@ importers: dependencies: '@liaoliaots/nestjs-redis': specifier: ^9.0.5 - version: 9.0.5(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(ioredis@5.3.2) + version: 9.0.5(@nestjs/common@10.2.8)(@nestjs/core@10.2.8)(ioredis@5.3.2) '@nestjs/common': - specifier: ^10.0.0 - version: 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.2.8 + version: 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.0.0 - version: 3.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13) + specifier: ^3.1.1 + version: 3.1.1(@nestjs/common@10.2.8)(reflect-metadata@0.1.13) '@nestjs/core': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': - specifier: '*' - version: 0.0.1(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13) - '@nestjs/platform-express': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + specifier: ^10.2.8 + version: 10.2.8(@nestjs/common@10.2.8)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/platform-fastify': - specifier: ^10.2.7 - version: 10.2.7(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + specifier: ^10.2.8 + version: 10.2.8(@nestjs/common@10.2.8)(@nestjs/core@10.2.8) '@prisma/client': specifier: workspace:@nest-http/prisma@* version: link:../../prisma @@ -83,12 +80,9 @@ importers: mint-filter: specifier: ^4.0.3 version: 4.0.3 - nest-router: - specifier: ^1.0.9 - version: 1.0.9 nestjs-prisma: specifier: ^0.22.0 - version: 0.22.0(@nestjs/common@10.0.0)(@prisma/client@prisma)(prisma@5.3.1) + version: 0.22.0(@nestjs/common@10.2.8)(@prisma/client@prisma)(prisma@5.5.2) openai: specifier: ^4.14.0 version: 4.14.0 @@ -106,20 +100,14 @@ importers: version: 3.0.2 devDependencies: '@nestjs/cli': - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^10.2.1 + version: 10.2.1 '@nestjs/schematics': - specifier: ^10.0.0 - version: 10.0.0(typescript@5.2.2) + specifier: ^10.0.3 + version: 10.0.3(chokidar@3.5.3)(typescript@5.2.2) '@nestjs/testing': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(@nestjs/platform-express@10.0.0) - '@trivago/prettier-plugin-sort-imports': - specifier: '*' - version: 4.2.1(prettier@3.0.3) - '@types/express': - specifier: ^4.17.17 - version: 4.17.17 + specifier: ^10.2.8 + version: 10.2.8(@nestjs/common@10.2.8)(@nestjs/core@10.2.8) '@types/jest': specifier: ^29.5.2 version: 29.5.2 @@ -149,19 +137,16 @@ importers: version: 8.8.0(eslint@8.42.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.42.0)(prettier@3.0.3) + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.42.0)(prettier@3.1.0) eslint-plugin-simple-import-sort: specifier: ^10.0.0 version: 10.0.0(eslint@8.42.0) jest: specifier: ^29.5.0 version: 29.5.0(@types/node@20.8.3)(ts-node@10.9.1) - prettier: - specifier: '*' - version: 3.0.3 prisma: - specifier: ^5.1.1 - version: 5.3.1 + specifier: '*' + version: 5.5.2 shared: specifier: workspace:* version: link:../shared @@ -176,7 +161,7 @@ importers: version: 29.1.0(@babel/core@7.22.10)(jest@29.5.0)(typescript@5.2.2) ts-loader: specifier: ^9.4.3 - version: 9.4.3(typescript@5.2.2)(webpack@5.88.2) + version: 9.5.0(typescript@5.2.2)(webpack@5.89.0) ts-node: specifier: '*' version: 10.9.1(@types/node@20.8.3)(typescript@5.2.2) @@ -189,12 +174,6 @@ importers: packages/frontend: dependencies: - '@edge-runtime/ponyfill': - specifier: ^2.1.2 - version: 2.1.2 - '@edge-runtime/types': - specifier: ^2.0.8 - version: 2.0.8 '@radix-ui/colors': specifier: ^3.0.0 version: 3.0.0 @@ -210,24 +189,9 @@ importers: '@types/ramda': specifier: ^0.29.7 version: 0.29.7 - '@upstash/redis': - specifier: ^1.20.2 - version: 1.20.2 - array.prototype.at: - specifier: ^1.1.1 - version: 1.1.1 - client-only: - specifier: ^0.0.1 - version: 0.0.1 clsx: specifier: ^2.0.0 version: 2.0.0 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - edge-runtime: - specifier: ^2.1.2 - version: 2.1.2 emoji-picker-react: specifier: ^4.4.7 version: 4.4.7(react@18.2.0) @@ -237,21 +201,12 @@ importers: eslint-config-next: specifier: 13.2.3 version: 13.2.3(eslint@8.35.0)(typescript@5.2.2) - eventsource-parser: - specifier: ^0.1.0 - version: 0.1.0 - iron-session: - specifier: ^6.3.1 - version: 6.3.1(next@13.5.6) js-yaml: specifier: ^4.1.0 version: 4.1.0 next: specifier: ^13.5.6 version: 13.5.6(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0)(sass@1.59.2) - openai: - specifier: ^3.2.1 - version: 3.2.1 ramda: specifier: ^0.29.1 version: 0.29.1 @@ -288,25 +243,13 @@ importers: shared: specifier: workspace:* version: link:../shared - spark-md5: - specifier: ^3.0.2 - version: 3.0.2 swr: specifier: ^2.1.3 version: 2.1.3(react@18.2.0) - uuid: - specifier: ^9.0.1 - version: 9.0.1 zustand: specifier: ^4.3.6 version: 4.3.6(react@18.2.0) devDependencies: - '@trivago/prettier-plugin-sort-imports': - specifier: '*' - version: 4.2.1(prettier@3.0.3) - '@types/node': - specifier: '*' - version: 20.8.3 '@types/react': specifier: ^18.0.28 version: 18.0.28 @@ -316,21 +259,9 @@ importers: '@types/react-katex': specifier: ^3.0.0 version: 3.0.0 - '@types/spark-md5': - specifier: ^3.0.2 - version: 3.0.2 - '@types/uuid': - specifier: ^9.0.6 - version: 9.0.6 - prettier: - specifier: '*' - version: 3.0.3 typescript: specifier: '*' version: 5.2.2 - zod: - specifier: ^3.21.4 - version: 3.21.4 packages/shared: dependencies: @@ -342,14 +273,14 @@ importers: dependencies: '@prisma/client': specifier: 5.3.1 - version: 5.3.1(prisma@5.3.1) + version: 5.3.1(prisma@5.5.2) devDependencies: '@types/node': specifier: '*' version: 20.9.0 prisma: - specifier: 5.3.1 - version: 5.3.1 + specifier: '*' + version: 5.5.2 ts-node: specifier: '*' version: 10.9.1(@types/node@20.9.0)(typescript@5.2.2) @@ -387,8 +318,8 @@ packages: source-map: 0.7.3 dev: false - /@angular-devkit/core@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} + /@angular-devkit/core@16.2.8(chokidar@3.5.3): + resolution: {integrity: sha512-PTGozYvh1Bin5lB15PwcXa26Ayd17bWGLS3H8Rs0s+04mUDvfNofmweaX1LgumWWy3nCUTDuwHxX10M3G0wE2g==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 @@ -400,17 +331,18 @@ packages: ajv-formats: 2.1.1(ajv@8.12.0) chokidar: 3.5.3 jsonc-parser: 3.2.0 + picomatch: 2.3.1 rxjs: 7.8.1 source-map: 0.7.4 dev: true - /@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} + /@angular-devkit/schematics-cli@16.2.8(chokidar@3.5.3): + resolution: {integrity: sha512-EXURJCzWTVYCipiTT4vxQQOrF63asOUDbeOy3OtiSh7EwIUvxm3BPG6hquJqngEnI/N6bA75NJ1fBhU6Hrh7eA==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 16.2.8(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.8(chokidar@3.5.3) ansi-colors: 4.1.3 inquirer: 8.2.4 symbol-observable: 4.0.0 @@ -432,27 +364,19 @@ packages: - chokidar dev: false - /@angular-devkit/schematics@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} + /@angular-devkit/schematics@16.2.8(chokidar@3.5.3): + resolution: {integrity: sha512-MBiKZOlR9/YMdflALr7/7w/BGAfo/BGTrlkqsIB6rDWV1dYiCgxI+033HsiNssLS6RQyCFx/e7JA2aBBzu9zEg==} engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 16.2.8(chokidar@3.5.3) jsonc-parser: 3.2.0 - magic-string: 0.30.0 + magic-string: 0.30.1 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@babel/code-frame@7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 - dev: true - /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -701,15 +625,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.22.10: - resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} @@ -1750,35 +1665,6 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@edge-runtime/format@2.0.1: - resolution: {integrity: sha512-aE+9DtBvQyg349srixtXEUNauWtIv5HTKPy8Q9dvG1NvpldVIvvhcDBI+SuvDVM8kQl8phbYnp2NTNloBCn/Yg==} - engines: {node: '>=14'} - dev: false - - /@edge-runtime/ponyfill@2.1.2: - resolution: {integrity: sha512-FyXd8hVCKb8YsYw/SA5d1rvmkfwoWIsm0gj2SyXn4cJ3D0LvbG3HbTIDAGNtvC1wo4ywOVRjwhuWg9aR6zgX8w==} - engines: {node: '>=14'} - dev: false - - /@edge-runtime/primitives@2.1.2: - resolution: {integrity: sha512-SR04SMDybALlhIYIi0hiuEUwIl0b7Sn+RKwQkX6hydg4+AKMzBNDFhj2nqHDD1+xkHArV9EhmJIb6iGjShwSzg==} - engines: {node: '>=14'} - dev: false - - /@edge-runtime/types@2.0.8: - resolution: {integrity: sha512-b+5nFA3SzMhEvL2uo3MECoiY2MhgWRt2UQ4EFFyHmLPRn5lb4AyJUny0eq5qxwzlLbv9bgVg/MOJtpuTgX1WWQ==} - engines: {node: '>=14'} - dependencies: - '@edge-runtime/primitives': 2.1.2 - dev: false - - /@edge-runtime/vm@2.1.2: - resolution: {integrity: sha512-j4H5S26NJhYOyjVMN8T/YJuwwslfnEX1P0j6N2Rq1FaubgNowdYunA9nlO7lg8Rgjv6dqJ2zKuM7GD1HFtNSGw==} - engines: {node: '>=14'} - dependencies: - '@edge-runtime/primitives': 2.1.2 - dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1924,6 +1810,18 @@ packages: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -2193,7 +2091,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /@liaoliaots/nestjs-redis@9.0.5(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(ioredis@5.3.2): + /@liaoliaots/nestjs-redis@9.0.5(@nestjs/common@10.2.8)(@nestjs/core@10.2.8)(ioredis@5.3.2): resolution: {integrity: sha512-nPcGLj0zW4mEsYtQYfWx3o7PmrMjuzFk6+t/g2IRopAeWWUZZ/5nIJ4KTKiz/3DJEUkbX8PZqB+dOhklGF0SVA==} engines: {node: '>=12.22.0'} peerDependencies: @@ -2201,8 +2099,8 @@ packages: '@nestjs/core': ^10.0.0 ioredis: ^5.0.0 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.8(@nestjs/common@10.2.8)(reflect-metadata@0.1.13)(rxjs@7.8.1) ioredis: 5.3.2 tslib: 2.4.1 dev: false @@ -2229,9 +2127,9 @@ packages: - supports-color dev: false - /@nestjs/cli@10.0.0: - resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} - engines: {node: '>= 16'} + /@nestjs/cli@10.2.1: + resolution: {integrity: sha512-CAJAQwmxFZfB3RTvqz/eaXXWpyU+mZ4QSqfBYzjneTsPgF+uyOAW3yQpaLNn9Dfcv39R9UxSuAhayv6yuFd+Jg==} + engines: {node: '>= 16.14'} hasBin: true peerDependencies: '@swc/cli': ^0.1.62 @@ -2242,16 +2140,17 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 16.1.0(chokidar@3.5.3) - '@nestjs/schematics': 10.0.0(chokidar@3.5.3)(typescript@5.1.3) + '@angular-devkit/core': 16.2.8(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.8(chokidar@3.5.3) + '@angular-devkit/schematics-cli': 16.2.8(chokidar@3.5.3) + '@nestjs/schematics': 10.0.3(chokidar@3.5.3)(typescript@5.2.2) chalk: 4.1.2 chokidar: 3.5.3 cli-table3: 0.6.3 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.3)(webpack@5.87.0) - inquirer: 8.2.5 + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.2.2)(webpack@5.89.0) + glob: 10.3.10 + inquirer: 8.2.6 node-emoji: 1.11.0 ora: 5.4.1 os-name: 4.0.1 @@ -2260,9 +2159,9 @@ packages: source-map-support: 0.5.21 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 - tsconfig-paths-webpack-plugin: 4.0.1 - typescript: 5.1.3 - webpack: 5.87.0 + tsconfig-paths-webpack-plugin: 4.1.0 + typescript: 5.2.2 + webpack: 5.89.0 webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -2270,8 +2169,8 @@ packages: - webpack-cli dev: true - /@nestjs/common@10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-Fa2GDQJrO5TTTcpISWfm0pdPS62V+8YbxeG5CA01zMUI+dCO3v3oFf+BSjqCGUUo7GDNzDsjAejwGXuqA54RPw==} + /@nestjs/common@10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-rmpwcdvq2IWMmsUVP8rsdKub6uDWk7dwCYo0aif50JTwcvcxzaP3iKVFKoSgvp0RKYu8h15+/AEOfaInmPpl0Q==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -2283,30 +2182,28 @@ packages: class-validator: optional: true dependencies: - class-transformer: 0.2.3 - class-validator: 0.11.1 iterare: 1.2.1 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.5.3 + tslib: 2.6.2 uid: 2.0.2 - /@nestjs/config@3.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-fzASk1Uv6AjdE6uA1na8zpqRCXAhRpcfgpCVv3SAKlgJ3VR3bEjcI4G17WHLgLBsmPzI1ofdkSI451WLD1F1Rw==} + /@nestjs/config@3.1.1(@nestjs/common@10.2.8)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 reflect-metadata: ^0.1.13 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - dotenv: 16.1.4 + '@nestjs/common': 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) + dotenv: 16.3.1 dotenv-expand: 10.0.0 lodash: 4.17.21 reflect-metadata: 0.1.13 uuid: 9.0.0 dev: false - /@nestjs/core@10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-HFTdj4vsF+2qOaq97ZPRDle6Q/KyL5lmMah0/ZR0ie+e1/tnlvmlqw589xFACTemLJFFOjZMy763v+icO9u72w==} + /@nestjs/core@10.2.8(@nestjs/common@10.2.8)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-9+MZ2s8ixfY9Bl/M9ofChiyYymcwdK9ZWNH4GDMF7Am7XRAQ1oqde6MYGG05rhQwiVXuTwaYLlXciJKfsrg5qg==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 @@ -2323,49 +2220,20 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + '@nestjs/common': 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 - tslib: 2.5.3 + tslib: 2.6.2 uid: 2.0.2 transitivePeerDependencies: - encoding - /@nestjs/mapped-types@0.0.1(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-4G4Ui7Sj0UqXiZsUFk/6cPD3K7uZEFSElzkOftaJ3/lXW+HUi1/vfWXabF53qrzO1enTRQDxt1plDbP6SsqXEg==} - peerDependencies: - class-transformer: ^0.2.3 - class-validator: ^0.11.1 - reflect-metadata: ^0.1.12 - dependencies: - class-transformer: 0.2.3 - class-validator: 0.11.1 - reflect-metadata: 0.1.13 - dev: false - - /@nestjs/platform-express@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): - resolution: {integrity: sha512-jOQBPVpk7B4JFXZZwxHSsY6odIqZlea9CbqKzu/hfDyqRv+AwuJk5gprvvL6RpWAHNyRMH1r5/14bqcXD3+WGw==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - body-parser: 1.20.2 - cors: 2.8.5 - express: 4.18.2 - multer: 1.4.4-lts.1 - tslib: 2.5.3 - transitivePeerDependencies: - - supports-color - - /@nestjs/platform-fastify@10.2.7(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): - resolution: {integrity: sha512-m/OADHxB7yY6TyADLmXJ3BCadG110g/O0nLj2LQDNRiNLiYrgpV3D/cGOcMqlQOG30GZ7BKl8Cq8CsKVtMhzZA==} + /@nestjs/platform-fastify@10.2.8(@nestjs/common@10.2.8)(@nestjs/core@10.2.8): + resolution: {integrity: sha512-ZeqIHeGLD7YgJ22K9AkyjcFv/yH/LH+HmujukBq/yDLFlJuurKCgbDPfL0PHq0RRMZu5CeB0dhs8+qihw96yjA==} peerDependencies: '@fastify/static': ^6.0.0 '@fastify/view': ^7.0.0 || ^8.0.0 @@ -2380,9 +2248,9 @@ packages: '@fastify/cors': 8.4.0 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - fastify: 4.23.2 + '@nestjs/common': 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.8(@nestjs/common@10.2.8)(reflect-metadata@0.1.13)(rxjs@7.8.1) + fastify: 4.24.3 light-my-request: 5.11.0 path-to-regexp: 3.2.0 tslib: 2.6.2 @@ -2390,28 +2258,13 @@ packages: - supports-color dev: false - /@nestjs/schematics@10.0.0(chokidar@3.5.3)(typescript@5.1.3): - resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} - peerDependencies: - typescript: '>=4.8.2' - dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) - comment-json: 4.2.3 - jsonc-parser: 3.2.0 - pluralize: 8.0.0 - typescript: 5.1.3 - transitivePeerDependencies: - - chokidar - dev: true - - /@nestjs/schematics@10.0.0(typescript@5.2.2): - resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} + /@nestjs/schematics@10.0.3(chokidar@3.5.3)(typescript@5.2.2): + resolution: {integrity: sha512-2BRujK0GqGQ7j1Zpz+obVfskDnnOeVKt5aXoSaVngKo8Oczy8uYCY+R547TQB+Kf35epdfFER2pVnQrX3/It5A==} peerDependencies: typescript: '>=4.8.2' dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 16.2.8(chokidar@3.5.3) + '@angular-devkit/schematics': 16.2.8(chokidar@3.5.3) comment-json: 4.2.3 jsonc-parser: 3.2.0 pluralize: 8.0.0 @@ -2420,8 +2273,8 @@ packages: - chokidar dev: true - /@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(@nestjs/platform-express@10.0.0): - resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} + /@nestjs/testing@10.2.8(@nestjs/common@10.2.8)(@nestjs/core@10.2.8): + resolution: {integrity: sha512-9Kj5IQhM67/nj/MT6Wi2OmWr5YQnCMptwKVFrX1TDaikpY12196v7frk0jVjdT7wms7rV07GZle9I2z0aSjqtQ==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -2433,10 +2286,9 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/platform-express': 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) - tslib: 2.5.3 + '@nestjs/common': 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 10.2.8(@nestjs/common@10.2.8)(reflect-metadata@0.1.13)(rxjs@7.8.1) + tslib: 2.6.2 dev: true /@next/env@13.5.6: @@ -2563,33 +2415,14 @@ packages: transitivePeerDependencies: - encoding - /@peculiar/asn1-schema@2.3.6: - resolution: {integrity: sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==} - dependencies: - asn1js: 3.0.5 - pvtsutils: 1.3.3 - tslib: 2.6.2 - dev: false - - /@peculiar/json-schema@1.1.12: - resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} - engines: {node: '>=8.0.0'} - dependencies: - tslib: 2.6.2 - dev: false - - /@peculiar/webcrypto@1.4.3: - resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==} - engines: {node: '>=10.12.0'} - dependencies: - '@peculiar/asn1-schema': 2.3.6 - '@peculiar/json-schema': 1.1.12 - pvtsutils: 1.3.3 - tslib: 2.6.2 - webcrypto-core: 1.7.7 - dev: false + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true - /@prisma/client@5.3.1(prisma@5.3.1): + /@prisma/client@5.3.1(prisma@5.5.2): resolution: {integrity: sha512-ArOKjHwdFZIe1cGU56oIfy7wRuTn0FfZjGuU/AjgEBOQh+4rDkB6nF+AGHP8KaVpkBIiHGPQh3IpwQ3xDMdO0Q==} engines: {node: '>=16.13'} requiresBuild: true @@ -2600,15 +2433,15 @@ packages: optional: true dependencies: '@prisma/engines-version': 5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59 - prisma: 5.3.1 + prisma: 5.5.2 dev: false /@prisma/engines-version@5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59: resolution: {integrity: sha512-y5qbUi3ql2Xg7XraqcXEdMHh0MocBfnBzDn5GbV1xk23S3Mq8MGs+VjacTNiBh3dtEdUERCrUUG7Z3QaJ+h79w==} dev: false - /@prisma/engines@5.3.1: - resolution: {integrity: sha512-6QkILNyfeeN67BNEPEtkgh3Xo2tm6D7V+UhrkBbRHqKw9CTaz/vvTP/ROwYSP/3JT2MtIutZm/EnhxUiuOPVDA==} + /@prisma/engines@5.5.2: + resolution: {integrity: sha512-Be5hoNF8k+lkB3uEMiCHbhbfF6aj1GnrTBnn5iYFT7GEr3TsOEp1soviEcBR0tYCgHbxjcIxJMhdbvxALJhAqg==} requiresBuild: true /@radix-ui/colors@3.0.0: @@ -3952,12 +3785,6 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/accepts@1.3.5: - resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} - dependencies: - '@types/node': 20.9.0 - dev: false - /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: @@ -3987,38 +3814,10 @@ packages: '@babel/types': 7.23.0 dev: true - /@types/body-parser@1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - dependencies: - '@types/connect': 3.4.35 - '@types/node': 20.9.0 - - /@types/connect@3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - dependencies: - '@types/node': 20.9.0 - - /@types/content-disposition@0.5.5: - resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} - dev: false - - /@types/cookie@0.5.1: - resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} - dev: false - /@types/cookiejar@2.1.2: resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} dev: true - /@types/cookies@0.7.7: - resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} - dependencies: - '@types/connect': 3.4.35 - '@types/express': 4.17.17 - '@types/keygrip': 1.0.2 - '@types/node': 20.9.0 - dev: false - /@types/debug@4.1.9: resolution: {integrity: sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==} dependencies: @@ -4043,22 +3842,6 @@ packages: resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} dev: true - /@types/express-serve-static-core@4.17.35: - resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} - dependencies: - '@types/node': 20.9.0 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 - - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.35 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.2 - /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: @@ -4071,13 +3854,6 @@ packages: '@types/unist': 2.0.7 dev: false - /@types/http-assert@1.5.3: - resolution: {integrity: sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==} - dev: false - - /@types/http-errors@2.0.1: - resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} - /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true @@ -4121,41 +3897,12 @@ packages: resolution: {integrity: sha512-dHsSjSlU/EWEEbeNADr3FtZZOAXPkFPUO457QCnoNqcZQXNqNEu/svQd0Nritvd3wNff4vvC/f4e6xgX3Llt8A==} dev: false - /@types/keygrip@1.0.2: - resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} - dev: false - - /@types/koa-compose@3.2.5: - resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} - dependencies: - '@types/koa': 2.13.8 - dev: false - - /@types/koa@2.13.8: - resolution: {integrity: sha512-Ugmxmgk/yPRW3ptBTh9VjOLwsKWJuGbymo1uGX0qdaqqL18uJiiG1ZoV0rxCOYSaDGhvEp5Ece02Amx0iwaxQQ==} - dependencies: - '@types/accepts': 1.3.5 - '@types/content-disposition': 0.5.5 - '@types/cookies': 0.7.7 - '@types/http-assert': 1.5.3 - '@types/http-errors': 2.0.1 - '@types/keygrip': 1.0.2 - '@types/koa-compose': 3.2.5 - '@types/node': 20.9.0 - dev: false - /@types/mdast@3.0.12: resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: '@types/unist': 2.0.7 dev: false - /@types/mime@1.3.2: - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} - - /@types/mime@3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - /@types/mocha@10.0.2: resolution: {integrity: sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==} dev: true @@ -4171,10 +3918,6 @@ packages: form-data: 4.0.0 dev: false - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: false - /@types/node@18.18.7: resolution: {integrity: sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==} dependencies: @@ -4198,6 +3941,7 @@ packages: /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false /@types/prismjs@1.26.0: resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} @@ -4206,18 +3950,12 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/qs@6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - /@types/ramda@0.29.7: resolution: {integrity: sha512-IUl6U95qwlQtVvZkSX4ODj08oJVtPyWMFRtPVNqhxc2rt+Bh7lCzTrGMYMZ7dmRKcAjtot3xrPnYGwsjdt8gzQ==} dependencies: types-ramda: 0.29.5 dev: false - /@types/range-parser@1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - /@types/react-dom@18.0.11: resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} dependencies: @@ -4243,23 +3981,6 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@types/send@0.17.1: - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} - dependencies: - '@types/mime': 1.3.2 - '@types/node': 20.9.0 - - /@types/serve-static@1.15.2: - resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} - dependencies: - '@types/http-errors': 2.0.1 - '@types/mime': 3.0.1 - '@types/node': 20.9.0 - - /@types/spark-md5@3.0.2: - resolution: {integrity: sha512-82E/lVRaqelV9qmRzzJ1PKTpyrpnT7mwdneKNJB9hUtypZDMggloDfFUCIqRRx3lYRxteCwXSq9c+W71Vf0QnQ==} - dev: true - /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true @@ -4281,13 +4002,6 @@ packages: resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} dev: false - /@types/uuid@9.0.6: - resolution: {integrity: sha512-BT2Krtx4xaO6iwzwMFUYvWBWkV2pr37zD68Vmp1CDV196MzczBRxuEpD6Pr395HAgebC/co7hOphs53r8V7jew==} - dev: true - - /@types/validator@10.11.3: - resolution: {integrity: sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w==} - /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true @@ -4444,14 +4158,6 @@ packages: '@typescript-eslint/types': 5.59.11 eslint-visitor-keys: 3.4.3 - /@upstash/redis@1.20.2: - resolution: {integrity: sha512-9QS/SypDxeeh672H7dEEmuYOX5TtPYnaDLlhxWJEPd8LzcEQ6hohwDJuojpqGkvvvrK58mlWOkN1GrMxbXPTeQ==} - dependencies: - isomorphic-fetch: 3.0.0 - transitivePeerDependencies: - - encoding - dev: false - /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: @@ -4581,13 +4287,6 @@ packages: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} dev: false - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: @@ -4699,6 +4398,11 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -4716,6 +4420,11 @@ packages: engines: {node: '>=10'} dev: true + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4723,9 +4432,6 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.1 - /append-field@1.0.0: - resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: false @@ -4775,9 +4481,6 @@ packages: is-array-buffer: 3.0.2 dev: false - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} @@ -4797,15 +4500,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array.prototype.at@1.1.1: - resolution: {integrity: sha512-n/wYNLJy/fVEU9EGPt2ww920hy1XX3XB2yTREFy1QsxctBgQV/tZIwg1G8jVxELna4pLCzg/xvvS/DDXtI4NNg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.22.1 - es-shim-unscopables: 1.0.0 - dev: false - /array.prototype.findlastindex@1.2.2: resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} engines: {node: '>= 0.4'} @@ -4863,15 +4557,6 @@ packages: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: true - /asn1js@3.0.5: - resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} - engines: {node: '>=12.0.0'} - dependencies: - pvtsutils: 1.3.3 - pvutils: 1.1.3 - tslib: 2.6.2 - dev: false - /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: false @@ -4904,14 +4589,6 @@ packages: engines: {node: '>=4'} dev: false - /axios@0.26.1: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} - dependencies: - follow-redirects: 1.15.2 - transitivePeerDependencies: - - debug - dev: false - /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -5063,44 +4740,6 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false @@ -5148,6 +4787,7 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -5167,10 +4807,7 @@ packages: engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + dev: false /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} @@ -5271,16 +4908,6 @@ packages: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true - /class-transformer@0.2.3: - resolution: {integrity: sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ==} - - /class-validator@0.11.1: - resolution: {integrity: sha512-6CGdjwJLmKw+sQbK5ZDo1v1yTajkqfPOUDWSYVIlhUiCh6Phy8sAnMFE2XKHAcKAdoOz4jJUQhjPQWPYUuHxrA==} - dependencies: - '@types/validator': 10.11.3 - google-libphonenumber: 3.2.33 - validator: 12.0.0 - /classnames@2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: false @@ -5419,15 +5046,6 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -5435,21 +5053,6 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - /convert-hrtime@3.0.0: - resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} - engines: {node: '>=8'} - dev: false - /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -5457,12 +5060,10 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + dev: false /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -5476,13 +5077,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 + dev: true /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} @@ -5493,19 +5088,28 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 - dev: false - /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -5555,16 +5159,6 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: false - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -5635,19 +5229,11 @@ packages: engines: {node: '>=0.10'} dev: false - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} dev: false - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -5742,28 +5328,14 @@ packages: engines: {node: '>=12'} dev: false - /dotenv@16.1.4: - resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} dev: false - /edge-runtime@2.1.2: - resolution: {integrity: sha512-Y6QtWVM+SBd89eN04b64TuEdxZ9nwLwwsgPfu0SZ0hlZmBpiOKjgPdZp3mexDnu+ftS+XJjydDppukRkYkL45Q==} - engines: {node: '>=14'} - hasBin: true - dependencies: - '@edge-runtime/format': 2.0.1 - '@edge-runtime/vm': 2.1.2 - exit-hook: 2.2.1 - mri: 1.2.0 - picocolors: 1.0.0 - pretty-bytes: 5.6.0 - pretty-ms: 7.0.1 - time-span: 4.0.0 - dev: false - - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true /electron-to-chromium@1.4.490: resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} @@ -5788,11 +5360,6 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false - - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -5898,9 +5465,6 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -6077,7 +5641,7 @@ packages: semver: 6.3.1 dev: false - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.42.0)(prettier@3.0.3): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.42.0)(prettier@3.1.0): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -6090,7 +5654,7 @@ packages: dependencies: eslint: 8.42.0 eslint-config-prettier: 8.8.0(eslint@8.42.0) - prettier: 3.0.3 + prettier: 3.1.0 prettier-linter-helpers: 1.0.0 dev: true @@ -6305,10 +5869,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -6318,11 +5878,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - /eventsource-parser@0.1.0: - resolution: {integrity: sha512-M9QjFtEIkwytUarnx113HGmgtk52LSn3jNAtnWKi3V+b9rqSfQeVdLsaD5AG/O4IrGQwmAAHBIsqbmURPTd2rA==} - engines: {node: '>=14.18'} - dev: false - /execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} @@ -6353,11 +5908,6 @@ packages: strip-final-newline: 2.0.0 dev: true - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: false - /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -6375,44 +5925,6 @@ packages: jest-util: 29.6.2 dev: true - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false @@ -6490,29 +6002,6 @@ packages: resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} dev: false - /fastify@4.23.2: - resolution: {integrity: sha512-WFSxsHES115svC7NrerNqZwwM0UOxbC/P6toT9LRHgAAFvG7o2AN5W+H4ihCtOGuYXjZf4z+2jXC89rVEoPWOA==} - dependencies: - '@fastify/ajv-compiler': 3.5.0 - '@fastify/error': 3.4.0 - '@fastify/fast-json-stringify-compiler': 4.3.0 - abstract-logging: 2.0.1 - avvio: 8.2.1 - fast-content-type-parse: 1.1.0 - fast-json-stringify: 5.8.0 - find-my-way: 7.6.2 - light-my-request: 5.11.0 - pino: 8.15.6 - process-warning: 2.2.0 - proxy-addr: 2.0.7 - rfdc: 1.3.0 - secure-json-parse: 2.7.0 - semver: 7.5.4 - toad-cache: 3.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /fastify@4.24.3: resolution: {integrity: sha512-6HHJ+R2x2LS3y1PqxnwEIjOTZxFl+8h4kSC/TuDPXtA+v2JnV9yEtOsNSKK1RMD7sIR2y1ZsA4BEFaid/cK5pg==} dependencies: @@ -6566,29 +6055,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - /find-my-way@7.6.2: - resolution: {integrity: sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==} - engines: {node: '>=14'} - dependencies: - fast-deep-equal: 3.1.3 - fast-querystring: 1.1.2 - safe-regex2: 2.0.0 - dev: false - /find-my-way@7.7.0: resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} engines: {node: '>=14'} @@ -6623,33 +6089,31 @@ packages: /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: false - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.22.13 chalk: 4.1.2 chokidar: 3.5.3 - cosmiconfig: 7.1.0 + cosmiconfig: 8.3.6(typescript@5.2.2) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 @@ -6658,8 +6122,8 @@ packages: schema-utils: 3.3.0 semver: 7.5.4 tapable: 2.2.1 - typescript: 5.1.3 - webpack: 5.87.0 + typescript: 5.2.2 + webpack: 5.89.0 dev: true /form-data-encoder@1.7.2: @@ -6694,10 +6158,7 @@ packages: /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + dev: false /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} @@ -6829,6 +6290,18 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.2 + path-scurry: 1.10.1 + dev: true + /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: @@ -6888,10 +6361,6 @@ packages: merge2: 1.4.1 slash: 3.0.0 - /google-libphonenumber@3.2.33: - resolution: {integrity: sha512-1QKCvAlfq8zY1mviORI9lDzM3I/hwm9+h0CwYBTLq59DBbSHMd5zBOLqHZFiBLicRpwIz46Nynvbywj1XApKvA==} - engines: {node: '>=0.10'} - /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -7025,16 +6494,6 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -7066,6 +6525,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: true /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -7132,8 +6592,8 @@ packages: wrap-ansi: 7.0.0 dev: true - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -7150,7 +6610,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 dev: true /internal-slot@1.0.5: @@ -7193,36 +6653,6 @@ packages: /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - - /iron-session@6.3.1(next@13.5.6): - resolution: {integrity: sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A==} - engines: {node: '>=12'} - peerDependencies: - express: '>=4' - koa: '>=2' - next: '>=10' - peerDependenciesMeta: - express: - optional: true - koa: - optional: true - next: - optional: true - dependencies: - '@peculiar/webcrypto': 1.4.3 - '@types/cookie': 0.5.1 - '@types/express': 4.17.17 - '@types/koa': 2.13.8 - '@types/node': 17.0.45 - cookie: 0.5.0 - iron-webcrypto: 0.2.8 - next: 13.5.6(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0)(sass@1.59.2) - dev: false - - /iron-webcrypto@0.2.8: - resolution: {integrity: sha512-YPdCvjFMOBjXaYuDj5tiHst5CEk6Xw84Jo8Y2+jzhMceclAnb3+vNPP/CTtb5fO2ZEuXEaO4N+w62Vfko757KA==} - dependencies: - buffer: 6.0.3 dev: false /is-alphabetical@2.0.1: @@ -7399,9 +6829,6 @@ packages: call-bind: 1.0.2 dev: false - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: false @@ -7409,15 +6836,6 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isomorphic-fetch@3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - dependencies: - node-fetch: 2.6.12 - whatwg-fetch: 3.6.17 - transitivePeerDependencies: - - encoding - dev: false - /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -7468,6 +6886,15 @@ packages: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} dev: true @@ -8170,8 +7597,8 @@ packages: sourcemap-codec: 1.4.8 dev: false - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -8356,10 +7783,6 @@ packages: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: false - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - /memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} @@ -8367,9 +7790,6 @@ packages: fs-monkey: 1.0.4 dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -8381,6 +7801,7 @@ packages: /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + dev: true /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -8658,11 +8079,6 @@ packages: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} @@ -8685,6 +8101,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -8722,12 +8145,6 @@ packages: resolution: {integrity: sha512-CKh2zKv9oFHEmYCXFk5REG2480FBNYixK+hw0mlRd/TgDJVhPpRhHPNhWa3Q6zF1tpE2q7w7y+Ylu1YJusXDpA==} dev: false - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -8745,26 +8162,12 @@ packages: engines: {node: '>=4'} dev: false - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - /multer@1.4.4-lts.1: - resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} - engines: {node: '>= 6.0.0'} - dependencies: - append-field: 1.0.0 - busboy: 1.6.0 - concat-stream: 1.6.2 - mkdirp: 0.5.6 - object-assign: 4.1.1 - type-is: 1.6.18 - xtend: 4.0.2 + dev: false /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -8783,19 +8186,11 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nest-router@1.0.9: - resolution: {integrity: sha512-ZyRdSVs9GczI+39B7tNXsxfBXQOYnEF6l/q2aLYG8wSEvRHRDXAlzZ1SIosDibM02pLahGkDNLFC+nZ8uzJGDQ==} - dev: false - - /nestjs-prisma@0.22.0(@nestjs/common@10.0.0)(@prisma/client@prisma)(prisma@5.3.1): + /nestjs-prisma@0.22.0(@nestjs/common@10.2.8)(@prisma/client@prisma)(prisma@5.5.2): resolution: {integrity: sha512-vseCukdWYijWxQBIdtC1XVSwMNZLZMjJen0ostsaRWaQ7yF8ny2Xruu0mA1d/t16uPOMUVUkSZro6JikOEkcuw==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -8804,10 +8199,10 @@ packages: dependencies: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 - '@nestjs/common': 10.0.0(class-transformer@0.2.3)(class-validator@0.11.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.2.8(reflect-metadata@0.1.13)(rxjs@7.8.1) '@prisma/client': link:prisma '@schematics/angular': 13.3.11 - prisma: 5.3.1 + prisma: 5.5.2 transitivePeerDependencies: - chokidar dev: false @@ -8926,6 +8321,7 @@ packages: /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + dev: false /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -8997,12 +8393,6 @@ packages: engines: {node: '>=14.0.0'} dev: false - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -9014,15 +8404,6 @@ packages: dependencies: mimic-fn: 2.1.0 - /openai@3.2.1: - resolution: {integrity: sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==} - dependencies: - axios: 0.26.1 - form-data: 4.0.0 - transitivePeerDependencies: - - debug - dev: false - /openai@4.14.0: resolution: {integrity: sha512-pWQYkFWdeudR1yLyS/rFfIv/MTXqFEtlN4EKVm0F6KKKGjhuthznPOCC4hxfAFmjlgbpJJXhQQ/oBeB9bxFmUw==} hasBin: true @@ -9137,11 +8518,6 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-ms@2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} - engines: {node: '>=6'} - dev: false - /parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} dev: false @@ -9150,10 +8526,6 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: false - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -9177,9 +8549,6 @@ packages: minipass: 7.0.2 dev: true - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} @@ -9209,23 +8578,6 @@ packages: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false - /pino@8.15.6: - resolution: {integrity: sha512-GuxHr61R0ZFD1npu58tB3a3FSVjuy21OwN/haw4OuKiZBL63Pg11Y51WWeD52RENS2mjwPZOwt+2OQOSkck6kQ==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 2.2.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.6.1 - thread-stream: 2.4.1 - dev: false - /pino@8.16.0: resolution: {integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==} hasBin: true @@ -9286,10 +8638,11 @@ packages: hasBin: true dev: true - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: false + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true /pretty-format@29.6.2: resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} @@ -9300,13 +8653,6 @@ packages: react-is: 18.2.0 dev: true - /pretty-ms@7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} - engines: {node: '>=10'} - dependencies: - parse-ms: 2.1.0 - dev: false - /prisma-extension-pagination@0.5.0(@prisma/client@prisma): resolution: {integrity: sha512-M2vqOkaQR8U++zPbc+ti1nVArZbpRgOr/BdaUDkBk7XV7uNikjJeDvQzmUEadzkTAON3H+SWtTrafHr0P0AMzA==} peerDependencies: @@ -9315,16 +8661,13 @@ packages: '@prisma/client': link:prisma dev: false - /prisma@5.3.1: - resolution: {integrity: sha512-Wp2msQIlMPHe+5k5Od6xnsI/WNG7UJGgFUJgqv/ygc7kOECZapcSz/iU4NIEzISs3H1W9sFLjAPbg/gOqqtB7A==} + /prisma@5.5.2: + resolution: {integrity: sha512-WQtG6fevOL053yoPl6dbHV+IWgKo25IRN4/pwAGqcWmg7CrtoCzvbDbN9fXUc7QS2KK0LimHIqLsaCOX/vHl8w==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.3.1 - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + '@prisma/engines': 5.5.2 /process-warning@2.2.0: resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} @@ -9361,6 +8704,7 @@ packages: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + dev: false /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -9377,23 +8721,6 @@ packages: resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} dev: true - /pvtsutils@1.3.3: - resolution: {integrity: sha512-6sAOMlXyrJ+8tRN5IAaYfuYZRp1C2uJ0SyDynEFxL+VY8kCRib9Lpj/+KPaNFpaQWr/iRik5nrzz6iaNlxgEGA==} - dependencies: - tslib: 2.6.2 - dev: false - - /pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} - dev: false - - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} @@ -9418,28 +8745,6 @@ packages: safe-buffer: 5.2.1 dev: true - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -9552,17 +8857,6 @@ packages: loose-envify: 1.4.0 dev: false - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -9891,9 +9185,6 @@ packages: isarray: 2.0.5 dev: false - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -9918,6 +9209,7 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true /sass@1.59.2: resolution: {integrity: sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw==} @@ -9959,43 +9251,12 @@ packages: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false @@ -10004,9 +9265,6 @@ packages: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: false - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -10037,6 +9295,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true @@ -10045,12 +9308,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /sonic-boom@3.6.1: - resolution: {integrity: sha512-QV+p5nXPiUiSMxn/k5bOL+hzCpafdj1voL+hywPZhheRSYyYp7CF15rNdz1evOXCUn/tFb7R62PDX1yJmtoTgg==} - dependencies: - atomic-sleep: 1.0.0 - dev: false - /sonic-boom@3.7.0: resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} dependencies: @@ -10133,13 +9390,10 @@ packages: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} dev: false - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + dev: false /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -10157,6 +9411,15 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: @@ -10195,11 +9458,6 @@ packages: es-abstract: 1.22.1 dev: false - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -10211,6 +9469,13 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -10352,7 +9617,7 @@ packages: yallist: 4.0.0 dev: false - /terser-webpack-plugin@5.3.9(webpack@5.87.0): + /terser-webpack-plugin@5.3.9(webpack@5.89.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -10373,31 +9638,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.1 terser: 5.19.2 - webpack: 5.87.0 - dev: true - - /terser-webpack-plugin@5.3.9(webpack@5.88.2): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.19.2 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /terser@5.19.2: @@ -10433,13 +9674,6 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /time-span@4.0.0: - resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} - engines: {node: '>=10'} - dependencies: - convert-hrtime: 3.0.0 - dev: false - /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -10466,10 +9700,6 @@ packages: engines: {node: '>=12'} dev: false - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -10520,8 +9750,8 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.3(typescript@5.2.2)(webpack@5.88.2): - resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==} + /ts-loader@9.5.0(typescript@5.2.2)(webpack@5.89.0): + resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' @@ -10531,8 +9761,9 @@ packages: enhanced-resolve: 5.15.0 micromatch: 4.0.5 semver: 7.5.4 + source-map: 0.7.4 typescript: 5.2.2 - webpack: 5.88.2 + webpack: 5.89.0 dev: true /ts-node@10.9.1(@types/node@20.8.10)(typescript@5.2.2): @@ -10632,8 +9863,8 @@ packages: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} dev: false - /tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + /tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 @@ -10666,9 +9897,6 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: false - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -10761,13 +9989,6 @@ packages: engines: {node: '>=10'} dev: true - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -10806,21 +10027,12 @@ packages: is-typed-array: 1.1.12 dev: false - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - /types-ramda@0.29.5: resolution: {integrity: sha512-u+bAYXHDPJR+amB0qMrMU/NXRB2PG8QqpO2v6j7yK/0mPZhlaaZj++ynYjnVpkPEpCkZEGxNpWY3X7qyLCGE3w==} dependencies: ts-toolbelt: 9.6.0 dev: false - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -10943,10 +10155,6 @@ packages: engines: {node: '>= 10.0.0'} dev: true - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true @@ -11004,20 +10212,11 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true dev: false - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - /uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} @@ -11042,14 +10241,6 @@ packages: convert-source-map: 1.9.0 dev: true - /validator@12.0.0: - resolution: {integrity: sha512-r5zA1cQBEOgYlesRmSEwc9LkbfNLTtji+vWyaHzRZUxCTHdsX3bd+sdHfs5tGZ2W6ILGGsxWxCNwT/h3IY/3ng==} - engines: {node: '>= 0.10'} - - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - /vfile-location@4.1.0: resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: @@ -11105,16 +10296,6 @@ packages: engines: {node: '>= 14'} dev: false - /webcrypto-core@1.7.7: - resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} - dependencies: - '@peculiar/asn1-schema': 2.3.6 - '@peculiar/json-schema': 1.1.12 - asn1js: 3.0.5 - pvtsutils: 1.3.3 - tslib: 2.6.2 - dev: false - /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -11128,8 +10309,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.87.0: - resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} + /webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -11159,7 +10340,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.87.0) + terser-webpack-plugin: 5.3.9(webpack@5.89.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11168,50 +10349,6 @@ packages: - uglify-js dev: true - /webpack@5.88.2: - resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 1.0.1 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.10 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.88.2) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /whatwg-fetch@3.6.17: - resolution: {integrity: sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==} - dev: false - /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -11259,6 +10396,15 @@ packages: execa: 4.1.0 dev: true + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -11268,6 +10414,15 @@ packages: strip-ansi: 6.0.1 dev: true + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -11279,10 +10434,6 @@ packages: signal-exit: 3.0.7 dev: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -11297,6 +10448,7 @@ packages: /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + dev: false /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -11325,10 +10477,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: true - /zustand@4.3.6(react@18.2.0): resolution: {integrity: sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw==} engines: {node: '>=12.7.0'} diff --git a/prisma/package.json b/prisma/package.json index 69e17477..07bf512b 100644 --- a/prisma/package.json +++ b/prisma/package.json @@ -25,7 +25,7 @@ "@prisma/client": "5.3.1" }, "devDependencies": { - "prisma": "5.3.1", + "prisma": "*", "typescript": "*", "ts-node": "*", "@types/node": "*"