diff --git a/README.md b/README.md index 8f0f65f..74247e3 100644 --- a/README.md +++ b/README.md @@ -1,98 +1 @@ -

- Nest Logo -

- -[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 -[circleci-url]: https://circleci.com/gh/nestjs/nest - -

A progressive Node.js framework for building efficient and scalable server-side applications.

-

-NPM Version -Package License -NPM Downloads -CircleCI -Discord -Backers on Open Collective -Sponsors on Open Collective - Donate us - Support us - Follow us on Twitter -

- - -## Description - -[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. - -## Project setup - -```bash -$ npm install -``` - -## Compile and run the project - -```bash -# development -$ npm run start - -# watch mode -$ npm run start:dev - -# production mode -$ npm run start:prod -``` - -## Run tests - -```bash -# unit tests -$ npm run test - -# e2e tests -$ npm run test:e2e - -# test coverage -$ npm run test:cov -``` - -## Deployment - -When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information. - -If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps: - -```bash -$ npm install -g @nestjs/mau -$ mau deploy -``` - -With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure. - -## Resources - -Check out a few resources that may come in handy when working with NestJS: - -- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework. -- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy). -- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/). -- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks. -- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com). -- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com). -- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs). -- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com). - -## Support - -Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). - -## Stay in touch - -- Author - [Kamil Myƛliwiec](https://twitter.com/kammysliwiec) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - -Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE). +draw io:https://drive.google.com/file/d/1GG3wKqa1zMOOmao6KpTBBhl0Ykcl00Iv/view?usp=sharing diff --git a/apps/bridage/src/bridage.controller.spec.ts b/apps/bridage/src/bridage.controller.spec.ts new file mode 100644 index 0000000..4e4f622 --- /dev/null +++ b/apps/bridage/src/bridage.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { BridageController } from './bridage.controller'; +import { BridageService } from './bridage.service'; + +describe('BridageController', () => { + let bridageController: BridageController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [BridageController], + providers: [BridageService], + }).compile(); + + bridageController = app.get(BridageController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(bridageController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/apps/bridage/src/bridage.controller.ts b/apps/bridage/src/bridage.controller.ts new file mode 100644 index 0000000..f224803 --- /dev/null +++ b/apps/bridage/src/bridage.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { BridageService } from './bridage.service'; + +@Controller() +export class BridageController { + constructor(private readonly bridageService: BridageService) {} + + @Get() + getHello(): string { + return this.bridageService.getHello(); + } +} diff --git a/apps/bridage/src/bridage.module.ts b/apps/bridage/src/bridage.module.ts new file mode 100644 index 0000000..e621c26 --- /dev/null +++ b/apps/bridage/src/bridage.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { BridageController } from './bridage.controller'; +import { BridageService } from './bridage.service'; + +@Module({ + imports: [], + controllers: [BridageController], + providers: [BridageService], +}) +export class BridageModule {} diff --git a/src/app.service.ts b/apps/bridage/src/bridage.service.ts similarity index 79% rename from src/app.service.ts rename to apps/bridage/src/bridage.service.ts index 927d7cc..a1f2ea2 100644 --- a/src/app.service.ts +++ b/apps/bridage/src/bridage.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; @Injectable() -export class AppService { +export class BridageService { getHello(): string { return 'Hello World!'; } diff --git a/apps/bridage/src/bridage/bridage.controller.spec.ts b/apps/bridage/src/bridage/bridage.controller.spec.ts new file mode 100644 index 0000000..bf9ef08 --- /dev/null +++ b/apps/bridage/src/bridage/bridage.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { BridageController } from './bridage.controller'; +import { BridageService } from './bridage.service'; + +describe('BridageController', () => { + let controller: BridageController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [BridageController], + providers: [BridageService], + }).compile(); + + controller = module.get(BridageController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/apps/bridage/src/bridage/bridage.controller.ts b/apps/bridage/src/bridage/bridage.controller.ts new file mode 100644 index 0000000..92a1d76 --- /dev/null +++ b/apps/bridage/src/bridage/bridage.controller.ts @@ -0,0 +1,7 @@ +import { Controller } from '@nestjs/common'; +import { BridageService } from './bridage.service'; + +@Controller('bridage') +export class BridageController { + constructor(private readonly bridageService: BridageService) {} +} diff --git a/apps/bridage/src/bridage/bridage.module.ts b/apps/bridage/src/bridage/bridage.module.ts new file mode 100644 index 0000000..3838391 --- /dev/null +++ b/apps/bridage/src/bridage/bridage.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { BridageService } from './bridage.service'; +import { BridageController } from './bridage.controller'; + +@Module({ + controllers: [BridageController], + providers: [BridageService], +}) +export class BridageModule {} diff --git a/apps/bridage/src/bridage/bridage.service.spec.ts b/apps/bridage/src/bridage/bridage.service.spec.ts new file mode 100644 index 0000000..6eae1eb --- /dev/null +++ b/apps/bridage/src/bridage/bridage.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { BridageService } from './bridage.service'; + +describe('BridageService', () => { + let service: BridageService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [BridageService], + }).compile(); + + service = module.get(BridageService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/bridage/src/bridage/bridage.service.ts b/apps/bridage/src/bridage/bridage.service.ts new file mode 100644 index 0000000..4bc03cc --- /dev/null +++ b/apps/bridage/src/bridage/bridage.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BridageService {} diff --git a/apps/bridage/src/bridage/entity/bridage.entity.ts b/apps/bridage/src/bridage/entity/bridage.entity.ts new file mode 100644 index 0000000..3c3e70f --- /dev/null +++ b/apps/bridage/src/bridage/entity/bridage.entity.ts @@ -0,0 +1,13 @@ +import { User } from "apps/users/src/user/entity/user.entity"; +import { Entity, OneToOne, PrimaryGeneratedColumn } from "typeorm"; + + + +@Entity() +export class Bridage { + @PrimaryGeneratedColumn() + id: number; + @OneToOne(() => User, user => user.bridage) + user: User; +} + diff --git a/src/database/config/configuration.ts b/apps/bridage/src/database/config/configuration.ts similarity index 100% rename from src/database/config/configuration.ts rename to apps/bridage/src/database/config/configuration.ts diff --git a/src/database/database.mdoule.ts b/apps/bridage/src/database/database.mdoule.ts similarity index 100% rename from src/database/database.mdoule.ts rename to apps/bridage/src/database/database.mdoule.ts diff --git a/src/database/database.providers.ts b/apps/bridage/src/database/database.providers.ts similarity index 60% rename from src/database/database.providers.ts rename to apps/bridage/src/database/database.providers.ts index 254b913..52a85bc 100644 --- a/src/database/database.providers.ts +++ b/apps/bridage/src/database/database.providers.ts @@ -1,5 +1,8 @@ import { DataSource } from 'typeorm'; import configuration from './config/configuration'; +import { Bridage } from 'apps/bridage/src/bridage/entity/bridage.entity'; +import { DailyWorkouts } from 'apps/workouts/src/daily-workouts/entity/daily-workouts.entity'; +import { User } from 'apps/users/src/user/entity/user.entity'; const config = configuration(); export const databaseProviders = [ { @@ -9,7 +12,7 @@ export const databaseProviders = [ type: 'mongodb', url: config.db_url, database: 'test', - entities: [], + entities: [User, Bridage, DailyWorkouts], synchronize: true, }); diff --git a/apps/bridage/src/main.ts b/apps/bridage/src/main.ts new file mode 100644 index 0000000..87917aa --- /dev/null +++ b/apps/bridage/src/main.ts @@ -0,0 +1,8 @@ +import { NestFactory } from '@nestjs/core'; +import { BridageModule } from './bridage.module'; + +async function bootstrap() { + const app = await NestFactory.create(BridageModule); + await app.listen(process.env.port ?? 3000); +} +bootstrap(); diff --git a/test/app.e2e-spec.ts b/apps/bridage/test/app.e2e-spec.ts similarity index 71% rename from test/app.e2e-spec.ts rename to apps/bridage/test/app.e2e-spec.ts index 4df6580..b42968c 100644 --- a/test/app.e2e-spec.ts +++ b/apps/bridage/test/app.e2e-spec.ts @@ -1,15 +1,14 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import * as request from 'supertest'; -import { App } from 'supertest/types'; -import { AppModule } from './../src/app.module'; +import { BridageModule } from './../src/bridage.module'; -describe('AppController (e2e)', () => { - let app: INestApplication; +describe('BridageController (e2e)', () => { + let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ - imports: [AppModule], + imports: [BridageModule], }).compile(); app = moduleFixture.createNestApplication(); diff --git a/test/jest-e2e.json b/apps/bridage/test/jest-e2e.json similarity index 100% rename from test/jest-e2e.json rename to apps/bridage/test/jest-e2e.json diff --git a/apps/bridage/tsconfig.app.json b/apps/bridage/tsconfig.app.json new file mode 100644 index 0000000..ae8ae17 --- /dev/null +++ b/apps/bridage/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/bridage" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/apps/hackathon-api-gateway/src/hackathon-api-gateway.module.ts b/apps/hackathon-api-gateway/src/hackathon-api-gateway.module.ts new file mode 100644 index 0000000..39d5895 --- /dev/null +++ b/apps/hackathon-api-gateway/src/hackathon-api-gateway.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { UserModule } from './user/user.module'; + +@Module({ + imports: [UserModule], + controllers: [], + providers: [], +}) +export class HackathonApiGatewayModule { } diff --git a/apps/hackathon-api-gateway/src/main.ts b/apps/hackathon-api-gateway/src/main.ts new file mode 100644 index 0000000..c194de2 --- /dev/null +++ b/apps/hackathon-api-gateway/src/main.ts @@ -0,0 +1,8 @@ +import { NestFactory } from '@nestjs/core'; +import { HackathonApiGatewayModule } from './hackathon-api-gateway.module'; + +async function bootstrap() { + const app = await NestFactory.create(HackathonApiGatewayModule); + await app.listen(process.env.port ?? 3000); +} +bootstrap(); diff --git a/apps/hackathon-api-gateway/src/user/user.controller.ts b/apps/hackathon-api-gateway/src/user/user.controller.ts new file mode 100644 index 0000000..df18db4 --- /dev/null +++ b/apps/hackathon-api-gateway/src/user/user.controller.ts @@ -0,0 +1,11 @@ +import { Controller, Get } from '@nestjs/common'; +import { UserService } from './user.service'; + +@Controller('user') +export class UserController { + constructor(private readonly userService: UserService) { } + @Get("findAll") + findAll() { + return this.userService.findAll() + } +} diff --git a/apps/hackathon-api-gateway/src/user/user.module.ts b/apps/hackathon-api-gateway/src/user/user.module.ts new file mode 100644 index 0000000..9dc0d49 --- /dev/null +++ b/apps/hackathon-api-gateway/src/user/user.module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; +import { UserService } from './user.service'; +import { UserController } from './user.controller'; +import { ClientsModule, Transport } from '@nestjs/microservices'; + + +@Module({ + imports: [ + ClientsModule.register([ + { + name: 'USER_SERVICE', + transport: Transport.RMQ, + options: { + urls: ['amqp://localhost:5672'], + queue: 'user_queue', + queueOptions: { + durable: false + }, + }, + }, + ]), + ], + controllers: [UserController], + providers: [UserService], +}) +export class UserModule { } diff --git a/apps/hackathon-api-gateway/src/user/user.service.ts b/apps/hackathon-api-gateway/src/user/user.service.ts new file mode 100644 index 0000000..f65becb --- /dev/null +++ b/apps/hackathon-api-gateway/src/user/user.service.ts @@ -0,0 +1,14 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; + +@Injectable() +export class UserService { + constructor(@Inject("USER_SERVICE") private usersClient: ClientProxy) { } + async findAll() { + console.log("aa") + return this.usersClient.send("user.findAll", {}) + + } + + +} diff --git a/apps/hackathon-api-gateway/test/app.e2e-spec.ts b/apps/hackathon-api-gateway/test/app.e2e-spec.ts new file mode 100644 index 0000000..e8a8dfd --- /dev/null +++ b/apps/hackathon-api-gateway/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { HackathonApiGatewayModule } from './../src/hackathon-api-gateway.module'; + +describe('HackathonApiGatewayController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [HackathonApiGatewayModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/apps/hackathon-api-gateway/test/jest-e2e.json b/apps/hackathon-api-gateway/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/apps/hackathon-api-gateway/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/hackathon-api-gateway/tsconfig.app.json b/apps/hackathon-api-gateway/tsconfig.app.json new file mode 100644 index 0000000..103476c --- /dev/null +++ b/apps/hackathon-api-gateway/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/hackathon-api-gateway" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/apps/users/constants.ts b/apps/users/constants.ts new file mode 100644 index 0000000..7ba0d3f --- /dev/null +++ b/apps/users/constants.ts @@ -0,0 +1,4 @@ +export const jwtConstants = { + secret: 'DO NOT USE THIS VALUE. INSTEAD, CREATE A COMPLEX SECRET AND KEEP IT SAFE OUTSIDE OF THE SOURCE CODE.', +}; + diff --git a/apps/users/src/main.ts b/apps/users/src/main.ts new file mode 100644 index 0000000..cd73cba --- /dev/null +++ b/apps/users/src/main.ts @@ -0,0 +1,18 @@ +import { NestFactory } from '@nestjs/core'; +import { UsersModule } from './users.module'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; + +async function bootstrap() { + const app = await NestFactory.createMicroservice(UsersModule, { + transport: Transport.RMQ, + options: { + urls: ['amqp://localhost:5672'], + queue: 'user_queue', + queueOptions: { + durable: false + }, + }, + }); + await app.listen(); +} +bootstrap(); diff --git a/apps/users/src/user/entity/user.entity.ts b/apps/users/src/user/entity/user.entity.ts new file mode 100644 index 0000000..3f7543c --- /dev/null +++ b/apps/users/src/user/entity/user.entity.ts @@ -0,0 +1,19 @@ +import { Bridage } from "apps/bridage/src/bridage/entity/bridage.entity"; +import { DailyWorkouts } from "apps/workouts/src/daily-workouts/entity/daily-workouts.entity"; +import { Column, Entity, ManyToOne, OneToMany, OneToOne, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class User { + @PrimaryGeneratedColumn() + id: number; + @Column() + email: string; + @Column() + name: string + @Column() + password: string + @OneToOne(() => Bridage, bridage => bridage.user) + bridage: Bridage; + @OneToMany(() => DailyWorkouts, workout => workout.id) + dailyWorkout: DailyWorkouts[]; +} diff --git a/apps/users/src/user/user.controller.ts b/apps/users/src/user/user.controller.ts new file mode 100644 index 0000000..8f6bf4a --- /dev/null +++ b/apps/users/src/user/user.controller.ts @@ -0,0 +1,12 @@ +import { Controller } from '@nestjs/common'; +import { UserService } from './user.service'; +import { MessagePattern } from '@nestjs/microservices'; + +export class UserController { + constructor(private readonly userService: UserService) { } + @MessagePattern('user.findAll') + findAll() { + console.log(`Pattern: `); + return "user find" + } +} diff --git a/apps/users/src/user/user.module.ts b/apps/users/src/user/user.module.ts new file mode 100644 index 0000000..1ec4416 --- /dev/null +++ b/apps/users/src/user/user.module.ts @@ -0,0 +1,15 @@ +import { forwardRef, Module } from '@nestjs/common'; +import { UserService } from './user.service'; +import { UserController } from './user.controller'; +import { User } from './entity/user.entity'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { userProviders } from './user.providers'; +import { DatabaseModule } from '@libs/database/src'; +@Module({ + imports: [DatabaseModule], + controllers: [UserController], + providers: [...userProviders, UserService], + exports: [UserService], + +}) +export class UserModule { } diff --git a/apps/users/src/user/user.providers.ts b/apps/users/src/user/user.providers.ts new file mode 100644 index 0000000..244d64e --- /dev/null +++ b/apps/users/src/user/user.providers.ts @@ -0,0 +1,11 @@ +import { DataSource } from 'typeorm'; +import { User } from './entity/user.entity'; + +export const userProviders = [ + { + provide: 'USER_REPOSITORY', + useFactory: (dataSource: DataSource) => dataSource.getRepository(User), + inject: ['DATA_SOURCE'], + }, +]; + diff --git a/apps/users/src/user/user.service.ts b/apps/users/src/user/user.service.ts new file mode 100644 index 0000000..ed20fea --- /dev/null +++ b/apps/users/src/user/user.service.ts @@ -0,0 +1,19 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { User } from './entity/user.entity'; +import { Repository } from 'typeorm'; + +@Injectable() +export class UserService { + constructor( + @Inject('USER_REPOSITORY') + private readonly userRepository: Repository, + ) { } + + async findOne(email: string): Promise { + return this.userRepository.findOne({ + where: { email }, + relations: ['bridage', 'dailyWorkout'], + }); + } +} diff --git a/apps/users/src/users.module.ts b/apps/users/src/users.module.ts new file mode 100644 index 0000000..d3cd9ac --- /dev/null +++ b/apps/users/src/users.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { UserModule } from './user/user.module'; +import { DatabaseModule } from 'apps/workouts/src/database/database.mdoule'; + +@Module({ + imports: [UserModule, DatabaseModule], + controllers: [], + providers: [], +}) +export class UsersModule { } diff --git a/apps/users/test/app.e2e-spec.ts b/apps/users/test/app.e2e-spec.ts new file mode 100644 index 0000000..af08da0 --- /dev/null +++ b/apps/users/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { UsersModule } from './../src/users.module'; + +describe('UsersController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [UsersModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/apps/users/test/jest-e2e.json b/apps/users/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/apps/users/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/users/tsconfig.app.json b/apps/users/tsconfig.app.json new file mode 100644 index 0000000..7c55507 --- /dev/null +++ b/apps/users/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/users" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/apps/workouts/src/daily-workouts/daily-workouts.controller.spec.ts b/apps/workouts/src/daily-workouts/daily-workouts.controller.spec.ts new file mode 100644 index 0000000..bd59ed4 --- /dev/null +++ b/apps/workouts/src/daily-workouts/daily-workouts.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DailyWorkoutsController } from './daily-workouts.controller'; +import { DailyWorkoutsService } from './daily-workouts.service'; + +describe('DailyWorkoutsController', () => { + let controller: DailyWorkoutsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [DailyWorkoutsController], + providers: [DailyWorkoutsService], + }).compile(); + + controller = module.get(DailyWorkoutsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/apps/workouts/src/daily-workouts/daily-workouts.controller.ts b/apps/workouts/src/daily-workouts/daily-workouts.controller.ts new file mode 100644 index 0000000..76eab68 --- /dev/null +++ b/apps/workouts/src/daily-workouts/daily-workouts.controller.ts @@ -0,0 +1,7 @@ +import { Controller } from '@nestjs/common'; +import { DailyWorkoutsService } from './daily-workouts.service'; + +@Controller('daily-workouts') +export class DailyWorkoutsController { + constructor(private readonly dailyWorkoutsService: DailyWorkoutsService) {} +} diff --git a/apps/workouts/src/daily-workouts/daily-workouts.module.ts b/apps/workouts/src/daily-workouts/daily-workouts.module.ts new file mode 100644 index 0000000..4059c9c --- /dev/null +++ b/apps/workouts/src/daily-workouts/daily-workouts.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { DailyWorkoutsService } from './daily-workouts.service'; +import { DailyWorkoutsController } from './daily-workouts.controller'; + +@Module({ + controllers: [DailyWorkoutsController], + providers: [DailyWorkoutsService], +}) +export class DailyWorkoutsModule {} diff --git a/apps/workouts/src/daily-workouts/daily-workouts.service.spec.ts b/apps/workouts/src/daily-workouts/daily-workouts.service.spec.ts new file mode 100644 index 0000000..7609227 --- /dev/null +++ b/apps/workouts/src/daily-workouts/daily-workouts.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DailyWorkoutsService } from './daily-workouts.service'; + +describe('DailyWorkoutsService', () => { + let service: DailyWorkoutsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DailyWorkoutsService], + }).compile(); + + service = module.get(DailyWorkoutsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/workouts/src/daily-workouts/daily-workouts.service.ts b/apps/workouts/src/daily-workouts/daily-workouts.service.ts new file mode 100644 index 0000000..c092aff --- /dev/null +++ b/apps/workouts/src/daily-workouts/daily-workouts.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class DailyWorkoutsService {} diff --git a/apps/workouts/src/daily-workouts/entity/daily-workouts.entity.ts b/apps/workouts/src/daily-workouts/entity/daily-workouts.entity.ts new file mode 100644 index 0000000..c2d7633 --- /dev/null +++ b/apps/workouts/src/daily-workouts/entity/daily-workouts.entity.ts @@ -0,0 +1,10 @@ +import { User } from "apps/users/src/user/entity/user.entity"; +import { Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; + +@Entity() +export class DailyWorkouts { + @PrimaryGeneratedColumn() + id: number; + @ManyToOne(() => User, user => user.id) + user: User +} diff --git a/apps/workouts/src/database/config/configuration.ts b/apps/workouts/src/database/config/configuration.ts new file mode 100644 index 0000000..a8a81e6 --- /dev/null +++ b/apps/workouts/src/database/config/configuration.ts @@ -0,0 +1,5 @@ + +export default () => ({ + db_url: process.env.DATABASE_URL, +}); + diff --git a/apps/workouts/src/database/database.mdoule.ts b/apps/workouts/src/database/database.mdoule.ts new file mode 100644 index 0000000..537a73d --- /dev/null +++ b/apps/workouts/src/database/database.mdoule.ts @@ -0,0 +1,15 @@ +import { Module } from '@nestjs/common'; +import { databaseProviders } from './database.providers'; +import { ConfigModule } from '@nestjs/config'; +import configuration from './config/configuration'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + load: [configuration], + }), + ], + providers: [...databaseProviders], + exports: [...databaseProviders], +}) +export class DatabaseModule { } diff --git a/apps/workouts/src/database/database.providers.ts b/apps/workouts/src/database/database.providers.ts new file mode 100644 index 0000000..66a870f --- /dev/null +++ b/apps/workouts/src/database/database.providers.ts @@ -0,0 +1,24 @@ +import { DataSource } from 'typeorm'; +import configuration from './config/configuration'; +import { Bridage } from 'apps/bridage/src/bridage/entity/bridage.entity'; +import { DailyWorkouts } from 'apps/workouts/src/daily-workouts/entity/daily-workouts.entity'; +import { User } from 'apps/users/src/user/entity/user.entity'; + +const config = configuration(); +export const databaseProviders = [ + { + provide: 'DATA_SOURCE', + useFactory: async () => { + const dataSource = new DataSource({ + type: 'mongodb', + url: config.db_url, + database: 'test', + entities: [User, Bridage, DailyWorkouts], + synchronize: true, + }); + + return dataSource.initialize(); + }, + }, +]; + diff --git a/apps/workouts/src/main.ts b/apps/workouts/src/main.ts new file mode 100644 index 0000000..a7c8b64 --- /dev/null +++ b/apps/workouts/src/main.ts @@ -0,0 +1,8 @@ +import { NestFactory } from '@nestjs/core'; +import { WorkoutsModule } from './workouts.module'; + +async function bootstrap() { + const app = await NestFactory.create(WorkoutsModule); + await app.listen(process.env.port ?? 3000); +} +bootstrap(); diff --git a/apps/workouts/src/workouts.controller.spec.ts b/apps/workouts/src/workouts.controller.spec.ts new file mode 100644 index 0000000..9d8e72e --- /dev/null +++ b/apps/workouts/src/workouts.controller.spec.ts @@ -0,0 +1,22 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { WorkoutsController } from './workouts.controller'; +import { WorkoutsService } from './workouts.service'; + +describe('WorkoutsController', () => { + let workoutsController: WorkoutsController; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [WorkoutsController], + providers: [WorkoutsService], + }).compile(); + + workoutsController = app.get(WorkoutsController); + }); + + describe('root', () => { + it('should return "Hello World!"', () => { + expect(workoutsController.getHello()).toBe('Hello World!'); + }); + }); +}); diff --git a/apps/workouts/src/workouts.controller.ts b/apps/workouts/src/workouts.controller.ts new file mode 100644 index 0000000..c7e2e17 --- /dev/null +++ b/apps/workouts/src/workouts.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { WorkoutsService } from './workouts.service'; + +@Controller() +export class WorkoutsController { + constructor(private readonly workoutsService: WorkoutsService) {} + + @Get() + getHello(): string { + return this.workoutsService.getHello(); + } +} diff --git a/apps/workouts/src/workouts.module.ts b/apps/workouts/src/workouts.module.ts new file mode 100644 index 0000000..2023662 --- /dev/null +++ b/apps/workouts/src/workouts.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { WorkoutsController } from './workouts.controller'; +import { WorkoutsService } from './workouts.service'; + +@Module({ + imports: [], + controllers: [WorkoutsController], + providers: [WorkoutsService], +}) +export class WorkoutsModule {} diff --git a/apps/workouts/src/workouts.service.ts b/apps/workouts/src/workouts.service.ts new file mode 100644 index 0000000..58b4b10 --- /dev/null +++ b/apps/workouts/src/workouts.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class WorkoutsService { + getHello(): string { + return 'Hello World!'; + } +} diff --git a/apps/workouts/test/app.e2e-spec.ts b/apps/workouts/test/app.e2e-spec.ts new file mode 100644 index 0000000..27f3a98 --- /dev/null +++ b/apps/workouts/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { WorkoutsModule } from './../src/workouts.module'; + +describe('WorkoutsController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [WorkoutsModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/apps/workouts/test/jest-e2e.json b/apps/workouts/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/apps/workouts/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/workouts/tsconfig.app.json b/apps/workouts/tsconfig.app.json new file mode 100644 index 0000000..90ee94a --- /dev/null +++ b/apps/workouts/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/workouts" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/libs/contracts/tsconfig.lib.json b/libs/contracts/tsconfig.lib.json new file mode 100644 index 0000000..f0b647f --- /dev/null +++ b/libs/contracts/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/contracts" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/libs/contracts/users/validateUser.dto.ts b/libs/contracts/users/validateUser.dto.ts new file mode 100644 index 0000000..62e6467 --- /dev/null +++ b/libs/contracts/users/validateUser.dto.ts @@ -0,0 +1,10 @@ +import { IsString } from "class-validator"; + + +export class ValidateUserDto { + @IsString() + email: string + @IsString() + password: string + +} diff --git a/libs/database/src/config/configuration.ts b/libs/database/src/config/configuration.ts new file mode 100644 index 0000000..9180c97 --- /dev/null +++ b/libs/database/src/config/configuration.ts @@ -0,0 +1,7 @@ +require('dotenv').config(); + +export default () => ({ + db_url: process.env.DATABASE_URL, +}); + + diff --git a/libs/database/src/database.module.ts b/libs/database/src/database.module.ts new file mode 100644 index 0000000..f5cb774 --- /dev/null +++ b/libs/database/src/database.module.ts @@ -0,0 +1,23 @@ +import { Module } from '@nestjs/common'; +import { databaseProviders } from './database.providers'; +import { ConfigModule } from '@nestjs/config'; +import configuration from './config/configuration'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + load: [configuration], + }), + ], + providers: [...databaseProviders], + exports: [...databaseProviders], +}) +export class DatabaseModule { } + + + + + + + + diff --git a/libs/database/src/database.providers.ts b/libs/database/src/database.providers.ts new file mode 100644 index 0000000..9608160 --- /dev/null +++ b/libs/database/src/database.providers.ts @@ -0,0 +1,23 @@ +import { DataSource } from 'typeorm'; +import { Bridage } from 'apps/bridage/src/bridage/entity/bridage.entity'; +import { DailyWorkouts } from 'apps/workouts/src/daily-workouts/entity/daily-workouts.entity'; +import { User } from 'apps/users/src/user/entity/user.entity'; +import configuration from './config/configuration'; +const config = configuration(); +export const databaseProviders = [ + { + provide: 'DATA_SOURCE', + useFactory: async () => { + const dataSource = new DataSource({ + type: 'mongodb', + url: config.db_url, + database: 'test', + entities: [User, Bridage, DailyWorkouts], + synchronize: true, + }); + + return dataSource.initialize(); + }, + }, +]; + diff --git a/libs/database/src/index.ts b/libs/database/src/index.ts new file mode 100644 index 0000000..10befac --- /dev/null +++ b/libs/database/src/index.ts @@ -0,0 +1,2 @@ +export * from './database.module'; +export * from './database.providers'; diff --git a/libs/database/tsconfig.lib.json b/libs/database/tsconfig.lib.json new file mode 100644 index 0000000..21c8d58 --- /dev/null +++ b/libs/database/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/database" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/libs/guards/src/auth.guard.ts b/libs/guards/src/auth.guard.ts new file mode 100644 index 0000000..e69de29 diff --git a/libs/guards/src/guards.module.ts b/libs/guards/src/guards.module.ts new file mode 100644 index 0000000..465e3a1 --- /dev/null +++ b/libs/guards/src/guards.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { LocalAuthGuard } from './local-auth.guard'; +import { JwtAuthGuard } from './auth.guard'; + +@Module({ + providers: [LocalAuthGuard, JwtAuthGuard], + exports: [LocalAuthGuard, JwtAuthGuard], +}) +export class GuardsModule { } diff --git a/libs/guards/src/index.ts b/libs/guards/src/index.ts new file mode 100644 index 0000000..fb483c5 --- /dev/null +++ b/libs/guards/src/index.ts @@ -0,0 +1,2 @@ +export * from './guards.module'; +export * from './guards.service'; diff --git a/libs/guards/src/local-auth.guard.ts b/libs/guards/src/local-auth.guard.ts new file mode 100644 index 0000000..250817d --- /dev/null +++ b/libs/guards/src/local-auth.guard.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class LocalAuthGuard extends AuthGuard('local') { } + diff --git a/libs/guards/tsconfig.lib.json b/libs/guards/tsconfig.lib.json new file mode 100644 index 0000000..d0a3e3d --- /dev/null +++ b/libs/guards/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/guards" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/libs/strategy/src/auth.strategy.ts b/libs/strategy/src/auth.strategy.ts new file mode 100644 index 0000000..6523d77 --- /dev/null +++ b/libs/strategy/src/auth.strategy.ts @@ -0,0 +1,31 @@ +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { PassportStrategy } from '@nestjs/passport'; +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { Request } from 'express'; +import { jwtConstants } from 'apps/users/constants'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor() { + super({ + jwtFromRequest: ExtractJwt.fromExtractors([ + (req: Request) => { + if (req && req.cookies) { + return req.cookies['token']; + } + return null; + }, + ]), + ignoreExpiration: false, + secretOrKey: jwtConstants.secret, + }); + } + + async validate(payload: any) { + if (!payload) { + throw new UnauthorizedException(); + } + return { id: payload.id }; + } +} + diff --git a/libs/strategy/src/index.ts b/libs/strategy/src/index.ts new file mode 100644 index 0000000..ca3ec7d --- /dev/null +++ b/libs/strategy/src/index.ts @@ -0,0 +1 @@ +export * from './strategy.module'; diff --git a/libs/strategy/src/local.strategy.ts b/libs/strategy/src/local.strategy.ts new file mode 100644 index 0000000..e599b30 --- /dev/null +++ b/libs/strategy/src/local.strategy.ts @@ -0,0 +1,17 @@ +import { PassportStrategy } from "@nestjs/passport"; +import { Strategy } from "passport-local"; +import { Inject, Injectable } from "@nestjs/common"; +import { ClientProxy } from "@nestjs/microservices"; + +@Injectable() +export class LocalStrategy extends PassportStrategy(Strategy) { + constructor(@Inject("USER_SERVICE") private usersClient: ClientProxy) { + super({ usernameField: 'email', passReqToCallback: false }); + } + + async validate(email: string, password: string): Promise { + const user = this.usersClient.send("auth.validateUser", { email, password }) + return user; + } +} + diff --git a/libs/strategy/src/strategy.module.ts b/libs/strategy/src/strategy.module.ts new file mode 100644 index 0000000..395413a --- /dev/null +++ b/libs/strategy/src/strategy.module.ts @@ -0,0 +1,33 @@ +import { Module } from '@nestjs/common'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { LocalStrategy } from './local.strategy'; +import { JwtStrategy } from './auth.strategy'; +import { JwtModule } from '@nestjs/jwt'; +import { jwtConstants } from 'apps/users/constants'; +import { PassportModule } from '@nestjs/passport'; + +@Module({ + imports: [ + ClientsModule.register([ + { + name: 'USER_SERVICE', + transport: Transport.RMQ, + options: { + urls: ['amqp://localhost:5672'], + queue: 'user_queue', + queueOptions: { + durable: false + }, + }, + }, + ]), + PassportModule.register({ session: false }), + JwtModule.register({ + secret: jwtConstants.secret, + signOptions: { expiresIn: '1h' }, + }), + ], + providers: [LocalStrategy, JwtStrategy], + exports: [LocalStrategy, JwtModule], +}) +export class StrategyModule { } diff --git a/libs/strategy/tsconfig.lib.json b/libs/strategy/tsconfig.lib.json new file mode 100644 index 0000000..7348032 --- /dev/null +++ b/libs/strategy/tsconfig.lib.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "outDir": "../../dist/libs/strategy" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/nest-cli.json b/nest-cli.json index f9aa683..077cf39 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -1,8 +1,86 @@ { "$schema": "https://json.schemastore.org/nest-cli", "collection": "@nestjs/schematics", - "sourceRoot": "src", + "sourceRoot": "apps/hackathon-api-gateway/src", "compilerOptions": { - "deleteOutDir": true + "deleteOutDir": true, + "webpack": true, + "tsConfigPath": "apps/hackathon-api-gateway/tsconfig.app.json" + }, + "monorepo": true, + "root": "apps/hackathon-api-gateway", + "projects": { + "bridage": { + "type": "application", + "root": "apps/bridage", + "entryFile": "main", + "sourceRoot": "apps/bridage/src", + "compilerOptions": { + "tsConfigPath": "apps/bridage/tsconfig.app.json" + } + }, + "contracts": { + "type": "library", + "root": "libs/contracts", + "entryFile": "index", + "sourceRoot": "libs/contracts/src", + "compilerOptions": { + "tsConfigPath": "libs/contracts/tsconfig.lib.json" + } + }, + "database": { + "type": "library", + "root": "libs/database", + "entryFile": "index", + "sourceRoot": "libs/database/src", + "compilerOptions": { + "tsConfigPath": "libs/database/tsconfig.lib.json" + } + }, + "guards": { + "type": "library", + "root": "libs/guards", + "entryFile": "index", + "sourceRoot": "libs/guards/src", + "compilerOptions": { + "tsConfigPath": "libs/guards/tsconfig.lib.json" + } + }, + "hackathon-api-gateway": { + "type": "application", + "root": "apps/hackathon-api-gateway", + "entryFile": "main", + "sourceRoot": "apps/hackathon-api-gateway/src", + "compilerOptions": { + "tsConfigPath": "apps/hackathon-api-gateway/tsconfig.app.json" + } + }, + "strategy": { + "type": "library", + "root": "libs/strategy", + "entryFile": "index", + "sourceRoot": "libs/strategy/src", + "compilerOptions": { + "tsConfigPath": "libs/strategy/tsconfig.lib.json" + } + }, + "users": { + "type": "application", + "root": "apps/users", + "entryFile": "main", + "sourceRoot": "apps/users/src", + "compilerOptions": { + "tsConfigPath": "apps/users/tsconfig.app.json" + } + }, + "workouts": { + "type": "application", + "root": "apps/workouts", + "entryFile": "main", + "sourceRoot": "apps/workouts/src", + "compilerOptions": { + "tsConfigPath": "apps/workouts/tsconfig.app.json" + } + } } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 81270c8..f23bd80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,20 @@ "@nestjs/common": "^11.0.1", "@nestjs/config": "^4.0.2", "@nestjs/core": "^11.0.1", + "@nestjs/jwt": "^11.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/microservices": "^11.0.17", + "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.1", "@nestjs/typeorm": "^11.0.0", + "amqp-connection-manager": "^4.1.14", + "amqplib": "^0.10.7", + "bcrypt": "^5.1.1", + "class-validator": "^0.14.1", "mongodb": "^6.15.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "typeorm": "^0.3.22" @@ -30,6 +41,8 @@ "@types/express": "^5.0.0", "@types/jest": "^29.5.14", "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", + "@types/passport-local": "^1.0.38", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -1923,6 +1936,50 @@ "node": ">=8" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", @@ -2564,6 +2621,107 @@ } } }, + "node_modules/@nestjs/jwt": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.0.tgz", + "integrity": "sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==", + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "9.0.7", + "jsonwebtoken": "9.0.2" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0" + } + }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/microservices": { + "version": "11.0.17", + "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-11.0.17.tgz", + "integrity": "sha512-eUPJR8BG+bvhl92GWx8uvNDY95HHidYefWG4pfXr4rbUK7HxQCGxnyeM458QFu3w66Ia1KqlQbKnfdhY8wu6pQ==", + "license": "MIT", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@grpc/grpc-js": "*", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "amqp-connection-manager": "*", + "amqplib": "*", + "cache-manager": "*", + "ioredis": "*", + "kafkajs": "*", + "mqtt": "*", + "nats": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@grpc/grpc-js": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + }, + "amqp-connection-manager": { + "optional": true + }, + "amqplib": { + "optional": true + }, + "cache-manager": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "kafkajs": { + "optional": true + }, + "mqtt": { + "optional": true + }, + "nats": { + "optional": true + } + } + }, + "node_modules/@nestjs/passport": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", + "integrity": "sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "passport": "^0.5.0 || ^0.6.0 || ^0.7.0" + } + }, "node_modules/@nestjs/platform-express": { "version": "11.0.16", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.16.tgz", @@ -3332,6 +3490,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -3350,12 +3517,55 @@ "version": "22.14.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", - "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-local": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz", + "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/passport": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.18", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", @@ -3424,6 +3634,12 @@ "@types/superagent": "^8.1.0" } }, + "node_modules/@types/validator": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-nh7nrWhLr6CBq9ldtw0wx+z9wKnnv/uTVLA9g/3/TcOYxbpOSZE+MhKPmWqU+K0NvThjhv12uD8MuqijB0WzEA==", + "license": "MIT" + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -4481,6 +4697,12 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -4530,6 +4752,18 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4599,6 +4833,35 @@ "ajv": "^6.9.1" } }, + "node_modules/amqp-connection-manager": { + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-4.1.14.tgz", + "integrity": "sha512-1km47dIvEr0HhMUazqovSvNwIlSvDX2APdUpULaINtHpiki1O+cLRaTeXb/jav4OLtH+k6GBXx5gsKOT9kcGKQ==", + "license": "MIT", + "dependencies": { + "promise-breaker": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0", + "npm": ">5.0.0" + }, + "peerDependencies": { + "amqplib": "*" + } + }, + "node_modules/amqplib": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.7.tgz", + "integrity": "sha512-7xPSYKSX2kj/bT6iHZ3MlctzxdCW1Ds9xyN0EmuRi2DZxHztwwoG1YkZrgmLyuPNjfxlRiMdWJPQscmoa3Vgdg==", + "license": "MIT", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -4703,6 +4966,12 @@ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "license": "MIT" }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, "node_modules/arch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/arch/-/arch-3.0.0.tgz", @@ -4724,6 +4993,34 @@ ], "license": "MIT" }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -4933,6 +5230,20 @@ ], "license": "MIT" }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/bin-version": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", @@ -5019,7 +5330,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -5139,12 +5449,24 @@ "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", + "license": "MIT" + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -5314,6 +5636,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -5347,6 +5678,17 @@ "dev": true, "license": "MIT" }, + "node_modules/class-validator": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5497,6 +5839,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5551,7 +5902,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -5578,6 +5928,12 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5838,6 +6194,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5847,6 +6209,15 @@ "node": ">= 0.8" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5935,6 +6306,15 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -6929,6 +7309,36 @@ "node": ">=12" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/fs-monkey": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", @@ -6940,7 +7350,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -6967,6 +7376,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7229,6 +7686,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -7295,6 +7758,19 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7399,7 +7875,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -8450,6 +8925,49 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8504,6 +9022,12 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.6.tgz", + "integrity": "sha512-PJiS4ETaUfCOFLpmtKzAbqZQjCCKVu2OhTV4SVNNE7c2nu/dACvtCqj4L0i/KWNnIgRv7yrILvBj5Lonv5Ncxw==", + "license": "MIT" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -8543,6 +9067,42 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8557,6 +9117,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8804,7 +9370,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8831,6 +9396,37 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -9006,6 +9602,12 @@ "dev": true, "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -9016,6 +9618,48 @@ "lodash": "^4.17.21" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -9030,6 +9674,21 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9066,6 +9725,19 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9298,6 +9970,53 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "license": "MIT", + "dependencies": { + "jsonwebtoken": "^9.0.0", + "passport-strategy": "^1.0.0" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9312,7 +10031,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9380,6 +10098,11 @@ "node": ">=8" } }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/peek-readable": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", @@ -9593,6 +10316,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/promise-breaker": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-6.0.0.tgz", + "integrity": "sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA==", + "license": "MIT" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -9661,6 +10390,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9806,6 +10541,12 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -9925,6 +10666,43 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -10047,7 +10825,6 @@ "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -10132,6 +10909,12 @@ "node": ">= 18" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -10736,6 +11519,23 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", @@ -10748,6 +11548,33 @@ "streamx": "^2.15.0" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/terser": { "version": "5.39.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", @@ -11580,7 +12407,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "devOptional": true, "license": "MIT" }, "node_modules/universalify": { @@ -11643,12 +12469,31 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -11684,6 +12529,15 @@ "node": ">=10.12.0" } }, + "node_modules/validator": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", + "integrity": "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -11976,6 +12830,15 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 7a7af20..d263878 100644 --- a/package.json +++ b/package.json @@ -7,25 +7,36 @@ "license": "UNLICENSED", "scripts": { "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "format": "prettier --write \"apps/**/*.ts\" \"libs/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", + "start:prod": "node dist/apps/BE-hackathon/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" + "test:e2e": "jest --config ./apps/BE-hackathon/test/jest-e2e.json" }, "dependencies": { "@nestjs/common": "^11.0.1", "@nestjs/config": "^4.0.2", "@nestjs/core": "^11.0.1", + "@nestjs/jwt": "^11.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/microservices": "^11.0.17", + "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.1", "@nestjs/typeorm": "^11.0.0", + "amqp-connection-manager": "^4.1.14", + "amqplib": "^0.10.7", + "bcrypt": "^5.1.1", + "class-validator": "^0.14.1", "mongodb": "^6.15.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "typeorm": "^0.3.22" @@ -41,6 +52,8 @@ "@types/express": "^5.0.0", "@types/jest": "^29.5.14", "@types/node": "^22.10.7", + "@types/passport-jwt": "^4.0.1", + "@types/passport-local": "^1.0.38", "@types/supertest": "^6.0.2", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", @@ -63,7 +76,7 @@ "json", "ts" ], - "rootDir": "src", + "rootDir": ".", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" @@ -71,7 +84,17 @@ "collectCoverageFrom": [ "**/*.(t|j)s" ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" + "coverageDirectory": "./coverage", + "testEnvironment": "node", + "roots": [ + "/apps/", + "/libs/" + ], + "moduleNameMapper": { + "^@app/contracts(|/.*)$": "/libs/contracts/src/$1", + "^@app/database(|/.*)$": "/libs/database/src/$1", + "^@app/guards(|/.*)$": "/libs/guards/src/$1", + "^@app/strategy(|/.*)$": "/libs/strategy/src/$1" + } } } diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts deleted file mode 100644 index d22f389..0000000 --- a/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/src/app.controller.ts b/src/app.controller.ts deleted file mode 100644 index cce879e..0000000 --- a/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/src/app.module.ts b/src/app.module.ts deleted file mode 100644 index c8bbc5a..0000000 --- a/src/app.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; -import { ConfigModule } from '@nestjs/config'; -@Module({ - imports: [ConfigModule.forRoot()], - controllers: [AppController], - providers: [AppService], -}) -export class AppModule { } diff --git a/src/main.ts b/src/main.ts deleted file mode 100644 index f76bc8d..0000000 --- a/src/main.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; - -async function bootstrap() { - const app = await NestFactory.create(AppModule); - await app.listen(process.env.PORT ?? 3000); -} -bootstrap(); diff --git a/tsconfig.json b/tsconfig.json index e4dbf2e..a3d8ea8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,25 @@ "forceConsistentCasingInFileNames": true, "noImplicitAny": false, "strictBindCallApply": false, - "noFallthroughCasesInSwitch": false + "noFallthroughCasesInSwitch": false, + "paths": { + "@app/contracts": [ + "libs/contracts/src" + ], + "@app/contracts/*": [ + "libs/contracts/src/*" + ], + "@app/strategy": [ + "libs/strategy/src", + "libs/strategy/src" + ], + "@app/strategy/*": [ + "libs/strategy/src/*", + "libs/strategy/src/*" + ], + "@libs/*": [ + "libs/*" + ] + } } -} +} \ No newline at end of file