diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 558ff855a7..52b8c4cb45 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -7,7 +7,7 @@ "database", "cache", "rabbitmq", - "testcase", + "storage", "test-database" ], "workspaceFolder": "/workspace", diff --git a/.env.stage b/.env.stage index bc73955011..b60c7aba04 100644 --- a/.env.stage +++ b/.env.stage @@ -22,17 +22,26 @@ RABBITMQ_CONSUMER_CONNECTION_NAME=iris-consumer RABBITMQ_CONSUMER_TAG=consumer RABBITMQ_PRODUCER_CONNECTION_NAME=iris-producer +# Storage +STORAGE_BUCKET_ENDPOINT_URL=http://127.0.0.1:9000 # Testcase Endpoint TESTCASE_BUCKET_NAME=test-bucket -TESTCASE_ENDPOINT_URL=http://127.0.0.1:9000 +# TESTCASE_ENDPOINT_URL=http://127.0.0.1:9000 TESTCASE_ACCESS_KEY=skku TESTCASE_SECRET_KEY=skku1234 +# Media Upload Endpoint +MEDIA_BUCKET_NAME=image-bucket +# MEDIA_BUCKET_BASE_URL=http://127.0.0.1:9000/image-bucket/ +MEDIA_ACCESS_KEY=skku +MEDIA_SECRET_KEY=skku1234 + REDIS_HOST=127.0.0.1 REDIS_PORT=6380 DATABASE_URL=postgresql://postgres:1234@127.0.0.1:5433/skkuding?schema=public TEST_DATABASE_URL=postgresql://postgres:1234@127.0.0.1:5434/skkuding?schema=public + # TODO: Add information where each of these variables are used # TODO: I want to edit values after the container is created... diff --git a/.gitpod.yml b/.gitpod.yml index 51c1ca3a13..89a3c3d58f 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -23,7 +23,7 @@ ports: - port: 15672 # RabbitMQ Dashboard onOpen: ignore - - port: 30000 # Testcase Server + - port: 30000 # Storage Server onOpen: ignore tasks: diff --git a/apps/backend/apps/admin/src/problem/model/image.output.ts b/apps/backend/apps/admin/src/problem/model/image.output.ts new file mode 100644 index 0000000000..b70a88931e --- /dev/null +++ b/apps/backend/apps/admin/src/problem/model/image.output.ts @@ -0,0 +1,7 @@ +import { Field, ObjectType } from '@nestjs/graphql' + +@ObjectType({ description: 'image' }) +export class ImageSource { + @Field(() => String) + src: string +} diff --git a/apps/backend/apps/admin/src/problem/problem.module.ts b/apps/backend/apps/admin/src/problem/problem.module.ts index a701925fc8..2d91f3ed09 100644 --- a/apps/backend/apps/admin/src/problem/problem.module.ts +++ b/apps/backend/apps/admin/src/problem/problem.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common' +import { ConfigModule } from '@nestjs/config' import { StorageModule } from '@admin/storage/storage.module' import { ProblemTagResolver, TagResolver } from './problem-tag.resolver' import { @@ -9,7 +10,7 @@ import { import { ProblemService } from './problem.service' @Module({ - imports: [StorageModule], + imports: [StorageModule, ConfigModule], providers: [ ProblemResolver, ProblemTagResolver, diff --git a/apps/backend/apps/admin/src/problem/problem.resolver.ts b/apps/backend/apps/admin/src/problem/problem.resolver.ts index 8c713f448c..9a83cfe470 100644 --- a/apps/backend/apps/admin/src/problem/problem.resolver.ts +++ b/apps/backend/apps/admin/src/problem/problem.resolver.ts @@ -19,12 +19,14 @@ import { } from '@nestjs/graphql' import { ContestProblem, + Image, Problem, ProblemTag, ProblemTestcase, WorkbookProblem } from '@generated' import { Prisma } from '@prisma/client' +import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library' import { AuthenticatedRequest } from '@libs/auth' import { OPEN_SPACE_ID } from '@libs/constants' import { @@ -33,6 +35,7 @@ import { UnprocessableDataException } from '@libs/exception' import { CursorValidationPipe, GroupIDPipe, RequiredIntPipe } from '@libs/pipe' +import { ImageSource } from './model/image.output' import { CreateProblemInput, UploadFileInput, @@ -105,6 +108,43 @@ export class ProblemResolver { } } + @Mutation(() => ImageSource) + async uploadImage( + @Args('input') input: UploadFileInput, + @Context('req') req: AuthenticatedRequest + ) { + try { + return await this.problemService.uploadImage(input, req.user.id) + } catch (error) { + if (error instanceof UnprocessableDataException) { + throw error.convert2HTTPException() + } + this.logger.error(error) + throw new InternalServerErrorException() + } + } + + @Mutation(() => Image) + async deleteImage( + @Args('filename') filename: string, + @Context('req') req: AuthenticatedRequest + ) { + try { + return await this.problemService.deleteImage(filename, req.user.id) + } catch (error) { + if (error instanceof UnprocessableDataException) { + throw error.convert2HTTPException() + } else if ( + error instanceof PrismaClientKnownRequestError && + error.code == 'P2025' + ) { + throw new NotFoundException(error.message) + } + this.logger.error(error) + throw new InternalServerErrorException() + } + } + @Query(() => [Problem]) async getProblems( @Args( diff --git a/apps/backend/apps/admin/src/problem/problem.service.spec.ts b/apps/backend/apps/admin/src/problem/problem.service.spec.ts index 1077a85879..831597f5d9 100644 --- a/apps/backend/apps/admin/src/problem/problem.service.spec.ts +++ b/apps/backend/apps/admin/src/problem/problem.service.spec.ts @@ -11,7 +11,7 @@ import { UnprocessableDataException } from '@libs/exception' import { PrismaService } from '@libs/prisma' -import { S3Provider } from '@admin/storage/s3.provider' +import { S3MediaProvider, S3Provider } from '@admin/storage/s3.provider' import { StorageService } from '@admin/storage/storage.service' import { exampleContest, @@ -96,6 +96,7 @@ describe('ProblemService', () => { StorageService, ConfigService, S3Provider, + S3MediaProvider, { provide: CACHE_MANAGER, useValue: { del: () => null } } ] }).compile() diff --git a/apps/backend/apps/admin/src/problem/problem.service.ts b/apps/backend/apps/admin/src/problem/problem.service.ts index bdfb67ba90..688b35b208 100644 --- a/apps/backend/apps/admin/src/problem/problem.service.ts +++ b/apps/backend/apps/admin/src/problem/problem.service.ts @@ -5,12 +5,17 @@ import { Injectable, InternalServerErrorException } from '@nestjs/common' +import { ConfigService } from '@nestjs/config' import { Language } from '@generated' import type { ContestProblem, Tag, WorkbookProblem } from '@generated' import { Level } from '@generated' import type { ProblemWhereInput } from '@generated' import { Prisma } from '@prisma/client' +import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library' +import { randomUUID } from 'crypto' import { Workbook } from 'exceljs' +import type { ReadStream } from 'fs' +import { MAX_IMAGE_SIZE } from '@libs/constants' import { DuplicateFoundException, EntityNotExistException, @@ -41,6 +46,7 @@ export class ProblemService { constructor( private readonly prisma: PrismaService, private readonly storageService: StorageService, + private readonly config: ConfigService, @Inject(CACHE_MANAGER) private readonly cacheManager: Cache ) {} @@ -133,25 +139,20 @@ export class ProblemService { throw new UnprocessableDataException( 'Extensions except Excel(.xlsx, .xls) are not supported.' ) - const header = {} const problems: CreateProblemInput[] = [] - const workbook = new Workbook() const worksheet = (await workbook.xlsx.read(createReadStream())) .worksheets[0] - worksheet.getRow(1).eachCell((cell, idx) => { if (!ImportedProblemHeader.includes(cell.text)) throw new UnprocessableFileDataException( - `Field ${cell.text} is not supported`, - filename, - 1 + `Field ${cell.text} is not supported: ${1}`, + filename ) header[cell.text] = idx }) worksheet.spliceRows(1, 1) - const unsupportedFields = [ header['InputFileName'], header['InputFilePath'], @@ -162,9 +163,8 @@ export class ProblemService { for (const colNumber of unsupportedFields) { if (row.getCell(colNumber).text !== '') throw new UnprocessableFileDataException( - 'Using inputFile, outputFile is not supported', - filename, - rowNumber + 1 + `Using inputFile, outputFile is not supported: ${rowNumber + 1}`, + filename ) } const title = row.getCell(header['문제제목']).text @@ -174,17 +174,13 @@ export class ProblemService { const languages: Language[] = [] const level: Level = Level['Level' + levelText] const template: Template[] = [] - for (let text of languagesText) { if (text === 'Python') { text = 'Python3' } - if (!(text in Language)) continue - const language = text as keyof typeof Language const code = row.getCell(header[`${language}SampleCode`]).text - template.push({ language, code: [ @@ -197,42 +193,33 @@ export class ProblemService { }) languages.push(Language[language]) } - if (!languages.length) { throw new UnprocessableFileDataException( - 'A problem should support at least one language', - filename, - rowNumber + 1 + `A problem should support at least one language: ${rowNumber + 1}`, + filename ) } - //TODO: specify timeLimit, memoryLimit(default: 2sec, 512mb) - const testCnt = parseInt(row.getCell(header['TestCnt']).text) const inputText = row.getCell(header['Input']).text const outputs = row.getCell(header['Output']).text.split('::') const scoreWeights = row.getCell(header['Score']).text.split('::') - if (testCnt === 0) return - let inputs: string[] = [] if (inputText === '' && testCnt !== 0) { for (let i = 0; i < testCnt; i++) inputs.push('') } else { inputs = inputText.split('::') } - if ( (inputs.length !== testCnt || outputs.length !== testCnt) && inputText != '' ) { throw new UnprocessableFileDataException( - 'TestCnt must match the length of Input and Output. Or Testcases should not include ::.', - filename, - rowNumber + 1 + `TestCnt must match the length of Input and Output. Or Testcases should not include ::. :${rowNumber + 1}`, + filename ) } - const testcaseInput: Testcase[] = [] for (let i = 0; i < testCnt; i++) { testcaseInput.push({ @@ -241,7 +228,6 @@ export class ProblemService { scoreWeight: parseInt(scoreWeights[i]) || undefined }) } - problems.push({ title, description, @@ -260,7 +246,6 @@ export class ProblemService { samples: [] }) }) - return await Promise.all( problems.map(async (data) => { const problem = await this.createProblem(data, userId, groupId) @@ -269,6 +254,92 @@ export class ProblemService { ) } + async uploadImage(input: UploadFileInput, userId: number) { + const { mimetype, createReadStream } = await input.file + const newFilename = randomUUID() + + if (!mimetype.includes('image/')) { + throw new UnprocessableDataException('Only image files can be accepted') + } + + const fileSize = await this.getFileSize(createReadStream()) + try { + await this.storageService.uploadImage( + newFilename, + fileSize, + createReadStream(), + mimetype + ) + await this.prisma.image.create({ + data: { + filename: newFilename, + createdById: userId + } + }) + } catch (error) { + if (error instanceof PrismaClientKnownRequestError) { + await this.storageService.deleteImage(newFilename) // 이미지가 S3에 업로드되었지만, DB에 이미지 정보 등록을 실패한 경우 rollback + } + throw new UnprocessableFileDataException( + 'Error occurred during image upload.', + newFilename + ) + } + + return { + src: + this.config.get('STORAGE_BUCKET_ENDPOINT_URL') + + '/' + + this.config.get('MEDIA_BUCKET_NAME') + + '/' + + newFilename + } + } + + async deleteImage(filename: string, userId: number) { + const image = this.prisma.image.delete({ + where: { + filename, + createdById: userId + } + }) + const s3ImageDeleteResult = this.storageService.deleteImage(filename) + + const [resolvedImage] = await Promise.all([image, s3ImageDeleteResult]) + return resolvedImage + } + + async getFileSize(readStream: ReadStream): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = [] + + readStream.on('data', (chunk: Buffer) => { + chunks.push(chunk) + + const totalSize = chunks.reduce((acc, chunk) => acc + chunk.length, 0) + if (totalSize > MAX_IMAGE_SIZE) { + readStream.destroy() + reject( + new UnprocessableDataException('File size exceeds maximum limit') + ) + } + }) + + readStream.on('end', () => { + const fileSize = chunks.reduce((acc, chunk) => acc + chunk.length, 0) + resolve(fileSize) + }) + + readStream.on('error', () => { + reject( + new UnprocessableDataException( + 'Error occurred during calculating image size.' + ) + ) + }) + }) + } + async getProblems( input: FilterProblemsInput, groupId: number, @@ -434,16 +505,43 @@ export class ProblemService { } async deleteProblem(id: number, groupId: number) { - await this.getProblem(id, groupId) + const problem = await this.getProblem(id, groupId) const result = await this.prisma.problem.delete({ where: { id } }) await this.storageService.deleteObject(`${id}.json`) + const uuidImageFileNames = this.extractUUIDs(problem.description) + if (uuidImageFileNames) { + await this.prisma.image.deleteMany({ + where: { + filename: { + in: uuidImageFileNames + } + } + }) + + const deleteFromS3Results = uuidImageFileNames.map((filename: string) => { + return this.storageService.deleteImage(filename) + }) + + await Promise.all(deleteFromS3Results) + } + return result } + extractUUIDs(input: string) { + const uuidRegex = + /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi + const matches = input.match(uuidRegex) + if (!matches) { + return [] + } + return matches + } + async getWorkbookProblems( groupId: number, workbookId: number diff --git a/apps/backend/apps/admin/src/storage/s3.provider.ts b/apps/backend/apps/admin/src/storage/s3.provider.ts index 2048e55b2d..98cd0b91d7 100644 --- a/apps/backend/apps/admin/src/storage/s3.provider.ts +++ b/apps/backend/apps/admin/src/storage/s3.provider.ts @@ -9,7 +9,8 @@ export const S3Provider = { new S3Client({ region: 'ap-northeast-2', // TODO: production 환경에서는 endpoint, forcePathStyle 삭제 - endpoint: config.get('TESTCASE_ENDPOINT_URL'), + // endpoint: config.get('TESTCASE_ENDPOINT_URL'), + endpoint: config.get('STORAGE_BUCKET_ENDPOINT_URL'), forcePathStyle: true, credentials: { accessKeyId: config.get('TESTCASE_ACCESS_KEY') ?? '', @@ -17,3 +18,20 @@ export const S3Provider = { } }) } + +export const S3MediaProvider = { + provide: 'S3_CLIENT_MEDIA', + import: [ConfigModule], + inject: [ConfigService], + useFactory: async (config: ConfigService) => + new S3Client({ + region: 'ap-northeast-2', + // TODO: production 환경에서는 endpoint, forcePathStyle 삭제 + endpoint: config.get('STORAGE_BUCKET_ENDPOINT_URL'), + forcePathStyle: true, + credentials: { + accessKeyId: config.get('MEDIA_ACCESS_KEY') ?? '', + secretAccessKey: config.get('MEDIA_SECRET_KEY') ?? '' + } + }) +} diff --git a/apps/backend/apps/admin/src/storage/storage.module.ts b/apps/backend/apps/admin/src/storage/storage.module.ts index 33a014f8a0..b3e3715b8f 100644 --- a/apps/backend/apps/admin/src/storage/storage.module.ts +++ b/apps/backend/apps/admin/src/storage/storage.module.ts @@ -1,11 +1,11 @@ import { Module } from '@nestjs/common' import { ConfigModule } from '@nestjs/config' -import { S3Provider } from './s3.provider' +import { S3MediaProvider, S3Provider } from './s3.provider' import { StorageService } from './storage.service' @Module({ imports: [ConfigModule], - providers: [S3Provider, StorageService], + providers: [S3Provider, S3MediaProvider, StorageService], exports: [StorageService] }) export class StorageModule {} diff --git a/apps/backend/apps/admin/src/storage/storage.service.spec.ts b/apps/backend/apps/admin/src/storage/storage.service.spec.ts index e6c391a186..817e0143fa 100644 --- a/apps/backend/apps/admin/src/storage/storage.service.spec.ts +++ b/apps/backend/apps/admin/src/storage/storage.service.spec.ts @@ -1,7 +1,7 @@ import { ConfigService } from '@nestjs/config' import { Test, type TestingModule } from '@nestjs/testing' import { expect } from 'chai' -import { S3Provider } from './s3.provider' +import { S3MediaProvider, S3Provider } from './s3.provider' import { StorageService } from './storage.service' describe('StorageService', () => { @@ -9,7 +9,7 @@ describe('StorageService', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [StorageService, S3Provider, ConfigService] + providers: [StorageService, S3Provider, S3MediaProvider, ConfigService] }).compile() service = module.get(StorageService) diff --git a/apps/backend/apps/admin/src/storage/storage.service.ts b/apps/backend/apps/admin/src/storage/storage.service.ts index e176a0fa0e..efe6cc7425 100644 --- a/apps/backend/apps/admin/src/storage/storage.service.ts +++ b/apps/backend/apps/admin/src/storage/storage.service.ts @@ -6,13 +6,15 @@ import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3' +import type { ReadStream } from 'fs' import { type ContentType, ContentTypes } from './content.type' @Injectable() export class StorageService { constructor( private readonly config: ConfigService, - @Inject('S3_CLIENT') private readonly client: S3Client + @Inject('S3_CLIENT') private readonly client: S3Client, + @Inject('S3_CLIENT_MEDIA') private readonly mediaClient: S3Client ) {} async uploadObject(filename: string, content: string, type: ContentType) { @@ -26,6 +28,23 @@ export class StorageService { ) } + async uploadImage( + filename: string, + fileSize: number, + content: ReadStream, + type: string + ) { + await this.mediaClient.send( + new PutObjectCommand({ + Bucket: this.config.get('MEDIA_BUCKET_NAME'), + Key: filename, + Body: content, + ContentType: type, + ContentLength: fileSize + }) + ) + } + // TODO: uploadFile async readObject(filename: string) { @@ -46,4 +65,13 @@ export class StorageService { }) ) } + + async deleteImage(filename: string) { + await this.mediaClient.send( + new DeleteObjectCommand({ + Bucket: this.config.get('MEDIA_BUCKET_NAME'), + Key: filename + }) + ) + } } diff --git a/apps/backend/libs/constants/src/time.constants.ts b/apps/backend/libs/constants/src/time.constants.ts index ed447c0e6e..2945da5883 100644 --- a/apps/backend/libs/constants/src/time.constants.ts +++ b/apps/backend/libs/constants/src/time.constants.ts @@ -23,3 +23,8 @@ export const INVIATION_EXPIRE_TIME = 14 * SECONDS_PER_DAY * 1000 export const OPEN_SPACE_ID = 1 export const PUBLICIZING_REQUEST_KEY = 'publicize' + +/** Image Size Limitation */ +const KILOBYTE = 1024 +const MEGABYTE = 1024 * KILOBYTE +export const MAX_IMAGE_SIZE = 5 * MEGABYTE diff --git a/apps/backend/libs/exception/src/business.exception.ts b/apps/backend/libs/exception/src/business.exception.ts index 2ddbcd17e3..b5a88de540 100644 --- a/apps/backend/libs/exception/src/business.exception.ts +++ b/apps/backend/libs/exception/src/business.exception.ts @@ -78,8 +78,8 @@ export class UnprocessableDataException extends BusinessException { /** [422] Throw when file data is invalid or cannot be processed. */ export class UnprocessableFileDataException extends UnprocessableDataException { - constructor(message, fileName, rowNumber) { - super(`${message} @${fileName}:${rowNumber}`) + constructor(message, fileName) { + super(`${message} @${fileName}`) } } diff --git a/apps/backend/prisma/migrations/20240406140833_add_image_model/migration.sql b/apps/backend/prisma/migrations/20240406140833_add_image_model/migration.sql new file mode 100644 index 0000000000..6c3bfce9bd --- /dev/null +++ b/apps/backend/prisma/migrations/20240406140833_add_image_model/migration.sql @@ -0,0 +1,14 @@ +-- CreateTable +CREATE TABLE "Image" ( + "filename" TEXT NOT NULL, + "createdById" INTEGER, + "create_time" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Image_pkey" PRIMARY KEY ("filename") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Image_filename_key" ON "Image"("filename"); + +-- AddForeignKey +ALTER TABLE "Image" ADD CONSTRAINT "Image_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/apps/backend/prisma/schema.prisma b/apps/backend/prisma/schema.prisma index b96f9b6093..a1afc8030d 100644 --- a/apps/backend/prisma/schema.prisma +++ b/apps/backend/prisma/schema.prisma @@ -58,6 +58,7 @@ model User { submission Submission[] useroauth UserOAuth? CodeDraft CodeDraft[] + Image Image[] @@map("user") } @@ -193,6 +194,13 @@ model Problem { @@map("problem") } +model Image { + filename String @id @unique + createdBy User? @relation(fields: [createdById], references: [id], onDelete: SetNull) + createdById Int? + createTime DateTime @default(now()) @map("create_time") +} + enum Level { Level1 Level2 diff --git a/apps/iris/src/loader/s3/source.go b/apps/iris/src/loader/s3/source.go index dc55a40ef4..179b048543 100644 --- a/apps/iris/src/loader/s3/source.go +++ b/apps/iris/src/loader/s3/source.go @@ -18,7 +18,8 @@ type s3DataSource struct { func NewS3DataSource(bucket string) *s3DataSource { var client *s3.Client - endpoint := os.Getenv("TESTCASE_ENDPOINT_URL") + // endpoint := os.Getenv("TESTCASE_ENDPOINT_URL") + endpoint := os.Getenv("STORAGE_BUCKET_ENDPOINT_URL") if endpoint == "" { // Connect to AWS S3 client = s3.New(s3.Options{Region: "ap-northeast-2"}) diff --git a/collection/admin/Problem/Delete Image/NOT_FOUND.bru b/collection/admin/Problem/Delete Image/NOT_FOUND.bru new file mode 100644 index 0000000000..1cf2853622 --- /dev/null +++ b/collection/admin/Problem/Delete Image/NOT_FOUND.bru @@ -0,0 +1,41 @@ +meta { + name: NOT_FOUND + type: graphql + seq: 2 +} + +post { + url: {{gqlUrl}} + body: graphql + auth: none +} + +body:graphql { + mutation DeleteImage ($filename: String!) { + deleteImage(filename: $filename) { + filename + createdById + createTime + } + } +} + +body:graphql:vars { + { + "filename": "not found" + } +} + +assert { + res.body.errors: isDefined + res.body.errors[0].extensions.code: eq NOT_FOUND +} + +docs { + ## Delete Image + S3 Bucket에 업로드된 이미지를 삭제합니다. + + ### Error Cases + #### NOT_FOUND + 존재하는 filename을 사용해야 합니다. +} diff --git a/collection/admin/Problem/Delete Image/Succeed.bru b/collection/admin/Problem/Delete Image/Succeed.bru new file mode 100644 index 0000000000..b0969bfbbb --- /dev/null +++ b/collection/admin/Problem/Delete Image/Succeed.bru @@ -0,0 +1,31 @@ +meta { + name: Succeed + type: graphql + seq: 1 +} + +post { + url: {{gqlUrl}} + body: graphql + auth: none +} + +body:graphql { + mutation DeleteImage ($filename: String!) { + deleteImage(filename: $filename) { + filename + createdById + createTime + } + } +} + +body:graphql:vars { + { + "filename": "fill this field with filename after executing upload-image api" + } +} + +assert { + res.body.data.deleteImage: isDefined +} diff --git a/collection/admin/Problem/Upload Image/Succeed.bru b/collection/admin/Problem/Upload Image/Succeed.bru new file mode 100644 index 0000000000..e645ae3ed0 --- /dev/null +++ b/collection/admin/Problem/Upload Image/Succeed.bru @@ -0,0 +1,39 @@ +meta { + name: Succeed + type: http + seq: 1 +} + +post { + url: {{gqlUrl}} + body: multipartForm + auth: none +} + +headers { + Apollo-Require-Preflight: true +} + +body:multipart-form { + operations: { "query": "mutation($input: UploadFileInput!){uploadImage(input: $input){ src }}","variables": {"input": {"file": null}}} + map: { "nfile" : ["variables.input.file"]} + nfile: @file(Problem/Upload Image/sample.png) +} + +assert { + res.status: eq 200 + res.body.data.uploadImage: isDefined + res.body.data.uploadImage.src: isString +} + +docs { + ## Upload Image + 이미지를 업로드하고, 업로드된 이미지의 URL 주소를 반환합니다. + + ### Error Cases + #### UNPROCESSABLE (1) + 이미지 파일만 업로드가 가능합니다. (mimetype이 image/*) + + #### UNPROCESSABLE (2) + 5MB 이하의 이미지 파일만 업로드가 가능합니다. +} diff --git a/collection/admin/Problem/Upload Image/sample.png b/collection/admin/Problem/Upload Image/sample.png new file mode 100644 index 0000000000..91be371e4a Binary files /dev/null and b/collection/admin/Problem/Upload Image/sample.png differ diff --git a/docker-compose.yml b/docker-compose.yml index 2a831e05fb..12fe31ac0f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,8 +19,8 @@ services: DEVCONTAINER: 1 network_mode: host - testcase: - container_name: codedang-testcase + storage: + container_name: codedang-storage image: minio/minio ports: - 9000:9000 @@ -30,7 +30,7 @@ services: MINIO_ROOT_USER: skku MINIO_ROOT_PASSWORD: skku1234 volumes: - - codedang-testcase:/data + - codedang-storage:/data database: container_name: codedang-database @@ -157,7 +157,7 @@ services: depends_on: - rabbitmq - database - - testcase + - storage volumes: - $PWD/scripts:/etc/scripts # - $PWD/dist:/etc/dist:z @@ -165,7 +165,7 @@ services: command: ['/bin/bash', '/etc/scripts/deploy.sh'] volumes: - codedang-testcase: + codedang-storage: codedang-database: codedang-test-database: codedang-rabbitmq: diff --git a/package.json b/package.json index 8dd1b28378..18bc96e5db 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "lint": "eslint . --ext .js,.ts,.tsx,.jsx", "format": "prettier --write .", "format:check": "prettier --check .", - "init:testcases": "ts-node scripts/init-testcase.ts", + "init:storage": "ts-node scripts/init-storage.ts", "knip": "knip" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c3a1dc5a2..7ff4696e64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,7 +40,7 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.6)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) eslint-plugin-vue: specifier: ^9.26.0 version: 9.26.0(eslint@8.57.0) @@ -335,7 +335,7 @@ importers: dependencies: '@apollo/client': specifier: ^3.10.4 - version: 3.10.4(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) + version: 3.10.4(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) '@codemirror/lang-cpp': specifier: ^6.0.2 version: 6.0.2 @@ -365,7 +365,7 @@ importers: version: 3.1.3(katex@0.16.10)(react@18.3.1) '@monaco-editor/react': specifier: ^4.6.0 - version: 4.6.0(monaco-editor@0.48.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.6.0(monaco-editor@0.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@next/bundle-analyzer': specifier: ^14.2.3 version: 14.2.3 @@ -452,16 +452,16 @@ importers: version: 2.3.2(@tiptap/pm@2.3.2) '@uiw/codemirror-extensions-langs': specifier: ^4.22.1 - version: 4.22.1(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language-data@6.5.1(@codemirror/view@6.26.3))(@codemirror/language@6.10.1)(@codemirror/legacy-modes@6.4.0)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0) + version: 4.22.1(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language-data@6.4.1(@codemirror/view@6.26.3))(@codemirror/language@6.10.1)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0) '@uiw/codemirror-themes': specifier: ^4.22.1 version: 4.22.1(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3) '@uiw/react-codemirror': specifier: ^4.22.1 - version: 4.22.1(@babel/runtime@7.24.5)(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.26.3)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.22.1(@babel/runtime@7.24.5)(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.26.3)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) apollo-upload-client: specifier: ^18.0.1 - version: 18.0.1(@apollo/client@3.10.4(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)))(graphql@16.8.1) + version: 18.0.1(@apollo/client@3.10.4(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)))(graphql@16.8.1) cmdk: specifier: ^1.0.0 version: 1.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -561,7 +561,7 @@ importers: version: 15.0.7(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/apollo-upload-client': specifier: ^18.0.0 - version: 18.0.0(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) + version: 18.0.0(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) '@types/katex': specifier: ^0.16.7 version: 0.16.7 @@ -622,6 +622,10 @@ importers: packages: + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + '@acuminous/bitsyntax@0.1.2': resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} engines: {node: '>=0.8'} @@ -950,8 +954,8 @@ packages: resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.24.1': + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} engines: {node: '>=6.9.0'} '@babel/core@7.24.5': @@ -1255,16 +1259,16 @@ packages: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} - '@codemirror/autocomplete@6.16.0': - resolution: {integrity: sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==} + '@codemirror/autocomplete@6.15.0': + resolution: {integrity: sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/common': ^1.0.0 - '@codemirror/commands@6.5.0': - resolution: {integrity: sha512-rK+sj4fCAN/QfcY9BEzYMgp4wwL/q5aj/VfNSoH1RWPF9XS/dUwBkvlL3hpWgEjOqlpdN1uLC9UkjJ4tmyjJYg==} + '@codemirror/commands@6.3.3': + resolution: {integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==} '@codemirror/lang-angular@0.1.3': resolution: {integrity: sha512-xgeWGJQQl1LyStvndWtruUvb4SnBZDAu/gvFH/ZU+c0W25tQR8e5hq7WTwiIY2dNxnf+49mRiGI/9yxIwB6f5w==} @@ -1275,11 +1279,8 @@ packages: '@codemirror/lang-css@6.2.1': resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} - '@codemirror/lang-go@6.0.0': - resolution: {integrity: sha512-mMT4YeYdKGjnffDBOhr1ur1glee4oV/rfMe28vzazNHZkSt7vSiuHiBcgr3L/79Cl2RIjFdpQ1XMD0/T8Rx64g==} - - '@codemirror/lang-html@6.4.9': - resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + '@codemirror/lang-html@6.4.8': + resolution: {integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==} '@codemirror/lang-java@6.0.1': resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} @@ -1299,8 +1300,8 @@ packages: '@codemirror/lang-liquid@6.2.1': resolution: {integrity: sha512-J1Mratcm6JLNEiX+U2OlCDTysGuwbHD76XwuL5o5bo9soJtSbz2g6RU3vGHFyS5DC8rgVmFSzi7i6oBftm7tnA==} - '@codemirror/lang-markdown@6.2.5': - resolution: {integrity: sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA==} + '@codemirror/lang-markdown@6.2.4': + resolution: {integrity: sha512-UghkA1vSMs8bT7RSZM6vsIocigyah2bV00eRQuZy76401UmFZdsTsbQNBGdyxRQDOLeEvF5iFwap0BM8LKyd+g==} '@codemirror/lang-php@6.0.1': resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} @@ -1326,17 +1327,17 @@ packages: '@codemirror/lang-xml@6.1.0': resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} - '@codemirror/lang-yaml@6.1.1': - resolution: {integrity: sha512-HV2NzbK9bbVnjWxwObuZh5FuPCowx51mEfoFT9y3y+M37fA3+pbxx4I7uePuygFzDsAmCTwQSc/kXh/flab4uw==} + '@codemirror/lang-yaml@6.0.0': + resolution: {integrity: sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q==} - '@codemirror/language-data@6.5.1': - resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} + '@codemirror/language-data@6.4.1': + resolution: {integrity: sha512-NYhC3NvEMwUxSWS1sB5AePUtr5g2ASSYOZ37YixicDG8PWHslDV9mmXIX0KvmtEm50V8FT4F5i4HAsk/7i78LA==} '@codemirror/language@6.10.1': resolution: {integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==} - '@codemirror/legacy-modes@6.4.0': - resolution: {integrity: sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==} + '@codemirror/legacy-modes@6.3.3': + resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==} '@codemirror/lint@6.7.0': resolution: {integrity: sha512-LTLOL2nT41ADNSCCCCw8Q/UmdAFzB23OUYSjsHTdsVaH0XEo+orhuqbDNWzrzodm14w6FOxqxpmy4LF8Lixqjw==} @@ -1498,8 +1499,8 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@emnapi/runtime@1.1.1': - resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} + '@emnapi/runtime@1.2.0': + resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} '@ericcornelissen/bash-parser@0.5.2': resolution: {integrity: sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ==} @@ -1824,8 +1825,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor@1.2.6': - resolution: {integrity: sha512-+1kjfqzM5T2R+dCw7F4vdJ3CqG+fY/LYJyhNiWEFtq0ToLwYzR/KKyD8YuzTirEjSxWTVlcBh7endkx5n5F6ew==} + '@graphql-tools/executor@1.2.4': + resolution: {integrity: sha512-aCO/5LEAwyTWObAAfpLlwAjaOjTxRX6YNXcGW62mglQhPBy+j0fTc4desci/4nJ49l8FWETaTG0MZ1G/PqQslg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -1987,8 +1988,8 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} '@img/sharp-darwin-arm64@0.33.4': resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} @@ -2167,17 +2168,14 @@ packages: '@lezer/css@1.1.8': resolution: {integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==} - '@lezer/go@1.0.0': - resolution: {integrity: sha512-co9JfT3QqX1YkrMmourYw2Z8meGC50Ko4d54QEcQbEYpvdUvN4yb0NBZdn/9ertgvjsySxHsKzH3lbm3vqJ4Jw==} - '@lezer/highlight@1.2.0': resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} '@lezer/html@1.3.9': resolution: {integrity: sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==} - '@lezer/java@1.1.2': - resolution: {integrity: sha512-3j8X70JvYf0BZt8iSRLXLkt0Ry1hVUgH6wT32yBxH/Xi55nW2VMhc1Az4SKwu4YGSmxCm1fsqDDcHTuFjC8pmg==} + '@lezer/java@1.1.1': + resolution: {integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==} '@lezer/javascript@1.4.16': resolution: {integrity: sha512-84UXR3N7s11MPQHWgMnjb9571fr19MmXnr5zTv2XX0gHXXUvW3uPJ8GCjKrfTXmSdfktjRK0ayKklw+A13rk4g==} @@ -2191,8 +2189,8 @@ packages: '@lezer/lr@1.4.0': resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==} - '@lezer/markdown@1.3.0': - resolution: {integrity: sha512-ErbEQ15eowmJUyT095e9NJc3BI9yZ894fjSDtHftD0InkfUBGgnKSU6dvan9jqsZuNHg2+ag/1oyDRxNsENupQ==} + '@lezer/markdown@1.2.0': + resolution: {integrity: sha512-d7MwsfAukZJo1GpPrcPGa3MxaFFOqNp0gbqF+3F7pTeNDOgeJN1muXzx1XXDPt+Ac+/voCzsH7qXqnn+xReG/g==} '@lezer/php@1.0.2': resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==} @@ -2686,8 +2684,8 @@ packages: resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} engines: {node: '>=8.0.0'} - '@peculiar/webcrypto@1.4.6': - resolution: {integrity: sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==} + '@peculiar/webcrypto@1.4.5': + resolution: {integrity: sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==} engines: {node: '>=10.12.0'} '@phc/format@1.0.0': @@ -3425,8 +3423,8 @@ packages: cpu: [x64] os: [win32] - '@rushstack/eslint-patch@1.10.2': - resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + '@rushstack/eslint-patch@1.8.0': + resolution: {integrity: sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ==} '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} @@ -3919,8 +3917,8 @@ packages: '@ts-morph/common@0.17.0': resolution: {integrity: sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==} - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@tsconfig/node10@1.0.10': + resolution: {integrity: sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -3988,14 +3986,14 @@ packages: '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@8.56.6': + resolution: {integrity: sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/express-serve-static-core@4.19.0': - resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + '@types/express-serve-static-core@4.17.43': + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -4048,6 +4046,9 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + '@types/mjml-core@4.7.4': resolution: {integrity: sha512-hajbYITLm/wJU99Of50Dmn/k4ok+mrhJs4qDdnveJsINdiNJhQd+03C6Kt09vF9biB23cEI4pPeLrJNYfIZf7g==} @@ -4087,8 +4088,8 @@ packages: '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qs@6.9.14': + resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -4105,8 +4106,8 @@ packages: '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} '@types/shimmer@1.0.5': resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} @@ -4137,19 +4138,19 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.10.0': - resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.2.0': - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/parser@7.10.0': + resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -4157,14 +4158,14 @@ packages: typescript: optional: true + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@7.10.0': resolution: {integrity: sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@7.2.0': - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@7.10.0': resolution: {integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==} engines: {node: ^18.18.0 || >=20.0.0} @@ -4175,26 +4176,26 @@ packages: typescript: optional: true + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@7.10.0': resolution: {integrity: sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@7.2.0': - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@7.10.0': - resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} - engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/typescript-estree@7.2.0': - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/typescript-estree@7.10.0': + resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4207,14 +4208,14 @@ packages: peerDependencies: eslint: ^8.56.0 + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@7.10.0': resolution: {integrity: sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@7.2.0': - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} - '@uiw/codemirror-extensions-basic-setup@4.22.1': resolution: {integrity: sha512-Iz8eFaZBNrwjaAADszOxOv2byDMn4rqob/luuSPAzJjTrSn5KawRXcoNLoWGPGNO6Mils6bIly/g2LaU34otNw==} peerDependencies: @@ -4336,8 +4337,8 @@ packages: '@whatwg-node/node-fetch@0.3.6': resolution: {integrity: sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==} - '@whatwg-node/node-fetch@0.5.11': - resolution: {integrity: sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==} + '@whatwg-node/node-fetch@0.5.10': + resolution: {integrity: sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==} engines: {node: '>=16.0.0'} '@wry/caches@1.0.1': @@ -4418,8 +4419,8 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} aggregate-error@3.1.0: @@ -4458,8 +4459,8 @@ packages: peerDependencies: amqplib: '*' - amqplib@0.10.4: - resolution: {integrity: sha512-DMZ4eCEjAVdX1II2TfIUpJhfKAuoCeDIo/YyETbfAqehHTXxxs7WOOd+N1Xxr4cKhx12y23zk8/os98FxlZHrw==} + amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} engines: {node: '>=10'} ansi-colors@4.1.1: @@ -5540,10 +5541,6 @@ packages: resolution: {integrity: sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==} engines: {node: '>=8.10.0'} - encoding-japanese@2.1.0: - resolution: {integrity: sha512-58XySVxUgVlBikBTbQ8WdDxBDHIdXucB16LO5PBHR8t75D54wQrNo4cg+58+R1CtJfKnsVsvt9XlteRaR8xw1w==} - engines: {node: '>=8.10.0'} - end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -5568,8 +5565,8 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + es-abstract@1.23.2: + resolution: {integrity: sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==} engines: {node: '>= 0.4'} es-define-property@1.0.0: @@ -5580,8 +5577,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} engines: {node: '>= 0.4'} es-module-lexer@1.5.2: @@ -5717,8 +5714,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 @@ -5826,6 +5823,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + express@4.19.1: + resolution: {integrity: sha512-K4w1/Bp7y8iSiVObmCrtq8Cs79XjJc/RU2YYkZQ7wpUu5ZyZ7MtPHkqoMz4pf+mgXfNvo2qft8D9OnrH2ABk9w==} + engines: {node: '>= 0.10.0'} + express@4.19.2: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} @@ -6260,8 +6261,8 @@ packages: peerDependencies: graphql: '>=0.11 <=16' - graphql-ws@5.16.0: - resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==} + graphql-ws@5.15.0: + resolution: {integrity: sha512-xWGAtm3fig9TIhSaNsg0FaDZ8Pyn/3re3RFlP4rhQcmjRDIPpk1EhRuNB+YSJtLzttyuToaDiNhwT1OMoGnJnw==} engines: {node: '>=10'} peerDependencies: graphql: '>=0.11 <=16' @@ -6776,8 +6777,8 @@ packages: jose@4.15.5: resolution: {integrity: sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==} - jose@5.2.4: - resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==} + jose@5.2.3: + resolution: {integrity: sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -6988,8 +6989,8 @@ packages: libmime@5.2.0: resolution: {integrity: sha512-X2U5Wx0YmK0rXFbk67ASMeqYIkZ6E5vY7pNWRKtnNzqjvdYYG8xtPDpCnuUEnPU9vlgNev+JoSrcaKSUaNvfsw==} - libmime@5.3.5: - resolution: {integrity: sha512-nSlR1yRZ43L3cZCiWEw7ali3jY29Hz9CQQ96Oy+sSspYnIP5N54ucOPHqooBsXzwrX1pwn13VUE05q4WmzfaLg==} + libmime@5.3.4: + resolution: {integrity: sha512-TsqPdercr6DHrnoQx1F0nS2Y4yPT+fWuOjEP2rqzvV77hMYWomTe/rpm0u9JORQ/FavEXybAGcBJsQbLr9+hjA==} libphonenumber-js@1.11.1: resolution: {integrity: sha512-Wze1LPwcnzvcKGcRHFGFECTaLzxOtujwpf924difr5zniyYv1C2PiW0419qDR7m8lKDxsImu5mwxFuXhXpjmvw==} @@ -7231,8 +7232,8 @@ packages: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} - mailparser@3.7.1: - resolution: {integrity: sha512-RCnBhy5q8XtB3mXzxcAfT1huNqN93HTYYyL6XawlIKycfxM/rXPg9tXoZ7D46+SgCS1zxKzw+BayDQSvncSTTw==} + mailparser@3.6.9: + resolution: {integrity: sha512-1fIDZlgN1NnuzmTSEUxkaViquXYkw5NbQehVc+kz55QRy98QgLdTtRSKv289Jy4NrCiDchRx6zAijB4HrPsvkA==} mailsplit@5.4.0: resolution: {integrity: sha512-wnYxX5D5qymGIPYLwnp6h8n1+6P6vz/MJn5AzGjZ8pwICWssL+CCQjWBIToOVHASmATot4ktvlLo6CyLfOXWYA==} @@ -7501,8 +7502,8 @@ packages: module-not-found-error@1.0.1: resolution: {integrity: sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==} - monaco-editor@0.48.0: - resolution: {integrity: sha512-goSDElNqFfw7iDHMg8WDATkfcyeLTNpBHQpO8incK6p5qZt5G/1j41X0xdGzpIkGojGXM+QiRQyLjnfDVvrpwA==} + monaco-editor@0.47.0: + resolution: {integrity: sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==} moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} @@ -7652,6 +7653,10 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + nodemailer@6.9.11: + resolution: {integrity: sha512-UiAkgiERuG94kl/3bKfE8o10epvDnl0vokNEtZDPTq9BWzIl6EFT9336SbIT4oaTBD8NmmUTLsQyXHV82eXSWg==} + engines: {node: '>=6.0.0'} + nodemailer@6.9.13: resolution: {integrity: sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==} engines: {node: '>=6.0.0'} @@ -7796,8 +7801,8 @@ packages: optimism@0.18.0: resolution: {integrity: sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} ora@5.4.1: @@ -7992,8 +7997,8 @@ packages: path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -8022,16 +8027,16 @@ packages: resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} engines: {node: '>=10'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.1: + resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} engines: {node: '>=12'} pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} pino-http@9.0.0: resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} @@ -8043,8 +8048,8 @@ packages: pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - pino@8.21.0: - resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + pino@8.19.0: + resolution: {integrity: sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==} hasBin: true pirates@4.0.6: @@ -8617,8 +8622,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.3.0: - resolution: {integrity: sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==} + require-in-the-middle@7.2.1: + resolution: {integrity: sha512-u5XngygsJ+XV2dBV/Pl4SrcNpUXQfmYmXtuFeHDXfzk4i4NnGnret6xKWkkJHjMHS/16yMV9pEAlAunqmjllkA==} engines: {node: '>=8.6.0'} require-main-filename@2.0.0: @@ -8922,8 +8927,8 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - sonic-boom@3.8.1: - resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} sonic-boom@4.0.1: resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} @@ -9116,8 +9121,8 @@ packages: babel-plugin-macros: optional: true - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} subscriptions-transport-ws@0.11.0: resolution: {integrity: sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==} @@ -9239,8 +9244,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@2.7.0: - resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} @@ -9266,8 +9271,8 @@ packages: title-case@3.0.3: resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} - tlds@1.252.0: - resolution: {integrity: sha512-GA16+8HXvqtfEnw/DTcwB0UU354QE1n3+wh08oFjr6Znl7ZLAeUgYzCcK+/CCrOyE0vnHR8/pu3XXG3vDijXpQ==} + tlds@1.250.0: + resolution: {integrity: sha512-rWsBfFCWKrjM/o2Q1TTUeYQv6tHSd/umUutDjVs6taTuEgRDIreVYIBgWRWW4ot7jp6n0UVUuxhTLWBtUmPu/w==} hasBin: true tmp@0.0.33: @@ -9687,8 +9692,8 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webcrypto-core@1.7.9: - resolution: {integrity: sha512-FE+a4PPkOmBbgNDIyRmcHhgXn+2ClRl3JzJdDu/P4+B8y81LqKe6RAsI9b3lAOHe1T1BMkSjsRHTYRikImZnVA==} + webcrypto-core@1.7.8: + resolution: {integrity: sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -9785,10 +9790,6 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -9966,6 +9967,8 @@ packages: snapshots: + '@aashutoshrathi/word-wrap@1.2.6': {} + '@acuminous/bitsyntax@0.1.2': dependencies: buffer-more-ints: 1.0.0 @@ -10017,7 +10020,7 @@ snapshots: dependencies: graphql: 16.8.1 - '@apollo/client@3.10.4(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1))': + '@apollo/client@3.10.4(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1))': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) '@wry/caches': 1.0.1 @@ -10035,7 +10038,7 @@ snapshots: tslib: 2.6.2 zen-observable-ts: 1.2.5 optionalDependencies: - graphql-ws: 5.16.0(graphql@16.8.1) + graphql-ws: 5.15.0(graphql@16.8.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) subscriptions-transport-ws: 0.11.0(graphql@16.8.1) @@ -10085,11 +10088,11 @@ snapshots: '@graphql-tools/schema': 9.0.19(graphql@16.8.1) '@josephg/resolvable': 1.0.1 '@types/express': 4.17.21 - '@types/express-serve-static-core': 4.19.0 + '@types/express-serve-static-core': 4.17.43 '@types/node-fetch': 2.6.11 async-retry: 1.3.3 cors: 2.8.5 - express: 4.19.2 + express: 4.19.1 graphql: 16.8.1 loglevel: 1.9.1 lru-cache: 7.18.3 @@ -10745,7 +10748,7 @@ snapshots: '@babel/highlight': 7.24.5 picocolors: 1.0.0 - '@babel/compat-data@7.24.4': {} + '@babel/compat-data@7.24.1': {} '@babel/core@7.24.5': dependencies: @@ -10786,7 +10789,7 @@ snapshots: '@babel/helper-compilation-targets@7.23.6': dependencies: - '@babel/compat-data': 7.24.4 + '@babel/compat-data': 7.24.1 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 @@ -10891,7 +10894,7 @@ snapshots: '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.5)': dependencies: - '@babel/compat-data': 7.24.4 + '@babel/compat-data': 7.24.1 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 @@ -11104,14 +11107,14 @@ snapshots: '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 - '@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)': + '@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)': dependencies: '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 - '@codemirror/commands@6.5.0': + '@codemirror/commands@6.3.3': dependencies: '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 @@ -11120,7 +11123,7 @@ snapshots: '@codemirror/lang-angular@0.1.3': dependencies: - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.8 '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 '@lezer/common': 1.2.1 @@ -11134,7 +11137,7 @@ snapshots: '@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -11142,19 +11145,9 @@ snapshots: transitivePeerDependencies: - '@codemirror/view' - '@codemirror/lang-go@6.0.0(@codemirror/view@6.26.3)': + '@codemirror/lang-html@6.4.8': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.1 - '@codemirror/state': 6.4.1 - '@lezer/common': 1.2.1 - '@lezer/go': 1.0.0 - transitivePeerDependencies: - - '@codemirror/view' - - '@codemirror/lang-html@6.4.9': - dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 @@ -11167,11 +11160,11 @@ snapshots: '@codemirror/lang-java@6.0.1': dependencies: '@codemirror/language': 6.10.1 - '@lezer/java': 1.1.2 + '@lezer/java': 1.1.1 '@codemirror/lang-javascript@6.2.2': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/lint': 6.7.0 '@codemirror/state': 6.4.1 @@ -11203,8 +11196,8 @@ snapshots: '@codemirror/lang-liquid@6.2.1': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) - '@codemirror/lang-html': 6.4.9 + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/lang-html': 6.4.8 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 @@ -11212,19 +11205,19 @@ snapshots: '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 - '@codemirror/lang-markdown@6.2.5': + '@codemirror/lang-markdown@6.2.4': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) - '@codemirror/lang-html': 6.4.9 + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/lang-html': 6.4.8 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 - '@lezer/markdown': 1.3.0 + '@lezer/markdown': 1.2.0 '@codemirror/lang-php@6.0.1': dependencies: - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.8 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -11232,7 +11225,7 @@ snapshots: '@codemirror/lang-python@6.1.6(@codemirror/view@6.26.3)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -11257,7 +11250,7 @@ snapshots: '@codemirror/lang-sql@6.6.4(@codemirror/view@6.26.3)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -11268,7 +11261,7 @@ snapshots: '@codemirror/lang-vue@0.1.3': dependencies: - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.8 '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 '@lezer/common': 1.2.1 @@ -11284,37 +11277,35 @@ snapshots: '@codemirror/lang-xml@6.1.0': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 '@lezer/xml': 1.0.5 - '@codemirror/lang-yaml@6.1.1(@codemirror/view@6.26.3)': + '@codemirror/lang-yaml@6.0.0(@codemirror/view@6.26.3)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 '@lezer/yaml': 1.0.3 transitivePeerDependencies: - '@codemirror/view' - '@codemirror/language-data@6.5.1(@codemirror/view@6.26.3)': + '@codemirror/language-data@6.4.1(@codemirror/view@6.26.3)': dependencies: '@codemirror/lang-angular': 0.1.3 '@codemirror/lang-cpp': 6.0.2 '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) - '@codemirror/lang-go': 6.0.0(@codemirror/view@6.26.3) - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.8 '@codemirror/lang-java': 6.0.1 '@codemirror/lang-javascript': 6.2.2 '@codemirror/lang-json': 6.0.1 '@codemirror/lang-less': 6.0.2(@codemirror/view@6.26.3) '@codemirror/lang-liquid': 6.2.1 - '@codemirror/lang-markdown': 6.2.5 + '@codemirror/lang-markdown': 6.2.4 '@codemirror/lang-php': 6.0.1 '@codemirror/lang-python': 6.1.6(@codemirror/view@6.26.3) '@codemirror/lang-rust': 6.0.1 @@ -11323,9 +11314,9 @@ snapshots: '@codemirror/lang-vue': 0.1.3 '@codemirror/lang-wast': 6.0.2 '@codemirror/lang-xml': 6.1.0 - '@codemirror/lang-yaml': 6.1.1(@codemirror/view@6.26.3) + '@codemirror/lang-yaml': 6.0.0(@codemirror/view@6.26.3) '@codemirror/language': 6.10.1 - '@codemirror/legacy-modes': 6.4.0 + '@codemirror/legacy-modes': 6.3.3 transitivePeerDependencies: - '@codemirror/view' @@ -11338,7 +11329,7 @@ snapshots: '@lezer/lr': 1.4.0 style-mod: 4.1.2 - '@codemirror/legacy-modes@6.4.0': + '@codemirror/legacy-modes@6.3.3': dependencies: '@codemirror/language': 6.10.1 @@ -11532,7 +11523,7 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@emnapi/runtime@1.1.1': + '@emnapi/runtime@1.2.0': dependencies: tslib: 2.6.2 optional: true @@ -11714,8 +11705,8 @@ snapshots: '@golevelup/nestjs-modules': 0.7.1(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(rxjs@7.8.1) '@nestjs/common': 10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1) '@nestjs/core': 10.3.8(@nestjs/common@10.3.8(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.1)(rxjs@7.8.1))(@nestjs/platform-express@10.3.8)(reflect-metadata@0.2.1)(rxjs@7.8.1) - amqp-connection-manager: 4.1.14(amqplib@0.10.4) - amqplib: 0.10.4 + amqp-connection-manager: 4.1.14(amqplib@0.10.3) + amqplib: 0.10.3 lodash: 4.17.21 reflect-metadata: 0.2.1 rxjs: 7.8.1 @@ -11928,7 +11919,7 @@ snapshots: '@graphql-tools/delegate@10.0.10(graphql@16.8.1)': dependencies: '@graphql-tools/batch-execute': 9.0.4(graphql@16.8.1) - '@graphql-tools/executor': 1.2.6(graphql@16.8.1) + '@graphql-tools/executor': 1.2.4(graphql@16.8.1) '@graphql-tools/schema': 10.0.3(graphql@16.8.1) '@graphql-tools/utils': 10.2.0(graphql@16.8.1) dataloader: 2.2.2 @@ -11946,7 +11937,7 @@ snapshots: '@graphql-tools/utils': 10.2.0(graphql@16.8.1) '@types/ws': 8.5.10 graphql: 16.8.1 - graphql-ws: 5.16.0(graphql@16.8.1) + graphql-ws: 5.15.0(graphql@16.8.1) isomorphic-ws: 5.0.0(ws@8.17.0) tslib: 2.6.2 ws: 8.17.0 @@ -11979,7 +11970,7 @@ snapshots: - bufferutil - utf-8-validate - '@graphql-tools/executor@1.2.6(graphql@16.8.1)': + '@graphql-tools/executor@1.2.4(graphql@16.8.1)': dependencies: '@graphql-tools/utils': 10.2.0(graphql@16.8.1) '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) @@ -12096,7 +12087,7 @@ snapshots: graphql-request: 6.1.0(graphql@16.8.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 - jose: 5.2.4 + jose: 5.2.3 js-yaml: 4.1.0 lodash: 4.17.21 scuid: 1.1.0 @@ -12225,7 +12216,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.3 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -12233,7 +12224,7 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/object-schema@2.0.2': {} '@img/sharp-darwin-arm64@0.33.4': optionalDependencies: @@ -12301,7 +12292,7 @@ snapshots: '@img/sharp-wasm32@0.33.4': dependencies: - '@emnapi/runtime': 1.1.1 + '@emnapi/runtime': 1.2.0 optional: true '@img/sharp-win32-ia32@0.33.4': @@ -12385,12 +12376,6 @@ snapshots: '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 - '@lezer/go@1.0.0': - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - '@lezer/highlight@1.2.0': dependencies: '@lezer/common': 1.2.1 @@ -12401,7 +12386,7 @@ snapshots: '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 - '@lezer/java@1.1.2': + '@lezer/java@1.1.1': dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -12428,7 +12413,7 @@ snapshots: dependencies: '@lezer/common': 1.2.1 - '@lezer/markdown@1.3.0': + '@lezer/markdown@1.2.0': dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -12482,15 +12467,15 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} - '@monaco-editor/loader@1.4.0(monaco-editor@0.48.0)': + '@monaco-editor/loader@1.4.0(monaco-editor@0.47.0)': dependencies: - monaco-editor: 0.48.0 + monaco-editor: 0.47.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.48.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@monaco-editor/react@4.6.0(monaco-editor@0.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.48.0) - monaco-editor: 0.48.0 + '@monaco-editor/loader': 1.4.0(monaco-editor@0.47.0) + monaco-editor: 0.47.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -12890,7 +12875,7 @@ snapshots: '@opentelemetry/api-logs': 0.51.1 '@types/shimmer': 1.0.5 import-in-the-middle: 1.7.4 - require-in-the-middle: 7.3.0 + require-in-the-middle: 7.2.1 semver: 7.6.2 shimmer: 1.2.1 transitivePeerDependencies: @@ -13006,13 +12991,13 @@ snapshots: dependencies: tslib: 2.6.2 - '@peculiar/webcrypto@1.4.6': + '@peculiar/webcrypto@1.4.5': dependencies: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.5 tslib: 2.6.2 - webcrypto-core: 1.7.9 + webcrypto-core: 1.7.8 '@phc/format@1.0.0': {} @@ -13667,9 +13652,9 @@ snapshots: '@repeaterjs/repeater@3.0.6': {} - '@replit/codemirror-lang-csharp@6.2.0(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)': + '@replit/codemirror-lang-csharp@6.2.0(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 @@ -13677,9 +13662,9 @@ snapshots: '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 - '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)': + '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 @@ -13692,11 +13677,11 @@ snapshots: '@codemirror/language': 6.10.1 '@lezer/highlight': 1.2.0 - '@replit/codemirror-lang-svelte@6.0.0(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3))(@codemirror/lang-html@6.4.9)(@codemirror/lang-javascript@6.2.2)(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0)': + '@replit/codemirror-lang-svelte@6.0.0(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3))(@codemirror/lang-html@6.4.8)(@codemirror/lang-javascript@6.2.2)(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.8 '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 @@ -13773,7 +13758,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true - '@rushstack/eslint-patch@1.10.2': {} + '@rushstack/eslint-patch@1.8.0': {} '@selderee/plugin-htmlparser2@0.11.0': dependencies: @@ -14482,7 +14467,7 @@ snapshots: mkdirp: 1.0.4 path-browserify: 1.0.1 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.10': {} '@tsconfig/node12@1.0.11': {} @@ -14496,9 +14481,9 @@ snapshots: dependencies: '@types/node': 20.12.12 - '@types/apollo-upload-client@18.0.0(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1))': + '@types/apollo-upload-client@18.0.0(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1))': dependencies: - '@apollo/client': 3.10.4(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) + '@apollo/client': 3.10.4(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) '@types/extract-files': 13.0.1 graphql: 16.8.1 transitivePeerDependencies: @@ -14570,29 +14555,29 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 8.56.10 + '@types/eslint': 8.56.6 '@types/estree': 1.0.5 - '@types/eslint@8.56.10': + '@types/eslint@8.56.6': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 '@types/estree@1.0.5': {} - '@types/express-serve-static-core@4.19.0': + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 20.12.12 - '@types/qs': 6.9.15 + '@types/qs': 6.9.14 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.0 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 + '@types/express-serve-static-core': 4.17.43 + '@types/qs': 6.9.14 + '@types/serve-static': 1.15.5 '@types/extract-files@13.0.1': {} @@ -14646,6 +14631,8 @@ snapshots: '@types/mime@1.3.5': {} + '@types/mime@3.0.4': {} + '@types/mjml-core@4.7.4': optional: true @@ -14692,7 +14679,7 @@ snapshots: '@types/pug@2.0.10': optional: true - '@types/qs@6.9.15': {} + '@types/qs@6.9.14': {} '@types/range-parser@1.2.7': {} @@ -14714,11 +14701,11 @@ snapshots: '@types/mime': 1.3.5 '@types/node': 20.12.12 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 '@types/node': 20.12.12 - '@types/send': 0.17.4 '@types/shimmer@1.0.5': {} @@ -14754,12 +14741,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.10.0 - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.10.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: @@ -14767,12 +14754,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.10.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: @@ -14780,16 +14767,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/scope-manager@7.10.0': dependencies: '@typescript-eslint/types': 7.10.0 '@typescript-eslint/visitor-keys': 7.10.0 - '@typescript-eslint/scope-manager@7.2.0': - dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 - '@typescript-eslint/type-utils@7.10.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) @@ -14802,18 +14789,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.10.0': {} + '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/types@7.2.0': {} + '@typescript-eslint/types@7.10.0': {} - '@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 7.10.0 - '@typescript-eslint/visitor-keys': 7.10.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.3 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -14821,14 +14808,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/visitor-keys': 7.10.0 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.4.5) optionalDependencies: @@ -14847,39 +14834,39 @@ snapshots: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.10.0': + '@typescript-eslint/visitor-keys@6.21.0': dependencies: - '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/types': 6.21.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.2.0': + '@typescript-eslint/visitor-keys@7.10.0': dependencies: - '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/types': 7.10.0 eslint-visitor-keys: 3.4.3 - '@uiw/codemirror-extensions-basic-setup@4.22.1(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/commands@6.5.0)(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)': + '@uiw/codemirror-extensions-basic-setup@4.22.1(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/commands@6.3.3)(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)': dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) - '@codemirror/commands': 6.5.0 + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/commands': 6.3.3 '@codemirror/language': 6.10.1 '@codemirror/lint': 6.7.0 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 - '@uiw/codemirror-extensions-langs@4.22.1(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language-data@6.5.1(@codemirror/view@6.26.3))(@codemirror/language@6.10.1)(@codemirror/legacy-modes@6.4.0)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0)': + '@uiw/codemirror-extensions-langs@4.22.1(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language-data@6.4.1(@codemirror/view@6.26.3))(@codemirror/language@6.10.1)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0)': dependencies: '@codemirror/lang-angular': 0.1.3 '@codemirror/lang-cpp': 6.0.2 '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.8 '@codemirror/lang-java': 6.0.1 '@codemirror/lang-javascript': 6.2.2 '@codemirror/lang-json': 6.0.1 '@codemirror/lang-less': 6.0.2(@codemirror/view@6.26.3) '@codemirror/lang-lezer': 6.0.1 '@codemirror/lang-liquid': 6.2.1 - '@codemirror/lang-markdown': 6.2.5 + '@codemirror/lang-markdown': 6.2.4 '@codemirror/lang-php': 6.0.1 '@codemirror/lang-python': 6.1.6(@codemirror/view@6.26.3) '@codemirror/lang-rust': 6.0.1 @@ -14888,13 +14875,13 @@ snapshots: '@codemirror/lang-vue': 0.1.3 '@codemirror/lang-wast': 6.0.2 '@codemirror/lang-xml': 6.1.0 - '@codemirror/language-data': 6.5.1(@codemirror/view@6.26.3) - '@codemirror/legacy-modes': 6.4.0 + '@codemirror/language-data': 6.4.1(@codemirror/view@6.26.3) + '@codemirror/legacy-modes': 6.3.3 '@nextjournal/lang-clojure': 1.0.0 - '@replit/codemirror-lang-csharp': 6.2.0(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0) - '@replit/codemirror-lang-nix': 6.0.1(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0) + '@replit/codemirror-lang-csharp': 6.2.0(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0) + '@replit/codemirror-lang-nix': 6.0.1(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0) '@replit/codemirror-lang-solidity': 6.0.2(@codemirror/language@6.10.1) - '@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3))(@codemirror/lang-html@6.4.9)(@codemirror/lang-javascript@6.2.2)(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0) + '@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3))(@codemirror/lang-html@6.4.8)(@codemirror/lang-javascript@6.2.2)(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/javascript@1.4.16)(@lezer/lr@1.4.0) codemirror-lang-mermaid: 0.5.0 transitivePeerDependencies: - '@codemirror/autocomplete' @@ -14912,14 +14899,14 @@ snapshots: '@codemirror/state': 6.4.1 '@codemirror/view': 6.26.3 - '@uiw/react-codemirror@4.22.1(@babel/runtime@7.24.5)(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.26.3)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-codemirror@4.22.1(@babel/runtime@7.24.5)(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.26.3)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 - '@codemirror/commands': 6.5.0 + '@codemirror/commands': 6.3.3 '@codemirror/state': 6.4.1 '@codemirror/theme-one-dark': 6.1.2 '@codemirror/view': 6.26.3 - '@uiw/codemirror-extensions-basic-setup': 4.22.1(@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/commands@6.5.0)(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3) + '@uiw/codemirror-extensions-basic-setup': 4.22.1(@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1))(@codemirror/commands@6.3.3)(@codemirror/language@6.10.1)(@codemirror/lint@6.7.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3) codemirror: 6.0.1(@lezer/common@1.2.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -15053,7 +15040,7 @@ snapshots: '@whatwg-node/fetch@0.8.8': dependencies: - '@peculiar/webcrypto': 1.4.6 + '@peculiar/webcrypto': 1.4.5 '@whatwg-node/node-fetch': 0.3.6 busboy: 1.6.0 urlpattern-polyfill: 8.0.2 @@ -15061,7 +15048,7 @@ snapshots: '@whatwg-node/fetch@0.9.17': dependencies: - '@whatwg-node/node-fetch': 0.5.11 + '@whatwg-node/node-fetch': 0.5.10 urlpattern-polyfill: 10.0.0 '@whatwg-node/node-fetch@0.3.6': @@ -15072,7 +15059,7 @@ snapshots: fast-url-parser: 1.1.3 tslib: 2.6.2 - '@whatwg-node/node-fetch@0.5.11': + '@whatwg-node/node-fetch@0.5.10': dependencies: '@kamilkisiela/fast-url-parser': 1.1.4 '@whatwg-node/events': 0.1.1 @@ -15148,7 +15135,7 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.1: + agent-base@7.1.0: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: @@ -15194,12 +15181,12 @@ snapshots: estraverse: 1.9.3 optional: true - amqp-connection-manager@4.1.14(amqplib@0.10.4): + amqp-connection-manager@4.1.14(amqplib@0.10.3): dependencies: - amqplib: 0.10.4 + amqplib: 0.10.3 promise-breaker: 6.0.0 - amqplib@0.10.4: + amqplib@0.10.3: dependencies: '@acuminous/bitsyntax': 0.1.2 buffer-more-ints: 1.0.0 @@ -15239,9 +15226,9 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - apollo-upload-client@18.0.1(@apollo/client@3.10.4(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)))(graphql@16.8.1): + apollo-upload-client@18.0.1(@apollo/client@3.10.4(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)))(graphql@16.8.1): dependencies: - '@apollo/client': 3.10.4(@types/react@18.3.3)(graphql-ws@5.16.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) + '@apollo/client': 3.10.4(@types/react@18.3.3)(graphql-ws@5.15.0(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(subscriptions-transport-ws@0.11.0(graphql@16.8.1)) extract-files: 13.0.0 graphql: 16.8.1 @@ -15328,7 +15315,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 @@ -15345,7 +15332,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -15354,7 +15341,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -15363,28 +15350,28 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-shim-unscopables: 1.0.2 array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -15393,7 +15380,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -15887,8 +15874,8 @@ snapshots: codemirror@6.0.1(@lezer/common@1.2.1): dependencies: - '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) - '@codemirror/commands': 6.5.0 + '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/commands': 6.3.3 '@codemirror/language': 6.10.1 '@codemirror/lint': 6.7.0 '@codemirror/search': 6.5.6 @@ -16426,9 +16413,6 @@ snapshots: encoding-japanese@2.0.0: optional: true - encoding-japanese@2.1.0: - optional: true - end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -16453,7 +16437,7 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.23.3: + es-abstract@1.23.2: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -16508,11 +16492,11 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.0.19: + es-iterator-helpers@1.0.18: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 @@ -16596,15 +16580,15 @@ snapshots: eslint-config-next@14.2.3(eslint@8.57.0)(typescript@5.4.5): dependencies: '@next/eslint-plugin-next': 14.2.3 - '@rushstack/eslint-patch': 1.10.2 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + '@rushstack/eslint-patch': 1.8.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -16623,12 +16607,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.16.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 @@ -16640,24 +16624,24 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.10.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -16699,7 +16683,7 @@ snapshots: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.19 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -16708,17 +16692,17 @@ snapshots: object.entries: 1.1.8 object.fromentries: 2.0.8 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.6)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): dependencies: eslint: 8.57.0 prettier: 3.2.5 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 optionalDependencies: - '@types/eslint': 8.56.10 + '@types/eslint': 8.56.6 eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -16730,7 +16714,7 @@ snapshots: array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 + es-iterator-helpers: 1.0.18 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 @@ -16807,7 +16791,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.4 + optionator: 0.9.3 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -16892,6 +16876,42 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + express@4.19.1: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + express@4.19.2: dependencies: accepts: 1.3.8 @@ -17202,7 +17222,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} @@ -17305,7 +17325,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.0.1 + minimatch: 5.1.6 once: 1.4.0 glob@9.3.5: @@ -17397,7 +17417,7 @@ snapshots: dependencies: graphql: 16.8.1 - graphql-ws@5.16.0(graphql@16.8.1): + graphql-ws@5.15.0(graphql@16.8.1): dependencies: graphql: 16.8.1 @@ -17528,7 +17548,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17542,7 +17562,7 @@ snapshots: https-proxy-agent@7.0.4: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17945,7 +17965,7 @@ snapshots: jose@4.15.5: {} - jose@5.2.4: {} + jose@5.2.3: {} joycon@3.1.1: {} @@ -18122,7 +18142,7 @@ snapshots: js-yaml: 4.1.0 minimist: 1.2.8 picocolors: 1.0.0 - picomatch: 4.0.2 + picomatch: 4.0.1 pretty-ms: 9.0.0 resolve: 1.22.8 smol-toml: 1.1.4 @@ -18201,9 +18221,9 @@ snapshots: libqp: 2.0.1 optional: true - libmime@5.3.5: + libmime@5.3.4: dependencies: - encoding-japanese: 2.1.0 + encoding-japanese: 2.0.0 iconv-lite: 0.6.3 libbase64: 1.3.0 libqp: 2.1.0 @@ -18411,18 +18431,18 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - mailparser@3.7.1: + mailparser@3.6.9: dependencies: - encoding-japanese: 2.1.0 + encoding-japanese: 2.0.0 he: 1.2.0 html-to-text: 9.0.5 iconv-lite: 0.6.3 - libmime: 5.3.5 + libmime: 5.3.4 linkify-it: 5.0.0 mailsplit: 5.4.0 - nodemailer: 6.9.13 - punycode.js: 2.3.1 - tlds: 1.252.0 + nodemailer: 6.9.11 + punycode: 2.3.1 + tlds: 1.250.0 optional: true mailsplit@5.4.0: @@ -18912,7 +18932,7 @@ snapshots: module-not-found-error@1.0.1: {} - monaco-editor@0.48.0: {} + monaco-editor@0.47.0: {} moo@0.5.2: {} @@ -18955,7 +18975,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 - stylis: 4.3.2 + stylis: 4.3.1 nanoid@3.3.7: {} @@ -19042,7 +19062,7 @@ snapshots: '@sinonjs/fake-timers': 11.2.2 '@sinonjs/text-encoding': 0.7.2 just-extend: 6.2.0 - path-to-regexp: 6.2.2 + path-to-regexp: 6.2.1 no-case@2.3.2: dependencies: @@ -19076,6 +19096,9 @@ snapshots: node-releases@2.0.14: {} + nodemailer@6.9.11: + optional: true + nodemailer@6.9.13: {} nopt@7.2.1: @@ -19177,19 +19200,19 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 object.hasown@1.1.4: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-object-atoms: 1.0.0 object.values@1.2.0: @@ -19242,14 +19265,14 @@ snapshots: '@wry/trie': 0.4.3 tslib: 2.6.2 - optionator@0.9.4: + optionator@0.9.3: dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.5 ora@5.4.1: dependencies: @@ -19459,7 +19482,7 @@ snapshots: path-to-regexp@3.2.0: {} - path-to-regexp@6.2.2: {} + path-to-regexp@6.2.1: {} path-type@4.0.0: {} @@ -19478,11 +19501,11 @@ snapshots: picomatch@3.0.1: {} - picomatch@4.0.2: {} + picomatch@4.0.1: {} pify@2.3.0: {} - pino-abstract-transport@1.2.0: + pino-abstract-transport@1.1.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 @@ -19490,7 +19513,7 @@ snapshots: pino-http@9.0.0: dependencies: get-caller-file: 2.0.5 - pino: 8.21.0 + pino: 8.19.0 pino-std-serializers: 6.2.2 process-warning: 3.0.0 @@ -19504,7 +19527,7 @@ snapshots: joycon: 3.1.1 minimist: 1.2.8 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.2.0 + pino-abstract-transport: 1.1.0 pump: 3.0.0 readable-stream: 4.5.2 secure-json-parse: 2.7.0 @@ -19513,19 +19536,19 @@ snapshots: pino-std-serializers@6.2.2: {} - pino@8.21.0: + pino@8.19.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.2.0 + pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 process-warning: 3.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.1 - thread-stream: 2.7.0 + sonic-boom: 3.8.0 + thread-stream: 2.4.1 pirates@4.0.6: {} @@ -19641,7 +19664,7 @@ snapshots: display-notification: 2.0.0 fixpack: 4.0.0 get-port: 5.1.1 - mailparser: 3.7.1 + mailparser: 3.6.9 nodemailer: 6.9.13 open: 7.4.2 p-event: 4.2.0 @@ -20126,7 +20149,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.4 @@ -20173,7 +20196,7 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.3.0: + require-in-the-middle@7.2.1: dependencies: debug: 4.3.4(supports-color@8.1.1) module-details-from-path: 1.0.3 @@ -20529,7 +20552,7 @@ snapshots: dot-case: 3.0.4 tslib: 2.6.2 - sonic-boom@3.8.1: + sonic-boom@3.8.0: dependencies: atomic-sleep: 1.0.0 @@ -20635,7 +20658,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 @@ -20650,7 +20673,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.2 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: @@ -20718,7 +20741,7 @@ snapshots: optionalDependencies: '@babel/core': 7.24.5 - stylis@4.3.2: {} + stylis@4.3.1: {} subscriptions-transport-ws@0.11.0(graphql@16.8.1): dependencies: @@ -20868,7 +20891,7 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@2.7.0: + thread-stream@2.4.1: dependencies: real-require: 0.2.0 @@ -20890,7 +20913,7 @@ snapshots: dependencies: tslib: 2.6.2 - tlds@1.252.0: + tlds@1.250.0: optional: true tmp@0.0.33: @@ -20977,7 +21000,7 @@ snapshots: ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.10 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 @@ -21307,7 +21330,7 @@ snapshots: web-streams-polyfill@3.3.3: {} - webcrypto-core@1.7.9: + webcrypto-core@1.7.8: dependencies: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 @@ -21485,8 +21508,6 @@ snapshots: babel-walk: 3.0.0-canary-5 optional: true - word-wrap@1.2.5: {} - wordwrap@1.0.0: {} workerpool@6.2.1: {} diff --git a/scripts/init-testcase.ts b/scripts/init-storage.ts similarity index 54% rename from scripts/init-testcase.ts rename to scripts/init-storage.ts index 9176caf74e..f32c5b4e2e 100644 --- a/scripts/init-testcase.ts +++ b/scripts/init-storage.ts @@ -9,9 +9,63 @@ import { readdir, readFile } from 'fs/promises' import { resolve, basename } from 'path' const main = async () => { + await Promise.all([setupTestcaseBucket(), setupMediaBucket()]).then(() => { + console.log('All buckets are set up') + }) +} + +const setupMediaBucket = async () => { + const client = new S3Client({ + region: 'ap-northeast-2', + // endpoint: process.env.TESTCASE_ENDPOINT_URL, + endpoint: process.env.STORAGE_BUCKET_ENDPOINT_URL, + forcePathStyle: true, // required for minio + credentials: { + accessKeyId: process.env.MEDIA_ACCESS_KEY || '', + secretAccessKey: process.env.MEDIA_SECRET_KEY || '' + } + }) + + const bucketName = process.env.MEDIA_BUCKET_NAME + if (!bucketName) throw new Error('MEDIA_BUCKET_NAME is not defined') + + // Check if target bucket exists + const bucketList = await client.send(new ListBucketsCommand({})) + + const bucketExists = bucketList.Buckets?.find( + (bucket) => bucket.Name === bucketName + ) + + // Create bucket if not exists + if (!bucketExists) { + await client.send(new CreateBucketCommand({ Bucket: bucketName })) + + await client.send( + new PutBucketPolicyCommand({ + Bucket: bucketName, + Policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Sid: 'AddPerm', + Effect: 'Allow', + Principal: '*', + Action: ['s3:GetObject'], + Resource: [`arn:aws:s3:::${bucketName}/*`] + } + ] + }) + }) + ) + console.log('Created bucket', bucketName) + } +} + +const setupTestcaseBucket = async () => { const client = new S3Client({ region: 'ap-northeast-2', - endpoint: process.env.TESTCASE_ENDPOINT_URL, + // endpoint: process.env.TESTCASE_ENDPOINT_URL, + endpoint: process.env.STORAGE_BUCKET_ENDPOINT_URL, forcePathStyle: true, // required for minio credentials: { accessKeyId: process.env.TESTCASE_ACCESS_KEY || '', diff --git a/scripts/setup.sh b/scripts/setup.sh index 5d71dd645a..fda94ef296 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -61,8 +61,8 @@ pnpm install # Install lefthook for git hook pnpm exec lefthook install -# Upload testcases to MinIO -pnpm run init:testcases +# Init MinIO +pnpm run init:storage # Enable git auto completion if ! grep -q "bash-completion/completions/git" ~/.bashrc