From 5745ec9cd0f27746489f51d83af2a4de4275cf38 Mon Sep 17 00:00:00 2001 From: Konrad Pazgan Date: Mon, 7 Oct 2024 11:42:32 +0200 Subject: [PATCH] move to adapter factory --- .../common_nestjs_remix/apps/api/.env.example | 5 +- .../apps/api/src/app.module.ts | 2 +- .../apps/api/src/common/configuration/aws.ts | 2 - .../files/adapters/files.adapter.ts | 0 .../src/{ => common}/files/adapters/index.ts | 0 .../files/adapters/local.adapter.ts | 0 .../{ => common}/files/adapters/s3.adapter.ts | 0 .../files/factory/file-adapters.factory.ts | 32 ++ .../apps/api/src/common/files/file.service.ts | 22 ++ .../apps/api/src/common/files/files.module.ts | 20 ++ .../apps/api/src/files/file.service.ts | 32 -- .../apps/api/src/files/files.module.ts | 7 - examples/common_nestjs_remix/pnpm-lock.yaml | 295 ++++++++---------- 13 files changed, 212 insertions(+), 205 deletions(-) rename examples/common_nestjs_remix/apps/api/src/{ => common}/files/adapters/files.adapter.ts (100%) rename examples/common_nestjs_remix/apps/api/src/{ => common}/files/adapters/index.ts (100%) rename examples/common_nestjs_remix/apps/api/src/{ => common}/files/adapters/local.adapter.ts (100%) rename examples/common_nestjs_remix/apps/api/src/{ => common}/files/adapters/s3.adapter.ts (100%) create mode 100644 examples/common_nestjs_remix/apps/api/src/common/files/factory/file-adapters.factory.ts create mode 100644 examples/common_nestjs_remix/apps/api/src/common/files/file.service.ts create mode 100644 examples/common_nestjs_remix/apps/api/src/common/files/files.module.ts delete mode 100644 examples/common_nestjs_remix/apps/api/src/files/file.service.ts delete mode 100644 examples/common_nestjs_remix/apps/api/src/files/files.module.ts diff --git a/examples/common_nestjs_remix/apps/api/.env.example b/examples/common_nestjs_remix/apps/api/.env.example index 922d80e..86273eb 100644 --- a/examples/common_nestjs_remix/apps/api/.env.example +++ b/examples/common_nestjs_remix/apps/api/.env.example @@ -1,7 +1,7 @@ # GENERAL CORS_ORIGIN="https://app.guidebook.localhost" EMAIL_ADAPTER="mailhog" - +FILE_ADAPTER="local" # DATABASE DATABASE_URL="postgres://postgres:guidebook@localhost:5432/guidebook" @@ -17,11 +17,10 @@ SMTP_USER= SMTP_PASSWORD= # AWS -AWS_ENDPOINT=https://s3.eu-central-1.amazonaws.com AWS_REGION=eu-central-1 AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= -AWS_BUCKET_NAME=test-bucket\ +AWS_BUCKET_NAME=test-bucket # LOCAL UPLOADS diff --git a/examples/common_nestjs_remix/apps/api/src/app.module.ts b/examples/common_nestjs_remix/apps/api/src/app.module.ts index 6e5c905..2909945 100644 --- a/examples/common_nestjs_remix/apps/api/src/app.module.ts +++ b/examples/common_nestjs_remix/apps/api/src/app.module.ts @@ -15,7 +15,7 @@ import { EmailModule } from "./common/emails/emails.module"; import { TestConfigModule } from "./test-config/test-config.module"; import { StagingGuard } from "./common/guards/staging.guard"; import { HealthModule } from "./health/health.module"; -import { FilesModule } from "./files/files.module"; +import { FilesModule } from "./common/files/files.module"; import localFile from "./common/configuration/local_file"; @Module({ diff --git a/examples/common_nestjs_remix/apps/api/src/common/configuration/aws.ts b/examples/common_nestjs_remix/apps/api/src/common/configuration/aws.ts index fc876da..2bbd4b9 100644 --- a/examples/common_nestjs_remix/apps/api/src/common/configuration/aws.ts +++ b/examples/common_nestjs_remix/apps/api/src/common/configuration/aws.ts @@ -7,7 +7,6 @@ const schema = Type.Object({ AWS_ACCESS_KEY_ID: Type.String(), AWS_SECRET_ACCESS_KEY: Type.String(), BUCKET_NAME: Type.String(), - AWS_ENDPOINT: Type.String(), }); type AWSConfigSchema = Static; @@ -20,7 +19,6 @@ export default registerAs("aws", (): AWSConfigSchema => { AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY, BUCKET_NAME: process.env.AWS_BUCKET_NAME, - AWS_ENDPOINT: process.env.AWS_ENDPOINT, }; return validateAwsConfig(values); diff --git a/examples/common_nestjs_remix/apps/api/src/files/adapters/files.adapter.ts b/examples/common_nestjs_remix/apps/api/src/common/files/adapters/files.adapter.ts similarity index 100% rename from examples/common_nestjs_remix/apps/api/src/files/adapters/files.adapter.ts rename to examples/common_nestjs_remix/apps/api/src/common/files/adapters/files.adapter.ts diff --git a/examples/common_nestjs_remix/apps/api/src/files/adapters/index.ts b/examples/common_nestjs_remix/apps/api/src/common/files/adapters/index.ts similarity index 100% rename from examples/common_nestjs_remix/apps/api/src/files/adapters/index.ts rename to examples/common_nestjs_remix/apps/api/src/common/files/adapters/index.ts diff --git a/examples/common_nestjs_remix/apps/api/src/files/adapters/local.adapter.ts b/examples/common_nestjs_remix/apps/api/src/common/files/adapters/local.adapter.ts similarity index 100% rename from examples/common_nestjs_remix/apps/api/src/files/adapters/local.adapter.ts rename to examples/common_nestjs_remix/apps/api/src/common/files/adapters/local.adapter.ts diff --git a/examples/common_nestjs_remix/apps/api/src/files/adapters/s3.adapter.ts b/examples/common_nestjs_remix/apps/api/src/common/files/adapters/s3.adapter.ts similarity index 100% rename from examples/common_nestjs_remix/apps/api/src/files/adapters/s3.adapter.ts rename to examples/common_nestjs_remix/apps/api/src/common/files/adapters/s3.adapter.ts diff --git a/examples/common_nestjs_remix/apps/api/src/common/files/factory/file-adapters.factory.ts b/examples/common_nestjs_remix/apps/api/src/common/files/factory/file-adapters.factory.ts new file mode 100644 index 0000000..7dc9782 --- /dev/null +++ b/examples/common_nestjs_remix/apps/api/src/common/files/factory/file-adapters.factory.ts @@ -0,0 +1,32 @@ +import { Injectable } from "@nestjs/common"; +import { S3FileAdapter } from "../adapters/s3.adapter"; +import { match, P } from "ts-pattern"; +import { ConfigService } from "@nestjs/config"; +import { FilesAdapter } from "../adapters/files.adapter"; +import { LocalFilesAdapter } from "../adapters"; +import { ModuleRef } from "@nestjs/core"; + +type AdapterType = "local" | "s3"; + +@Injectable() +export class FileAdapterFactory { + constructor( + private moduleRef: ModuleRef, + private configService: ConfigService, + ) {} + + async createAdapter(): Promise { + const adapterType = this.configService.get("FILE_ADAPTER"); + const adapter = match(adapterType) + .with("local", () => LocalFilesAdapter) + .with("s3", () => S3FileAdapter) + .with(P.nullish, () => { + throw new Error("FILE_ADAPTER is not defined in configuration"); + }) + .otherwise((type) => { + throw new Error(`Unknown file adapter type: ${type}`); + }); + + return await this.moduleRef.create(adapter); + } +} diff --git a/examples/common_nestjs_remix/apps/api/src/common/files/file.service.ts b/examples/common_nestjs_remix/apps/api/src/common/files/file.service.ts new file mode 100644 index 0000000..6fecd46 --- /dev/null +++ b/examples/common_nestjs_remix/apps/api/src/common/files/file.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from "@nestjs/common"; +import { FilesAdapter } from "./adapters/files.adapter"; + +@Injectable() +export class FileService { + constructor(private fileAdapter: FilesAdapter) {} + + async uploadFile( + directory: string, + file: Express.Multer.File, + ): Promise<{ path: string }> { + return await this.fileAdapter.uploadFile(directory, file); + } + + async deleteFile(key: string): Promise { + return await this.fileAdapter.deleteFile(key); + } + + async getFileUrl(key: string): Promise<{ url: string }> { + return await this.fileAdapter.getFileUrl(key); + } +} diff --git a/examples/common_nestjs_remix/apps/api/src/common/files/files.module.ts b/examples/common_nestjs_remix/apps/api/src/common/files/files.module.ts new file mode 100644 index 0000000..bf4f04a --- /dev/null +++ b/examples/common_nestjs_remix/apps/api/src/common/files/files.module.ts @@ -0,0 +1,20 @@ +import { Module } from "@nestjs/common"; +import { FileService } from "./file.service"; +import { ConfigModule } from "@nestjs/config"; +import { FileAdapterFactory } from "./factory/file-adapters.factory"; +import { FilesAdapter } from "./adapters/files.adapter"; + +@Module({ + imports: [ConfigModule], + providers: [ + FileService, + FileAdapterFactory, + { + provide: FilesAdapter, + useFactory: (factory: FileAdapterFactory) => factory.createAdapter(), + inject: [FileAdapterFactory], + }, + ], + exports: [FileService], +}) +export class FilesModule {} diff --git a/examples/common_nestjs_remix/apps/api/src/files/file.service.ts b/examples/common_nestjs_remix/apps/api/src/files/file.service.ts deleted file mode 100644 index 8e3f3b3..0000000 --- a/examples/common_nestjs_remix/apps/api/src/files/file.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import { ConfigService } from "@nestjs/config"; -import { S3FileAdapter } from "./adapters"; -import { LocalFilesAdapter } from "./adapters"; - -@Injectable() -export class FileService { - private storageAdapter: LocalFilesAdapter | S3FileAdapter; - - constructor(configService: ConfigService) { - if (configService.get("ENVIRONMENT") === "development") { - this.storageAdapter = new LocalFilesAdapter(configService); - } else { - this.storageAdapter = new S3FileAdapter(configService); - } - } - - async uploadFile( - directory: string, - file: Express.Multer.File, - ): Promise<{ path: string }> { - return await this.storageAdapter.uploadFile(directory, file); - } - - async deleteFile(key: string): Promise { - return await this.storageAdapter.deleteFile(key); - } - - async getFileUrl(key: string): Promise<{ url: string }> { - return await this.storageAdapter.getFileUrl(key); - } -} diff --git a/examples/common_nestjs_remix/apps/api/src/files/files.module.ts b/examples/common_nestjs_remix/apps/api/src/files/files.module.ts deleted file mode 100644 index 84b3263..0000000 --- a/examples/common_nestjs_remix/apps/api/src/files/files.module.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Module } from "@nestjs/common"; -import { FileService } from "./file.service"; - -@Module({ - providers: [FileService], -}) -export class FilesModule {} diff --git a/examples/common_nestjs_remix/pnpm-lock.yaml b/examples/common_nestjs_remix/pnpm-lock.yaml index 385f25f..6f0f4c0 100644 --- a/examples/common_nestjs_remix/pnpm-lock.yaml +++ b/examples/common_nestjs_remix/pnpm-lock.yaml @@ -34,10 +34,10 @@ importers: version: 3.617.0 '@knaadh/nestjs-drizzle-postgres': specifier: ^1.0.0 - version: 1.0.0(@nestjs/common@10.0.0)(drizzle-orm@0.31.2)(postgres@3.4.4) + version: 1.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(drizzle-orm@0.31.2(@types/react@18.2.61)(postgres@3.4.4)(react@18.3.1))(postgres@3.4.4) '@nestjs/axios': specifier: ^3.0.3 - version: 3.0.3(@nestjs/common@10.0.0)(axios@1.7.2)(rxjs@7.8.1) + version: 3.0.3(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(axios@1.7.2)(rxjs@7.8.1) '@nestjs/common': specifier: ^10.0.0 version: 10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1) @@ -61,10 +61,10 @@ importers: version: 10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0) '@nestjs/swagger': specifier: ^7.4.0 - version: 7.4.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.2.0) + version: 7.4.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1))(reflect-metadata@0.2.0) '@nestjs/terminus': specifier: ^10.2.3 - version: 10.2.3(@nestjs/axios@3.0.3)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1) + version: 10.2.3(@nestjs/axios@3.0.3(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(axios@1.7.2)(rxjs@7.8.1))(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1))(reflect-metadata@0.2.0)(rxjs@7.8.1) '@repo/email-templates': specifier: workspace:* version: link:../../packages/email-templates @@ -134,13 +134,13 @@ importers: version: 8.4.1 '@nestjs/cli': specifier: ^10.0.0 - version: 10.4.3(@swc/core@1.3.101)(esbuild@0.19.12) + version: 10.4.5(@swc/core@1.3.101)(esbuild@0.19.12) '@nestjs/schematics': specifier: ^10.0.0 version: 10.0.0(chokidar@3.6.0)(typescript@5.5.4) '@nestjs/testing': specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0)) + version: 10.4.4(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0)) '@testcontainers/localstack': specifier: ^10.10.4 version: 10.11.0 @@ -227,7 +227,7 @@ importers: version: 29.2.4(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.19.12)(jest@29.5.0(@types/node@20.14.14)(ts-node@10.9.1(@swc/core@1.3.101)(@types/node@20.14.14)(typescript@5.5.4)))(typescript@5.5.4) ts-loader: specifier: ^9.4.3 - version: 9.4.3(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12)) + version: 9.4.3(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12)) ts-node: specifier: ^10.9.1 version: 10.9.1(@swc/core@1.3.101)(@types/node@20.14.14)(typescript@5.5.4) @@ -2149,8 +2149,15 @@ packages: resolution: {integrity: sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==} engines: {node: '>=18'} - '@nestjs/cli@10.4.3': - resolution: {integrity: sha512-m902UdU21Bcj1FWyNIBUW9BNL7w+birbt+wNaO7lew+Lj1G4fFaPWBElx9ULThSnalLp1NEmcy3mzLnzDgeodw==} + '@nestjs/axios@3.0.3': + resolution: {integrity: sha512-h6TCn3yJwD6OKqqqfmtRS5Zo4E46Ip2n+gK1sqwzNBC+qxQ9xpCu+ODVRFur6V3alHSCSBxb3nNtt73VEdluyA==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + axios: ^1.3.1 + rxjs: ^6.0.0 || ^7.0.0 + + '@nestjs/cli@10.4.5': + resolution: {integrity: sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==} engines: {node: '>= 16.14'} hasBin: true peerDependencies: @@ -2263,8 +2270,56 @@ packages: class-validator: optional: true - '@nestjs/testing@10.0.0': - resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} + '@nestjs/terminus@10.2.3': + resolution: {integrity: sha512-iX7gXtAooePcyQqFt57aDke5MzgdkBeYgF5YsFNNFwOiAFdIQEhfv3PR0G+HlH9F6D7nBCDZt9U87Pks/qHijg==} + peerDependencies: + '@grpc/grpc-js': '*' + '@grpc/proto-loader': '*' + '@mikro-orm/core': '*' + '@mikro-orm/nestjs': '*' + '@nestjs/axios': ^1.0.0 || ^2.0.0 || ^3.0.0 + '@nestjs/common': ^9.0.0 || ^10.0.0 + '@nestjs/core': ^9.0.0 || ^10.0.0 + '@nestjs/microservices': ^9.0.0 || ^10.0.0 + '@nestjs/mongoose': ^9.0.0 || ^10.0.0 + '@nestjs/sequelize': ^9.0.0 || ^10.0.0 + '@nestjs/typeorm': ^9.0.0 || ^10.0.0 + '@prisma/client': '*' + mongoose: '*' + reflect-metadata: 0.1.x || 0.2.x + rxjs: 7.x + sequelize: '*' + typeorm: '*' + peerDependenciesMeta: + '@grpc/grpc-js': + optional: true + '@grpc/proto-loader': + optional: true + '@mikro-orm/core': + optional: true + '@mikro-orm/nestjs': + optional: true + '@nestjs/axios': + optional: true + '@nestjs/microservices': + optional: true + '@nestjs/mongoose': + optional: true + '@nestjs/sequelize': + optional: true + '@nestjs/typeorm': + optional: true + '@prisma/client': + optional: true + mongoose: + optional: true + sequelize: + optional: true + typeorm: + optional: true + + '@nestjs/testing@10.4.4': + resolution: {integrity: sha512-qRGFj51A5RM7JqA8pcyEwSLA3Y0dle/PAZ8oxP0suimoCusRY3Tk7wYqutZdCNj1ATb678SDaUZDHk2pwSv9/g==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -4198,6 +4253,9 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -4473,6 +4531,10 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -4638,6 +4700,10 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-disk-space@3.4.0: + resolution: {integrity: sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==} + engines: {node: '>=16'} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -4680,6 +4746,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -9006,6 +9076,9 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tsup@8.2.4: resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} engines: {node: '>=18'} @@ -9459,6 +9532,16 @@ packages: webpack-cli: optional: true + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -9515,6 +9598,10 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -11715,30 +11802,13 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - /@nestjs/axios@3.0.3(@nestjs/common@10.0.0)(axios@1.7.2)(rxjs@7.8.1): - resolution: {integrity: sha512-h6TCn3yJwD6OKqqqfmtRS5Zo4E46Ip2n+gK1sqwzNBC+qxQ9xpCu+ODVRFur6V3alHSCSBxb3nNtt73VEdluyA==} - peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - axios: ^1.3.1 - rxjs: ^6.0.0 || ^7.0.0 + '@nestjs/axios@3.0.3(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(axios@1.7.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1) axios: 1.7.2 rxjs: 7.8.1 - dev: false - /@nestjs/cli@10.0.0(esbuild@0.19.12): - resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - '@swc/cli': ^0.1.62 - '@swc/core': ^1.3.62 - peerDependenciesMeta: - '@swc/cli': - optional: true - '@swc/core': - optional: true + '@nestjs/cli@10.4.5(@swc/core@1.3.101)(esbuild@0.19.12)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -11748,7 +11818,7 @@ snapshots: chokidar: 3.6.0 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12)) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12)) glob: 10.4.2 inquirer: 8.2.6 node-emoji: 1.11.0 @@ -11757,7 +11827,7 @@ snapshots: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.3.3 - webpack: 5.93.0(@swc/core@1.3.101)(esbuild@0.19.12) + webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.12) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.3.101(@swc/helpers@0.5.2) @@ -11868,79 +11938,22 @@ snapshots: reflect-metadata: 0.2.0 swagger-ui-dist: 5.17.14 - /@nestjs/terminus@10.2.3(@nestjs/axios@3.0.3)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1): - resolution: {integrity: sha512-iX7gXtAooePcyQqFt57aDke5MzgdkBeYgF5YsFNNFwOiAFdIQEhfv3PR0G+HlH9F6D7nBCDZt9U87Pks/qHijg==} - peerDependencies: - '@grpc/grpc-js': '*' - '@grpc/proto-loader': '*' - '@mikro-orm/core': '*' - '@mikro-orm/nestjs': '*' - '@nestjs/axios': ^1.0.0 || ^2.0.0 || ^3.0.0 - '@nestjs/common': ^9.0.0 || ^10.0.0 - '@nestjs/core': ^9.0.0 || ^10.0.0 - '@nestjs/microservices': ^9.0.0 || ^10.0.0 - '@nestjs/mongoose': ^9.0.0 || ^10.0.0 - '@nestjs/sequelize': ^9.0.0 || ^10.0.0 - '@nestjs/typeorm': ^9.0.0 || ^10.0.0 - '@prisma/client': '*' - mongoose: '*' - reflect-metadata: 0.1.x || 0.2.x - rxjs: 7.x - sequelize: '*' - typeorm: '*' - peerDependenciesMeta: - '@grpc/grpc-js': - optional: true - '@grpc/proto-loader': - optional: true - '@mikro-orm/core': - optional: true - '@mikro-orm/nestjs': - optional: true - '@nestjs/axios': - optional: true - '@nestjs/microservices': - optional: true - '@nestjs/mongoose': - optional: true - '@nestjs/sequelize': - optional: true - '@nestjs/typeorm': - optional: true - '@prisma/client': - optional: true - mongoose: - optional: true - sequelize: - optional: true - typeorm: - optional: true + '@nestjs/terminus@10.2.3(@nestjs/axios@3.0.3(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(axios@1.7.2)(rxjs@7.8.1))(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1))(reflect-metadata@0.2.0)(rxjs@7.8.1)': dependencies: - '@nestjs/axios': 3.0.3(@nestjs/common@10.0.0)(axios@1.7.2)(rxjs@7.8.1) '@nestjs/common': 10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1) + '@nestjs/core': 10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1) boxen: 5.1.2 check-disk-space: 3.4.0 reflect-metadata: 0.2.0 rxjs: 7.8.1 - dev: false + optionalDependencies: + '@nestjs/axios': 3.0.3(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(axios@1.7.2)(rxjs@7.8.1) - /@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(@nestjs/platform-express@10.0.0): - resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true + '@nestjs/testing@10.4.4(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0))': dependencies: '@nestjs/common': 10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/platform-express@10.0.0)(reflect-metadata@0.2.0)(rxjs@7.8.1) - tslib: 2.5.3 + tslib: 2.7.0 optionalDependencies: '@nestjs/platform-express': 10.0.0(@nestjs/common@10.0.0(reflect-metadata@0.2.0)(rxjs@7.8.1))(@nestjs/core@10.0.0) @@ -13885,7 +13898,7 @@ snapshots: dependencies: '@types/node': 20.14.14 tapable: 2.2.1 - webpack: 5.93.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11) + webpack: 5.93.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.23.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -14437,16 +14450,11 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: dependencies: @@ -14825,9 +14833,7 @@ snapshots: bowser@2.11.0: {} - /boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} + boxen@5.1.2: dependencies: ansi-align: 3.0.1 camelcase: 6.3.0 @@ -14837,10 +14843,8 @@ snapshots: type-fest: 0.20.2 widest-line: 3.1.0 wrap-ansi: 7.0.0 - dev: false - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -14965,9 +14969,7 @@ snapshots: camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + camelcase@6.3.0: {} caniuse-lite@1.0.30001651: {} @@ -15032,15 +15034,9 @@ snapshots: chardet@0.7.0: {} - /check-disk-space@3.4.0: - resolution: {integrity: sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw==} - engines: {node: '>=16'} - dev: false + check-disk-space@3.4.0: {} - /check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - dev: true + check-error@2.1.1: {} chokidar@3.5.3: dependencies: @@ -15088,14 +15084,9 @@ snapshots: clean-stack@2.2.0: {} - /cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: false + cli-boxes@2.2.1: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -16475,7 +16466,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12)): + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12)): dependencies: '@babel/code-frame': 7.24.7 chalk: 4.1.2 @@ -16490,7 +16481,7 @@ snapshots: semver: 7.6.2 tapable: 2.2.1 typescript: 5.3.3 - webpack: 5.93.0(@swc/core@1.3.101)(esbuild@0.19.12) + webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.12) form-data-encoder@2.1.4: {} @@ -20211,19 +20202,19 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.93.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11) + webpack: 5.93.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.23.0) optionalDependencies: '@swc/core': 1.3.101(@swc/helpers@0.5.2) esbuild: 0.19.11 - terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.12)(webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12)): + terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.12)(webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.93.0(@swc/core@1.3.101)(esbuild@0.19.12) + webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.12) optionalDependencies: '@swc/core': 1.3.101(@swc/helpers@0.5.2) esbuild: 0.19.12 @@ -20392,14 +20383,14 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.24.7) esbuild: 0.19.12 - ts-loader@9.4.3(typescript@5.5.4)(webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12)): + ts-loader@9.4.3(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 micromatch: 4.0.7 semver: 7.6.2 typescript: 5.5.4 - webpack: 5.93.0(@swc/core@1.3.101)(esbuild@0.19.12) + webpack: 5.94.0(@swc/core@1.3.101)(esbuild@0.19.12) ts-node@10.9.1(@swc/core@1.3.101)(@types/node@20.14.14)(typescript@5.5.4): dependencies: @@ -20493,6 +20484,8 @@ snapshots: tslib@2.6.3: {} + tslib@2.7.0: {} + tsup@8.2.4(@swc/core@1.3.101(@swc/helpers@0.5.2))(jiti@1.21.6)(postcss@8.4.38)(typescript@5.5.4)(yaml@2.5.0): dependencies: bundle-require: 5.0.0(esbuild@0.23.0) @@ -21015,7 +21008,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.93.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.19.11): + webpack@5.93.0(@swc/core@1.3.101(@swc/helpers@0.5.2))(esbuild@0.23.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -21046,16 +21039,15 @@ snapshots: - esbuild - uglify-js - webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12): + webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12): dependencies: - '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.12.1 acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.23.1 + browserslist: 4.23.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 @@ -21069,7 +21061,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.12)(webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.12)) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.12)(webpack@5.94.0(@swc/core@1.3.101)(esbuild@0.19.12)) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -21157,33 +21149,16 @@ snapshots: wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: false - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + widest-line@3.1.0: dependencies: string-width: 4.2.3 - dev: false - /windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} - dependencies: - execa: 4.1.0 - dev: true + word-wrap@1.2.5: {} - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + wordwrap@1.0.0: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3