From 85ea5cea6ac89a677534a0eb3a4b05f16e5dd469 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sun, 8 Jun 2025 11:51:31 +0300 Subject: [PATCH] add database, movie examples --- compose.yml | 20 +++ package.json | 6 +- src/actor/actor.controller.ts | 13 ++ src/actor/actor.module.ts | 13 ++ src/actor/actor.service.ts | 18 ++ src/actor/entitites/actor.entity.ts | 30 ++++ src/actor/entitites/create-actor.dto.ts | 8 + src/app.module.ts | 21 ++- src/config/typeorm.config.ts | 17 ++ src/movie/dto/movie.dto.ts | 30 ++++ src/movie/entities/movie.entity.ts | 112 ++++++++++++ src/movie/entities/poster.entity.ts | 26 +++ src/movie/movie.controller.ts | 42 +++++ src/movie/movie.module.ts | 16 ++ src/movie/movie.service.ts | 80 +++++++++ src/review/dto/create-review.dto.ts | 17 ++ src/review/entities/review.entity.ts | 52 ++++++ src/review/review.controller.ts | 18 ++ src/review/review.module.ts | 23 +++ src/review/review.service.ts | 33 ++++ yarn.lock | 230 +++++++++++++++++++++++- 21 files changed, 815 insertions(+), 10 deletions(-) create mode 100644 compose.yml create mode 100644 src/actor/actor.controller.ts create mode 100644 src/actor/actor.module.ts create mode 100644 src/actor/actor.service.ts create mode 100644 src/actor/entitites/actor.entity.ts create mode 100644 src/actor/entitites/create-actor.dto.ts create mode 100644 src/config/typeorm.config.ts create mode 100644 src/movie/dto/movie.dto.ts create mode 100644 src/movie/entities/movie.entity.ts create mode 100644 src/movie/entities/poster.entity.ts create mode 100644 src/movie/movie.controller.ts create mode 100644 src/movie/movie.module.ts create mode 100644 src/movie/movie.service.ts create mode 100644 src/review/dto/create-review.dto.ts create mode 100644 src/review/entities/review.entity.ts create mode 100644 src/review/review.controller.ts create mode 100644 src/review/review.module.ts create mode 100644 src/review/review.service.ts diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..fce6da7 --- /dev/null +++ b/compose.yml @@ -0,0 +1,20 @@ +services: + postgres: + container_name: postgres + image: postgres:latest + restart: always + environment: + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + ports: + - 5433:5432 + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - nestjs-course + +volumes: + postgres_data: + +networks: + nestjs-course: diff --git a/package.json b/package.json index 67e6500..cd470fc 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,17 @@ }, "dependencies": { "@nestjs/common": "^11.0.1", + "@nestjs/config": "^4.0.2", "@nestjs/core": "^11.0.1", "@nestjs/mapped-types": "*", "@nestjs/platform-express": "^11.0.1", + "@nestjs/typeorm": "^11.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.2", + "pg": "^8.16.0", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1" + "rxjs": "^7.8.1", + "typeorm": "^0.3.24" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", diff --git a/src/actor/actor.controller.ts b/src/actor/actor.controller.ts new file mode 100644 index 0000000..0cd2e64 --- /dev/null +++ b/src/actor/actor.controller.ts @@ -0,0 +1,13 @@ +import { Body, Controller, Post } from '@nestjs/common'; +import { ActorService } from './actor.service'; +import { CreateActorDto } from './entitites/create-actor.dto'; + +@Controller('actors') +export class ActorController { + constructor(private readonly actorService: ActorService) {} + + @Post() + create(@Body() dto: CreateActorDto) { + return this.actorService.create(dto); + } +} diff --git a/src/actor/actor.module.ts b/src/actor/actor.module.ts new file mode 100644 index 0000000..207ad6a --- /dev/null +++ b/src/actor/actor.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { MovieEntity } from '../movie/entities/movie.entity'; +import { ActorService } from './actor.service'; +import { ActorController } from './actor.controller'; +import { ActorEntity } from './entitites/actor.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([ActorEntity, MovieEntity])], + controllers: [ActorController], + providers: [ActorService], +}) +export class ActorModule {} diff --git a/src/actor/actor.service.ts b/src/actor/actor.service.ts new file mode 100644 index 0000000..952823c --- /dev/null +++ b/src/actor/actor.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { ActorEntity } from './entitites/actor.entity'; +import { CreateActorDto } from './entitites/create-actor.dto'; + +@Injectable() +export class ActorService { + constructor( + @InjectRepository(ActorEntity) + private readonly actorRepository: Repository, + ) {} + + async create(dto: CreateActorDto) { + const actor = this.actorRepository.create(dto); + return this.actorRepository.save(actor); + } +} diff --git a/src/actor/entitites/actor.entity.ts b/src/actor/entitites/actor.entity.ts new file mode 100644 index 0000000..f4ac032 --- /dev/null +++ b/src/actor/entitites/actor.entity.ts @@ -0,0 +1,30 @@ +import { + Column, + CreateDateColumn, + Entity, + ManyToMany, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm'; +import { MovieEntity } from '../../movie/entities/movie.entity'; + +@Entity({ name: 'actors' }) +export class ActorEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ + type: 'varchar', + length: 64, + }) + name: string; + + @ManyToMany(() => MovieEntity, (movie) => movie.actors) + movies: MovieEntity[]; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; + + @UpdateDateColumn({ name: 'updated_at' }) + updatedAt: Date; +} diff --git a/src/actor/entitites/create-actor.dto.ts b/src/actor/entitites/create-actor.dto.ts new file mode 100644 index 0000000..cbccb7a --- /dev/null +++ b/src/actor/entitites/create-actor.dto.ts @@ -0,0 +1,8 @@ +import { IsNotEmpty, IsString, MaxLength } from 'class-validator'; + +export class CreateActorDto { + @IsNotEmpty() + @IsString() + @MaxLength(64) + name: string; +} diff --git a/src/app.module.ts b/src/app.module.ts index edc9cc4..c1b5d9a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,8 +1,27 @@ import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { getTypeOrmConfig } from './config/typeorm.config'; import { TaskModule } from './task/task.module'; +import { MovieModule } from './movie/movie.module'; +import { ReviewModule } from './review/review.module'; +import { ActorModule } from './actor/actor.module'; @Module({ - imports: [TaskModule], + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + }), + TypeOrmModule.forRootAsync({ + imports: [ConfigModule], + useFactory: getTypeOrmConfig, + inject: [ConfigService], + }), + TaskModule, + MovieModule, + ReviewModule, + ActorModule, + ], controllers: [], providers: [], }) diff --git a/src/config/typeorm.config.ts b/src/config/typeorm.config.ts new file mode 100644 index 0000000..e94636b --- /dev/null +++ b/src/config/typeorm.config.ts @@ -0,0 +1,17 @@ +import { ConfigService } from '@nestjs/config'; +import { TypeOrmModuleOptions } from '@nestjs/typeorm'; + +export function getTypeOrmConfig( + configService: ConfigService, +): TypeOrmModuleOptions { + return { + type: 'postgres', + host: configService.getOrThrow('POSTGRES_HOST'), + port: configService.getOrThrow('POSTGRES_PORT'), + username: configService.getOrThrow('POSTGRES_USER'), + password: configService.getOrThrow('POSTGRES_PASSWORD'), + database: configService.getOrThrow('POSTGRES_DATABASE'), + autoLoadEntities: true, + synchronize: true, + }; +} diff --git a/src/movie/dto/movie.dto.ts b/src/movie/dto/movie.dto.ts new file mode 100644 index 0000000..b56989e --- /dev/null +++ b/src/movie/dto/movie.dto.ts @@ -0,0 +1,30 @@ +import { + IsArray, + IsInt, + IsNotEmpty, + IsString, + IsUrl, + IsUUID, + Max, + Min, +} from 'class-validator'; +import { ActorEntity } from '../../actor/entitites/actor.entity'; + +export class MovieDto { + @IsNotEmpty() + @IsString() + title: string; + + @IsNotEmpty() + @IsInt() + @Min(1888) + @Max(new Date().getFullYear()) + releaseYear: number; + + @IsArray() + @IsUUID('4', { each: true }) + actorIds: ActorEntity['id'][]; + + @IsUrl() + imageUrl: string; +} diff --git a/src/movie/entities/movie.entity.ts b/src/movie/entities/movie.entity.ts new file mode 100644 index 0000000..ec264e3 --- /dev/null +++ b/src/movie/entities/movie.entity.ts @@ -0,0 +1,112 @@ +import { + Column, + CreateDateColumn, + Entity, + JoinColumn, + JoinTable, + ManyToMany, + OneToMany, + OneToOne, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm'; +import { ActorEntity } from '../../actor/entitites/actor.entity'; +import { ReviewEntity } from '../../review/entities/review.entity'; +import { MoviePosterEntity } from './poster.entity'; + +export enum Genre { + ACTION = 'action', + COMEDY = 'comedy', + DRAMA = 'drama', +} + +@Entity({ name: 'movies' }) +export class MovieEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ + type: 'varchar', + length: 128, + nullable: true, // todo + }) + title: string; + + @Column({ + type: 'text', + nullable: true, + }) + description: string; + + @Column({ + name: 'is_available', + type: 'boolean', + default: false, + }) + isAvailable: boolean; + + @Column({ + type: 'decimal', + precision: 3, + scale: 1, + default: 0, + }) + rating: number; + + @ManyToMany(() => ActorEntity, (actor) => actor.movies) + @JoinTable({ + name: 'movie_actors', + joinColumn: { + name: 'movie_id', + referencedColumnName: 'id', + }, + inverseJoinColumn: { + name: 'actor_id', + referencedColumnName: 'id', + }, + }) + actors: ActorEntity[]; + + @Column({ name: 'poster_id', type: 'uuid', nullable: true }) + posterId: string; + + @OneToOne(() => MoviePosterEntity, (poster) => poster.movie, { + onDelete: 'CASCADE', + }) + @JoinColumn({ name: 'poster_id' }) + poster: MoviePosterEntity; + + @Column({ + name: 'release_year', + type: 'int', + unsigned: true, + }) + releaseYear: number; + + @Column({ + type: 'enum', + enum: Genre, + nullable: true, + }) + genre: Genre; + + @Column({ + name: 'release_date', + type: 'date', + nullable: true, + }) + releaseDate: string; + + @OneToMany(() => ReviewEntity, (review) => review.movie) + reviews: ReviewEntity[]; + + @CreateDateColumn({ + name: 'created_at', + }) + createdAt: Date; + + @UpdateDateColumn({ + name: 'updated_at', + }) + updatedAt: Date; +} diff --git a/src/movie/entities/poster.entity.ts b/src/movie/entities/poster.entity.ts new file mode 100644 index 0000000..de554a0 --- /dev/null +++ b/src/movie/entities/poster.entity.ts @@ -0,0 +1,26 @@ +import { + Column, + CreateDateColumn, + Entity, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; +import { MovieEntity } from './movie.entity'; + +@Entity({ name: 'movie_posters' }) +export class MoviePosterEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ + type: 'varchar', + length: 255, + }) + url: string; + + @OneToOne(() => MovieEntity, (movie) => movie.poster) + movie: MovieEntity; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; +} diff --git a/src/movie/movie.controller.ts b/src/movie/movie.controller.ts new file mode 100644 index 0000000..26ccf07 --- /dev/null +++ b/src/movie/movie.controller.ts @@ -0,0 +1,42 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Put, +} from '@nestjs/common'; +import { MovieDto } from './dto/movie.dto'; +import { MovieEntity } from './entities/movie.entity'; +import { MovieService } from './movie.service'; + +@Controller('movies') +export class MovieController { + constructor(private readonly movieService: MovieService) {} + + @Get() + public findAll() { + return this.movieService.findAll(); + } + + @Get(':id') + public findById(@Param('id') id: MovieEntity['id']) { + return this.movieService.findById(id); + } + + @Post() + public create(@Body() dto: MovieDto) { + return this.movieService.create(dto); + } + + @Put(':id') + public update(@Body() dto: MovieDto, @Param('id') id: MovieEntity['id']) { + return this.movieService.update(id, dto); + } + + @Delete(':id') + public delete(@Param('id') id: MovieEntity['id']) { + return this.movieService.delete(id); + } +} diff --git a/src/movie/movie.module.ts b/src/movie/movie.module.ts new file mode 100644 index 0000000..48a5c24 --- /dev/null +++ b/src/movie/movie.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ActorEntity } from '../actor/entitites/actor.entity'; +import { MovieEntity } from './entities/movie.entity'; +import { MoviePosterEntity } from './entities/poster.entity'; +import { MovieService } from './movie.service'; +import { MovieController } from './movie.controller'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([MovieEntity, ActorEntity, MoviePosterEntity]), + ], + controllers: [MovieController], + providers: [MovieService], +}) +export class MovieModule {} diff --git a/src/movie/movie.service.ts b/src/movie/movie.service.ts new file mode 100644 index 0000000..53c8d6a --- /dev/null +++ b/src/movie/movie.service.ts @@ -0,0 +1,80 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { In, Repository } from 'typeorm'; +import { ActorEntity } from '../actor/entitites/actor.entity'; +import { MovieDto } from './dto/movie.dto'; +import { MovieEntity } from './entities/movie.entity'; +import { MoviePosterEntity } from './entities/poster.entity'; + +@Injectable() +export class MovieService { + constructor( + @InjectRepository(MovieEntity) + private readonly movieRepository: Repository, + + @InjectRepository(ActorEntity) + private readonly actorRepository: Repository, + + @InjectRepository(MoviePosterEntity) + private readonly moviePosterRepository: Repository, + ) {} + + async findAll(): Promise { + return await this.movieRepository.find({ + order: { + id: 'ASC', + }, + relations: ['actors'], + }); + } + + async findById(id: MovieEntity['id']): Promise { + const movie = await this.movieRepository.findOne({ + where: { id }, + relations: ['actors'], + }); + if (!movie) { + throw new NotFoundException(`Not found movie with id ${id}`); + } + + return movie; + } + + async create(dto: MovieDto) { + const { actorIds, releaseYear, title, imageUrl } = dto; + const actors = await this.actorRepository.find({ + where: { + id: In(actorIds), + }, + }); + if (!actors || actors.length === 0) { + throw new NotFoundException('Not found actors'); + } + + const poster = this.moviePosterRepository.create({ url: imageUrl }); + await this.moviePosterRepository.save(poster); + + const movie = this.movieRepository.create({ + title, + releaseYear, + actors, + poster, + }); + return this.movieRepository.save(movie); + } + + async update(id: MovieEntity['id'], dto: MovieDto): Promise { + const movie = await this.findById(id); + Object.assign(movie, dto); + await this.movieRepository.save(movie); + + return true; + } + + async delete(id: MovieEntity['id']): Promise { + const movie = await this.findById(id); + await this.movieRepository.remove(movie); + + return movie; + } +} diff --git a/src/review/dto/create-review.dto.ts b/src/review/dto/create-review.dto.ts new file mode 100644 index 0000000..0ddd785 --- /dev/null +++ b/src/review/dto/create-review.dto.ts @@ -0,0 +1,17 @@ +import { IsNotEmpty, IsString, IsUUID, Max, Min } from 'class-validator'; +import { ReviewEntity } from '../entities/review.entity'; + +export class CreateReviewDto { + @IsNotEmpty() + @IsString() + text: ReviewEntity['text']; + + @IsNotEmpty() + @Min(0) + @Max(10) + rating: ReviewEntity['rating']; + + @IsNotEmpty() + @IsUUID() + movieId: ReviewEntity['movieId']; +} diff --git a/src/review/entities/review.entity.ts b/src/review/entities/review.entity.ts new file mode 100644 index 0000000..434183f --- /dev/null +++ b/src/review/entities/review.entity.ts @@ -0,0 +1,52 @@ +import { + Column, + CreateDateColumn, + Entity, + JoinColumn, + ManyToOne, + PrimaryGeneratedColumn, + UpdateDateColumn, +} from 'typeorm'; +import { MovieEntity } from '../../movie/entities/movie.entity'; + +@Entity({ name: 'reviews' }) +export class ReviewEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ + type: 'text', + }) + text: string; + + @Column({ + type: 'decimal', + precision: 3, + scale: 1, + }) + rating: number; + + @Column({ + name: 'movie_id', + type: 'uuid', + }) + @JoinColumn({ + name: 'movie_id', + }) + movieId: MovieEntity['id']; + + @ManyToOne(() => MovieEntity, (movie) => movie.reviews, { + onDelete: 'CASCADE', + }) + movie: MovieEntity; + + @CreateDateColumn({ + name: 'created_at', + }) + createdAt: Date; + + @UpdateDateColumn({ + name: 'updated_at', + }) + updatedAt: Date; +} diff --git a/src/review/review.controller.ts b/src/review/review.controller.ts new file mode 100644 index 0000000..93bb7e3 --- /dev/null +++ b/src/review/review.controller.ts @@ -0,0 +1,18 @@ +import { Body, Controller, Get, Post } from '@nestjs/common'; +import { CreateReviewDto } from './dto/create-review.dto'; +import { ReviewService } from './review.service'; + +@Controller('reviews') +export class ReviewController { + constructor(private readonly reviewService: ReviewService) {} + + @Post() + public async create(@Body() dto: CreateReviewDto) { + return this.reviewService.create(dto); + } + + @Get() + public findAll() { + return this.reviewService.findAll(); + } +} diff --git a/src/review/review.module.ts b/src/review/review.module.ts new file mode 100644 index 0000000..6a03489 --- /dev/null +++ b/src/review/review.module.ts @@ -0,0 +1,23 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ActorEntity } from '../actor/entitites/actor.entity'; +import { MovieEntity } from '../movie/entities/movie.entity'; +import { MoviePosterEntity } from '../movie/entities/poster.entity'; +import { MovieService } from '../movie/movie.service'; +import { ReviewEntity } from './entities/review.entity'; +import { ReviewService } from './review.service'; +import { ReviewController } from './review.controller'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([ + ReviewEntity, + MovieEntity, + ActorEntity, + MoviePosterEntity, + ]), + ], + controllers: [ReviewController], + providers: [ReviewService, MovieService], +}) +export class ReviewModule {} diff --git a/src/review/review.service.ts b/src/review/review.service.ts new file mode 100644 index 0000000..8f3104d --- /dev/null +++ b/src/review/review.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { MovieService } from '../movie/movie.service'; +import { CreateReviewDto } from './dto/create-review.dto'; +import { ReviewEntity } from './entities/review.entity'; + +@Injectable() +export class ReviewService { + constructor( + @InjectRepository(ReviewEntity) + private readonly reviewRepository: Repository, + + private readonly movieService: MovieService, + ) {} + + async findAll(): Promise { + return this.reviewRepository.find({}); + } + + async create(dto: CreateReviewDto): Promise { + const { movieId, rating, text } = dto; + const movie = await this.movieService.findById(movieId); + + const review = this.reviewRepository.create({ + text, + rating, + movie, + movieId, + }); + return await this.reviewRepository.save(review); + } +} diff --git a/yarn.lock b/yarn.lock index 3b2dc3e..b008fba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -996,6 +996,15 @@ load-esm "1.0.2" tslib "2.8.1" +"@nestjs/config@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-4.0.2.tgz#a2777a1fd2d0d594bab3953f50fbca95c14cce52" + integrity sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA== + dependencies: + dotenv "16.4.7" + dotenv-expand "12.0.1" + lodash "4.17.21" + "@nestjs/core@^11.0.1": version "11.1.2" resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-11.1.2.tgz#df169edec5b0b93b4001d5c603a2e18dcb4c514e" @@ -1042,6 +1051,11 @@ dependencies: tslib "2.8.1" +"@nestjs/typeorm@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-11.0.0.tgz#b0f45d6902396db89e0ac1f4e738c2ff3407b794" + integrity sha512-SOeUQl70Lb2OfhGkvnh4KXWlsd+zA08RuuQgT7kKbzivngxzSo1Oc7Usu5VxCxACQC9wc2l9esOHILSJeK7rJA== + "@noble/hashes@^1.1.5": version "1.8.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" @@ -1082,6 +1096,11 @@ dependencies: "@noble/hashes" "^1.1.5" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@pkgr/core@^0.2.4": version "0.2.7" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.7.tgz#eb5014dfd0b03e7f3ba2eeeff506eed89b028058" @@ -1116,6 +1135,11 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@sqltools/formatter@^1.2.5": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" + integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== + "@swc/cli@^0.6.0": version "0.6.0" resolved "https://registry.yarnpkg.com/@swc/cli/-/cli-0.6.0.tgz#fe986a436797c9d3850938366dbd660c9ba1101f" @@ -1915,7 +1939,7 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -ansis@3.17.0: +ansis@3.17.0, ansis@^3.17.0: version "3.17.0" resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== @@ -1928,6 +1952,11 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" +app-root-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== + append-field@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" @@ -2163,6 +2192,14 @@ buffer@^5.2.1, buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + busboy@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -2497,6 +2534,11 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" +dayjs@^1.11.13: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" @@ -2511,7 +2553,7 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -dedent@^1.0.0: +dedent@^1.0.0, dedent@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.6.0.tgz#79d52d6389b1ffa67d2bcef59ba51847a9d503b2" integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA== @@ -2576,6 +2618,23 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +dotenv-expand@12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-12.0.1.tgz#44bdfa204a368100689ec35d7385755f599ceeb1" + integrity sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ== + dependencies: + dotenv "^16.4.5" + +dotenv@16.4.7: + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +dotenv@^16.4.5, dotenv@^16.4.7: + version "16.5.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" + integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -3253,6 +3312,18 @@ glob@11.0.1: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" +glob@^10.4.5: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -3433,7 +3504,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3587,6 +3658,15 @@ iterare@1.2.1: resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jackspeak@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" @@ -4114,7 +4194,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4132,6 +4212,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" @@ -4297,7 +4382,7 @@ minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== @@ -4534,6 +4619,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" @@ -4567,6 +4660,62 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== +pg-cloudflare@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz#2e3649c38a7a9c74a7e5327c8098a2fd9af595bd" + integrity sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg== + +pg-connection-string@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.0.tgz#f75e06591fdd42ec7636fe2c6a03febeedbec9bf" + integrity sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.0.tgz#134b0213755c5e7135152976488aa7cd7ee1268d" + integrity sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA== + +pg-protocol@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.0.tgz#a473afcbb1c6e5dc3ac24869ba3dd563f8a1ae1b" + integrity sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q== + +pg-types@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.0.tgz#40b08eedb5eb1834252cf3e3629503e32e6c6c04" + integrity sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg== + dependencies: + pg-connection-string "^2.9.0" + pg-pool "^3.10.0" + pg-protocol "^1.10.0" + pg-types "2.2.0" + pgpass "1.0.5" + optionalDependencies: + pg-cloudflare "^1.2.5" + +pgpass@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4606,6 +4755,28 @@ pluralize@8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4842,7 +5013,7 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" -safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4944,6 +5115,14 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -5056,11 +5235,21 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sql-highlight@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/sql-highlight/-/sql-highlight-6.0.0.tgz#e62977ed5c7a1644634a1554b8588ee42611a4be" + integrity sha512-+fLpbAbWkQ+d0JEchJT/NrRRXbYRNbG15gFpANx73EwxQB1PRjj+k/OI0GTU0J63g8ikGkJECQp9z8XEJZvPRw== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -5419,7 +5608,7 @@ tsconfig-paths@4.2.0, tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.8.1, tslib@^2.1.0: +tslib@2.8.1, tslib@^2.1.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -5468,6 +5657,26 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typeorm@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.24.tgz#e05ab51d60036d2beb35f942783c37f2af02b4ef" + integrity sha512-4IrHG7A0tY8l5gEGXfW56VOMfUVWEkWlH/h5wmcyZ+V8oCiLj7iTPp0lEjMEZVrxEkGSdP9ErgTKHKXQApl/oA== + dependencies: + "@sqltools/formatter" "^1.2.5" + ansis "^3.17.0" + app-root-path "^3.1.0" + buffer "^6.0.3" + dayjs "^1.11.13" + debug "^4.4.0" + dedent "^1.6.0" + dotenv "^16.4.7" + glob "^10.4.5" + sha.js "^2.4.11" + sql-highlight "^6.0.0" + tslib "^2.8.1" + uuid "^11.1.0" + yargs "^17.7.2" + typescript-eslint@^8.20.0: version "8.33.1" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff" @@ -5537,6 +5746,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -5703,7 +5917,7 @@ yargs-parser@21.1.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==