diff --git a/apps/server-nestjs/package.json b/apps/server-nestjs/package.json index 88341c98c3..ba2ed3fcf9 100644 --- a/apps/server-nestjs/package.json +++ b/apps/server-nestjs/package.json @@ -28,6 +28,8 @@ "test:debug": "vitest --inspect" }, "dependencies": { + "@casl/ability": "^6.8.0", + "@casl/prisma": "^1.6.1", "@cpn-console/argocd-plugin": "workspace:^", "@cpn-console/gitlab-plugin": "workspace:^", "@cpn-console/harbor-plugin": "workspace:^", @@ -45,9 +47,11 @@ "@gitbeaker/core": "^40.6.0", "@gitbeaker/rest": "^40.6.0", "@kubernetes-models/argo-cd": "^2.7.2", + "@nestjs/cache-manager": "^3.1.0", "@nestjs/common": "^11.1.16", "@nestjs/config": "^4.0.3", "@nestjs/core": "^11.1.16", + "@nestjs/jwt": "^11.0.2", "@nestjs/platform-express": "^11.1.16", "@nestjs/terminus": "^11.1.1", "@opentelemetry/api": "^1.9.0", @@ -64,6 +68,7 @@ "@ts-rest/fastify": "^3.52.1", "@ts-rest/open-api": "^3.52.1", "axios": "^1.13.6", + "cache-manager": "^7.2.8", "class-transformer": "^0.5.1", "class-validator": "^0.14.4", "date-fns": "^4.1.0", @@ -71,14 +76,17 @@ "fastify": "^4.29.1", "fastify-keycloak-adapter": "2.3.2", "json-2-csv": "^5.5.10", + "keycloak-connect": "^26.1.1", "mustache": "^4.2.0", + "nest-keycloak-connect": "2.0.0-alpha.2", "nestjs-pino": "^4.6.0", "pino-http": "^11.0.0", "prisma": "^6.19.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2", "undici": "^7.24.0", - "vitest-mock-extended": "^2.0.2" + "vitest-mock-extended": "^2.0.2", + "zod": "^3.25.76" }, "devDependencies": { "@cpn-console/eslint-config": "workspace:^", diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/health/health.controller.ts b/apps/server-nestjs/src/cpin-module/infrastructure/health/health.controller.ts new file mode 100644 index 0000000000..763cc63543 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/health/health.controller.ts @@ -0,0 +1,19 @@ +import { Controller, Get, Inject } from '@nestjs/common' +import { HealthCheck, HealthCheckService } from '@nestjs/terminus' +import { DatabaseHealthService } from '../database/database-health.service' + +@Controller('/api/v1/health') +export class HealthController { + constructor( + @Inject(HealthCheckService) private readonly health: HealthCheckService, + @Inject(DatabaseHealthService) private readonly database: DatabaseHealthService, + ) {} + + @Get() + @HealthCheck() + check() { + return this.health.check([ + () => this.database.check('database'), + ]) + } +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/auth.service.spec.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/auth.service.spec.ts new file mode 100644 index 0000000000..fda6b3e565 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/auth.service.spec.ts @@ -0,0 +1,133 @@ +import type { TestingModule } from '@nestjs/testing' +import type { Mock } from 'vitest' +import { CACHE_MANAGER } from '@nestjs/cache-manager' +import { JwtService } from '@nestjs/jwt' +import { Test } from '@nestjs/testing' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { ConfigurationService } from '../configuration/configuration.service' +import { AuthService } from './auth.service' + +vi.mock('node:crypto', async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + createPublicKey: vi.fn().mockReturnValue({ + export: vi.fn().mockReturnValue('mocked-pem'), + }), + } +}) + +describe('authService', () => { + let service: AuthService + let cacheManager: { get: Mock, set: Mock } + let jwtService: { decode: Mock, verifyAsync: Mock } + let configService: { keycloakClientId: string } + + const mockJwks = { + keys: [ + { + kty: 'RSA', + kid: 'test-kid', + use: 'sig', + n: 'test-n-base64', // normally a valid base64url string, but z.string() just checks if it's a string + e: 'AQAB', + }, + ], + } + + const mockJwt = { + header: { kid: 'test-kid' }, + payload: { iss: 'http://test-issuer' }, + } + + const mockPayload = { + sub: 'user-id', + iss: 'http://test-issuer', + aud: 'test-client', + } + + beforeEach(async () => { + cacheManager = { get: vi.fn(), set: vi.fn() } + jwtService = { decode: vi.fn(), verifyAsync: vi.fn() } + configService = { keycloakClientId: 'test-client' } + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + AuthService, + { provide: CACHE_MANAGER, useValue: cacheManager }, + { provide: JwtService, useValue: jwtService }, + { provide: ConfigurationService, useValue: configService }, + ], + }).compile() + + service = module.get(AuthService) + + // Mock global fetch + globalThis.fetch = vi.fn() + }) + + afterEach(() => { + vi.resetAllMocks() + }) + + it('should be defined', () => { + expect(service).toBeDefined() + }) + + describe('verifyToken', () => { + it('should return null if token decode fails', async () => { + jwtService.decode.mockReturnValue(null) + const result = await service.verifyToken('invalid-token') + expect(result).toBeNull() + }) + + it('should return null if kid is missing in jwks', async () => { + jwtService.decode.mockReturnValue(mockJwt) + cacheManager.get.mockResolvedValue({ keys: [] }) + + const result = await service.verifyToken('valid-token') + expect(result).toBeNull() + }) + + it('should fetch JWKS and cache it if not in cache', async () => { + jwtService.decode.mockReturnValue(mockJwt) + cacheManager.get.mockResolvedValue(null) + ;(globalThis.fetch as Mock).mockResolvedValue({ + ok: true, + json: vi.fn().mockResolvedValue(mockJwks), + headers: { get: vi.fn().mockReturnValue('max-age=3600') }, + }) + jwtService.verifyAsync.mockResolvedValue(mockPayload) + + const result = await service.verifyToken('valid-token') + + expect(globalThis.fetch).toHaveBeenCalledWith('http://test-issuer/protocol/openid-connect/certs', expect.any(Object)) + expect(cacheManager.set).toHaveBeenCalledWith('jwks:http://test-issuer', mockJwks, 3600000) + expect(jwtService.verifyAsync).toHaveBeenCalledWith('valid-token', { + publicKey: 'mocked-pem', + issuer: 'http://test-issuer', + audience: 'test-client', + algorithms: ['RS256'], + }) + expect(result).toEqual(mockPayload) + }) + + it('should return null if verifyAsync throws', async () => { + jwtService.decode.mockReturnValue(mockJwt) + cacheManager.get.mockResolvedValue(mockJwks) + jwtService.verifyAsync.mockRejectedValue(new Error('verify failed')) + + const result = await service.verifyToken('valid-token') + expect(result).toBeNull() + }) + + it('should return null if verified payload fails zod schema', async () => { + jwtService.decode.mockReturnValue(mockJwt) + cacheManager.get.mockResolvedValue(mockJwks) + jwtService.verifyAsync.mockResolvedValue({ invalid: 'payload', sub: 123 }) // sub should be string + + const result = await service.verifyToken('valid-token') + expect(result).toBeNull() + }) + }) +}) diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/auth.service.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/auth.service.ts new file mode 100644 index 0000000000..bc143b2c41 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/auth.service.ts @@ -0,0 +1,141 @@ +import type { Cache } from '@nestjs/cache-manager' +import { createPublicKey } from 'node:crypto' +import { CACHE_MANAGER } from '@nestjs/cache-manager' +import { Inject, Injectable } from '@nestjs/common' +import { JwtService } from '@nestjs/jwt' +import { z } from 'zod' +import { ConfigurationService } from '../configuration/configuration.service' + +export const API_USER = Symbol('API_USER') + +const jwkSchema = z.object({ + kid: z.string(), + kty: z.string(), + use: z.string().optional(), + alg: z.string().optional(), + n: z.string().optional(), + e: z.string().optional(), + x5c: z.array(z.string()).optional(), +}).passthrough() + +const rsaJwkSchema = jwkSchema.extend({ + kty: z.literal('RSA'), + n: z.string(), + e: z.string(), +}) + +const jwksSchema = z.object({ + keys: z.array(jwkSchema), +}) + +export type Jwks = z.infer + +const verifiedJwtPayloadSchema = z.record(z.unknown()).and(z.object({ + sub: z.string().optional(), + exp: z.number().optional(), + iat: z.number().optional(), + jti: z.string().optional(), + iss: z.string().optional(), + aud: z.union([z.string(), z.array(z.string())]).optional(), +})) + +export type VerifiedJwtPayload = z.infer + +const maxAgeRegex = /max-age=(\d+)/ + +const jwtSchema = z.object({ + header: z.object({ kid: z.string() }).passthrough(), + payload: z.object({ iss: z.string() }).passthrough(), +}).passthrough() + +export type Jwt = z.infer + +@Injectable() +export class AuthService { + constructor( + @Inject(ConfigurationService) private readonly config: ConfigurationService, + @Inject(CACHE_MANAGER) private readonly cache: Cache, + @Inject(JwtService) private readonly jwt: JwtService, + ) {} + + private async getJwksWithCache(issuer: string) { + return await this.getJwksFromCache(issuer) ?? await this.getJwks(issuer) + } + + private async getJwks(issuer: string): Promise { + const response = await fetch(`${issuer}/protocol/openid-connect/certs`, { + headers: { accept: 'application/json' }, + }) + + if (!response.ok) + throw new Error(`JWKS fetch failed: ${response.status}`) + + const jwks = jwksSchema.parse(await response.json()) + const cacheControl = response.headers.get('cache-control') ?? '' + const match = cacheControl.match(maxAgeRegex) + const maxAgeMs = match?.[1] ? Number.parseInt(match[1], 10) * 1000 : 60_000 + await this.setJwksInCache(issuer, jwks, maxAgeMs) + return jwks + } + + private async getJwksFromCache(issuer: string): Promise { + const cached = await this.cache.get(generateJwksCacheKey(issuer)) + const parsed = jwksSchema.safeParse(cached) + return parsed.success ? parsed.data : undefined + } + + private async setJwksInCache(issuer: string, jwks: Jwks, maxAgeMs: number) { + await this.cache.set(generateJwksCacheKey(issuer), jwks, maxAgeMs) + } + + private async getPublicKey(jwt: Jwt) { + const { keys } = await this.getJwksWithCache(jwt.payload.iss) + const candidateKey = keys.find(k => k.kid === jwt.header.kid) + const parsed = rsaJwkSchema.safeParse(candidateKey) + if (!parsed.success) { + console.log('rsaJwkSchema parsing failed:', parsed.error) + return null + } + return createPublicKey({ key: parsed.data, format: 'jwk' }) + } + + private decode(token: string): Jwt | null { + const decoded = this.jwt.decode(token, { complete: true }) + const parsed = jwtSchema.safeParse(decoded) + return parsed.success ? parsed.data : null + } + + async verifyToken(token: string): Promise { + try { + const jwt = this.decode(token) + if (!jwt) { + console.log('decode returned null') + return null + } + + const publicKey = await this.getPublicKey(jwt) + if (!publicKey) { + console.log('getPublicKey returned null') + return null + } + + console.log('calling verifyAsync') + const payload = await this.jwt.verifyAsync>(token, { + publicKey: publicKey.export({ format: 'pem', type: 'spki' }).toString(), + issuer: jwt.payload.iss, + audience: this.config.keycloakClientId, + algorithms: ['RS256'], + }) + + const parsed = verifiedJwtPayloadSchema.safeParse(payload) + return parsed.success ? parsed.data : null + } catch (e) { + console.log('verifyToken failed:', e) + return null + } + } +} + +function generateJwksCacheKey(issuer: string) { + return `jwks:${issuer}` +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/ability.guard.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/ability.guard.ts new file mode 100644 index 0000000000..39cfecaf9c --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/ability.guard.ts @@ -0,0 +1,15 @@ +import type { CanActivate, ExecutionContext } from '@nestjs/common' +import type { Request } from 'express' +import type { AppAbility, AppAction, AppSubject } from '../middleware/ability.middleware' + +export class AbilityGuard implements CanActivate { + constructor( + private readonly action: AppAction, + private readonly subject: AppSubject, + ) {} + + canActivate(context: ExecutionContext): boolean { + const req = context.switchToHttp().getRequest() + return req.ability?.can(this.action, this.subject) ?? false + } +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/auth.guard.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/auth.guard.ts new file mode 100644 index 0000000000..252321f1e0 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/auth.guard.ts @@ -0,0 +1,37 @@ +import type { CanActivate, ExecutionContext } from '@nestjs/common' +import type { Request } from 'express' +import type { VerifiedJwtPayload } from '../auth.service' +import { tokenHeaderName } from '@cpn-console/shared' +import { Inject, Injectable } from '@nestjs/common' +import { AuthService } from '../auth.service' + +export interface RequestUser { + user?: VerifiedJwtPayload | null +} + +@Injectable() +export class AuthGuard implements CanActivate { + constructor( + @Inject(AuthService) private readonly authService: AuthService, + ) {} + + async canActivate(context: ExecutionContext): Promise { + if (context.getType() !== 'http') + return true + + const request = context.switchToHttp().getRequest() + if (request.user) + return true + + const token = request.headers[tokenHeaderName] + if (typeof token !== 'string') + return false + + const payload = await this.authService.verifyToken(token) + if (!payload) + return false + request.user = payload + + return true + } +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/role.guard.spec.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/role.guard.spec.ts new file mode 100644 index 0000000000..ca59e23d47 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/role.guard.spec.ts @@ -0,0 +1,111 @@ +import type { ExecutionContext } from '@nestjs/common' +import type { TestingModule } from '@nestjs/testing' +import type { Mock } from 'vitest' +import { ADMIN_PERMS } from '@cpn-console/shared' +import { Test } from '@nestjs/testing' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { PrismaService } from '../../database/prisma.service' +import { RoleGuard } from './role.guard' + +describe('roleGuard', () => { + let guard: RoleGuard + let prismaService: { adminRole: { findMany: Mock } } + + beforeEach(async () => { + prismaService = { + adminRole: { + findMany: vi.fn(), + }, + } + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + RoleGuard, + { provide: PrismaService, useValue: prismaService }, + ], + }).compile() + + guard = module.get(RoleGuard) + }) + + afterEach(() => { + vi.resetAllMocks() + }) + + it('should return true and not set ability if context is not http', async () => { + const context = { + getType: vi.fn().mockReturnValue('rpc'), + } as unknown as ExecutionContext + + const result = await guard.canActivate(context) + + expect(result).toBe(true) + expect(context.getType).toHaveBeenCalled() + }) + + it('should return true and not set ability if user has no groups', async () => { + const request = { user: {} } + const context = { + getType: vi.fn().mockReturnValue('http'), + switchToHttp: vi.fn().mockReturnValue({ + getRequest: vi.fn().mockReturnValue(request), + }), + } as unknown as ExecutionContext + + const result = await guard.canActivate(context) + + expect(result).toBe(true) + expect((request as any).ability).toBeUndefined() + }) + + it('should assign manage:all ability for admin users', async () => { + const request: any = { user: { groups: ['admin-group'] } } + const context = { + getType: vi.fn().mockReturnValue('http'), + switchToHttp: vi.fn().mockReturnValue({ + getRequest: vi.fn().mockReturnValue(request), + }), + } as unknown as ExecutionContext + + prismaService.adminRole.findMany.mockResolvedValue([ + { permissions: ADMIN_PERMS.MANAGE.toString() }, + ]) + + const result = await guard.canActivate(context) + + expect(result).toBe(true) + expect(prismaService.adminRole.findMany).toHaveBeenCalledWith({ + where: { oidcGroup: { in: ['admin-group'] } }, + select: { permissions: true }, + }) + expect(request.ability).toBeDefined() + expect(request.ability.can('manage', 'all')).toBe(true) + }) + + it('should aggregate permissions and map correctly', async () => { + const request: any = { user: { groups: ['group-1', 'group-2'] } } + const context = { + getType: vi.fn().mockReturnValue('http'), + switchToHttp: vi.fn().mockReturnValue({ + getRequest: vi.fn().mockReturnValue(request), + }), + } as unknown as ExecutionContext + + // Mock two roles with different permissions + const perm1 = ADMIN_PERMS.LIST_USERS + const perm2 = ADMIN_PERMS.MANAGE_PROJECTS + prismaService.adminRole.findMany.mockResolvedValue([ + { permissions: perm1.toString() }, + { permissions: perm2.toString() }, + ]) + + const result = await guard.canActivate(context) + + expect(result).toBe(true) + expect(request.ability.can('read', 'AdminUser')).toBe(true) + expect(request.ability.can('manage', 'AdminProject')).toBe(true) + // Should not have manage all or manage users + expect(request.ability.can('manage', 'all')).toBe(false) + expect(request.ability.can('manage', 'AdminUser')).toBe(false) + }) +}) diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/role.guard.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/role.guard.ts new file mode 100644 index 0000000000..dac63d1e84 --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/guards/role.guard.ts @@ -0,0 +1,101 @@ +import type { PureAbility } from '@casl/ability' +import type { PrismaQuery } from '@casl/prisma' +import type { CanActivate, ExecutionContext } from '@nestjs/common' +import type { Request } from 'express' +import type { RequestUser } from './auth.guard' +import { AbilityBuilder } from '@casl/ability' +import { createPrismaAbility } from '@casl/prisma' +import { AdminAuthorized } from '@cpn-console/shared' +import { Inject, Injectable } from '@nestjs/common' +import { z } from 'zod' +import { PrismaService } from '../../database/prisma.service' + +export type AppAction + = 'manage' + | 'create' + | 'read' + | 'update' + | 'delete' + | 'replay' + +export type AppSubject + = 'all' + | 'AdminUser' + | 'AdminProject' + | 'AdminRole' + | 'AdminToken' + | 'Cluster' + | 'Environment' + | 'Hook' + | 'Project' + | 'ProjectMember' + | 'ProjectRole' + | 'Repository' + | 'Secret' + | 'Stage' + | 'SystemSetting' + | 'Zone' + +export type AppAbility = PureAbility<[AppAction, AppSubject], PrismaQuery> + +const userGroupsSchema = z.object({ groups: z.array(z.string()) }).passthrough() + +interface RequestAbility { + ability?: AppAbility +} + +@Injectable() +export class RoleGuard implements CanActivate { + constructor( + @Inject(PrismaService) private readonly prisma: PrismaService, + ) {} + + async canActivate(context: ExecutionContext): Promise { + if (context.getType() !== 'http') + return true + + const request = context.switchToHttp().getRequest() + + const parsed = userGroupsSchema.safeParse(request.user) + if (!parsed.success) + return true + + const perms = await this.getPermissions(parsed.data.groups) + request.ability = createAbility(perms) + + return true + } + + private async getPermissions(groups: string[]) { + const roles = await this.prisma.adminRole.findMany({ + where: { oidcGroup: { in: groups } }, + select: { permissions: true }, + }) + return roles.reduce((acc, r) => acc | BigInt(r.permissions), 0n) + } +} + +function createAbility(perms: bigint | string | null): AppAbility { + const { can, build } = new AbilityBuilder(createPrismaAbility) + if (AdminAuthorized.Manage(perms)) { + can('manage', 'all') + return build() + } + if (AdminAuthorized.ManageUsers(perms)) can('manage', 'AdminUser') + if (AdminAuthorized.ListUsers(perms)) can('read', 'AdminUser') + if (AdminAuthorized.ManageProjects(perms)) can('manage', 'AdminProject') + if (AdminAuthorized.ListProjects(perms)) can('read', 'AdminProject') + if (AdminAuthorized.ManageRoles(perms)) can('manage', 'AdminRole') + if (AdminAuthorized.ListRoles(perms)) can('read', 'AdminRole') + if (AdminAuthorized.ManageClusters(perms)) can('manage', 'Cluster') + if (AdminAuthorized.ListClusters(perms)) can('read', 'Cluster') + if (AdminAuthorized.ManageZones(perms)) can('manage', 'Zone') + if (AdminAuthorized.ListZones(perms)) can('read', 'Zone') + if (AdminAuthorized.ManageStages(perms)) can('manage', 'Stage') + if (AdminAuthorized.ListStages(perms)) can('read', 'Stage') + if (AdminAuthorized.ManageAdminToken(perms)) can('manage', 'AdminToken') + if (AdminAuthorized.ListAdminToken(perms)) can('read', 'AdminToken') + if (AdminAuthorized.ManageSystem(perms)) can('manage', 'SystemSetting') + if (AdminAuthorized.ListSystem(perms)) can('read', 'SystemSetting') + return build() +} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/iam/iam.module.ts b/apps/server-nestjs/src/cpin-module/infrastructure/iam/iam.module.ts new file mode 100644 index 0000000000..604c11fbad --- /dev/null +++ b/apps/server-nestjs/src/cpin-module/infrastructure/iam/iam.module.ts @@ -0,0 +1,32 @@ +import { CacheModule } from '@nestjs/cache-manager' +import { Module } from '@nestjs/common' +import { APP_GUARD } from '@nestjs/core' +import { JwtModule } from '@nestjs/jwt' +import { ConfigurationModule } from '../configuration/configuration.module' +import { DatabaseModule } from '../database/database.module' +import { AuthService } from './auth.service' +import { AbilityGuard } from './guards/ability.guard' +import { AuthGuard } from './guards/auth.guard' +import { RoleGuard } from './guards/role.guard' + +@Module({ + imports: [ + ConfigurationModule, + CacheModule.register({}), + DatabaseModule, + JwtModule.register({}), + ], + providers: [ + AbilityGuard, + AuthService, + { + provide: APP_GUARD, + useClass: AuthGuard, + }, + { + provide: APP_GUARD, + useClass: RoleGuard, + }, + ], +}) +export class IamModule {} diff --git a/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts b/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts index 833f953a68..d75abe3ec9 100644 --- a/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts +++ b/apps/server-nestjs/src/cpin-module/infrastructure/infrastructure.module.ts @@ -3,13 +3,14 @@ import { Module } from '@nestjs/common' import { ConfigurationModule } from './configuration/configuration.module' import { DatabaseModule } from './database/database.module' import { HttpClientService } from './http-client/http-client.service' +import { IamModule } from './iam/iam.module' import { LoggerModule } from './logger/logger.module' import { ServerService } from './server/server.service' import { TelemetryModule } from './telemetry/telemetry.module' @Module({ providers: [HttpClientService, ServerService], - imports: [DatabaseModule, LoggerModule, ConfigurationModule, TelemetryModule], + imports: [DatabaseModule, LoggerModule, ConfigurationModule, TelemetryModule, IamModule], exports: [DatabaseModule, HttpClientService, ServerService], }) export class InfrastructureModule {} diff --git a/apps/server-nestjs/src/modules/system-settings/system-settings.controller.ts b/apps/server-nestjs/src/modules/system-settings/system-settings.controller.ts index 0385aa7652..8d6b36b549 100644 --- a/apps/server-nestjs/src/modules/system-settings/system-settings.controller.ts +++ b/apps/server-nestjs/src/modules/system-settings/system-settings.controller.ts @@ -1,6 +1,9 @@ import type { ListSystemSettingsQueryDto } from './dto/list-system-settings-query.dto' import type { SystemSettingDto } from './dto/system-setting.dto' -import { Body, Controller, Get, Inject, Param, Put, Query } from '@nestjs/common' +import { Body, Controller, Get, Inject, Param, Put, Query, UseGuards } from '@nestjs/common' +import { AbilityGuard } from '../../cpin-module/infrastructure/iam/guards/ability.guard' +import { AuthGuard } from '../../cpin-module/infrastructure/iam/guards/auth.guard' +import { RoleGuard } from '../../cpin-module/infrastructure/iam/guards/role.guard' import { SystemSettingsService } from './system-settings.service' @Controller('api/v1/system/settings') @@ -8,6 +11,7 @@ export class SystemSettingsController { constructor(@Inject(SystemSettingsService) private readonly service: SystemSettingsService) {} @Get() + @UseGuards(AuthGuard, RoleGuard, new AbilityGuard('read', 'SystemSetting')) async list( @Query() query: ListSystemSettingsQueryDto, ) { @@ -15,6 +19,7 @@ export class SystemSettingsController { } @Put(':key') + @UseGuards(AuthGuard, RoleGuard, new AbilityGuard('manage', 'SystemSetting')) async upsert( @Param('key') key: string, @Body() body: SystemSettingDto, diff --git a/apps/server-nestjs/src/modules/system-settings/system-settings.module.ts b/apps/server-nestjs/src/modules/system-settings/system-settings.module.ts index 3209b109e2..248b1cf18c 100644 --- a/apps/server-nestjs/src/modules/system-settings/system-settings.module.ts +++ b/apps/server-nestjs/src/modules/system-settings/system-settings.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common' +import { PrismaService } from '../../cpin-module/infrastructure/database/prisma.service' import { InfrastructureModule } from '../../cpin-module/infrastructure/infrastructure.module' import { SystemSettingsController } from './system-settings.controller' import { SystemSettingsService } from './system-settings.service' @@ -6,7 +7,7 @@ import { SystemSettingsService } from './system-settings.service' @Module({ imports: [InfrastructureModule], controllers: [SystemSettingsController], - providers: [SystemSettingsService], + providers: [PrismaService, SystemSettingsService], exports: [SystemSettingsService], }) export class SystemSettingsModule {} diff --git a/apps/server-nestjs/src/prisma/schema/admin.prisma b/apps/server-nestjs/src/prisma/schema/admin.prisma index 71cfb1754a..c4ca38ccb1 100644 --- a/apps/server-nestjs/src/prisma/schema/admin.prisma +++ b/apps/server-nestjs/src/prisma/schema/admin.prisma @@ -12,6 +12,7 @@ model AdminRole { permissions BigInt position Int @db.SmallInt oidcGroup String @default("") + type String @default("managed") } model SystemSetting { diff --git a/apps/server-nestjs/src/prisma/schema/project.prisma b/apps/server-nestjs/src/prisma/schema/project.prisma index e760486759..d45ccf451e 100644 --- a/apps/server-nestjs/src/prisma/schema/project.prisma +++ b/apps/server-nestjs/src/prisma/schema/project.prisma @@ -5,6 +5,7 @@ model Environment { memory Float @db.Real cpu Float @db.Real gpu Float @db.Real + autosync Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt clusterId String @db.Uuid @@ -65,6 +66,8 @@ model ProjectRole { permissions BigInt projectId String @db.Uuid position Int @db.SmallInt + oidcGroup String @default("") + type String @default("managed") project Project @relation(fields: [projectId], references: [id]) } diff --git a/apps/server-nestjs/test/system-settings.e2e-spec.ts b/apps/server-nestjs/test/system-settings.e2e-spec.ts index 6cfb8239ec..695f06a483 100644 --- a/apps/server-nestjs/test/system-settings.e2e-spec.ts +++ b/apps/server-nestjs/test/system-settings.e2e-spec.ts @@ -1,10 +1,16 @@ import type { INestApplication } from '@nestjs/common' +import { randomUUID } from 'node:crypto' +import { ADMIN_PERMS } from '@cpn-console/shared' import { faker } from '@faker-js/faker' +import { Cache, CACHE_MANAGER } from '@nestjs/cache-manager' import { ValidationPipe } from '@nestjs/common' +import { JwtService } from '@nestjs/jwt' import { Test } from '@nestjs/testing' import request from 'supertest' import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { ConfigurationService } from '../src/cpin-module/infrastructure/configuration/configuration.service' import { PrismaService } from '../src/cpin-module/infrastructure/database/prisma.service' +import { AuthService } from '../src/cpin-module/infrastructure/iam/auth.service' import { SystemSettingsModule } from '../src/modules/system-settings/system-settings.module' const canRunSystemSettingsE2E = Boolean(process.env.E2E) @@ -16,12 +22,14 @@ describeWithSystemSettings('systemSettingsController (e2e)', () => { let prisma: PrismaService const headerUserId = 'x-test-user-id' + let testAdminRoleId: string let testUserId: string let testSystemSettingKey: string beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [SystemSettingsModule], + providers: [AuthService, ConfigurationService, JwtService, { provide: CACHE_MANAGER, useValue: Cache }], }).compile() app = moduleRef.createNestApplication() @@ -31,9 +39,20 @@ describeWithSystemSettings('systemSettingsController (e2e)', () => { prisma = app.get(PrismaService) await prisma.$connect() + testAdminRoleId = faker.string.uuid() testUserId = faker.string.uuid() testSystemSettingKey = faker.lorem.slug() + await prisma.adminRole.create({ + data: { + id: testAdminRoleId, + name: faker.lorem.word(), + permissions: ADMIN_PERMS.LIST_SYSTEM | ADMIN_PERMS.MANAGE_SYSTEM, + position: 1, + oidcGroup: faker.lorem.slug(), + }, + }) + await prisma.user.create({ data: { id: testUserId, @@ -41,7 +60,7 @@ describeWithSystemSettings('systemSettingsController (e2e)', () => { lastName: faker.person.lastName(), email: faker.internet.email(), type: 'human', - adminRoleIds: [], + adminRoleIds: [testAdminRoleId], }, }) @@ -55,22 +74,27 @@ describeWithSystemSettings('systemSettingsController (e2e)', () => { afterAll(async () => { await prisma.systemSetting.deleteMany({ where: { key: testSystemSettingKey } }) await prisma.user.deleteMany({ where: { id: testUserId } }) + await prisma.adminRole.deleteMany({ where: { id: testAdminRoleId } }) await prisma.$disconnect() await app.close() }) - it('read', async () => { - const userId = faker.string.uuid() + it('allows read with ListSystem permission', async () => { + const role = await prisma.adminRole.create({ + data: { name: `e2e-${randomUUID()}`, permissions: ADMIN_PERMS.LIST_SYSTEM, position: 1, oidcGroup: '' }, + }) + const userId = randomUUID() await prisma.user.create({ data: { id: userId, firstName: 'Test', lastName: 'User', - email: `user-${userId}@test.local`, + email: `user-${randomUUID()}@test.local`, type: 'human', + adminRoleIds: [role.id], }, }) - const key = `e2e-system-setting-${faker.string.uuid()}` + const key = `e2e-system-setting-${randomUUID()}` await prisma.systemSetting.upsert({ where: { key }, create: { key, value: 'bar' }, @@ -87,21 +111,92 @@ describeWithSystemSettings('systemSettingsController (e2e)', () => { await prisma.systemSetting.delete({ where: { key } }) await prisma.user.delete({ where: { id: userId } }) + await prisma.adminRole.delete({ where: { id: role.id } }) }) - it('upserts', async () => { - const userId = faker.string.uuid() + it('rejects read without ListSystem permission', async () => { + const userId = randomUUID() await prisma.user.create({ data: { id: userId, firstName: 'Test', lastName: 'User', - email: `user-${userId}@test.local`, + email: `user-${randomUUID()}@test.local`, type: 'human', adminRoleIds: [], }, }) - const key = `e2e-system-setting-${faker.string.uuid()}` + await request(app.getHttpServer()) + .get('/api/v1/system/settings') + .set(headerUserId, userId) + .expect(403) + await prisma.user.delete({ where: { id: userId } }) + }) + + it('rejects invalid body on PUT', async () => { + const role = await prisma.adminRole.create({ + data: { name: `e2e-${randomUUID()}`, permissions: ADMIN_PERMS.MANAGE_SYSTEM, position: 1, oidcGroup: '' }, + }) + const userId = randomUUID() + await prisma.user.create({ + data: { + id: userId, + firstName: 'Test', + lastName: 'User', + email: `user-${randomUUID()}@test.local`, + type: 'human', + adminRoleIds: [role.id], + }, + }) + await request(app.getHttpServer()) + .put('/api/v1/system/settings/foo') + .set(headerUserId, userId) + .send({}) + .expect(400) + await prisma.user.delete({ where: { id: userId } }) + await prisma.adminRole.delete({ where: { id: role.id } }) + }) + + it('rejects PUT when missing ManageSystem permission', async () => { + const role = await prisma.adminRole.create({ + data: { name: `e2e-${randomUUID()}`, permissions: ADMIN_PERMS.LIST_SYSTEM, position: 1, oidcGroup: '' }, + }) + const userId = randomUUID() + await prisma.user.create({ + data: { + id: userId, + firstName: 'Test', + lastName: 'User', + email: `user-${randomUUID()}@test.local`, + type: 'human', + adminRoleIds: [role.id], + }, + }) + await request(app.getHttpServer()) + .put('/api/v1/system/settings/foo') + .set(headerUserId, userId) + .send({ value: 'bar' }) + .expect(403) + await prisma.user.delete({ where: { id: userId } }) + await prisma.adminRole.delete({ where: { id: role.id } }) + }) + + it('accepts valid body on PUT and upserts', async () => { + const role = await prisma.adminRole.create({ + data: { name: `e2e-${randomUUID()}`, permissions: ADMIN_PERMS.MANAGE_SYSTEM, position: 1, oidcGroup: '' }, + }) + const userId = randomUUID() + await prisma.user.create({ + data: { + id: userId, + firstName: 'Test', + lastName: 'User', + email: `user-${randomUUID()}@test.local`, + type: 'human', + adminRoleIds: [role.id], + }, + }) + const key = `e2e-system-setting-${randomUUID()}` await request(app.getHttpServer()) .put(`/api/v1/system/settings/${encodeURIComponent(key)}`) .set(headerUserId, userId) @@ -116,5 +211,6 @@ describeWithSystemSettings('systemSettingsController (e2e)', () => { await prisma.systemSetting.delete({ where: { key } }) await prisma.user.delete({ where: { id: userId } }) + await prisma.adminRole.delete({ where: { id: role.id } }) }) }) diff --git a/keycloak/realms/realm-dev.json b/keycloak/realms/realm-dev.json index 7aa2136e20..b5584c58e9 100644 --- a/keycloak/realms/realm-dev.json +++ b/keycloak/realms/realm-dev.json @@ -280,6 +280,21 @@ "authenticationFlowBindingOverrides": {}, "fullScopeAllowed": true, "nodeReRegistrationTimeout": -1, + "protocolMappers": [ + { + "id": "0fda49f8-69ab-4bef-b1e2-b0cfd6ae2b67", + "name": "audience-backend", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "consentRequired": false, + "config": { + "included.client.audience": "dso-console-backend", + "id.token.claim": "false", + "access.token.claim": "true", + "introspection.token.claim": "true" + } + } + ], "defaultClientScopes": [ "generic", "basic" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec155a0d21..725bb0261c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -193,6 +193,1092 @@ importers: specifier: ^7.4.0 version: 7.4.0 + apps/console.pr2036: + devDependencies: + '@commitlint/cli': + specifier: ^20.5.0 + version: 20.5.0(@types/node@24.12.0)(conventional-commits-parser@6.3.0)(typescript@5.9.3) + '@commitlint/config-conventional': + specifier: ^20.5.0 + version: 20.5.0 + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../packages/eslintconfig + eslint: + specifier: ^10.1.0 + version: 10.1.0(jiti@2.6.1) + husky: + specifier: ^9.1.7 + version: 9.1.7 + lint-staged: + specifier: ^16.4.0 + version: 16.4.0 + + apps/console.pr2036/apps/client: + dependencies: + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@gouvfr/dsfr': + specifier: ^1.14.4 + version: 1.14.4 + '@gouvminint/vue-dsfr': + specifier: ^8.15.0 + version: 8.15.0(patch_hash=2a91c61ecfb7ebf0740a546fa497ccba29f6fb1496f789a76b73b09cb710553f)(@iconify/vue@4.3.0(vue@3.5.30(typescript@5.9.3)))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + '@iconify-json/ri': + specifier: ^1.2.10 + version: 1.2.10 + '@iconify/vue': + specifier: ^4.3.0 + version: 4.3.0(vue@3.5.30(typescript@5.9.3)) + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@24.12.0)(zod@3.25.76) + '@types/js-yaml': + specifier: 4.0.9 + version: 4.0.9 + '@vue/tsconfig': + specifier: ^0.7.0 + version: 0.7.0(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) + axios: + specifier: ^1.13.6 + version: 1.13.6 + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + javascript-time-ago: + specifier: ^2.6.4 + version: 2.6.4 + js-yaml: + specifier: ^4.1.1 + version: 4.1.1 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + keycloak-js: + specifier: ^26.2.3 + version: 26.2.3 + nanoid: + specifier: 5.0.9 + version: 5.0.9 + p-debounce: + specifier: ^4.0.0 + version: 4.0.0 + pinia: + specifier: ^2.3.1 + version: 2.3.1(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) + vue: + specifier: ^3.5.30 + version: 3.5.30(typescript@5.9.3) + vue-router: + specifier: ^4.6.4 + version: 4.6.4(vue@3.5.30(typescript@5.9.3)) + vue3-json-viewer: + specifier: ^2.4.1 + version: 2.4.1(vue@3.5.30(typescript@5.9.3)) + xbytes: + specifier: ^1.9.1 + version: 1.9.1 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/test-utils': + specifier: workspace:^ + version: link:../../../../packages/test-utils + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + '@iconify/types': + specifier: ^2.0.0 + version: 2.0.0 + '@types/jsdom': + specifier: ^21.1.7 + version: 21.1.7 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@unocss/transformer-directives': + specifier: ^0.65.4 + version: 0.65.4 + '@vitejs/plugin-vue': + specifier: ^6.0.4 + version: 6.0.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + '@vue/eslint-config-typescript': + specifier: ^14.7.0 + version: 14.7.0(eslint-plugin-vue@10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + chalk: + specifier: ^5.6.2 + version: 5.6.2 + eslint-plugin-vue: + specifier: ^10.8.0 + version: 10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))) + jsdom: + specifier: ^25.0.1 + version: 25.0.1 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + stylelint: + specifier: ^17.4.0 + version: 17.4.0(typescript@5.9.3) + stylelint-config-html: + specifier: ^1.1.0 + version: 1.1.0(postcss-html@1.8.1)(stylelint@17.4.0(typescript@5.9.3)) + stylelint-config-recommended-vue: + specifier: ^1.6.1 + version: 1.6.1(postcss-html@1.8.1)(stylelint@17.4.0(typescript@5.9.3)) + stylelint-config-standard: + specifier: ^40.0.0 + version: 40.0.0(stylelint@17.4.0(typescript@5.9.3)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + unocss: + specifier: ^66.6.6 + version: 66.6.6(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + unplugin-auto-import: + specifier: ^0.18.6 + version: 0.18.6(rollup@4.59.0) + unplugin-vue-components: + specifier: ^0.27.5 + version: 0.27.5(@babel/parser@7.29.0)(rollup@4.59.0)(vue@3.5.30(typescript@5.9.3)) + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vite-node: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(terser@5.46.0) + vite-plugin-pwa: + specifier: ^1.2.0 + version: 1.2.0(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + vue-eslint-parser: + specifier: ^10.4.0 + version: 10.4.0(eslint@10.1.0(jiti@2.6.1)) + vue-tsc: + specifier: ^2.2.12 + version: 2.2.12(typescript@5.9.3) + workbox-window: + specifier: ^7.4.0 + version: 7.4.0 + + apps/console.pr2036/apps/server: + dependencies: + '@cpn-console/argocd-plugin': + specifier: workspace:^ + version: link:../../../../plugins/argocd + '@cpn-console/gitlab-plugin': + specifier: workspace:^ + version: link:../../../../plugins/gitlab + '@cpn-console/harbor-plugin': + specifier: workspace:^ + version: link:../../../../plugins/harbor + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/keycloak-plugin': + specifier: workspace:^ + version: link:../../../../plugins/keycloak + '@cpn-console/nexus-plugin': + specifier: workspace:^ + version: link:../../../../plugins/nexus + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@cpn-console/sonarqube-plugin': + specifier: workspace:^ + version: link:../../../../plugins/sonarqube + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + '@fastify/cookie': + specifier: ^9.4.0 + version: 9.4.0 + '@fastify/helmet': + specifier: ^11.1.1 + version: 11.1.1 + '@fastify/session': + specifier: ^10.9.0 + version: 10.9.0 + '@fastify/swagger': + specifier: ^8.15.0 + version: 8.15.0 + '@fastify/swagger-ui': + specifier: ^4.2.0 + version: 4.2.0 + '@gitbeaker/core': + specifier: ^40.6.0 + version: 40.6.0 + '@gitbeaker/rest': + specifier: ^40.6.0 + version: 40.6.0 + '@kubernetes-models/argo-cd': + specifier: ^2.7.2 + version: 2.7.2 + '@prisma/client': + specifier: ^6.19.2 + version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@24.12.0)(zod@4.3.6) + '@ts-rest/fastify': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6))(fastify@4.29.1)(zod@4.3.6) + '@ts-rest/open-api': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6))(zod@4.3.6) + axios: + specifier: ^1.13.6 + version: 1.13.6 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + fastify: + specifier: ^4.29.1 + version: 4.29.1 + fastify-keycloak-adapter: + specifier: 2.3.2 + version: 2.3.2(patch_hash=6846b953fc520dd1ca6cb2e790cf190cbc3ed9fa9ff69739100458c520293447) + json-2-csv: + specifier: ^5.5.10 + version: 5.5.10 + mustache: + specifier: ^4.2.0 + version: 4.2.0 + prisma: + specifier: ^6.19.2 + version: 6.19.2(magicast@0.3.5)(typescript@5.9.3) + undici: + specifier: ^7.24.0 + version: 7.24.5 + vitest-mock-extended: + specifier: ^2.0.2 + version: 2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/test-utils': + specifier: workspace:^ + version: link:../../../../packages/test-utils + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + fastify-plugin: + specifier: ^5.1.0 + version: 5.1.0 + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + pino-pretty: + specifier: ^13.1.3 + version: 13.1.3 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + ts-patch: + specifier: ^3.3.0 + version: 3.3.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-transform-paths: + specifier: ^3.5.6 + version: 3.5.6(typescript@5.9.3) + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vite-node: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(terser@5.46.0) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/apps/server-nestjs: + dependencies: + '@cpn-console/argocd-plugin': + specifier: workspace:^ + version: file:plugins/argocd(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/gitlab-plugin': + specifier: workspace:^ + version: file:plugins/gitlab(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/harbor-plugin': + specifier: workspace:^ + version: file:plugins/harbor(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/hooks': + specifier: workspace:^ + version: file:packages/hooks(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/keycloak-plugin': + specifier: workspace:^ + version: file:plugins/keycloak(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/nexus-plugin': + specifier: workspace:^ + version: file:plugins/nexus(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/shared': + specifier: workspace:^ + version: file:packages/shared(@types/node@22.19.15) + '@cpn-console/sonarqube-plugin': + specifier: workspace:^ + version: file:plugins/sonarqube(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: file:plugins/vault(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + '@fastify/cookie': + specifier: ^9.4.0 + version: 9.4.0 + '@fastify/helmet': + specifier: ^11.1.1 + version: 11.1.1 + '@fastify/session': + specifier: ^10.9.0 + version: 10.9.0 + '@fastify/swagger': + specifier: ^8.15.0 + version: 8.15.0 + '@fastify/swagger-ui': + specifier: ^4.2.0 + version: 4.2.0 + '@gitbeaker/core': + specifier: ^40.6.0 + version: 40.6.0 + '@gitbeaker/rest': + specifier: ^40.6.0 + version: 40.6.0 + '@kubernetes-models/argo-cd': + specifier: ^2.7.2 + version: 2.7.2 + '@nestjs/common': + specifier: ^11.1.16 + version: 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/config': + specifier: ^4.0.3 + version: 4.0.3(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: ^11.1.16 + version: 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/platform-express': + specifier: ^11.1.16 + version: 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16) + '@nestjs/terminus': + specifier: ^11.1.1 + version: 11.1.1(@grpc/grpc-js@1.14.3)(@grpc/proto-loader@0.8.0)(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/auto-instrumentations-node': + specifier: ^0.70.1 + version: 0.70.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0)) + '@opentelemetry/exporter-metrics-otlp-proto': + specifier: ^0.213.0 + version: 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': + specifier: ^0.213.0 + version: 0.213.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': + specifier: ^0.58.0 + version: 0.58.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': + specifier: ^0.59.0 + version: 0.59.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': + specifier: ^2.5.1 + version: 2.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': + specifier: ^0.212.0 + version: 0.212.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': + specifier: ^2.5.1 + version: 2.6.0(@opentelemetry/api@1.9.0) + '@prisma/client': + specifier: ^6.19.2 + version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@22.19.15)(zod@4.3.6) + '@ts-rest/fastify': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@4.3.6))(fastify@4.29.1)(zod@4.3.6) + '@ts-rest/open-api': + specifier: ^3.52.1 + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@4.3.6))(zod@4.3.6) + axios: + specifier: ^1.13.6 + version: 1.13.6 + date-fns: + specifier: ^4.1.0 + version: 4.1.0 + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + fastify: + specifier: ^4.29.1 + version: 4.29.1 + fastify-keycloak-adapter: + specifier: 2.3.2 + version: 2.3.2(patch_hash=6846b953fc520dd1ca6cb2e790cf190cbc3ed9fa9ff69739100458c520293447) + json-2-csv: + specifier: ^5.5.10 + version: 5.5.10 + mustache: + specifier: ^4.2.0 + version: 4.2.0 + nestjs-pino: + specifier: ^4.6.0 + version: 4.6.0(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.3.1)(rxjs@7.8.2) + pino-http: + specifier: ^11.0.0 + version: 11.0.0 + prisma: + specifier: ^6.19.2 + version: 6.19.2(magicast@0.3.5)(typescript@5.9.3) + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + undici: + specifier: ^7.24.0 + version: 7.24.5 + vitest-mock-extended: + specifier: ^2.0.2 + version: 2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/test-utils': + specifier: workspace:^ + version: file:packages/test-utils(@types/node@22.19.15) + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@eslint/eslintrc': + specifier: ^3.3.5 + version: 3.3.5 + '@eslint/js': + specifier: ^9.39.4 + version: 9.39.4 + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + '@nestjs/cli': + specifier: ^11.0.16 + version: 11.0.16(@types/node@22.19.15) + '@nestjs/schematics': + specifier: ^11.0.9 + version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) + '@nestjs/testing': + specifier: ^11.1.16 + version: 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(@nestjs/platform-express@11.1.16) + '@types/express': + specifier: ^5.0.6 + version: 5.0.6 + '@types/node': + specifier: ^22.19.15 + version: 22.19.15 + '@types/supertest': + specifier: ^6.0.3 + version: 6.0.3 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + eslint: + specifier: ^9.39.4 + version: 9.39.4(jiti@2.6.1) + fastify-plugin: + specifier: ^5.1.0 + version: 5.1.0 + globals: + specifier: ^16.5.0 + version: 16.5.0 + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + pino-pretty: + specifier: ^13.1.3 + version: 13.1.3 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + supertest: + specifier: ^7.2.2 + version: 7.2.2 + ts-loader: + specifier: ^9.5.4 + version: 9.5.4(typescript@5.9.3)(webpack@5.104.1) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + ts-patch: + specifier: ^3.3.0 + version: 3.3.0 + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.57.0 + version: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + typescript-transform-paths: + specifier: ^3.5.6 + version: 3.5.6(typescript@5.9.3) + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@22.19.15)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vite-node: + specifier: ^2.1.9 + version: 2.1.9(@types/node@22.19.15)(terser@5.46.0) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/migrations/v9: + dependencies: + '@gitbeaker/rest': + specifier: ~40.6.0 + version: 40.6.0 + axios: + specifier: ^1.7.9 + version: 1.13.6 + + apps/console.pr2036/packages/eslintconfig: + devDependencies: + '@antfu/eslint-config': + specifier: ^7.7.0 + version: 7.7.0(@typescript-eslint/rule-tester@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3))(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + eslint: + specifier: ^10.0.3 + version: 10.1.0(jiti@2.6.1) + + apps/console.pr2036/packages/hooks: + dependencies: + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + json-schema: + specifier: ^0.4.0 + version: 0.4.0 + vitest-mock-extended: + specifier: ^2.0.2 + version: 2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + zod: + specifier: ^3.25.76 + version: 3.25.76 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/json-schema': + specifier: ^7.0.15 + version: 7.0.15 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + ts-algebra: + specifier: ^2.0.0 + version: 2.0.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + undici-types: + specifier: ^7.24.0 + version: 7.24.5 + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/packages/shared: + dependencies: + '@ts-rest/core': + specifier: ^3.52.1 + version: 3.52.1(@types/node@24.12.0)(zod@3.25.76) + short-uuid: + specifier: ^5.2.0 + version: 5.2.0 + zod: + specifier: ^3.25.76 + version: 3.25.76 + zod-validation-error: + specifier: ^3.5.4 + version: 3.5.4(zod@3.25.76) + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.7.2))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: 5.7.2 + version: 5.7.2 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vite-node: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(terser@5.46.0) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.7.2))(terser@5.46.0) + + apps/console.pr2036/packages/test-utils: + dependencies: + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + apps/console.pr2036/packages/tsconfig: {} + + apps/console.pr2036/playwright: + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../packages/tsconfig + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + '@playwright/test': + specifier: ^1.58.2 + version: 1.58.2 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + dotenv: + specifier: ^16.6.1 + version: 16.6.1 + + apps/console.pr2036/plugins/argocd: + dependencies: + '@cpn-console/gitlab-plugin': + specifier: workspace:^ + version: link:../../../../plugins/gitlab + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/keycloak-plugin': + specifier: workspace:^ + version: link:../../../../plugins/keycloak + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + '@himenon/argocd-typescript-openapi': + specifier: ^1.2.2 + version: 1.2.2 + '@types/js-yaml': + specifier: 4.0.9 + version: 4.0.9 + axios: + specifier: ^1.13.6 + version: 1.13.6 + js-yaml: + specifier: 4.1.0 + version: 4.1.0 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@faker-js/faker': + specifier: ^9.9.0 + version: 9.9.0 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/plugins/gitlab: + dependencies: + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + '@gitbeaker/core': + specifier: ^40.6.0 + version: 40.6.0 + '@gitbeaker/requester-utils': + specifier: ^40.6.0 + version: 40.6.0 + '@gitbeaker/rest': + specifier: ^40.6.0 + version: 40.6.0 + axios: + specifier: ^1.13.6 + version: 1.13.6 + js-yaml: + specifier: 4.1.0 + version: 4.1.0 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/js-yaml': + specifier: 4.0.9 + version: 4.0.9 + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/plugins/harbor: + dependencies: + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/keycloak-plugin': + specifier: workspace:^ + version: link:../../../../plugins/keycloak + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + axios: + specifier: ^1.13.6 + version: 1.13.6 + bytes: + specifier: ^3.1.2 + version: 3.1.2 + cron-validator: + specifier: ^1.4.0 + version: 1.4.0 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + swagger-typescript-api: + specifier: ^13.3.1 + version: 13.3.1(magicast@0.3.5) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/plugins/keycloak: + dependencies: + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@keycloak/keycloak-admin-client': + specifier: ^26.5.5 + version: 26.5.5 + axios: + specifier: ^1.13.6 + version: 1.13.6 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/plugins/nexus: + dependencies: + '@cpn-console/gitlab-plugin': + specifier: workspace:^ + version: link:../../../../plugins/gitlab + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + axios: + specifier: ^1.13.6 + version: 1.13.6 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/plugins/sonarqube: + dependencies: + '@cpn-console/gitlab-plugin': + specifier: workspace:^ + version: link:../../../../plugins/gitlab + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/keycloak-plugin': + specifier: workspace:^ + version: link:../../../../plugins/keycloak + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + '@cpn-console/vault-plugin': + specifier: workspace:^ + version: link:../../../../plugins/vault + axios: + specifier: ^1.13.6 + version: 1.13.6 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + + apps/console.pr2036/plugins/vault: + dependencies: + '@cpn-console/hooks': + specifier: workspace:^ + version: link:../../../../packages/hooks + '@cpn-console/shared': + specifier: workspace:^ + version: link:../../../../packages/shared + axios: + specifier: ^1.13.6 + version: 1.13.6 + devDependencies: + '@cpn-console/eslint-config': + specifier: workspace:^ + version: link:../../../../packages/eslintconfig + '@cpn-console/ts-config': + specifier: workspace:^ + version: link:../../../../packages/tsconfig + '@types/node': + specifier: ^24.12.0 + version: 24.12.0 + '@vitest/coverage-v8': + specifier: ^2.1.9 + version: 2.1.9(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + nodemon: + specifier: ^3.1.14 + version: 3.1.14 + rimraf: + specifier: ^6.1.3 + version: 6.1.3 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.3.1 + version: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + vitest: + specifier: ^2.1.9 + version: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + apps/server: dependencies: '@cpn-console/argocd-plugin': @@ -251,13 +1337,13 @@ importers: version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) '@ts-rest/core': specifier: ^3.52.1 - version: 3.52.1(@types/node@24.12.0)(zod@3.25.76) + version: 3.52.1(@types/node@24.12.0)(zod@4.3.6) '@ts-rest/fastify': specifier: ^3.52.1 - version: 3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@3.25.76))(fastify@4.29.1)(zod@3.25.76) + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6))(fastify@4.29.1)(zod@4.3.6) '@ts-rest/open-api': specifier: ^3.52.1 - version: 3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@3.25.76))(zod@3.25.76) + version: 3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6))(zod@4.3.6) axios: specifier: ^1.13.6 version: 1.13.6 @@ -340,33 +1426,39 @@ importers: apps/server-nestjs: dependencies: + '@casl/ability': + specifier: ^6.8.0 + version: 6.8.0 + '@casl/prisma': + specifier: ^1.6.1 + version: 1.6.1(@casl/ability@6.8.0)(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3)) '@cpn-console/argocd-plugin': specifier: workspace:^ - version: link:../../plugins/argocd + version: file:plugins/argocd(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/gitlab-plugin': specifier: workspace:^ - version: link:../../plugins/gitlab + version: file:plugins/gitlab(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/harbor-plugin': specifier: workspace:^ - version: link:../../plugins/harbor + version: file:plugins/harbor(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/hooks': specifier: workspace:^ - version: link:../../packages/hooks + version: file:packages/hooks(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/keycloak-plugin': specifier: workspace:^ - version: link:../../plugins/keycloak + version: file:plugins/keycloak(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/nexus-plugin': specifier: workspace:^ - version: link:../../plugins/nexus + version: file:plugins/nexus(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/shared': specifier: workspace:^ - version: link:../../packages/shared + version: file:packages/shared(@types/node@22.19.15) '@cpn-console/sonarqube-plugin': specifier: workspace:^ - version: link:../../plugins/sonarqube + version: file:plugins/sonarqube(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@cpn-console/vault-plugin': specifier: workspace:^ - version: link:../../plugins/vault + version: file:plugins/vault(@types/node@22.19.15)(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) '@fastify/cookie': specifier: ^9.4.0 version: 9.4.0 @@ -391,6 +1483,9 @@ importers: '@kubernetes-models/argo-cd': specifier: ^2.7.2 version: 2.7.2 + '@nestjs/cache-manager': + specifier: ^3.1.0 + version: 3.1.0(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(cache-manager@7.2.8)(keyv@5.6.0)(rxjs@7.8.2) '@nestjs/common': specifier: ^11.1.16 version: 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -400,6 +1495,9 @@ importers: '@nestjs/core': specifier: ^11.1.16 version: 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/jwt': + specifier: ^11.0.2 + version: 11.0.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/platform-express': specifier: ^11.1.16 version: 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16) @@ -448,6 +1546,9 @@ importers: axios: specifier: ^1.13.6 version: 1.13.6 + cache-manager: + specifier: ^7.2.8 + version: 7.2.8 class-transformer: specifier: ^0.5.1 version: 0.5.1 @@ -469,9 +1570,15 @@ importers: json-2-csv: specifier: ^5.5.10 version: 5.5.10 + keycloak-connect: + specifier: ^26.1.1 + version: 26.1.1 mustache: specifier: ^4.2.0 version: 4.2.0 + nest-keycloak-connect: + specifier: 2.0.0-alpha.2 + version: 2.0.0-alpha.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(keycloak-connect@26.1.1) nestjs-pino: specifier: ^4.6.0 version: 4.6.0(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.3.1)(rxjs@7.8.2) @@ -493,6 +1600,9 @@ importers: vitest-mock-extended: specifier: ^2.0.2 version: 2.0.2(typescript@5.9.3)(vitest@2.1.9(@types/node@22.19.15)(jsdom@25.0.1)(msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3))(terser@5.46.0)) + zod: + specifier: ^3.25.76 + version: 3.25.76 devDependencies: '@cpn-console/eslint-config': specifier: workspace:^ @@ -1760,6 +2870,15 @@ packages: '@cacheable/utils@2.4.0': resolution: {integrity: sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==} + '@casl/ability@6.8.0': + resolution: {integrity: sha512-Ipt4mzI4gSgnomFdaPjaLgY2MWuXqAEZLrU6qqWBB7khGiBBuuEp6ytYDnq09bRXqcjaeeHiaCvCGFbBA2SpvA==} + + '@casl/prisma@1.6.1': + resolution: {integrity: sha512-VSAzfTMOZvP3Atj3F0qwJItOm1ixIiumjbBz21PL/gLUIDwoktyAx2dB7dPwjH9AQvzZPE629ee7fVU5K2hpzg==} + peerDependencies: + '@casl/ability': ^5.3.0 || ^6.0.0 + '@prisma/client': ^2.14.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@clack/core@1.1.0': resolution: {integrity: sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==} @@ -2690,6 +3809,15 @@ packages: '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@nestjs/cache-manager@3.1.0': + resolution: {integrity: sha512-pEIqYZrBcE8UdkJmZRduurvoUfdU+3kRPeO1R2muiMbZnRuqlki5klFFNllO9LyYWzrx98bd1j0PSPKSJk1Wbw==} + peerDependencies: + '@nestjs/common': ^9.0.0 || ^10.0.0 || ^11.0.0 + '@nestjs/core': ^9.0.0 || ^10.0.0 || ^11.0.0 + cache-manager: '>=6' + keyv: '>=5' + rxjs: ^7.8.1 + '@nestjs/cli@11.0.16': resolution: {integrity: sha512-P0H+Vcjki6P5160E5QnMt3Q0X5FTg4PZkP99Ig4lm/4JWqfw32j3EXv3YBTJ2DmxLwOQ/IS9F7dzKpMAgzKTGg==} engines: {node: '>= 20.11'} @@ -2740,6 +3868,11 @@ packages: '@nestjs/websockets': optional: true + '@nestjs/jwt@11.0.2': + resolution: {integrity: sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + '@nestjs/platform-express@11.1.16': resolution: {integrity: sha512-IOegr5+ZfUiMKgk+garsSU4MOkPRhm46e6w8Bp1GcO4vCdl9Piz6FlWAzKVfa/U3Hn/DdzSVJOW3TWcQQFdBDw==} peerDependencies: @@ -3831,6 +4964,9 @@ packages: '@swc/helpers@0.5.19': resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} + '@testim/chrome-version@1.1.4': + resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} + '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} @@ -3838,6 +4974,9 @@ packages: '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@ts-rest/core@3.52.1': resolution: {integrity: sha512-tAjz7Kxq/grJodcTA1Anop4AVRDlD40fkksEV5Mmal88VoZeRKAG8oMHsDwdwPZz+B/zgnz0q2sF+cm5M7Bc7g==} peerDependencies: @@ -3943,6 +5082,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -4015,6 +5157,9 @@ packages: '@types/validator@13.15.10': resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.57.0': resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4080,6 +5225,18 @@ packages: resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ucast/core@1.10.2': + resolution: {integrity: sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==} + + '@ucast/js@3.1.0': + resolution: {integrity: sha512-eJ7yQeYtMK85UZjxoxBEbTWx6UMxEXKbjVyp+NlzrT5oMKV5Gpo/9bjTl3r7msaXTVC8iD9NJacqJ8yp7joX+Q==} + + '@ucast/mongo2js@1.4.1': + resolution: {integrity: sha512-9aeg5cmqwRQnKCXHN6I17wk83Rcm487bHelaG8T4vfpWneAI469wSI3Srnbu+PuZ5znWRbnwtVq9RgPL+bN6CA==} + + '@ucast/mongo@2.4.3': + resolution: {integrity: sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==} + '@unocss/cli@66.6.6': resolution: {integrity: sha512-78SY8j4hAVelK+vP/adsDGaSjEITasYLFECJLHWxUJSzK+G9UIc5wtL/u4jA+zKvwVkHcDvbkcO5K6wwwpAixg==} engines: {node: '>=14'} @@ -4509,6 +5666,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -4576,6 +5737,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + basic-ftp@5.2.0: + resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + engines: {node: '>=10.0.0'} + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -4622,6 +5787,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -4667,6 +5835,9 @@ packages: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} + cache-manager@7.2.8: + resolution: {integrity: sha512-0HDaDLBBY/maa/LmUVAr70XUOwsiQD+jyzCBjmUErYZUKdMS9dT59PqW59PpVqfGM7ve6H0J6307JTpkCYefHQ==} + cacheable@2.3.3: resolution: {integrity: sha512-iffYMX4zxKp54evOH27fm92hs+DeC1DhXmNVN8Tr94M/iZIV42dqTHSR2Ik4TOSPyOAwKr7Yu3rN9ALoLkbWyQ==} @@ -4748,6 +5919,11 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + chromedriver@146.0.6: + resolution: {integrity: sha512-FIRi3hy0nRiyirK03etVXEpYTIodevFcvTBAM5ZCq+pX3w31jLm6JE8BVW1ypAVLvSp6HJDvboCcdgUroS3miw==} + engines: {node: '>=20'} + hasBin: true + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -4864,6 +6040,9 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -5001,6 +6180,10 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -5029,6 +6212,15 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5077,6 +6269,10 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -5295,6 +6491,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} @@ -5566,6 +6767,11 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-check@3.23.2: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} @@ -5643,6 +6849,9 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -5829,6 +7038,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5836,6 +7049,10 @@ packages: get-tsconfig@4.13.6: resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + giget@2.0.0: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true @@ -6126,6 +7343,10 @@ packages: peerDependencies: fp-ts: ^2.5.0 + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} @@ -6297,6 +7518,9 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -6309,6 +7533,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is2@2.0.9: + resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} + engines: {node: '>=v0.10.0'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -6452,6 +7680,10 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -6464,6 +7696,10 @@ packages: jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + keycloak-connect@26.1.1: + resolution: {integrity: sha512-2wvNJXldB9Em+mp6liJ+AnftcJovFEvNhUgv3hblNDmVihBoBqn4zFlwLIN41lo0H8CicB2T86xZ5U2MiQ9FFA==} + engines: {node: '>=14'} + keycloak-js@26.2.3: resolution: {integrity: sha512-widjzw/9T6bHRgEp6H/Se3NCCarU7u5CwFKBcwtu7xfA1IfdZb+7Q7/KGusAnBo34Vtls8Oz9vzSqkQvQ7+b4Q==} @@ -6532,6 +7768,24 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} @@ -6541,6 +7795,9 @@ packages: lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} @@ -6586,6 +7843,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + magic-regexp@0.10.0: resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} @@ -6864,6 +8125,9 @@ packages: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -6925,6 +8189,17 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nest-keycloak-connect@2.0.0-alpha.2: + resolution: {integrity: sha512-tpHN8s5kWf4PzdoWPvkV4NGRspFa+/UyrPYK39keKrP4IyhRnz5rehw+vFsdIENpWk1y8jfowRxU5M+ErV338w==} + peerDependencies: + '@nestjs/common': '>=6.0.0 <12.0.0' + '@nestjs/core': '>=6.0.0 <12.0.0' + '@nestjs/graphql': '>=6' + keycloak-connect: '>=10.0.0' + peerDependenciesMeta: + '@nestjs/graphql': + optional: true + nestjs-pino@4.6.0: resolution: {integrity: sha512-MzSgnOu9MhRT/f7MsvoDnxat11D9JRJYwL1t+tI6J44UrNz9rUVDpceEh9VFsyfiiIJKUri5S+/snMOoaWh7YA==} engines: {node: '>= 14'} @@ -6934,6 +8209,10 @@ packages: pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 rxjs: ^7.1.0 + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} @@ -7099,6 +8378,14 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -7175,6 +8462,9 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -7357,9 +8647,17 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -7774,6 +9072,10 @@ packages: resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} engines: {node: '>=20'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smob@1.6.1: resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} engines: {node: '>=20.0.0'} @@ -7782,6 +9084,14 @@ packages: resolution: {integrity: sha512-Gz11jbNU0plrReU9Sj7fmshSBxxJ9ShdD2q4ktHIHo/rpTH6lFyQoYHYKINPJtPe8aHFnsbtW46Ls0tCCBsIZg==} engines: {node: '>=0.10'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@4.2.1: resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} @@ -8042,6 +9352,9 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tcp-port-used@1.0.2: + resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -8479,9 +9792,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validator@13.15.26: resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} engines: {node: '>= 0.10'} @@ -8898,6 +10208,9 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -8930,6 +10243,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -8946,6 +10262,12 @@ snapshots: ts-deepmerge: 6.2.1 zod: 3.25.76 + '@anatine/zod-openapi@1.14.2(openapi3-ts@2.0.2)(zod@4.3.6)': + dependencies: + openapi3-ts: 2.0.2 + ts-deepmerge: 6.2.1 + zod: 4.3.6 + '@angular-devkit/core@19.2.17(chokidar@4.0.3)': dependencies: ajv: 8.17.1 @@ -9050,6 +10372,56 @@ snapshots: - typescript - vitest + '@antfu/eslint-config@7.7.0(@typescript-eslint/rule-tester@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3))(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0))': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@clack/prompts': 1.1.0 + '@e18e/eslint-plugin': 0.2.0(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/eslint-plugin-eslint-comments': 4.7.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint/markdown': 7.5.1 + '@stylistic/eslint-plugin': 5.10.0(eslint@10.1.0(jiti@2.6.1)) + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@vitest/eslint-plugin': 1.6.10(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0)) + ansis: 4.2.0 + cac: 7.0.0 + eslint: 10.1.0(jiti@2.6.1) + eslint-config-flat-gitignore: 2.2.1(eslint@10.1.0(jiti@2.6.1)) + eslint-flat-config-utils: 3.0.2 + eslint-merge-processors: 2.0.0(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-antfu: 3.2.2(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-command: 3.5.2(@typescript-eslint/rule-tester@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3))(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import-lite: 0.5.2(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-jsdoc: 62.7.1(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-jsonc: 3.1.1(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-n: 17.24.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-no-only-tests: 3.3.0 + eslint-plugin-perfectionist: 5.6.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-pnpm: 1.6.0(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-regexp: 3.1.0(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-toml: 1.3.1(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-unicorn: 63.0.0(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-vue: 10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))) + eslint-plugin-yml: 3.3.1(eslint@10.1.0(jiti@2.6.1)) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1)) + globals: 17.4.0 + local-pkg: 1.1.2 + parse-gitignore: 2.0.0 + toml-eslint-parser: 1.0.3 + vue-eslint-parser: 10.4.0(eslint@10.1.0(jiti@2.6.1)) + yaml-eslint-parser: 2.0.0 + transitivePeerDependencies: + - '@eslint/json' + - '@typescript-eslint/rule-tester' + - '@typescript-eslint/typescript-estree' + - '@typescript-eslint/utils' + - '@vue/compiler-sfc' + - oxlint + - supports-color + - typescript + - vitest + '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 @@ -9767,6 +11139,17 @@ snapshots: hashery: 1.5.0 keyv: 5.6.0 + '@casl/ability@6.8.0': + dependencies: + '@ucast/mongo2js': 1.4.1 + + '@casl/prisma@1.6.1(@casl/ability@6.8.0)(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))': + dependencies: + '@casl/ability': 6.8.0 + '@prisma/client': 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) + '@ucast/core': 1.10.2 + '@ucast/js': 3.1.0 + '@clack/core@1.1.0': dependencies: sisteransi: 1.0.5 @@ -10082,6 +11465,12 @@ snapshots: optionalDependencies: eslint: 10.0.3(jiti@2.6.1) + '@e18e/eslint-plugin@0.2.0(eslint@10.1.0(jiti@2.6.1))': + dependencies: + eslint-plugin-depend: 1.5.0(eslint@10.1.0(jiti@2.6.1)) + optionalDependencies: + eslint: 10.1.0(jiti@2.6.1) + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -10261,6 +11650,12 @@ snapshots: eslint: 10.0.3(jiti@2.6.1) ignore: 7.0.5 + '@eslint-community/eslint-plugin-eslint-comments@4.7.1(eslint@10.1.0(jiti@2.6.1))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 10.1.0(jiti@2.6.1) + ignore: 7.0.5 + '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': dependencies: eslint: 10.0.3(jiti@2.6.1) @@ -10284,6 +11679,12 @@ snapshots: optionalDependencies: eslint: 10.0.3(jiti@2.6.1) + '@eslint/compat@2.0.3(eslint@10.1.0(jiti@2.6.1))': + dependencies: + '@eslint/core': 1.1.1 + optionalDependencies: + eslint: 10.1.0(jiti@2.6.1) + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 @@ -10786,6 +12187,14 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@nestjs/cache-manager@3.1.0(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(cache-manager@7.2.8)(keyv@5.6.0)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) + cache-manager: 7.2.8 + keyv: 5.6.0 + rxjs: 7.8.2 + '@nestjs/cli@11.0.16(@types/node@22.19.15)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) @@ -10849,6 +12258,12 @@ snapshots: optionalDependencies: '@nestjs/platform-express': 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16) + '@nestjs/jwt@11.0.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))': + dependencies: + '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@types/jsonwebtoken': 9.0.10 + jsonwebtoken: 9.0.3 + '@nestjs/platform-express@11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)': dependencies: '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -11913,6 +13328,14 @@ snapshots: optionalDependencies: rollup: 2.80.0 + '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.59.0 + '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -12019,7 +13442,6 @@ snapshots: espree: 10.4.0 estraverse: 5.3.0 picomatch: 4.0.3 - optional: true '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: @@ -12032,6 +13454,9 @@ snapshots: dependencies: tslib: 2.8.1 + '@testim/chrome-version@1.1.4': + optional: true + '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3(supports-color@5.5.0) @@ -12041,16 +13466,29 @@ snapshots: '@tokenizer/token@0.3.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': + optional: true + '@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@3.25.76)': optionalDependencies: '@types/node': 22.19.15 zod: 3.25.76 + '@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@4.3.6)': + optionalDependencies: + '@types/node': 22.19.15 + zod: 4.3.6 + '@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@3.25.76)': optionalDependencies: '@types/node': 24.12.0 zod: 3.25.76 + '@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6)': + optionalDependencies: + '@types/node': 24.12.0 + zod: 4.3.6 + '@ts-rest/fastify@3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@3.25.76))(fastify@4.29.1)(zod@3.25.76)': dependencies: '@ts-rest/core': 3.52.1(@types/node@22.19.15)(zod@3.25.76) @@ -12058,12 +13496,19 @@ snapshots: optionalDependencies: zod: 3.25.76 - '@ts-rest/fastify@3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@3.25.76))(fastify@4.29.1)(zod@3.25.76)': + '@ts-rest/fastify@3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@4.3.6))(fastify@4.29.1)(zod@4.3.6)': dependencies: - '@ts-rest/core': 3.52.1(@types/node@24.12.0)(zod@3.25.76) + '@ts-rest/core': 3.52.1(@types/node@22.19.15)(zod@4.3.6) fastify: 4.29.1 optionalDependencies: - zod: 3.25.76 + zod: 4.3.6 + + '@ts-rest/fastify@3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6))(fastify@4.29.1)(zod@4.3.6)': + dependencies: + '@ts-rest/core': 3.52.1(@types/node@24.12.0)(zod@4.3.6) + fastify: 4.29.1 + optionalDependencies: + zod: 4.3.6 '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@3.25.76))(zod@3.25.76)': dependencies: @@ -12072,12 +13517,19 @@ snapshots: openapi3-ts: 2.0.2 zod: 3.25.76 - '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@3.25.76))(zod@3.25.76)': + '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@22.19.15)(zod@4.3.6))(zod@4.3.6)': dependencies: - '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@3.25.76) - '@ts-rest/core': 3.52.1(@types/node@24.12.0)(zod@3.25.76) + '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@4.3.6) + '@ts-rest/core': 3.52.1(@types/node@22.19.15)(zod@4.3.6) openapi3-ts: 2.0.2 - zod: 3.25.76 + zod: 4.3.6 + + '@ts-rest/open-api@3.52.1(@ts-rest/core@3.52.1(@types/node@24.12.0)(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@anatine/zod-openapi': 1.14.2(openapi3-ts@2.0.2)(zod@4.3.6) + '@ts-rest/core': 3.52.1(@types/node@24.12.0)(zod@4.3.6) + openapi3-ts: 2.0.2 + zod: 4.3.6 '@tsconfig/node10@1.0.12': {} @@ -12122,7 +13574,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.15 + '@types/node': 24.12.0 '@types/bunyan@1.8.11': dependencies: @@ -12130,7 +13582,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.15 + '@types/node': 24.12.0 '@types/cookiejar@2.1.5': {} @@ -12156,7 +13608,7 @@ snapshots: '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.19.15 + '@types/node': 24.12.0 '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -12179,6 +13631,11 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 24.12.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -12225,12 +13682,12 @@ snapshots: '@types/send@1.2.1': dependencies: - '@types/node': 22.19.15 + '@types/node': 24.12.0 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.15 + '@types/node': 24.12.0 '@types/statuses@2.0.6': optional: true @@ -12239,7 +13696,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.19.15 + '@types/node': 24.12.0 form-data: 4.0.5 '@types/supertest@6.0.3': @@ -12261,6 +13718,11 @@ snapshots: '@types/validator@13.15.10': {} + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.12.0 + optional: true + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -12368,6 +13830,20 @@ snapshots: - supports-color - typescript + '@typescript-eslint/rule-tester@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + ajv: 6.14.0 + eslint: 10.1.0(jiti@2.6.1) + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/scope-manager@8.57.0': dependencies: '@typescript-eslint/types': 8.57.0 @@ -12468,6 +13944,22 @@ snapshots: '@typescript-eslint/types': 8.57.0 eslint-visitor-keys: 5.0.1 + '@ucast/core@1.10.2': {} + + '@ucast/js@3.1.0': + dependencies: + '@ucast/core': 1.10.2 + + '@ucast/mongo2js@1.4.1': + dependencies: + '@ucast/core': 1.10.2 + '@ucast/js': 3.1.0 + '@ucast/mongo': 2.4.3 + + '@ucast/mongo@2.4.3': + dependencies: + '@ucast/core': 1.10.2 + '@unocss/cli@66.6.6': dependencies: '@jridgewell/remapping': 2.3.5 @@ -12681,6 +14173,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/eslint-plugin@1.6.10(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)(vitest@2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0))': + dependencies: + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) + optionalDependencies: + typescript: 5.9.3 + vitest: 2.1.9(@types/node@24.12.0)(jsdom@25.0.1)(msw@2.12.10(@types/node@24.12.0)(typescript@5.9.3))(terser@5.46.0) + transitivePeerDependencies: + - supports-color + '@vitest/expect@2.1.9': dependencies: '@vitest/spy': 2.1.9 @@ -13078,6 +14581,11 @@ snapshots: assertion-error@2.0.1: {} + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + optional: true + astral-regex@2.0.0: {} async-function@1.0.0: {} @@ -13144,6 +14652,9 @@ snapshots: baseline-browser-mapping@2.10.0: {} + basic-ftp@5.2.0: + optional: true + bignumber.js@9.3.1: {} binary-extensions@2.3.0: {} @@ -13200,8 +14711,7 @@ snapshots: dependencies: fill-range: 7.1.1 - brorand@1.1.0: - optional: true + brorand@1.1.0: {} browserslist@4.28.1: dependencies: @@ -13211,9 +14721,11 @@ snapshots: node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) - buffer-equal-constant-time@1.0.1: + buffer-crc32@0.2.13: optional: true + buffer-equal-constant-time@1.0.1: {} + buffer-from@1.1.2: {} buffer@5.7.1: @@ -13267,6 +14779,11 @@ snapshots: cac@7.0.0: {} + cache-manager@7.2.8: + dependencies: + '@cacheable/utils': 2.4.0 + keyv: 5.6.0 + cacheable@2.3.3: dependencies: '@cacheable/memory': 2.0.8 @@ -13351,6 +14868,20 @@ snapshots: chrome-trace-event@1.0.4: {} + chromedriver@146.0.6: + dependencies: + '@testim/chrome-version': 1.1.4 + axios: 1.13.6 + compare-versions: 6.1.1 + extract-zip: 2.0.1 + proxy-agent: 6.5.0 + proxy-from-env: 2.1.0 + tcp-port-used: 1.0.2 + transitivePeerDependencies: + - debug + - supports-color + optional: true + ci-info@4.4.0: {} cidr-regex@3.1.1: @@ -13457,6 +14988,9 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compare-versions@6.1.1: + optional: true + component-emitter@1.3.1: {} concat-map@0.0.1: {} @@ -13572,6 +15106,9 @@ snapshots: data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@6.0.2: + optional: true + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -13603,6 +15140,11 @@ snapshots: de-indent@1.0.2: {} + debug@4.3.1: + dependencies: + ms: 2.1.2 + optional: true + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -13643,6 +15185,13 @@ snapshots: defu@6.1.4: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + optional: true + delayed-stream@1.0.0: {} delegate@3.2.0: {} @@ -13742,7 +15291,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - optional: true emoji-regex@10.6.0: {} @@ -13928,16 +15476,35 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + optional: true + eslint-compat-utils@0.5.1(eslint@10.0.3(jiti@2.6.1)): dependencies: eslint: 10.0.3(jiti@2.6.1) semver: 7.7.4 + eslint-compat-utils@0.5.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + eslint: 10.1.0(jiti@2.6.1) + semver: 7.7.4 + eslint-config-flat-gitignore@2.2.1(eslint@10.0.3(jiti@2.6.1)): dependencies: '@eslint/compat': 2.0.3(eslint@10.0.3(jiti@2.6.1)) eslint: 10.0.3(jiti@2.6.1) + eslint-config-flat-gitignore@2.2.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@eslint/compat': 2.0.3(eslint@10.1.0(jiti@2.6.1)) + eslint: 10.1.0(jiti@2.6.1) + eslint-flat-config-utils@3.0.2: dependencies: '@eslint/config-helpers': 0.5.3 @@ -13949,14 +15516,28 @@ snapshots: esquery: 1.7.0 jsonc-eslint-parser: 3.1.0 + eslint-json-compat-utils@0.2.2(eslint@10.1.0(jiti@2.6.1))(jsonc-eslint-parser@3.1.0): + dependencies: + eslint: 10.1.0(jiti@2.6.1) + esquery: 1.7.0 + jsonc-eslint-parser: 3.1.0 + eslint-merge-processors@2.0.0(eslint@10.0.3(jiti@2.6.1)): dependencies: eslint: 10.0.3(jiti@2.6.1) + eslint-merge-processors@2.0.0(eslint@10.1.0(jiti@2.6.1)): + dependencies: + eslint: 10.1.0(jiti@2.6.1) + eslint-plugin-antfu@3.2.2(eslint@10.0.3(jiti@2.6.1)): dependencies: eslint: 10.0.3(jiti@2.6.1) + eslint-plugin-antfu@3.2.2(eslint@10.1.0(jiti@2.6.1)): + dependencies: + eslint: 10.1.0(jiti@2.6.1) + eslint-plugin-command@3.5.2(@typescript-eslint/rule-tester@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3))(@typescript-eslint/utils@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.84.0 @@ -13965,6 +15546,14 @@ snapshots: '@typescript-eslint/utils': 8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) eslint: 10.0.3(jiti@2.6.1) + eslint-plugin-command@3.5.2(@typescript-eslint/rule-tester@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3))(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@es-joy/jsdoccomment': 0.84.0 + '@typescript-eslint/rule-tester': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) + eslint-plugin-depend@1.5.0(eslint@10.0.3(jiti@2.6.1)): dependencies: empathic: 2.0.0 @@ -13972,6 +15561,13 @@ snapshots: module-replacements: 2.11.0 semver: 7.7.4 + eslint-plugin-depend@1.5.0(eslint@10.1.0(jiti@2.6.1)): + dependencies: + empathic: 2.0.0 + eslint: 10.1.0(jiti@2.6.1) + module-replacements: 2.11.0 + semver: 7.7.4 + eslint-plugin-es-x@7.8.0(eslint@10.0.3(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) @@ -13979,10 +15575,21 @@ snapshots: eslint: 10.0.3(jiti@2.6.1) eslint-compat-utils: 0.5.1(eslint@10.0.3(jiti@2.6.1)) + eslint-plugin-es-x@7.8.0(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + eslint: 10.1.0(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import-lite@0.5.2(eslint@10.0.3(jiti@2.6.1)): dependencies: eslint: 10.0.3(jiti@2.6.1) + eslint-plugin-import-lite@0.5.2(eslint@10.1.0(jiti@2.6.1)): + dependencies: + eslint: 10.1.0(jiti@2.6.1) + eslint-plugin-jsdoc@62.7.1(eslint@10.0.3(jiti@2.6.1)): dependencies: '@es-joy/jsdoccomment': 0.84.0 @@ -14003,6 +15610,26 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-jsdoc@62.7.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@es-joy/jsdoccomment': 0.84.0 + '@es-joy/resolve.exports': 1.2.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.5 + debug: 4.4.3(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint: 10.1.0(jiti@2.6.1) + espree: 11.2.0 + esquery: 1.7.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.0 + parse-imports-exports: 0.2.4 + semver: 7.7.4 + spdx-expression-parse: 4.0.0 + to-valid-identifier: 1.0.0 + transitivePeerDependencies: + - supports-color + eslint-plugin-jsonc@3.1.1(eslint@10.0.3(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) @@ -14010,8 +15637,23 @@ snapshots: '@eslint/plugin-kit': 0.6.1 '@ota-meshi/ast-token-store': 0.3.0 diff-sequences: 29.6.3 - eslint: 10.0.3(jiti@2.6.1) - eslint-json-compat-utils: 0.2.2(eslint@10.0.3(jiti@2.6.1))(jsonc-eslint-parser@3.1.0) + eslint: 10.0.3(jiti@2.6.1) + eslint-json-compat-utils: 0.2.2(eslint@10.0.3(jiti@2.6.1))(jsonc-eslint-parser@3.1.0) + jsonc-eslint-parser: 3.1.0 + natural-compare: 1.4.0 + synckit: 0.11.12 + transitivePeerDependencies: + - '@eslint/json' + + eslint-plugin-jsonc@3.1.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 + '@ota-meshi/ast-token-store': 0.3.0 + diff-sequences: 29.6.3 + eslint: 10.1.0(jiti@2.6.1) + eslint-json-compat-utils: 0.2.2(eslint@10.1.0(jiti@2.6.1))(jsonc-eslint-parser@3.1.0) jsonc-eslint-parser: 3.1.0 natural-compare: 1.4.0 synckit: 0.11.12 @@ -14033,6 +15675,21 @@ snapshots: transitivePeerDependencies: - typescript + eslint-plugin-n@17.24.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + enhanced-resolve: 5.20.0 + eslint: 10.1.0(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@10.1.0(jiti@2.6.1)) + get-tsconfig: 4.13.6 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.7.4 + ts-declaration-location: 1.0.7(typescript@5.9.3) + transitivePeerDependencies: + - typescript + eslint-plugin-no-only-tests@3.3.0: {} eslint-plugin-perfectionist@5.6.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): @@ -14044,6 +15701,15 @@ snapshots: - supports-color - typescript + eslint-plugin-perfectionist@5.6.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.1.0(jiti@2.6.1) + natural-orderby: 5.0.0 + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-pnpm@1.6.0(eslint@10.0.3(jiti@2.6.1)): dependencies: empathic: 2.0.0 @@ -14055,6 +15721,17 @@ snapshots: yaml: 2.8.2 yaml-eslint-parser: 2.0.0 + eslint-plugin-pnpm@1.6.0(eslint@10.1.0(jiti@2.6.1)): + dependencies: + empathic: 2.0.0 + eslint: 10.1.0(jiti@2.6.1) + jsonc-eslint-parser: 3.1.0 + pathe: 2.0.3 + pnpm-workspace-yaml: 1.6.0 + tinyglobby: 0.2.15 + yaml: 2.8.2 + yaml-eslint-parser: 2.0.0 + eslint-plugin-regexp@3.1.0(eslint@10.0.3(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) @@ -14066,6 +15743,17 @@ snapshots: regexp-ast-analysis: 0.7.1 scslre: 0.3.0 + eslint-plugin-regexp@3.1.0(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + comment-parser: 1.4.5 + eslint: 10.1.0(jiti@2.6.1) + jsdoc-type-pratt-parser: 7.1.1 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 + eslint-plugin-toml@1.3.1(eslint@10.0.3(jiti@2.6.1)): dependencies: '@eslint/core': 1.1.1 @@ -14077,6 +15765,17 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-toml@1.3.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 + '@ota-meshi/ast-token-store': 0.3.0 + debug: 4.4.3(supports-color@5.5.0) + eslint: 10.1.0(jiti@2.6.1) + toml-eslint-parser: 1.0.3 + transitivePeerDependencies: + - supports-color + eslint-plugin-unicorn@63.0.0(eslint@10.0.3(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -14097,12 +15796,38 @@ snapshots: semver: 7.7.4 strip-indent: 4.1.1 + eslint-plugin-unicorn@63.0.0(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) + change-case: 5.4.4 + ci-info: 4.4.0 + clean-regexp: 1.0.0 + core-js-compat: 3.48.0 + eslint: 10.1.0(jiti@2.6.1) + find-up-simple: 1.0.1 + globals: 16.5.0 + indent-string: 5.0.0 + is-builtin-module: 5.0.0 + jsesc: 3.1.0 + pluralize: 8.0.0 + regexp-tree: 0.1.27 + regjsparser: 0.13.0 + semver: 7.7.4 + strip-indent: 4.1.1 + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)): dependencies: eslint: 10.0.3(jiti@2.6.1) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): + dependencies: + eslint: 10.1.0(jiti@2.6.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-vue@10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.0.3(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.0.3(jiti@2.6.1))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) @@ -14145,11 +15870,30 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-yml@3.3.1(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@eslint/core': 1.1.1 + '@eslint/plugin-kit': 0.6.1 + '@ota-meshi/ast-token-store': 0.3.0 + debug: 4.4.3(supports-color@5.5.0) + diff-sequences: 29.6.3 + escape-string-regexp: 5.0.0 + eslint: 10.1.0(jiti@2.6.1) + natural-compare: 1.4.0 + yaml-eslint-parser: 2.0.0 + transitivePeerDependencies: + - supports-color + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.0.3(jiti@2.6.1)): dependencies: '@vue/compiler-sfc': 3.5.30 eslint: 10.0.3(jiti@2.6.1) + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1)): + dependencies: + '@vue/compiler-sfc': 3.5.30 + eslint: 10.1.0(jiti@2.6.1) + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -14371,6 +16115,17 @@ snapshots: extend@3.0.2: {} + extract-zip@2.0.1: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + optional: true + fast-check@3.23.2: dependencies: pure-rand: 6.1.0 @@ -14485,6 +16240,11 @@ snapshots: dependencies: format: 0.2.2 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + optional: true + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -14699,6 +16459,11 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + optional: true + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -14709,6 +16474,15 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.2.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + optional: true + giget@2.0.0: dependencies: citty: 0.1.6 @@ -14868,7 +16642,6 @@ snapshots: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - optional: true hashery@1.5.0: dependencies: @@ -14892,7 +16665,6 @@ snapshots: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - optional: true hookified@1.15.1: {} @@ -15010,6 +16782,9 @@ snapshots: dependencies: fp-ts: 2.16.11 + ip-address@10.1.0: + optional: true + ip-regex@4.3.0: {} ipaddr.js@1.9.1: {} @@ -15160,6 +16935,9 @@ snapshots: is-unicode-supported@0.1.0: {} + is-url@1.2.4: + optional: true + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -15171,6 +16949,13 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is2@2.0.9: + dependencies: + deep-is: 0.1.4 + ip-regex: 4.3.0 + is-url: 1.2.4 + optional: true + isarray@1.0.0: {} isarray@2.0.5: {} @@ -15224,7 +17009,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.15 + '@types/node': 24.12.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -15327,6 +17112,19 @@ snapshots: jsonpointer@5.0.1: {} + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.4 + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -15339,20 +17137,26 @@ snapshots: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - optional: true jwk-to-pem@2.0.7: dependencies: asn1.js: 5.4.1 elliptic: 6.6.1 safe-buffer: 5.2.1 - optional: true jws@4.0.1: dependencies: jwa: 2.0.1 safe-buffer: 5.2.1 - optional: true + + keycloak-connect@26.1.1: + dependencies: + jwk-to-pem: 2.0.7 + optionalDependencies: + chromedriver: 146.0.6 + transitivePeerDependencies: + - debug + - supports-color keycloak-js@26.2.3: {} @@ -15428,12 +17232,26 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.kebabcase@4.1.1: {} lodash.merge@4.6.2: {} lodash.mergewith@4.6.2: {} + lodash.once@4.1.1: {} + lodash.snakecase@4.1.1: {} lodash.sortby@4.7.0: {} @@ -15473,6 +17291,9 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@7.18.3: + optional: true + magic-regexp@0.10.0: dependencies: estree-walker: 3.0.3 @@ -15873,8 +17694,7 @@ snapshots: minimalistic-assert@1.0.1: {} - minimalistic-crypto-utils@1.0.1: - optional: true + minimalistic-crypto-utils@1.0.1: {} minimatch@10.2.4: dependencies: @@ -15915,6 +17735,9 @@ snapshots: mrmime@2.0.1: {} + ms@2.1.2: + optional: true + ms@2.1.3: {} msw@2.12.10(@types/node@22.19.15)(typescript@5.9.3): @@ -16029,6 +17852,12 @@ snapshots: neo-async@2.6.2: {} + nest-keycloak-connect@2.0.0-alpha.2(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.16)(keycloak-connect@26.1.1): + dependencies: + '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.16(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.16)(reflect-metadata@0.2.2)(rxjs@7.8.2) + keycloak-connect: 26.1.1 + nestjs-pino@4.6.0(@nestjs/common@11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.3.1)(rxjs@7.8.2): dependencies: '@nestjs/common': 11.1.16(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -16036,6 +17865,9 @@ snapshots: pino-http: 11.0.0 rxjs: 7.8.2 + netmask@2.0.2: + optional: true + node-abort-controller@3.1.1: {} node-domexception@1.0.0: {} @@ -16247,6 +18079,26 @@ snapshots: dependencies: p-limit: 3.1.0 + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + optional: true + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + optional: true + package-json-from-dist@1.0.1: {} package-manager-detector@1.6.0: {} @@ -16309,6 +18161,9 @@ snapshots: pathval@2.0.1: {} + pend@1.2.0: + optional: true + perfect-debounce@1.0.0: {} perfect-debounce@2.1.0: {} @@ -16528,8 +18383,25 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + optional: true + proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: + optional: true + pstree.remy@1.1.8: {} pump@3.0.4: @@ -17019,12 +18891,30 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + smart-buffer@4.2.0: + optional: true + smob@1.6.1: {} smtp-address-parser@1.1.0: dependencies: nearley: 2.20.1 + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + optional: true + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -17368,6 +19258,14 @@ snapshots: tapable@2.3.0: {} + tcp-port-used@1.0.2: + dependencies: + debug: 4.3.1 + is2: 2.0.9 + transitivePeerDependencies: + - supports-color + optional: true + temp-dir@2.0.0: {} tempy@0.6.0: @@ -17717,6 +19615,25 @@ snapshots: transitivePeerDependencies: - rollup + unimport@3.14.6(rollup@4.59.0): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + acorn: 8.16.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.1 + pathe: 2.0.3 + picomatch: 4.0.3 + pkg-types: 1.3.1 + scule: 1.3.0 + strip-literal: 2.1.1 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 @@ -17779,6 +19696,19 @@ snapshots: transitivePeerDependencies: - rollup + unplugin-auto-import@0.18.6(rollup@4.59.0): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.21 + minimatch: 9.0.9 + unimport: 3.14.6(rollup@4.59.0) + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 @@ -17803,6 +19733,25 @@ snapshots: - rollup - supports-color + unplugin-vue-components@0.27.5(@babel/parser@7.29.0)(rollup@4.59.0)(vue@3.5.30(typescript@5.9.3)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + chokidar: 3.6.0 + debug: 4.4.3(supports-color@5.5.0) + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.21 + minimatch: 9.0.9 + mlly: 1.8.1 + unplugin: 1.16.1 + vue: 3.5.30(typescript@5.9.3) + optionalDependencies: + '@babel/parser': 7.29.0 + transitivePeerDependencies: + - rollup + - supports-color + unplugin@1.16.1: dependencies: acorn: 8.16.0 @@ -17840,11 +19789,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validator@13.15.26: {} vary@1.1.2: {} @@ -18451,6 +20395,12 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + optional: true + yn@3.1.1: {} yocto-queue@0.1.0: {} @@ -18472,4 +20422,6 @@ snapshots: zod@3.25.76: {} + zod@4.3.6: {} + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 29db3b4101..9a62507208 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,6 +6,7 @@ trustPolicyExclude: - rollup@2.80.0 - semver@6.3.1 - chokidar@4.0.3 + - typescript-transform-paths@3.5.6 autoInstallPeers: true injectWorkspacePackages: true