From 6abc0e60715ebffe1dafcfe0afa44d2a9dbce24d Mon Sep 17 00:00:00 2001 From: Mir Arif Hasan Date: Tue, 12 Dec 2023 16:42:58 +0600 Subject: [PATCH] HBE-326 feature: server configuration through GraphQL API (#3591) * feat: restart cmd added in aio service * feat: nestjs config package added * test: fix all broken test case * feat: infra config module add with get-update-reset functionality * test: fix test case failure * feat: update infra configs mutation added * feat: utilise ConfigService in util functions * chore: remove saml stuff * feat: removed saml stuffs * fix: config service precedence * fix: mailer module init with right env value * feat: added mutations and query * feat: add query infra-configs * fix: mailer module init issue * chore: smtp url validation added * fix: all sso disabling is handled * fix: pnpm i without db connection * fix: allowedAuthProviders and enableAndDisableSSO * fix: validateSMTPUrl check * feat: get api added for fetch provider list * feat: feedback resolve * chore: update code comments * fix: uppercase issue of VITE_ALLOWED_AUTH_PROVIDERS * chore: update lockfile * fix: add validation checks for MAILER_ADDRESS_FROM * test: fix test case * chore: feedback resolve * chore: renamed an enum * chore: app shutdown way changed --------- Co-authored-by: Andrew Bastin --- docker-compose.yml | 1 + packages/hoppscotch-backend/package.json | 1 + .../20231124104640_infra_config/migration.sql | 14 + .../hoppscotch-backend/prisma/schema.prisma | 9 + .../src/admin/admin.module.ts | 4 +- .../src/admin/admin.service.spec.ts | 3 + .../src/admin/admin.service.ts | 4 +- .../src/admin/infra.resolver.ts | 93 +- packages/hoppscotch-backend/src/app.module.ts | 97 +- .../src/auth/auth.controller.ts | 21 +- .../src/auth/auth.module.ts | 47 +- .../src/auth/auth.service.spec.ts | 15 +- .../src/auth/auth.service.ts | 32 +- .../src/auth/guards/github-sso.guard.ts | 13 +- .../src/auth/guards/google-sso.guard.ts | 13 +- .../src/auth/guards/microsoft-sso-.guard.ts | 13 +- .../hoppscotch-backend/src/auth/helper.ts | 22 +- .../src/auth/strategies/github.strategy.ts | 10 +- .../src/auth/strategies/google.strategy.ts | 10 +- .../src/auth/strategies/jwt.strategy.ts | 8 +- .../src/auth/strategies/microsoft.strategy.ts | 12 +- .../src/auth/strategies/rt-jwt.strategy.ts | 8 +- packages/hoppscotch-backend/src/errors.ts | 38 + .../src/infra-config/helper.ts | 44 + .../src/infra-config/infra-config.model.ts | 29 + .../src/infra-config/infra-config.module.ts | 10 + .../infra-config/infra-config.service.spec.ts | 109 ++ .../src/infra-config/infra-config.service.ts | 312 +++++ .../src/infra-config/input-args.ts | 30 + .../src/mailer/mailer.module.ts | 52 +- packages/hoppscotch-backend/src/main.ts | 31 +- .../src/shortcode/shortcode.service.spec.ts | 20 +- .../team-invitation/team-invitation.module.ts | 3 +- .../team-invitation.service.ts | 7 +- .../src/types/InfraConfig.ts | 29 + packages/hoppscotch-backend/src/utils.ts | 36 +- pnpm-lock.yaml | 1166 ++++++++++------- 37 files changed, 1735 insertions(+), 631 deletions(-) create mode 100644 packages/hoppscotch-backend/prisma/migrations/20231124104640_infra_config/migration.sql create mode 100644 packages/hoppscotch-backend/src/infra-config/helper.ts create mode 100644 packages/hoppscotch-backend/src/infra-config/infra-config.model.ts create mode 100644 packages/hoppscotch-backend/src/infra-config/infra-config.module.ts create mode 100644 packages/hoppscotch-backend/src/infra-config/infra-config.service.spec.ts create mode 100644 packages/hoppscotch-backend/src/infra-config/infra-config.service.ts create mode 100644 packages/hoppscotch-backend/src/infra-config/input-args.ts create mode 100644 packages/hoppscotch-backend/src/types/InfraConfig.ts diff --git a/docker-compose.yml b/docker-compose.yml index 37af3d1fe..b7f3d2f52 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -66,6 +66,7 @@ services: # The service that spins up all 3 services at once in one container hoppscotch-aio: container_name: hoppscotch-aio + restart: unless-stopped build: dockerfile: prod.Dockerfile context: . diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index 3bc5fbdf4..8555fe64c 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -28,6 +28,7 @@ "@nestjs-modules/mailer": "^1.9.1", "@nestjs/apollo": "^12.0.9", "@nestjs/common": "^10.2.6", + "@nestjs/config": "^3.1.1", "@nestjs/core": "^10.2.6", "@nestjs/graphql": "^12.0.9", "@nestjs/jwt": "^10.1.1", diff --git a/packages/hoppscotch-backend/prisma/migrations/20231124104640_infra_config/migration.sql b/packages/hoppscotch-backend/prisma/migrations/20231124104640_infra_config/migration.sql new file mode 100644 index 000000000..1e2d72c46 --- /dev/null +++ b/packages/hoppscotch-backend/prisma/migrations/20231124104640_infra_config/migration.sql @@ -0,0 +1,14 @@ +-- CreateTable +CREATE TABLE "InfraConfig" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "value" TEXT, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdOn" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedOn" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "InfraConfig_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "InfraConfig_name_key" ON "InfraConfig"("name"); diff --git a/packages/hoppscotch-backend/prisma/schema.prisma b/packages/hoppscotch-backend/prisma/schema.prisma index 1c945fa2d..13b364dcb 100644 --- a/packages/hoppscotch-backend/prisma/schema.prisma +++ b/packages/hoppscotch-backend/prisma/schema.prisma @@ -209,3 +209,12 @@ enum TeamMemberRole { VIEWER EDITOR } + +model InfraConfig { + id String @id @default(cuid()) + name String @unique + value String? + active Boolean @default(true) // Use case: Let's say, Admin wants to disable Google SSO, but doesn't want to delete the config + createdOn DateTime @default(now()) @db.Timestamp(3) + updatedOn DateTime @updatedAt @db.Timestamp(3) +} diff --git a/packages/hoppscotch-backend/src/admin/admin.module.ts b/packages/hoppscotch-backend/src/admin/admin.module.ts index 273062d10..9b4afd532 100644 --- a/packages/hoppscotch-backend/src/admin/admin.module.ts +++ b/packages/hoppscotch-backend/src/admin/admin.module.ts @@ -4,7 +4,6 @@ import { AdminService } from './admin.service'; import { PrismaModule } from '../prisma/prisma.module'; import { PubSubModule } from '../pubsub/pubsub.module'; import { UserModule } from '../user/user.module'; -import { MailerModule } from '../mailer/mailer.module'; import { TeamModule } from '../team/team.module'; import { TeamInvitationModule } from '../team-invitation/team-invitation.module'; import { TeamEnvironmentsModule } from '../team-environments/team-environments.module'; @@ -12,19 +11,20 @@ import { TeamCollectionModule } from '../team-collection/team-collection.module' import { TeamRequestModule } from '../team-request/team-request.module'; import { InfraResolver } from './infra.resolver'; import { ShortcodeModule } from 'src/shortcode/shortcode.module'; +import { InfraConfigModule } from 'src/infra-config/infra-config.module'; @Module({ imports: [ PrismaModule, PubSubModule, UserModule, - MailerModule, TeamModule, TeamInvitationModule, TeamEnvironmentsModule, TeamCollectionModule, TeamRequestModule, ShortcodeModule, + InfraConfigModule, ], providers: [InfraResolver, AdminResolver, AdminService], exports: [AdminService], diff --git a/packages/hoppscotch-backend/src/admin/admin.service.spec.ts b/packages/hoppscotch-backend/src/admin/admin.service.spec.ts index 9682905e5..331309a2a 100644 --- a/packages/hoppscotch-backend/src/admin/admin.service.spec.ts +++ b/packages/hoppscotch-backend/src/admin/admin.service.spec.ts @@ -16,6 +16,7 @@ import { USER_ALREADY_INVITED, } from '../errors'; import { ShortcodeService } from 'src/shortcode/shortcode.service'; +import { ConfigService } from '@nestjs/config'; const mockPrisma = mockDeep(); const mockPubSub = mockDeep(); @@ -27,6 +28,7 @@ const mockTeamInvitationService = mockDeep(); const mockTeamCollectionService = mockDeep(); const mockMailerService = mockDeep(); const mockShortcodeService = mockDeep(); +const mockConfigService = mockDeep(); const adminService = new AdminService( mockUserService, @@ -39,6 +41,7 @@ const adminService = new AdminService( mockPrisma as any, mockMailerService, mockShortcodeService, + mockConfigService, ); const invitedUsers: InvitedUsers[] = [ diff --git a/packages/hoppscotch-backend/src/admin/admin.service.ts b/packages/hoppscotch-backend/src/admin/admin.service.ts index c08be5f97..077d46ab3 100644 --- a/packages/hoppscotch-backend/src/admin/admin.service.ts +++ b/packages/hoppscotch-backend/src/admin/admin.service.ts @@ -25,6 +25,7 @@ import { TeamEnvironmentsService } from '../team-environments/team-environments. import { TeamInvitationService } from '../team-invitation/team-invitation.service'; import { TeamMemberRole } from '../team/team.model'; import { ShortcodeService } from 'src/shortcode/shortcode.service'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class AdminService { @@ -39,6 +40,7 @@ export class AdminService { private readonly prisma: PrismaService, private readonly mailerService: MailerService, private readonly shortcodeService: ShortcodeService, + private readonly configService: ConfigService, ) {} /** @@ -79,7 +81,7 @@ export class AdminService { template: 'user-invitation', variables: { inviteeEmail: inviteeEmail, - magicLink: `${process.env.VITE_BASE_URL}`, + magicLink: `${this.configService.get('VITE_BASE_URL')}`, }, }); } catch (e) { diff --git a/packages/hoppscotch-backend/src/admin/infra.resolver.ts b/packages/hoppscotch-backend/src/admin/infra.resolver.ts index 40b438a9e..1ba557660 100644 --- a/packages/hoppscotch-backend/src/admin/infra.resolver.ts +++ b/packages/hoppscotch-backend/src/admin/infra.resolver.ts @@ -1,5 +1,12 @@ import { UseGuards } from '@nestjs/common'; -import { Args, ID, Query, ResolveField, Resolver } from '@nestjs/graphql'; +import { + Args, + ID, + Mutation, + Query, + ResolveField, + Resolver, +} from '@nestjs/graphql'; import { GqlThrottlerGuard } from 'src/guards/gql-throttler.guard'; import { Infra } from './infra.model'; import { AdminService } from './admin.service'; @@ -16,11 +23,21 @@ import { Team } from 'src/team/team.model'; import { TeamInvitation } from 'src/team-invitation/team-invitation.model'; import { GqlAdmin } from './decorators/gql-admin.decorator'; import { ShortcodeWithUserEmail } from 'src/shortcode/shortcode.model'; +import { InfraConfig } from 'src/infra-config/infra-config.model'; +import { InfraConfigService } from 'src/infra-config/infra-config.service'; +import { + EnableAndDisableSSOArgs, + InfraConfigArgs, +} from 'src/infra-config/input-args'; +import { InfraConfigEnumForClient } from 'src/types/InfraConfig'; @UseGuards(GqlThrottlerGuard) @Resolver(() => Infra) export class InfraResolver { - constructor(private adminService: AdminService) {} + constructor( + private adminService: AdminService, + private infraConfigService: InfraConfigService, + ) {} @Query(() => Infra, { description: 'Fetch details of the Infrastructure', @@ -222,4 +239,76 @@ export class InfraResolver { userEmail, ); } + + @Query(() => [InfraConfig], { + description: 'Retrieve configuration details for the instance', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + async infraConfigs( + @Args({ + name: 'configNames', + type: () => [InfraConfigEnumForClient], + description: 'Configs to fetch', + }) + names: InfraConfigEnumForClient[], + ) { + const infraConfigs = await this.infraConfigService.getMany(names); + if (E.isLeft(infraConfigs)) throwErr(infraConfigs.left); + return infraConfigs.right; + } + + @Query(() => [String], { + description: 'Allowed Auth Provider list', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + allowedAuthProviders() { + return this.infraConfigService.getAllowedAuthProviders(); + } + + /* Mutations */ + + @Mutation(() => [InfraConfig], { + description: 'Update Infra Configs', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + async updateInfraConfigs( + @Args({ + name: 'infraConfigs', + type: () => [InfraConfigArgs], + description: 'InfraConfigs to update', + }) + infraConfigs: InfraConfigArgs[], + ) { + const updatedRes = await this.infraConfigService.updateMany(infraConfigs); + if (E.isLeft(updatedRes)) throwErr(updatedRes.left); + return updatedRes.right; + } + + @Mutation(() => Boolean, { + description: 'Reset Infra Configs with default values (.env)', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + async resetInfraConfigs() { + const resetRes = await this.infraConfigService.reset(); + if (E.isLeft(resetRes)) throwErr(resetRes.left); + return true; + } + + @Mutation(() => Boolean, { + description: 'Enable or Disable SSO for login/signup', + }) + @UseGuards(GqlAuthGuard, GqlAdminGuard) + async enableAndDisableSSO( + @Args({ + name: 'providerInfo', + type: () => [EnableAndDisableSSOArgs], + description: 'SSO provider and status', + }) + providerInfo: EnableAndDisableSSOArgs[], + ) { + const isUpdated = await this.infraConfigService.enableAndDisableSSO(providerInfo); + if (E.isLeft(isUpdated)) throwErr(isUpdated.left); + + return true; + } } diff --git a/packages/hoppscotch-backend/src/app.module.ts b/packages/hoppscotch-backend/src/app.module.ts index 3d659351f..90063e7ef 100644 --- a/packages/hoppscotch-backend/src/app.module.ts +++ b/packages/hoppscotch-backend/src/app.module.ts @@ -20,51 +20,69 @@ import { ShortcodeModule } from './shortcode/shortcode.module'; import { COOKIES_NOT_FOUND } from './errors'; import { ThrottlerModule } from '@nestjs/throttler'; import { AppController } from './app.controller'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { InfraConfigModule } from './infra-config/infra-config.module'; +import { loadInfraConfiguration } from './infra-config/helper'; +import { MailerModule } from './mailer/mailer.module'; @Module({ imports: [ - GraphQLModule.forRoot({ - buildSchemaOptions: { - numberScalarMode: 'integer', - }, - playground: process.env.PRODUCTION !== 'true', - autoSchemaFile: true, - installSubscriptionHandlers: true, - subscriptions: { - 'subscriptions-transport-ws': { - path: '/graphql', - onConnect: (_, websocket) => { - try { - const cookies = subscriptionContextCookieParser( - websocket.upgradeReq.headers.cookie, - ); - - return { - headers: { ...websocket?.upgradeReq?.headers, cookies }, - }; - } catch (error) { - throw new HttpException(COOKIES_NOT_FOUND, 400, { - cause: new Error(COOKIES_NOT_FOUND), - }); - } - }, - }, - }, - context: ({ req, res, connection }) => ({ - req, - res, - connection, - }), - driver: ApolloDriver, + ConfigModule.forRoot({ + isGlobal: true, + load: [async () => loadInfraConfiguration()], }), - ThrottlerModule.forRoot([ - { - ttl: +process.env.RATE_LIMIT_TTL, - limit: +process.env.RATE_LIMIT_MAX, + GraphQLModule.forRootAsync({ + driver: ApolloDriver, + imports: [ConfigModule], + inject: [ConfigService], + useFactory: async (configService: ConfigService) => { + return { + buildSchemaOptions: { + numberScalarMode: 'integer', + }, + playground: configService.get('PRODUCTION') !== 'true', + autoSchemaFile: true, + installSubscriptionHandlers: true, + subscriptions: { + 'subscriptions-transport-ws': { + path: '/graphql', + onConnect: (_, websocket) => { + try { + const cookies = subscriptionContextCookieParser( + websocket.upgradeReq.headers.cookie, + ); + return { + headers: { ...websocket?.upgradeReq?.headers, cookies }, + }; + } catch (error) { + throw new HttpException(COOKIES_NOT_FOUND, 400, { + cause: new Error(COOKIES_NOT_FOUND), + }); + } + }, + }, + }, + context: ({ req, res, connection }) => ({ + req, + res, + connection, + }), + }; }, - ]), + }), + ThrottlerModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: async (configService: ConfigService) => [ + { + ttl: +configService.get('RATE_LIMIT_TTL'), + limit: +configService.get('RATE_LIMIT_MAX'), + }, + ], + }), + MailerModule.register(), UserModule, - AuthModule, + AuthModule.register(), AdminModule, UserSettingsModule, UserEnvironmentsModule, @@ -77,6 +95,7 @@ import { AppController } from './app.controller'; TeamInvitationModule, UserCollectionModule, ShortcodeModule, + InfraConfigModule, ], providers: [GQLComplexityPlugin], controllers: [AppController], diff --git a/packages/hoppscotch-backend/src/auth/auth.controller.ts b/packages/hoppscotch-backend/src/auth/auth.controller.ts index 6375cb584..27534d003 100644 --- a/packages/hoppscotch-backend/src/auth/auth.controller.ts +++ b/packages/hoppscotch-backend/src/auth/auth.controller.ts @@ -2,7 +2,6 @@ import { Body, Controller, Get, - InternalServerErrorException, Post, Query, Request, @@ -31,11 +30,21 @@ import { MicrosoftSSOGuard } from './guards/microsoft-sso-.guard'; import { ThrottlerBehindProxyGuard } from 'src/guards/throttler-behind-proxy.guard'; import { SkipThrottle } from '@nestjs/throttler'; import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; @UseGuards(ThrottlerBehindProxyGuard) @Controller({ path: 'auth', version: '1' }) export class AuthController { - constructor(private authService: AuthService) {} + constructor( + private authService: AuthService, + private configService: ConfigService, + ) {} + + @Get('providers') + async getAuthProviders() { + const providers = await this.authService.getAuthProviders(); + return { providers }; + } /** ** Route to initiate magic-link auth for a users email @@ -45,8 +54,14 @@ export class AuthController { @Body() authData: SignInMagicDto, @Query('origin') origin: string, ) { - if (!authProviderCheck(AuthProvider.EMAIL)) + if ( + !authProviderCheck( + AuthProvider.EMAIL, + this.configService.get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS'), + ) + ) { throwHTTPErr({ message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404 }); + } const deviceIdToken = await this.authService.signInMagicLink( authData.email, diff --git a/packages/hoppscotch-backend/src/auth/auth.module.ts b/packages/hoppscotch-backend/src/auth/auth.module.ts index 2c79e6250..ccfadbff8 100644 --- a/packages/hoppscotch-backend/src/auth/auth.module.ts +++ b/packages/hoppscotch-backend/src/auth/auth.module.ts @@ -2,7 +2,6 @@ import { Module } from '@nestjs/common'; import { AuthService } from './auth.service'; import { AuthController } from './auth.controller'; import { UserModule } from 'src/user/user.module'; -import { MailerModule } from 'src/mailer/mailer.module'; import { PrismaModule } from 'src/prisma/prisma.module'; import { PassportModule } from '@nestjs/passport'; import { JwtModule } from '@nestjs/jwt'; @@ -12,25 +11,47 @@ import { GoogleStrategy } from './strategies/google.strategy'; import { GithubStrategy } from './strategies/github.strategy'; import { MicrosoftStrategy } from './strategies/microsoft.strategy'; import { AuthProvider, authProviderCheck } from './helper'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { loadInfraConfiguration } from 'src/infra-config/helper'; +import { InfraConfigModule } from 'src/infra-config/infra-config.module'; @Module({ imports: [ PrismaModule, UserModule, - MailerModule, PassportModule, - JwtModule.register({ - secret: process.env.JWT_SECRET, + JwtModule.registerAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: async (configService: ConfigService) => ({ + secret: configService.get('JWT_SECRET'), + }), }), + InfraConfigModule, ], - providers: [ - AuthService, - JwtStrategy, - RTJwtStrategy, - ...(authProviderCheck(AuthProvider.GOOGLE) ? [GoogleStrategy] : []), - ...(authProviderCheck(AuthProvider.GITHUB) ? [GithubStrategy] : []), - ...(authProviderCheck(AuthProvider.MICROSOFT) ? [MicrosoftStrategy] : []), - ], + providers: [AuthService, JwtStrategy, RTJwtStrategy], controllers: [AuthController], }) -export class AuthModule {} +export class AuthModule { + static async register() { + const env = await loadInfraConfiguration(); + const allowedAuthProviders = env.INFRA.VITE_ALLOWED_AUTH_PROVIDERS; + + const providers = [ + ...(authProviderCheck(AuthProvider.GOOGLE, allowedAuthProviders) + ? [GoogleStrategy] + : []), + ...(authProviderCheck(AuthProvider.GITHUB, allowedAuthProviders) + ? [GithubStrategy] + : []), + ...(authProviderCheck(AuthProvider.MICROSOFT, allowedAuthProviders) + ? [MicrosoftStrategy] + : []), + ]; + + return { + module: AuthModule, + providers, + }; + } +} diff --git a/packages/hoppscotch-backend/src/auth/auth.service.spec.ts b/packages/hoppscotch-backend/src/auth/auth.service.spec.ts index f9984343f..c8979518b 100644 --- a/packages/hoppscotch-backend/src/auth/auth.service.spec.ts +++ b/packages/hoppscotch-backend/src/auth/auth.service.spec.ts @@ -21,15 +21,26 @@ import { VerifyMagicDto } from './dto/verify-magic.dto'; import { DateTime } from 'luxon'; import * as argon2 from 'argon2'; import * as E from 'fp-ts/Either'; +import { ConfigService } from '@nestjs/config'; +import { InfraConfigService } from 'src/infra-config/infra-config.service'; const mockPrisma = mockDeep(); const mockUser = mockDeep(); const mockJWT = mockDeep(); const mockMailer = mockDeep(); +const mockConfigService = mockDeep(); +const mockInfraConfigService = mockDeep(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -const authService = new AuthService(mockUser, mockPrisma, mockJWT, mockMailer); +const authService = new AuthService( + mockUser, + mockPrisma, + mockJWT, + mockMailer, + mockConfigService, + mockInfraConfigService, +); const currentTime = new Date(); @@ -91,6 +102,8 @@ describe('signInMagicLink', () => { mockUser.createUserViaMagicLink.mockResolvedValue(user); // create new entry in VerificationToken table mockPrisma.verificationToken.create.mockResolvedValueOnce(passwordlessData); + // Read env variable 'MAGIC_LINK_TOKEN_VALIDITY' from config service + mockConfigService.get.mockReturnValue('3'); const result = await authService.signInMagicLink( 'dwight@dundermifflin.com', diff --git a/packages/hoppscotch-backend/src/auth/auth.service.ts b/packages/hoppscotch-backend/src/auth/auth.service.ts index a794a1da2..12db5c328 100644 --- a/packages/hoppscotch-backend/src/auth/auth.service.ts +++ b/packages/hoppscotch-backend/src/auth/auth.service.ts @@ -28,6 +28,8 @@ import { AuthError } from 'src/types/AuthError'; import { AuthUser, IsAdmin } from 'src/types/AuthUser'; import { VerificationToken } from '@prisma/client'; import { Origin } from './helper'; +import { ConfigService } from '@nestjs/config'; +import { InfraConfigService } from 'src/infra-config/infra-config.service'; @Injectable() export class AuthService { @@ -36,6 +38,8 @@ export class AuthService { private prismaService: PrismaService, private jwtService: JwtService, private readonly mailerService: MailerService, + private readonly configService: ConfigService, + private infraConfigService: InfraConfigService, ) {} /** @@ -46,10 +50,12 @@ export class AuthService { */ private async generateMagicLinkTokens(user: AuthUser) { const salt = await bcrypt.genSalt( - parseInt(process.env.TOKEN_SALT_COMPLEXITY), + parseInt(this.configService.get('TOKEN_SALT_COMPLEXITY')), ); const expiresOn = DateTime.now() - .plus({ hours: parseInt(process.env.MAGIC_LINK_TOKEN_VALIDITY) }) + .plus({ + hours: parseInt(this.configService.get('MAGIC_LINK_TOKEN_VALIDITY')), + }) .toISO() .toString(); @@ -95,13 +101,13 @@ export class AuthService { */ private async generateRefreshToken(userUid: string) { const refreshTokenPayload: RefreshTokenPayload = { - iss: process.env.VITE_BASE_URL, + iss: this.configService.get('VITE_BASE_URL'), sub: userUid, - aud: [process.env.VITE_BASE_URL], + aud: [this.configService.get('VITE_BASE_URL')], }; const refreshToken = await this.jwtService.sign(refreshTokenPayload, { - expiresIn: process.env.REFRESH_TOKEN_VALIDITY, //7 Days + expiresIn: this.configService.get('REFRESH_TOKEN_VALIDITY'), //7 Days }); const refreshTokenHash = await argon2.hash(refreshToken); @@ -127,9 +133,9 @@ export class AuthService { */ async generateAuthTokens(userUid: string) { const accessTokenPayload: AccessTokenPayload = { - iss: process.env.VITE_BASE_URL, + iss: this.configService.get('VITE_BASE_URL'), sub: userUid, - aud: [process.env.VITE_BASE_URL], + aud: [this.configService.get('VITE_BASE_URL')], }; const refreshToken = await this.generateRefreshToken(userUid); @@ -137,7 +143,7 @@ export class AuthService { return E.right({ access_token: await this.jwtService.sign(accessTokenPayload, { - expiresIn: process.env.ACCESS_TOKEN_VALIDITY, //1 Day + expiresIn: this.configService.get('ACCESS_TOKEN_VALIDITY'), //1 Day }), refresh_token: refreshToken.right, }); @@ -218,14 +224,14 @@ export class AuthService { let url: string; switch (origin) { case Origin.ADMIN: - url = process.env.VITE_ADMIN_URL; + url = this.configService.get('VITE_ADMIN_URL'); break; case Origin.APP: - url = process.env.VITE_BASE_URL; + url = this.configService.get('VITE_BASE_URL'); break; default: // if origin is invalid by default set URL to Hoppscotch-App - url = process.env.VITE_BASE_URL; + url = this.configService.get('VITE_BASE_URL'); } await this.mailerService.sendEmail(email, { @@ -377,4 +383,8 @@ export class AuthService { return E.right({ isAdmin: false }); } + + getAuthProviders() { + return this.infraConfigService.getAllowedAuthProviders(); + } } diff --git a/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts b/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts index 1bf00bc6d..322a2d388 100644 --- a/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts +++ b/packages/hoppscotch-backend/src/auth/guards/github-sso.guard.ts @@ -3,14 +3,25 @@ import { AuthGuard } from '@nestjs/passport'; import { AuthProvider, authProviderCheck, throwHTTPErr } from '../helper'; import { Observable } from 'rxjs'; import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class GithubSSOGuard extends AuthGuard('github') implements CanActivate { + constructor(private readonly configService: ConfigService) { + super(); + } + canActivate( context: ExecutionContext, ): boolean | Promise | Observable { - if (!authProviderCheck(AuthProvider.GITHUB)) + if ( + !authProviderCheck( + AuthProvider.GITHUB, + this.configService.get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS'), + ) + ) { throwHTTPErr({ message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404 }); + } return super.canActivate(context); } diff --git a/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts b/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts index c1f2c3b78..56dbb8a4c 100644 --- a/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts +++ b/packages/hoppscotch-backend/src/auth/guards/google-sso.guard.ts @@ -3,14 +3,25 @@ import { AuthGuard } from '@nestjs/passport'; import { AuthProvider, authProviderCheck, throwHTTPErr } from '../helper'; import { Observable } from 'rxjs'; import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class GoogleSSOGuard extends AuthGuard('google') implements CanActivate { + constructor(private readonly configService: ConfigService) { + super(); + } + canActivate( context: ExecutionContext, ): boolean | Promise | Observable { - if (!authProviderCheck(AuthProvider.GOOGLE)) + if ( + !authProviderCheck( + AuthProvider.GOOGLE, + this.configService.get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS'), + ) + ) { throwHTTPErr({ message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404 }); + } return super.canActivate(context); } diff --git a/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts b/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts index c3a1db17b..06c6ce39e 100644 --- a/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts +++ b/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts @@ -3,20 +3,31 @@ import { AuthGuard } from '@nestjs/passport'; import { AuthProvider, authProviderCheck, throwHTTPErr } from '../helper'; import { Observable } from 'rxjs'; import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class MicrosoftSSOGuard extends AuthGuard('microsoft') implements CanActivate { + constructor(private readonly configService: ConfigService) { + super(); + } + canActivate( context: ExecutionContext, ): boolean | Promise | Observable { - if (!authProviderCheck(AuthProvider.MICROSOFT)) + if ( + !authProviderCheck( + AuthProvider.MICROSOFT, + this.configService.get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS'), + ) + ) { throwHTTPErr({ message: AUTH_PROVIDER_NOT_SPECIFIED, statusCode: 404, }); + } return super.canActivate(context); } diff --git a/packages/hoppscotch-backend/src/auth/helper.ts b/packages/hoppscotch-backend/src/auth/helper.ts index e5e485700..339d7edca 100644 --- a/packages/hoppscotch-backend/src/auth/helper.ts +++ b/packages/hoppscotch-backend/src/auth/helper.ts @@ -6,6 +6,7 @@ import { Response } from 'express'; import * as cookie from 'cookie'; import { AUTH_PROVIDER_NOT_SPECIFIED, COOKIES_NOT_FOUND } from 'src/errors'; import { throwErr } from 'src/utils'; +import { ConfigService } from '@nestjs/config'; enum AuthTokenType { ACCESS_TOKEN = 'access_token', @@ -45,15 +46,17 @@ export const authCookieHandler = ( redirect: boolean, redirectUrl: string | null, ) => { + const configService = new ConfigService(); + const currentTime = DateTime.now(); const accessTokenValidity = currentTime .plus({ - milliseconds: parseInt(process.env.ACCESS_TOKEN_VALIDITY), + milliseconds: parseInt(configService.get('ACCESS_TOKEN_VALIDITY')), }) .toMillis(); const refreshTokenValidity = currentTime .plus({ - milliseconds: parseInt(process.env.REFRESH_TOKEN_VALIDITY), + milliseconds: parseInt(configService.get('REFRESH_TOKEN_VALIDITY')), }) .toMillis(); @@ -75,10 +78,12 @@ export const authCookieHandler = ( } // check to see if redirectUrl is a whitelisted url - const whitelistedOrigins = process.env.WHITELISTED_ORIGINS.split(','); + const whitelistedOrigins = configService + .get('WHITELISTED_ORIGINS') + .split(','); if (!whitelistedOrigins.includes(redirectUrl)) // if it is not redirect by default to REDIRECT_URL - redirectUrl = process.env.REDIRECT_URL; + redirectUrl = configService.get('REDIRECT_URL'); return res.status(HttpStatus.OK).redirect(redirectUrl); }; @@ -112,13 +117,16 @@ export const subscriptionContextCookieParser = (rawCookies: string) => { * @param provider Provider we want to check the presence of * @returns Boolean if provider specified is present or not */ -export function authProviderCheck(provider: string) { +export function authProviderCheck( + provider: string, + VITE_ALLOWED_AUTH_PROVIDERS: string, +) { if (!provider) { throwErr(AUTH_PROVIDER_NOT_SPECIFIED); } - const envVariables = process.env.VITE_ALLOWED_AUTH_PROVIDERS - ? process.env.VITE_ALLOWED_AUTH_PROVIDERS.split(',').map((provider) => + const envVariables = VITE_ALLOWED_AUTH_PROVIDERS + ? VITE_ALLOWED_AUTH_PROVIDERS.split(',').map((provider) => provider.trim().toUpperCase(), ) : []; diff --git a/packages/hoppscotch-backend/src/auth/strategies/github.strategy.ts b/packages/hoppscotch-backend/src/auth/strategies/github.strategy.ts index d95f27219..3f81e41e0 100644 --- a/packages/hoppscotch-backend/src/auth/strategies/github.strategy.ts +++ b/packages/hoppscotch-backend/src/auth/strategies/github.strategy.ts @@ -5,18 +5,20 @@ import { AuthService } from '../auth.service'; import { UserService } from 'src/user/user.service'; import * as O from 'fp-ts/Option'; import * as E from 'fp-ts/Either'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class GithubStrategy extends PassportStrategy(Strategy) { constructor( private authService: AuthService, private usersService: UserService, + private configService: ConfigService, ) { super({ - clientID: process.env.GITHUB_CLIENT_ID, - clientSecret: process.env.GITHUB_CLIENT_SECRET, - callbackURL: process.env.GITHUB_CALLBACK_URL, - scope: [process.env.GITHUB_SCOPE], + clientID: configService.get('INFRA.GITHUB_CLIENT_ID'), + clientSecret: configService.get('INFRA.GITHUB_CLIENT_SECRET'), + callbackURL: configService.get('GITHUB_CALLBACK_URL'), + scope: [configService.get('GITHUB_SCOPE')], store: true, }); } diff --git a/packages/hoppscotch-backend/src/auth/strategies/google.strategy.ts b/packages/hoppscotch-backend/src/auth/strategies/google.strategy.ts index 4df6cb472..2a1b92497 100644 --- a/packages/hoppscotch-backend/src/auth/strategies/google.strategy.ts +++ b/packages/hoppscotch-backend/src/auth/strategies/google.strategy.ts @@ -5,18 +5,20 @@ import { UserService } from 'src/user/user.service'; import * as O from 'fp-ts/Option'; import { AuthService } from '../auth.service'; import * as E from 'fp-ts/Either'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy) { constructor( private usersService: UserService, private authService: AuthService, + private configService: ConfigService, ) { super({ - clientID: process.env.GOOGLE_CLIENT_ID, - clientSecret: process.env.GOOGLE_CLIENT_SECRET, - callbackURL: process.env.GOOGLE_CALLBACK_URL, - scope: process.env.GOOGLE_SCOPE.split(','), + clientID: configService.get('INFRA.GOOGLE_CLIENT_ID'), + clientSecret: configService.get('INFRA.GOOGLE_CLIENT_SECRET'), + callbackURL: configService.get('GOOGLE_CALLBACK_URL'), + scope: configService.get('GOOGLE_SCOPE').split(','), passReqToCallback: true, store: true, }); diff --git a/packages/hoppscotch-backend/src/auth/strategies/jwt.strategy.ts b/packages/hoppscotch-backend/src/auth/strategies/jwt.strategy.ts index d589e82c5..d113a47ce 100644 --- a/packages/hoppscotch-backend/src/auth/strategies/jwt.strategy.ts +++ b/packages/hoppscotch-backend/src/auth/strategies/jwt.strategy.ts @@ -15,10 +15,14 @@ import { INVALID_ACCESS_TOKEN, USER_NOT_FOUND, } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { - constructor(private usersService: UserService) { + constructor( + private usersService: UserService, + private configService: ConfigService, + ) { super({ jwtFromRequest: ExtractJwt.fromExtractors([ (request: Request) => { @@ -29,7 +33,7 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { return ATCookie; }, ]), - secretOrKey: process.env.JWT_SECRET, + secretOrKey: configService.get('JWT_SECRET'), }); } diff --git a/packages/hoppscotch-backend/src/auth/strategies/microsoft.strategy.ts b/packages/hoppscotch-backend/src/auth/strategies/microsoft.strategy.ts index 75e561ee4..a174e2b32 100644 --- a/packages/hoppscotch-backend/src/auth/strategies/microsoft.strategy.ts +++ b/packages/hoppscotch-backend/src/auth/strategies/microsoft.strategy.ts @@ -5,19 +5,21 @@ import { AuthService } from '../auth.service'; import { UserService } from 'src/user/user.service'; import * as O from 'fp-ts/Option'; import * as E from 'fp-ts/Either'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class MicrosoftStrategy extends PassportStrategy(Strategy) { constructor( private authService: AuthService, private usersService: UserService, + private configService: ConfigService, ) { super({ - clientID: process.env.MICROSOFT_CLIENT_ID, - clientSecret: process.env.MICROSOFT_CLIENT_SECRET, - callbackURL: process.env.MICROSOFT_CALLBACK_URL, - scope: [process.env.MICROSOFT_SCOPE], - tenant: process.env.MICROSOFT_TENANT, + clientID: configService.get('INFRA.MICROSOFT_CLIENT_ID'), + clientSecret: configService.get('INFRA.MICROSOFT_CLIENT_SECRET'), + callbackURL: configService.get('MICROSOFT_CALLBACK_URL'), + scope: [configService.get('MICROSOFT_SCOPE')], + tenant: configService.get('MICROSOFT_TENANT'), store: true, }); } diff --git a/packages/hoppscotch-backend/src/auth/strategies/rt-jwt.strategy.ts b/packages/hoppscotch-backend/src/auth/strategies/rt-jwt.strategy.ts index 669fbb170..8fdf107ab 100644 --- a/packages/hoppscotch-backend/src/auth/strategies/rt-jwt.strategy.ts +++ b/packages/hoppscotch-backend/src/auth/strategies/rt-jwt.strategy.ts @@ -14,10 +14,14 @@ import { USER_NOT_FOUND, } from 'src/errors'; import * as O from 'fp-ts/Option'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class RTJwtStrategy extends PassportStrategy(Strategy, 'jwt-refresh') { - constructor(private usersService: UserService) { + constructor( + private usersService: UserService, + private configService: ConfigService, + ) { super({ jwtFromRequest: ExtractJwt.fromExtractors([ (request: Request) => { @@ -28,7 +32,7 @@ export class RTJwtStrategy extends PassportStrategy(Strategy, 'jwt-refresh') { return RTCookie; }, ]), - secretOrKey: process.env.JWT_SECRET, + secretOrKey: configService.get('JWT_SECRET'), }); } diff --git a/packages/hoppscotch-backend/src/errors.ts b/packages/hoppscotch-backend/src/errors.ts index df81a5b85..583f6223b 100644 --- a/packages/hoppscotch-backend/src/errors.ts +++ b/packages/hoppscotch-backend/src/errors.ts @@ -644,3 +644,41 @@ export const SHORTCODE_INVALID_PROPERTIES_JSON = */ export const SHORTCODE_PROPERTIES_NOT_FOUND = 'shortcode/properties_not_found' as const; + +/** + * Infra Config not found + * (InfraConfigService) + */ +export const INFRA_CONFIG_NOT_FOUND = 'infra_config/not_found' as const; + +/** + * Infra Config update failed + * (InfraConfigService) + */ +export const INFRA_CONFIG_UPDATE_FAILED = 'infra_config/update_failed' as const; + +/** + * Infra Config not listed for onModuleInit creation + * (InfraConfigService) + */ +export const INFRA_CONFIG_NOT_LISTED = + 'infra_config/properly_not_listed' as const; + +/** + * Infra Config reset failed + * (InfraConfigService) + */ +export const INFRA_CONFIG_RESET_FAILED = 'infra_config/reset_failed' as const; + +/** + * Infra Config invalid input for Config variable + * (InfraConfigService) + */ +export const INFRA_CONFIG_INVALID_INPUT = 'infra_config/invalid_input' as const; + +/** + * Error message for when the database table does not exist + * (InfraConfigService) + */ +export const DATABASE_TABLE_NOT_EXIST = + 'Database migration not performed. Please check the FAQ for assistance: https://docs.hoppscotch.io/support/faq'; diff --git a/packages/hoppscotch-backend/src/infra-config/helper.ts b/packages/hoppscotch-backend/src/infra-config/helper.ts new file mode 100644 index 000000000..e053d767e --- /dev/null +++ b/packages/hoppscotch-backend/src/infra-config/helper.ts @@ -0,0 +1,44 @@ +import { PrismaService } from 'src/prisma/prisma.service'; + +export enum ServiceStatus { + ENABLE = 'ENABLE', + DISABLE = 'DISABLE', +} + +/** + * Load environment variables from the database and set them in the process + * + * @Description Fetch the 'infra_config' table from the database and return it as an object + * (ConfigModule will set the environment variables in the process) + */ +export async function loadInfraConfiguration() { + try { + const prisma = new PrismaService(); + + const infraConfigs = await prisma.infraConfig.findMany(); + + let environmentObject: Record = {}; + infraConfigs.forEach((infraConfig) => { + environmentObject[infraConfig.name] = infraConfig.value; + }); + + return { INFRA: environmentObject }; + } catch (error) { + // Prisma throw error if 'Can't reach at database server' OR 'Table does not exist' + // Reason for not throwing error is, we want successful build during 'postinstall' and generate dist files + return { INFRA: {} }; + } +} + +/** + * Stop the app after 5 seconds + * (Docker will re-start the app) + */ +export function stopApp() { + console.log('Stopping app in 5 seconds...'); + + setTimeout(() => { + console.log('Stopping app now...'); + process.kill(process.pid, 'SIGTERM'); + }, 5000); +} diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts new file mode 100644 index 000000000..6335261ca --- /dev/null +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.model.ts @@ -0,0 +1,29 @@ +import { Field, ObjectType, registerEnumType } from '@nestjs/graphql'; +import { AuthProvider } from 'src/auth/helper'; +import { InfraConfigEnumForClient } from 'src/types/InfraConfig'; +import { ServiceStatus } from './helper'; + +@ObjectType() +export class InfraConfig { + @Field({ + description: 'Infra Config Name', + }) + name: InfraConfigEnumForClient; + + @Field({ + description: 'Infra Config Value', + }) + value: string; +} + +registerEnumType(InfraConfigEnumForClient, { + name: 'InfraConfigEnum', +}); + +registerEnumType(AuthProvider, { + name: 'AuthProvider', +}); + +registerEnumType(ServiceStatus, { + name: 'ServiceStatus', +}); diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.module.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.module.ts new file mode 100644 index 000000000..dafd25ae8 --- /dev/null +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { InfraConfigService } from './infra-config.service'; +import { PrismaModule } from 'src/prisma/prisma.module'; + +@Module({ + imports: [PrismaModule], + providers: [InfraConfigService], + exports: [InfraConfigService], +}) +export class InfraConfigModule {} diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.service.spec.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.service.spec.ts new file mode 100644 index 000000000..7c236dd55 --- /dev/null +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.service.spec.ts @@ -0,0 +1,109 @@ +import { mockDeep, mockReset } from 'jest-mock-extended'; +import { PrismaService } from 'src/prisma/prisma.service'; +import { InfraConfigService } from './infra-config.service'; +import { + InfraConfigEnum, + InfraConfigEnumForClient, +} from 'src/types/InfraConfig'; +import { INFRA_CONFIG_NOT_FOUND, INFRA_CONFIG_UPDATE_FAILED } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; +import * as helper from './helper'; + +const mockPrisma = mockDeep(); +const mockConfigService = mockDeep(); + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +const infraConfigService = new InfraConfigService( + mockPrisma, + mockConfigService, +); + +beforeEach(() => { + mockReset(mockPrisma); +}); + +describe('InfraConfigService', () => { + describe('update', () => { + it('should update the infra config', async () => { + const name = InfraConfigEnum.GOOGLE_CLIENT_ID; + const value = 'true'; + + mockPrisma.infraConfig.update.mockResolvedValueOnce({ + id: '', + name, + value, + active: true, + createdOn: new Date(), + updatedOn: new Date(), + }); + jest.spyOn(helper, 'stopApp').mockReturnValueOnce(); + + const result = await infraConfigService.update(name, value); + expect(result).toEqualRight({ name, value }); + }); + + it('should pass correct params to prisma update', async () => { + const name = InfraConfigEnum.GOOGLE_CLIENT_ID; + const value = 'true'; + + jest.spyOn(helper, 'stopApp').mockReturnValueOnce(); + + await infraConfigService.update(name, value); + + expect(mockPrisma.infraConfig.update).toHaveBeenCalledWith({ + where: { name }, + data: { value }, + }); + expect(mockPrisma.infraConfig.update).toHaveBeenCalledTimes(1); + }); + + it('should throw an error if the infra config update failed', async () => { + const name = InfraConfigEnum.GOOGLE_CLIENT_ID; + const value = 'true'; + + mockPrisma.infraConfig.update.mockRejectedValueOnce('null'); + + const result = await infraConfigService.update(name, value); + expect(result).toEqualLeft(INFRA_CONFIG_UPDATE_FAILED); + }); + }); + + describe('get', () => { + it('should get the infra config', async () => { + const name = InfraConfigEnumForClient.GOOGLE_CLIENT_ID; + const value = 'true'; + + mockPrisma.infraConfig.findUniqueOrThrow.mockResolvedValueOnce({ + id: '', + name, + value, + active: true, + createdOn: new Date(), + updatedOn: new Date(), + }); + const result = await infraConfigService.get(name); + expect(result).toEqualRight({ name, value }); + }); + + it('should pass correct params to prisma findUnique', async () => { + const name = InfraConfigEnumForClient.GOOGLE_CLIENT_ID; + + await infraConfigService.get(name); + + expect(mockPrisma.infraConfig.findUniqueOrThrow).toHaveBeenCalledWith({ + where: { name }, + }); + expect(mockPrisma.infraConfig.findUniqueOrThrow).toHaveBeenCalledTimes(1); + }); + + it('should throw an error if the infra config does not exist', async () => { + const name = InfraConfigEnumForClient.GOOGLE_CLIENT_ID; + + mockPrisma.infraConfig.findUniqueOrThrow.mockRejectedValueOnce('null'); + + const result = await infraConfigService.get(name); + expect(result).toEqualLeft(INFRA_CONFIG_NOT_FOUND); + }); + }); +}); diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts new file mode 100644 index 000000000..5f8f34868 --- /dev/null +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts @@ -0,0 +1,312 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { InfraConfig } from './infra-config.model'; +import { PrismaService } from 'src/prisma/prisma.service'; +import { InfraConfig as DBInfraConfig } from '@prisma/client'; +import * as E from 'fp-ts/Either'; +import { + InfraConfigEnum, + InfraConfigEnumForClient, +} from 'src/types/InfraConfig'; +import { + AUTH_PROVIDER_NOT_SPECIFIED, + DATABASE_TABLE_NOT_EXIST, + INFRA_CONFIG_INVALID_INPUT, + INFRA_CONFIG_NOT_FOUND, + INFRA_CONFIG_NOT_LISTED, + INFRA_CONFIG_RESET_FAILED, + INFRA_CONFIG_UPDATE_FAILED, +} from 'src/errors'; +import { throwErr, validateEmail, validateSMTPUrl } from 'src/utils'; +import { ConfigService } from '@nestjs/config'; +import { ServiceStatus, stopApp } from './helper'; +import { EnableAndDisableSSOArgs, InfraConfigArgs } from './input-args'; + +@Injectable() +export class InfraConfigService implements OnModuleInit { + constructor( + private readonly prisma: PrismaService, + private readonly configService: ConfigService, + ) {} + + async onModuleInit() { + await this.initializeInfraConfigTable(); + } + + getDefaultInfraConfigs(): { name: InfraConfigEnum; value: string }[] { + // Prepare rows for 'infra_config' table with default values (from .env) for each 'name' + const infraConfigDefaultObjs: { name: InfraConfigEnum; value: string }[] = [ + { + name: InfraConfigEnum.MAILER_SMTP_URL, + value: process.env.MAILER_SMTP_URL, + }, + { + name: InfraConfigEnum.MAILER_ADDRESS_FROM, + value: process.env.MAILER_ADDRESS_FROM, + }, + { + name: InfraConfigEnum.GOOGLE_CLIENT_ID, + value: process.env.GOOGLE_CLIENT_ID, + }, + { + name: InfraConfigEnum.GOOGLE_CLIENT_SECRET, + value: process.env.GOOGLE_CLIENT_SECRET, + }, + { + name: InfraConfigEnum.GITHUB_CLIENT_ID, + value: process.env.GITHUB_CLIENT_ID, + }, + { + name: InfraConfigEnum.GITHUB_CLIENT_SECRET, + value: process.env.GITHUB_CLIENT_SECRET, + }, + { + name: InfraConfigEnum.MICROSOFT_CLIENT_ID, + value: process.env.MICROSOFT_CLIENT_ID, + }, + { + name: InfraConfigEnum.MICROSOFT_CLIENT_SECRET, + value: process.env.MICROSOFT_CLIENT_SECRET, + }, + { + name: InfraConfigEnum.VITE_ALLOWED_AUTH_PROVIDERS, + value: process.env.VITE_ALLOWED_AUTH_PROVIDERS.toLocaleUpperCase(), + }, + ]; + + return infraConfigDefaultObjs; + } + + /** + * Initialize the 'infra_config' table with values from .env + * @description This function create rows 'infra_config' in very first time (only once) + */ + async initializeInfraConfigTable() { + try { + // Get all the 'names' of the properties to be saved in the 'infra_config' table + const enumValues = Object.values(InfraConfigEnum); + + // Fetch the default values (value in .env) for configs to be saved in 'infra_config' table + const infraConfigDefaultObjs = this.getDefaultInfraConfigs(); + + // Check if all the 'names' are listed in the default values + if (enumValues.length !== infraConfigDefaultObjs.length) { + throw new Error(INFRA_CONFIG_NOT_LISTED); + } + + // Eliminate the rows (from 'infraConfigDefaultObjs') that are already present in the database table + const dbInfraConfigs = await this.prisma.infraConfig.findMany(); + const propsToInsert = infraConfigDefaultObjs.filter( + (p) => !dbInfraConfigs.find((e) => e.name === p.name), + ); + + if (propsToInsert.length > 0) { + await this.prisma.infraConfig.createMany({ data: propsToInsert }); + stopApp(); + } + } catch (error) { + if (error.code === 'P1001') { + // Prisma error code for 'Can't reach at database server' + // We're not throwing error here because we want to allow the app to run 'pnpm install' + } else if (error.code === 'P2021') { + // Prisma error code for 'Table does not exist' + throwErr(DATABASE_TABLE_NOT_EXIST); + } else { + throwErr(error); + } + } + } + + /** + * Typecast a database InfraConfig to a InfraConfig model + * @param dbInfraConfig database InfraConfig + * @returns InfraConfig model + */ + cast(dbInfraConfig: DBInfraConfig) { + return { + name: dbInfraConfig.name, + value: dbInfraConfig.value, + }; + } + + /** + * Update InfraConfig by name + * @param name Name of the InfraConfig + * @param value Value of the InfraConfig + * @returns InfraConfig model + */ + async update( + name: InfraConfigEnumForClient | InfraConfigEnum, + value: string, + ) { + const isValidate = this.validateEnvValues([{ name, value }]); + if (E.isLeft(isValidate)) return E.left(isValidate.left); + + try { + const infraConfig = await this.prisma.infraConfig.update({ + where: { name }, + data: { value }, + }); + + stopApp(); + + return E.right(this.cast(infraConfig)); + } catch (e) { + return E.left(INFRA_CONFIG_UPDATE_FAILED); + } + } + + /** + * Update InfraConfigs by name + * @param infraConfigs InfraConfigs to update + * @returns InfraConfig model + */ + async updateMany(infraConfigs: InfraConfigArgs[]) { + const isValidate = this.validateEnvValues(infraConfigs); + if (E.isLeft(isValidate)) return E.left(isValidate.left); + + try { + await this.prisma.$transaction(async (tx) => { + for (let i = 0; i < infraConfigs.length; i++) { + await tx.infraConfig.update({ + where: { name: infraConfigs[i].name }, + data: { value: infraConfigs[i].value }, + }); + } + }); + + stopApp(); + + return E.right(infraConfigs); + } catch (e) { + return E.left(INFRA_CONFIG_UPDATE_FAILED); + } + } + + /** + * Enable or Disable SSO for login/signup + * @param provider Auth Provider to enable or disable + * @param status Status to enable or disable + * @returns Either true or an error + */ + async enableAndDisableSSO(providerInfo: EnableAndDisableSSOArgs[]) { + const allowedAuthProviders = this.configService + .get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS') + .split(','); + + let updatedAuthProviders = allowedAuthProviders; + + providerInfo.forEach(({ provider, status }) => { + if (status === ServiceStatus.ENABLE) { + updatedAuthProviders.push(provider); + } else if (status === ServiceStatus.DISABLE) { + updatedAuthProviders = updatedAuthProviders.filter( + (p) => p !== provider, + ); + } + }); + + updatedAuthProviders = [...new Set(updatedAuthProviders)]; + + if (updatedAuthProviders.length === 0) { + return E.left(AUTH_PROVIDER_NOT_SPECIFIED); + } + + const isUpdated = await this.update( + InfraConfigEnum.VITE_ALLOWED_AUTH_PROVIDERS, + updatedAuthProviders.join(','), + ); + if (E.isLeft(isUpdated)) return E.left(isUpdated.left); + + return E.right(true); + } + + /** + * Get InfraConfig by name + * @param name Name of the InfraConfig + * @returns InfraConfig model + */ + async get(name: InfraConfigEnumForClient) { + try { + const infraConfig = await this.prisma.infraConfig.findUniqueOrThrow({ + where: { name }, + }); + + return E.right(this.cast(infraConfig)); + } catch (e) { + return E.left(INFRA_CONFIG_NOT_FOUND); + } + } + + /** + * Get InfraConfigs by names + * @param names Names of the InfraConfigs + * @returns InfraConfig model + */ + async getMany(names: InfraConfigEnumForClient[]) { + try { + const infraConfigs = await this.prisma.infraConfig.findMany({ + where: { name: { in: names } }, + }); + + return E.right(infraConfigs.map((p) => this.cast(p))); + } catch (e) { + return E.left(INFRA_CONFIG_NOT_FOUND); + } + } + + /** + * Get allowed auth providers for login/signup + * @returns string[] + */ + getAllowedAuthProviders() { + return this.configService + .get('INFRA.VITE_ALLOWED_AUTH_PROVIDERS') + .split(','); + } + + /** + * Reset all the InfraConfigs to their default values (from .env) + */ + async reset() { + try { + const infraConfigDefaultObjs = this.getDefaultInfraConfigs(); + + await this.prisma.infraConfig.deleteMany({ + where: { name: { in: infraConfigDefaultObjs.map((p) => p.name) } }, + }); + await this.prisma.infraConfig.createMany({ + data: infraConfigDefaultObjs, + }); + + stopApp(); + + return E.right(true); + } catch (e) { + return E.left(INFRA_CONFIG_RESET_FAILED); + } + } + + validateEnvValues( + infraConfigs: { + name: InfraConfigEnumForClient | InfraConfigEnum; + value: string; + }[], + ) { + for (let i = 0; i < infraConfigs.length; i++) { + switch (infraConfigs[i].name) { + case InfraConfigEnumForClient.MAILER_SMTP_URL: + const isValidUrl = validateSMTPUrl(infraConfigs[i].value); + if (!isValidUrl) return E.left(INFRA_CONFIG_INVALID_INPUT); + break; + case InfraConfigEnumForClient.MAILER_ADDRESS_FROM: + const isValidEmail = validateEmail(infraConfigs[i].value); + if (!isValidEmail) return E.left(INFRA_CONFIG_INVALID_INPUT); + break; + default: + break; + } + } + + return E.right(true); + } +} diff --git a/packages/hoppscotch-backend/src/infra-config/input-args.ts b/packages/hoppscotch-backend/src/infra-config/input-args.ts new file mode 100644 index 000000000..6b4c26850 --- /dev/null +++ b/packages/hoppscotch-backend/src/infra-config/input-args.ts @@ -0,0 +1,30 @@ +import { Field, InputType } from '@nestjs/graphql'; +import { InfraConfigEnumForClient } from 'src/types/InfraConfig'; +import { ServiceStatus } from './helper'; +import { AuthProvider } from 'src/auth/helper'; + +@InputType() +export class InfraConfigArgs { + @Field(() => InfraConfigEnumForClient, { + description: 'Infra Config Name', + }) + name: InfraConfigEnumForClient; + + @Field({ + description: 'Infra Config Value', + }) + value: string; +} + +@InputType() +export class EnableAndDisableSSOArgs { + @Field(() => AuthProvider, { + description: 'Auth Provider', + }) + provider: AuthProvider; + + @Field(() => ServiceStatus, { + description: 'Auth Provider Status', + }) + status: ServiceStatus; +} diff --git a/packages/hoppscotch-backend/src/mailer/mailer.module.ts b/packages/hoppscotch-backend/src/mailer/mailer.module.ts index f24aa5d64..a9d422d79 100644 --- a/packages/hoppscotch-backend/src/mailer/mailer.module.ts +++ b/packages/hoppscotch-backend/src/mailer/mailer.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { Global, Module } from '@nestjs/common'; import { MailerModule as NestMailerModule } from '@nestjs-modules/mailer'; import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter'; import { MailerService } from './mailer.service'; @@ -7,24 +7,42 @@ import { MAILER_FROM_ADDRESS_UNDEFINED, MAILER_SMTP_URL_UNDEFINED, } from 'src/errors'; +import { ConfigService } from '@nestjs/config'; +import { loadInfraConfiguration } from 'src/infra-config/helper'; +@Global() @Module({ - imports: [ - NestMailerModule.forRoot({ - transport: - process.env.MAILER_SMTP_URL ?? throwErr(MAILER_SMTP_URL_UNDEFINED), - defaults: { - from: - process.env.MAILER_ADDRESS_FROM ?? - throwErr(MAILER_FROM_ADDRESS_UNDEFINED), - }, - template: { - dir: __dirname + '/templates', - adapter: new HandlebarsAdapter(), - }, - }), - ], + imports: [], providers: [MailerService], exports: [MailerService], }) -export class MailerModule {} +export class MailerModule { + static async register() { + const env = await loadInfraConfiguration(); + + let mailerSmtpUrl = env.INFRA.MAILER_SMTP_URL; + let mailerAddressFrom = env.INFRA.MAILER_ADDRESS_FROM; + + if (!env.INFRA.MAILER_SMTP_URL || !env.INFRA.MAILER_ADDRESS_FROM) { + const config = new ConfigService(); + mailerSmtpUrl = config.get('MAILER_SMTP_URL'); + mailerAddressFrom = config.get('MAILER_ADDRESS_FROM'); + } + + return { + module: MailerModule, + imports: [ + NestMailerModule.forRoot({ + transport: mailerSmtpUrl ?? throwErr(MAILER_SMTP_URL_UNDEFINED), + defaults: { + from: mailerAddressFrom ?? throwErr(MAILER_FROM_ADDRESS_UNDEFINED), + }, + template: { + dir: __dirname + '/templates', + adapter: new HandlebarsAdapter(), + }, + }), + ], + }; + } +} diff --git a/packages/hoppscotch-backend/src/main.ts b/packages/hoppscotch-backend/src/main.ts index 3eca997e0..dae82a3a0 100644 --- a/packages/hoppscotch-backend/src/main.ts +++ b/packages/hoppscotch-backend/src/main.ts @@ -6,18 +6,23 @@ import { VersioningType } from '@nestjs/common'; import * as session from 'express-session'; import { emitGQLSchemaFile } from './gql-schema'; import { checkEnvironmentAuthProvider } from './utils'; +import { ConfigService } from '@nestjs/config'; async function bootstrap() { - console.log(`Running in production: ${process.env.PRODUCTION}`); - console.log(`Port: ${process.env.PORT}`); - - checkEnvironmentAuthProvider(); - const app = await NestFactory.create(AppModule); + const configService = app.get(ConfigService); + + console.log(`Running in production: ${configService.get('PRODUCTION')}`); + console.log(`Port: ${configService.get('PORT')}`); + + checkEnvironmentAuthProvider( + configService.get('VITE_ALLOWED_AUTH_PROVIDERS'), + ); + app.use( session({ - secret: process.env.SESSION_SECRET, + secret: configService.get('SESSION_SECRET'), }), ); @@ -28,18 +33,18 @@ async function bootstrap() { }), ); - if (process.env.PRODUCTION === 'false') { + if (configService.get('PRODUCTION') === 'false') { console.log('Enabling CORS with development settings'); app.enableCors({ - origin: process.env.WHITELISTED_ORIGINS.split(','), + origin: configService.get('WHITELISTED_ORIGINS').split(','), credentials: true, }); } else { console.log('Enabling CORS with production settings'); app.enableCors({ - origin: process.env.WHITELISTED_ORIGINS.split(','), + origin: configService.get('WHITELISTED_ORIGINS').split(','), credentials: true, }); } @@ -47,7 +52,13 @@ async function bootstrap() { type: VersioningType.URI, }); app.use(cookieParser()); - await app.listen(process.env.PORT || 3170); + await app.listen(configService.get('PORT') || 3170); + + // Graceful shutdown + process.on('SIGTERM', async () => { + console.info('SIGTERM signal received'); + await app.close(); + }); } if (!process.env.GENERATE_GQL_SCHEMA) { diff --git a/packages/hoppscotch-backend/src/shortcode/shortcode.service.spec.ts b/packages/hoppscotch-backend/src/shortcode/shortcode.service.spec.ts index cf35f4f06..7614fd0a4 100644 --- a/packages/hoppscotch-backend/src/shortcode/shortcode.service.spec.ts +++ b/packages/hoppscotch-backend/src/shortcode/shortcode.service.spec.ts @@ -504,20 +504,24 @@ describe('ShortcodeService', () => { ); expect(result).toEqual([ { - id: shortcodes[0].id, - request: JSON.stringify(shortcodes[0].request), - properties: JSON.stringify(shortcodes[0].embedProperties), - createdOn: shortcodes[0].createdOn, + id: shortcodesWithUserEmail[0].id, + request: JSON.stringify(shortcodesWithUserEmail[0].request), + properties: JSON.stringify( + shortcodesWithUserEmail[0].embedProperties, + ), + createdOn: shortcodesWithUserEmail[0].createdOn, creator: { uid: user.uid, email: user.email, }, }, { - id: shortcodes[1].id, - request: JSON.stringify(shortcodes[1].request), - properties: JSON.stringify(shortcodes[1].embedProperties), - createdOn: shortcodes[1].createdOn, + id: shortcodesWithUserEmail[1].id, + request: JSON.stringify(shortcodesWithUserEmail[1].request), + properties: JSON.stringify( + shortcodesWithUserEmail[1].embedProperties, + ), + createdOn: shortcodesWithUserEmail[1].createdOn, creator: { uid: user.uid, email: user.email, diff --git a/packages/hoppscotch-backend/src/team-invitation/team-invitation.module.ts b/packages/hoppscotch-backend/src/team-invitation/team-invitation.module.ts index 17598fedb..f4cd4e368 100644 --- a/packages/hoppscotch-backend/src/team-invitation/team-invitation.module.ts +++ b/packages/hoppscotch-backend/src/team-invitation/team-invitation.module.ts @@ -1,5 +1,4 @@ import { Module } from '@nestjs/common'; -import { MailerModule } from 'src/mailer/mailer.module'; import { PrismaModule } from 'src/prisma/prisma.module'; import { PubSubModule } from 'src/pubsub/pubsub.module'; import { TeamModule } from 'src/team/team.module'; @@ -12,7 +11,7 @@ import { TeamInviteeGuard } from './team-invitee.guard'; import { TeamTeamInviteExtResolver } from './team-teaminvite-ext.resolver'; @Module({ - imports: [PrismaModule, TeamModule, PubSubModule, UserModule, MailerModule], + imports: [PrismaModule, TeamModule, PubSubModule, UserModule], providers: [ TeamInvitationService, TeamInvitationResolver, diff --git a/packages/hoppscotch-backend/src/team-invitation/team-invitation.service.ts b/packages/hoppscotch-backend/src/team-invitation/team-invitation.service.ts index 392d82e97..f7749070f 100644 --- a/packages/hoppscotch-backend/src/team-invitation/team-invitation.service.ts +++ b/packages/hoppscotch-backend/src/team-invitation/team-invitation.service.ts @@ -20,6 +20,7 @@ import { UserService } from 'src/user/user.service'; import { PubSubService } from 'src/pubsub/pubsub.service'; import { validateEmail } from '../utils'; import { AuthUser } from 'src/types/AuthUser'; +import { ConfigService } from '@nestjs/config'; @Injectable() export class TeamInvitationService { @@ -28,8 +29,8 @@ export class TeamInvitationService { private readonly userService: UserService, private readonly teamService: TeamService, private readonly mailerService: MailerService, - private readonly pubsub: PubSubService, + private readonly configService: ConfigService, ) {} /** @@ -150,7 +151,9 @@ export class TeamInvitationService { template: 'team-invitation', variables: { invitee: creator.displayName ?? 'A Hoppscotch User', - action_url: `${process.env.VITE_BASE_URL}/join-team?id=${dbInvitation.id}`, + action_url: `${this.configService.get('VITE_BASE_URL')}/join-team?id=${ + dbInvitation.id + }`, invite_team_name: team.name, }, }); diff --git a/packages/hoppscotch-backend/src/types/InfraConfig.ts b/packages/hoppscotch-backend/src/types/InfraConfig.ts new file mode 100644 index 000000000..5c47eb9e0 --- /dev/null +++ b/packages/hoppscotch-backend/src/types/InfraConfig.ts @@ -0,0 +1,29 @@ +export enum InfraConfigEnum { + MAILER_SMTP_URL = 'MAILER_SMTP_URL', + MAILER_ADDRESS_FROM = 'MAILER_ADDRESS_FROM', + + GOOGLE_CLIENT_ID = 'GOOGLE_CLIENT_ID', + GOOGLE_CLIENT_SECRET = 'GOOGLE_CLIENT_SECRET', + + GITHUB_CLIENT_ID = 'GITHUB_CLIENT_ID', + GITHUB_CLIENT_SECRET = 'GITHUB_CLIENT_SECRET', + + MICROSOFT_CLIENT_ID = 'MICROSOFT_CLIENT_ID', + MICROSOFT_CLIENT_SECRET = 'MICROSOFT_CLIENT_SECRET', + + VITE_ALLOWED_AUTH_PROVIDERS = 'VITE_ALLOWED_AUTH_PROVIDERS', +} + +export enum InfraConfigEnumForClient { + MAILER_SMTP_URL = 'MAILER_SMTP_URL', + MAILER_ADDRESS_FROM = 'MAILER_ADDRESS_FROM', + + GOOGLE_CLIENT_ID = 'GOOGLE_CLIENT_ID', + GOOGLE_CLIENT_SECRET = 'GOOGLE_CLIENT_SECRET', + + GITHUB_CLIENT_ID = 'GITHUB_CLIENT_ID', + GITHUB_CLIENT_SECRET = 'GITHUB_CLIENT_SECRET', + + MICROSOFT_CLIENT_ID = 'MICROSOFT_CLIENT_ID', + MICROSOFT_CLIENT_SECRET = 'MICROSOFT_CLIENT_SECRET', +} diff --git a/packages/hoppscotch-backend/src/utils.ts b/packages/hoppscotch-backend/src/utils.ts index d9817c1c0..cc74c30f2 100644 --- a/packages/hoppscotch-backend/src/utils.ts +++ b/packages/hoppscotch-backend/src/utils.ts @@ -131,6 +131,26 @@ export const validateEmail = (email: string) => { ).test(email); }; +/** + * Checks to see if the URL is valid or not + * @param url The URL to validate + * @returns boolean + */ +export const validateSMTPUrl = (url: string) => { + // Possible valid formats + // smtp(s)://mail.example.com + // smtp(s)://user:pass@mail.example.com + // smtp(s)://mail.example.com:587 + // smtp(s)://user:pass@mail.example.com:587 + + if (!url || url.length === 0) return false; + + const regex = + /^(smtp|smtps):\/\/(?:([^:]+):([^@]+)@)?((?!\.)[^:]+)(?::(\d+))?$/; + if (regex.test(url)) return true; + return false; +}; + /** * String to JSON parser * @param {str} str The string to parse @@ -161,21 +181,23 @@ export function isValidLength(title: string, length: number) { /** * This function is called by bootstrap() in main.ts - * It checks if the "VITE_ALLOWED_AUTH_PROVIDERS" environment variable is properly set or not. + * It checks if the "VITE_ALLOWED_AUTH_PROVIDERS" environment variable is properly set or not. * If not, it throws an error. */ -export function checkEnvironmentAuthProvider() { - if (!process.env.hasOwnProperty('VITE_ALLOWED_AUTH_PROVIDERS')) { +export function checkEnvironmentAuthProvider( + VITE_ALLOWED_AUTH_PROVIDERS: string, +) { + if (!VITE_ALLOWED_AUTH_PROVIDERS) { throw new Error(ENV_NOT_FOUND_KEY_AUTH_PROVIDERS); } - if (process.env.VITE_ALLOWED_AUTH_PROVIDERS === '') { + if (VITE_ALLOWED_AUTH_PROVIDERS === '') { throw new Error(ENV_EMPTY_AUTH_PROVIDERS); } - const givenAuthProviders = process.env.VITE_ALLOWED_AUTH_PROVIDERS.split( - ',', - ).map((provider) => provider.toLocaleUpperCase()); + const givenAuthProviders = VITE_ALLOWED_AUTH_PROVIDERS.split(',').map( + (provider) => provider.toLocaleUpperCase(), + ); const supportedAuthProviders = Object.values(AuthProvider).map( (provider: string) => provider.toLocaleUpperCase(), ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12c132e86..71dfebd94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: '@nestjs/common': specifier: ^10.2.6 version: 10.2.7(reflect-metadata@0.1.13)(rxjs@7.6.0) + '@nestjs/config': + specifier: ^3.1.1 + version: 3.1.1(@nestjs/common@10.2.7)(reflect-metadata@0.1.13) '@nestjs/core': specifier: ^10.2.6 version: 10.2.7(@nestjs/common@10.2.7)(@nestjs/platform-express@10.2.7)(reflect-metadata@0.1.13)(rxjs@7.6.0) @@ -296,16 +299,16 @@ importers: version: 2.1.1(fp-ts@2.16.1)(io-ts@2.2.20) '@swc/core': specifier: ^1.3.92 - version: 1.3.100 + version: 1.3.95 '@types/jest': specifier: ^29.5.5 - version: 29.5.10 + version: 29.5.7 '@types/lodash': specifier: ^4.14.199 version: 4.14.200 '@types/qs': specifier: ^6.9.8 - version: 6.9.10 + version: 6.9.9 axios: specifier: ^0.21.4 version: 0.21.4 @@ -338,10 +341,10 @@ importers: version: 6.11.2 ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.23.2)(esbuild@0.19.5)(jest@29.7.0)(typescript@5.2.2) + version: 29.1.1(@babel/core@7.23.2)(esbuild@0.18.20)(jest@29.7.0)(typescript@5.2.2) tsup: specifier: ^7.2.0 - version: 7.3.0(@swc/core@1.3.100)(typescript@5.2.2) + version: 7.2.0(@swc/core@1.3.95)(typescript@5.2.2) typescript: specifier: ^5.2.2 version: 5.2.2 @@ -356,7 +359,7 @@ importers: version: 10.1.0(openapi-types@12.1.3) '@codemirror/autocomplete': specifier: ^6.11.0 - version: 6.11.1(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.0) + version: 6.11.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.0) '@codemirror/commands': specifier: ^6.3.0 version: 6.3.0 @@ -419,13 +422,13 @@ importers: version: 2.1.6(graphql@16.8.1) '@urql/exchange-graphcache': specifier: ^6.3.3 - version: 6.4.0(graphql@16.8.1) + version: 6.3.3(graphql@16.8.1) '@vitejs/plugin-legacy': specifier: ^4.1.1 version: 4.1.1(terser@5.24.0)(vite@4.5.0) '@vueuse/core': specifier: ^10.6.1 - version: 10.7.0(vue@3.3.9) + version: 10.6.1(vue@3.3.9) acorn-walk: specifier: ^8.3.0 version: 8.3.0 @@ -563,7 +566,7 @@ importers: version: 3.3.9(typescript@5.3.2) vue-i18n: specifier: ^9.7.1 - version: 9.8.0(vue@3.3.9) + version: 9.7.1(vue@3.3.9) vue-pdf-embed: specifier: ^1.2.1 version: 1.2.1(vue@3.3.9) @@ -615,7 +618,7 @@ importers: version: 4.0.1(graphql@16.8.1) '@graphql-codegen/typescript-urql-graphcache': specifier: ^3.0.0 - version: 3.0.0(@urql/exchange-graphcache@6.4.0)(graphql-tag@2.12.6)(graphql@16.8.1) + version: 3.0.0(@urql/exchange-graphcache@6.3.3)(graphql-tag@2.12.6)(graphql@16.8.1) '@graphql-codegen/urql-introspection': specifier: ^3.0.0 version: 3.0.0(graphql@16.8.1) @@ -624,10 +627,10 @@ importers: version: 3.2.0(graphql@16.8.1) '@iconify-json/lucide': specifier: ^1.1.141 - version: 1.1.144 + version: 1.1.141 '@intlify/vite-plugin-vue-i18n': specifier: ^7.0.0 - version: 7.0.0(vite@4.5.0)(vue-i18n@9.8.0) + version: 7.0.0(vite@4.5.0)(vue-i18n@9.7.1) '@relmify/jest-fp-ts': specifier: ^2.1.1 version: 2.1.1(fp-ts@2.16.1)(io-ts@2.2.20) @@ -666,22 +669,22 @@ importers: version: 21.0.3 '@typescript-eslint/eslint-plugin': specifier: ^6.12.0 - version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.2) + version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) '@typescript-eslint/parser': specifier: ^6.12.0 - version: 6.13.2(eslint@8.55.0)(typescript@5.3.2) + version: 6.12.0(eslint@8.54.0)(typescript@5.3.2) '@vitejs/plugin-vue': specifier: ^4.5.0 - version: 4.5.1(vite@4.5.0)(vue@3.3.9) + version: 4.5.0(vite@4.5.0)(vue@3.3.9) '@vue/compiler-sfc': specifier: ^3.3.8 - version: 3.3.10 + version: 3.3.8 '@vue/eslint-config-typescript': specifier: ^12.0.0 - version: 12.0.0(eslint-plugin-vue@9.19.2)(eslint@8.55.0)(typescript@5.3.2) + version: 12.0.0(eslint-plugin-vue@9.18.1)(eslint@8.54.0)(typescript@5.3.2) '@vue/runtime-core': specifier: ^3.3.8 - version: 3.3.10 + version: 3.3.8 autoprefixer: specifier: ^10.4.14 version: 10.4.16(postcss@8.4.31) @@ -693,13 +696,13 @@ importers: version: 16.3.1 eslint: specifier: ^8.54.0 - version: 8.55.0 + version: 8.54.0 eslint-plugin-prettier: specifier: ^5.0.1 - version: 5.0.1(eslint@8.55.0)(prettier@3.1.0) + version: 5.0.1(eslint@8.54.0)(prettier@3.1.0) eslint-plugin-vue: specifier: ^9.18.1 - version: 9.19.2(eslint@8.55.0) + version: 9.18.1(eslint@8.54.0) glob: specifier: ^10.3.10 version: 10.3.10 @@ -735,7 +738,7 @@ importers: version: 1.1.1(vite@4.5.0) unplugin-icons: specifier: ^0.17.4 - version: 0.17.4(@vue/compiler-sfc@3.3.10) + version: 0.17.4(@vue/compiler-sfc@3.3.8) unplugin-vue-components: specifier: ^0.25.2 version: 0.25.2(rollup@3.29.4)(vue@3.3.9) @@ -744,7 +747,7 @@ importers: version: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0) vite-plugin-checker: specifier: ^0.6.2 - version: 0.6.2(eslint@8.55.0)(typescript@5.3.2)(vite@4.5.0)(vue-tsc@1.8.24) + version: 0.6.2(eslint@8.54.0)(typescript@5.3.2)(vite@4.5.0)(vue-tsc@1.8.22) vite-plugin-fonts: specifier: ^0.7.0 version: 0.7.0(vite@4.5.0) @@ -756,13 +759,13 @@ importers: version: 0.7.42(rollup@3.29.4)(vite@4.5.0) vite-plugin-pages: specifier: ^0.31.0 - version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0) + version: 0.31.0(@vue/compiler-sfc@3.3.8)(vite@4.5.0) vite-plugin-pages-sitemap: specifier: ^1.6.1 version: 1.6.1 vite-plugin-pwa: specifier: ^0.17.0 - version: 0.17.3(vite@4.5.0)(workbox-build@7.0.0)(workbox-window@7.0.0) + version: 0.17.0(vite@4.5.0)(workbox-build@7.0.0)(workbox-window@7.0.0) vite-plugin-vue-layouts: specifier: ^0.8.0 version: 0.8.0(vite@4.5.0)(vue-router@4.2.5)(vue@3.3.9) @@ -771,7 +774,7 @@ importers: version: 0.34.6(sass@1.69.5)(terser@5.24.0) vue-tsc: specifier: ^1.8.22 - version: 1.8.24(typescript@5.3.2) + version: 1.8.22(typescript@5.3.2) packages/hoppscotch-data: dependencies: @@ -839,10 +842,10 @@ importers: version: 17.0.45 '@typescript-eslint/eslint-plugin': specifier: ^5.19.0 - version: 5.30.6(@typescript-eslint/parser@5.30.6)(eslint@8.19.0)(typescript@4.9.5) + version: 5.30.6(@typescript-eslint/parser@5.30.6)(eslint@8.19.0)(typescript@4.7.4) '@typescript-eslint/parser': specifier: ^5.19.0 - version: 5.30.6(eslint@8.19.0)(typescript@4.9.5) + version: 5.30.6(eslint@8.19.0)(typescript@4.7.4) eslint: specifier: ^8.13.0 version: 8.19.0 @@ -863,13 +866,13 @@ importers: version: 2.8.4 ts-jest: specifier: ^27.1.4 - version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(jest@27.5.1)(typescript@4.9.5) + version: 27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(jest@27.5.1)(typescript@4.7.4) typescript: specifier: ^4.6.3 - version: 4.9.5 + version: 4.7.4 vite: specifier: ^5.0.4 - version: 5.0.5(@types/node@17.0.45) + version: 5.0.4(@types/node@17.0.45) packages/hoppscotch-selfhost-desktop: dependencies: @@ -887,7 +890,7 @@ importers: version: 1.5.6 '@vueuse/core': specifier: ^10.4.1 - version: 10.5.0(vue@3.3.9) + version: 10.6.1(vue@3.3.9) axios: specifier: ^0.21.4 version: 0.21.4 @@ -926,7 +929,7 @@ importers: version: link:@tauri-apps/api/tauri tauri-plugin-store-api: specifier: github:tauri-apps/tauri-plugin-store#v1 - version: github.com/tauri-apps/tauri-plugin-store/6e19887b1bdea9b921a31993d72396a350731e07 + version: github.com/tauri-apps/tauri-plugin-store/3367248b2661abcb73d2a89f30df780c387fb57d util: specifier: ^0.12.4 version: 0.12.5 @@ -969,7 +972,7 @@ importers: version: 1.3.3 '@types/lodash-es': specifier: ^4.17.9 - version: 4.17.10 + version: 4.17.11 '@types/node': specifier: ^18.7.10 version: 18.18.8 @@ -1132,19 +1135,19 @@ importers: version: 1.6.0 '@typescript-eslint/eslint-plugin': specifier: ^6.12.0 - version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.2) + version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) '@typescript-eslint/parser': specifier: ^6.12.0 - version: 6.13.2(eslint@8.55.0)(typescript@5.3.2) + version: 6.12.0(eslint@8.54.0)(typescript@5.3.2) '@vitejs/plugin-legacy': specifier: ^4.1.1 version: 4.1.1(terser@5.24.0)(vite@4.5.0) '@vitejs/plugin-vue': specifier: ^4.5.0 - version: 4.5.1(vite@4.5.0)(vue@3.3.9) + version: 4.5.0(vite@4.5.0)(vue@3.3.9) '@vue/eslint-config-typescript': specifier: ^12.0.0 - version: 12.0.0(eslint-plugin-vue@9.19.2)(eslint@8.55.0)(typescript@5.3.2) + version: 12.0.0(eslint-plugin-vue@9.18.1)(eslint@8.54.0)(typescript@5.3.2) autoprefixer: specifier: ^10.4.14 version: 10.4.16(postcss@8.4.31) @@ -1153,13 +1156,13 @@ importers: version: 7.0.3 eslint: specifier: ^8.54.0 - version: 8.55.0 + version: 8.54.0 eslint-plugin-prettier: specifier: ^5.0.1 - version: 5.0.1(eslint@8.55.0)(prettier@3.1.0) + version: 5.0.1(eslint@8.54.0)(prettier@3.1.0) eslint-plugin-vue: specifier: ^9.18.1 - version: 9.19.2(eslint@8.55.0) + version: 9.18.1(eslint@8.54.0) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -1180,7 +1183,7 @@ importers: version: 1.1.1(vite@4.5.0) unplugin-icons: specifier: ^0.17.4 - version: 0.17.4(@vue/compiler-sfc@3.3.10) + version: 0.17.4(@vue/compiler-sfc@3.3.8) unplugin-vue-components: specifier: ^0.25.2 version: 0.25.2(rollup@2.79.1)(vue@3.3.9) @@ -1204,7 +1207,7 @@ importers: version: 1.6.1 vite-plugin-pwa: specifier: ^0.17.0 - version: 0.17.3(vite@4.5.0)(workbox-build@7.0.0)(workbox-window@7.0.0) + version: 0.17.0(vite@4.5.0)(workbox-build@7.0.0)(workbox-window@7.0.0) vite-plugin-static-copy: specifier: ^0.17.1 version: 0.17.1(vite@4.5.0) @@ -1213,7 +1216,7 @@ importers: version: 0.8.0(vite@4.5.0)(vue-router@4.2.5)(vue@3.3.9) vue-tsc: specifier: ^1.8.22 - version: 1.8.24(typescript@5.3.2) + version: 1.8.22(typescript@5.3.2) packages/hoppscotch-sh-admin: dependencies: @@ -1285,7 +1288,7 @@ importers: version: 8.4.31 prettier-plugin-tailwindcss: specifier: ^0.5.6 - version: 0.5.7(prettier@3.1.0) + version: 0.5.6(prettier@3.1.0) rxjs: specifier: ^7.8.0 version: 7.8.0 @@ -1497,7 +1500,7 @@ importers: version: 2.8.4 prettier-plugin-tailwindcss: specifier: ^0.5.6 - version: 0.5.7(prettier@2.8.4) + version: 0.5.6(prettier@2.8.4) rollup-plugin-polyfill-node: specifier: ^0.10.1 version: 0.10.1(rollup@2.79.1) @@ -1937,7 +1940,7 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/generator': 7.22.10 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@babel/runtime': 7.23.1 '@babel/traverse': 7.22.10 '@babel/types': 7.22.10 @@ -1966,7 +1969,7 @@ packages: dependencies: '@babel/core': 7.22.10 '@babel/generator': 7.22.10 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@babel/runtime': 7.23.1 '@babel/traverse': 7.22.10 '@babel/types': 7.22.10 @@ -2028,10 +2031,10 @@ packages: '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) '@babel/helpers': 7.22.10 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@babel/template': 7.22.5 '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@9.2.2) gensync: 1.0.0-beta.2 @@ -2050,7 +2053,7 @@ packages: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.2) '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.0 + '@babel/parser': 7.23.5 '@babel/template': 7.22.15 '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 @@ -2077,9 +2080,9 @@ packages: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.22.10 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 /@babel/generator@7.23.0: @@ -2090,6 +2093,7 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 + dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} @@ -2243,7 +2247,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.5 - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -2257,13 +2261,13 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 /@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.22.10 /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} @@ -2427,7 +2431,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -2478,7 +2482,7 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/traverse': 7.22.10 - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color @@ -2591,7 +2595,7 @@ packages: dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.10 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.10) @@ -4296,7 +4300,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@babel/types': 7.20.7 dev: true @@ -4305,7 +4309,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 + '@babel/parser': 7.23.5 '@babel/types': 7.23.0 dev: true @@ -4315,20 +4319,20 @@ packages: dependencies: '@babel/code-frame': 7.22.13 '@babel/parser': 7.22.10 - '@babel/types': 7.23.0 + '@babel/types': 7.22.10 /@babel/traverse@7.22.10: resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 + '@babel/generator': 7.22.10 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.22.10 - '@babel/types': 7.23.0 + '@babel/parser': 7.23.5 + '@babel/types': 7.22.10 debug: 4.3.4(supports-color@9.2.2) globals: 11.12.0 transitivePeerDependencies: @@ -4344,7 +4348,7 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 + '@babel/parser': 7.23.5 '@babel/types': 7.23.0 debug: 4.3.4(supports-color@9.2.2) globals: 11.12.0 @@ -4384,13 +4388,13 @@ packages: /@boringer-avatars/vue3@0.2.1(vue@3.3.9): resolution: {integrity: sha512-KzAfh31SDXToTvFL0tBNG5Ur+VzfD1PP4jmY5/GS+eIuObGTIAiUu9eiht0LjuAGI+0xCgnaEgsTrOx8H3vLOQ==} peerDependencies: - vue: 3.3.9 + vue: ^3.0.0 dependencies: vue: 3.3.9(typescript@4.9.3) dev: false - /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.3): - resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==} + /@codemirror/autocomplete@6.11.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.3): + resolution: {integrity: sha512-LCPH3W+hl5vcO7OzEQgX6NpKuKVyiKFLGAy7FXROF6nUpsWUdQEgUb3fe/g7B0E1KZCRFfgzdKASt6Wly2UOBg==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 @@ -4403,8 +4407,8 @@ packages: '@lezer/common': 1.0.3 dev: false - /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.0): - resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==} + /@codemirror/autocomplete@6.11.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.0): + resolution: {integrity: sha512-LCPH3W+hl5vcO7OzEQgX6NpKuKVyiKFLGAy7FXROF6nUpsWUdQEgUb3fe/g7B0E1KZCRFfgzdKASt6Wly2UOBg==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 @@ -4428,7 +4432,7 @@ packages: /@codemirror/lang-javascript@6.2.1: resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==} dependencies: - '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.0) + '@codemirror/autocomplete': 6.11.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.1.0) '@codemirror/language': 6.9.2 '@codemirror/lint': 6.4.2 '@codemirror/state': 6.3.1 @@ -4446,7 +4450,7 @@ packages: /@codemirror/lang-xml@6.0.2(@codemirror/view@6.22.0): resolution: {integrity: sha512-JQYZjHL2LAfpiZI2/qZ/qzDuSqmGKMwyApYmEUUCTxLM4MWS7sATUEfIguZQr9Zjx/7gcdnewb039smF6nC2zw==} dependencies: - '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.3) + '@codemirror/autocomplete': 6.11.0(@codemirror/language@6.9.2)(@codemirror/state@6.3.1)(@codemirror/view@6.22.0)(@lezer/common@1.0.3) '@codemirror/language': 6.9.2 '@codemirror/state': 6.3.1 '@lezer/common': 1.0.3 @@ -5164,13 +5168,13 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.55.0 + eslint: 8.54.0 eslint-visitor-keys: 3.4.3 dev: true @@ -5251,8 +5255,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@eslint/js@8.55.0: - resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -5374,9 +5378,9 @@ packages: '@parcel/watcher': optional: true dependencies: - '@babel/generator': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/generator': 7.22.10 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 '@graphql-codegen/core': 4.0.0(graphql@16.8.1) '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.8.1) '@graphql-tools/apollo-engine-loader': 8.0.0(graphql@16.8.1) @@ -5388,7 +5392,7 @@ packages: '@graphql-tools/load': 8.0.0(graphql@16.8.1) '@graphql-tools/prisma-loader': 8.0.1(@types/node@17.0.27)(graphql@16.8.1) '@graphql-tools/url-loader': 8.0.0(@types/node@17.0.27)(graphql@16.8.1) - '@graphql-tools/utils': 10.0.6(graphql@16.8.1) + '@graphql-tools/utils': 10.0.5(graphql@16.8.1) '@whatwg-node/fetch': 0.8.8 chalk: 4.1.2 cosmiconfig: 8.2.0 @@ -5571,7 +5575,7 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-tools/utils': 8.8.0(graphql@16.6.0) + '@graphql-tools/utils': 8.13.1(graphql@16.6.0) change-case-all: 1.0.14 common-tags: 1.8.2 graphql: 16.6.0 @@ -5585,7 +5589,7 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-tools/utils': 8.8.0(graphql@16.8.1) + '@graphql-tools/utils': 8.13.1(graphql@16.8.1) change-case-all: 1.0.14 common-tags: 1.8.2 graphql: 16.8.1 @@ -5817,6 +5821,27 @@ packages: - supports-color dev: true + /@graphql-codegen/typescript-urql-graphcache@3.0.0(@urql/exchange-graphcache@6.3.3)(graphql-tag@2.12.6)(graphql@16.8.1): + resolution: {integrity: sha512-nHc5Q8YB38qDi+AMOvFD2YzzvV0glDr5CpXEAO9s3wLOvbufZekfxE9Zj/uhb9oB2yOfWPUYyDaU9krY4l32Cw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@urql/exchange-graphcache': ^5.2.0 || ^6.0.0 + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + graphql-tag: ^2.0.0 + dependencies: + '@graphql-codegen/plugin-helpers': 3.1.2(graphql@16.8.1) + '@graphql-codegen/visitor-plugin-common': 2.13.1(graphql@16.8.1) + '@urql/exchange-graphcache': 6.3.3(graphql@16.8.1) + auto-bind: 4.0.0 + change-case-all: 1.0.15 + graphql: 16.8.1 + graphql-tag: 2.12.6(graphql@16.8.1) + tslib: 2.6.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@graphql-codegen/typescript-urql-graphcache@3.0.0(@urql/exchange-graphcache@6.4.0)(graphql-tag@2.12.6)(graphql@16.8.1): resolution: {integrity: sha512-nHc5Q8YB38qDi+AMOvFD2YzzvV0glDr5CpXEAO9s3wLOvbufZekfxE9Zj/uhb9oB2yOfWPUYyDaU9krY4l32Cw==} engines: {node: '>= 16.0.0'} @@ -6573,7 +6598,7 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.23.2) '@babel/traverse': 7.22.10 '@babel/types': 7.20.7 @@ -6592,7 +6617,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@babel/core': 7.22.10 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.10) '@babel/traverse': 7.22.10 '@babel/types': 7.22.10 @@ -6818,7 +6843,7 @@ packages: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@graphql-tools/url-loader': 8.0.0(@types/node@17.0.27)(graphql@16.8.1) - '@graphql-tools/utils': 10.0.6(graphql@16.8.1) + '@graphql-tools/utils': 10.0.5(graphql@16.8.1) '@types/js-yaml': 4.0.9 '@types/json-stable-stringify': 1.0.34 '@whatwg-node/fetch': 0.9.9 @@ -7125,15 +7150,6 @@ packages: tslib: 2.6.2 dev: true - /@graphql-tools/utils@8.8.0(graphql@16.8.1): - resolution: {integrity: sha512-KJrtx05uSM/cPYFdTnGAS1doL5bftJLAiFCDMZ8Vkifztz3BFn3gpFiy/o4wDtM8s39G46mxmt2Km/RmeltfGw==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - dependencies: - graphql: 16.8.1 - tslib: 2.6.2 - dev: true - /@graphql-tools/utils@9.1.1(graphql@16.6.0): resolution: {integrity: sha512-DXKLIEDbihK24fktR2hwp/BNIVwULIHaSTNTNhXS+19vgT50eX9wndx1bPxGwHnVBOONcwjXy0roQac49vdt/w==} peerDependencies: @@ -7270,7 +7286,7 @@ packages: resolution: {integrity: sha512-2xgBDwEHmiY053hPWy4rKnnMjntVcg8qfIYJGyITwFWSfNTq+6ez/HjWzUcHT6qwFMglUHq+rDlQb9gYZF+Edw==} peerDependencies: histoire: ^0.12.4 - vue: 3.3.9 + vue: ^3.2.31 dependencies: '@histoire/controls': 0.12.4 '@histoire/shared': 0.12.4(vite@3.2.4) @@ -7301,7 +7317,7 @@ packages: /@hoppscotch/vue-toasted@0.1.0(vue@3.3.9): resolution: {integrity: sha512-DIgmeTHxWwX5UeaHLEqDYNLJFGRosx/5N1fCHkaO8zt+sZv8GrHlkrIpjfKF2drmA3kKw5cY42Cw7WuCoabR3g==} peerDependencies: - vue: 3.3.9 + vue: ^3.2.37 dependencies: vue: 3.3.9(typescript@5.3.2) dev: false @@ -7355,8 +7371,8 @@ packages: '@iconify/types': 2.0.0 dev: true - /@iconify-json/lucide@1.1.144: - resolution: {integrity: sha512-MdpwW2zrSmxgUUyZs5zX7GqlqoTMvK1fpIFQKkXOwsxWfijAjyEWP2oWFFdVIKUoDyMSbJzXXIwon68D/Q4PcQ==} + /@iconify-json/lucide@1.1.141: + resolution: {integrity: sha512-sqVopjdB7m8JOnpZilQbLCM1sOq3snE2OEP2BnP1EIefAd6uhzBBrV7Zy6hkkvdHVKYmX4aVzOHF6enDFO7kHA==} dependencies: '@iconify/types': 2.0.0 dev: true @@ -7467,7 +7483,7 @@ packages: unplugin: 1.2.0 dev: true - /@intlify/bundle-utils@3.4.0(vue-i18n@9.8.0): + /@intlify/bundle-utils@3.4.0(vue-i18n@9.7.1): resolution: {integrity: sha512-2UQkqiSAOSPEHMGWlybqWm4G2K0X+FyYho5AwXz6QklSX1EY5EDmOSxZmwscn2qmKBnp6OYsme5kUrnN9xrWzQ==} engines: {node: '>= 12'} peerDependencies: @@ -7483,7 +7499,7 @@ packages: '@intlify/shared': 9.4.1 jsonc-eslint-parser: 1.4.1 source-map: 0.6.1 - vue-i18n: 9.8.0(vue@3.3.9) + vue-i18n: 9.7.1(vue@3.3.9) yaml-eslint-parser: 0.3.2 dev: true @@ -7523,8 +7539,8 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/message-compiler': 9.4.1 - '@intlify/shared': 9.8.0 + '@intlify/message-compiler': 9.7.1 + '@intlify/shared': 9.7.1 acorn: 8.11.2 escodegen: 2.1.0 estree-walker: 2.0.2 @@ -7546,12 +7562,12 @@ packages: '@intlify/vue-devtools': 9.2.2 dev: false - /@intlify/core-base@9.8.0: - resolution: {integrity: sha512-UxaSZVZ1DwqC/CltUZrWZNaWNhfmKtfyV4BJSt/Zt4Or/fZs1iFj0B+OekYk1+MRHfIOe3+x00uXGQI4PbO/9g==} + /@intlify/core-base@9.7.1: + resolution: {integrity: sha512-jPJTeECEhqQ7g//8g3Fb79j5SzSSRqlFCWD6pcX94uMLXU+L1m07gVZnnvzoJBnaMyJHiiwxOqZVfvu6rQfLvw==} engines: {node: '>= 16'} dependencies: - '@intlify/message-compiler': 9.8.0 - '@intlify/shared': 9.8.0 + '@intlify/message-compiler': 9.7.1 + '@intlify/shared': 9.7.1 /@intlify/devtools-if@9.2.2: resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} @@ -7582,12 +7598,13 @@ packages: dependencies: '@intlify/shared': 9.4.1 source-map-js: 1.0.2 + dev: true - /@intlify/message-compiler@9.8.0: - resolution: {integrity: sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==} + /@intlify/message-compiler@9.7.1: + resolution: {integrity: sha512-HfIr2Hn/K7b0Zv4kGqkxAxwtipyxAwhI9a3krN5cuhH/G9gkaik7of1PdzjR3Mix43t2onBiKYQyaU7mo7e0aA==} engines: {node: '>= 16'} dependencies: - '@intlify/shared': 9.8.0 + '@intlify/shared': 9.7.1 source-map-js: 1.0.2 /@intlify/shared@9.2.2: @@ -7604,8 +7621,8 @@ packages: resolution: {integrity: sha512-A51elBmZWf1FS80inf/32diO9DeXoqg9GR9aUDHFcfHoNDuT46Q+fpPOdj8jiJnSHSBh8E1E+6qWRhAZXdK3Ng==} engines: {node: '>= 16'} - /@intlify/shared@9.8.0: - resolution: {integrity: sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ==} + /@intlify/shared@9.7.1: + resolution: {integrity: sha512-CBKnHzlUYGrk5QII9q4nElAQKO5cX1rRx8VmSWXltyOZjbkGHXYQTHULn6KwRi+CypuBCfmPkyPBHMzosypIeg==} engines: {node: '>= 16'} /@intlify/unplugin-vue-i18n@1.2.0(vue-i18n@9.2.2): @@ -7709,7 +7726,7 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/bundle-utils': 3.4.0(vue-i18n@9.8.0) + '@intlify/bundle-utils': 3.4.0(vue-i18n@9.7.1) '@intlify/shared': 9.4.1 '@rollup/pluginutils': 4.2.1 debug: 4.3.4(supports-color@9.2.2) @@ -7720,7 +7737,7 @@ packages: - supports-color dev: true - /@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.5.0)(vue-i18n@9.8.0): + /@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.5.0)(vue-i18n@9.7.1): resolution: {integrity: sha512-2TbDOQ8XD+vkc0s5OFmr+IY/k4mYMC7pzvx0xGQn+cU/ev314+yi7Z7N7rWcBgiYk1WOUalbGSo3d4nJDxOOyw==} engines: {node: '>= 14.6'} deprecated: This plugin support until Vite 3. If you would like to use on Vite 4, please use @intlify/unplugin-vue-i18n @@ -7736,14 +7753,14 @@ packages: vue-i18n: optional: true dependencies: - '@intlify/bundle-utils': 3.4.0(vue-i18n@9.8.0) + '@intlify/bundle-utils': 3.4.0(vue-i18n@9.7.1) '@intlify/shared': 9.4.1 '@rollup/pluginutils': 4.2.1 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.1 source-map: 0.6.1 vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0) - vue-i18n: 9.8.0(vue@3.3.9) + vue-i18n: 9.7.1(vue@3.3.9) transitivePeerDependencies: - supports-color dev: true @@ -8512,7 +8529,7 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -8546,6 +8563,7 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -8792,6 +8810,20 @@ packages: tslib: 2.6.2 uid: 2.0.2 + /@nestjs/config@3.1.1(@nestjs/common@10.2.7)(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.2.7(reflect-metadata@0.1.13)(rxjs@7.6.0) + 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.2.7(@nestjs/common@10.2.7)(@nestjs/platform-express@10.2.7)(reflect-metadata@0.1.13)(rxjs@7.6.0): resolution: {integrity: sha512-5GSu53QUUcwX17sNmlJPa1I0wIeAZOKbedyVuQx0ZAwWVa9g0wJBbsNP+R4EJ+j5Dkdzt/8xkiZvnKt8RFRR8g==} requiresBuild: true @@ -9252,7 +9284,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.0.3(rollup@3.29.4) estree-walker: 2.0.2 magic-string: 0.30.5 rollup: 3.29.4 @@ -9302,6 +9334,21 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 + /@rollup/pluginutils@5.0.2(rollup@3.29.4): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.1 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.29.4 + dev: true + /@rollup/pluginutils@5.0.3(rollup@2.79.1): resolution: {integrity: sha512-hfllNN4a80rwNQ9QCxhxuHCGHMAvabXqxNdaChUSSadMre7t4iEUI6fFAhBOn/eIYTgYVhBv7vCLsAJ4u3lf3g==} engines: {node: '>=14.0.0'} @@ -9361,96 +9408,104 @@ packages: rollup: 3.29.4 dev: true - /@rollup/rollup-android-arm-eabi@4.6.1: - resolution: {integrity: sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==} + /@rollup/rollup-android-arm-eabi@4.7.0: + resolution: {integrity: sha512-rGku10pL1StFlFvXX5pEv88KdGW6DHUghsxyP/aRYb9eH+74jTGJ3U0S/rtlsQ4yYq1Hcc7AMkoJOb1xu29Fxw==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.6.1: - resolution: {integrity: sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==} + /@rollup/rollup-android-arm64@4.7.0: + resolution: {integrity: sha512-/EBw0cuJ/KVHiU2qyVYUhogXz7W2vXxBzeE9xtVIMC+RyitlY2vvaoysMUqASpkUtoNIHlnKTu/l7mXOPgnKOA==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.6.1: - resolution: {integrity: sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==} + /@rollup/rollup-darwin-arm64@4.7.0: + resolution: {integrity: sha512-4VXG1bgvClJdbEYYjQ85RkOtwN8sqI3uCxH0HC5w9fKdqzRzgG39K7GAehATGS8jghA7zNoS5CjSKkDEqWmNZg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.6.1: - resolution: {integrity: sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==} + /@rollup/rollup-darwin-x64@4.7.0: + resolution: {integrity: sha512-/ImhO+T/RWJ96hUbxiCn2yWI0/MeQZV/aeukQQfhxiSXuZJfyqtdHPUPrc84jxCfXTxbJLmg4q+GBETeb61aNw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.6.1: - resolution: {integrity: sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.7.0: + resolution: {integrity: sha512-zhye8POvTyUXlKbfPBVqoHy3t43gIgffY+7qBFqFxNqVtltQLtWeHNAbrMnXiLIfYmxcoL/feuLDote2tx+Qbg==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.6.1: - resolution: {integrity: sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==} + /@rollup/rollup-linux-arm64-gnu@4.7.0: + resolution: {integrity: sha512-RAdr3OJnUum6Vs83cQmKjxdTg31zJnLLTkjhcFt0auxM6jw00GD6IPFF42uasYPr/wGC6TRm7FsQiJyk0qIEfg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.6.1: - resolution: {integrity: sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==} + /@rollup/rollup-linux-arm64-musl@4.7.0: + resolution: {integrity: sha512-nhWwYsiJwZGq7SyR3afS3EekEOsEAlrNMpPC4ZDKn5ooYSEjDLe9W/xGvoIV8/F/+HNIY6jY8lIdXjjxfxopXw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.6.1: - resolution: {integrity: sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==} + /@rollup/rollup-linux-riscv64-gnu@4.7.0: + resolution: {integrity: sha512-rlfy5RnQG1aop1BL/gjdH42M2geMUyVQqd52GJVirqYc787A/XVvl3kQ5NG/43KXgOgE9HXgCaEH05kzQ+hLoA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.7.0: + resolution: {integrity: sha512-cCkoGlGWfBobdDtiiypxf79q6k3/iRVGu1HVLbD92gWV5WZbmuWJCgRM4x2N6i7ljGn1cGytPn9ZAfS8UwF6vg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.6.1: - resolution: {integrity: sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==} + /@rollup/rollup-linux-x64-musl@4.7.0: + resolution: {integrity: sha512-R2oBf2p/Arc1m+tWmiWbpHBjEcJnHVnv6bsypu4tcKdrYTpDfl1UT9qTyfkIL1iiii5D4WHxUHCg5X0pzqmxFg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.6.1: - resolution: {integrity: sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==} + /@rollup/rollup-win32-arm64-msvc@4.7.0: + resolution: {integrity: sha512-CPtgaQL1aaPc80m8SCVEoxFGHxKYIt3zQYC3AccL/SqqiWXblo3pgToHuBwR8eCP2Toa+X1WmTR/QKFMykws7g==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.6.1: - resolution: {integrity: sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==} + /@rollup/rollup-win32-ia32-msvc@4.7.0: + resolution: {integrity: sha512-pmioUlttNh9GXF5x2CzNa7Z8kmRTyhEzzAC+2WOOapjewMbl+3tGuAnxbwc5JyG8Jsz2+hf/QD/n5VjimOZ63g==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.6.1: - resolution: {integrity: sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==} + /@rollup/rollup-win32-x64-msvc@4.7.0: + resolution: {integrity: sha512-SeZzC2QhhdBQUm3U0c8+c/P6UlRyBcLL2Xp5KX7z46WXZxzR8RJSIWL9wSUeBTgxog5LTPJuPj0WOT9lvrtP7Q==} cpu: [x64] os: [win32] requiresBuild: true @@ -9563,8 +9618,8 @@ packages: string.prototype.matchall: 4.0.10 dev: true - /@swc/core-darwin-arm64@1.3.100: - resolution: {integrity: sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==} + /@swc/core-darwin-arm64@1.3.95: + resolution: {integrity: sha512-VAuBAP3MNetO/yBIBzvorUXq7lUBwhfpJxYViSxyluMwtoQDhE/XWN598TWMwMl1ZuImb56d7eUsuFdjgY7pJw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -9572,8 +9627,8 @@ packages: dev: true optional: true - /@swc/core-darwin-x64@1.3.100: - resolution: {integrity: sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==} + /@swc/core-darwin-x64@1.3.95: + resolution: {integrity: sha512-20vF2rvUsN98zGLZc+dsEdHvLoCuiYq/1B+TDeE4oolgTFDmI1jKO+m44PzWjYtKGU9QR95sZ6r/uec0QC5O4Q==} engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -9581,8 +9636,17 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-gnu@1.3.100: - resolution: {integrity: sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==} + /@swc/core-linux-arm-gnueabihf@1.3.95: + resolution: {integrity: sha512-oEudEM8PST1MRNGs+zu0cx5i9uP8TsLE4/L9HHrS07Ck0RJ3DCj3O2fU832nmLe2QxnAGPwBpSO9FntLfOiWEQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.95: + resolution: {integrity: sha512-pIhFI+cuC1aYg+0NAPxwT/VRb32f2ia8oGxUjQR6aJg65gLkUYQzdwuUmpMtFR2WVf7WVFYxUnjo4UyMuyh3ng==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -9590,8 +9654,8 @@ packages: dev: true optional: true - /@swc/core-linux-arm64-musl@1.3.100: - resolution: {integrity: sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==} + /@swc/core-linux-arm64-musl@1.3.95: + resolution: {integrity: sha512-ZpbTr+QZDT4OPJfjPAmScqdKKaT+wGurvMU5AhxLaf85DuL8HwUwwlL0n1oLieLc47DwIJEMuKQkYhXMqmJHlg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -9599,8 +9663,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-gnu@1.3.100: - resolution: {integrity: sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==} + /@swc/core-linux-x64-gnu@1.3.95: + resolution: {integrity: sha512-n9SuHEFtdfSJ+sHdNXNRuIOVprB8nbsz+08apKfdo4lEKq6IIPBBAk5kVhPhkjmg2dFVHVo4Tr/OHXM1tzWCCw==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -9608,8 +9672,8 @@ packages: dev: true optional: true - /@swc/core-linux-x64-musl@1.3.100: - resolution: {integrity: sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==} + /@swc/core-linux-x64-musl@1.3.95: + resolution: {integrity: sha512-L1JrVlsXU3LC0WwmVnMK9HrOT2uhHahAoPNMJnZQpc18a0paO9fqifPG8M/HjNRffMUXR199G/phJsf326UvVg==} engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -9617,8 +9681,8 @@ packages: dev: true optional: true - /@swc/core-win32-arm64-msvc@1.3.100: - resolution: {integrity: sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==} + /@swc/core-win32-arm64-msvc@1.3.95: + resolution: {integrity: sha512-YaP4x/aZbUyNdqCBpC2zL8b8n58MEpOUpmOIZK6G1SxGi+2ENht7gs7+iXpWPc0sy7X3YPKmSWMAuui0h8lgAA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -9626,8 +9690,8 @@ packages: dev: true optional: true - /@swc/core-win32-ia32-msvc@1.3.100: - resolution: {integrity: sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==} + /@swc/core-win32-ia32-msvc@1.3.95: + resolution: {integrity: sha512-w0u3HI916zT4BC/57gOd+AwAEjXeUlQbGJ9H4p/gzs1zkSHtoDQghVUNy3n/ZKp9KFod/95cA8mbVF9t1+6epQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -9635,8 +9699,8 @@ packages: dev: true optional: true - /@swc/core-win32-x64-msvc@1.3.100: - resolution: {integrity: sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==} + /@swc/core-win32-x64-msvc@1.3.95: + resolution: {integrity: sha512-5RGnMt0S6gg4Gc6QtPUJ3Qs9Un4sKqccEzgH/tj7V/DVTJwKdnBKxFZfgQ34OR2Zpz7zGOn889xwsFVXspVWNA==} engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -9644,8 +9708,8 @@ packages: dev: true optional: true - /@swc/core@1.3.100: - resolution: {integrity: sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==} + /@swc/core@1.3.95: + resolution: {integrity: sha512-PMrNeuqIusq9DPDooV3FfNEbZuTu5jKAc04N3Hm6Uk2Fl49cqElLFQ4xvl4qDmVDz97n3n/C1RE0/f6WyGPEiA==} engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -9657,15 +9721,16 @@ packages: '@swc/counter': 0.1.2 '@swc/types': 0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': 1.3.100 - '@swc/core-darwin-x64': 1.3.100 - '@swc/core-linux-arm64-gnu': 1.3.100 - '@swc/core-linux-arm64-musl': 1.3.100 - '@swc/core-linux-x64-gnu': 1.3.100 - '@swc/core-linux-x64-musl': 1.3.100 - '@swc/core-win32-arm64-msvc': 1.3.100 - '@swc/core-win32-ia32-msvc': 1.3.100 - '@swc/core-win32-x64-msvc': 1.3.100 + '@swc/core-darwin-arm64': 1.3.95 + '@swc/core-darwin-x64': 1.3.95 + '@swc/core-linux-arm-gnueabihf': 1.3.95 + '@swc/core-linux-arm64-gnu': 1.3.95 + '@swc/core-linux-arm64-musl': 1.3.95 + '@swc/core-linux-x64-gnu': 1.3.95 + '@swc/core-linux-x64-musl': 1.3.95 + '@swc/core-win32-arm64-msvc': 1.3.95 + '@swc/core-win32-ia32-msvc': 1.3.95 + '@swc/core-win32-x64-msvc': 1.3.95 dev: true /@swc/counter@0.1.2: @@ -9826,8 +9891,8 @@ packages: /@types/babel__core@7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: - '@babel/parser': 7.22.10 - '@babel/types': 7.23.0 + '@babel/parser': 7.23.5 + '@babel/types': 7.22.10 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.17.1 @@ -9842,7 +9907,7 @@ packages: /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.23.0 + '@babel/parser': 7.23.5 '@babel/types': 7.23.0 dev: true @@ -9948,6 +10013,10 @@ packages: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} dev: false + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + /@types/estree@1.0.2: resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} @@ -9955,7 +10024,7 @@ packages: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: '@types/node': 18.18.8 - '@types/qs': 6.9.10 + '@types/qs': 6.9.9 '@types/range-parser': 1.2.4 /@types/express@4.17.14: @@ -9972,7 +10041,7 @@ packages: dependencies: '@types/body-parser': 1.19.2 '@types/express-serve-static-core': 4.17.31 - '@types/qs': 6.9.10 + '@types/qs': 6.9.9 '@types/serve-static': 1.15.0 dev: false @@ -10026,8 +10095,8 @@ packages: pretty-format: 29.3.1 dev: true - /@types/jest@29.5.10: - resolution: {integrity: sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==} + /@types/jest@29.5.7: + resolution: {integrity: sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==} dependencies: expect: 29.5.0 pretty-format: 29.5.0 @@ -10073,8 +10142,8 @@ packages: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: true - /@types/lodash-es@4.17.10: - resolution: {integrity: sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==} + /@types/lodash-es@4.17.11: + resolution: {integrity: sha512-eCw8FYAWHt2DDl77s+AMLLzPn310LKohruumpucZI4oOFJkIgnlaJcy23OKMJxx4r9PeTF13Gv6w+jqjWQaYUg==} dependencies: '@types/lodash': 4.14.200 dev: true @@ -10253,13 +10322,13 @@ packages: dev: false optional: true - /@types/qs@6.9.10: - resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} - /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true + /@types/qs@6.9.9: + resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} + /@types/ramda@0.28.15: resolution: {integrity: sha512-FCaLNVZry65jW8x/FDnKgjgkCNQxgc5AYMQwdNn6yW5M+62R+0nt2Y36U43dTNora9hcquemfrY5gxhE5pcilQ==} dependencies: @@ -10336,8 +10405,8 @@ packages: resolution: {integrity: sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==} dev: true - /@types/urijs@1.19.23: - resolution: {integrity: sha512-3Zbk6RzmIpvKTNEHO2RcPOGHM++BQEITMqBRR1Ju32WbruhV/pygYgxiP3xA0b1B88zjzs0Izzjxsbj768+IjA==} + /@types/urijs@1.19.25: + resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==} dev: false /@types/uuid@9.0.7: @@ -10352,10 +10421,6 @@ packages: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: false - /@types/web-bluetooth@0.0.18: - resolution: {integrity: sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==} - dev: false - /@types/web-bluetooth@0.0.20: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} dev: false @@ -10381,7 +10446,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@typescript-eslint/eslint-plugin@5.30.6(@typescript-eslint/parser@5.30.6)(eslint@8.19.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.30.6(@typescript-eslint/parser@5.30.6)(eslint@8.19.0)(typescript@4.7.4): resolution: {integrity: sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10392,18 +10457,18 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.30.6(eslint@8.19.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.30.6(eslint@8.19.0)(typescript@4.7.4) '@typescript-eslint/scope-manager': 5.30.6 - '@typescript-eslint/type-utils': 5.30.6(eslint@8.19.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.30.6(eslint@8.19.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.30.6(eslint@8.19.0)(typescript@4.7.4) + '@typescript-eslint/utils': 5.30.6(eslint@8.19.0)(typescript@4.7.4) debug: 4.3.4(supports-color@9.2.2) eslint: 8.19.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + tsutils: 3.21.0(typescript@4.7.4) + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -10491,8 +10556,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==} + /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -10503,13 +10568,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.13.2(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/scope-manager': 6.13.2 - '@typescript-eslint/type-utils': 6.13.2(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/visitor-keys': 6.13.2 + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/type-utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4(supports-color@9.2.2) - eslint: 8.55.0 + eslint: 8.54.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -10520,7 +10585,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@5.30.6(eslint@8.19.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.30.6(eslint@8.19.0)(typescript@4.7.4): resolution: {integrity: sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10532,10 +10597,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.30.6 '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.30.6(typescript@4.7.4) debug: 4.3.4(supports-color@9.2.2) eslint: 8.19.0 - typescript: 4.9.5 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -10600,8 +10665,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==} + /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -10610,12 +10675,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.13.2 - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.2) - '@typescript-eslint/visitor-keys': 6.13.2 + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4(supports-color@9.2.2) - eslint: 8.55.0 + eslint: 8.54.0 typescript: 5.3.2 transitivePeerDependencies: - supports-color @@ -10645,15 +10710,15 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@6.13.2: - resolution: {integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==} + /@typescript-eslint/scope-manager@6.12.0: + resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/visitor-keys': 6.13.2 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/visitor-keys': 6.12.0 dev: true - /@typescript-eslint/type-utils@5.30.6(eslint@8.19.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.30.6(eslint@8.19.0)(typescript@4.7.4): resolution: {integrity: sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10663,11 +10728,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.30.6(eslint@8.19.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.30.6(eslint@8.19.0)(typescript@4.7.4) debug: 4.3.4(supports-color@9.2.2) eslint: 8.19.0 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + tsutils: 3.21.0(typescript@4.7.4) + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -10732,8 +10797,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==} + /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -10742,10 +10807,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.2) - '@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.2) + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) debug: 4.3.4(supports-color@9.2.2) - eslint: 8.55.0 + eslint: 8.54.0 ts-api-utils: 1.0.2(typescript@5.3.2) typescript: 5.3.2 transitivePeerDependencies: @@ -10767,12 +10832,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@6.13.2: - resolution: {integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==} + /@typescript-eslint/types@6.12.0: + resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.30.6(typescript@4.9.5): + /@typescript-eslint/typescript-estree@5.30.6(typescript@4.7.4): resolution: {integrity: sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10787,8 +10852,8 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 + tsutils: 3.21.0(typescript@4.7.4) + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true @@ -10856,8 +10921,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.2): - resolution: {integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==} + /@typescript-eslint/typescript-estree@6.12.0(typescript@5.3.2): + resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -10865,8 +10930,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/visitor-keys': 6.13.2 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4(supports-color@9.2.2) globby: 11.1.0 is-glob: 4.0.3 @@ -10877,7 +10942,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.30.6(eslint@8.19.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.30.6(eslint@8.19.0)(typescript@4.7.4): resolution: {integrity: sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -10886,7 +10951,7 @@ packages: '@types/json-schema': 7.0.9 '@typescript-eslint/scope-manager': 5.30.6 '@typescript-eslint/types': 5.30.6 - '@typescript-eslint/typescript-estree': 5.30.6(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 5.30.6(typescript@4.7.4) eslint: 8.19.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0(eslint@8.19.0) @@ -10955,19 +11020,19 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==} + /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.13.2 - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.2) - eslint: 8.55.0 + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + eslint: 8.54.0 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -10998,11 +11063,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.13.2: - resolution: {integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==} + /@typescript-eslint/visitor-keys@6.12.0: + resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.13.2 + '@typescript-eslint/types': 6.12.0 eslint-visitor-keys: 3.4.3 dev: true @@ -11037,7 +11102,7 @@ packages: /@unhead/vue@1.8.8(vue@3.3.9): resolution: {integrity: sha512-isHpVnSSE5SP+ObsZG/i+Jq9tAQ2u1AbGrktXKmL7P5FRxwPjhATYnJFdGpxXeXfuaFgRFKzGKs29xo4MMVODw==} peerDependencies: - vue: 3.3.9 + vue: '>=2.7 || >=3' dependencies: '@unhead/schema': 1.8.8 '@unhead/shared': 1.8.8 @@ -11102,6 +11167,15 @@ packages: wonka: 6.3.4 dev: true + /@urql/exchange-graphcache@6.3.3(graphql@16.8.1): + resolution: {integrity: sha512-uD8zzNIrxQHYCSgfIwYxzEmU1Ml4nJ6NTKwrDlpKmTLJa3aYuG3AoiO138HZBK1XGJ2QzV5yQPfcZsmbVFH8Yg==} + dependencies: + '@0no-co/graphql.web': 1.0.4(graphql@16.8.1) + '@urql/core': 4.2.0(graphql@16.8.1) + wonka: 6.3.4 + transitivePeerDependencies: + - graphql + /@urql/exchange-graphcache@6.4.0(graphql@16.8.1): resolution: {integrity: sha512-VgcPdDNR3hSJDuf+mj0OZWzOzQccA8vT8xphxtO1MoJlgv1A4VhjLd75pjVvGz29ZHN90jEbdyBKJz6GShT7qA==} dependencies: @@ -11110,6 +11184,7 @@ packages: wonka: 6.3.4 transitivePeerDependencies: - graphql + dev: true /@urql/introspection@0.3.3(graphql@16.6.0): resolution: {integrity: sha512-tekSLLqWnusfV6V7xaEnLJQSdXOD/lWy7f8JYQwrX+88Md+voGSCSx5WJXI7KLBN3Tat2OV08tAr8UROykls4Q==} @@ -11130,7 +11205,7 @@ packages: /@urql/vue@1.1.2(graphql@16.6.0)(vue@3.3.9): resolution: {integrity: sha512-ixfV0PTXcOl4KrZK24X+9B4rX9KSxqq1xhHZ0SOkAxgxMkomjJhtUl+9PuRL+LEzGWVr91OCEo68VPQ8uc5rBA==} peerDependencies: - vue: 3.3.9 + vue: ^2.7.0 || ^3.0.0 dependencies: '@urql/core': 4.2.0(graphql@16.6.0) vue: 3.3.9(typescript@4.9.3) @@ -11195,7 +11270,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^3.0.0 - vue: 3.3.9 + vue: ^3.2.25 dependencies: vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0) vue: 3.3.9(typescript@4.9.3) @@ -11206,18 +11281,18 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 - vue: 3.3.9 + vue: ^3.2.25 dependencies: vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.24.0) vue: 3.3.9(typescript@4.9.5) dev: true - /@vitejs/plugin-vue@4.5.1(vite@4.5.0)(vue@3.3.9): - resolution: {integrity: sha512-DaUzYFr+2UGDG7VSSdShKa9sIWYBa1LL8KC0MNOf2H5LjcTPjob0x8LbkqXWmAtbANJCkpiQTj66UVcQkN2s3g==} + /@vitejs/plugin-vue@4.5.0(vite@4.5.0)(vue@3.3.9): + resolution: {integrity: sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 || ^5.0.0 - vue: 3.3.9 + vue: ^3.2.25 dependencies: vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0) vue: 3.3.9(typescript@5.3.2) @@ -11290,6 +11365,12 @@ packages: '@volar/source-map': 1.10.1 dev: true + /@volar/language-core@1.10.10: + resolution: {integrity: sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==} + dependencies: + '@volar/source-map': 1.10.10 + dev: true + /@volar/language-core@1.11.1: resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} dependencies: @@ -11320,6 +11401,12 @@ packages: muggle-string: 0.3.1 dev: true + /@volar/source-map@1.10.10: + resolution: {integrity: sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==} + dependencies: + muggle-string: 0.3.1 + dev: true + /@volar/source-map@1.11.1: resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} dependencies: @@ -11339,6 +11426,13 @@ packages: '@volar/language-core': 1.10.1 dev: true + /@volar/typescript@1.10.10: + resolution: {integrity: sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==} + dependencies: + '@volar/language-core': 1.10.10 + path-browserify: 1.0.1 + dev: true + /@volar/typescript@1.11.1: resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} dependencies: @@ -11379,7 +11473,7 @@ packages: /@vue/compiler-core@3.2.45: resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} dependencies: - '@babel/parser': 7.18.6 + '@babel/parser': 7.23.5 '@vue/shared': 3.2.45 estree-walker: 2.0.2 source-map: 0.6.1 @@ -11392,6 +11486,15 @@ packages: estree-walker: 2.0.2 source-map-js: 1.0.2 + /@vue/compiler-core@3.3.8: + resolution: {integrity: sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==} + dependencies: + '@babel/parser': 7.23.0 + '@vue/shared': 3.3.8 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + /@vue/compiler-core@3.3.9: resolution: {integrity: sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ==} dependencies: @@ -11412,6 +11515,13 @@ packages: '@vue/compiler-core': 3.3.10 '@vue/shared': 3.3.10 + /@vue/compiler-dom@3.3.8: + resolution: {integrity: sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==} + dependencies: + '@vue/compiler-core': 3.3.8 + '@vue/shared': 3.3.8 + dev: true + /@vue/compiler-dom@3.3.9: resolution: {integrity: sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg==} dependencies: @@ -11446,6 +11556,21 @@ packages: postcss: 8.4.32 source-map-js: 1.0.2 + /@vue/compiler-sfc@3.3.8: + resolution: {integrity: sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==} + dependencies: + '@babel/parser': 7.23.0 + '@vue/compiler-core': 3.3.8 + '@vue/compiler-dom': 3.3.8 + '@vue/compiler-ssr': 3.3.8 + '@vue/reactivity-transform': 3.3.8 + '@vue/shared': 3.3.8 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.31 + source-map-js: 1.0.2 + dev: true + /@vue/compiler-sfc@3.3.9: resolution: {integrity: sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A==} dependencies: @@ -11472,6 +11597,13 @@ packages: '@vue/compiler-dom': 3.3.10 '@vue/shared': 3.3.10 + /@vue/compiler-ssr@3.3.8: + resolution: {integrity: sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==} + dependencies: + '@vue/compiler-dom': 3.3.8 + '@vue/shared': 3.3.8 + dev: true + /@vue/compiler-ssr@3.3.9: resolution: {integrity: sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g==} dependencies: @@ -11530,7 +11662,7 @@ packages: - supports-color dev: true - /@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.19.2)(eslint@8.55.0)(typescript@5.3.2): + /@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.18.1)(eslint@8.54.0)(typescript@5.3.2): resolution: {integrity: sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -11541,16 +11673,35 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/parser': 6.13.2(eslint@8.55.0)(typescript@5.3.2) - eslint: 8.55.0 - eslint-plugin-vue: 9.19.2(eslint@8.55.0) + '@typescript-eslint/eslint-plugin': 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + eslint: 8.54.0 + eslint-plugin-vue: 9.18.1(eslint@8.54.0) typescript: 5.3.2 - vue-eslint-parser: 9.3.1(eslint@8.55.0) + vue-eslint-parser: 9.3.1(eslint@8.54.0) transitivePeerDependencies: - supports-color dev: true + /@vue/language-core@1.8.22(typescript@5.3.2): + resolution: {integrity: sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.10.10 + '@volar/source-map': 1.10.10 + '@vue/compiler-dom': 3.3.10 + '@vue/shared': 3.3.10 + computeds: 0.0.1 + minimatch: 9.0.3 + muggle-string: 0.3.1 + typescript: 5.3.2 + vue-template-compiler: 2.7.14 + dev: true + /@vue/language-core@1.8.24(typescript@4.9.3): resolution: {integrity: sha512-2ClHvij0WlsDWryPzXJCSpPc6rusZFNoVtRZGgGGkKCmKuIREDDKmH8j+1tYyxPYyH0qL6pZ6+IHD8KIm5nWAw==} peerDependencies: @@ -11571,26 +11722,6 @@ packages: vue-template-compiler: 2.7.14 dev: true - /@vue/language-core@1.8.24(typescript@5.3.2): - resolution: {integrity: sha512-2ClHvij0WlsDWryPzXJCSpPc6rusZFNoVtRZGgGGkKCmKuIREDDKmH8j+1tYyxPYyH0qL6pZ6+IHD8KIm5nWAw==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.3.10 - '@vue/shared': 3.3.10 - computeds: 0.0.1 - minimatch: 9.0.3 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.3.2 - vue-template-compiler: 2.7.14 - dev: true - /@vue/language-core@1.8.8(typescript@4.9.3): resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} peerDependencies: @@ -11632,7 +11763,7 @@ packages: /@vue/reactivity-transform@3.2.45: resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} dependencies: - '@babel/parser': 7.18.6 + '@babel/parser': 7.23.5 '@vue/compiler-core': 3.2.45 '@vue/shared': 3.2.45 estree-walker: 2.0.2 @@ -11647,6 +11778,16 @@ packages: estree-walker: 2.0.2 magic-string: 0.30.5 + /@vue/reactivity-transform@3.3.8: + resolution: {integrity: sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==} + dependencies: + '@babel/parser': 7.23.0 + '@vue/compiler-core': 3.3.8 + '@vue/shared': 3.3.8 + estree-walker: 2.0.2 + magic-string: 0.30.5 + dev: true + /@vue/reactivity-transform@3.3.9: resolution: {integrity: sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg==} dependencies: @@ -11662,18 +11803,18 @@ packages: '@vue/shared': 3.2.45 dev: true - /@vue/reactivity@3.3.10: - resolution: {integrity: sha512-H5Z7rOY/JLO+e5a6/FEXaQ1TMuOvY4LDVgT+/+HKubEAgs9qeeZ+NhADSeEtrNQeiKLDuzeKc8v0CUFpB6Pqgw==} - dependencies: - '@vue/shared': 3.3.10 - dev: true - /@vue/reactivity@3.3.4: resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} dependencies: '@vue/shared': 3.3.4 dev: true + /@vue/reactivity@3.3.8: + resolution: {integrity: sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==} + dependencies: + '@vue/shared': 3.3.8 + dev: true + /@vue/reactivity@3.3.9: resolution: {integrity: sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw==} dependencies: @@ -11686,11 +11827,11 @@ packages: '@vue/shared': 3.2.45 dev: true - /@vue/runtime-core@3.3.10: - resolution: {integrity: sha512-DZ0v31oTN4YHX9JEU5VW1LoIVgFovWgIVb30bWn9DG9a7oA415idcwsRNNajqTx8HQJyOaWfRKoyuP2P2TYIag==} + /@vue/runtime-core@3.3.8: + resolution: {integrity: sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==} dependencies: - '@vue/reactivity': 3.3.10 - '@vue/shared': 3.3.10 + '@vue/reactivity': 3.3.8 + '@vue/shared': 3.3.8 dev: true /@vue/runtime-core@3.3.9: @@ -11725,6 +11866,10 @@ packages: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} dev: true + /@vue/shared@3.3.8: + resolution: {integrity: sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==} + dev: true + /@vue/shared@3.3.9: resolution: {integrity: sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA==} @@ -11737,24 +11882,12 @@ packages: - typescript dev: true - /@vueuse/core@10.5.0(vue@3.3.9): - resolution: {integrity: sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==} - dependencies: - '@types/web-bluetooth': 0.0.18 - '@vueuse/metadata': 10.5.0 - '@vueuse/shared': 10.5.0(vue@3.3.9) - vue-demi: 0.14.6(vue@3.3.9) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@vueuse/core@10.7.0(vue@3.3.9): - resolution: {integrity: sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==} + /@vueuse/core@10.6.1(vue@3.3.9): + resolution: {integrity: sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q==} dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.7.0 - '@vueuse/shared': 10.7.0(vue@3.3.9) + '@vueuse/metadata': 10.6.1 + '@vueuse/shared': 10.6.1(vue@3.3.9) vue-demi: 0.14.6(vue@3.3.9) transitivePeerDependencies: - '@vue/composition-api' @@ -11765,7 +11898,7 @@ packages: resolution: {integrity: sha512-tqgzeZGoZcXzoit4kOGLWJibDMLp0vdm6ZO41SSUQhkhtrPhAg6dbIEPiahhUu6sZAmSYvVrZgEr5aKD51nrLA==} peerDependencies: '@vue/composition-api': ^1.1.0 - vue: 3.3.9 + vue: ^2.6.0 || ^3.2.0 peerDependenciesMeta: '@vue/composition-api': optional: true @@ -11791,12 +11924,8 @@ packages: - vue dev: false - /@vueuse/metadata@10.5.0: - resolution: {integrity: sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==} - dev: false - - /@vueuse/metadata@10.7.0: - resolution: {integrity: sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==} + /@vueuse/metadata@10.6.1: + resolution: {integrity: sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw==} dev: false /@vueuse/metadata@8.7.5: @@ -11807,17 +11936,8 @@ packages: resolution: {integrity: sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==} dev: false - /@vueuse/shared@10.5.0(vue@3.3.9): - resolution: {integrity: sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==} - dependencies: - vue-demi: 0.14.6(vue@3.3.9) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@vueuse/shared@10.7.0(vue@3.3.9): - resolution: {integrity: sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==} + /@vueuse/shared@10.6.1(vue@3.3.9): + resolution: {integrity: sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q==} dependencies: vue-demi: 0.14.6(vue@3.3.9) transitivePeerDependencies: @@ -11829,7 +11949,7 @@ packages: resolution: {integrity: sha512-THXPvMBFmg6Gf6AwRn/EdTh2mhqwjGsB2Yfp374LNQSQVKRHtnJ0I42bsZTn7nuEliBxqUrGQm/lN6qUHmhJLw==} peerDependencies: '@vue/composition-api': ^1.1.0 - vue: 3.3.9 + vue: ^2.6.0 || ^3.2.0 peerDependenciesMeta: '@vue/composition-api': optional: true @@ -12074,7 +12194,7 @@ packages: '@windicss/config': 1.9.1 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.1 - magic-string: 0.30.4 + magic-string: 0.30.5 micromatch: 4.0.5 windicss: 3.5.6 transitivePeerDependencies: @@ -12128,7 +12248,7 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 acorn-walk: 8.3.0 dev: true @@ -12155,6 +12275,13 @@ packages: dependencies: acorn: 8.10.0 + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + /acorn-loose@6.1.0: resolution: {integrity: sha512-FHhXoiF0Uch3IqsrnPpWwCtiv5PYvipTpT1k9lDMgQVVYc9iDuSl5zdJV358aI8twfHCYMFBRVYvAVki9wC/ng==} engines: {node: '>=0.4.0'} @@ -12631,8 +12758,8 @@ packages: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.17.1 dev: true @@ -12641,8 +12768,8 @@ packages: resolution: {integrity: sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.17.1 dev: true @@ -12843,7 +12970,7 @@ packages: engines: {node: '>= 10.0.0'} requiresBuild: true dependencies: - '@babel/types': 7.22.10 + '@babel/types': 7.23.0 /backo2@1.0.2: resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} @@ -13079,13 +13206,13 @@ packages: run-applescript: 5.0.0 dev: true - /bundle-require@4.0.2(esbuild@0.19.5): + /bundle-require@4.0.2(esbuild@0.18.20): resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' dependencies: - esbuild: 0.19.5 + esbuild: 0.18.20 load-tsconfig: 0.2.3 dev: true @@ -13116,6 +13243,7 @@ packages: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 + dev: true /call-me-maybe@1.0.1: resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} @@ -14145,6 +14273,7 @@ packages: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 + dev: true /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} @@ -14282,7 +14411,7 @@ packages: /dioc@1.0.1(vue@3.3.9): resolution: {integrity: sha512-G3T8ThO2WehWJFrKp687wpXU//WLueJA6t5L7yirhWN/jn7BFNRKwskbJn0LEEd6gqI6rwiQE48f2Zqt5jvYVw==} peerDependencies: - vue: 3.3.9 + vue: ^3.2.25 peerDependenciesMeta: vue: optional: true @@ -14398,6 +14527,11 @@ packages: is-obj: 2.0.0 dev: true + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: false + /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} @@ -15306,7 +15440,7 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-prettier@5.0.1(eslint@8.55.0)(prettier@3.1.0): + /eslint-plugin-prettier@5.0.1(eslint@8.54.0)(prettier@3.1.0): resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -15320,7 +15454,7 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.55.0 + eslint: 8.54.0 prettier: 3.1.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 @@ -15344,19 +15478,19 @@ packages: - supports-color dev: true - /eslint-plugin-vue@9.19.2(eslint@8.55.0): - resolution: {integrity: sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==} + /eslint-plugin-vue@9.18.1(eslint@8.54.0): + resolution: {integrity: sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - eslint: 8.55.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + eslint: 8.54.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.13 semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.55.0) + vue-eslint-parser: 9.3.1(eslint@8.54.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -15584,15 +15718,15 @@ packages: - supports-color dev: true - /eslint@8.55.0: - resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.55.0 + '@eslint/js': 8.54.0 '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -15649,8 +15783,8 @@ packages: resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.3.0 dev: true @@ -15658,8 +15792,8 @@ packages: resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 /espree@9.6.1: @@ -16483,6 +16617,7 @@ packages: has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 + dev: true /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -16842,7 +16977,6 @@ packages: /graphql-language-service-interface@2.10.2(@types/node@17.0.27)(graphql@16.8.1): resolution: {integrity: sha512-RKIEBPhRMWdXY3fxRs99XysTDnEgAvNbu8ov/5iOlnkZsWQNzitjtd0O0l1CutQOQt3iXoHde7w8uhCnKL4tcg==} - deprecated: this package has been merged into graphql-language-service peerDependencies: graphql: ^15.5.0 || ^16.0.0 dependencies: @@ -17099,6 +17233,7 @@ packages: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: get-intrinsic: 1.2.2 + dev: true /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -17768,7 +17903,6 @@ packages: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 - dev: false /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -18092,7 +18226,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.22.10 - '@babel/parser': 7.22.10 + '@babel/parser': 7.23.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 @@ -18105,7 +18239,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.23.2 - '@babel/parser': 7.23.0 + '@babel/parser': 7.23.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 7.5.4 @@ -19491,7 +19625,7 @@ packages: '@jest/types': 29.5.0 '@types/node': 18.18.8 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 3.3.2 graceful-fs: 4.2.11 picomatch: 2.3.1 dev: true @@ -19797,7 +19931,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.10.0 + acorn: 8.11.2 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -20080,14 +20214,14 @@ packages: engines: {node: '>=10'} dev: true + /lilconfig@2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} + engines: {node: '>=10'} + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -21090,15 +21224,6 @@ packages: engines: {node: '>=10'} hasBin: true - /mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.2.0 - dev: true - /mlly@1.4.2: resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: @@ -21309,7 +21434,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.1 semver: 5.7.2 validate-npm-package-license: 3.0.4 dev: true @@ -21351,7 +21476,7 @@ packages: minimatch: 3.1.2 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.1 + shell-quote: 1.7.3 string.prototype.padend: 3.1.3 dev: true @@ -21417,10 +21542,10 @@ packages: /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} @@ -22058,8 +22183,8 @@ packages: camelcase-css: 2.0.1 postcss: 8.4.31 - /postcss-load-config@4.0.2(postcss@8.4.31)(ts-node@10.9.1): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + /postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.1): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} engines: {node: '>= 14'} peerDependencies: postcss: '>=8.0.9' @@ -22070,10 +22195,10 @@ packages: ts-node: optional: true dependencies: - lilconfig: 3.0.0 + lilconfig: 2.0.6 postcss: 8.4.31 ts-node: 10.9.1(@types/node@18.18.8)(typescript@4.9.3) - yaml: 2.3.4 + yaml: 2.3.1 /postcss-nested@6.0.1(postcss@8.4.31): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} @@ -22150,8 +22275,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-tailwindcss@0.5.7(prettier@2.8.4): - resolution: {integrity: sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==} + /prettier-plugin-tailwindcss@0.5.6(prettier@2.8.4): + resolution: {integrity: sha512-2Xgb+GQlkPAUCFi3sV+NOYcSI5XgduvDBL2Zt/hwJudeKXkyvRS65c38SB0yb9UB40+1rL83I6m0RtlOQ8eHdg==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -22205,6 +22330,61 @@ packages: prettier: 2.8.4 dev: true + /prettier-plugin-tailwindcss@0.5.6(prettier@3.1.0): + resolution: {integrity: sha512-2Xgb+GQlkPAUCFi3sV+NOYcSI5XgduvDBL2Zt/hwJudeKXkyvRS65c38SB0yb9UB40+1rL83I6m0RtlOQ8eHdg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@shufo/prettier-plugin-blade': '*' + '@trivago/prettier-plugin-sort-imports': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + prettier-plugin-twig-melody: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@shufo/prettier-plugin-blade': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-twig-melody: + optional: true + dependencies: + prettier: 3.1.0 + dev: false + /prettier-plugin-tailwindcss@0.5.7(prettier@3.1.0): resolution: {integrity: sha512-4v6uESAgwCni6YF6DwJlRaDjg9Z+al5zM4JfngcazMy4WEf/XkPS5TEQjbD+DZ5iNuG6RrKQLa/HuX2SYzC3kQ==} engines: {node: '>=14.21.3'} @@ -22258,6 +22438,7 @@ packages: optional: true dependencies: prettier: 3.1.0 + dev: true /prettier@2.8.4: resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} @@ -22583,7 +22764,7 @@ packages: resolution: {integrity: sha512-Auzy8AhorFt6YGeB53/dzUSINmKKassAyCsr2wpNgG9XoC3i6oUoLuySNUzYIkyCFCGmKdBRBQeyAqPOVteoYw==} dependencies: '@glideapps/ts-necessities': 2.1.3 - '@types/urijs': 1.19.23 + '@types/urijs': 1.19.25 browser-or-node: 2.1.1 collection-utils: 1.0.1 cross-fetch: 4.0.0 @@ -22952,7 +23133,6 @@ packages: is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} @@ -23144,23 +23324,24 @@ packages: optionalDependencies: fsevents: 2.3.3 - /rollup@4.6.1: - resolution: {integrity: sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==} + /rollup@4.7.0: + resolution: {integrity: sha512-7Kw0dUP4BWH78zaZCqF1rPyQ8D5DSU6URG45v1dqS/faNsx9WXyess00uTOZxKr7oR/4TOjO1CPudT8L1UsEgw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.6.1 - '@rollup/rollup-android-arm64': 4.6.1 - '@rollup/rollup-darwin-arm64': 4.6.1 - '@rollup/rollup-darwin-x64': 4.6.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.6.1 - '@rollup/rollup-linux-arm64-gnu': 4.6.1 - '@rollup/rollup-linux-arm64-musl': 4.6.1 - '@rollup/rollup-linux-x64-gnu': 4.6.1 - '@rollup/rollup-linux-x64-musl': 4.6.1 - '@rollup/rollup-win32-arm64-msvc': 4.6.1 - '@rollup/rollup-win32-ia32-msvc': 4.6.1 - '@rollup/rollup-win32-x64-msvc': 4.6.1 + '@rollup/rollup-android-arm-eabi': 4.7.0 + '@rollup/rollup-android-arm64': 4.7.0 + '@rollup/rollup-darwin-arm64': 4.7.0 + '@rollup/rollup-darwin-x64': 4.7.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.7.0 + '@rollup/rollup-linux-arm64-gnu': 4.7.0 + '@rollup/rollup-linux-arm64-musl': 4.7.0 + '@rollup/rollup-linux-riscv64-gnu': 4.7.0 + '@rollup/rollup-linux-x64-gnu': 4.7.0 + '@rollup/rollup-linux-x64-musl': 4.7.0 + '@rollup/rollup-win32-arm64-msvc': 4.7.0 + '@rollup/rollup-win32-ia32-msvc': 4.7.0 + '@rollup/rollup-win32-x64-msvc': 4.7.0 fsevents: 2.3.3 dev: true @@ -23426,6 +23607,7 @@ packages: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 + dev: true /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} @@ -23494,9 +23676,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -24247,7 +24429,7 @@ packages: postcss: 8.4.31 postcss-import: 15.1.0(postcss@8.4.31) postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.2(postcss@8.4.31)(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.1) postcss-nested: 6.0.1(postcss@8.4.31) postcss-selector-parser: 6.0.13 resolve: 1.22.8 @@ -24600,7 +24782,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-jest@27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(jest@27.5.1)(typescript@4.9.5): + /ts-jest@27.1.5(@babel/core@7.23.2)(@types/jest@27.5.2)(jest@27.5.1)(typescript@4.7.4): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -24631,7 +24813,7 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.7 - typescript: 4.9.5 + typescript: 4.7.4 yargs-parser: 20.2.9 dev: true @@ -24669,7 +24851,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.1(@babel/core@7.23.2)(esbuild@0.19.5)(jest@29.7.0)(typescript@5.2.2): + /ts-jest@29.1.1(@babel/core@7.23.2)(esbuild@0.18.20)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -24692,7 +24874,7 @@ packages: dependencies: '@babel/core': 7.23.2 bs-logger: 0.2.6 - esbuild: 0.19.5 + esbuild: 0.18.20 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@17.0.27) jest-util: 29.5.0 @@ -24903,15 +25085,14 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsup@7.3.0(@swc/core@1.3.100)(typescript@5.2.2): - resolution: {integrity: sha512-Ja1eaSRrE+QarmATlNO5fse2aOACYMBX+IZRKy1T+gpyH+jXgRrl5l4nHIQJQ1DoDgEjHDTw8cpE085UdBZuWQ==} - engines: {node: '>=18'} - deprecated: Breaking node 16 + /tsup@7.2.0(@swc/core@1.3.95)(typescript@5.2.2): + resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} + engines: {node: '>=16.14'} hasBin: true peerDependencies: '@swc/core': ^1 postcss: ^8.4.12 - typescript: '>=4.5.0' + typescript: '>=4.1.0' peerDependenciesMeta: '@swc/core': optional: true @@ -24920,18 +25101,18 @@ packages: typescript: optional: true dependencies: - '@swc/core': 1.3.100 - bundle-require: 4.0.2(esbuild@0.19.5) + '@swc/core': 1.3.95 + bundle-require: 4.0.2(esbuild@0.18.20) cac: 6.7.14 chokidar: 3.5.3 debug: 4.3.4(supports-color@9.2.2) - esbuild: 0.19.5 + esbuild: 0.18.20 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.31)(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.1) resolve-from: 5.0.0 - rollup: 4.6.1 + rollup: 3.29.4 source-map: 0.8.0-beta.0 sucrase: 3.23.0 tree-kill: 1.2.2 @@ -24941,6 +25122,16 @@ packages: - ts-node dev: true + /tsutils@3.21.0(typescript@4.7.4): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.7.4 + dev: true + /tsutils@3.21.0(typescript@4.9.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -25062,6 +25253,12 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + /typescript@4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /typescript@4.9.3: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} @@ -25104,10 +25301,6 @@ packages: resolution: {integrity: sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==} dev: true - /ufo@1.2.0: - resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} - dev: true - /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} @@ -25361,7 +25554,7 @@ packages: - supports-color dev: true - /unplugin-icons@0.17.4(@vue/compiler-sfc@3.3.10): + /unplugin-icons@0.17.4(@vue/compiler-sfc@3.3.8): resolution: {integrity: sha512-PHLxjBx3ZV8RUBvfMafFl8uWH88jHeZgOijcRpkwgne7y2Ovx7WI0Ltzzw3fjZQ7dGaDhB8udyKVdm9N2S6BIw==} peerDependencies: '@svgr/core': '>=7.0.0' @@ -25384,7 +25577,7 @@ packages: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.6 '@iconify/utils': 2.1.12 - '@vue/compiler-sfc': 3.3.10 + '@vue/compiler-sfc': 3.3.8 debug: 4.3.4(supports-color@9.2.2) kolorist: 1.8.0 local-pkg: 0.5.0 @@ -25398,7 +25591,7 @@ packages: engines: {node: '>=14'} peerDependencies: '@babel/parser': ^7.15.8 - vue: 3.3.9 + vue: 2 || 3 peerDependenciesMeta: '@babel/parser': optional: true @@ -25427,7 +25620,7 @@ packages: engines: {node: '>=14'} peerDependencies: '@babel/parser': ^7.15.8 - vue: 3.3.9 + vue: 2 || 3 peerDependenciesMeta: '@babel/parser': optional: true @@ -25456,7 +25649,7 @@ packages: engines: {node: '>=14'} peerDependencies: '@babel/parser': ^7.15.8 - vue: 3.3.9 + vue: 2 || 3 peerDependenciesMeta: '@babel/parser': optional: true @@ -25486,7 +25679,7 @@ packages: peerDependencies: '@babel/parser': ^7.15.8 '@nuxt/kit': ^3.2.2 - vue: 3.3.9 + vue: 2 || 3 peerDependenciesMeta: '@babel/parser': optional: true @@ -25494,7 +25687,7 @@ packages: optional: true dependencies: '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.0.3(rollup@2.79.1) chokidar: 3.5.3 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.1 @@ -25515,7 +25708,7 @@ packages: peerDependencies: '@babel/parser': ^7.15.8 '@nuxt/kit': ^3.2.2 - vue: 3.3.9 + vue: 2 || 3 peerDependenciesMeta: '@babel/parser': optional: true @@ -25523,7 +25716,7 @@ packages: optional: true dependencies: '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.0.3(rollup@3.29.4) chokidar: 3.5.3 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.1 @@ -25656,7 +25849,7 @@ packages: webpack: optional: true dependencies: - acorn: 8.11.2 + acorn: 8.10.0 chokidar: 3.5.3 vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0) webpack-sources: 3.2.3 @@ -25666,7 +25859,7 @@ packages: /unplugin@1.2.0: resolution: {integrity: sha512-7lJXQY4CxOK4jZyVskZuuNBqBSOlxezKqBpfQEpH+Odk2Ban3moKAlvzs9rZuZoZp6/1FEhvY9TZXav2FRhaBg==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 chokidar: 3.5.3 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -25855,6 +26048,12 @@ packages: /validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} + dev: false + + /validator@13.7.0: + resolution: {integrity: sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==} + engines: {node: '>= 0.10'} + dev: true /value-or-promise@1.0.12: resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==} @@ -25879,7 +26078,7 @@ packages: hasBin: true dependencies: debug: 4.3.4(supports-color@9.2.2) - mlly: 1.4.0 + mlly: 1.4.2 pathe: 0.2.0 source-map: 0.6.1 source-map-support: 0.5.21 @@ -25956,7 +26155,7 @@ packages: vscode-uri: 3.0.3 dev: true - /vite-plugin-checker@0.6.2(eslint@8.55.0)(typescript@5.3.2)(vite@4.5.0)(vue-tsc@1.8.24): + /vite-plugin-checker@0.6.2(eslint@8.54.0)(typescript@5.3.2)(vite@4.5.0)(vue-tsc@1.8.22): resolution: {integrity: sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==} engines: {node: '>=14.16'} peerDependencies: @@ -25992,7 +26191,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 commander: 8.3.0 - eslint: 8.55.0 + eslint: 8.54.0 fast-glob: 3.3.1 fs-extra: 11.1.1 lodash.debounce: 4.0.8 @@ -26007,7 +26206,7 @@ packages: vscode-languageserver: 7.0.0 vscode-languageserver-textdocument: 1.0.8 vscode-uri: 3.0.7 - vue-tsc: 1.8.24(typescript@5.3.2) + vue-tsc: 1.8.22(typescript@5.3.2) dev: true /vite-plugin-dts@3.2.0(@types/node@17.0.27)(sass@1.53.0)(terser@5.24.0)(typescript@4.9.3): @@ -26017,7 +26216,7 @@ packages: typescript: '*' dependencies: '@microsoft/api-extractor': 7.36.3(@types/node@17.0.27) - '@rollup/pluginutils': 5.0.3(rollup@3.29.4) + '@rollup/pluginutils': 5.0.2(rollup@3.29.4) '@rushstack/node-core-library': 3.59.6(@types/node@17.0.27) '@vue/language-core': 1.8.8(typescript@4.9.3) debug: 4.3.4(supports-color@9.2.2) @@ -26073,7 +26272,6 @@ packages: /vite-plugin-fonts@0.7.0(vite@4.5.0): resolution: {integrity: sha512-fisKirkQrA2RFwcyI96SENLu1FyRYNIiC/l5DGdD8oV3OsAWGrYKs0e7/VZF6l0rm0QiYA2sOVTzYfrLAzP9cw==} - deprecated: renamed to `unplugin-fonts`, see https://github.com/cssninjaStudio/unplugin-fonts/releases/tag/v1.0.0 peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: @@ -26243,7 +26441,7 @@ packages: - supports-color dev: true - /vite-plugin-pages@0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0): + /vite-plugin-pages@0.31.0(@vue/compiler-sfc@3.3.8)(vite@4.5.0): resolution: {integrity: sha512-fw3onBfVTXQI7rOzAbSZhmfwvk50+3qNnGZpERjmD93c8nEjrGLyd53eFXYMxcJV4KA1vzi4qIHt2+6tS4dEMw==} peerDependencies: '@vue/compiler-sfc': ^2.7.0 || ^3.0.0 @@ -26253,7 +26451,7 @@ packages: optional: true dependencies: '@types/debug': 4.1.8 - '@vue/compiler-sfc': 3.3.10 + '@vue/compiler-sfc': 3.3.8 debug: 4.3.4(supports-color@9.2.2) deep-equal: 2.2.2 extract-comments: 1.1.0 @@ -26326,8 +26524,8 @@ packages: - supports-color dev: true - /vite-plugin-pwa@0.17.3(vite@4.5.0)(workbox-build@7.0.0)(workbox-window@7.0.0): - resolution: {integrity: sha512-ilOs0mGxIxKQN3FZYX8pys5DmY/wI9A6oojlY5rrd7mAxCVcSbtjDVAhm62C+3Ww6KQrNr/jmiRUCplC8AsaBw==} + /vite-plugin-pwa@0.17.0(vite@4.5.0)(workbox-build@7.0.0)(workbox-window@7.0.0): + resolution: {integrity: sha512-cOyEG8EEc7JHmyMapTnjK2j0g2BIC3ErlmOHyGzVu8hqjyF9Jt6yWMmVNFtpA6v/NNyzP28ARf3vwzIAzR1kaw==} engines: {node: '>=16.0.0'} peerDependencies: vite: ^3.1.0 || ^4.0.0 || ^5.0.0 @@ -26374,7 +26572,7 @@ packages: resolution: {integrity: sha512-k5XDmRNFo4M/GmUjhbRXj2WmJiFcGoVI8l/uZ72RHyRDQr4wE/6Zq/KFq0lqXomWQxTSzakQRUswzNwtvZLE8A==} peerDependencies: vite: ^2.5.0 || ^3.0.0-0 - vue: 3.3.9 + vue: ^2.6.12 || ^3.2.4 vue-router: ^3.5.1 || ^ 4.0.11 dependencies: '@vue/compiler-sfc': 3.3.10 @@ -26391,7 +26589,7 @@ packages: resolution: {integrity: sha512-k5XDmRNFo4M/GmUjhbRXj2WmJiFcGoVI8l/uZ72RHyRDQr4wE/6Zq/KFq0lqXomWQxTSzakQRUswzNwtvZLE8A==} peerDependencies: vite: ^2.5.0 || ^3.0.0-0 - vue: 3.3.9 + vue: ^2.6.12 || ^3.2.4 vue-router: ^3.5.1 || ^ 4.0.11 dependencies: '@vue/compiler-sfc': 3.3.10 @@ -26408,7 +26606,7 @@ packages: resolution: {integrity: sha512-k5XDmRNFo4M/GmUjhbRXj2WmJiFcGoVI8l/uZ72RHyRDQr4wE/6Zq/KFq0lqXomWQxTSzakQRUswzNwtvZLE8A==} peerDependencies: vite: ^2.5.0 || ^3.0.0-0 - vue: 3.3.9 + vue: ^2.6.12 || ^3.2.4 vue-router: ^3.5.1 || ^ 4.0.11 dependencies: '@vue/compiler-sfc': 3.3.10 @@ -26425,10 +26623,10 @@ packages: resolution: {integrity: sha512-UZW2nSV2LraTSe7gsAL46hfdi7a0X1RvkGGoJVtA2O8beu7anzpXFwQLou8+kHy31CzVycT4gIPySBsHhtBN5g==} peerDependencies: vite: ^2.5.0 || ^3.0.0-0 || ^4.0.0 - vue: 3.3.9 + vue: ^2.6.12 || ^3.2.4 vue-router: ^3.5.1 || ^4.0.11 dependencies: - '@vue/compiler-sfc': 3.3.10 + '@vue/compiler-sfc': 3.3.8 debug: 4.3.4(supports-color@9.2.2) fast-glob: 3.3.1 vite: 4.5.0(@types/node@17.0.27)(sass@1.69.5)(terser@5.24.0) @@ -26589,7 +26787,7 @@ packages: dependencies: '@types/node': 17.0.27 esbuild: 0.18.20 - postcss: 8.4.32 + postcss: 8.4.31 rollup: 3.29.4 sass: 1.69.5 terser: 5.24.0 @@ -26634,8 +26832,8 @@ packages: fsevents: 2.3.3 dev: true - /vite@5.0.5(@types/node@17.0.45): - resolution: {integrity: sha512-OekeWqR9Ls56f3zd4CaxzbbS11gqYkEiBtnWFFgYR2WV8oPJRRKq0mpskYy/XaoCL3L7VINDhqqOMNDiYdGvGg==} + /vite@5.0.4(@types/node@17.0.45): + resolution: {integrity: sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -26665,7 +26863,7 @@ packages: '@types/node': 17.0.45 esbuild: 0.19.5 postcss: 8.4.32 - rollup: 4.6.1 + rollup: 4.7.0 optionalDependencies: fsevents: 2.3.3 dev: true @@ -26911,7 +27109,7 @@ packages: requiresBuild: true peerDependencies: '@vue/composition-api': ^1.0.0-rc.1 - vue: 3.3.9 + vue: ^3.0.0-0 || ^2.6.0 peerDependenciesMeta: '@vue/composition-api': optional: true @@ -26926,7 +27124,7 @@ packages: requiresBuild: true peerDependencies: '@vue/composition-api': ^1.0.0-rc.1 - vue: 3.3.9 + vue: ^3.0.0-0 || ^2.6.0 peerDependenciesMeta: '@vue/composition-api': optional: true @@ -26941,7 +27139,7 @@ packages: requiresBuild: true peerDependencies: '@vue/composition-api': ^1.0.0-rc.1 - vue: 3.3.9 + vue: ^3.0.0-0 || ^2.6.0 peerDependenciesMeta: '@vue/composition-api': optional: true @@ -27003,14 +27201,14 @@ packages: - supports-color dev: true - /vue-eslint-parser@9.3.1(eslint@8.55.0): + /vue-eslint-parser@9.3.1(eslint@8.54.0): resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4(supports-color@9.2.2) - eslint: 8.55.0 + eslint: 8.54.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -27025,7 +27223,7 @@ packages: resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} engines: {node: '>= 14'} peerDependencies: - vue: 3.3.9 + vue: ^3.0.0 dependencies: '@intlify/core-base': 9.2.2 '@intlify/shared': 9.2.2 @@ -27034,14 +27232,14 @@ packages: vue: 3.3.9(typescript@4.9.3) dev: false - /vue-i18n@9.8.0(vue@3.3.9): - resolution: {integrity: sha512-Izho+6PYjejsTq2mzjcRdBZ5VLRQoSuuexvR8029h5CpN03FYqiqBrShMyf2I1DKkN6kw/xmujcbvC+4QybpsQ==} + /vue-i18n@9.7.1(vue@3.3.9): + resolution: {integrity: sha512-A6DzWqJQMdzBj+392+g3zIgGV0FnFC7o/V+txs5yIALANEZzY6ZV8hM2wvZR3nTbQI7dntAmzBHMeoEteJO0kQ==} engines: {node: '>= 16'} peerDependencies: - vue: 3.3.9 + vue: ^3.0.0 dependencies: - '@intlify/core-base': 9.8.0 - '@intlify/shared': 9.8.0 + '@intlify/core-base': 9.7.1 + '@intlify/shared': 9.7.1 '@vue/devtools-api': 6.5.1 vue: 3.3.9(typescript@5.3.2) @@ -27049,7 +27247,7 @@ packages: resolution: {integrity: sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 - vue: 3.3.9 + vue: ^3.2.13 webpack: ^4.1.0 || ^5.0.0-0 peerDependenciesMeta: '@vue/compiler-sfc': @@ -27068,7 +27266,7 @@ packages: /vue-pdf-embed@1.2.1(vue@3.3.9): resolution: {integrity: sha512-4uUm4wxaEGT9cS1cyuagAmMJjBxfQXWG1MvdGPesD3CiXhhSp4i0VMUCYwhFXtZ5+QqWv4mXbfLJ29Wpt+Qcuw==} peerDependencies: - vue: 3.3.9 + vue: ^2.x || ^3.x dependencies: vue: 3.3.9(typescript@5.3.2) dev: false @@ -27076,7 +27274,7 @@ packages: /vue-router@4.1.0(vue@3.3.9): resolution: {integrity: sha512-A+dYO0ZXLJFZ40ebW3XtqehCW0Wv2xNH4lFddOByDja4NtItEdyirrShTlvD3UA4xc5a5mG2RRI30BusYpOb9g==} peerDependencies: - vue: 3.3.9 + vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.5.0 vue: 3.3.9(typescript@4.9.3) @@ -27084,7 +27282,7 @@ packages: /vue-router@4.2.5(vue@3.3.9): resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==} peerDependencies: - vue: 3.3.9 + vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.5.1 vue: 3.3.9(typescript@5.3.2) @@ -27099,7 +27297,7 @@ packages: /vue-tippy@6.0.0-alpha.58(vue@3.3.9): resolution: {integrity: sha512-kfpkFZMvua+nTn9Mqx3v5UrY8rlu3nHiOoGKO1bhSM0CUG8ISygfofSDwLDUW6wAcAHABkF7vcp5sPqhTb26CA==} peerDependencies: - vue: 3.3.9 + vue: ^3.0.0 dependencies: tippy.js: 6.3.7 vue: 3.3.9(typescript@4.9.3) @@ -27108,7 +27306,7 @@ packages: /vue-tippy@6.3.1(vue@3.3.9): resolution: {integrity: sha512-U2jpGwmwg+u/a36/XDnGlOF+W944xHGlVELsrTNWmZ0nUi2E/VW0c/buBkzntFUwRh6BHwFWcKL8BHcyG2mogQ==} peerDependencies: - vue: 3.3.9 + vue: ^3.2.0 dependencies: tippy.js: 6.3.7 vue: 3.3.9(typescript@5.3.2) @@ -27134,6 +27332,18 @@ packages: typescript: 4.9.3 dev: true + /vue-tsc@1.8.22(typescript@5.3.2): + resolution: {integrity: sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.10.10 + '@vue/language-core': 1.8.22(typescript@5.3.2) + semver: 7.5.4 + typescript: 5.3.2 + dev: true + /vue-tsc@1.8.24(typescript@4.9.3): resolution: {integrity: sha512-eH1CSj231OzVEY5Hi7wS6ubzyOEwgr5jCptR0Ddf2SitGcaXIsPVDvrprm3eolCdyhDt3WS1Eb2F4fGX9BsUUw==} hasBin: true @@ -27146,18 +27356,6 @@ packages: typescript: 4.9.3 dev: true - /vue-tsc@1.8.24(typescript@5.3.2): - resolution: {integrity: sha512-eH1CSj231OzVEY5Hi7wS6ubzyOEwgr5jCptR0Ddf2SitGcaXIsPVDvrprm3eolCdyhDt3WS1Eb2F4fGX9BsUUw==} - hasBin: true - peerDependencies: - typescript: '*' - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.24(typescript@5.3.2) - semver: 7.5.4 - typescript: 5.3.2 - dev: true - /vue-tsc@1.8.8(typescript@4.9.5): resolution: {integrity: sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==} hasBin: true @@ -27218,7 +27416,7 @@ packages: /vuedraggable-es@4.1.1(vue@3.3.9): resolution: {integrity: sha512-F35pjSwC8HS/lnaOd+B59nYR4FZmwuhWAzccK9xftRuWds8SU1TZh5myKVM86j5dFOI7S26O64Kwe7LUHnXjlA==} peerDependencies: - vue: 3.3.9 + vue: ^3.2.31 dependencies: sortablejs: 1.14.0 vue: 3.3.9(typescript@5.3.2) @@ -28113,7 +28311,7 @@ packages: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.3.4 + yaml: 2.3.1 dev: false /yaml@1.10.2: @@ -28124,10 +28322,6 @@ packages: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -28256,7 +28450,7 @@ packages: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 - validator: 13.11.0 + validator: 13.7.0 optionalDependencies: commander: 9.5.0 dev: true @@ -28268,8 +28462,8 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - github.com/tauri-apps/tauri-plugin-store/6e19887b1bdea9b921a31993d72396a350731e07: - resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/6e19887b1bdea9b921a31993d72396a350731e07} + github.com/tauri-apps/tauri-plugin-store/3367248b2661abcb73d2a89f30df780c387fb57d: + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-store/tar.gz/3367248b2661abcb73d2a89f30df780c387fb57d} name: tauri-plugin-store-api version: 0.0.0 dependencies: