diff --git a/apps/api/src/modules/auth/auth.module.ts b/apps/api/src/modules/auth/auth.module.ts index 4b522eb..db93348 100644 --- a/apps/api/src/modules/auth/auth.module.ts +++ b/apps/api/src/modules/auth/auth.module.ts @@ -1,17 +1,10 @@ -import { AuthService, GoogleStrategy, JwtStrategy, LocalStrategy } from '@gh/auth'; -import { PrismaService } from '@gh/prisma'; -import { UsersService } from '@gh/users'; +import { AuthModule as LibAuthModule } from '@gh/auth'; +import { PrismaModule } from '@gh/prisma'; import { Module } from '@nestjs/common'; -import { JwtModule } from '@nestjs/jwt'; -import { PassportModule } from '@nestjs/passport'; import { AuthController } from './auth.controller'; @Module({ - imports: [ - PassportModule, - JwtModule, - ], - providers: [AuthService, LocalStrategy, JwtStrategy, GoogleStrategy, PrismaService, UsersService], + imports: [LibAuthModule, PrismaModule], controllers: [AuthController], }) export class AuthModule {} diff --git a/apps/api/src/modules/github/github.module.ts b/apps/api/src/modules/github/github.module.ts index fdb3b8e..93e8ad3 100644 --- a/apps/api/src/modules/github/github.module.ts +++ b/apps/api/src/modules/github/github.module.ts @@ -3,6 +3,7 @@ import { HttpModule } from '@nestjs/axios'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { AuthModule } from '../auth/auth.module'; +import { UsersModule } from '../users/users.module'; import { GithubController } from './github.controller'; import { GithubService } from './github.service'; @@ -14,6 +15,7 @@ import { GithubService } from './github.service'; load: [globalConfig], }), AuthModule, + UsersModule, ], providers: [GithubService], controllers: [GithubController], diff --git a/apps/api/src/modules/users/users.controller.ts b/apps/api/src/modules/users/users.controller.ts index f47a4bc..0d08c47 100644 --- a/apps/api/src/modules/users/users.controller.ts +++ b/apps/api/src/modules/users/users.controller.ts @@ -1,45 +1,48 @@ import { JwtAuthGuard } from '@gh/auth'; -import { UsersService } from '@gh/users'; -import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards } from '@nestjs/common'; -import { CreateUserDto, UpdateUserDto } from './dtos'; +import { User } from '@gh/prisma'; +import { CreateUserDto, UpdateUserDto } from '@gh/shared'; +import { loggedMethod, MICROSERVICE_NAME_USERS } from '@gh/shared/utils'; +import { Body, Controller, Delete, Get, Inject, Param, ParseIntPipe, Patch, Post, UseGuards } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; @Controller('auth-users') export class UsersController { - constructor(private usersService: UsersService) {} + constructor(@Inject(MICROSERVICE_NAME_USERS) private readonly usersMicroservice: ClientProxy) {} @UseGuards(JwtAuthGuard) @Get() + @loggedMethod('API Gateway: Users controller: Get all users') getUsers() { - return this.usersService.getUsers(); + return this.usersMicroservice.send('get_users', {}); } @UseGuards(JwtAuthGuard) @Get(':id') getUserById(@Param('id', ParseIntPipe) id: number) { - return this.usersService.getUserById(id); + return this.usersMicroservice.send('get_user_by_id', id); } @UseGuards(JwtAuthGuard) @Get('email/:emailAddress') getUserByEmail(@Param('emailAddress') email: string) { - return this.usersService.getUserByEmail(email); + return this.usersMicroservice.send('get_user_by_email', email); } @UseGuards(JwtAuthGuard) @Post() createUser(@Body() data: CreateUserDto) { - return this.usersService.createUser(data); + return this.usersMicroservice.send('create_user', data); } @UseGuards(JwtAuthGuard) @Patch(':id') updateUser(@Param('id', ParseIntPipe) id: number, @Body() data: UpdateUserDto) { - return this.usersService.updateUser(id, data); + return this.usersMicroservice.send('update_user', data); } @UseGuards(JwtAuthGuard) @Delete(':id') deleteUserById(@Param('id', ParseIntPipe) id: number) { - return this.usersService.deleteUserById(id); + return this.usersMicroservice.send('delete_user_by_id', id); } } diff --git a/apps/api/src/modules/users/users.module.ts b/apps/api/src/modules/users/users.module.ts index 559d58c..1b73f7b 100644 --- a/apps/api/src/modules/users/users.module.ts +++ b/apps/api/src/modules/users/users.module.ts @@ -1,11 +1,26 @@ -import { PrismaService } from '@gh/prisma'; -import { UsersService } from '@gh/users'; +import { MICROSERVICE_NAME_USERS } from '@gh/shared/utils'; import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { ClientsModule, Transport } from '@nestjs/microservices'; import { UsersController } from './users.controller'; @Module({ - providers: [UsersService, PrismaService], - exports: [UsersService], + imports: [ + ClientsModule.registerAsync([ + { + name: MICROSERVICE_NAME_USERS, + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + transport: Transport.TCP, + options: { + host: configService.get('USERS_MICROSERVICE_HOST') ?? 'localhost', + port: configService.get('USERS_MICROSERVICE_PORT') ?? 3001, + }, + }), + inject: [ConfigService], + }, + ]), + ], controllers: [UsersController], }) export class UsersModule {} diff --git a/apps/ui/tsconfig.json b/apps/ui/tsconfig.json index 57bdc2a..6396522 100644 --- a/apps/ui/tsconfig.json +++ b/apps/ui/tsconfig.json @@ -37,6 +37,7 @@ "enableI18nLegacyMessageIdFormat": false, "strictInjectionParameters": true, "strictInputAccessModifiers": true, - "strictTemplates": true + "strictTemplates": true, + "typeCheckHostBindings": true, } } diff --git a/libs/auth/eslint.config.mjs b/libs/auth/eslint.config.mjs index 77b0246..ccc9ec1 100644 --- a/libs/auth/eslint.config.mjs +++ b/libs/auth/eslint.config.mjs @@ -24,8 +24,7 @@ export default [ onlyDependOnLibsWithTags: [ 'scope:lib-config', 'scope:lib-prisma', - 'scope:lib-shared', - 'scope:lib-users', + 'scope:lib-shared' ] }, ], diff --git a/libs/auth/src/lib/auth.module.ts b/libs/auth/src/lib/auth.module.ts new file mode 100644 index 0000000..3f13a86 --- /dev/null +++ b/libs/auth/src/lib/auth.module.ts @@ -0,0 +1,31 @@ +import { MICROSERVICE_NAME_USERS } from '@gh/shared/utils'; +import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { JwtModule } from '@nestjs/jwt'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { AuthService } from './auth.service'; +import { GoogleStrategy } from './google.strategy'; +import { JwtStrategy } from './jwt.strategy'; +import { LocalStrategy } from './local.strategy'; + +@Module({ + imports: [JwtModule, + ClientsModule.registerAsync([ + { + name: MICROSERVICE_NAME_USERS, + imports: [ConfigModule], + useFactory: (configService: ConfigService) => ({ + transport: Transport.TCP, + options: { + host: configService.get('USERS_MICROSERVICE_HOST') ?? 'localhost', + port: configService.get('USERS_MICROSERVICE_PORT') ?? 3001, + }, + }), + inject: [ConfigService], + }, + ]), + ], + providers: [AuthService, LocalStrategy, JwtStrategy, GoogleStrategy], + exports: [AuthService], +}) +export class AuthModule {} diff --git a/libs/auth/src/lib/auth.service.ts b/libs/auth/src/lib/auth.service.ts index 47ab409..ae21ab3 100644 --- a/libs/auth/src/lib/auth.service.ts +++ b/libs/auth/src/lib/auth.service.ts @@ -1,23 +1,25 @@ import { globalConfig } from '@gh/config'; import { User as PrismaUser } from '@gh/prisma'; import { AuthProfile } from '@gh/shared/models'; -import { UsersService } from '@gh/users'; +import { MICROSERVICE_NAME_USERS } from '@gh/shared/utils'; import { Inject, Injectable, UnauthorizedException } from '@nestjs/common'; import { ConfigType } from '@nestjs/config'; import { JwtService } from '@nestjs/jwt'; +import { ClientProxy } from '@nestjs/microservices'; import axios from 'axios'; import bcrypt from 'bcrypt'; +import { firstValueFrom } from 'rxjs'; @Injectable() export class AuthService { constructor( @Inject(globalConfig.KEY) private readonly config: ConfigType, - private readonly usersService: UsersService, + @Inject(MICROSERVICE_NAME_USERS) private readonly usersMicroservice: ClientProxy, private readonly jwtService: JwtService, ) {} async validateUser(email: string, password: string) { - const user = await this.usersService.getUserByEmail(email); + const user = await firstValueFrom(this.usersMicroservice.send('get_user_by_email', email)); if (await bcrypt.compare(password, user?.password)) { const { password, ...result } = user; @@ -29,7 +31,7 @@ export class AuthService { } async validateGoogleUser(email: string) { - const user = await this.usersService.getUserByEmail(email); + const user = await firstValueFrom(this.usersMicroservice.send('get_user_by_email', email)); if (user) { const { password, ...result } = user; diff --git a/libs/auth/src/lib/index.ts b/libs/auth/src/lib/index.ts index 673a43a..e02e584 100644 --- a/libs/auth/src/lib/index.ts +++ b/libs/auth/src/lib/index.ts @@ -1,7 +1,9 @@ -export * from './auth.service' +export * from './auth.module'; +export * from './auth.service'; export * from './google-auth.guard'; export * from './google.strategy'; export * from './jwt-auth.guard'; -export * from './jwt.strategy' +export * from './jwt.strategy'; export * from './local-auth.guard'; -export * from './local.strategy' +export * from './local.strategy'; + diff --git a/libs/config/src/lib/config.ts b/libs/config/src/lib/config.ts index a7396c5..ceab0da 100644 --- a/libs/config/src/lib/config.ts +++ b/libs/config/src/lib/config.ts @@ -25,4 +25,10 @@ export const globalConfig = registerAs('config', () => ({ database: { url: process.env['DATABASE_URL'], }, + microServices: { + users: { + host: process.env['USERS_MICROSERVICE_HOST'] ?? 'localhost', + port: process.env['USERS_MICROSERVICE_PORT'] ?? 3001, + }, + } })); diff --git a/libs/prisma/src/lib/index.ts b/libs/prisma/src/lib/index.ts index cb6bbc3..8bb71d7 100644 --- a/libs/prisma/src/lib/index.ts +++ b/libs/prisma/src/lib/index.ts @@ -1 +1,2 @@ +export * from './prisma.module'; export * from './prisma.service'; diff --git a/libs/prisma/src/lib/prisma.module.ts b/libs/prisma/src/lib/prisma.module.ts new file mode 100644 index 0000000..3e6d1b6 --- /dev/null +++ b/libs/prisma/src/lib/prisma.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; + +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} diff --git a/apps/api/src/modules/users/dtos/create-user.dto.ts b/libs/shared/src/lib/dtos/create-user.dto.ts similarity index 100% rename from apps/api/src/modules/users/dtos/create-user.dto.ts rename to libs/shared/src/lib/dtos/create-user.dto.ts diff --git a/apps/api/src/modules/users/dtos/index.ts b/libs/shared/src/lib/dtos/index.ts similarity index 100% rename from apps/api/src/modules/users/dtos/index.ts rename to libs/shared/src/lib/dtos/index.ts diff --git a/apps/api/src/modules/users/dtos/update-user.dto.ts b/libs/shared/src/lib/dtos/update-user.dto.ts similarity index 100% rename from apps/api/src/modules/users/dtos/update-user.dto.ts rename to libs/shared/src/lib/dtos/update-user.dto.ts diff --git a/libs/shared/src/lib/index.ts b/libs/shared/src/lib/index.ts index e9644da..28793d8 100644 --- a/libs/shared/src/lib/index.ts +++ b/libs/shared/src/lib/index.ts @@ -1 +1,2 @@ +export * from './dtos'; export * from './models'; diff --git a/libs/shared/src/lib/utils/constants.ts b/libs/shared/src/lib/utils/constants.ts new file mode 100644 index 0000000..1705724 --- /dev/null +++ b/libs/shared/src/lib/utils/constants.ts @@ -0,0 +1,12 @@ +class MicroserviceMetadata { + constructor( + public readonly name: string, + ) {} +} + +export const MICROSERVICES = { + users: { + name: 'USERS_MICROSERVICE', + } as MicroserviceMetadata +} as const; +export const MICROSERVICE_NAME_USERS = 'USERS_MICROSERVICE'; diff --git a/libs/shared/src/lib/utils/index.ts b/libs/shared/src/lib/utils/index.ts index b7a1cf1..d02cfa9 100644 --- a/libs/shared/src/lib/utils/index.ts +++ b/libs/shared/src/lib/utils/index.ts @@ -1 +1,3 @@ +export * from './constants'; export * from './decorators'; + diff --git a/libs/users/src/lib/index.ts b/libs/users/src/lib/index.ts index be64bca..6b95db2 100644 --- a/libs/users/src/lib/index.ts +++ b/libs/users/src/lib/index.ts @@ -1 +1,2 @@ +export * from './users.module'; export * from './users.service'; diff --git a/libs/users/src/lib/users.module.ts b/libs/users/src/lib/users.module.ts new file mode 100644 index 0000000..7681fa3 --- /dev/null +++ b/libs/users/src/lib/users.module.ts @@ -0,0 +1,10 @@ +import { PrismaModule } from '@gh/prisma'; +import { Module } from '@nestjs/common'; +import { UsersService } from './users.service'; + +@Module({ + imports: [PrismaModule], + providers: [UsersService], + exports: [UsersService], +}) +export class UsersModule {} diff --git a/libs/users/src/lib/users.service.ts b/libs/users/src/lib/users.service.ts index a7501f1..1146d3d 100644 --- a/libs/users/src/lib/users.service.ts +++ b/libs/users/src/lib/users.service.ts @@ -16,7 +16,7 @@ export type User = { export class UsersService { constructor( @Inject(globalConfig.KEY) private readonly config: ConfigType, - private prisma: PrismaService, + private readonly prisma: PrismaService, ) {} async getUsers() { diff --git a/nx.json b/nx.json index 9e6982d..51f771a 100644 --- a/nx.json +++ b/nx.json @@ -70,6 +70,16 @@ "options": { "targetName": "eslint:lint" } + }, + { + "plugin": "@nx/webpack/plugin", + "options": { + "buildTargetName": "webpack:build", + "serveTargetName": "webpack:serve", + "previewTargetName": "preview", + "buildDepsTargetName": "build-deps", + "watchDepsTargetName": "watch-deps" + } } ] } diff --git a/package.json b/package.json index 018ee54..7012c45 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,9 @@ "version": "0.0.3", "license": "MIT", "scripts": { - "serve:api": "nx run api:serve --watch=true", - "serve:ui": "nx run ui:serve --verbose=true", + "serve:api": "nx run api:serve --watch --verbose", + "serve:ui": "nx run ui:serve --verbose", + "serve:microservices": "nx run-many --target=serve --projects=users-service --watch --verbose", "lint:api": "nx run api:lint", "lint:ui": "nx run ui:lint", "build:api": "nx run api:build", @@ -28,23 +29,24 @@ "private": true, "main": "dist/apps/api/main.js", "dependencies": { - "@angular/animations": "^20.1.4", - "@angular/cdk": "^20.1.4", - "@angular/common": "^20.1.4", - "@angular/compiler": "^20.1.4", - "@angular/core": "^20.1.4", - "@angular/forms": "^20.1.4", - "@angular/platform-browser": "^20.1.4", - "@angular/platform-browser-dynamic": "^20.1.4", - "@angular/router": "^20.1.4", + "@angular/animations": "^20.1.6", + "@angular/cdk": "^20.1.5", + "@angular/common": "^20.1.6", + "@angular/compiler": "^20.1.6", + "@angular/core": "^20.1.6", + "@angular/forms": "^20.1.6", + "@angular/platform-browser": "^20.1.6", + "@angular/platform-browser-dynamic": "^20.1.6", + "@angular/router": "^20.1.6", "@fortawesome/fontawesome-free": "^7.0.0", "@nestjs/axios": "^4.0.1", - "@nestjs/common": "^11.1.5", + "@nestjs/common": "^11.1.6", "@nestjs/config": "^4.0.2", - "@nestjs/core": "^11.1.5", + "@nestjs/core": "^11.1.6", "@nestjs/jwt": "^11.0.0", + "@nestjs/microservices": "^11.1.6", "@nestjs/passport": "^11.0.5", - "@nestjs/platform-express": "^11.1.5", + "@nestjs/platform-express": "^11.1.6", "@nestjs/swagger": "^11.2.0", "@ngrx/signals": "^20.0.0", "@prisma/client": "^6.13.0", @@ -58,7 +60,7 @@ "firebase-admin": "^13.4.0", "firebase-functions": "^6.4.0", "lodash-es": "^4.17.21", - "ngx-cookie-service": "^20.0.1", + "ngx-cookie-service": "^20.1.0", "passport": "^0.7.0", "passport-google-oauth20": "^2.0.0", "passport-jwt": "^4.0.1", @@ -70,35 +72,36 @@ "zone.js": "^0.15.1" }, "devDependencies": { - "@angular-devkit/build-angular": "^20.1.4", - "@angular-devkit/core": "^20.1.4", - "@angular-devkit/schematics": "^20.1.4", + "@angular-devkit/build-angular": "^20.1.5", + "@angular-devkit/core": "^20.1.5", + "@angular-devkit/schematics": "^20.1.5", "@angular-eslint/eslint-plugin": "^20.1.1", "@angular-eslint/eslint-plugin-template": "^20.1.1", "@angular-eslint/template-parser": "^20.1.1", - "@angular/build": "^20.1.4", - "@angular/cli": "^20.1.4", - "@angular/compiler-cli": "^20.1.4", - "@angular/language-service": "^20.1.4", + "@angular/build": "^20.1.5", + "@angular/cli": "^20.1.5", + "@angular/compiler-cli": "^20.1.6", + "@angular/language-service": "^20.1.6", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "^9.32.0", + "@eslint/js": "^9.33.0", "@nestjs/schematics": "^11.0.7", - "@nestjs/testing": "^11.1.5", - "@nx/angular": "21.3.10", - "@nx/devkit": "21.3.10", - "@nx/esbuild": "21.3.10", - "@nx/eslint": "21.3.10", - "@nx/eslint-plugin": "21.3.10", - "@nx/jest": "21.3.10", - "@nx/js": "21.3.10", - "@nx/nest": "21.3.10", - "@nx/node": "21.3.10", - "@nx/playwright": "21.3.10", - "@nx/webpack": "21.3.10", - "@nx/workspace": "21.3.10", - "@playwright/test": "^1.54.1", + "@nestjs/testing": "^11.1.6", + "@nx/angular": "21.3.11", + "@nx/devkit": "21.3.11", + "@nx/esbuild": "21.3.11", + "@nx/eslint": "21.3.11", + "@nx/eslint-plugin": "21.3.11", + "@nx/jest": "21.3.11", + "@nx/js": "21.3.11", + "@nx/nest": "21.3.11", + "@nx/node": "21.3.11", + "@nx/playwright": "21.3.11", + "@nx/web": "21.3.11", + "@nx/webpack": "21.3.11", + "@nx/workspace": "21.3.11", + "@playwright/test": "^1.54.2", "@pmmmwh/react-refresh-webpack-plugin": "^0.6.1", - "@schematics/angular": "^20.1.4", + "@schematics/angular": "^20.1.5", "@svgr/webpack": "^8.1.0", "@swc-node/register": "^1.10.10", "@swc/core": "^1.13.3", @@ -109,15 +112,15 @@ "@types/express": "^5.0.3", "@types/jest": "^30.0.0", "@types/lodash-es": "^4.17.12", - "@types/node": "^24.1.0", + "@types/node": "^24.2.1", "@types/passport-google-oauth20": "^2.0.16", "@types/passport-jwt": "^4.0.1", "@types/passport-local": "^1.0.38", - "@typescript-eslint/eslint-plugin": "^8.38.0", - "@typescript-eslint/parser": "^8.38.0", + "@typescript-eslint/eslint-plugin": "^8.39.0", + "@typescript-eslint/parser": "^8.39.0", "copy-files-from-to": "^3.12.1", "esbuild": "^0.25.8", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-playwright": "^2.2.2", "globals": "^16.3.0", @@ -125,15 +128,17 @@ "jest-environment-jsdom": "^30.0.5", "jest-environment-node": "^30.0.5", "jest-preset-angular": "^15.0.0", + "jest-util": "^30.0.5", "jsonc-eslint-parser": "^2.4.0", - "nx": "21.3.10", + "nx": "21.3.11", "prettier": "^3.6.2", "prisma": "^6.13.0", "react-refresh": "^0.17.0", - "ts-jest": "^29.4.0", + "ts-jest": "^29.4.1", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typescript": "5.8.3", - "url-loader": "^4.1.1" + "url-loader": "^4.1.1", + "webpack-cli": "^6.0.1" } } diff --git a/services/users-service/eslint.config.cjs b/services/users-service/eslint.config.cjs new file mode 100644 index 0000000..88ef064 --- /dev/null +++ b/services/users-service/eslint.config.cjs @@ -0,0 +1,3 @@ +const baseConfig = require('../../.eslintrc.json'); + +module.exports = [...baseConfig]; diff --git a/services/users-service/jest.config.ts b/services/users-service/jest.config.ts new file mode 100644 index 0000000..125f638 --- /dev/null +++ b/services/users-service/jest.config.ts @@ -0,0 +1,10 @@ +export default { + displayName: 'users-service', + preset: '../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../coverage/services', +}; diff --git a/services/users-service/project.json b/services/users-service/project.json new file mode 100644 index 0000000..d515bc8 --- /dev/null +++ b/services/users-service/project.json @@ -0,0 +1,55 @@ +{ + "name": "users-service", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "services/users-service/src", + "projectType": "application", + "tags": ["service:users"], + "targets": { + "build": { + "executor": "@nx/webpack:webpack", + "outputs": ["{options.outputPath}"], + "defaultConfiguration": "production", + "options": { + "target": "node", + "compiler": "tsc", + "outputPath": "dist/services/users-service", + "main": "services/users-service/src/main.ts", + "tsConfig": "services/users-service/tsconfig.app.json", + "assets": ["services/users-service/src/assets"], + "webpackConfig": "services/users-service/webpack.config.js" + }, + "configurations": { + "development": { + "args": ["--node-env=development"] + }, + "production": { + "args": ["--node-env=production"] + } + } + }, + "serve": { + "continuous": true, + "executor": "@nx/js:node", + "defaultConfiguration": "development", + "options": { + "buildTarget": "users-service:build" + }, + "configurations": { + "development": { + "buildTarget": "users-service:build:development" + }, + "production": { + "buildTarget": "users-service:build:production" + } + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "services/jest.config.ts", + "passWithNoTests": true + } + } + } +} diff --git a/services/users-service/src/assets/.gitkeep b/services/users-service/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/services/users-service/src/main.ts b/services/users-service/src/main.ts new file mode 100644 index 0000000..80dff47 --- /dev/null +++ b/services/users-service/src/main.ts @@ -0,0 +1,35 @@ +/** + * This is not a production server yet! + * This is only a minimal backend to get started. + */ + +import { Logger } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { NestFactory } from '@nestjs/core'; +import { AsyncMicroserviceOptions, Transport } from '@nestjs/microservices'; +import { UsersModule } from './users/users.module'; + +async function bootstrap() { + let host: string; + let port: number; + const app = await NestFactory.createMicroservice(UsersModule, { + useFactory: (configService: ConfigService) => { + host = configService.get('USERS_MICROSERVICE_HOST') ?? 'localhost'; + port = configService.get('USERS_MICROSERVICE_PORT') ?? 3001; + + return { + transport: Transport.TCP, + options: { + host, + port, + }, + }; + }, + inject: [ConfigService], + }); + + await app.listen(); + Logger.log('🚀 Users microservice is running'); +} + +bootstrap(); diff --git a/services/users-service/src/users/users.controller.ts b/services/users-service/src/users/users.controller.ts new file mode 100644 index 0000000..323ac1a --- /dev/null +++ b/services/users-service/src/users/users.controller.ts @@ -0,0 +1,46 @@ +import { loggedMethod } from '@gh/shared/utils'; +import { Controller } from '@nestjs/common'; +import { MessagePattern } from '@nestjs/microservices'; +import { UsersService } from './users.service'; +import { CreateUserDto, UpdateUserDto } from '@gh/shared'; + +@Controller('users') +export class UsersController { + constructor(private usersService: UsersService) {} + + @MessagePattern('get_users') + @loggedMethod('Users microservice: Get all users') + getUsers() { + return this.usersService.getUsers(); + } + + @MessagePattern('get_user_by_id') + @loggedMethod('Users microservice: Get user by id') + getUserById(id: number) { + return this.usersService.getUserById(id); + } + + @MessagePattern('get_user_by_email') + @loggedMethod('Users microservice: Get user by email') + getUserByEmail(email: string) { + return this.usersService.getUserByEmail(email); + } + + @MessagePattern('create_user') + @loggedMethod('Users microservice: Create user') + createUser(data: CreateUserDto) { + return this.usersService.createUser(data); + } + + @MessagePattern('update_user') + @loggedMethod('Users microservice: Update user') + updateUser(id: number, data: UpdateUserDto) { + return this.usersService.updateUser(id, data); + } + + @MessagePattern('delete_user_by_id') + @loggedMethod('Users microservice: Delete user by id') + deleteUserById(id: number) { + return this.usersService.deleteUserById(id); + } +} diff --git a/services/users-service/src/users/users.module.ts b/services/users-service/src/users/users.module.ts new file mode 100644 index 0000000..e31a6b7 --- /dev/null +++ b/services/users-service/src/users/users.module.ts @@ -0,0 +1,21 @@ +import { globalConfig } from '@gh/config'; +import { PrismaModule } from '@gh/prisma'; +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { UsersController } from './users.controller'; +import { UsersService } from './users.service'; + +@Module({ + imports: [ + PrismaModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [globalConfig], + }), + UsersModule, + ], + providers: [UsersService], + controllers: [UsersController], + exports: [UsersService], +}) +export class UsersModule {} diff --git a/services/users-service/src/users/users.service.spec.ts b/services/users-service/src/users/users.service.spec.ts new file mode 100644 index 0000000..38b96e7 --- /dev/null +++ b/services/users-service/src/users/users.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { UsersService } from './users.service'; + +describe('UsersService', () => { + let service: UsersService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [UsersService], + }).compile(); + + service = module.get(UsersService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/services/users-service/src/users/users.service.ts b/services/users-service/src/users/users.service.ts new file mode 100644 index 0000000..a7501f1 --- /dev/null +++ b/services/users-service/src/users/users.service.ts @@ -0,0 +1,88 @@ +import { globalConfig } from '@gh/config'; +import { PrismaService } from '@gh/prisma'; +import { Prisma } from '@gh/prisma'; +import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common'; +import { ConfigType } from '@nestjs/config'; +import bcrypt from 'bcrypt'; + +export type User = { + id: number; + email: string; + password: string | null; + refreshToken?: string; +}; + +@Injectable() +export class UsersService { + constructor( + @Inject(globalConfig.KEY) private readonly config: ConfigType, + private prisma: PrismaService, + ) {} + + async getUsers() { + return await this.prisma.user.findMany(); + } + + async getUserById(id: number) { + try { + const user = await this.prisma.user.findUnique({ where: { id } }); + + if (!user) { + throw new HttpException(`User with id ${id} not found`, HttpStatus.NOT_FOUND); + } + + return user; + } catch (error) { + if (error instanceof HttpException) { + throw error; + } + throw new HttpException(`Error fetching user with id ${id}`, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + async getUserByEmail(email: string) { + try { + const user = await this.prisma.user.findUnique({ where: { email } }); + + if (!user) { + throw new HttpException(`User with email ${email} not found`, HttpStatus.NOT_FOUND); + } + + return user; + } catch (error) { + if (error instanceof HttpException) { + throw error; + } + throw new HttpException(`Error fetching user with email ${email}`, HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + async createUser(data: Prisma.UserCreateInput) { + const { email, password } = data; + const user = await this.prisma.user.findUnique({ where: { email } }); + + if (user) { + throw new HttpException(`User with email ${email} already exists`, HttpStatus.BAD_REQUEST); + } + + data.password = await bcrypt.hash(password, this.config.crypt.saltRounds); + + return this.prisma.user.create({ data }); + } + + async updateUser(id: number, data: Prisma.UserUpdateInput) { + const user = await this.prisma.user.findUnique({ where: { id } }); + + if (!user) { + throw new HttpException(`User with id ${id} not found`, HttpStatus.NOT_FOUND); + } + + return this.prisma.user.update({ where: { id }, data }); + } + + async deleteUserById(id: number) { + await this.getUserById(id); + + return await this.prisma.user.delete({ where: { id } }); + } +} diff --git a/services/users-service/tsconfig.app.json b/services/users-service/tsconfig.app.json new file mode 100644 index 0000000..cd832ca --- /dev/null +++ b/services/users-service/tsconfig.app.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["node"], + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/services/users-service/tsconfig.json b/services/users-service/tsconfig.json new file mode 100644 index 0000000..5bdc9b0 --- /dev/null +++ b/services/users-service/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "compilerOptions": { + "target": "es2022", + "strict": true, + "noImplicitThis": true, + "useDefineForClassFields": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + } +} diff --git a/services/users-service/tsconfig.spec.json b/services/users-service/tsconfig.spec.json new file mode 100644 index 0000000..f5c488b --- /dev/null +++ b/services/users-service/tsconfig.spec.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../dist/out-tsc", + "module": "commonjs", + "moduleResolution": "node10", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/services/users-service/webpack.config.js b/services/users-service/webpack.config.js new file mode 100644 index 0000000..3cc69db --- /dev/null +++ b/services/users-service/webpack.config.js @@ -0,0 +1,13 @@ +const { composePlugins, withNx } = require('@nx/webpack'); + +// Nx plugins for webpack. +module.exports = composePlugins( + withNx({ + target: 'node', + }), + (config) => { + // Update the webpack config as needed here. + // e.g. `config.plugins.push(new MyPlugin())` + return config; + }, +); diff --git a/tsconfig.base.json b/tsconfig.base.json index 352a1e7..2f9a138 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,16 +15,16 @@ "skipDefaultLibCheck": true, "baseUrl": ".", "paths": { - "@gh/auth/*": ["libs/auth/src/*"], "@gh/auth": ["libs/auth/src"], - "@gh/config/*": ["libs/config/src/*"], + "@gh/auth/*": ["libs/auth/src/*"], "@gh/config": ["libs/config/src"], - "@gh/prisma/*": ["libs/prisma/src/*"], + "@gh/config/*": ["libs/config/src/*"], "@gh/prisma": ["libs/prisma/src"], - "@gh/users/*": ["libs/users/src/*"], - "@gh/users": ["libs/users/src"], - "@gh/shared/*": ["libs/shared/src/lib/*"], + "@gh/prisma/*": ["libs/prisma/src/*"], "@gh/shared": ["libs/shared/src/lib"], + "@gh/shared/*": ["libs/shared/src/lib/*"], + "@gh/users": ["libs/users/src"], + "@gh/users/*": ["libs/users/src/*"] } }, "exclude": ["node_modules", "tmp"] diff --git a/yarn.lock b/yarn.lock index ff36194..bcbb590 100644 --- a/yarn.lock +++ b/yarn.lock @@ -126,24 +126,24 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@angular-devkit/architect@0.2001.4": - version "0.2001.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.2001.4.tgz#a361ad440bc0829053cc261afc1047737e9f8357" - integrity sha512-lZ9wYv1YDcw2Ggi2/TXXhYs7JAukAJHdZGZn6Co5s1QE774bVled1qK8pf46rSsG1BGn1a9VFsRFOlB/sx6WjA== +"@angular-devkit/architect@0.2001.5": + version "0.2001.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.2001.5.tgz#f764554dd74f7c909c9be1a5a081170985245663" + integrity sha512-LdjmE75wjmpHNfFsDecZB95H/DekX1hJLmRzGWid+Fd6lbyFBQyUjq+ucwD9WlHqqrD+CgKapQKnUhlBSIJxPQ== dependencies: - "@angular-devkit/core" "20.1.4" + "@angular-devkit/core" "20.1.5" rxjs "7.8.2" -"@angular-devkit/build-angular@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-20.1.4.tgz#80da189d7f134798854b1bc58581532bc337f8c8" - integrity sha512-mD7B2JqmbP3qBp8MfDhDm1PfybLQX+qVscCr32siuDpS02KvizsmABfnrDOdpHuzCjx4IbmNk0nVUWn1tSHZfw== +"@angular-devkit/build-angular@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-20.1.5.tgz#770f37a534740501f53084980fc73596c3ff2017" + integrity sha512-WB2I1snyJBKvk1oeE8q02I7qSCtUdRh/WoLKip8BGefy5+wPqZsgb1BfbHL/u5GrwMstZVzMLKzGc3TcsfRwXw== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.2001.4" - "@angular-devkit/build-webpack" "0.2001.4" - "@angular-devkit/core" "20.1.4" - "@angular/build" "20.1.4" + "@angular-devkit/architect" "0.2001.5" + "@angular-devkit/build-webpack" "0.2001.5" + "@angular-devkit/core" "20.1.5" + "@angular/build" "20.1.5" "@babel/core" "7.27.7" "@babel/generator" "7.27.5" "@babel/helper-annotate-as-pure" "7.27.3" @@ -154,7 +154,7 @@ "@babel/preset-env" "7.27.2" "@babel/runtime" "7.27.6" "@discoveryjs/json-ext" "0.6.3" - "@ngtools/webpack" "20.1.4" + "@ngtools/webpack" "20.1.5" ansi-colors "4.1.3" autoprefixer "10.4.21" babel-loader "10.0.0" @@ -196,12 +196,12 @@ optionalDependencies: esbuild "0.25.5" -"@angular-devkit/build-webpack@0.2001.4": - version "0.2001.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.2001.4.tgz#333dcd1607757232548145bab292c03d795304a5" - integrity sha512-R/xEwVTaqZN1yKfpQIlP7kcyoEvQueFt78HSNm+FFhqMM5MlSLoc+1ond2MYk9MDEvmvHYlx7r6AZ7C+KouU/Q== +"@angular-devkit/build-webpack@0.2001.5": + version "0.2001.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.2001.5.tgz#e0f08e6e8a06b079ed4b8ff7d967b7da2c15ae48" + integrity sha512-AsycqeZz+DUYtqOwkmf0/Ucsrc/sVuoZVSAl+qZDSj1Qd3ou73Z+QioRIwu2MRRRgLMSBFZymaf0csoaW/ddmA== dependencies: - "@angular-devkit/architect" "0.2001.4" + "@angular-devkit/architect" "0.2001.5" rxjs "7.8.2" "@angular-devkit/core@19.2.15": @@ -228,10 +228,10 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/core@20.1.4", "@angular-devkit/core@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-20.1.4.tgz#4d1ecf596b93396458fc104a286e1c78fc80ba13" - integrity sha512-I5CllQoDrVL20/+0JZk/gmR14n/+mwYIoD1RfBDwnaiHlO9o2whRsJj+LeUd9IA5Hf9MPPx+EkOVQt3vsYU0sQ== +"@angular-devkit/core@20.1.5", "@angular-devkit/core@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-20.1.5.tgz#1dc6901d8be97b583a3dce78e4fa04e2c7116842" + integrity sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ== dependencies: ajv "8.17.1" ajv-formats "3.0.1" @@ -262,12 +262,12 @@ ora "5.4.1" rxjs "7.8.1" -"@angular-devkit/schematics@20.1.4", "@angular-devkit/schematics@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-20.1.4.tgz#cf0fd6236be3d54e6a1097580312d246204b1ca0" - integrity sha512-dyvlQcXf5XKPRC1qTqzIGkltFHh8mYujPk6qt6Ah2nKp7UeA80ZSAocwOmlBg8t7GjN8ICe4Kese5scT1ByFXQ== +"@angular-devkit/schematics@20.1.5", "@angular-devkit/schematics@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-20.1.5.tgz#b8a26cd0f24b7976ccab6eda21f2cb38a4c9a8ad" + integrity sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A== dependencies: - "@angular-devkit/core" "20.1.4" + "@angular-devkit/core" "20.1.5" jsonc-parser "3.3.1" magic-string "0.30.17" ora "8.2.0" @@ -312,20 +312,20 @@ dependencies: "@angular-eslint/bundled-angular-compiler" "20.1.1" -"@angular/animations@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-20.1.4.tgz#010bb027dd4f4e7cd5df9a485fc88ba583b239a0" - integrity sha512-y4mq2r6jhAj5QuA3UnWkVfok0EcA22uH+XVb4HBKY7q23/xaQYu2CGdVOVpdUsaPTf3zRD1DkAnTkV3J3ZHIiA== +"@angular/animations@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-20.1.6.tgz#7ff66f995bbbc4d697d05fbd409d6430bffe9da2" + integrity sha512-vSU0BP0BzX20HoCE81MKcr9cd6H9zB1qbCNk2J1ulH1C9rXs5ZpeORy+riIJTOZDYLtE0jCsXT3pvVb+nPmADQ== dependencies: tslib "^2.3.0" -"@angular/build@20.1.4", "@angular/build@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-20.1.4.tgz#0a85baf99d73d5d9609019e2eeecedc31f723126" - integrity sha512-DClI15kl0t1YijptthQfw0cRSj8Opf8ACsZa1xT3o77BALpeusxS2QzSy6xGH+QnwesTyJFux1oRYjtAKmE2YA== +"@angular/build@20.1.5", "@angular/build@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-20.1.5.tgz#1be494b8434a47b7f8b13b6f0f1c4ce6c0005e2f" + integrity sha512-Uh0VX9HQMLt4054P03f7UL6tu5kvuJhf5UXiRUzkaK/tMk7SDokp9YtN7lErPiWvDQFtuX9o27PMFpxwEfdRcA== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.2001.4" + "@angular-devkit/architect" "0.2001.5" "@babel/core" "7.27.7" "@babel/helper-annotate-as-pure" "7.27.3" "@babel/helper-split-export-declaration" "7.24.7" @@ -353,26 +353,26 @@ optionalDependencies: lmdb "3.4.1" -"@angular/cdk@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-20.1.4.tgz#f3525198dbdedfbf145266bfc6d0d4fee66a8e60" - integrity sha512-Uz0fLZRWpKG7xniXSw3Hr4QEvTlVurov07BBz6nRWseGxeHCDkFqKc3UEriovCQ7ylJdR6miIu7j+h4PWLH48g== +"@angular/cdk@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-20.1.5.tgz#2e90f9ade4d3c335c300226323576aa77f2e050a" + integrity sha512-uJezXaVPAbumxTCv5JA7oIuWCgPlz9/Fj6dJl6bxcRD7DfMyHGq3dtoLhthuU/uk+OfK0FlTklR92Yss5frFUw== dependencies: parse5 "^8.0.0" tslib "^2.3.0" -"@angular/cli@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-20.1.4.tgz#a1efac0a1eed7396a52411ca105274de6c52bb5e" - integrity sha512-VAQ/EBelBPiX1vV57TZJRPcao/e+Ee9IeLK43fsE2xL+GuEjrJ/fQXqt7OesrgIJHJBwUiX+j8pMMT6VfT1xSA== +"@angular/cli@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-20.1.5.tgz#83301e2a925770d6a23c03558183e7811c3a1951" + integrity sha512-1pkShcbPEkQn8wCoHsr9v+udy5EmelHVwZ5kNZjZZ2EDTcB/RC7cuuUfyWRxrYJxwT5K/jx00ORQvbVJj0L+zw== dependencies: - "@angular-devkit/architect" "0.2001.4" - "@angular-devkit/core" "20.1.4" - "@angular-devkit/schematics" "20.1.4" + "@angular-devkit/architect" "0.2001.5" + "@angular-devkit/core" "20.1.5" + "@angular-devkit/schematics" "20.1.5" "@inquirer/prompts" "7.6.0" "@listr2/prompt-adapter-inquirer" "2.0.22" "@modelcontextprotocol/sdk" "1.13.3" - "@schematics/angular" "20.1.4" + "@schematics/angular" "20.1.5" "@yarnpkg/lockfile" "1.1.0" algoliasearch "5.32.0" ini "5.0.0" @@ -386,17 +386,17 @@ yargs "18.0.0" zod "3.25.75" -"@angular/common@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-20.1.4.tgz#ea710c90a3be7f5f49d6ebdb84c9c8b27e0a3f0f" - integrity sha512-AL+HdsY5xL2iM1zZ55ce33U+w2LgPJZQwKvHXJJ/Hpk3rpFNamWtRPmJBeq8Z0dQV1lLTMM+2pUatH6p+5pvEg== +"@angular/common@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-20.1.6.tgz#4263607cc53c8f25d66954e8cdac371ad8a365d5" + integrity sha512-VwV6u5y5NQg5u+Z5A50MCJNpxseny9Rv+csZe9zckH0ylqy9tLowbG6L7jrts36Ze2lwqRag0b+wB0TgrvaT0w== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-20.1.4.tgz#a7447f2e3c2aeaec5318bbd1f4d4c08747221eb9" - integrity sha512-I603/3EmclgX4VUryBo3bxlF+8+fVucrW/V0leqNlt72ppFTphDiKiopogoJFWJxuULTo2V+7Koq8Em7kUO67Q== +"@angular/compiler-cli@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-20.1.6.tgz#2b979bd316834ba63a29e35be07d561a917f3ded" + integrity sha512-wskAeqRH46XfYRjaNSE3waeaBrogKghUM82WDDEw0U+CMP/j3BBS0RqILRYJCmuTjQ7RwXaPQBV2m2jAYaHlNg== dependencies: "@babel/core" "7.28.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -407,50 +407,50 @@ tslib "^2.3.0" yargs "^18.0.0" -"@angular/compiler@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-20.1.4.tgz#2e2a32d009e8c9b76929c4fcb557749e25c08487" - integrity sha512-gQbchh2ziK9QxZuHgEf7BUMCm/ayu6Zr9hst6itSecinUJgUeeSp3Z4vXjIBNBUKMPB135tWw9RGiVbW8saBmg== +"@angular/compiler@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-20.1.6.tgz#4bb1893fa37e9c668bdfe7b0929ab8694f78dad5" + integrity sha512-PASAnrY3dHl3mOlYP7n49a1djbw+CGeBwkzhSVhDTrkg9hyx6GMDCNdNr1xZFWFjgS7vB3K8nIk8o9k+bXpH0g== dependencies: tslib "^2.3.0" -"@angular/core@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-20.1.4.tgz#d18f2e7c43067419f99523eafedeab30559d2d7e" - integrity sha512-aWDux64a9usuVU2SnF0epqjXAj8JO8jViUzZAJAuFKSCtkeNzqP+Z6DjkqsCKrNvGP7xkX1XhhepUygxgh7/6A== +"@angular/core@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-20.1.6.tgz#d3bc4d237d408532e4f41e9ab36f62d2ec3b3a49" + integrity sha512-Nz62f9FNcvjOxUivi50YtmEfSdrS7xqpPDoN/jwLkT5VmFfIUFF77sabTF5KTWHCDbp420e2UON6uEblfiRfaw== dependencies: tslib "^2.3.0" -"@angular/forms@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-20.1.4.tgz#af5d11841ca3e9f1faea451a90e2112f672adaf5" - integrity sha512-5gUwcV+JpzJ2rSPo1nR6iNz2Dm3iRcVCvRTsVnKhFbZCIbGLihLpoCuittsgUY/C9wh/rnmXlatmLJ7giSuUZA== +"@angular/forms@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-20.1.6.tgz#87debb56fd68535653704460ced8e0edb191137f" + integrity sha512-9gLaiX8c2qOCu4jVukATCnSAANJuLKWGLZpZyLdJGHpZWM7ECf6hpsDKOq+AytqqYKWqZvjcI8AujUroU6aUtg== dependencies: tslib "^2.3.0" -"@angular/language-service@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-20.1.4.tgz#a0f3b659ab9b342633260372f8e8894729b1ea32" - integrity sha512-uesg1dNjHkORfYWEXJwfPUyYVEUf5Bb8taxt1AwgYx+NxKKWaNdJQlJu6sAwmPSFlWYMX44Dzk/geLHAq++Nhg== +"@angular/language-service@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-20.1.6.tgz#a804c2a7cc071572959c97bc428b3683af65ea55" + integrity sha512-ItcxUjVkEJCo4QoR2nORjaFEPInJ4z61DE9AaCMVcmENNeXBt+hpqI+mal2ktZvVsV3ah3kskWy4hQUNZIRAdA== -"@angular/platform-browser-dynamic@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.1.4.tgz#5fd0af97075bab26fc28639aa1bc8866fed5909c" - integrity sha512-bH4CjZ2O2oqRaKd36Xe/EhZDHx769pPf9oR4oITsZJ10bIhkWcaG9pgaW+W1PGc+nMevVpJ7XfG9m9n6+3bEfw== +"@angular/platform-browser-dynamic@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-20.1.6.tgz#5ca93d979d88532b7c2a81e6549836de83c31082" + integrity sha512-vAzgQUGppZ6lBpT++hFzCw6K77MfeYwtL/2BxHPWZMsJVrHF2WtbATn0Icgx6vyKixz7eJzDPKhooFSn5o32RQ== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-20.1.4.tgz#6da42244bcfb3b9422d58e080fa10e941bddd82b" - integrity sha512-z86NsGSwm5pXCACdWBbp7SC1Xn+UGvuoRqTsi0dNUXT/3WrP6MvZT3TfNKwM63GLUqFAICSt7uFXS84D72ukvA== +"@angular/platform-browser@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-20.1.6.tgz#7a24827c68c0bcbc8c839650fd04a85679624128" + integrity sha512-0FmqP1+JdzrT74JZLbf5IpC8nn0AeJ3Mk1IlXRVcK5olyh3SiEZIGBw89mYwmgP3gQqnjoakooTMA3wwy4Evxw== dependencies: tslib "^2.3.0" -"@angular/router@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-20.1.4.tgz#906cf0d61fecac17d9ad38d127883444902a2d64" - integrity sha512-Etd2V2Qw+clQhJORBm7tMphCCweLNKbZvUc+lh1r7yrbBPnZvK3yd69W9ZQoRzrSSI25VGQDyzQXgpLUlHoE+w== +"@angular/router@^20.1.6": + version "20.1.6" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-20.1.6.tgz#6c717c2d8caff97883a9c171579cd36b3f507723" + integrity sha512-42eB6UB/uZt5LqBK7sIGV+fnWPWgwlhZDCl7aujv0Tlwx1HgdLW7EbqMYs+2SIrezn4uj0hg+74oy1PL46V7MA== dependencies: tslib "^2.3.0" @@ -2584,7 +2584,7 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== -"@discoveryjs/json-ext@0.6.3": +"@discoveryjs/json-ext@0.6.3", "@discoveryjs/json-ext@^0.6.1": version "0.6.3" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== @@ -3061,15 +3061,15 @@ debug "^4.3.1" minimatch "^3.1.2" -"@eslint/config-helpers@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286" - integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== +"@eslint/config-helpers@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.1.tgz#d316e47905bd0a1a931fa50e669b9af4104d1617" + integrity sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA== -"@eslint/core@^0.15.0", "@eslint/core@^0.15.1": - version "0.15.1" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60" - integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== +"@eslint/core@^0.15.2": + version "0.15.2" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.2.tgz#59386327d7862cc3603ebc7c78159d2dcc4a868f" + integrity sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg== dependencies: "@types/json-schema" "^7.0.15" @@ -3088,22 +3088,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.32.0", "@eslint/js@^9.32.0": - version "9.32.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.32.0.tgz#a02916f58bd587ea276876cb051b579a3d75d091" - integrity sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg== +"@eslint/js@9.33.0", "@eslint/js@^9.33.0": + version "9.33.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.33.0.tgz#475c92fdddab59b8b8cab960e3de2564a44bf368" + integrity sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A== "@eslint/object-schema@^2.1.6": version "2.1.6" resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== -"@eslint/plugin-kit@^0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz#c6b9f165e94bf4d9fdd493f1c028a94aaf5fc1cc" - integrity sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw== +"@eslint/plugin-kit@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz#fd8764f0ee79c8ddab4da65460c641cefee017c5" + integrity sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w== dependencies: - "@eslint/core" "^0.15.1" + "@eslint/core" "^0.15.2" levn "^0.4.1" "@fastify/busboy@^3.0.0": @@ -4481,10 +4481,10 @@ resolved "https://registry.yarnpkg.com/@nestjs/axios/-/axios-4.0.1.tgz#7ff73f47727b67dc04410ac6e9b3329401ebbb65" integrity sha512-68pFJgu+/AZbWkGu65Z3r55bTsCPlgyKaV4BSG8yUAD72q1PPuyVRgUwFv6BxdnibTUHlyxm06FmYWNC+bjN7A== -"@nestjs/common@^11.1.5": - version "11.1.5" - resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-11.1.5.tgz#bc491d049e21f91216189b06e56f801730a8a3d1" - integrity sha512-DQpWdr3ShO0BHWkHl3I4W/jR6R3pDtxyBlmrpTuZF+PXxQyBXNvsUne0Wyo6QHPEDi+pAz9XchBFoKbqOhcdTg== +"@nestjs/common@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-11.1.6.tgz#704ae26f09ccd135bf3e6f44b6ef4e3407ea3c54" + integrity sha512-krKwLLcFmeuKDqngG2N/RuZHCs2ycsKcxWIDgcm7i1lf3sQ0iG03ci+DsP/r3FcT/eJDFsIHnKtNta2LIi7PzQ== dependencies: uid "2.0.2" file-type "21.0.0" @@ -4501,10 +4501,10 @@ dotenv-expand "12.0.1" lodash "4.17.21" -"@nestjs/core@^11.1.5": - version "11.1.5" - resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-11.1.5.tgz#98fff1a0b47b36a1939f6d9f6c899c085e470e25" - integrity sha512-Qr25MEY9t8VsMETy7eXQ0cNXqu0lzuFrrTr+f+1G57ABCtV5Pogm7n9bF71OU2bnkDD32Bi4hQLeFR90cku3Tw== +"@nestjs/core@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-11.1.6.tgz#9d54882f121168b2fa2b07fa1db0858161a80626" + integrity sha512-siWX7UDgErisW18VTeJA+x+/tpNZrJewjTBsRPF3JVxuWRuAB1kRoiJcxHgln8Lb5UY9NdvklITR84DUEXD0Cg== dependencies: uid "2.0.2" "@nuxt/opencollective" "0.4.1" @@ -4526,15 +4526,23 @@ resolved "https://registry.yarnpkg.com/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz#b9b536b7c3571567aa1d0223db8baa1a51505a19" integrity sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw== +"@nestjs/microservices@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/microservices/-/microservices-11.1.6.tgz#a295eba66c7beb655b6ff5e8fb45972b1147accd" + integrity sha512-5ibvCvZ8IBxKhpSkyAC+EBdtm0XVAu3h+GV4PmOi4bXbRvVBT3Kwqq4td2wkWDN3VqteChjQ0aTADv0jizhCrg== + dependencies: + iterare "1.2.1" + tslib "2.8.1" + "@nestjs/passport@^11.0.5": version "11.0.5" resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-11.0.5.tgz#dd3e506c2fb7ddc80fd1321c01cc1a0ca6d6b609" integrity sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ== -"@nestjs/platform-express@^11.1.5": - version "11.1.5" - resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-11.1.5.tgz#93a609c6ffd80460b561220d469e5e1bd11f732f" - integrity sha512-OsoiUBY9Shs5IG3uvDIt9/IDfY5OlvWBESuB/K4Eun8xILw1EK5d5qMfC3d2sIJ+kA3l+kBR1d/RuzH7VprLIg== +"@nestjs/platform-express@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-11.1.6.tgz#9b1dcf82a3b3fdd5761c918ad664aff83e4eacc7" + integrity sha512-HErwPmKnk+loTq8qzu1up+k7FC6Kqa8x6lJ4cDw77KnTxLzsCaPt+jBvOq6UfICmfqcqCCf3dKXg+aObQp+kIQ== dependencies: cors "2.8.5" express "5.1.0" @@ -4576,10 +4584,10 @@ path-to-regexp "8.2.0" swagger-ui-dist "5.21.0" -"@nestjs/testing@^11.1.5": - version "11.1.5" - resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-11.1.5.tgz#8a95502b8eb0349c4f3d7cf355e441291084733e" - integrity sha512-ZYRYF750SefmuIo7ZqPlHDcin1OHh6My0OkOfGEFjrD9mJ0vMVIpwMTOOkpzCfCcpqUuxeHBuecpiIn+NLrQbQ== +"@nestjs/testing@^11.1.6": + version "11.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-11.1.6.tgz#7f172a8024948dee4cb318acccfff31c1356f338" + integrity sha512-srYzzDNxGvVCe1j0SpTS9/ix75PKt6Sn6iMaH1rpJ6nj2g8vwNrhK0CoJJXvpCYgrnI+2WES2pprYnq8rAMYHA== dependencies: tslib "2.8.1" @@ -4590,10 +4598,10 @@ dependencies: tslib "^2.3.0" -"@ngtools/webpack@20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-20.1.4.tgz#af89562d0583db23fe42ec3c6219dd57611d39ac" - integrity sha512-pk7xas/dBRHIVpdBIhOUreXA8D9CH7f5anFoiALfubYPldlEtneQCO5HAeS9MjtLIIonv2kJC9+nNEvyJa95oQ== +"@ngtools/webpack@20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-20.1.5.tgz#0de70956452b8f63e726a86439ada63ef82b6330" + integrity sha512-QAiGzqxHhdV3uh53GlXHegVEnK5GmS90Hqqhx2lLnhWCI7blpe2CuG+BuIWMXMUck9NUz6kR6jPysQYA5ENATA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -4724,19 +4732,19 @@ dependencies: consola "^3.2.3" -"@nx/angular@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-21.3.10.tgz#ec534540f5320a5487b048558c5a4de44b29ffa4" - integrity sha512-Z+JkSUKEGMhtKypSSyqw9q38seJU2TBF8dE7sxH68rlI/+UgQo2OSSPYCX9R4GLJ+Zx4/6PBtklEtUT9PHr0Mg== - dependencies: - "@nx/devkit" "21.3.10" - "@nx/eslint" "21.3.10" - "@nx/js" "21.3.10" - "@nx/module-federation" "21.3.10" - "@nx/rspack" "21.3.10" - "@nx/web" "21.3.10" - "@nx/webpack" "21.3.10" - "@nx/workspace" "21.3.10" +"@nx/angular@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/angular/-/angular-21.3.11.tgz#c3cd3b661b16ab5cd73cee314c7fbb7c59909bbf" + integrity sha512-cpNZP65YrxKDJD3zR1jMDNz4iGNMt7RL68uTB7oNwUHkXUihfhxSgNEuR06jl70XEPoTFXNHZezb1ckA+GcGyg== + dependencies: + "@nx/devkit" "21.3.11" + "@nx/eslint" "21.3.11" + "@nx/js" "21.3.11" + "@nx/module-federation" "21.3.11" + "@nx/rspack" "21.3.11" + "@nx/web" "21.3.11" + "@nx/webpack" "21.3.11" + "@nx/workspace" "21.3.11" "@phenomnomnominal/tsquery" "~5.0.1" "@typescript-eslint/type-utils" "^8.0.0" enquirer "~2.3.6" @@ -4747,10 +4755,10 @@ tslib "^2.3.0" webpack-merge "^5.8.0" -"@nx/devkit@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-21.3.10.tgz#59eb9a0fc65e510874183c491e35c05443fc930a" - integrity sha512-4g7A5iKE+3WwxtmdoBPLcEV5gyBn2Kix10WviMgA42DPGdYRrek2QJU6CmgXOCg4sK9EHIUQOthiQkpIjD1smg== +"@nx/devkit@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-21.3.11.tgz#105cc3185f7d029b00f1e9d26c7168819881ffd1" + integrity sha512-JOV8TAa9K5+ZwTA/EUi0g5qcKEg5vmi0AyOUsrNUHlv3BgQnwZtPLDDTPPZ+ezq24o6YzgwueZWj3CLEdMHEDg== dependencies: ejs "^3.1.7" enquirer "~2.3.6" @@ -4761,25 +4769,25 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/esbuild@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/esbuild/-/esbuild-21.3.10.tgz#8443674a301480f886c2a7bc8db19e2d33ff8ae6" - integrity sha512-eyWbjUGPliY8gmbsskKiSEzNUi7LvEG674XCSht9gLGnTTgJDkVlpl1mKgH7TNy/Hy0MYFOsyUpmpd6mwja9mw== +"@nx/esbuild@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/esbuild/-/esbuild-21.3.11.tgz#6b9393f511108fe4869af2111d22d7eb75d69cf5" + integrity sha512-KODlvBH5JpuAJpDb98J093270TniNDPVDmLtVbAiPFJPRI5R7ElOLxO5gYtDNIlcQyVbrG6gb6I8RDFYz+nKeQ== dependencies: - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" picocolors "^1.1.0" tinyglobby "^0.2.12" tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/eslint-plugin@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-21.3.10.tgz#687c01e15dc67b2c0093dabad663866cf32f3d6e" - integrity sha512-vWHCn1VzJ4kyL/ObzOyCUHmSpmE/bM3A8rAs/5yt1gjsYIdxRgpWN5uMu3LKS98z8agzET/2yOCcdQ88lpMQ8A== +"@nx/eslint-plugin@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-21.3.11.tgz#8f790b7b75ecef60e16f675c263c61613695b1e1" + integrity sha512-BabOp+5qZx/GgCWVALiVm4wjrUOO5sqeItsAWtpocMsvYE8YRZ4+AekS/F2knTjJdcdrh51hxqv5ua3YTNFtfA== dependencies: - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" "@phenomnomnominal/tsquery" "~5.0.1" "@typescript-eslint/type-utils" "^8.0.0" "@typescript-eslint/utils" "^8.0.0" @@ -4790,26 +4798,26 @@ semver "^7.5.3" tslib "^2.3.0" -"@nx/eslint@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-21.3.10.tgz#6e353bdea1b54fb0fe8b30fed6f35fac67292b36" - integrity sha512-X4CAPf653kBqeA+qrP1+a22CdbtuOqJaEvhrvE5A1ap9ZmLtBg87xO73YG+VJWDT16fuAwUGWRTwRjmOPSft3w== +"@nx/eslint@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-21.3.11.tgz#c5c8443a2a2172e8a17a1eeb496d755e5af6d6a8" + integrity sha512-9jeD8QuU3OMcItjtw0QHl5cwohLeA9R+lajNJoOjS2tUGXTHWb8NOcEZBXWMcML+eV1iloIDW8/P4jV4BYqP2w== dependencies: - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" semver "^7.5.3" tslib "^2.3.0" typescript "~5.8.2" -"@nx/jest@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-21.3.10.tgz#32ca492f2644a0bbca99c6f9646a6991eb8f3779" - integrity sha512-aeWOk+j5DxwEkdOskfwivHsO4sCzTgoKJS7hrXP4E8GZYjz09ANaluSThETsEAGiuyxkyznKRYVj51P/ZHCU+A== +"@nx/jest@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-21.3.11.tgz#033290ea4c69dbfeca14be925cfdb84354b6981f" + integrity sha512-PkdNWeoUY81zr+jtUapBdvvh26lWYIhDNyUwTjIBFajX8EAlhJpvShKHs7QObmrwOMLMXwLHKINiSCw9rueOBQ== dependencies: "@jest/reporters" "^30.0.2" "@jest/test-result" "^30.0.2" - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" "@phenomnomnominal/tsquery" "~5.0.1" identity-obj-proxy "3.0.0" jest-config "^30.0.2" @@ -4822,10 +4830,10 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/js@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-21.3.10.tgz#442eaffc8cf276cd3630f8ed18bac9b75ad83d5a" - integrity sha512-KgUJVPKCOg2z6OliCsdrxR+Q+28+whGAYWGvu8B0gyWWIRsgcvFtq33O1+/DP3A9oKI5f5ALkMBmiYsD90P5aQ== +"@nx/js@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-21.3.11.tgz#84938bafa95e0c051060efe583e3e476c385bf40" + integrity sha512-aN8g1TP3FMN6MFLvMrZNaoqSwAkBFH1PunKQV17w4nlPkimWICaCP2DhY5W3VoOpjQBbhQoqrRt4mVfgnEpyvA== dependencies: "@babel/core" "^7.23.2" "@babel/plugin-proposal-decorators" "^7.22.7" @@ -4834,8 +4842,8 @@ "@babel/preset-env" "^7.23.2" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nx/devkit" "21.3.10" - "@nx/workspace" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/workspace" "21.3.11" "@zkochan/js-yaml" "0.0.7" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^3.1.0" @@ -4857,17 +4865,17 @@ tinyglobby "^0.2.12" tslib "^2.3.0" -"@nx/module-federation@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/module-federation/-/module-federation-21.3.10.tgz#ee22f47fbae0cac125711e317b9cb2f3364e76c5" - integrity sha512-3sENCYyGx/HcgMhP/XKcF2YIHpTBkTVcVaAwJR3UsC7KVHCJmjHeQLF/TkVBrN+2JYLlTn9TvTt4bKShD4I8eg== +"@nx/module-federation@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/module-federation/-/module-federation-21.3.11.tgz#538d7d9483292a047e3ef953c52d99457aa982de" + integrity sha512-gB+eXw2nIobB+HmcxqjiYLWM3WKP2iIJjT6e1bIHne9ltc/xegGGAHfijjXGvVDYRF5xY/uvZCoF/CHndABFog== dependencies: "@module-federation/enhanced" "^0.17.0" "@module-federation/node" "^2.7.9" "@module-federation/sdk" "^0.17.0" - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" - "@nx/web" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" + "@nx/web" "21.3.11" "@rspack/core" "^1.3.8" express "^4.21.2" http-proxy-middleware "^3.0.3" @@ -4875,102 +4883,102 @@ tslib "^2.3.0" webpack "^5.88.0" -"@nx/nest@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-21.3.10.tgz#17147afd6ee30dacc5d443978254b88af2f2d9b6" - integrity sha512-5y2mx7zdLWi0IpA0rfTuSR9OAOeIVLDnTCkswBAoFB/BSIczS4QksMu2mJ4uNU6BT/gvdoTDj3j8xQCgFoNeuw== +"@nx/nest@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nest/-/nest-21.3.11.tgz#c3b90a59dc09af5f536c9eead73e392b0c403a13" + integrity sha512-P0QJSgpqoCbCZOi0OdrF/zq/KGZ4UBC0d+oa5MlcpBcnzYQFsg7ykCwcRJehNkry4K7RI9bDdpbAZkEknHl8Gg== dependencies: "@nestjs/schematics" "^11.0.0" - "@nx/devkit" "21.3.10" - "@nx/eslint" "21.3.10" - "@nx/js" "21.3.10" - "@nx/node" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/eslint" "21.3.11" + "@nx/js" "21.3.11" + "@nx/node" "21.3.11" tslib "^2.3.0" -"@nx/node@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-21.3.10.tgz#6aeb62a161fa6980c375b370aa2ff8e0f7695cfe" - integrity sha512-oheMdW4UDoqZ5BE5TCWvtnZ6p6vj9GMZX+/gAe4aZx9mUdta8zAujjCvU5xkHqXgWW/IL75DO6M0w+biG5QT3Q== +"@nx/node@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-21.3.11.tgz#35ff27f6ae6f414d8a19a5945a7461493b3523c9" + integrity sha512-4B2onNmhrCaLlhwhDycMOisAuXmajAbl9gM8G6dS4Tc6z8QHXswlJG6rVP4VvR0ZZKtLeKGED2X5hpv9T1ikxw== dependencies: - "@nx/devkit" "21.3.10" - "@nx/eslint" "21.3.10" - "@nx/jest" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/eslint" "21.3.11" + "@nx/jest" "21.3.11" + "@nx/js" "21.3.11" kill-port "^1.6.1" tcp-port-used "^1.0.2" tslib "^2.3.0" -"@nx/nx-darwin-arm64@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.10.tgz#3a8e0f9e25f145db7194a4b18df52ee51fcba419" - integrity sha512-umYmO5xE9e7BtVzOYWurjeZEpqO/KnFDl+sLf58EzKOBf+tWDp1PVTpmuYhPxjlH6WkVaYCTA62L3SkIahKZ+w== - -"@nx/nx-darwin-x64@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.10.tgz#a34e639b7cb1be764fccca509f5d967beac13a60" - integrity sha512-f2vl8ba5IyG/3fhvrUARg/xKviONhg5FHmev5krSIRYdFXsCNgI8qX251/Wxr7zjABnARdwfEZcWMTY4QRXovA== - -"@nx/nx-freebsd-x64@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.10.tgz#ed4528f7b30ddbe85e9bddeaedb3e43a4a377b17" - integrity sha512-Tl0haFCRj+1Updj+KZYOxdhNlrp0CUiGIGo0n3S4ruuwtqSmSdwPb7ZGIvIHSQloX2k7CP/oRQw68HoUmsnIyA== - -"@nx/nx-linux-arm-gnueabihf@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.10.tgz#7d78a1c23bcceb07c52c4103e35a35b60a56dfe2" - integrity sha512-3siCCKhlaBp3a56KbkPyixoW7m/H1Cx6vfMxBHro3qqG8m7NYQ5Iy/Ih8G1ghAhr1KoKeXMPAoEglZVbFXDypQ== - -"@nx/nx-linux-arm64-gnu@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.10.tgz#b6708f9e58af01c2efa3d8c8f430fef4a8d14e1e" - integrity sha512-9Phr9FBVDr86QQ32Qxf7GyfBpgPfYDf0TWkWZe/EhR3UijoCM3a2WMyoLWxhl+oTkjxQVBP7adqToh7Da0hyuQ== - -"@nx/nx-linux-arm64-musl@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.10.tgz#f90f50872f58f2c5f77e5641c6196684b1b054fc" - integrity sha512-TxgwIXOFrCbBz3xlP+aCil+KaHH6pRLA+JW4RD0ZMes/iP+99R+/+gKznw7CEkpXkzX194gGTe2NlM45129uEg== - -"@nx/nx-linux-x64-gnu@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.10.tgz#1f0b6e942d00c4f7caf012894b30f1018c850076" - integrity sha512-UNIEt/i4OpGvjS8ds/m2lv/4C6SmaWTzIfok59TL/8BG0ab5x/lADdKd6OBbvhmDiBdz+As3uLiCN03uRsz95Q== - -"@nx/nx-linux-x64-musl@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.10.tgz#28118864a5739c9ec32b413e0376fffe6db7d13e" - integrity sha512-/ETUG3auZjQmWliaHQQFr/cqb493HGShDrcJYa0Zd67TZeUHsYY5lc71u6pA7d+aP/r51RToamxpDK0cGmqINQ== - -"@nx/nx-win32-arm64-msvc@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.10.tgz#6634f93e9c30b9487810422c29f8dc43f190dceb" - integrity sha512-xBOzmfjB695KkFZ3a2IblN/Vb6I9LlDbIV2I1X/Ks8jdK0q1Fh+mqZWDfOUuBr5oKcUPD5pZiH/vpr5mBssLig== - -"@nx/nx-win32-x64-msvc@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.10.tgz#8c6f99d79c515882f895f8db7a8c26f819837006" - integrity sha512-TZPwjF1adI8FCJp7MmgXNtnwuW1AOBSiPEHLz2RM8cJKBc7rlmXw/MWhnYhz2lkZQ+vpndoLGtpinYo5cp/NQA== - -"@nx/playwright@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/playwright/-/playwright-21.3.10.tgz#ad6115b4aa272853924ed87f5fea3687b05a83e2" - integrity sha512-N/cNYEs7WyDtWgaem+IpuNbBkdtef8kxht58tSlhZXPQV8vjFiXhWt5qqIEWUCLWfCfMXZOpaO7qm3NlbfMvwg== - dependencies: - "@nx/devkit" "21.3.10" - "@nx/eslint" "21.3.10" - "@nx/js" "21.3.10" +"@nx/nx-darwin-arm64@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.3.11.tgz#3c24148af6967afb6fa4ed12f35409854b384c9b" + integrity sha512-qXZrW6kfsfGG9n4cWugR2v8ys7P1SsbQuFahlbNSTd7g+ZxozaOnc7tyxW9XuY84KQ35HwP/QSu1E13fK5CXwQ== + +"@nx/nx-darwin-x64@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-21.3.11.tgz#adbc022b102e7d353866ac62b4c0bd2b96e6b5f4" + integrity sha512-6NJEIGRITpFZYptJtr/wdnVuidAS/wONMMSwX5rgAqh5A9teI0vxZVOgG6n5f6NQyqEDvZ9ytcIvLsQWA4kJFg== + +"@nx/nx-freebsd-x64@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.3.11.tgz#369e3f0d8ff4f4b8303822e0d3d3ac7c5bc8e6e9" + integrity sha512-9VZOM9mutzuZCUgijHXrIl3NgKt2CWuH/awLqDS8ijhLs6WfI5TYTa+mFwx90dfZZ4y/jy6XWXa2Ee3OShf7Hg== + +"@nx/nx-linux-arm-gnueabihf@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.3.11.tgz#dce034188c41f2a799284853a375806117aa9ac2" + integrity sha512-a05tAySKDEWt0TGoSnWp/l5+HL/CDJQkHfI9pXho85oDSkVRzhOInAn1EeZB/F+Q3PnJFsMHMhbuu2/nm3uYJA== + +"@nx/nx-linux-arm64-gnu@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.3.11.tgz#9edbf4df73881f6f616ee1d795ec4e6bdd4822ae" + integrity sha512-MPeivf0ptNpzQYvww6zHIqVbE5dTT2isl/WqzGyy7NgSeYDpFXmouDCQaeKxo5WytMVRCvCw/NnWTQuCK6TjnA== + +"@nx/nx-linux-arm64-musl@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.3.11.tgz#cef19062711a36d10af77f97122d513b258f2b26" + integrity sha512-/hJpc4VJsbxDEreXt5Ka9HJ3TBEHgIa9y/i+H9MmWOeapCdH1Edhx58Heuv9OaX7kK8Y8q0cSicv0dJCghiTjA== + +"@nx/nx-linux-x64-gnu@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.3.11.tgz#9763d938ebea8ec8b11e4372aa9ec4c422daaf70" + integrity sha512-pTBHuloqTxpTHa/fdKjHkFFsfW16mEcTp37HDtoQpjPfcd9nO8CYO8OClaewr9khNqCnSbCLfSoIg/alnb7BWw== + +"@nx/nx-linux-x64-musl@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.3.11.tgz#7996944f7c76895cda7043718791bb0d02574461" + integrity sha512-OhFjURB68rd6xld8t8fiNpopF2E7v+8/jfbpsku9c0gdV2UhzoxCeZwooe7qhQjCcjVO8JNOs4dAf7qs1VtpMw== + +"@nx/nx-win32-arm64-msvc@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.3.11.tgz#5460efcd7890442a2a7d34754d2b9e2cd638f594" + integrity sha512-pGE2Td13oEj7aeogwCL+2fjmpabQVSduKfGOTlt4YoMlM0w0bXYSWqwiGBMKbMA50qkhnVapwwkuWF38PgCIxg== + +"@nx/nx-win32-x64-msvc@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.3.11.tgz#84ba2b4babb251cbff36472c747a327fc1adc242" + integrity sha512-KJqLL/Zyx96hs+7pKbo/fsU7ZTFSLeZLnYQu05o6fvJJ5I1+p85t212/7vkbKKWJncyMospQdzLr3zLG3A/u8A== + +"@nx/playwright@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/playwright/-/playwright-21.3.11.tgz#bcf0c5ed9a663b97de46d5e7389a251d77089921" + integrity sha512-15VfcWM8+DgOZ726vOpfSX0rTi3Em3XgfjySRWuJbGDRua4BZUcVQMxvDgj30jQRCygaefw4N910sHWwVhaCbA== + dependencies: + "@nx/devkit" "21.3.11" + "@nx/eslint" "21.3.11" + "@nx/js" "21.3.11" "@phenomnomnominal/tsquery" "~5.0.1" minimatch "9.0.3" tslib "^2.3.0" -"@nx/rspack@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/rspack/-/rspack-21.3.10.tgz#9d5ec28a18183e1f60192fc872dc0cd18925bffe" - integrity sha512-EN64lUg8mf1KhPaIjqIjpYWjlX/MjAHCqK4kUduGhwhvTna1i6rPY+yLCyMXbWcOH1y64cYYk4WYJshqnKooXQ== +"@nx/rspack@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/rspack/-/rspack-21.3.11.tgz#9395e7d6839a651c37eaf66dc0edf340dcfb6a87" + integrity sha512-MGR55b2dOPwNQJYphBj7uBMrNwKCWCbAzOuvmbfoNFTAgzpiSIkcwzcGforatXClOxjTilv4xNyHVmSpT/1ZCQ== dependencies: - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" - "@nx/module-federation" "21.3.10" - "@nx/web" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" + "@nx/module-federation" "21.3.11" + "@nx/web" "21.3.11" "@phenomnomnominal/tsquery" "~5.0.1" "@rspack/core" "^1.3.8" "@rspack/dev-server" "^1.1.1" @@ -4999,26 +5007,26 @@ webpack "^5.80.0" webpack-node-externals "^3.0.0" -"@nx/web@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-21.3.10.tgz#688e82d170be35a656116cb675c3db2cbaf85016" - integrity sha512-fadm1T3XvK182TIDG4r1mipUFfy0p1Ad8GpFb2608UTsbBdEkOPPoBqQTe70LcnX3/7nMtJWU5W/FkYizEct9w== +"@nx/web@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/web/-/web-21.3.11.tgz#283936397142b41eea28e33d732b31f207481693" + integrity sha512-nDXv9yJgqZGqD3iEGkacJ7HQ4AbIlPvXH3qdv1ZwJWn0hAt7gBh1TO24gKz38sB3bwZlORRXEAi3dG0XgGkdxA== dependencies: - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" detect-port "^1.5.1" http-server "^14.1.0" picocolors "^1.1.0" tslib "^2.3.0" -"@nx/webpack@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-21.3.10.tgz#ad1c465ca49d0b25b908aa833c3c87837210593c" - integrity sha512-xLOpapHOVpMENQqEJetxRkeLbMQc7rffrzpYupsQgtUORVleliNkLuza0ap7jf+FU8zCTl0B+mdwh6QnNVh0rA== +"@nx/webpack@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/webpack/-/webpack-21.3.11.tgz#0f942caac928c10fb8df196073ff96c5dc3edb8d" + integrity sha512-GAqA9yHLro4zDf2z27uWseUSLiZZh2IZ3Eh5Kb9l/LA4ujT3whkpNoIo/K2LxzmmOG8k2SkJ7wBntCPk2O1e8g== dependencies: "@babel/core" "^7.23.2" - "@nx/devkit" "21.3.10" - "@nx/js" "21.3.10" + "@nx/devkit" "21.3.11" + "@nx/js" "21.3.11" "@phenomnomnominal/tsquery" "~5.0.1" ajv "^8.12.0" autoprefixer "^10.4.9" @@ -5053,16 +5061,16 @@ webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nx/workspace@21.3.10": - version "21.3.10" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-21.3.10.tgz#31969119e39686cee1cfbf117f6c8fb9f3883e1b" - integrity sha512-pMT3gqU1KsLcSSUpq+W80d61WrjoDKvbj8/8c26F4BbZt7y9QGzwPS3ZAMdMm16h5SGKcRWxw+WE68yF2C2vtw== +"@nx/workspace@21.3.11": + version "21.3.11" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-21.3.11.tgz#1e3f1dc14c08f44303db95c6bbd877b484356f97" + integrity sha512-DD2iu9Ip/faNQ5MXZk+UbbBxGofYKjzHsXKRvMNQ/OAVzP/u9z2CPXEmRKlRAEQoy1lInmyopwfEUWwK1v4x0g== dependencies: - "@nx/devkit" "21.3.10" + "@nx/devkit" "21.3.11" "@zkochan/js-yaml" "0.0.7" chalk "^4.1.0" enquirer "~2.3.6" - nx "21.3.10" + nx "21.3.11" picomatch "4.0.2" tslib "^2.3.0" yargs-parser "21.1.1" @@ -5318,12 +5326,12 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.7.tgz#eb5014dfd0b03e7f3ba2eeeff506eed89b028058" integrity sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg== -"@playwright/test@^1.54.1": - version "1.54.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.54.1.tgz#a76333e5c2cba5f12f96a6da978bba3ab073c7e6" - integrity sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw== +"@playwright/test@^1.54.2": + version "1.54.2" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.54.2.tgz#ff0d1e5d8e26f3258ae65364e2d4d10176926b07" + integrity sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA== dependencies: - playwright "1.54.1" + playwright "1.54.2" "@pmmmwh/react-refresh-webpack-plugin@^0.6.1": version "0.6.1" @@ -5758,13 +5766,13 @@ resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== -"@schematics/angular@20.1.4", "@schematics/angular@^20.1.4": - version "20.1.4" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-20.1.4.tgz#9b4d3b74a5feba29119df1a1a0521d768afeca74" - integrity sha512-TNpm15NKf4buxPYnGaB3JY2B/3sbL19SdlpPDxkgyVY8WDDeZX95m3Tz2qlKpsYxy2XCGUj4Sxh7zJNGC9e/4g== +"@schematics/angular@20.1.5", "@schematics/angular@^20.1.5": + version "20.1.5" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-20.1.5.tgz#e73d90fa46b4c6a38e593c9368f7e1cd16c1b421" + integrity sha512-+bgbujb9F6cgP/hz0L8IEJy16aXIsgypTcHdckozbjDRUMtqjjmCNjutep0t6hfe9La/4hF8pKiOx9KLBFG+rw== dependencies: - "@angular-devkit/core" "20.1.4" - "@angular-devkit/schematics" "20.1.4" + "@angular-devkit/core" "20.1.5" + "@angular-devkit/schematics" "20.1.5" jsonc-parser "3.3.1" "@sigstore/bundle@^3.0.0": @@ -6429,12 +6437,12 @@ dependencies: undici-types "~6.19.8" -"@types/node@^24.1.0": - version "24.1.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.1.0.tgz#0993f7dc31ab5cc402d112315b463e383d68a49c" - integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w== +"@types/node@^24.2.1": + version "24.2.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.2.1.tgz#83e41543f0a518e006594bb394e2cd961de56727" + integrity sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ== dependencies: - undici-types "~7.8.0" + undici-types "~7.10.0" "@types/normalize-package-data@^2.4.3": version "2.4.4" @@ -6605,48 +6613,48 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz#6e5220d16f2691ab6d983c1737dd5b36e17641b7" - integrity sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA== +"@typescript-eslint/eslint-plugin@^8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz#c9afec1866ee1a6ea3d768b5f8e92201efbbba06" + integrity sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.38.0" - "@typescript-eslint/type-utils" "8.38.0" - "@typescript-eslint/utils" "8.38.0" - "@typescript-eslint/visitor-keys" "8.38.0" + "@typescript-eslint/scope-manager" "8.39.0" + "@typescript-eslint/type-utils" "8.39.0" + "@typescript-eslint/utils" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" graphemer "^1.4.0" ignore "^7.0.0" natural-compare "^1.4.0" ts-api-utils "^2.1.0" -"@typescript-eslint/parser@^8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.38.0.tgz#6723a5ea881e1777956b1045cba30be5ea838293" - integrity sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ== +"@typescript-eslint/parser@^8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.39.0.tgz#c4b895d7a47f4cd5ee6ee77ea30e61d58b802008" + integrity sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg== dependencies: - "@typescript-eslint/scope-manager" "8.38.0" - "@typescript-eslint/types" "8.38.0" - "@typescript-eslint/typescript-estree" "8.38.0" - "@typescript-eslint/visitor-keys" "8.38.0" + "@typescript-eslint/scope-manager" "8.39.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/typescript-estree" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.38.0.tgz#4900771f943163027fd7d2020a062892056b5e2f" - integrity sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg== +"@typescript-eslint/project-service@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.39.0.tgz#71cb29c3f8139f99a905b8705127bffc2ae84759" + integrity sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.38.0" - "@typescript-eslint/types" "^8.38.0" + "@typescript-eslint/tsconfig-utils" "^8.39.0" + "@typescript-eslint/types" "^8.39.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz#5a0efcb5c9cf6e4121b58f87972f567c69529226" - integrity sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ== +"@typescript-eslint/scope-manager@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz#ba4bf6d8257bbc172c298febf16bc22df4856570" + integrity sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A== dependencies: - "@typescript-eslint/types" "8.38.0" - "@typescript-eslint/visitor-keys" "8.38.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" "@typescript-eslint/scope-manager@8.6.0": version "8.6.0" @@ -6656,19 +6664,19 @@ "@typescript-eslint/types" "8.6.0" "@typescript-eslint/visitor-keys" "8.6.0" -"@typescript-eslint/tsconfig-utils@8.38.0", "@typescript-eslint/tsconfig-utils@^8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz#6de4ce224a779601a8df667db56527255c42c4d0" - integrity sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ== +"@typescript-eslint/tsconfig-utils@8.39.0", "@typescript-eslint/tsconfig-utils@^8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz#b2e87fef41a3067c570533b722f6af47be213f13" + integrity sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ== -"@typescript-eslint/type-utils@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz#a56cd84765fa6ec135fe252b5db61e304403a85b" - integrity sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg== +"@typescript-eslint/type-utils@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz#310ec781ae5e7bb0f5940bfd652573587f22786b" + integrity sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q== dependencies: - "@typescript-eslint/types" "8.38.0" - "@typescript-eslint/typescript-estree" "8.38.0" - "@typescript-eslint/utils" "8.38.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/typescript-estree" "8.39.0" + "@typescript-eslint/utils" "8.39.0" debug "^4.3.4" ts-api-utils "^2.1.0" @@ -6687,10 +6695,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.13.1.tgz#787db283bd0b58751094c90d5b58bbf5e9fc9bd8" integrity sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw== -"@typescript-eslint/types@8.38.0", "@typescript-eslint/types@^8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.38.0.tgz#297351c994976b93c82ac0f0e206c8143aa82529" - integrity sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw== +"@typescript-eslint/types@8.39.0", "@typescript-eslint/types@^8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.39.0.tgz#80f010b7169d434a91cd0529d70a528dbc9c99c6" + integrity sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg== "@typescript-eslint/types@8.6.0": version "8.6.0" @@ -6711,15 +6719,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz#82262199eb6778bba28a319e25ad05b1158957df" - integrity sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ== +"@typescript-eslint/typescript-estree@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz#b9477a5c47a0feceffe91adf553ad9a3cd4cb3d6" + integrity sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw== dependencies: - "@typescript-eslint/project-service" "8.38.0" - "@typescript-eslint/tsconfig-utils" "8.38.0" - "@typescript-eslint/types" "8.38.0" - "@typescript-eslint/visitor-keys" "8.38.0" + "@typescript-eslint/project-service" "8.39.0" + "@typescript-eslint/tsconfig-utils" "8.39.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -6741,15 +6749,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.38.0.tgz#5f10159899d30eb92ba70e642ca6f754bddbf15a" - integrity sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg== +"@typescript-eslint/utils@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.39.0.tgz#dfea42f3c7ec85f9f3e994ff0bba8f3b2f09e220" + integrity sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ== dependencies: "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.38.0" - "@typescript-eslint/types" "8.38.0" - "@typescript-eslint/typescript-estree" "8.38.0" + "@typescript-eslint/scope-manager" "8.39.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/typescript-estree" "8.39.0" "@typescript-eslint/utils@8.6.0", "@typescript-eslint/utils@^8.0.0": version "8.6.0" @@ -6769,12 +6777,12 @@ "@typescript-eslint/types" "7.13.1" eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@8.38.0": - version "8.38.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz#a9765a527b082cb8fc60fd8a16e47c7ad5b60ea5" - integrity sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g== +"@typescript-eslint/visitor-keys@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz#5d619a6e810cdd3fd1913632719cbccab08bf875" + integrity sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA== dependencies: - "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/types" "8.39.0" eslint-visitor-keys "^4.2.1" "@typescript-eslint/visitor-keys@8.6.0": @@ -7171,6 +7179,21 @@ "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" + integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== + +"@webpack-cli/info@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" + integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== + +"@webpack-cli/serve@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" + integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -8429,7 +8452,7 @@ colord@^2.9.3: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10, colorette@^2.0.20: +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -8459,6 +8482,11 @@ commander@11.1.0, commander@^11.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -9402,6 +9430,11 @@ env-paths@^2.2.0, env-paths@^2.2.1: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +envinfo@^7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== + environment@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" @@ -9657,19 +9690,19 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@^9.32.0: - version "9.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.32.0.tgz#4ea28df4a8dbc454e1251e0f3aed4bcf4ce50a47" - integrity sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg== +eslint@^9.33.0: + version "9.33.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.33.0.tgz#cc186b3d9eb0e914539953d6a178a5b413997b73" + integrity sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.12.1" "@eslint/config-array" "^0.21.0" - "@eslint/config-helpers" "^0.3.0" - "@eslint/core" "^0.15.0" + "@eslint/config-helpers" "^0.3.1" + "@eslint/core" "^0.15.2" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.32.0" - "@eslint/plugin-kit" "^0.3.4" + "@eslint/js" "9.33.0" + "@eslint/plugin-kit" "^0.3.5" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" @@ -10073,6 +10106,11 @@ fast-xml-parser@^4.4.1: dependencies: strnum "^1.0.5" +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -10738,6 +10776,18 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== +handlebars@^4.7.8: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" @@ -11117,7 +11167,7 @@ import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.2.0: +import-local@^3.0.2, import-local@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== @@ -11168,6 +11218,11 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + io-ts@^2.2.20: version "2.2.21" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.21.tgz#4ef754176f7082a1099d04c7d5c4ea53267c530a" @@ -12140,7 +12195,7 @@ jest-util@30.0.2, jest-util@^30.0.2: graceful-fs "^4.2.11" picomatch "^4.0.2" -jest-util@30.0.5, jest-util@^30.0.0: +jest-util@30.0.5, jest-util@^30.0.0, jest-util@^30.0.5: version "30.0.5" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.0.5.tgz#035d380c660ad5f1748dff71c4105338e05f8669" integrity sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g== @@ -13257,7 +13312,7 @@ minimatch@^9.0.0, minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.6: +minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -13498,10 +13553,10 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -ngx-cookie-service@^20.0.1: - version "20.0.1" - resolved "https://registry.yarnpkg.com/ngx-cookie-service/-/ngx-cookie-service-20.0.1.tgz#5860d334619a85b2433333de291e71dbd4a40825" - integrity sha512-XTPrW/5ihI3DvTljDj14E501fouHdiONCnd1SPhvqyHNHjvKECFWuTzOpcHrWl9X1ZOKfOG/uXW8G8fINcL9fQ== +ngx-cookie-service@^20.1.0: + version "20.1.0" + resolved "https://registry.yarnpkg.com/ngx-cookie-service/-/ngx-cookie-service-20.1.0.tgz#af77ad3c7c73ce4f83e8e1131c4e3c3632831809" + integrity sha512-g7Ddq8097qujmJfoEK27H12KLEpuO4SBPhoOYQ2kmLMSvz65vRrSKVwzOxdc75cFLQPW45Jfyyg3LoMTjKW0uA== dependencies: tslib "^2.8.0" @@ -13760,10 +13815,10 @@ nwsapi@^2.2.16: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.20.tgz#22e53253c61e7b0e7e93cef42c891154bcca11ef" integrity sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA== -nx@21.3.10: - version "21.3.10" - resolved "https://registry.yarnpkg.com/nx/-/nx-21.3.10.tgz#0f740efdc78ea3821e8a75c1170f0524eecce25f" - integrity sha512-am85Vntk1UQVzGjFltNzrb9b7Lhz8nPDRXkC0BJXBoG6w0T9Qf8k/3bwbo8nzZgREdVIUFO5dvOZ6gWUZw/UFA== +nx@21.3.11: + version "21.3.11" + resolved "https://registry.yarnpkg.com/nx/-/nx-21.3.11.tgz#84abf2c24eb7a134d8c6c2d83e3ba1ff367de04d" + integrity sha512-nj2snZ3mHZnbHcoB3NUdxbch9L1sQKV1XccLs1B79fmI/N5oOgWgctm/bWoZH2UH5b4A8ZLAMTsC6YnSJGbcaw== dependencies: "@napi-rs/wasm-runtime" "0.2.4" "@yarnpkg/lockfile" "^1.1.0" @@ -13801,16 +13856,16 @@ nx@21.3.10: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "21.3.10" - "@nx/nx-darwin-x64" "21.3.10" - "@nx/nx-freebsd-x64" "21.3.10" - "@nx/nx-linux-arm-gnueabihf" "21.3.10" - "@nx/nx-linux-arm64-gnu" "21.3.10" - "@nx/nx-linux-arm64-musl" "21.3.10" - "@nx/nx-linux-x64-gnu" "21.3.10" - "@nx/nx-linux-x64-musl" "21.3.10" - "@nx/nx-win32-arm64-msvc" "21.3.10" - "@nx/nx-win32-x64-msvc" "21.3.10" + "@nx/nx-darwin-arm64" "21.3.11" + "@nx/nx-darwin-x64" "21.3.11" + "@nx/nx-freebsd-x64" "21.3.11" + "@nx/nx-linux-arm-gnueabihf" "21.3.11" + "@nx/nx-linux-arm64-gnu" "21.3.11" + "@nx/nx-linux-arm64-musl" "21.3.11" + "@nx/nx-linux-x64-gnu" "21.3.11" + "@nx/nx-linux-x64-musl" "21.3.11" + "@nx/nx-win32-arm64-msvc" "21.3.11" + "@nx/nx-win32-x64-msvc" "21.3.11" nypm@^0.6.0: version "0.6.1" @@ -14417,17 +14472,17 @@ pkg-types@^2.2.0: exsolve "^1.0.7" pathe "^2.0.3" -playwright-core@1.54.1: - version "1.54.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.54.1.tgz#d32edcce048c9d83ceac31e294a7b60ef586960b" - integrity sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA== +playwright-core@1.54.2: + version "1.54.2" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.54.2.tgz#73cc5106f19ec6b9371908603d61a7f171ebd8f0" + integrity sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA== -playwright@1.54.1: - version "1.54.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.54.1.tgz#128d66a8d5182b5330e6440be3a72ca313362788" - integrity sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g== +playwright@1.54.2: + version "1.54.2" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.54.2.tgz#e2435abb2db3a96a276f8acc3ada1a85b587dff3" + integrity sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw== dependencies: - playwright-core "1.54.1" + playwright-core "1.54.2" optionalDependencies: fsevents "2.3.2" @@ -15043,6 +15098,13 @@ readdirp@^4.0.1: resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + reflect-metadata@^0.2.0, reflect-metadata@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" @@ -15198,7 +15260,7 @@ resolve.exports@2.0.3: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== -resolve@1.22.10, resolve@^1.19.0: +resolve@1.22.10, resolve@^1.19.0, resolve@^1.20.0: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -16034,7 +16096,7 @@ source-map-support@0.5.21, source-map-support@^0.5.21, source-map-support@^0.5.5 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.6.1, source-map@^0.6.0, source-map@~0.6.0: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -16665,6 +16727,21 @@ ts-jest@^29.4.0: type-fest "^4.41.0" yargs-parser "^21.1.1" +ts-jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.1.tgz#42d33beb74657751d315efb9a871fe99e3b9b519" + integrity sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw== + dependencies: + bs-logger "^0.2.6" + fast-json-stable-stringify "^2.1.0" + handlebars "^4.7.8" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.7.2" + type-fest "^4.41.0" + yargs-parser "^21.1.1" + ts-loader@^9.3.1: version "9.5.1" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" @@ -16810,6 +16887,11 @@ typescript@5.8.3, typescript@~5.8.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + uid2@0.0.x: version "0.0.4" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44" @@ -16842,10 +16924,10 @@ undici-types@~6.19.8: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -undici-types@~7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294" - integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== +undici-types@~7.10.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" + integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" @@ -17152,6 +17234,25 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +webpack-cli@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" + integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== + dependencies: + "@discoveryjs/json-ext" "^0.6.1" + "@webpack-cli/configtest" "^3.0.1" + "@webpack-cli/info" "^3.0.1" + "@webpack-cli/serve" "^3.0.1" + colorette "^2.0.14" + commander "^12.1.0" + cross-spawn "^7.0.3" + envinfo "^7.14.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^6.0.1" + webpack-dev-middleware@7.4.2, webpack-dev-middleware@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz#40e265a3d3d26795585cff8207630d3a8ff05877" @@ -17265,7 +17366,7 @@ webpack-dev-server@^5.2.1: webpack-dev-middleware "^7.4.2" ws "^8.18.0" -webpack-merge@6.0.1: +webpack-merge@6.0.1, webpack-merge@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== @@ -17476,6 +17577,11 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"