diff --git a/adapters/analytics/persistence/inmemory/InMemoryAnalyticsSnapshotRepository.ts b/adapters/analytics/persistence/inmemory/InMemoryAnalyticsSnapshotRepository.ts index 7ea670cc8..0ef2f8179 100644 --- a/adapters/analytics/persistence/inmemory/InMemoryAnalyticsSnapshotRepository.ts +++ b/adapters/analytics/persistence/inmemory/InMemoryAnalyticsSnapshotRepository.ts @@ -6,13 +6,13 @@ import type { IAnalyticsSnapshotRepository } from '../../domain/repositories/IAnalyticsSnapshotRepository'; import { AnalyticsSnapshot, type SnapshotPeriod, type SnapshotEntityType } from '../../domain/entities/AnalyticsSnapshot'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/application'; export class InMemoryAnalyticsSnapshotRepository implements IAnalyticsSnapshotRepository { private snapshots: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger) { + constructor(logger: Logger) { this.logger = logger; this.logger.info('InMemoryAnalyticsSnapshotRepository initialized.'); } diff --git a/adapters/analytics/persistence/inmemory/InMemoryEngagementRepository.ts b/adapters/analytics/persistence/inmemory/InMemoryEngagementRepository.ts index f9aec315f..0721bc8bd 100644 --- a/adapters/analytics/persistence/inmemory/InMemoryEngagementRepository.ts +++ b/adapters/analytics/persistence/inmemory/InMemoryEngagementRepository.ts @@ -6,13 +6,14 @@ import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository'; import { EngagementEvent, type EngagementAction, type EngagementEntityType } from '../../domain/entities/EngagementEvent'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/application'; + export class InMemoryEngagementRepository implements IEngagementRepository { private events: Map = new Map(); - private logger: ILogger; + private logger: Logger; - constructor(logger: ILogger) { + constructor(logger: Logger) { this.logger = logger; this.logger.info('InMemoryEngagementRepository initialized.'); } diff --git a/adapters/analytics/persistence/inmemory/InMemoryPageViewRepository.ts b/adapters/analytics/persistence/inmemory/InMemoryPageViewRepository.ts index a91daa777..25b357d6f 100644 --- a/adapters/analytics/persistence/inmemory/InMemoryPageViewRepository.ts +++ b/adapters/analytics/persistence/inmemory/InMemoryPageViewRepository.ts @@ -6,13 +6,13 @@ import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; import { PageView, type EntityType } from '../../domain/entities/PageView'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/application'; export class InMemoryPageViewRepository implements IPageViewRepository { private pageViews: Map = new Map(); - private logger: ILogger; + private logger: Logger; - constructor(logger: ILogger) { + constructor(logger: Logger) { this.logger = logger; this.logger.info('InMemoryPageViewRepository initialized.'); } diff --git a/adapters/identity/persistence/inmemory/InMemoryAchievementRepository.ts b/adapters/identity/persistence/inmemory/InMemoryAchievementRepository.ts index 9070903fc..82db32d77 100644 --- a/adapters/identity/persistence/inmemory/InMemoryAchievementRepository.ts +++ b/adapters/identity/persistence/inmemory/InMemoryAchievementRepository.ts @@ -4,6 +4,7 @@ * In-memory implementation of IAchievementRepository */ +import { Logger } from '@gridpilot/core/shared/application'; import { Achievement, AchievementCategory, @@ -14,14 +15,13 @@ import { } from '../../domain/entities/Achievement'; import { UserAchievement } from '../../domain/entities/UserAchievement'; import type { IAchievementRepository } from '../../domain/repositories/IAchievementRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; export class InMemoryAchievementRepository implements IAchievementRepository { private achievements: Map = new Map(); private userAchievements: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger) { + constructor(logger: Logger) { this.logger = logger; this.logger.info('InMemoryAchievementRepository initialized.'); // Seed with predefined achievements diff --git a/adapters/identity/persistence/inmemory/InMemoryAuthRepository.ts b/adapters/identity/persistence/inmemory/InMemoryAuthRepository.ts index 3a4d74291..3521c981d 100644 --- a/adapters/identity/persistence/inmemory/InMemoryAuthRepository.ts +++ b/adapters/identity/persistence/inmemory/InMemoryAuthRepository.ts @@ -2,15 +2,16 @@ import { IAuthRepository } from '@gridpilot/core/identity/domain/repositories/IA import { IUserRepository, StoredUser } from '@gridpilot/core/identity/domain/repositories/IUserRepository'; import { IPasswordHashingService } from '@gridpilot/core/identity/domain/services/PasswordHashingService'; import { User } from '@gridpilot/core/identity/domain/entities/User'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; + import { EmailAddress } from '@gridpilot/core/identity/domain/value-objects/EmailAddress'; import { randomUUID } from 'crypto'; +import { Logger } from '@gridpilot/core/shared/application'; export class InMemoryAuthRepository implements IAuthRepository { constructor( private readonly userRepository: IUserRepository, private readonly passwordHashingService: IPasswordHashingService, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async findByEmail(email: EmailAddress): Promise { diff --git a/adapters/identity/persistence/inmemory/InMemorySponsorAccountRepository.ts b/adapters/identity/persistence/inmemory/InMemorySponsorAccountRepository.ts index aafef7f82..c8ae88595 100644 --- a/adapters/identity/persistence/inmemory/InMemorySponsorAccountRepository.ts +++ b/adapters/identity/persistence/inmemory/InMemorySponsorAccountRepository.ts @@ -7,13 +7,13 @@ import type { ISponsorAccountRepository } from '../../domain/repositories/ISponsorAccountRepository'; import type { SponsorAccount } from '../../domain/entities/SponsorAccount'; import type { UserId } from '../../domain/value-objects/UserId'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/application'; export class InMemorySponsorAccountRepository implements ISponsorAccountRepository { private accounts: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: SponsorAccount[]) { + constructor(logger: Logger, seedData?: SponsorAccount[]) { this.logger = logger; this.logger.info('InMemorySponsorAccountRepository initialized.'); if (seedData) { diff --git a/adapters/identity/persistence/inmemory/InMemoryUserRatingRepository.ts b/adapters/identity/persistence/inmemory/InMemoryUserRatingRepository.ts index c9d20cee0..025a8f9f3 100644 --- a/adapters/identity/persistence/inmemory/InMemoryUserRatingRepository.ts +++ b/adapters/identity/persistence/inmemory/InMemoryUserRatingRepository.ts @@ -6,13 +6,13 @@ import { UserRating } from '../../domain/value-objects/UserRating'; import type { IUserRatingRepository } from '../../domain/repositories/IUserRatingRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/application'; export class InMemoryUserRatingRepository implements IUserRatingRepository { private ratings: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: UserRating[]) { + constructor(logger: Logger, seedData?: UserRating[]) { this.logger = logger; this.logger.info('InMemoryUserRatingRepository initialized.'); if (seedData) { diff --git a/adapters/identity/persistence/inmemory/InMemoryUserRepository.ts b/adapters/identity/persistence/inmemory/InMemoryUserRepository.ts index 891c9d472..ce9227c13 100644 --- a/adapters/identity/persistence/inmemory/InMemoryUserRepository.ts +++ b/adapters/identity/persistence/inmemory/InMemoryUserRepository.ts @@ -4,15 +4,15 @@ * Stores users in memory for demo/development purposes. */ +import { Logger } from '@gridpilot/core/shared/application'; import type { IUserRepository, StoredUser } from '../../domain/repositories/IUserRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; export class InMemoryUserRepository implements IUserRepository { private users: Map = new Map(); private emailIndex: Map = new Map(); // email -> userId - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, initialUsers: StoredUser[] = []) { + constructor(logger: Logger, initialUsers: StoredUser[] = []) { this.logger = logger; this.logger.info('InMemoryUserRepository initialized.'); for (const user of initialUsers) { diff --git a/adapters/identity/session/CookieIdentitySessionAdapter.ts b/adapters/identity/session/CookieIdentitySessionAdapter.ts index c4978304f..5993f35ef 100644 --- a/adapters/identity/session/CookieIdentitySessionAdapter.ts +++ b/adapters/identity/session/CookieIdentitySessionAdapter.ts @@ -4,15 +4,15 @@ * Manages user session using cookies. This is a placeholder implementation. */ -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; import type { AuthenticatedUserDTO } from '@gridpilot/core/identity/application/dto/AuthenticatedUserDTO'; import type { AuthSessionDTO } from '@gridpilot/core/identity/application/dto/AuthSessionDTO'; import type { IdentitySessionPort } from '@gridpilot/core/identity/application/ports/IdentitySessionPort'; +import { Logger } from '@gridpilot/core/shared/application'; export class CookieIdentitySessionAdapter implements IdentitySessionPort { private currentSession: AuthSessionDTO | null = null; - constructor(private readonly logger: ILogger) { + constructor(private readonly logger: Logger) { this.logger.info('CookieIdentitySessionAdapter initialized.'); // In a real application, you would load the session from a cookie here // For demo, we'll start with no session. diff --git a/adapters/logging/ConsoleLogger.ts b/adapters/logging/ConsoleLogger.ts index 22f184f84..40efbdaaf 100644 --- a/adapters/logging/ConsoleLogger.ts +++ b/adapters/logging/ConsoleLogger.ts @@ -1,6 +1,6 @@ -import { ILogger } from './ILogger'; +import { Logger } from "@gridpilot/core/shared/application"; -export class ConsoleLogger implements ILogger { +export class ConsoleLogger implements Logger { debug(message: string, ...args: any[]): void { console.debug(message, ...args); } diff --git a/adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository.ts b/adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository.ts index 3ed58fae9..dd0bbc432 100644 --- a/adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository.ts +++ b/adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository.ts @@ -1,12 +1,12 @@ import { IAvatarGenerationRepository } from '@gridpilot/core/media/domain/repositories/IAvatarGenerationRepository'; import { AvatarGenerationRequest } from '@gridpilot/core/media/domain/entities/AvatarGenerationRequest'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/application'; export class InMemoryAvatarGenerationRepository implements IAvatarGenerationRepository { private requests: Map = new Map(); // Key: requestId private userRequests: Map = new Map(); // Key: userId - constructor(private readonly logger: ILogger, initialRequests: AvatarGenerationRequest[] = []) { + constructor(private readonly logger: Logger, initialRequests: AvatarGenerationRequest[] = []) { this.logger.info('InMemoryAvatarGenerationRepository initialized.'); for (const req of initialRequests) { this.requests.set(req.id, req); diff --git a/adapters/media/ports/InMemoryFaceValidationAdapter.ts b/adapters/media/ports/InMemoryFaceValidationAdapter.ts index 9d2d5214c..ef03f29bf 100644 --- a/adapters/media/ports/InMemoryFaceValidationAdapter.ts +++ b/adapters/media/ports/InMemoryFaceValidationAdapter.ts @@ -1,8 +1,8 @@ import type { FaceValidationPort, FaceValidationResult } from '@gridpilot/core/media/application/ports/FaceValidationPort'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryFaceValidationAdapter implements FaceValidationPort { - constructor(private readonly logger: ILogger) { + constructor(private readonly logger: Logger) { this.logger.info('InMemoryFaceValidationAdapter initialized.'); } diff --git a/adapters/media/ports/InMemoryImageServiceAdapter.ts b/adapters/media/ports/InMemoryImageServiceAdapter.ts index f3ef8da42..e59c60d8f 100644 --- a/adapters/media/ports/InMemoryImageServiceAdapter.ts +++ b/adapters/media/ports/InMemoryImageServiceAdapter.ts @@ -1,8 +1,8 @@ import type { IImageServicePort } from '@gridpilot/racing/application/ports/IImageServicePort'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryImageServiceAdapter implements IImageServicePort { - constructor(private readonly logger: ILogger) { + constructor(private readonly logger: Logger) { this.logger.info('InMemoryImageServiceAdapter initialized.'); } diff --git a/adapters/notifications/persistence/inmemory/InMemoryNotificationPreferenceRepository.ts b/adapters/notifications/persistence/inmemory/InMemoryNotificationPreferenceRepository.ts index c528615e1..85cb34f80 100644 --- a/adapters/notifications/persistence/inmemory/InMemoryNotificationPreferenceRepository.ts +++ b/adapters/notifications/persistence/inmemory/InMemoryNotificationPreferenceRepository.ts @@ -1,11 +1,11 @@ import { INotificationPreferenceRepository } from '@gridpilot/core/notifications/domain/repositories/INotificationPreferenceRepository'; import { NotificationPreference } from '@gridpilot/core/notifications/domain/entities/NotificationPreference'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryNotificationPreferenceRepository implements INotificationPreferenceRepository { private preferences: Map = new Map(); - constructor(private readonly logger: ILogger, initialPreferences: NotificationPreference[] = []) { + constructor(private readonly logger: Logger, initialPreferences: NotificationPreference[] = []) { this.logger.info('InMemoryNotificationPreferenceRepository initialized.'); for (const pref of initialPreferences) { this.preferences.set(pref.id, pref); diff --git a/adapters/notifications/persistence/inmemory/InMemoryNotificationRepository.ts b/adapters/notifications/persistence/inmemory/InMemoryNotificationRepository.ts index 4779ecdd8..243418b37 100644 --- a/adapters/notifications/persistence/inmemory/InMemoryNotificationRepository.ts +++ b/adapters/notifications/persistence/inmemory/InMemoryNotificationRepository.ts @@ -7,13 +7,13 @@ import { Notification } from '../../domain/entities/Notification'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; import type { NotificationType } from '../../domain/types/NotificationTypes'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryNotificationRepository implements INotificationRepository { private notifications: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, initialNotifications: Notification[] = []) { + constructor(logger: Logger, initialNotifications: Notification[] = []) { this.logger = logger; this.logger.info('InMemoryNotificationRepository initialized.'); initialNotifications.forEach(notification => { diff --git a/adapters/racing/persistence/inmemory/InMemoryCarRepository.ts b/adapters/racing/persistence/inmemory/InMemoryCarRepository.ts index a9f651500..e6e1ff500 100644 --- a/adapters/racing/persistence/inmemory/InMemoryCarRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryCarRepository.ts @@ -8,13 +8,13 @@ import { v4 as uuidv4 } from 'uuid'; import { Car, CarClass, CarLicense } from '@gridpilot/racing/domain/entities/Car'; import type { ICarRepository } from '@gridpilot/racing/domain/repositories/ICarRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryCarRepository implements ICarRepository { private cars: Map; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Car[]) { + constructor(logger: Logger, seedData?: Car[]) { this.logger = logger; this.cars = new Map(); diff --git a/adapters/racing/persistence/inmemory/InMemoryDriverRepository.ts b/adapters/racing/persistence/inmemory/InMemoryDriverRepository.ts index e11a8eb6f..954b1aef9 100644 --- a/adapters/racing/persistence/inmemory/InMemoryDriverRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryDriverRepository.ts @@ -1,12 +1,12 @@ import { IDriverRepository } from '@gridpilot/racing/domain/repositories/IDriverRepository'; import { Driver } from '@gridpilot/racing/domain/entities/Driver'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryDriverRepository implements IDriverRepository { private drivers: Map = new Map(); private iracingIdIndex: Map = new Map(); // iracingId -> driverId - constructor(private readonly logger: ILogger, initialDrivers: Driver[] = []) { + constructor(private readonly logger: Logger, initialDrivers: Driver[] = []) { this.logger.info('InMemoryDriverRepository initialized.'); for (const driver of initialDrivers) { this.drivers.set(driver.id, driver); diff --git a/adapters/racing/persistence/inmemory/InMemoryGameRepository.ts b/adapters/racing/persistence/inmemory/InMemoryGameRepository.ts index 37b89c6e2..fbf25d179 100644 --- a/adapters/racing/persistence/inmemory/InMemoryGameRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryGameRepository.ts @@ -1,11 +1,11 @@ import { IGameRepository } from '@gridpilot/racing/domain/repositories/IGameRepository'; import { Game } from '@gridpilot/racing/domain/entities/Game'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryGameRepository implements IGameRepository { private games: Map = new Map(); - constructor(private readonly logger: ILogger, initialGames: Game[] = []) { + constructor(private readonly logger: Logger, initialGames: Game[] = []) { this.logger.info('InMemoryGameRepository initialized.'); for (const game of initialGames) { this.games.set(game.id, game); diff --git a/adapters/racing/persistence/inmemory/InMemoryLeagueMembershipRepository.ts b/adapters/racing/persistence/inmemory/InMemoryLeagueMembershipRepository.ts index eecb67ad4..8dcfa2f29 100644 --- a/adapters/racing/persistence/inmemory/InMemoryLeagueMembershipRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryLeagueMembershipRepository.ts @@ -1,12 +1,12 @@ import { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; import { LeagueMembership, JoinRequest } from '@gridpilot/racing/domain/entities/LeagueMembership'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryLeagueMembershipRepository implements ILeagueMembershipRepository { private memberships: Map = new Map(); // Key: `${leagueId}:${driverId}` private joinRequests: Map = new Map(); // Key: requestId - constructor(private readonly logger: ILogger, initialMemberships: LeagueMembership[] = [], initialJoinRequests: JoinRequest[] = []) { + constructor(private readonly logger: Logger, initialMemberships: LeagueMembership[] = [], initialJoinRequests: JoinRequest[] = []) { this.logger.info('InMemoryLeagueMembershipRepository initialized.'); for (const membership of initialMemberships) { this.memberships.set(`${membership.leagueId}:${membership.driverId}`, membership); diff --git a/adapters/racing/persistence/inmemory/InMemoryLeagueRepository.ts b/adapters/racing/persistence/inmemory/InMemoryLeagueRepository.ts index b2c72f547..323072a2e 100644 --- a/adapters/racing/persistence/inmemory/InMemoryLeagueRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryLeagueRepository.ts @@ -1,11 +1,11 @@ import { ILeagueRepository } from '@gridpilot/core/racing/domain/repositories/ILeagueRepository'; import { League } from '@gridpilot/core/racing/domain/entities/League'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryLeagueRepository implements ILeagueRepository { private leagues: Map = new Map(); - constructor(private readonly logger: ILogger, initialLeagues: League[] = []) { + constructor(private readonly logger: Logger, initialLeagues: League[] = []) { this.logger.info('InMemoryLeagueRepository initialized.'); for (const league of initialLeagues) { this.leagues.set(league.id, league); diff --git a/adapters/racing/persistence/inmemory/InMemoryLeagueScoringConfigRepository.ts b/adapters/racing/persistence/inmemory/InMemoryLeagueScoringConfigRepository.ts index 05cd27ecf..02327f52a 100644 --- a/adapters/racing/persistence/inmemory/InMemoryLeagueScoringConfigRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryLeagueScoringConfigRepository.ts @@ -1,11 +1,11 @@ import { ILeagueScoringConfigRepository } from '@gridpilot/racing/domain/repositories/ILeagueScoringConfigRepository'; import { LeagueScoringConfig } from '@gridpilot/racing/domain/entities/LeagueScoringConfig'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryLeagueScoringConfigRepository implements ILeagueScoringConfigRepository { private configs: Map = new Map(); // Key: seasonId - constructor(private readonly logger: ILogger, initialConfigs: LeagueScoringConfig[] = []) { + constructor(private readonly logger: Logger, initialConfigs: LeagueScoringConfig[] = []) { this.logger.info('InMemoryLeagueScoringConfigRepository initialized.'); for (const config of initialConfigs) { this.configs.set(config.seasonId, config); diff --git a/adapters/racing/persistence/inmemory/InMemoryLeagueStandingsRepository.ts b/adapters/racing/persistence/inmemory/InMemoryLeagueStandingsRepository.ts index 844800f84..cc28504eb 100644 --- a/adapters/racing/persistence/inmemory/InMemoryLeagueStandingsRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryLeagueStandingsRepository.ts @@ -1,10 +1,10 @@ import { ILeagueStandingsRepository, RawStanding } from '@gridpilot/core/league/application/ports/ILeagueStandingsRepository'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryLeagueStandingsRepository implements ILeagueStandingsRepository { private standings: Map = new Map(); // Key: leagueId - constructor(private readonly logger: ILogger, initialStandings: Record = {}) { + constructor(private readonly logger: Logger, initialStandings: Record = {}) { this.logger.info('InMemoryLeagueStandingsRepository initialized.'); for (const leagueId in initialStandings) { // Ensure initialStandings[leagueId] is not undefined before setting diff --git a/adapters/racing/persistence/inmemory/InMemoryLeagueWalletRepository.ts b/adapters/racing/persistence/inmemory/InMemoryLeagueWalletRepository.ts index 9dbb16668..47c6e13cc 100644 --- a/adapters/racing/persistence/inmemory/InMemoryLeagueWalletRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryLeagueWalletRepository.ts @@ -6,13 +6,13 @@ import type { LeagueWallet } from '../../domain/entities/LeagueWallet'; import type { ILeagueWalletRepository } from '../../domain/repositories/ILeagueWalletRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryLeagueWalletRepository implements ILeagueWalletRepository { private wallets: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: LeagueWallet[]) { + constructor(logger: Logger, seedData?: LeagueWallet[]) { this.logger = logger; this.logger.info('InMemoryLeagueWalletRepository initialized.'); if (seedData) { diff --git a/adapters/racing/persistence/inmemory/InMemoryLiveryRepository.ts b/adapters/racing/persistence/inmemory/InMemoryLiveryRepository.ts index 2450c316f..06a093c27 100644 --- a/adapters/racing/persistence/inmemory/InMemoryLiveryRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryLiveryRepository.ts @@ -7,14 +7,14 @@ import type { DriverLivery } from '../../domain/entities/DriverLivery'; import type { LiveryTemplate } from '../../domain/entities/LiveryTemplate'; import type { ILiveryRepository } from '../../domain/repositories/ILiveryRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryLiveryRepository implements ILiveryRepository { private driverLiveries: Map = new Map(); private templates: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedDriverLiveries?: DriverLivery[], seedTemplates?: LiveryTemplate[]) { + constructor(logger: Logger, seedDriverLiveries?: DriverLivery[], seedTemplates?: LiveryTemplate[]) { this.logger = logger; this.logger.info('InMemoryLiveryRepository initialized.'); if (seedDriverLiveries) { diff --git a/adapters/racing/persistence/inmemory/InMemoryPenaltyRepository.ts b/adapters/racing/persistence/inmemory/InMemoryPenaltyRepository.ts index e914849fd..2469548bc 100644 --- a/adapters/racing/persistence/inmemory/InMemoryPenaltyRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryPenaltyRepository.ts @@ -6,13 +6,13 @@ import type { Penalty } from '../../domain/entities/Penalty'; import type { IPenaltyRepository } from '../../domain/repositories/IPenaltyRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryPenaltyRepository implements IPenaltyRepository { private penalties: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, initialPenalties: Penalty[] = []) { + constructor(logger: Logger, initialPenalties: Penalty[] = []) { this.logger = logger; this.logger.info('InMemoryPenaltyRepository initialized.'); initialPenalties.forEach(penalty => { diff --git a/adapters/racing/persistence/inmemory/InMemoryProtestRepository.ts b/adapters/racing/persistence/inmemory/InMemoryProtestRepository.ts index 8256cbefc..31c1bbb1b 100644 --- a/adapters/racing/persistence/inmemory/InMemoryProtestRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryProtestRepository.ts @@ -1,11 +1,11 @@ import { IProtestRepository } from '@gridpilot/racing/domain/repositories/IProtestRepository'; import { Protest, ProtestStatus } from '@gridpilot/racing/domain/entities/Protest'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryProtestRepository implements IProtestRepository { private protests: Map = new Map(); - constructor(private readonly logger: ILogger, initialProtests: Protest[] = []) { + constructor(private readonly logger: Logger, initialProtests: Protest[] = []) { this.logger.info('InMemoryProtestRepository initialized.'); for (const protest of initialProtests) { this.protests.set(protest.id, protest); diff --git a/adapters/racing/persistence/inmemory/InMemoryRaceEventRepository.ts b/adapters/racing/persistence/inmemory/InMemoryRaceEventRepository.ts index a6ef36197..bbc0b205c 100644 --- a/adapters/racing/persistence/inmemory/InMemoryRaceEventRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryRaceEventRepository.ts @@ -3,13 +3,13 @@ */ import type { IRaceEventRepository } from '../../domain/repositories/IRaceEventRepository'; import type { RaceEvent } from '../../domain/entities/RaceEvent'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryRaceEventRepository implements IRaceEventRepository { private raceEvents: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: RaceEvent[]) { + constructor(logger: Logger, seedData?: RaceEvent[]) { this.logger = logger; this.logger.info('InMemoryRaceEventRepository initialized.'); if (seedData) { diff --git a/adapters/racing/persistence/inmemory/InMemoryRaceRegistrationRepository.ts b/adapters/racing/persistence/inmemory/InMemoryRaceRegistrationRepository.ts index 73f9b8fe5..d946e8084 100644 --- a/adapters/racing/persistence/inmemory/InMemoryRaceRegistrationRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryRaceRegistrationRepository.ts @@ -1,11 +1,11 @@ import { IRaceRegistrationRepository } from '@gridpilot/racing/domain/repositories/IRaceRegistrationRepository'; import { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryRaceRegistrationRepository implements IRaceRegistrationRepository { private registrations: Map = new Map(); // Key: `${raceId}:${driverId}` - constructor(private readonly logger: ILogger, initialRegistrations: RaceRegistration[] = []) { + constructor(private readonly logger: Logger, initialRegistrations: RaceRegistration[] = []) { this.logger.info('InMemoryRaceRegistrationRepository initialized.'); for (const reg of initialRegistrations) { this.registrations.set(reg.id, reg); diff --git a/adapters/racing/persistence/inmemory/InMemoryRaceRepository.ts b/adapters/racing/persistence/inmemory/InMemoryRaceRepository.ts index f9d358100..1ffc7cdc3 100644 --- a/adapters/racing/persistence/inmemory/InMemoryRaceRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryRaceRepository.ts @@ -1,11 +1,11 @@ import { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository'; import { Race, RaceStatus } from '@gridpilot/racing/domain/entities/Race'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryRaceRepository implements IRaceRepository { private races: Map = new Map(); - constructor(private readonly logger: ILogger, initialRaces: Race[] = []) { + constructor(private readonly logger: Logger, initialRaces: Race[] = []) { this.logger.info('InMemoryRaceRepository initialized.'); for (const race of initialRaces) { this.races.set(race.id, race); diff --git a/adapters/racing/persistence/inmemory/InMemoryResultRepository.ts b/adapters/racing/persistence/inmemory/InMemoryResultRepository.ts index 9fe6614c8..7cef2aa20 100644 --- a/adapters/racing/persistence/inmemory/InMemoryResultRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryResultRepository.ts @@ -9,14 +9,14 @@ import { v4 as uuidv4 } from 'uuid'; import { Result } from '@gridpilot/racing/domain/entities/Result'; import type { IResultRepository } from '@gridpilot/racing/domain/repositories/IResultRepository'; import type { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryResultRepository implements IResultRepository { private results: Map; private raceRepository: IRaceRepository | null; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Result[], raceRepository?: IRaceRepository | null) { + constructor(logger: Logger, seedData?: Result[], raceRepository?: IRaceRepository | null) { this.logger = logger; this.logger.info('InMemoryResultRepository initialized.'); this.results = new Map(); diff --git a/adapters/racing/persistence/inmemory/InMemoryScoringRepositories.ts b/adapters/racing/persistence/inmemory/InMemoryScoringRepositories.ts index 1c69e35b9..fac09952c 100644 --- a/adapters/racing/persistence/inmemory/InMemoryScoringRepositories.ts +++ b/adapters/racing/persistence/inmemory/InMemoryScoringRepositories.ts @@ -13,9 +13,9 @@ import type { IChampionshipStandingRepository } from '@gridpilot/racing/domain/r import { ChampionshipStanding } from '@gridpilot/racing/domain/entities/ChampionshipStanding'; import type { ChampionshipType } from '@gridpilot/racing/domain/types/ChampionshipType'; import type { ParticipantRef } from '@gridpilot/racing/domain/types/ParticipantRef'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; -class SilentLogger implements ILogger { +class SilentLogger implements Logger { debug(..._args: unknown[]): void { // console.debug(..._args); } @@ -264,9 +264,9 @@ export function getLeagueScoringPresetById( export class InMemoryGameRepository implements IGameRepository { private games: Game[]; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Game[]) { + constructor(logger: Logger, seedData?: Game[]) { this.logger = logger; this.logger.info('InMemoryGameRepository initialized.'); this.games = seedData ? [...seedData] : []; @@ -314,9 +314,9 @@ export class InMemoryGameRepository implements IGameRepository { export class InMemorySeasonRepository implements ISeasonRepository { private seasons: Season[]; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Season[]) { + constructor(logger: Logger, seedData?: Season[]) { this.logger = logger; this.logger.info('InMemorySeasonRepository initialized.'); this.seasons = seedData ? [...seedData] : []; @@ -433,9 +433,9 @@ export class InMemoryLeagueScoringConfigRepository implements ILeagueScoringConfigRepository { private configs: LeagueScoringConfig[]; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: LeagueScoringConfig[]) { + constructor(logger: Logger, seedData?: LeagueScoringConfig[]) { this.logger = logger; this.logger.info('InMemoryLeagueScoringConfigRepository initialized.'); this.configs = seedData ? [...seedData] : []; @@ -493,9 +493,9 @@ export class InMemoryChampionshipStandingRepository implements IChampionshipStandingRepository { private standings: ChampionshipStanding[] = []; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: ChampionshipStanding[]) { + constructor(logger: Logger, seedData?: ChampionshipStanding[]) { this.logger = logger; this.logger.info('InMemoryChampionshipStandingRepository initialized.'); this.standings = seedData ? [...seedData] : []; diff --git a/adapters/racing/persistence/inmemory/InMemorySeasonRepository.ts b/adapters/racing/persistence/inmemory/InMemorySeasonRepository.ts index 27f95ef88..3703085ca 100644 --- a/adapters/racing/persistence/inmemory/InMemorySeasonRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemorySeasonRepository.ts @@ -1,11 +1,11 @@ import { ISeasonRepository } from '@gridpilot/racing/domain/repositories/ISeasonRepository'; import { Season } from '@gridpilot/racing/domain/entities/Season'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemorySeasonRepository implements ISeasonRepository { private seasons: Map = new Map(); // Key: seasonId - constructor(private readonly logger: ILogger, initialSeasons: Season[] = []) { + constructor(private readonly logger: Logger, initialSeasons: Season[] = []) { this.logger.info('InMemorySeasonRepository initialized.'); for (const season of initialSeasons) { this.seasons.set(season.id, season); diff --git a/adapters/racing/persistence/inmemory/InMemorySeasonSponsorshipRepository.ts b/adapters/racing/persistence/inmemory/InMemorySeasonSponsorshipRepository.ts index 8790085cb..4c16ac9fb 100644 --- a/adapters/racing/persistence/inmemory/InMemorySeasonSponsorshipRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemorySeasonSponsorshipRepository.ts @@ -6,13 +6,13 @@ import type { SeasonSponsorship, SponsorshipTier } from '../../domain/entities/SeasonSponsorship'; import type { ISeasonSponsorshipRepository } from '../../domain/repositories/ISeasonSponsorshipRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemorySeasonSponsorshipRepository implements ISeasonSponsorshipRepository { private sponsorships: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: SeasonSponsorship[]) { + constructor(logger: Logger, seedData?: SeasonSponsorship[]) { this.logger = logger; this.logger.info('InMemorySeasonSponsorshipRepository initialized.'); if (seedData) { diff --git a/adapters/racing/persistence/inmemory/InMemorySessionRepository.ts b/adapters/racing/persistence/inmemory/InMemorySessionRepository.ts index 29c837cca..b73b133f7 100644 --- a/adapters/racing/persistence/inmemory/InMemorySessionRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemorySessionRepository.ts @@ -3,13 +3,13 @@ */ import type { ISessionRepository } from '../../domain/repositories/ISessionRepository'; import type { Session } from '../../domain/entities/Session'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemorySessionRepository implements ISessionRepository { private sessions: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Session[]) { + constructor(logger: Logger, seedData?: Session[]) { this.logger = logger; this.logger.info('InMemorySessionRepository initialized.'); if (seedData) { diff --git a/adapters/racing/persistence/inmemory/InMemorySponsorRepository.ts b/adapters/racing/persistence/inmemory/InMemorySponsorRepository.ts index 89fb4ea93..112cf0007 100644 --- a/adapters/racing/persistence/inmemory/InMemorySponsorRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemorySponsorRepository.ts @@ -1,12 +1,12 @@ import { ISponsorRepository } from '@gridpilot/core/racing/domain/repositories/ISponsorRepository'; import { Sponsor } from '@gridpilot/core/racing/domain/entities/Sponsor'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemorySponsorRepository implements ISponsorRepository { private sponsors: Map = new Map(); private emailIndex: Map = new Map(); // contactEmail -> sponsorId - constructor(private readonly logger: ILogger, initialSponsors: Sponsor[] = []) { + constructor(private readonly logger: Logger, initialSponsors: Sponsor[] = []) { this.logger.info('InMemorySponsorRepository initialized.'); for (const sponsor of initialSponsors) { this.sponsors.set(sponsor.id, sponsor); diff --git a/adapters/racing/persistence/inmemory/InMemorySponsorshipPricingRepository.ts b/adapters/racing/persistence/inmemory/InMemorySponsorshipPricingRepository.ts index d37258e5a..72daee4ba 100644 --- a/adapters/racing/persistence/inmemory/InMemorySponsorshipPricingRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemorySponsorshipPricingRepository.ts @@ -5,7 +5,7 @@ import type { ISponsorshipPricingRepository } from '../../domain/repositories/ISponsorshipPricingRepository'; import { SponsorshipPricing } from '../../domain/value-objects/SponsorshipPricing'; import type { SponsorableEntityType } from '../../domain/entities/SponsorshipRequest'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; interface StorageKey { entityType: SponsorableEntityType; @@ -14,9 +14,9 @@ interface StorageKey { export class InMemorySponsorshipPricingRepository implements ISponsorshipPricingRepository { private pricings: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Array<{ entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }>) { + constructor(logger: Logger, seedData?: Array<{ entityType: SponsorableEntityType; entityId: string; pricing: SponsorshipPricing }>) { this.logger = logger; this.logger.info('InMemorySponsorshipPricingRepository initialized.'); if (seedData) { diff --git a/adapters/racing/persistence/inmemory/InMemorySponsorshipRequestRepository.ts b/adapters/racing/persistence/inmemory/InMemorySponsorshipRequestRepository.ts index 5a060419e..4814c9be3 100644 --- a/adapters/racing/persistence/inmemory/InMemorySponsorshipRequestRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemorySponsorshipRequestRepository.ts @@ -1,11 +1,11 @@ import { ISponsorshipRequestRepository } from '@gridpilot/racing/domain/repositories/ISponsorshipRequestRepository'; import { SponsorshipRequest, SponsorableEntityType, SponsorshipRequestStatus } from '@gridpilot/racing/domain/entities/SponsorshipRequest'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemorySponsorshipRequestRepository implements ISponsorshipRequestRepository { private requests: Map = new Map(); - constructor(private readonly logger: ILogger, initialRequests: SponsorshipRequest[] = []) { + constructor(private readonly logger: Logger, initialRequests: SponsorshipRequest[] = []) { this.logger.info('InMemorySponsorshipRequestRepository initialized.'); for (const req of initialRequests) { this.requests.set(req.id, req); diff --git a/adapters/racing/persistence/inmemory/InMemoryStandingRepository.ts b/adapters/racing/persistence/inmemory/InMemoryStandingRepository.ts index beab358dc..157857a05 100644 --- a/adapters/racing/persistence/inmemory/InMemoryStandingRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryStandingRepository.ts @@ -10,7 +10,7 @@ import type { IStandingRepository } from '@gridpilot/racing/domain/repositories/ import type { IResultRepository } from '@gridpilot/racing/domain/repositories/IResultRepository'; import type { IRaceRepository } from '@gridpilot/racing/domain/repositories/IRaceRepository'; import type { ILeagueRepository } from '@gridpilot/racing/domain/repositories/ILeagueRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; /** * Points systems presets @@ -32,10 +32,10 @@ export class InMemoryStandingRepository implements IStandingRepository { private resultRepository: IResultRepository | null; private raceRepository: IRaceRepository | null; private leagueRepository: ILeagueRepository | null; - private readonly logger: ILogger; + private readonly logger: Logger; constructor( - logger: ILogger, + logger: Logger, seedData?: Standing[], resultRepository?: IResultRepository | null, raceRepository?: IRaceRepository | null, diff --git a/adapters/racing/persistence/inmemory/InMemoryTeamMembershipRepository.ts b/adapters/racing/persistence/inmemory/InMemoryTeamMembershipRepository.ts index d15eaa068..61825b34f 100644 --- a/adapters/racing/persistence/inmemory/InMemoryTeamMembershipRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryTeamMembershipRepository.ts @@ -10,14 +10,14 @@ import type { TeamJoinRequest, } from '@gridpilot/racing/domain/types/TeamMembership'; import type { ITeamMembershipRepository } from '@gridpilot/racing/domain/repositories/ITeamMembershipRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryTeamMembershipRepository implements ITeamMembershipRepository { private membershipsByTeam: Map; private joinRequestsByTeam: Map; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedMemberships?: TeamMembership[], seedJoinRequests?: TeamJoinRequest[]) { + constructor(logger: Logger, seedMemberships?: TeamMembership[], seedJoinRequests?: TeamJoinRequest[]) { this.logger = logger; this.logger.info('InMemoryTeamMembershipRepository initialized.'); this.membershipsByTeam = new Map(); diff --git a/adapters/racing/persistence/inmemory/InMemoryTeamRepository.ts b/adapters/racing/persistence/inmemory/InMemoryTeamRepository.ts index ac5216308..917c96861 100644 --- a/adapters/racing/persistence/inmemory/InMemoryTeamRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryTeamRepository.ts @@ -7,13 +7,13 @@ import type { Team } from '@gridpilot/racing/domain/entities/Team'; import type { ITeamRepository } from '@gridpilot/racing/domain/repositories/ITeamRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryTeamRepository implements ITeamRepository { private teams: Map; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Team[]) { + constructor(logger: Logger, seedData?: Team[]) { this.logger = logger; this.logger.info('InMemoryTeamRepository initialized.'); this.teams = new Map(); diff --git a/adapters/racing/persistence/inmemory/InMemoryTrackRepository.ts b/adapters/racing/persistence/inmemory/InMemoryTrackRepository.ts index fd897cf57..7ab384406 100644 --- a/adapters/racing/persistence/inmemory/InMemoryTrackRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryTrackRepository.ts @@ -8,13 +8,13 @@ import { v4 as uuidv4 } from 'uuid'; import { Track, TrackCategory } from '@gridpilot/racing/domain/entities/Track'; import type { ITrackRepository } from '@gridpilot/racing/domain/repositories/ITrackRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryTrackRepository implements ITrackRepository { private tracks: Map; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Track[]) { + constructor(logger: Logger, seedData?: Track[]) { this.logger = logger; this.logger.info('InMemoryTrackRepository initialized.'); this.tracks = new Map(); diff --git a/adapters/racing/persistence/inmemory/InMemoryTransactionRepository.ts b/adapters/racing/persistence/inmemory/InMemoryTransactionRepository.ts index cb4cae45a..eb3db9eba 100644 --- a/adapters/racing/persistence/inmemory/InMemoryTransactionRepository.ts +++ b/adapters/racing/persistence/inmemory/InMemoryTransactionRepository.ts @@ -6,13 +6,13 @@ import type { Transaction, TransactionType } from '../../domain/entities/Transaction'; import type { ITransactionRepository } from '../../domain/repositories/ITransactionRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryTransactionRepository implements ITransactionRepository { private transactions: Map = new Map(); - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seedData?: Transaction[]) { + constructor(logger: Logger, seedData?: Transaction[]) { this.logger = logger; this.logger.info('InMemoryTransactionRepository initialized.'); if (seedData) { diff --git a/adapters/racing/ports/InMemoryDriverRatingProvider.ts b/adapters/racing/ports/InMemoryDriverRatingProvider.ts index c4466a5b3..8d2a508c4 100644 --- a/adapters/racing/ports/InMemoryDriverRatingProvider.ts +++ b/adapters/racing/ports/InMemoryDriverRatingProvider.ts @@ -1,8 +1,8 @@ import type { DriverRatingProvider } from '@gridpilot/racing/application/ports/DriverRatingProvider'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryDriverRatingProvider implements DriverRatingProvider { - constructor(private readonly logger: ILogger) { + constructor(private readonly logger: Logger) { this.logger.info('InMemoryDriverRatingProvider initialized.'); } diff --git a/adapters/racing/services/InMemoryDriverStatsService.ts b/adapters/racing/services/InMemoryDriverStatsService.ts index e8d2a08f7..a388e9f20 100644 --- a/adapters/racing/services/InMemoryDriverStatsService.ts +++ b/adapters/racing/services/InMemoryDriverStatsService.ts @@ -1,8 +1,8 @@ import type { IDriverStatsService, DriverStats } from '@gridpilot/racing/domain/services/IDriverStatsService'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryDriverStatsService implements IDriverStatsService { - constructor(private readonly logger: ILogger) { + constructor(private readonly logger: Logger) { this.logger.info('InMemoryDriverStatsService initialized.'); } diff --git a/adapters/racing/services/InMemoryRankingService.ts b/adapters/racing/services/InMemoryRankingService.ts index a6557010f..3f666adaa 100644 --- a/adapters/racing/services/InMemoryRankingService.ts +++ b/adapters/racing/services/InMemoryRankingService.ts @@ -1,8 +1,8 @@ import type { IRankingService, DriverRanking } from '@gridpilot/racing/domain/services/IRankingService'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export class InMemoryRankingService implements IRankingService { - constructor(private readonly logger: ILogger) { + constructor(private readonly logger: Logger) { this.logger.info('InMemoryRankingService initialized.'); } diff --git a/apps/api/package.json b/apps/api/package.json index 28b259de6..ff0b031fc 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -21,10 +21,12 @@ "@nestjs/common": "^10.4.20", "@nestjs/core": "^10.4.20", "@nestjs/platform-express": "^10.4.20", - "@nestjs/swagger": "^7.4.2", + "@nestjs/swagger": "^11.2.3", "@nestjs/typeorm": "^10.0.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", + "electron": "39.2.7", + "next": "15.5.9", "pg": "^8.12.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", diff --git a/apps/api/src/modules/analytics/AnalyticsModule.ts b/apps/api/src/modules/analytics/AnalyticsModule.ts index 56f0baac4..e2f142f71 100644 --- a/apps/api/src/modules/analytics/AnalyticsModule.ts +++ b/apps/api/src/modules/analytics/AnalyticsModule.ts @@ -2,11 +2,11 @@ import { Module } from '@nestjs/common'; import { AnalyticsController } from './AnalyticsController'; import { AnalyticsService } from './AnalyticsService'; -const ILogger_TOKEN = 'ILogger_TOKEN'; +const Logger_TOKEN = 'Logger_TOKEN'; const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN'; const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; import { IPageViewRepository } from '@gridpilot/analytics/application/repositories/IPageViewRepository'; import { IEngagementRepository } from '@gridpilot/analytics/domain/repositories/IEngagementRepository'; @@ -20,7 +20,7 @@ import { InMemoryEngagementRepository } from '../../../../adapters/analytics/per providers: [ AnalyticsService, { - provide: ILogger_TOKEN, + provide: Logger_TOKEN, useClass: ConsoleLogger, }, { @@ -35,7 +35,7 @@ import { InMemoryEngagementRepository } from '../../../../adapters/analytics/per ], exports: [ AnalyticsService, - ILogger_TOKEN, + Logger_TOKEN, IPAGE_VIEW_REPO_TOKEN, IENGAGEMENT_REPO_TOKEN, ], diff --git a/apps/api/src/modules/analytics/AnalyticsService.ts b/apps/api/src/modules/analytics/AnalyticsService.ts index d606a6d1f..0d05e5ebf 100644 --- a/apps/api/src/modules/analytics/AnalyticsService.ts +++ b/apps/api/src/modules/analytics/AnalyticsService.ts @@ -2,11 +2,11 @@ import { Injectable, Inject } from '@nestjs/common'; import { RecordEngagementInput, RecordEngagementOutput, RecordPageViewInput, RecordPageViewOutput } from './dto/AnalyticsDto'; import { IPageViewRepository } from '@gridpilot/analytics/application/repositories/IPageViewRepository'; import { IEngagementRepository } from '@gridpilot/analytics/domain/repositories/IEngagementRepository'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; import { PageView } from '@gridpilot/analytics/domain/entities/PageView'; import { EngagementEvent } from '@gridpilot/analytics/domain/entities/EngagementEvent'; -const ILogger_TOKEN = 'ILogger_TOKEN'; +const Logger_TOKEN = 'Logger_TOKEN'; const IPAGE_VIEW_REPO_TOKEN = 'IPageViewRepository_TOKEN'; const IENGAGEMENT_REPO_TOKEN = 'IEngagementRepository_TOKEN'; @@ -15,7 +15,7 @@ export class AnalyticsService { constructor( @Inject(IPAGE_VIEW_REPO_TOKEN) private readonly pageViewRepository: IPageViewRepository, @Inject(IENGAGEMENT_REPO_TOKEN) private readonly engagementRepository: IEngagementRepository, - @Inject(ILogger_TOKEN) private readonly logger: ILogger, + @Inject(Logger_TOKEN) private readonly logger: Logger, ) {} async recordPageView(input: RecordPageViewInput): Promise { diff --git a/apps/api/src/modules/auth/AuthProviders.ts b/apps/api/src/modules/auth/AuthProviders.ts index 4ab16be52..0d98c4fa7 100644 --- a/apps/api/src/modules/auth/AuthProviders.ts +++ b/apps/api/src/modules/auth/AuthProviders.ts @@ -5,7 +5,7 @@ import { AuthService } from './AuthService'; import { IAuthRepository } from '@gridpilot/core/identity/domain/repositories/IAuthRepository'; import { IUserRepository, StoredUser } from '@gridpilot/core/identity/domain/repositories/IUserRepository'; import { IPasswordHashingService } from '@gridpilot/core/identity/domain/services/PasswordHashingService'; -import { ILogger } from '@gridpilot/core/shared/logging/ILogger'; +import { Logger } from '@gridpilot/core/shared/logging/Logger'; import { InMemoryAuthRepository } from '../../../adapters/identity/persistence/inmemory/InMemoryAuthRepository'; import { InMemoryUserRepository } from '../../../adapters/identity/persistence/inmemory/InMemoryUserRepository'; @@ -18,14 +18,14 @@ import { CookieIdentitySessionAdapter } from '../../../adapters/identity/session export const AUTH_REPOSITORY_TOKEN = 'IAuthRepository'; export const USER_REPOSITORY_TOKEN = 'IUserRepository'; export const PASSWORD_HASHING_SERVICE_TOKEN = 'IPasswordHashingService'; -export const LOGGER_TOKEN = 'ILogger'; +export const LOGGER_TOKEN = 'Logger'; export const IDENTITY_SESSION_PORT_TOKEN = 'IdentitySessionPort'; export const AuthProviders: Provider[] = [ AuthService, // Provide the service itself { provide: AUTH_REPOSITORY_TOKEN, - useFactory: (userRepository: IUserRepository, passwordHashingService: IPasswordHashingService, logger: ILogger) => { + useFactory: (userRepository: IUserRepository, passwordHashingService: IPasswordHashingService, logger: Logger) => { // Seed initial users for InMemoryUserRepository const initialUsers: StoredUser[] = [ // Example user (replace with actual test users as needed) @@ -45,7 +45,7 @@ export const AuthProviders: Provider[] = [ }, { provide: USER_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryUserRepository(logger), // Factory for InMemoryUserRepository + useFactory: (logger: Logger) => new InMemoryUserRepository(logger), // Factory for InMemoryUserRepository inject: [LOGGER_TOKEN], }, { @@ -58,7 +58,7 @@ export const AuthProviders: Provider[] = [ }, { provide: IDENTITY_SESSION_PORT_TOKEN, - useFactory: (logger: ILogger) => new CookieIdentitySessionAdapter(logger), + useFactory: (logger: Logger) => new CookieIdentitySessionAdapter(logger), inject: [LOGGER_TOKEN], }, ]; diff --git a/apps/api/src/modules/auth/AuthService.ts b/apps/api/src/modules/auth/AuthService.ts index a4bdce3cd..300965322 100644 --- a/apps/api/src/modules/auth/AuthService.ts +++ b/apps/api/src/modules/auth/AuthService.ts @@ -13,7 +13,7 @@ import { LoginWithIracingCallbackUseCase } from '../../../../core/identity/appli import { AUTH_REPOSITORY_TOKEN, PASSWORD_HASHING_SERVICE_TOKEN, LOGGER_TOKEN, IDENTITY_SESSION_PORT_TOKEN, USER_REPOSITORY_TOKEN } from './AuthProviders'; import { IAuthRepository } from '../../../../core/identity/domain/repositories/IAuthRepository'; import { IPasswordHashingService } from '../../../../core/identity/domain/services/PasswordHashingService'; -import { ILogger } from '../../../../core/shared/logging/ILogger'; +import { Logger } from "@gridpilot/core/shared/application"; import { IdentitySessionPort } from '../../../../core/identity/application/ports/IdentitySessionPort'; import { UserId } from '../../../../core/identity/domain/value-objects/UserId'; import { User } from '../../../../core/identity/domain/entities/User'; @@ -32,7 +32,7 @@ export class AuthService { constructor( @Inject(AUTH_REPOSITORY_TOKEN) private authRepository: IAuthRepository, @Inject(PASSWORD_HASHING_SERVICE_TOKEN) private passwordHashingService: IPasswordHashingService, - @Inject(LOGGER_TOKEN) private logger: ILogger, + @Inject(LOGGER_TOKEN) private logger: Logger, @Inject(IDENTITY_SESSION_PORT_TOKEN) private identitySessionPort: IdentitySessionPort, @Inject(USER_REPOSITORY_TOKEN) private userRepository: IUserRepository, // Inject IUserRepository here ) { diff --git a/apps/api/src/modules/driver/DriverProviders.ts b/apps/api/src/modules/driver/DriverProviders.ts index f17c3465a..00c76be07 100644 --- a/apps/api/src/modules/driver/DriverProviders.ts +++ b/apps/api/src/modules/driver/DriverProviders.ts @@ -9,7 +9,7 @@ import { DriverRatingProvider } from '../../../../core/racing/application/ports/ import { IImageServicePort } from '../../../../core/racing/application/ports/IImageServicePort'; import { IRaceRegistrationRepository } from '../../../../core/racing/domain/repositories/IRaceRegistrationRepository'; import { INotificationPreferenceRepository } from '../../../../core/notifications/domain/repositories/INotificationPreferenceRepository'; -import { ILogger } from '../../../../core/shared/logging/ILogger'; +import { Logger } from "@gridpilot/core/shared/application"; // Import concrete in-memory implementations import { InMemoryDriverRepository } from '../../../adapters/racing/persistence/inmemory/InMemoryDriverRepository'; @@ -29,43 +29,43 @@ export const DRIVER_RATING_PROVIDER_TOKEN = 'DriverRatingProvider'; export const IMAGE_SERVICE_PORT_TOKEN = 'IImageServicePort'; export const RACE_REGISTRATION_REPOSITORY_TOKEN = 'IRaceRegistrationRepository'; export const NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN = 'INotificationPreferenceRepository'; -export const LOGGER_TOKEN = 'ILogger'; // Already defined in AuthProviders, but good to have here too +export const LOGGER_TOKEN = 'Logger'; // Already defined in AuthProviders, but good to have here too export const DriverProviders: Provider[] = [ DriverService, // Provide the service itself { provide: DRIVER_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryDriverRepository(logger), // Factory for InMemoryDriverRepository + useFactory: (logger: Logger) => new InMemoryDriverRepository(logger), // Factory for InMemoryDriverRepository inject: [LOGGER_TOKEN], }, { provide: RANKING_SERVICE_TOKEN, - useFactory: (logger: ILogger) => new InMemoryRankingService(logger), + useFactory: (logger: Logger) => new InMemoryRankingService(logger), inject: [LOGGER_TOKEN], }, { provide: DRIVER_STATS_SERVICE_TOKEN, - useFactory: (logger: ILogger) => new InMemoryDriverStatsService(logger), + useFactory: (logger: Logger) => new InMemoryDriverStatsService(logger), inject: [LOGGER_TOKEN], }, { provide: DRIVER_RATING_PROVIDER_TOKEN, - useFactory: (logger: ILogger) => new InMemoryDriverRatingProvider(logger), + useFactory: (logger: Logger) => new InMemoryDriverRatingProvider(logger), inject: [LOGGER_TOKEN], }, { provide: IMAGE_SERVICE_PORT_TOKEN, - useFactory: (logger: ILogger) => new InMemoryImageServiceAdapter(logger), + useFactory: (logger: Logger) => new InMemoryImageServiceAdapter(logger), inject: [LOGGER_TOKEN], }, { provide: RACE_REGISTRATION_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryRaceRegistrationRepository(logger), + useFactory: (logger: Logger) => new InMemoryRaceRegistrationRepository(logger), inject: [LOGGER_TOKEN], }, { provide: NOTIFICATION_PREFERENCE_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryNotificationPreferenceRepository(logger), + useFactory: (logger: Logger) => new InMemoryNotificationPreferenceRepository(logger), inject: [LOGGER_TOKEN], }, { diff --git a/apps/api/src/modules/league/LeagueProviders.ts b/apps/api/src/modules/league/LeagueProviders.ts index 394c8f8ec..52e95cfea 100644 --- a/apps/api/src/modules/league/LeagueProviders.ts +++ b/apps/api/src/modules/league/LeagueProviders.ts @@ -10,7 +10,7 @@ import { ILeagueScoringConfigRepository } from 'core/racing/domain/repositories/ import { IGameRepository } from 'core/racing/domain/repositories/IGameRepository'; import { IProtestRepository } from 'core/racing/domain/repositories/IProtestRepository'; import { IRaceRepository } from 'core/racing/domain/repositories/IRaceRepository'; -import { ILogger } from 'core/shared/logging/ILogger'; +import { Logger } from 'core/shared/logging/Logger'; // Import concrete in-memory implementations import { InMemoryLeagueRepository } from 'adapters/racing/persistence/inmemory/InMemoryLeagueRepository'; @@ -32,48 +32,48 @@ export const LEAGUE_SCORING_CONFIG_REPOSITORY_TOKEN = 'ILeagueScoringConfigRepos export const GAME_REPOSITORY_TOKEN = 'IGameRepository'; export const PROTEST_REPOSITORY_TOKEN = 'IProtestRepository'; export const RACE_REPOSITORY_TOKEN = 'IRaceRepository'; -export const LOGGER_TOKEN = 'ILogger'; // Already defined in AuthProviders, but good to have here too +export const LOGGER_TOKEN = 'Logger'; // Already defined in AuthProviders, but good to have here too export const LeagueProviders: Provider[] = [ LeagueService, // Provide the service itself { provide: LEAGUE_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryLeagueRepository(logger), // Factory for InMemoryLeagueRepository + useFactory: (logger: Logger) => new InMemoryLeagueRepository(logger), // Factory for InMemoryLeagueRepository inject: [LOGGER_TOKEN], }, { provide: LEAGUE_MEMBERSHIP_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryLeagueMembershipRepository(logger), // Factory for InMemoryLeagueMembershipRepository + useFactory: (logger: Logger) => new InMemoryLeagueMembershipRepository(logger), // Factory for InMemoryLeagueMembershipRepository inject: [LOGGER_TOKEN], }, { provide: LEAGUE_STANDINGS_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryLeagueStandingsRepository(logger), // Factory for InMemoryLeagueStandingsRepository + useFactory: (logger: Logger) => new InMemoryLeagueStandingsRepository(logger), // Factory for InMemoryLeagueStandingsRepository inject: [LOGGER_TOKEN], }, { provide: SEASON_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemorySeasonRepository(logger), // Factory for InMemorySeasonRepository + useFactory: (logger: Logger) => new InMemorySeasonRepository(logger), // Factory for InMemorySeasonRepository inject: [LOGGER_TOKEN], }, { provide: LEAGUE_SCORING_CONFIG_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryLeagueScoringConfigRepository(logger), // Factory for InMemoryLeagueScoringConfigRepository + useFactory: (logger: Logger) => new InMemoryLeagueScoringConfigRepository(logger), // Factory for InMemoryLeagueScoringConfigRepository inject: [LOGGER_TOKEN], }, { provide: GAME_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryGameRepository(logger), + useFactory: (logger: Logger) => new InMemoryGameRepository(logger), inject: [LOGGER_TOKEN], }, { provide: PROTEST_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryProtestRepository(logger), + useFactory: (logger: Logger) => new InMemoryProtestRepository(logger), inject: [LOGGER_TOKEN], }, { provide: RACE_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryRaceRepository(logger), + useFactory: (logger: Logger) => new InMemoryRaceRepository(logger), inject: [LOGGER_TOKEN], }, { diff --git a/apps/api/src/modules/media/MediaProviders.ts b/apps/api/src/modules/media/MediaProviders.ts index 89702ca6a..e5c7819c8 100644 --- a/apps/api/src/modules/media/MediaProviders.ts +++ b/apps/api/src/modules/media/MediaProviders.ts @@ -7,7 +7,7 @@ import { MediaService } from './MediaService'; /* import { IAvatarGenerationRepository } from 'core/media/domain/repositories/IAvatarGenerationRepository'; import { FaceValidationPort } from 'core/media/application/ports/FaceValidationPort'; - import { ILogger } from 'core/shared/logging/ILogger'; + import { Logger } from 'core/shared/logging/Logger'; import { InMemoryAvatarGenerationRepository } from 'adapters/media/persistence/inmemory/InMemoryAvatarGenerationRepository'; import { InMemoryFaceValidationAdapter } from 'adapters/media/ports/InMemoryFaceValidationAdapter'; @@ -17,7 +17,7 @@ import { MediaService } from './MediaService'; // Define injection tokens as string literals for NestJS export const AVATAR_GENERATION_REPOSITORY_TOKEN = 'IAvatarGenerationRepository'; export const FACE_VALIDATION_PORT_TOKEN = 'FaceValidationPort'; -export const LOGGER_TOKEN = 'ILogger'; +export const LOGGER_TOKEN = 'Logger'; export const MediaProviders: Provider[] = [ MediaService, // Provide the service itself @@ -25,12 +25,12 @@ export const MediaProviders: Provider[] = [ /* { provide: AVATAR_GENERATION_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryAvatarGenerationRepository(logger), + useFactory: (logger: Logger) => new InMemoryAvatarGenerationRepository(logger), inject: [LOGGER_TOKEN], }, { provide: FACE_VALIDATION_PORT_TOKEN, - useFactory: (logger: ILogger) => new InMemoryFaceValidationAdapter(logger), + useFactory: (logger: Logger) => new InMemoryFaceValidationAdapter(logger), inject: [LOGGER_TOKEN], }, { diff --git a/apps/api/src/modules/payments/PaymentsProviders.ts b/apps/api/src/modules/payments/PaymentsProviders.ts index ab1b9e6b3..c6e2359dc 100644 --- a/apps/api/src/modules/payments/PaymentsProviders.ts +++ b/apps/api/src/modules/payments/PaymentsProviders.ts @@ -11,7 +11,7 @@ import { IMembershipFeeRepository } from 'core/payments/domain/repositories/IMem import { IPrizeRepository } from 'core/payments/domain/repositories/IPrizeRepository'; import { IWalletRepository } from 'core/payments/domain/repositories/IWalletRepository'; import { IPaymentGateway } from 'core/payments/application/ports/IPaymentGateway'; -import { ILogger } from 'core/shared/logging/ILogger'; +import { Logger } from 'core/shared/logging/Logger'; // Import concrete in-memory implementations import { InMemoryPaymentRepository } from 'adapters/payments/persistence/inmemory/InMemoryPaymentRepository'; @@ -28,7 +28,7 @@ export const MEMBERSHIP_FEE_REPOSITORY_TOKEN = 'IMembershipFeeRepository'; export const PRIZE_REPOSITORY_TOKEN = 'IPrizeRepository'; export const WALLET_REPOSITORY_TOKEN = 'IWalletRepository'; export const PAYMENT_GATEWAY_TOKEN = 'IPaymentGateway'; -export const LOGGER_TOKEN = 'ILogger'; // Already defined in other Providers, but good to have here too +export const LOGGER_TOKEN = 'Logger'; // Already defined in other Providers, but good to have here too export const PaymentsProviders: Provider[] = [ PaymentsService, // Provide the service itself @@ -36,27 +36,27 @@ export const PaymentsProviders: Provider[] = [ /* { provide: PAYMENT_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryPaymentRepository(logger), + useFactory: (logger: Logger) => new InMemoryPaymentRepository(logger), inject: [LOGGER_TOKEN], }, { provide: MEMBERSHIP_FEE_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryMembershipFeeRepository(logger), + useFactory: (logger: Logger) => new InMemoryMembershipFeeRepository(logger), inject: [LOGGER_TOKEN], }, { provide: PRIZE_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryPrizeRepository(logger), + useFactory: (logger: Logger) => new InMemoryPrizeRepository(logger), inject: [LOGGER_TOKEN], }, { provide: WALLET_REPOSITORY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryWalletRepository(logger), + useFactory: (logger: Logger) => new InMemoryWalletRepository(logger), inject: [LOGGER_TOKEN], }, { provide: PAYMENT_GATEWAY_TOKEN, - useFactory: (logger: ILogger) => new InMemoryPaymentGateway(logger), + useFactory: (logger: Logger) => new InMemoryPaymentGateway(logger), inject: [LOGGER_TOKEN], }, { diff --git a/apps/api/src/modules/race/RaceProviders.ts b/apps/api/src/modules/race/RaceProviders.ts index a77c75611..86ff8f392 100644 --- a/apps/api/src/modules/race/RaceProviders.ts +++ b/apps/api/src/modules/race/RaceProviders.ts @@ -6,7 +6,7 @@ export const RaceProviders: Provider[] = [ // In a functional setup, other providers would be here, e.g.: /* { - provide: 'ILogger', + provide: 'Logger', useClass: ConsoleLogger, }, { diff --git a/apps/companion/package.json b/apps/companion/package.json index 2172b76b8..50aa914a0 100644 --- a/apps/companion/package.json +++ b/apps/companion/package.json @@ -15,12 +15,14 @@ "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", "@vitejs/plugin-react": "^4.2.0", - "electron": "^28.3.3", - "electron-vite": "^2.3.0", + "electron": "^39.2.7", + "electron-vite": "^3.1.0", "typescript": "^5.7.2", - "vite": "^5.4.21" + "vite": "^6.4.1" }, "dependencies": { + "@nestjs/swagger": "11.2.3", + "next": "15.5.9", "puppeteer-core": "^24.31.0", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/apps/website/package.json b/apps/website/package.json index 50a3eaaa5..564e95fa8 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -18,13 +18,14 @@ "@gridpilot/social": "file:../../core/social", "@gridpilot/testing-support": "file:../../core/testing-support", "@vercel/kv": "^3.0.0", + "electron": "39.2.7", "framer-motion": "^12.23.25", "lucide-react": "^0.555.0", - "next": "15.5.7", + "next": "^15.5.9", "react": "^18.3.0", "react-dom": "^18.3.0", - "zod": "^3.25.76", - "uuid": "^11.0.5" + "uuid": "^11.0.5", + "zod": "^3.25.76" }, "devDependencies": { "@types/node": "^20.0.0", diff --git a/core/analytics/application/use-cases/GetEntityAnalyticsQuery.ts b/core/analytics/application/use-cases/GetEntityAnalyticsQuery.ts index a23f22775..ccf9c03b7 100644 --- a/core/analytics/application/use-cases/GetEntityAnalyticsQuery.ts +++ b/core/analytics/application/use-cases/GetEntityAnalyticsQuery.ts @@ -6,7 +6,7 @@ */ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '@gridpilot/shared/application'; +import type { Logger } from '@gridpilot/shared/application'; import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository'; import type { IAnalyticsSnapshotRepository } from '../../domain/repositories/IAnalyticsSnapshotRepository'; @@ -49,7 +49,7 @@ export class GetEntityAnalyticsQuery private readonly pageViewRepository: IPageViewRepository, private readonly engagementRepository: IEngagementRepository, private readonly snapshotRepository: IAnalyticsSnapshotRepository, - private readonly logger: ILogger + private readonly logger: Logger ) {} async execute(input: GetEntityAnalyticsInput): Promise { diff --git a/core/analytics/application/use-cases/RecordEngagementUseCase.ts b/core/analytics/application/use-cases/RecordEngagementUseCase.ts index 127e1b6e9..bb94e09d1 100644 --- a/core/analytics/application/use-cases/RecordEngagementUseCase.ts +++ b/core/analytics/application/use-cases/RecordEngagementUseCase.ts @@ -5,7 +5,7 @@ */ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; import { EngagementEvent, type EngagementAction, type EngagementEntityType } from '../../domain/entities/EngagementEvent'; import type { IEngagementRepository } from '../../domain/repositories/IEngagementRepository'; @@ -28,7 +28,7 @@ export class RecordEngagementUseCase implements AsyncUseCase { constructor( private readonly engagementRepository: IEngagementRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(input: RecordEngagementInput): Promise { diff --git a/core/analytics/application/use-cases/RecordPageViewUseCase.ts b/core/analytics/application/use-cases/RecordPageViewUseCase.ts index 26167af40..f581561be 100644 --- a/core/analytics/application/use-cases/RecordPageViewUseCase.ts +++ b/core/analytics/application/use-cases/RecordPageViewUseCase.ts @@ -5,7 +5,7 @@ */ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; import { PageView } from '../../domain/entities/PageView'; import type { EntityType, VisitorType } from '../../domain/types/PageView'; import type { IPageViewRepository } from '../../domain/repositories/IPageViewRepository'; @@ -29,7 +29,7 @@ export class RecordPageViewUseCase implements AsyncUseCase { constructor( private readonly pageViewRepository: IPageViewRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(input: RecordPageViewInput): Promise { diff --git a/core/analytics/domain/ports/ILogger.ts b/core/analytics/domain/ports/ILogger.ts index 419726ade..caacce55c 100644 --- a/core/analytics/domain/ports/ILogger.ts +++ b/core/analytics/domain/ports/ILogger.ts @@ -1,4 +1,4 @@ -export interface ILogger { +export interface Logger { debug(message: string, ...args: any[]): void; info(message: string, ...args: any[]): void; warn(message: string, ...args: any[]): void; diff --git a/core/automation/application/ports/ILogger.ts b/core/automation/application/ports/ILogger.ts index 4d1243d09..83540b86a 100644 --- a/core/automation/application/ports/ILogger.ts +++ b/core/automation/application/ports/ILogger.ts @@ -1,4 +1,4 @@ -export interface ILogger { +export interface Logger { debug(message: string, context?: Record): void; info(message: string, context?: Record): void; warn(message: string, context?: Record): void; diff --git a/core/automation/application/ports/LoggerPort.ts b/core/automation/application/ports/LoggerPort.ts index bfe447fcf..d8a3075ef 100644 --- a/core/automation/application/ports/LoggerPort.ts +++ b/core/automation/application/ports/LoggerPort.ts @@ -1,11 +1,11 @@ import type { LogLevel } from './LoggerLogLevel'; import type { LogContext } from './LoggerContext'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; /** * LoggerPort - Port interface for application-layer logging. */ -export interface LoggerPort extends ILogger { +export interface LoggerPort extends Logger { debug(message: string, context?: LogContext): void; info(message: string, context?: LogContext): void; warn(message: string, context?: LogContext): void; diff --git a/core/automation/application/use-cases/CheckAuthenticationUseCase.ts b/core/automation/application/use-cases/CheckAuthenticationUseCase.ts index 27af0d111..9334a3917 100644 --- a/core/automation/application/use-cases/CheckAuthenticationUseCase.ts +++ b/core/automation/application/use-cases/CheckAuthenticationUseCase.ts @@ -1,5 +1,5 @@ import { AuthenticationState } from '../../domain/value-objects/AuthenticationState'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import { Result } from '../../../shared/result/Result'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; import { SessionLifetime } from '../../domain/value-objects/SessionLifetime'; @@ -17,7 +17,7 @@ import type { SessionValidatorPort } from '../ports/SessionValidatorPort'; */ export class CheckAuthenticationUseCase { constructor( - private readonly logger: ILogger, + private readonly logger: Logger, private readonly authService: AuthenticationServicePort, private readonly sessionValidator?: SessionValidatorPort ) {} diff --git a/core/automation/application/use-cases/ClearSessionUseCase.ts b/core/automation/application/use-cases/ClearSessionUseCase.ts index c88d4c384..c502585c4 100644 --- a/core/automation/application/use-cases/ClearSessionUseCase.ts +++ b/core/automation/application/use-cases/ClearSessionUseCase.ts @@ -1,6 +1,6 @@ import { Result } from '../../../shared/result/Result'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use case for clearing the user's session (logout). @@ -11,7 +11,7 @@ import type { ILogger } from '../../../shared/src/logging/ILogger'; export class ClearSessionUseCase { constructor( private readonly authService: AuthenticationServicePort, - private readonly logger: ILogger, // Inject ILogger + private readonly logger: Logger, // Inject Logger ) {} /** diff --git a/core/automation/application/use-cases/CompleteRaceCreationUseCase.ts b/core/automation/application/use-cases/CompleteRaceCreationUseCase.ts index 413c4f7d2..fb49689b9 100644 --- a/core/automation/application/use-cases/CompleteRaceCreationUseCase.ts +++ b/core/automation/application/use-cases/CompleteRaceCreationUseCase.ts @@ -1,10 +1,10 @@ import { Result } from '../../../shared/result/Result'; import { RaceCreationResult } from '../../domain/value-objects/RaceCreationResult'; import type { CheckoutServicePort } from '../ports/CheckoutServicePort'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export class CompleteRaceCreationUseCase { - constructor(private readonly checkoutService: CheckoutServicePort, private readonly logger: ILogger) {} + constructor(private readonly checkoutService: CheckoutServicePort, private readonly logger: Logger) {} async execute(sessionId: string): Promise> { this.logger.debug(`Attempting to complete race creation for session ID: ${sessionId}`); diff --git a/core/automation/application/use-cases/ConfirmCheckoutUseCase.ts b/core/automation/application/use-cases/ConfirmCheckoutUseCase.ts index d414633a2..77b682644 100644 --- a/core/automation/application/use-cases/ConfirmCheckoutUseCase.ts +++ b/core/automation/application/use-cases/ConfirmCheckoutUseCase.ts @@ -1,5 +1,5 @@ import { Result } from '../../../shared/result/Result'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { CheckoutServicePort } from '../ports/CheckoutServicePort'; import type { CheckoutConfirmationPort } from '../ports/CheckoutConfirmationPort'; import { CheckoutStateEnum } from '../../domain/value-objects/CheckoutState'; @@ -16,7 +16,7 @@ export class ConfirmCheckoutUseCase { constructor( private readonly checkoutService: CheckoutServicePort, private readonly confirmationPort: CheckoutConfirmationPort, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(sessionMetadata?: SessionMetadata): Promise> { diff --git a/core/automation/application/use-cases/InitiateLoginUseCase.ts b/core/automation/application/use-cases/InitiateLoginUseCase.ts index e5ea3ed44..13711d6cd 100644 --- a/core/automation/application/use-cases/InitiateLoginUseCase.ts +++ b/core/automation/application/use-cases/InitiateLoginUseCase.ts @@ -1,6 +1,6 @@ import { Result } from '../../../shared/result/Result'; import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; -import type { ILogger } from '../../../shared/logger/ILogger'; +import type { Logger } from '@gridpilot/shared/application/Logger'; /** * Use case for initiating the manual login flow. @@ -12,7 +12,7 @@ import type { ILogger } from '../../../shared/logger/ILogger'; export class InitiateLoginUseCase { constructor( private readonly authService: AuthenticationServicePort, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} /** diff --git a/core/automation/application/use-cases/StartAutomationSessionUseCase.ts b/core/automation/application/use-cases/StartAutomationSessionUseCase.ts index e0493253d..6e26e27c8 100644 --- a/core/automation/application/use-cases/StartAutomationSessionUseCase.ts +++ b/core/automation/application/use-cases/StartAutomationSessionUseCase.ts @@ -1,5 +1,5 @@ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import { AutomationSession } from '../../domain/entities/AutomationSession'; import type { HostedSessionConfig } from '../../domain/types/HostedSessionConfig'; import { AutomationEnginePort } from '../ports/AutomationEnginePort'; @@ -13,7 +13,7 @@ export class StartAutomationSessionUseCase private readonly automationEngine: AutomationEnginePort, private readonly browserAutomation: IBrowserAutomation, private readonly sessionRepository: SessionRepositoryPort, - private readonly logger: ILogger + private readonly logger: Logger ) {} async execute(config: HostedSessionConfig): Promise { diff --git a/core/automation/application/use-cases/VerifyAuthenticatedPageUseCase.ts b/core/automation/application/use-cases/VerifyAuthenticatedPageUseCase.ts index e524018b8..de4340a02 100644 --- a/core/automation/application/use-cases/VerifyAuthenticatedPageUseCase.ts +++ b/core/automation/application/use-cases/VerifyAuthenticatedPageUseCase.ts @@ -1,7 +1,7 @@ import type { AuthenticationServicePort } from '../ports/AuthenticationServicePort'; import { Result } from '../../../shared/result/Result'; import { BrowserAuthenticationState } from '../../domain/value-objects/BrowserAuthenticationState'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use case for verifying browser shows authenticated page state. @@ -10,7 +10,7 @@ import type { ILogger } from '../../../shared/src/logging/ILogger'; export class VerifyAuthenticatedPageUseCase { constructor( private readonly authService: AuthenticationServicePort, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(): Promise> { diff --git a/core/automation/infrastructure/adapters/logging/NoOpLogAdapter.ts b/core/automation/infrastructure/adapters/logging/NoOpLogAdapter.ts index 8ca9e5349..9c92a0cac 100644 --- a/core/automation/infrastructure/adapters/logging/NoOpLogAdapter.ts +++ b/core/automation/infrastructure/adapters/logging/NoOpLogAdapter.ts @@ -1,8 +1,8 @@ import type { LoggerPort } from '../../../application/ports/LoggerPort'; import type { LogContext } from '../../../application/ports/LoggerContext'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; -export class NoOpLogAdapter implements LoggerPort, ILogger { +export class NoOpLogAdapter implements LoggerPort, Logger { debug(_message: string, _context?: LogContext): void {} info(_message: string, _context?: LogContext): void {} diff --git a/core/automation/infrastructure/adapters/logging/PinoLogAdapter.ts b/core/automation/infrastructure/adapters/logging/PinoLogAdapter.ts index 195cc4205..8e22317db 100644 --- a/core/automation/infrastructure/adapters/logging/PinoLogAdapter.ts +++ b/core/automation/infrastructure/adapters/logging/PinoLogAdapter.ts @@ -2,7 +2,7 @@ import type { LoggerPort } from '@gridpilot/automation/application/ports/LoggerP import type { LogContext } from '@gridpilot/automation/application/ports/LoggerContext'; import type { LogLevel } from '@gridpilot/automation/application/ports/LoggerLogLevel'; import { loadLoggingConfig, type LoggingEnvironmentConfig } from '../../config/LoggingConfig'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; const LOG_LEVEL_PRIORITY: Record = { debug: 10, @@ -21,7 +21,7 @@ const LOG_LEVEL_PRIORITY: Record = { * * This provides structured JSON logging to stdout with the same interface. */ -export class PinoLogAdapter implements LoggerPort, ILogger { +export class PinoLogAdapter implements LoggerPort, Logger { private readonly config: LoggingEnvironmentConfig; private readonly baseContext: LogContext; private readonly levelPriority: number; diff --git a/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts b/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts index e5de23150..0af10b972 100644 --- a/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts +++ b/core/media/application/use-cases/RequestAvatarGenerationUseCase.ts @@ -1,4 +1,4 @@ -import type { AsyncUseCase, ILogger } from '@gridpilot/shared/application'; +import type { AsyncUseCase, Logger } from '@gridpilot/shared/application'; import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository'; import type { FaceValidationPort } from '../ports/FaceValidationPort'; import type { AvatarGenerationPort } from '../ports/AvatarGenerationPort'; @@ -25,7 +25,7 @@ export class RequestAvatarGenerationUseCase private readonly avatarRepository: IAvatarGenerationRepository, private readonly faceValidation: FaceValidationPort, private readonly avatarGeneration: AvatarGenerationPort, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: RequestAvatarGenerationCommand): Promise { diff --git a/core/media/application/use-cases/SelectAvatarUseCase.ts b/core/media/application/use-cases/SelectAvatarUseCase.ts index 8587adc24..a81b3c875 100644 --- a/core/media/application/use-cases/SelectAvatarUseCase.ts +++ b/core/media/application/use-cases/SelectAvatarUseCase.ts @@ -4,7 +4,7 @@ * Allows a user to select one of the generated avatars as their profile avatar. */ -import type { AsyncUseCase, ILogger } from '@gridpilot/shared/application'; +import type { AsyncUseCase, Logger } from '@gridpilot/shared/application'; import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository'; export interface SelectAvatarCommand { @@ -23,7 +23,7 @@ export class SelectAvatarUseCase implements AsyncUseCase { constructor( private readonly avatarRepository: IAvatarGenerationRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: SelectAvatarCommand): Promise { diff --git a/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts b/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts index fdf4e44e6..5863f7f73 100644 --- a/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts +++ b/core/notifications/application/use-cases/GetUnreadNotificationsUseCase.ts @@ -5,7 +5,7 @@ */ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { Notification } from '../../domain/entities/Notification'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; @@ -17,7 +17,7 @@ export interface UnreadNotificationsResult { export class GetUnreadNotificationsUseCase implements AsyncUseCase { constructor( private readonly notificationRepository: INotificationRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(recipientId: string): Promise { diff --git a/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts b/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts index 0e958c9d4..87c014618 100644 --- a/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts +++ b/core/notifications/application/use-cases/MarkNotificationReadUseCase.ts @@ -7,7 +7,7 @@ import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; import { NotificationDomainError } from '../../domain/errors/NotificationDomainError'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export interface MarkNotificationReadCommand { notificationId: string; @@ -17,7 +17,7 @@ export interface MarkNotificationReadCommand { export class MarkNotificationReadUseCase implements AsyncUseCase { constructor( private readonly notificationRepository: INotificationRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: MarkNotificationReadCommand): Promise { diff --git a/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts b/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts index 76b39b8eb..3ff8375e5 100644 --- a/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts +++ b/core/notifications/application/use-cases/NotificationPreferencesUseCases.ts @@ -5,7 +5,7 @@ */ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; import { NotificationPreference } from '../../domain/entities/NotificationPreference'; import type { ChannelPreference, TypePreference } from '../../domain/entities/NotificationPreference'; import type { INotificationPreferenceRepository } from '../../domain/repositories/INotificationPreferenceRepository'; @@ -18,7 +18,7 @@ import { NotificationDomainError } from '../../domain/errors/NotificationDomainE export class GetNotificationPreferencesQuery implements AsyncUseCase { constructor( private readonly preferenceRepository: INotificationPreferenceRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(driverId: string): Promise { @@ -46,7 +46,7 @@ export interface UpdateChannelPreferenceCommand { export class UpdateChannelPreferenceUseCase implements AsyncUseCase { constructor( private readonly preferenceRepository: INotificationPreferenceRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: UpdateChannelPreferenceCommand): Promise { @@ -75,7 +75,7 @@ export interface UpdateTypePreferenceCommand { export class UpdateTypePreferenceUseCase implements AsyncUseCase { constructor( private readonly preferenceRepository: INotificationPreferenceRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: UpdateTypePreferenceCommand): Promise { @@ -104,7 +104,7 @@ export interface UpdateQuietHoursCommand { export class UpdateQuietHoursUseCase implements AsyncUseCase { constructor( private readonly preferenceRepository: INotificationPreferenceRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: UpdateQuietHoursCommand): Promise { diff --git a/core/notifications/application/use-cases/SendNotificationUseCase.ts b/core/notifications/application/use-cases/SendNotificationUseCase.ts index 282247146..db7c06f9c 100644 --- a/core/notifications/application/use-cases/SendNotificationUseCase.ts +++ b/core/notifications/application/use-cases/SendNotificationUseCase.ts @@ -7,7 +7,7 @@ import { v4 as uuid } from 'uuid'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import { Notification } from '../../domain/entities/Notification'; import type { NotificationData } from '../../domain/entities/Notification'; import type { INotificationRepository } from '../../domain/repositories/INotificationRepository'; @@ -49,7 +49,7 @@ export class SendNotificationUseCase implements AsyncUseCase { diff --git a/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts b/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts index 7f6196c5b..f3db05199 100644 --- a/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts +++ b/core/racing/application/use-cases/ApplyForSponsorshipUseCase.ts @@ -16,7 +16,7 @@ import { EntityNotFoundError, BusinessRuleViolationError, } from '../errors/RacingApplicationError'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export interface ApplyForSponsorshipDTO { sponsorId: string; @@ -41,7 +41,7 @@ export class ApplyForSponsorshipUseCase private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository, private readonly sponsorshipPricingRepo: ISponsorshipPricingRepository, private readonly sponsorRepo: ISponsorRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(dto: ApplyForSponsorshipDTO): Promise { diff --git a/core/racing/application/use-cases/ApplyPenaltyUseCase.ts b/core/racing/application/use-cases/ApplyPenaltyUseCase.ts index 2636ece93..5033cda9a 100644 --- a/core/racing/application/use-cases/ApplyPenaltyUseCase.ts +++ b/core/racing/application/use-cases/ApplyPenaltyUseCase.ts @@ -12,7 +12,7 @@ import type { IRaceRepository } from '../../domain/repositories/IRaceRepository' import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import { randomUUID } from 'crypto'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export interface ApplyPenaltyCommand { raceId: string; @@ -32,7 +32,7 @@ export class ApplyPenaltyUseCase private readonly protestRepository: IProtestRepository, private readonly raceRepository: IRaceRepository, private readonly leagueMembershipRepository: ILeagueMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: ApplyPenaltyCommand): Promise<{ penaltyId: string }> { diff --git a/core/racing/application/use-cases/ApproveTeamJoinRequestUseCase.ts b/core/racing/application/use-cases/ApproveTeamJoinRequestUseCase.ts index 29b3441f4..9dced8e27 100644 --- a/core/racing/application/use-cases/ApproveTeamJoinRequestUseCase.ts +++ b/core/racing/application/use-cases/ApproveTeamJoinRequestUseCase.ts @@ -1,4 +1,4 @@ -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { ITeamMembershipRepository } from '../../domain/repositories/ITeamMembershipRepository'; import type { TeamMembership, @@ -13,7 +13,7 @@ export class ApproveTeamJoinRequestUseCase implements AsyncUseCase { constructor( private readonly membershipRepository: ITeamMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: ApproveTeamJoinRequestCommandDTO): Promise { diff --git a/core/racing/application/use-cases/CancelRaceUseCase.ts b/core/racing/application/use-cases/CancelRaceUseCase.ts index cbdfaad6a..ea24dd43b 100644 --- a/core/racing/application/use-cases/CancelRaceUseCase.ts +++ b/core/racing/application/use-cases/CancelRaceUseCase.ts @@ -1,6 +1,6 @@ import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use Case: CancelRaceUseCase @@ -19,7 +19,7 @@ export class CancelRaceUseCase implements AsyncUseCase { constructor( private readonly raceRepository: IRaceRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: CancelRaceCommandDTO): Promise { diff --git a/core/racing/application/use-cases/CompleteRaceUseCase.ts b/core/racing/application/use-cases/CompleteRaceUseCase.ts index d67004b74..0efb375c0 100644 --- a/core/racing/application/use-cases/CompleteRaceUseCase.ts +++ b/core/racing/application/use-cases/CompleteRaceUseCase.ts @@ -6,7 +6,7 @@ import type { DriverRatingProvider } from '../ports/DriverRatingProvider'; import { Result } from '../../domain/entities/Result'; import { Standing } from '../../domain/entities/Standing'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use Case: CompleteRaceUseCase @@ -31,7 +31,7 @@ export class CompleteRaceUseCase private readonly resultRepository: IResultRepository, private readonly standingRepository: IStandingRepository, private readonly driverRatingProvider: DriverRatingProvider, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: CompleteRaceCommandDTO): Promise { diff --git a/core/racing/application/use-cases/CompleteRaceUseCaseWithRatings.ts b/core/racing/application/use-cases/CompleteRaceUseCaseWithRatings.ts index aec546ae1..0eb5061e3 100644 --- a/core/racing/application/use-cases/CompleteRaceUseCaseWithRatings.ts +++ b/core/racing/application/use-cases/CompleteRaceUseCaseWithRatings.ts @@ -8,7 +8,7 @@ import { Standing } from '../../domain/entities/Standing'; import { RaceResultGenerator } from '../utils/RaceResultGenerator'; import { RatingUpdateService } from '@gridpilot/identity/domain/services/RatingUpdateService'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Enhanced CompleteRaceUseCase that includes rating updates @@ -26,7 +26,7 @@ export class CompleteRaceUseCaseWithRatings private readonly standingRepository: IStandingRepository, private readonly driverRatingProvider: DriverRatingProvider, private readonly ratingUpdateService: RatingUpdateService, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: CompleteRaceCommandDTO): Promise { diff --git a/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts b/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts index 875372684..108c349c7 100644 --- a/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts +++ b/core/racing/application/use-cases/CreateLeagueWithSeasonAndScoringUseCase.ts @@ -6,7 +6,7 @@ import type { ISeasonRepository } from '../../domain/repositories/ISeasonReposit import type { ILeagueScoringConfigRepository } from '../../domain/repositories/ILeagueScoringConfigRepository'; import type { LeagueScoringConfig } from '../../domain/entities/LeagueScoringConfig'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { LeagueScoringPresetProvider, LeagueScoringPresetDTO, diff --git a/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts b/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts index 86b7bf638..3ab0387c7 100644 --- a/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts +++ b/core/racing/application/use-cases/GetAllRacesPageDataUseCase.ts @@ -1,6 +1,6 @@ import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { IAllRacesPagePresenter, AllRacesPageResultDTO, @@ -15,7 +15,7 @@ export class GetAllRacesPageDataUseCase constructor( private readonly raceRepository: IRaceRepository, private readonly leagueRepository: ILeagueRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(_input: void, presenter: IAllRacesPagePresenter): Promise { diff --git a/core/racing/application/use-cases/GetAllTeamsUseCase.ts b/core/racing/application/use-cases/GetAllTeamsUseCase.ts index ce43a5cfe..2d6ff0226 100644 --- a/core/racing/application/use-cases/GetAllTeamsUseCase.ts +++ b/core/racing/application/use-cases/GetAllTeamsUseCase.ts @@ -6,7 +6,7 @@ import type { } from '../presenters/IAllTeamsPresenter'; import type { UseCase } from '@gridpilot/shared/application'; import type { Team } from '../../domain/entities/Team'; -import { ILogger } from '../../../shared/src/logging/ILogger'; +import { Logger } from "@gridpilot/core/shared/application"; /** * Use Case for retrieving all teams. @@ -18,7 +18,7 @@ export class GetAllTeamsUseCase constructor( private readonly teamRepository: ITeamRepository, private readonly teamMembershipRepository: ITeamMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(_input: void, presenter: IAllTeamsPresenter): Promise { diff --git a/core/racing/application/use-cases/GetDriverTeamUseCase.ts b/core/racing/application/use-cases/GetDriverTeamUseCase.ts index 025d240d6..39fb377e2 100644 --- a/core/racing/application/use-cases/GetDriverTeamUseCase.ts +++ b/core/racing/application/use-cases/GetDriverTeamUseCase.ts @@ -6,7 +6,7 @@ import type { DriverTeamViewModel, } from '../presenters/IDriverTeamPresenter'; import type { UseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use Case for retrieving a driver's team. @@ -18,7 +18,7 @@ export class GetDriverTeamUseCase constructor( private readonly teamRepository: ITeamRepository, private readonly membershipRepository: ITeamMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, // Kept for backward compatibility; callers must pass their own presenter. // eslint-disable-next-line @typescript-eslint/no-unused-vars public readonly presenter: IDriverTeamPresenter, diff --git a/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts b/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts index ccca04373..ababc3e9c 100644 --- a/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts +++ b/core/racing/application/use-cases/GetEntitySponsorshipPricingUseCase.ts @@ -12,7 +12,7 @@ import type { SponsorableEntityType } from '../../domain/entities/SponsorshipReq import type { SponsorshipTier } from '../../domain/entities/SeasonSponsorship'; import type { IEntitySponsorshipPricingPresenter } from '../presenters/IEntitySponsorshipPricingPresenter'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export interface GetEntitySponsorshipPricingDTO { entityType: SponsorableEntityType; @@ -47,7 +47,7 @@ export class GetEntitySponsorshipPricingUseCase private readonly sponsorshipRequestRepo: ISponsorshipRequestRepository, private readonly seasonSponsorshipRepo: ISeasonSponsorshipRepository, private readonly presenter: IEntitySponsorshipPricingPresenter, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(dto: GetEntitySponsorshipPricingDTO): Promise { diff --git a/core/racing/application/use-cases/GetLeagueStatsUseCase.ts b/core/racing/application/use-cases/GetLeagueStatsUseCase.ts index 409b5f44d..f8614f8d8 100644 --- a/core/racing/application/use-cases/GetLeagueStatsUseCase.ts +++ b/core/racing/application/use-cases/GetLeagueStatsUseCase.ts @@ -9,7 +9,7 @@ import type { IResultRepository } from '../../domain/repositories/IRaceRepositor import type { DriverRatingProvider } from '../ports/DriverRatingProvider'; import type { ILeagueStatsPresenter } from '../presenters/ILeagueStatsPresenter'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import { ILogger } from '../../../shared/src/logging/ILogger'; +import { Logger } from "@gridpilot/core/shared/application"; import { AverageStrengthOfFieldCalculator, type StrengthOfFieldCalculator, @@ -32,7 +32,7 @@ export class GetLeagueStatsUseCase private readonly resultRepository: IResultRepository, private readonly driverRatingProvider: DriverRatingProvider, public readonly presenter: ILeagueStatsPresenter, - private readonly logger: ILogger, + private readonly logger: Logger, sofCalculator?: StrengthOfFieldCalculator, ) { this.sofCalculator = sofCalculator ?? new AverageStrengthOfFieldCalculator(); diff --git a/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.ts b/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.ts index 5ca14ddb0..d58225f07 100644 --- a/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.ts +++ b/core/racing/application/use-cases/GetTeamJoinRequestsUseCase.ts @@ -7,7 +7,7 @@ import type { TeamJoinRequestsViewModel, } from '../presenters/ITeamJoinRequestsPresenter'; import type { UseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use Case for retrieving team join requests. @@ -20,7 +20,7 @@ export class GetTeamJoinRequestsUseCase private readonly membershipRepository: ITeamMembershipRepository, private readonly driverRepository: IDriverRepository, private readonly imageService: IImageServicePort, - private readonly logger: ILogger, + private readonly logger: Logger, // Kept for backward compatibility; callers must pass their own presenter. // eslint-disable-next-line @typescript-eslint/no-unused-vars public readonly presenter: ITeamJoinRequestsPresenter, diff --git a/core/racing/application/use-cases/GetTeamMembersUseCase.ts b/core/racing/application/use-cases/GetTeamMembersUseCase.ts index b9ae88254..9819540a7 100644 --- a/core/racing/application/use-cases/GetTeamMembersUseCase.ts +++ b/core/racing/application/use-cases/GetTeamMembersUseCase.ts @@ -7,7 +7,7 @@ import type { TeamMembersViewModel, } from '../presenters/ITeamMembersPresenter'; import type { UseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; /** * Use Case for retrieving team members. @@ -20,7 +20,7 @@ export class GetTeamMembersUseCase private readonly membershipRepository: ITeamMembershipRepository, private readonly driverRepository: IDriverRepository, private readonly imageService: IImageServicePort, - private readonly logger: ILogger, + private readonly logger: Logger, // Kept for backward compatibility; callers must pass their own presenter. // eslint-disable-next-line @typescript-eslint/no-unused-vars public readonly presenter: ITeamMembersPresenter, diff --git a/core/racing/application/use-cases/ImportRaceResultsUseCase.ts b/core/racing/application/use-cases/ImportRaceResultsUseCase.ts index 83c4229a8..f57b7c7d7 100644 --- a/core/racing/application/use-cases/ImportRaceResultsUseCase.ts +++ b/core/racing/application/use-cases/ImportRaceResultsUseCase.ts @@ -4,7 +4,7 @@ import type { IResultRepository } from '../../domain/repositories/IResultReposit import type { IDriverRepository } from '../../domain/repositories/IDriverRepository'; import type { IStandingRepository } from '../../domain/repositories/IStandingRepository'; import { Result } from '../../domain/entities/Result'; -import type { AsyncUseCase } from '@gridpilot/shared/application'; +import type { AsyncUseCase, Logger } from '@gridpilot/shared/application'; import { BusinessRuleViolationError, EntityNotFoundError, @@ -13,7 +13,6 @@ import type { IImportRaceResultsPresenter, ImportRaceResultsSummaryViewModel, } from '../presenters/IImportRaceResultsPresenter'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; export interface ImportRaceResultDTO { id: string; @@ -40,7 +39,7 @@ export class ImportRaceResultsUseCase private readonly driverRepository: IDriverRepository, private readonly standingRepository: IStandingRepository, public readonly presenter: IImportRaceResultsPresenter, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(params: ImportRaceResultsParams): Promise { diff --git a/core/racing/application/use-cases/JoinLeagueUseCase.ts b/core/racing/application/use-cases/JoinLeagueUseCase.ts index f41b701da..a8e03bff2 100644 --- a/core/racing/application/use-cases/JoinLeagueUseCase.ts +++ b/core/racing/application/use-cases/JoinLeagueUseCase.ts @@ -1,4 +1,4 @@ -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { ILeagueMembershipRepository, } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; @@ -14,7 +14,7 @@ import { BusinessRuleViolationError } from '../errors/RacingApplicationError'; export class JoinLeagueUseCase implements AsyncUseCase { constructor( private readonly membershipRepository: ILeagueMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} /** diff --git a/core/racing/application/use-cases/JoinTeamUseCase.ts b/core/racing/application/use-cases/JoinTeamUseCase.ts index 8bcf46b67..523bbfbd3 100644 --- a/core/racing/application/use-cases/JoinTeamUseCase.ts +++ b/core/racing/application/use-cases/JoinTeamUseCase.ts @@ -7,7 +7,7 @@ import type { } from '../../domain/types/TeamMembership'; import type { JoinTeamCommandDTO } from '../dto/TeamCommandAndQueryDTO'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import { BusinessRuleViolationError, EntityNotFoundError, @@ -17,7 +17,7 @@ export class JoinTeamUseCase implements AsyncUseCase { constructor( private readonly teamRepository: ITeamRepository, private readonly membershipRepository: ITeamMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: JoinTeamCommandDTO): Promise { diff --git a/core/racing/application/use-cases/QuickPenaltyUseCase.ts b/core/racing/application/use-cases/QuickPenaltyUseCase.ts index e265c557c..84dcb1016 100644 --- a/core/racing/application/use-cases/QuickPenaltyUseCase.ts +++ b/core/racing/application/use-cases/QuickPenaltyUseCase.ts @@ -11,7 +11,7 @@ import type { IRaceRepository } from '../../domain/repositories/IRaceRepository' import type { ILeagueMembershipRepository } from '../../domain/repositories/ILeagueMembershipRepository'; import { randomUUID } from 'crypto'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export interface QuickPenaltyCommand { raceId: string; @@ -28,7 +28,7 @@ export class QuickPenaltyUseCase private readonly penaltyRepository: IPenaltyRepository, private readonly raceRepository: IRaceRepository, private readonly leagueMembershipRepository: ILeagueMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(command: QuickPenaltyCommand): Promise<{ penaltyId: string }> { diff --git a/core/racing/application/use-cases/RegisterForRaceUseCase.ts b/core/racing/application/use-cases/RegisterForRaceUseCase.ts index 20eb82eb7..f2c275724 100644 --- a/core/racing/application/use-cases/RegisterForRaceUseCase.ts +++ b/core/racing/application/use-cases/RegisterForRaceUseCase.ts @@ -3,7 +3,7 @@ import type { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repos import { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration'; import type { RegisterForRaceCommandDTO } from '../dto/RegisterForRaceCommandDTO'; import type { AsyncUseCase } from '@gridpilot/shared/application'; -import { ILogger } from '@gridpilot/shared/logging/ILogger'; +import { Logger } from '@gridpilot/shared/logging/Logger'; import { BusinessRuleViolationError, PermissionDeniedError, @@ -15,7 +15,7 @@ export class RegisterForRaceUseCase constructor( private readonly registrationRepository: IRaceRegistrationRepository, private readonly membershipRepository: ILeagueMembershipRepository, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} /** diff --git a/core/shared/logger/ILogger.ts b/core/shared/application/Logger.ts similarity index 90% rename from core/shared/logger/ILogger.ts rename to core/shared/application/Logger.ts index 74064a797..00525c99d 100644 --- a/core/shared/logger/ILogger.ts +++ b/core/shared/application/Logger.ts @@ -1,4 +1,4 @@ -export interface ILogger { +export interface Logger { debug(message: string, context?: Record): void; info(message: string, context?: Record): void; warn(message: string, context?: Record): void; diff --git a/core/shared/application/index.ts b/core/shared/application/index.ts index ce286ca3f..3b5e6abc6 100644 --- a/core/shared/application/index.ts +++ b/core/shared/application/index.ts @@ -1,3 +1,4 @@ export * from './UseCase'; export * from './AsyncUseCase'; -export * from './Service'; \ No newline at end of file +export * from './Service'; +export * from './Logger'; \ No newline at end of file diff --git a/core/shared/logging/ILogger.ts b/core/shared/logging/ILogger.ts deleted file mode 100644 index 419726ade..000000000 --- a/core/shared/logging/ILogger.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ILogger { - debug(message: string, ...args: any[]): void; - info(message: string, ...args: any[]): void; - warn(message: string, ...args: any[]): void; - error(message: string, ...args: any[]): void; -} diff --git a/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts b/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts index 986f5e0b2..69f815602 100644 --- a/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts +++ b/core/social/application/use-cases/GetCurrentUserSocialUseCase.ts @@ -1,5 +1,5 @@ import type { AsyncUseCase } from '@gridpilot/shared/application'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; import type { ISocialGraphRepository } from '../../domain/repositories/ISocialGraphRepository'; import type { CurrentUserSocialDTO } from '../dto/CurrentUserSocialDTO'; import type { FriendDTO } from '../dto/FriendDTO'; @@ -23,7 +23,7 @@ export class GetCurrentUserSocialUseCase constructor( private readonly socialGraphRepository: ISocialGraphRepository, public readonly presenter: ICurrentUserSocialPresenter, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(params: GetCurrentUserSocialParams): Promise { diff --git a/core/social/application/use-cases/GetUserFeedUseCase.ts b/core/social/application/use-cases/GetUserFeedUseCase.ts index e4fd9cbe7..8ef4cc3b7 100644 --- a/core/social/application/use-cases/GetUserFeedUseCase.ts +++ b/core/social/application/use-cases/GetUserFeedUseCase.ts @@ -6,7 +6,7 @@ import type { IUserFeedPresenter, UserFeedViewModel, } from '../presenters/ISocialPresenters'; -import type { ILogger } from '../../../shared/src/logging/ILogger'; +import type { Logger } from '../../../shared/src/logging/Logger'; export interface GetUserFeedParams { driverId: string; @@ -18,7 +18,7 @@ export class GetUserFeedUseCase constructor( private readonly feedRepository: IFeedRepository, public readonly presenter: IUserFeedPresenter, - private readonly logger: ILogger, + private readonly logger: Logger, ) {} async execute(params: GetUserFeedParams): Promise { diff --git a/core/social/infrastructure/inmemory/InMemorySocialAndFeed.ts b/core/social/infrastructure/inmemory/InMemorySocialAndFeed.ts index e6517d130..d4d6a9de9 100644 --- a/core/social/infrastructure/inmemory/InMemorySocialAndFeed.ts +++ b/core/social/infrastructure/inmemory/InMemorySocialAndFeed.ts @@ -2,7 +2,7 @@ import type { Driver } from '@gridpilot/racing/domain/entities/Driver'; import type { FeedItem } from '@gridpilot/social/domain/types/FeedItem'; import type { IFeedRepository } from '@gridpilot/social/domain/repositories/IFeedRepository'; import type { ISocialGraphRepository } from '@gridpilot/social/domain/repositories/ISocialGraphRepository'; -import type { ILogger } from '@gridpilot/shared/logging/ILogger'; +import type { Logger } from '@gridpilot/shared/logging/Logger'; export type Friendship = { driverId: string; @@ -19,9 +19,9 @@ export class InMemoryFeedRepository implements IFeedRepository { private readonly feedEvents: FeedItem[]; private readonly friendships: Friendship[]; private readonly driversById: Map; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seed: RacingSeedData) { + constructor(logger: Logger, seed: RacingSeedData) { this.logger = logger; this.logger.info('InMemoryFeedRepository initialized.'); this.feedEvents = seed.feedEvents; @@ -76,9 +76,9 @@ export class InMemoryFeedRepository implements IFeedRepository { export class InMemorySocialGraphRepository implements ISocialGraphRepository { private readonly friendships: Friendship[]; private readonly driversById: Map; - private readonly logger: ILogger; + private readonly logger: Logger; - constructor(logger: ILogger, seed: RacingSeedData) { + constructor(logger: Logger, seed: RacingSeedData) { this.logger = logger; this.logger.info('InMemorySocialGraphRepository initialized.'); this.friendships = seed.friendships; diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 61f1e8e87..c2f09cd2e 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -453,7 +453,7 @@ The application layer orchestrates use-cases by coordinating domain entities and - [`ICheckoutService`](core/application/ports/ICheckoutService.ts:1) and [`ICheckoutConfirmationPort`](core/application/ports/ICheckoutConfirmationPort.ts:1) for safe credits/checkout flows. - Cross-cutting: - - [`ILogger`](core/application/ports/ILogger.ts:1) + - [`Logger`](core/application/ports/Logger.ts:1) - [`IOverlaySyncPort`](core/application/ports/IOverlaySyncPort.ts:1) - [`IAutomationEventPublisher`](core/application/ports/IAutomationEventPublisher.ts:1) - [`IUserConfirmationPort`](core/application/ports/IUserConfirmationPort.ts:1) @@ -579,7 +579,7 @@ The presentation layer in this repo is currently a **single Electron app** that - [`di-container`](apps/companion/main/di-container.ts) - Central wiring for: - - Logger ([`ILogger`](core/application/ports/ILogger.ts:1)) via `createLogger()` and [`LoggingConfig`](core/infrastructure/config/LoggingConfig.ts:1). + - Logger ([`Logger`](core/application/ports/Logger.ts:1)) via `createLogger()` and [`LoggingConfig`](core/infrastructure/config/LoggingConfig.ts:1). - Session repository ([`ISessionRepository`](core/application/ports/ISessionRepository.ts:1)) via [`InMemorySessionRepository`](core/infrastructure/repositories/InMemorySessionRepository.ts:1). - Browser automation adapter via `createBrowserAutomationAdapter()` using [`PlaywrightAutomationAdapter`](core/infrastructure/adapters/automation/core/PlaywrightAutomationAdapter.ts:1) or [`MockBrowserAutomationAdapter`](core/infrastructure/adapters/automation/engine/MockBrowserAutomationAdapter.ts:1) depending on mode. - [`IAutomationEngine`](core/application/ports/IAutomationEngine.ts:1) via [`AutomationEngineAdapter`](core/infrastructure/adapters/automation/engine/AutomationEngineAdapter.ts:1) / [`MockAutomationEngineAdapter`](core/infrastructure/adapters/automation/engine/MockAutomationEngineAdapter.ts:1). diff --git a/package-lock.json b/package-lock.json index 61f126d52..8b069fa2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,16 @@ ], "dependencies": { "@gridpilot/social": "file:core/social", + "@nestjs/swagger": "11.2.3", "bcrypt": "^6.0.0", + "electron-vite": "3.1.0", + "next": "15.5.9", "playwright-extra": "^4.3.6", "puppeteer-extra-plugin-stealth": "^2.11.2", "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", - "uuid": "^13.0.0" + "uuid": "^13.0.0", + "vite": "6.4.1" }, "devDependencies": { "@cucumber/cucumber": "^11.0.1", @@ -30,10 +34,10 @@ "@types/express": "^4.17.21", "@types/jsdom": "^27.0.0", "@types/node": "^24.10.1", - "@vitest/ui": "^2.1.8", + "@vitest/ui": "^4.0.15", "cheerio": "^1.0.0", "commander": "^11.0.0", - "electron": "^22.3.25", + "electron": "^39.2.7", "husky": "^9.1.7", "jsdom": "^22.1.0", "prettier": "^3.0.0", @@ -41,7 +45,7 @@ "ts-node": "^10.9.2", "tsx": "^4.7.0", "typescript": "^5.9.3", - "vitest": "^2.1.8" + "vitest": "^4.0.15" }, "engines": { "node": ">=20.0.0" @@ -54,8 +58,12 @@ "@nestjs/common": "^10.4.20", "@nestjs/core": "^10.4.20", "@nestjs/platform-express": "^10.4.20", - "@nestjs/swagger": "^7.4.2", + "@nestjs/swagger": "^11.2.3", "@nestjs/typeorm": "^10.0.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", + "electron": "39.2.7", + "next": "15.5.9", "pg": "^8.12.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", @@ -68,6 +76,95 @@ "ts-node-dev": "^2.0.0" } }, + "apps/api/node_modules/@nestjs/common": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.20.tgz", + "integrity": "sha512-hxJxZF7jcKGuUzM9EYbuES80Z/36piJbiqmPy86mk8qOn5gglFebBTvcx7PWVbRNSb4gngASYnefBj/Y2HAzpQ==", + "license": "MIT", + "dependencies": { + "file-type": "20.4.1", + "iterare": "1.2.1", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "apps/api/node_modules/@nestjs/core": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.20.tgz", + "integrity": "sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "apps/api/node_modules/@nestjs/platform-express": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.20.tgz", + "integrity": "sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==", + "license": "MIT", + "dependencies": { + "body-parser": "1.20.3", + "cors": "2.8.5", + "express": "4.21.2", + "multer": "2.0.2", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0" + } + }, "apps/api/node_modules/reflect-metadata": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", @@ -78,6 +175,8 @@ "name": "@gridpilot/companion", "version": "0.1.0", "dependencies": { + "@nestjs/swagger": "11.2.3", + "next": "15.5.9", "puppeteer-core": "^24.31.0", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -87,10 +186,10 @@ "@types/react": "^18.2.0", "@types/react-dom": "^18.2.0", "@vitejs/plugin-react": "^4.2.0", - "electron": "^28.3.3", - "electron-vite": "^2.3.0", + "electron": "^39.2.7", + "electron-vite": "^3.1.0", "typescript": "^5.7.2", - "vite": "^5.4.21" + "vite": "^6.4.1" } }, "apps/companion/node_modules/@types/node": { @@ -101,74 +200,6 @@ "undici-types": "~6.21.0" } }, - "apps/companion/node_modules/electron": { - "version": "28.3.3", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "apps/companion/node_modules/electron-vite": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.7", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "cac": "^6.7.14", - "esbuild": "^0.21.5", - "magic-string": "^0.30.10", - "picocolors": "^1.0.1" - }, - "bin": { - "electron-vite": "bin/electron-vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@swc/core": "^1.0.0", - "vite": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - } - } - }, - "apps/companion/node_modules/electron/node_modules/@types/node": { - "version": "18.19.130", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "apps/companion/node_modules/electron/node_modules/undici-types": { - "version": "5.26.5", - "dev": true, - "license": "MIT" - }, - "apps/companion/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "apps/companion/node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -205,9 +236,10 @@ "@gridpilot/social": "file:../../core/social", "@gridpilot/testing-support": "file:../../core/testing-support", "@vercel/kv": "^3.0.0", + "electron": "39.2.7", "framer-motion": "^12.23.25", "lucide-react": "^0.555.0", - "next": "15.5.7", + "next": "^15.5.9", "react": "^18.3.0", "react-dom": "^18.3.0", "uuid": "^11.0.5", @@ -405,6 +437,10 @@ "uuid": "dist/esm/bin/uuid" } }, + "core/shared": { + "name": "@gridpilot/shared", + "version": "1.0.0" + }, "core/social": { "name": "@gridpilot/social", "version": "0.1.0" @@ -882,7 +918,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1335,7 +1370,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.1", @@ -1357,7 +1391,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1395,292 +1428,275 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { @@ -1690,7 +1706,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1701,20 +1716,19 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { @@ -1724,7 +1738,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1735,20 +1748,19 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { @@ -1758,7 +1770,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1769,71 +1780,67 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1967,6 +1974,10 @@ "resolved": "core/racing", "link": true }, + "node_modules/@gridpilot/shared": { + "resolved": "core/shared", + "link": true + }, "node_modules/@gridpilot/social": { "resolved": "core/social", "link": true @@ -3123,9 +3134,9 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", "license": "MIT" }, "node_modules/@napi-rs/wasm-runtime": { @@ -3141,13 +3152,15 @@ } }, "node_modules/@nestjs/common": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.20.tgz", - "integrity": "sha512-hxJxZF7jcKGuUzM9EYbuES80Z/36piJbiqmPy86mk8qOn5gglFebBTvcx7PWVbRNSb4gngASYnefBj/Y2HAzpQ==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.9.tgz", + "integrity": "sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ==", "license": "MIT", + "peer": true, "dependencies": { - "file-type": "20.4.1", + "file-type": "21.1.0", "iterare": "1.2.1", + "load-esm": "1.0.3", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -3156,8 +3169,8 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -3170,29 +3183,71 @@ } } }, + "node_modules/@nestjs/common/node_modules/@tokenizer/inflate": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.3.1.tgz", + "integrity": "sha512-4oeoZEBQdLdt5WmP/hx1KZ6D3/Oid/0cUb2nk4F0pTDAWy+KCH3/EnAkZF/bvckWo8I33EqBm01lIPgmgc8rCA==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.1", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@nestjs/common/node_modules/file-type": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.1.0.tgz", + "integrity": "sha512-boU4EHmP3JXkwDo4uhyBhTt5pPstxB6eEXKJBu2yu2l7aAMMm7QQYQEzssJmKReZYrFdFOJS8koVo6bXIBGDqA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tokenizer/inflate": "^0.3.1", + "strtok3": "^10.3.1", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/@nestjs/core": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.20.tgz", - "integrity": "sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.9.tgz", + "integrity": "sha512-a00B0BM4X+9z+t3UxJqIZlemIwCQdYoPKrMcM+ky4z3pkqqG1eTWexjs+YXpGObnLnjtMPVKWlcZHp3adDYvUw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { - "@nuxtjs/opencollective": "0.3.2", + "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", - "path-to-regexp": "3.3.0", + "path-to-regexp": "8.3.0", "tslib": "2.8.1", "uid": "2.0.2" }, + "engines": { + "node": ">= 20" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -3208,13 +3263,24 @@ } } }, + "node_modules/@nestjs/core/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", - "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", "license": "MIT", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "class-transformer": "^0.4.0 || ^0.5.0", "class-validator": "^0.13.0 || ^0.14.0", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -3229,15 +3295,17 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.20.tgz", - "integrity": "sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.9.tgz", + "integrity": "sha512-GVd3+0lO0mJq2m1kl9hDDnVrX3Nd4oH3oDfklz0pZEVEVS0KVSp63ufHq2Lu9cyPdSBuelJr9iPm2QQ1yX+Kmw==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "body-parser": "1.20.3", "cors": "2.8.5", - "express": "4.21.2", + "express": "5.1.0", "multer": "2.0.2", + "path-to-regexp": "8.3.0", "tslib": "2.8.1" }, "funding": { @@ -3245,27 +3313,399 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nestjs/platform-express/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@nestjs/platform-express/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/@nestjs/swagger": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.4.2.tgz", - "integrity": "sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-11.2.3.tgz", + "integrity": "sha512-a0xFfjeqk69uHIUpP8u0ryn4cKuHdra2Ug96L858i0N200Hxho+n3j+TlQXyOF4EstLSGjTfxI1Xb2E1lUxeNg==", "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "^0.15.0", - "@nestjs/mapped-types": "2.0.5", - "js-yaml": "4.1.0", + "@microsoft/tsdoc": "0.16.0", + "@nestjs/mapped-types": "2.1.0", + "js-yaml": "4.1.1", "lodash": "4.17.21", - "path-to-regexp": "3.3.0", - "swagger-ui-dist": "5.17.14" + "path-to-regexp": "8.3.0", + "swagger-ui-dist": "5.30.2" }, "peerDependencies": { - "@fastify/static": "^6.0.0 || ^7.0.0", - "@nestjs/common": "^9.0.0 || ^10.0.0", - "@nestjs/core": "^9.0.0 || ^10.0.0", + "@fastify/static": "^8.0.0", + "@nestjs/common": "^11.0.1", + "@nestjs/core": "^11.0.1", "class-transformer": "*", "class-validator": "*", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -3282,16 +3722,14 @@ } } }, - "node_modules/@nestjs/swagger/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@nestjs/swagger/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@nestjs/testing": { @@ -3352,9 +3790,9 @@ } }, "node_modules/@next/env": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.7.tgz", - "integrity": "sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==", + "version": "15.5.9", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz", + "integrity": "sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -3543,6 +3981,23 @@ "node": ">=12.4.0" } }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, "node_modules/@nuxtjs/opencollective": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", @@ -3561,6 +4016,12 @@ "npm": ">=5.0.0" } }, + "node_modules/@nuxtjs/opencollective/node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3654,7 +4115,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3668,7 +4128,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3682,7 +4141,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3696,7 +4154,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3710,7 +4167,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3724,7 +4180,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3738,7 +4193,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3752,7 +4206,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3766,7 +4219,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3780,7 +4232,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3794,7 +4245,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3808,7 +4258,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3822,7 +4271,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3836,7 +4284,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3850,7 +4297,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3864,7 +4310,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3878,7 +4323,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3892,7 +4336,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3906,7 +4349,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3920,7 +4362,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3934,7 +4375,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3948,7 +4388,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3969,6 +4408,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, "node_modules/@sinclair/typebox": { "version": "0.34.41", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", @@ -3979,7 +4425,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -4014,6 +4459,13 @@ "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -4027,7 +4479,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" @@ -4274,7 +4725,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", @@ -4283,6 +4733,17 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -4302,11 +4763,17 @@ "@types/ms": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/express": { @@ -4339,7 +4806,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { @@ -4442,7 +4908,6 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -4529,7 +4994,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -4602,6 +5066,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -5195,38 +5665,40 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", + "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", + "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.9", + "@vitest/spy": "4.0.15", "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" + "magic-string": "^0.30.21" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -5237,113 +5709,89 @@ } } }, - "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.15.tgz", + "integrity": "sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", + "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.9", - "pathe": "^1.1.2" + "@vitest/utils": "4.0.15", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", + "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" + "@vitest/pretty-format": "4.0.15", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/@vitest/spy": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", + "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/ui": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.9.tgz", - "integrity": "sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.0.15.tgz", + "integrity": "sha512-sxSyJMaKp45zI0u+lHrPuZM1ZJQ8FaVD35k+UxVrha1yyvQ+TZuUYllUixwvQXlB7ixoDc7skf3lQPopZIvaQw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.9", + "@vitest/utils": "4.0.15", "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", - "sirv": "^3.0.0", - "tinyglobby": "^0.2.10", - "tinyrainbow": "^1.2.0" + "flatted": "^3.3.3", + "pathe": "^2.0.3", + "sirv": "^3.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.1.9" + "vitest": "4.0.15" } }, "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.15.tgz", + "integrity": "sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" + "@vitest/pretty-format": "4.0.15", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" @@ -6173,7 +6621,6 @@ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, "license": "MIT", "optional": true }, @@ -6293,7 +6740,6 @@ "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6303,7 +6749,6 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.6.0" @@ -6313,7 +6758,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, "license": "MIT", "dependencies": { "clone-response": "^1.0.2", @@ -6437,18 +6881,11 @@ } }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -6491,16 +6928,6 @@ "node": ">=10" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/cheerio": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", @@ -6609,9 +7036,19 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "devOptional": true, "license": "MIT" }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, "node_modules/cli-table3": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", @@ -6685,7 +7122,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" @@ -6775,10 +7211,14 @@ } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "license": "MIT" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.4", @@ -7055,7 +7495,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -7071,7 +7510,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -7094,16 +7532,6 @@ } } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7124,7 +7552,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -7151,7 +7578,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -7242,7 +7669,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, "license": "MIT", "optional": true }, @@ -7419,15 +7845,14 @@ "license": "MIT" }, "node_modules/electron": { - "version": "22.3.27", - "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.27.tgz", - "integrity": "sha512-7Rht21vHqj4ZFRnKuZdFqZFsvMBCmDqmjetiMqPtF+TmTBiGne1mnstVXOA/SRGhN2Qy5gY5bznJKpiqogjM8A==", - "dev": true, + "version": "39.2.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-39.2.7.tgz", + "integrity": "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==", "hasInstallScript": true, "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^16.11.26", + "@types/node": "^22.7.7", "extract-zip": "^2.0.1" }, "bin": { @@ -7443,12 +7868,43 @@ "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "license": "ISC" }, + "node_modules/electron-vite": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-3.1.0.tgz", + "integrity": "sha512-M7aAzaRvSl5VO+6KN4neJCYLHLpF/iWo5ztchI/+wMxIieDZQqpbCYfaEHHHPH6eupEzfvZdLYdPdmvGqoVe0Q==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "cac": "^6.7.14", + "esbuild": "^0.25.1", + "magic-string": "^0.30.17", + "picocolors": "^1.1.1" + }, + "bin": { + "electron-vite": "bin/electron-vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@swc/core": "^1.0.0", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + } + } + }, "node_modules/electron/node_modules/@types/node": { - "version": "16.18.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "dev": true, - "license": "MIT" + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } }, "node_modules/emittery": { "version": "0.13.1", @@ -7531,7 +7987,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7741,47 +8196,96 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, "license": "MIT", "optional": true }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, "node_modules/escalade": { @@ -7803,7 +8307,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -8653,7 +9157,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -8959,7 +9462,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -9142,7 +9644,7 @@ "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -9226,7 +9728,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, "license": "BSD-3-Clause", "optional": true, "dependencies": { @@ -9290,7 +9791,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "define-properties": "^1.2.1", @@ -9319,7 +9820,6 @@ "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", @@ -9580,7 +10080,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-errors": { @@ -9618,7 +10117,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", @@ -10193,6 +10691,14 @@ "dev": true, "license": "MIT" }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -11388,7 +11894,7 @@ "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -11404,7 +11910,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -11508,7 +12013,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -11528,7 +12032,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, "license": "ISC", "optional": true }, @@ -11548,7 +12051,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -11574,7 +12076,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -11655,6 +12156,12 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.12.31", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz", + "integrity": "sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==", + "license": "MIT" + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -11674,6 +12181,26 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": ">=13.2.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -11735,13 +12262,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -11756,7 +12276,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11801,6 +12320,15 @@ "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -11837,7 +12365,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -11987,7 +12514,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -12214,13 +12740,12 @@ } }, "node_modules/next": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.7.tgz", - "integrity": "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==", - "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.", + "version": "15.5.9", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.9.tgz", + "integrity": "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==", "license": "MIT", "dependencies": { - "@next/env": "15.5.7", + "@next/env": "15.5.9", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -12408,7 +12933,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -12485,7 +13009,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12581,6 +13105,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -12658,7 +13193,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -12947,22 +13481,12 @@ "license": "MIT" }, "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -13248,7 +13772,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -13935,7 +14458,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -14257,7 +14779,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, "license": "MIT" }, "node_modules/resolve-cwd": { @@ -14297,7 +14818,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -14307,7 +14828,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" @@ -14368,7 +14888,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, "license": "BSD-3-Clause", "optional": true, "dependencies": { @@ -14387,7 +14906,6 @@ "version": "4.53.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -14425,6 +14943,36 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -14591,7 +15139,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, "license": "MIT", "optional": true }, @@ -14659,7 +15206,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -14676,7 +15222,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, "license": "(MIT OR CC0-1.0)", "optional": true, "engines": { @@ -15130,7 +15675,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, "license": "BSD-3-Clause", "optional": true }, @@ -15592,7 +16136,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, "license": "Apache-2.0", "dependencies": { "debug": "^4.1.0" @@ -15630,10 +16173,13 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.17.14", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", - "integrity": "sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==", - "license": "Apache-2.0" + "version": "5.30.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.30.2.tgz", + "integrity": "sha512-HWCg1DTNE/Nmapt+0m2EPXFwNKNeKK4PwMjkwveN/zn1cV2Kxi9SURd+m0SpdcSgWEK/O64sf8bzXdtUhigtHA==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } }, "node_modules/symbol-tree": { "version": "3.2.4", @@ -15802,17 +16348,19 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -15825,30 +16373,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -16236,7 +16764,7 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "esbuild": "~0.27.0", @@ -16259,7 +16787,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16276,7 +16803,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16293,7 +16819,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16310,7 +16835,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16327,7 +16851,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16344,7 +16867,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16361,7 +16883,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16378,7 +16899,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16395,7 +16915,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16412,7 +16931,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16429,7 +16947,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16446,7 +16963,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16463,7 +16979,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16480,7 +16995,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16497,7 +17011,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16514,7 +17027,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16531,7 +17043,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16548,7 +17059,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16565,7 +17075,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16582,7 +17091,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16599,7 +17107,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16616,7 +17123,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16633,7 +17139,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -16647,7 +17152,7 @@ "version": "0.27.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -17068,7 +17573,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unicorn-magic": { @@ -17088,7 +17592,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -17266,6 +17769,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validator": { + "version": "13.15.23", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", + "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -17276,21 +17788,23 @@ } }, "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -17299,19 +17813,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -17332,74 +17852,60 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, - "node_modules/vite-node": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", - "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vitest": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", - "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", + "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.9", - "@vitest/mocker": "2.1.9", - "@vitest/pretty-format": "^2.1.9", - "@vitest/runner": "2.1.9", - "@vitest/snapshot": "2.1.9", - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "debug": "^4.3.7", - "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", - "std-env": "^3.8.0", + "@vitest/expect": "4.0.15", + "@vitest/mocker": "4.0.15", + "@vitest/pretty-format": "4.0.15", + "@vitest/runner": "4.0.15", + "@vitest/snapshot": "4.0.15", + "@vitest/spy": "4.0.15", + "@vitest/utils": "4.0.15", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.9", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.9", - "@vitest/ui": "2.1.9", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.15", + "@vitest/browser-preview": "4.0.15", + "@vitest/browser-webdriverio": "4.0.15", + "@vitest/ui": "4.0.15", "happy-dom": "*", "jsdom": "*" }, @@ -17407,10 +17913,19 @@ "@edge-runtime/vm": { "optional": true }, + "@opentelemetry/api": { + "optional": true + }, "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { "optional": true }, "@vitest/ui": { @@ -17424,16 +17939,6 @@ } } }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -17773,7 +18278,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 1eba77866..b71e1d3e9 100644 --- a/package.json +++ b/package.json @@ -71,10 +71,10 @@ "@types/express": "^4.17.21", "@types/jsdom": "^27.0.0", "@types/node": "^24.10.1", - "@vitest/ui": "^2.1.8", + "@vitest/ui": "^4.0.15", "cheerio": "^1.0.0", "commander": "^11.0.0", - "electron": "^22.3.25", + "electron": "^39.2.7", "husky": "^9.1.7", "jsdom": "^22.1.0", "prettier": "^3.0.0", @@ -82,15 +82,19 @@ "ts-node": "^10.9.2", "tsx": "^4.7.0", "typescript": "^5.9.3", - "vitest": "^2.1.8" + "vitest": "^4.0.15" }, "dependencies": { "@gridpilot/social": "file:core/social", + "@nestjs/swagger": "11.2.3", "bcrypt": "^6.0.0", + "electron-vite": "3.1.0", + "next": "15.5.9", "playwright-extra": "^4.3.6", "puppeteer-extra-plugin-stealth": "^2.11.2", "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", - "uuid": "^13.0.0" + "uuid": "^13.0.0", + "vite": "6.4.1" } } diff --git a/tests/infrastructure/PlaywrightAuthSessionService.initiateLogin.browserMode.spec.ts b/tests/infrastructure/PlaywrightAuthSessionService.initiateLogin.browserMode.spec.ts index a96d51cef..62393ae6b 100644 --- a/tests/infrastructure/PlaywrightAuthSessionService.initiateLogin.browserMode.spec.ts +++ b/tests/infrastructure/PlaywrightAuthSessionService.initiateLogin.browserMode.spec.ts @@ -4,7 +4,7 @@ import { PlaywrightAuthSessionService } from '../../../../core/automation/infras import type { PlaywrightBrowserSession } from '../../../../core/automation/infrastructure/adapters/automation/core/PlaywrightBrowserSession'; import type { SessionCookieStore } from '../../../../core/automation/infrastructure/adapters/automation/auth/SessionCookieStore'; import type { IPlaywrightAuthFlow } from '../../../../core/automation/infrastructure/adapters/automation/auth/PlaywrightAuthFlow'; -import type { LoggerPort as ILogger } from '../../../../core/automation/application/ports/LoggerPort'; +import type { LoggerPort as Logger } from '../../../../core/automation/application/ports/LoggerPort'; import { AuthenticationState } from '@gridpilot/automation/domain/value-objects/AuthenticationState'; import { Result } from '../../../../core/shared/result/Result'; @@ -14,7 +14,7 @@ describe('PlaywrightAuthSessionService.initiateLogin browser mode behaviour', () let mockBrowserSession: PlaywrightBrowserSession; let mockCookieStore: SessionCookieStore; let mockAuthFlow: IPlaywrightAuthFlow; - let mockLogger: ILogger; + let mockLogger: Logger; let mockPage: Page; beforeEach(() => { diff --git a/tests/infrastructure/PlaywrightAuthSessionService.verifyPageAuthentication.spec.ts b/tests/infrastructure/PlaywrightAuthSessionService.verifyPageAuthentication.spec.ts index 4f7a8a1f4..4730f012d 100644 --- a/tests/infrastructure/PlaywrightAuthSessionService.verifyPageAuthentication.spec.ts +++ b/tests/infrastructure/PlaywrightAuthSessionService.verifyPageAuthentication.spec.ts @@ -3,7 +3,7 @@ import type { Page, Locator } from 'playwright'; import { PlaywrightAuthSessionService } from '../../../../core/automation/infrastructure/adapters/automation/auth/PlaywrightAuthSessionService'; import { AuthenticationState } from '@gridpilot/automation/domain/value-objects/AuthenticationState'; import { BrowserAuthenticationState } from '@gridpilot/automation/domain/value-objects/BrowserAuthenticationState'; -import type { LoggerPort as ILogger } from '../../../../core/automation/application/ports/LoggerPort'; +import type { LoggerPort as Logger } from '../../../../core/automation/application/ports/LoggerPort'; import type { Result } from '../../../../core/shared/result/Result'; import type { PlaywrightBrowserSession } from '../../../../core/automation/infrastructure/adapters/automation/core/PlaywrightBrowserSession'; import type { SessionCookieStore } from '../../../../core/automation/infrastructure/adapters/automation/auth/SessionCookieStore'; @@ -16,7 +16,7 @@ describe('PlaywrightAuthSessionService.verifyPageAuthentication', () => { hasAuthUi: boolean; cookieState: AuthenticationState; }) { - const mockLogger: ILogger = { + const mockLogger: Logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), diff --git a/core/shared/tests/unit/logging/ConsoleLogger.test.ts b/tests/shared/ConsoleLogger.test.ts similarity index 100% rename from core/shared/tests/unit/logging/ConsoleLogger.test.ts rename to tests/shared/ConsoleLogger.test.ts